{"version":3,"sources":["../src/client.ts","../src/types.ts","../src/bridge.ts"],"sourcesContent":["// src/client.ts\nimport {\n  Connection,\n  PublicKey,\n  TransactionMessage,\n  VersionedTransaction,\n} from '@solana/web3.js';\nimport {\n  getAssociatedTokenAddress,\n  createTransferCheckedInstruction,\n  getMint,\n  TOKEN_PROGRAM_ID,\n  TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\nimport type { SolanaWallet, EvmWallet, WalletSet } from './types';\nimport {\n  RELAI_FACILITATOR_URL,\n  NETWORK_CAIP2,\n  CHAIN_IDS,\n  NETWORK_TOKENS,\n  isSolana,\n  isEvm,\n  normalizeNetwork,\n  type RelaiNetwork,\n} from './types';\nimport {\n  getBridgeInfo as _getBridgeInfo,\n  selectSourceChain as _selectSourceChain,\n  computeSourceAmount as _computeSourceAmount,\n  settleBridge as _settleBridge,\n} from './bridge';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type X402NetworkSelectionMode = 'prefer_then_any' | 'strict_preferred';\n\n/**\n * MPP (Machine Payment Protocol) handler for automatic Tempo/Stripe payment.\n * When provided, the client will detect WWW-Authenticate: Payment challenges\n * on 402 responses and use this handler to create credentials automatically.\n *\n * @example\n * ```typescript\n * import { Mppx, tempo } from 'mppx/client';\n * import { privateKeyToAccount } from 'viem/accounts';\n *\n * const mppx = Mppx.create({\n *   methods: [tempo.charge({ account: privateKeyToAccount('0x...') })],\n *   polyfill: false,\n * });\n *\n * const client = createX402Client({\n *   wallets: { evm: evmWallet },\n *   mpp: mppx,\n * });\n * ```\n */\nexport interface MppHandler {\n  /** Create a credential string from a 402 response containing a WWW-Authenticate challenge. */\n  createCredential(response: Response): Promise<string>;\n}\n\nexport interface X402ClientConfig {\n  /** Multi-chain wallets (Solana + EVM) */\n  wallets?: WalletSet;\n  /** Single Solana wallet (legacy shortcut) */\n  wallet?: SolanaWallet;\n  /** Custom facilitator URL, default: RelAI facilitator */\n  facilitatorUrl?: string;\n  /** Optional Relay WebSocket transport for /relay/:apiId endpoints */\n  relayWs?: X402RelayWsConfig;\n  /** Preferred network when multiple options available */\n  preferredNetwork?: RelaiNetwork;\n  /**\n   * How to handle 402 accepts when preferredNetwork is set.\n   * - prefer_then_any (default): prefer preferredNetwork, then fall back to any payable option.\n   * - strict_preferred: only accept preferredNetwork, fail otherwise.\n   */\n  networkSelectionMode?: X402NetworkSelectionMode;\n  /** Custom Solana RPC URL */\n  solanaRpcUrl?: string;\n  /** Custom EVM RPC URLs per network (e.g. { 'skale-base': 'https://...' }) */\n  evmRpcUrls?: Record<string, string>;\n  /** Maximum payment amount in atomic units */\n  maxAmountAtomic?: string;\n  /** Default Integritas behavior for outgoing requests */\n  integritas?: boolean | X402IntegritasConfig;\n  /** Enable verbose logging */\n  verbose?: boolean;\n  /** Default headers added to every request (e.g. X-Service-Key, X-Agent-ID for agent use) */\n  defaultHeaders?: Record<string, string>;\n  /**\n   * Optional MPP (Machine Payment Protocol) handler.\n   * When set, the client automatically handles WWW-Authenticate: Payment\n   * challenges (Tempo, Stripe) on 402 responses before falling back to x402.\n   * Pass an mppx client instance (from `Mppx.create()`).\n   */\n  mpp?: MppHandler;\n  /**\n   * Enable transparent cross-chain bridge.\n   * When set, the client auto-discovers bridge info from the RelAI API and\n   * bridges payments when no wallet matches the server's accepted chains.\n   * The server does NOT need to advertise bridge support — it just verifies\n   * a normal on-chain payment on its target chain.\n   */\n  bridge?: {\n    enabled?: boolean;\n    /** RelAI API base URL for auto-discovery (default: https://api.relai.fi) */\n    baseUrl?: string;\n    /** Force bridge even when the client could pay directly on the target chain */\n    force?: boolean;\n  };\n}\n\nexport type X402IntegritasFlow = 'single' | 'dual';\n\nexport interface X402IntegritasConfig {\n  /** Enable Integritas stamp request headers */\n  enabled?: boolean;\n  /** Preferred Integritas flow for the request */\n  flow?: X402IntegritasFlow;\n}\n\nexport interface X402RequestOptions {\n  /** Per-request Integritas override */\n  integritas?: boolean | X402IntegritasConfig;\n}\n\nexport type X402FetchInit = RequestInit & {\n  /** SDK-specific per-request options (not forwarded to fetch as-is) */\n  x402?: X402RequestOptions;\n};\n\nexport interface RelayWebSocketLike {\n  readyState: number;\n  send(data: string): void;\n  close(code?: number, reason?: string): void;\n  addEventListener?: (type: string, listener: (...args: any[]) => void) => void;\n  removeEventListener?: (type: string, listener: (...args: any[]) => void) => void;\n  on?: (type: string, listener: (...args: any[]) => void) => void;\n  off?: (type: string, listener: (...args: any[]) => void) => void;\n  removeListener?: (type: string, listener: (...args: any[]) => void) => void;\n  onopen?: ((event: unknown) => void) | null;\n  onmessage?: ((event: unknown) => void) | null;\n  onerror?: ((event: unknown) => void) | null;\n  onclose?: ((event: unknown) => void) | null;\n}\n\nexport type RelayWebSocketFactory = (url: string) => RelayWebSocketLike;\n\nexport interface X402RelayWsConfig {\n  /** Enable WebSocket transport for relay URLs (still falls back to HTTP by default). */\n  enabled?: boolean;\n  /** Explicit WebSocket relay URL (default is derived from relay URL host). */\n  wsUrl?: string;\n  /** Timeout for WS connect and preflight call in milliseconds. Default: 5000. */\n  preflightTimeoutMs?: number;\n  /** Timeout for paid WS retry in milliseconds. Default: 10000. */\n  paymentTimeoutMs?: number;\n  /** Fallback to standard HTTP x402 flow when WS transport fails. Default: true. */\n  fallbackToHttp?: boolean;\n  /** Custom WebSocket factory, useful in runtimes without global WebSocket. */\n  webSocketFactory?: RelayWebSocketFactory;\n}\n\nexport interface X402RelayWsError {\n  code: number;\n  message: string;\n  data?: unknown;\n  paymentRequired?: unknown;\n}\n\nexport interface X402RelayWsResponse {\n  id?: string | number;\n  result?: unknown;\n  error?: X402RelayWsError;\n  paymentResponse?: unknown;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface X402Client {\n  /** Fetch with automatic x402 payment handling */\n  fetch(input: string | URL | Request, init?: X402FetchInit): Promise<Response>;\n}\n\ntype RelaySocketEventName = 'open' | 'message' | 'error' | 'close';\ntype RelaySocketListener = (...args: any[]) => void;\n\ninterface RelayWsCallRequest {\n  relayUrl: string;\n  requestMethod: string;\n  requestHeaders: Record<string, string>;\n  requestBody?: unknown;\n  paymentPayload?: unknown;\n  timeoutMs: number;\n}\n\n/**\n * Create an x402 client for automatic payment handling.\n * Supports all RelAI facilitator networks: Solana, Base, Avalanche, SKALE Base, SKALE Base Sepolia, SKALE BITE, Polygon, and Ethereum.\n * Auto-detects the correct chain from the 402 response and picks the right\n * signing method (Solana SPL transfer, EVM EIP-3009 transferWithAuthorization).\n *\n * @example\n * ```typescript\n * import { createX402Client } from '@relai-fi/x402';\n *\n * const client = createX402Client({\n *   wallets: { solana: solanaWallet, evm: evmWalletClient },\n * });\n *\n * // Automatically handles 402 on any RelAI-supported network\n * const response = await client.fetch('https://api.example.com/protected');\n * ```\n */\n// Networks that use EIP-2612 permit instead of EIP-3009 transferWithAuthorization (currently none)\nconst PERMIT_NETWORKS = new Set<string>([]);\n\n// Default EVM RPC URLs\nconst DEFAULT_EVM_RPC_URLS: Record<string, string> = {\n  'skale-base': 'https://skale-base.skalenodes.com/v1/base',\n  'skale-base-sepolia': 'https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha',\n  'skale-bite': 'https://base-sepolia-testnet.skalenodes.com/v1/bite-v2-sandbox',\n  'base': 'https://mainnet.base.org',\n  'avalanche': 'https://api.avax.network/ext/bc/C/rpc',\n  'polygon': 'https://polygon-rpc.com',\n  'ethereum': 'https://ethereum-rpc.publicnode.com',\n  'telos': 'https://rpc.telos.net',\n};\n\nexport function createX402Client(config: X402ClientConfig): X402Client {\n  const {\n    wallets = {},\n    wallet: legacyWallet,\n    facilitatorUrl = RELAI_FACILITATOR_URL,\n    relayWs,\n    preferredNetwork,\n    networkSelectionMode = 'prefer_then_any',\n    solanaRpcUrl = 'https://api.mainnet-beta.solana.com',\n    evmRpcUrls = {},\n    maxAmountAtomic,\n    integritas,\n    verbose = false,\n    defaultHeaders = {},\n    mpp,\n    bridge: bridgeConfig,\n  } = config;\n\n  const relayWsEnabled = relayWs?.enabled === true;\n  const relayWsPreflightTimeoutMs = relayWs?.preflightTimeoutMs ?? 5000;\n  const relayWsPaymentTimeoutMs = relayWs?.paymentTimeoutMs ?? 10000;\n  const relayWsFallbackToHttp = relayWs?.fallbackToHttp ?? true;\n  const defaultIntegritas = normalizeIntegritasOptions(integritas);\n  const relayWsReservedSubdomains = new Set<string>([\n    'www',\n    'api',\n    'localhost',\n    'admin',\n    'app',\n    'dashboard',\n    'docs',\n    'documentation',\n    'status',\n    'blog',\n    'facilitator',\n  ]);\n\n  const log = verbose ? console.log.bind(console, '[relai-x402]') : () => {};\n\n  // Merge legacy wallet into wallet set\n  const effectiveWallets: WalletSet = { ...wallets };\n  if (legacyWallet && !effectiveWallets.solana) {\n    effectiveWallets.solana = legacyWallet;\n  }\n\n  const hasSolanaWallet = Boolean(\n    effectiveWallets.solana?.publicKey && effectiveWallets.solana?.signTransaction\n  );\n  if (hasSolanaWallet) log('Solana wallet ready');\n\n  function isRecord(value: unknown): value is Record<string, unknown> {\n    return typeof value === 'object' && value !== null;\n  }\n\n  function parseJsonSafe(value: string): unknown {\n    try {\n      return JSON.parse(value);\n    } catch {\n      return null;\n    }\n  }\n\n  function addSocketListener(\n    socket: RelayWebSocketLike,\n    eventName: RelaySocketEventName,\n    listener: RelaySocketListener,\n  ): void {\n    if (socket.addEventListener) {\n      socket.addEventListener(eventName, listener);\n      return;\n    }\n\n    if (socket.on) {\n      socket.on(eventName, listener);\n    }\n  }\n\n  function removeSocketListener(\n    socket: RelayWebSocketLike,\n    eventName: RelaySocketEventName,\n    listener: RelaySocketListener,\n  ): void {\n    if (socket.removeEventListener) {\n      socket.removeEventListener(eventName, listener);\n      return;\n    }\n\n    if (socket.off) {\n      socket.off(eventName, listener);\n      return;\n    }\n\n    if (socket.removeListener) {\n      socket.removeListener(eventName, listener);\n    }\n  }\n\n  function resolveRelayWsUrl(relayUrl: string): string {\n    if (relayWs?.wsUrl && relayWs.wsUrl.trim() !== '') {\n      return relayWs.wsUrl.trim();\n    }\n\n    const parsedRelayUrl = new URL(relayUrl);\n    const wsProtocol = parsedRelayUrl.protocol === 'https:' ? 'wss:' : 'ws:';\n    return `${wsProtocol}//${parsedRelayUrl.host}/api/ws/relay`;\n  }\n\n  function resolveRelayWhitelabel(parsedRelayUrl: URL): string | null {\n    const hostParts = parsedRelayUrl.hostname.toLowerCase().split('.').filter(Boolean);\n    if (hostParts.length < 2) {\n      return null;\n    }\n\n    const candidate = decodeURIComponent(hostParts[0] || '').trim();\n    if (!candidate) {\n      return null;\n    }\n\n    if (relayWsReservedSubdomains.has(candidate.toLowerCase())) {\n      return null;\n    }\n\n    const lastPart = hostParts[hostParts.length - 1];\n    const secondLastPart = hostParts[hostParts.length - 2];\n    const isX402WhitelabelHost = hostParts.length >= 3 && secondLastPart === 'x402' && lastPart === 'fi';\n    const isLocalWhitelabelHost = hostParts.length === 2 && lastPart === 'localhost';\n\n    if (!isX402WhitelabelHost && !isLocalWhitelabelHost) {\n      return null;\n    }\n\n    return candidate;\n  }\n\n  function resolveRelayTarget(relayUrl: string): { apiId: string; path: string } {\n    const parsedRelayUrl = new URL(relayUrl);\n    const match = parsedRelayUrl.pathname.match(/\\/relay\\/([^/]+)(\\/.*)?$/);\n    if (match) {\n      const apiId = decodeURIComponent(match[1]);\n      const pathPart = match[2] || '/';\n      return {\n        apiId,\n        path: `${pathPart}${parsedRelayUrl.search || ''}`,\n      };\n    }\n\n    const whitelabel = resolveRelayWhitelabel(parsedRelayUrl);\n    if (!whitelabel) {\n      throw new Error(\n        `[relai-x402] Unsupported relay URL format for WS transport: ${relayUrl}. ` +\n        'Expected /relay/:apiId/... or <whitelabel>.x402.fi/...',\n      );\n    }\n\n    const pathPart = parsedRelayUrl.pathname && parsedRelayUrl.pathname !== ''\n      ? parsedRelayUrl.pathname\n      : '/';\n    return {\n      apiId: whitelabel,\n      path: `${pathPart}${parsedRelayUrl.search || ''}`,\n    };\n  }\n\n  function isRelayRequestUrl(requestUrl: string): boolean {\n    try {\n      resolveRelayTarget(requestUrl);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  function headersToRecord(headersInit?: HeadersInit): Record<string, string> {\n    if (!headersInit) return {};\n\n    const output: Record<string, string> = {};\n\n    if (typeof Headers !== 'undefined' && headersInit instanceof Headers) {\n      headersInit.forEach((value, key) => {\n        output[key] = value;\n      });\n      return output;\n    }\n\n    if (Array.isArray(headersInit)) {\n      for (const [key, value] of headersInit) {\n        output[key] = value;\n      }\n      return output;\n    }\n\n    for (const [key, value] of Object.entries(headersInit)) {\n      if (typeof value === 'string') {\n        output[key] = value;\n      } else if (Array.isArray(value)) {\n        output[key] = value.join(', ');\n      } else if (value !== undefined && value !== null) {\n        output[key] = String(value);\n      }\n    }\n\n    return output;\n  }\n\n  function hasHeaderCaseInsensitive(headers: Record<string, string>, headerName: string): boolean {\n    const normalized = headerName.toLowerCase();\n    return Object.keys(headers).some((key) => key.toLowerCase() === normalized);\n  }\n\n  function normalizeIntegritasFlow(value: unknown): X402IntegritasFlow | undefined {\n    const normalized = String(value || '').trim().toLowerCase();\n    if (normalized === 'single') return 'single';\n    if (normalized === 'dual') return 'dual';\n    return undefined;\n  }\n\n  function normalizeIntegritasOptions(\n    value: boolean | X402IntegritasConfig | undefined,\n  ): { enabled: boolean; flow?: X402IntegritasFlow } {\n    if (value === true) return { enabled: true };\n    if (value === false || value == null) return { enabled: false };\n\n    const flow = normalizeIntegritasFlow(value.flow);\n    const enabled =\n      typeof value.enabled === 'boolean'\n        ? value.enabled\n        : true;\n\n    return {\n      enabled,\n      ...(flow ? { flow } : {}),\n    };\n  }\n\n  function resolveIntegritasOptions(\n    override: boolean | X402IntegritasConfig | undefined,\n  ): { enabled: boolean; flow?: X402IntegritasFlow } {\n    if (override === undefined) {\n      return defaultIntegritas;\n    }\n\n    if (typeof override === 'boolean') {\n      return {\n        enabled: override,\n        ...(override && defaultIntegritas.flow ? { flow: defaultIntegritas.flow } : {}),\n      };\n    }\n\n    const flow = normalizeIntegritasFlow(override.flow) || defaultIntegritas.flow;\n    const enabled =\n      typeof override.enabled === 'boolean'\n        ? override.enabled\n        : defaultIntegritas.enabled;\n\n    return {\n      enabled,\n      ...(enabled && flow ? { flow } : {}),\n    };\n  }\n\n  function stripInternalInit(init?: X402FetchInit): RequestInit | undefined {\n    if (!init) return undefined;\n    const { x402: _x402, ...requestInit } = init;\n    return requestInit;\n  }\n\n  function applyIntegritasHeaders(\n    headers: Record<string, string>,\n    options: { enabled: boolean; flow?: X402IntegritasFlow },\n  ): Record<string, string> {\n    if (!options.enabled) return headers;\n\n    if (!hasHeaderCaseInsensitive(headers, 'x-integritas')) {\n      headers['X-Integritas'] = 'true';\n    }\n\n    if (options.flow && !hasHeaderCaseInsensitive(headers, 'x-integritas-flow')) {\n      headers['X-Integritas-Flow'] = options.flow;\n    }\n\n    return headers;\n  }\n\n  function getRequestMethod(input: string | URL | Request, init?: RequestInit): string {\n    const inputMethod = input instanceof Request ? input.method : undefined;\n    return (init?.method || inputMethod || 'GET').toUpperCase();\n  }\n\n  async function bodyInitToWsPayload(bodyInit: unknown): Promise<unknown> {\n    if (bodyInit === undefined || bodyInit === null) {\n      return undefined;\n    }\n\n    if (typeof bodyInit === 'string') {\n      const parsed = parseJsonSafe(bodyInit);\n      return parsed === null ? bodyInit : parsed;\n    }\n\n    if (typeof URLSearchParams !== 'undefined' && bodyInit instanceof URLSearchParams) {\n      return bodyInit.toString();\n    }\n\n    if (typeof FormData !== 'undefined' && bodyInit instanceof FormData) {\n      const entries: Record<string, string> = {};\n      for (const [key, value] of bodyInit.entries()) {\n        entries[key] = typeof value === 'string' ? value : value.name;\n      }\n      return entries;\n    }\n\n    if (typeof Blob !== 'undefined' && bodyInit instanceof Blob) {\n      const text = await bodyInit.text();\n      if (!text) return undefined;\n      const parsed = parseJsonSafe(text);\n      return parsed === null ? text : parsed;\n    }\n\n    if (bodyInit instanceof ArrayBuffer) {\n      return Array.from(new Uint8Array(bodyInit));\n    }\n\n    if (ArrayBuffer.isView(bodyInit)) {\n      return Array.from(new Uint8Array(bodyInit.buffer, bodyInit.byteOffset, bodyInit.byteLength));\n    }\n\n    if (typeof Buffer !== 'undefined' && Buffer.isBuffer(bodyInit)) {\n      return Array.from(bodyInit.values());\n    }\n\n    if (isRecord(bodyInit)) {\n      return bodyInit;\n    }\n\n    return String(bodyInit);\n  }\n\n  async function resolveRequestBody(input: string | URL | Request, init?: RequestInit): Promise<unknown> {\n    if (init && Object.prototype.hasOwnProperty.call(init, 'body')) {\n      return bodyInitToWsPayload(init.body as unknown);\n    }\n\n    if (input instanceof Request) {\n      const method = getRequestMethod(input, init);\n      if (method === 'GET' || method === 'HEAD') {\n        return undefined;\n      }\n\n      try {\n        const cloned = input.clone();\n        const text = await cloned.text();\n        if (!text) return undefined;\n        const parsed = parseJsonSafe(text);\n        return parsed === null ? text : parsed;\n      } catch {\n        return undefined;\n      }\n    }\n\n    return undefined;\n  }\n\n  function getRequestHeaders(input: string | URL | Request, init?: RequestInit): Record<string, string> {\n    const fromInput = input instanceof Request ? headersToRecord(input.headers) : {};\n    const fromInit = headersToRecord(init?.headers);\n    const merged = {\n      ...defaultHeaders,\n      ...fromInput,\n      ...fromInit,\n    };\n\n    if (!merged.Accept && !merged.accept) {\n      merged.Accept = 'application/json';\n    }\n\n    return merged;\n  }\n\n  function toMessageString(data: unknown): string {\n    if (typeof data === 'string') {\n      return data;\n    }\n\n    if (isRecord(data) && typeof data.data !== 'undefined') {\n      return toMessageString(data.data);\n    }\n\n    if (typeof Buffer !== 'undefined' && Buffer.isBuffer(data)) {\n      return data.toString('utf8');\n    }\n\n    if (data instanceof ArrayBuffer) {\n      const bytes = new Uint8Array(data);\n      if (typeof Buffer !== 'undefined') {\n        return Buffer.from(bytes).toString('utf8');\n      }\n      if (typeof TextDecoder !== 'undefined') {\n        return new TextDecoder().decode(bytes);\n      }\n      throw new Error('Unsupported WebSocket message data type');\n    }\n\n    if (ArrayBuffer.isView(data)) {\n      const bytes = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n      if (typeof Buffer !== 'undefined') {\n        return Buffer.from(bytes).toString('utf8');\n      }\n      if (typeof TextDecoder !== 'undefined') {\n        return new TextDecoder().decode(bytes);\n      }\n      throw new Error('Unsupported WebSocket message data type');\n    }\n\n    throw new Error('Unsupported WebSocket message data type');\n  }\n\n  function getWebSocketFactory(): RelayWebSocketFactory {\n    if (relayWs?.webSocketFactory) {\n      return relayWs.webSocketFactory;\n    }\n\n    if (typeof WebSocket !== 'undefined') {\n      return (wsUrl: string) => new WebSocket(wsUrl) as unknown as RelayWebSocketLike;\n    }\n\n    throw new Error(\n      '[relai-x402] WebSocket is not available in this runtime. Provide relayWs.webSocketFactory.',\n    );\n  }\n\n  async function relayCallOverWebSocket(request: RelayWsCallRequest): Promise<X402RelayWsResponse> {\n    const wsFactory = getWebSocketFactory();\n    const wsUrl = resolveRelayWsUrl(request.relayUrl);\n    const target = resolveRelayTarget(request.relayUrl);\n    const requestId = `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n    const socket = wsFactory(wsUrl);\n\n    return new Promise<X402RelayWsResponse>((resolve, reject) => {\n      let settled = false;\n\n      const settleResolve = (value: X402RelayWsResponse) => {\n        if (settled) return;\n        settled = true;\n        cleanup();\n        try {\n          socket.close();\n        } catch {\n          // Ignore close errors.\n        }\n        resolve(value);\n      };\n\n      const settleReject = (error: Error) => {\n        if (settled) return;\n        settled = true;\n        cleanup();\n        try {\n          socket.close();\n        } catch {\n          // Ignore close errors.\n        }\n        reject(error);\n      };\n\n      const timeoutId = setTimeout(() => {\n        settleReject(new Error(`[relai-x402] Timed out waiting for WS relay response after ${request.timeoutMs}ms`));\n      }, request.timeoutMs);\n\n      const cleanup = () => {\n        clearTimeout(timeoutId);\n        removeSocketListener(socket, 'open', onOpen);\n        removeSocketListener(socket, 'message', onMessage);\n        removeSocketListener(socket, 'error', onError);\n        removeSocketListener(socket, 'close', onClose);\n      };\n\n      const onOpen = () => {\n        const envelope: Record<string, unknown> = {\n          id: requestId,\n          method: 'relay.call',\n          params: {\n            apiId: target.apiId,\n            path: target.path,\n            requestMethod: request.requestMethod,\n            requestHeaders: request.requestHeaders,\n            ...(request.requestBody !== undefined ? { requestBody: request.requestBody } : {}),\n          },\n        };\n\n        if (request.paymentPayload !== undefined) {\n          envelope.payment = request.paymentPayload;\n        }\n\n        try {\n          socket.send(JSON.stringify(envelope));\n        } catch {\n          settleReject(new Error('[relai-x402] Failed to send WS relay request'));\n        }\n      };\n\n      const onMessage = (...args: any[]) => {\n        const payload = args.length > 0 ? args[0] : undefined;\n\n        let parsed: unknown;\n        try {\n          parsed = parseJsonSafe(toMessageString(payload));\n        } catch {\n          return;\n        }\n\n        if (!isRecord(parsed)) return;\n\n        const responseId =\n          typeof parsed.id === 'string' || typeof parsed.id === 'number' ? String(parsed.id) : '';\n        if (responseId !== requestId) return;\n\n        settleResolve(parsed as X402RelayWsResponse);\n      };\n\n      const onError = () => {\n        settleReject(new Error('[relai-x402] WebSocket relay transport error'));\n      };\n\n      const onClose = () => {\n        settleReject(new Error('[relai-x402] WebSocket relay connection closed before response'));\n      };\n\n      addSocketListener(socket, 'open', onOpen);\n      addSocketListener(socket, 'message', onMessage);\n      addSocketListener(socket, 'error', onError);\n      addSocketListener(socket, 'close', onClose);\n    });\n  }\n\n  function extractPaymentRequirementsFromWsError(error: X402RelayWsError): any | null {\n    const candidates: unknown[] = [error.paymentRequired, error.data];\n\n    for (const candidate of candidates) {\n      if (!isRecord(candidate)) continue;\n\n      if (Array.isArray(candidate.accepts)) {\n        return candidate;\n      }\n\n      if (isRecord(candidate.paymentRequired) && Array.isArray(candidate.paymentRequired.accepts)) {\n        return candidate.paymentRequired;\n      }\n\n      if (isRecord(candidate.data) && Array.isArray(candidate.data.accepts)) {\n        return candidate.data;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Extract an MPP (WWW-Authenticate: Payment) challenge from a WS 402 error.\n   * The relay server forwards the upstream WWW-Authenticate value as `mppChallenge`\n   * on the error envelope, or inside `responseHeaders`.\n   */\n  function extractMppChallengeFromWsError(error: X402RelayWsError): string | null {\n    // Direct field on error\n    if (isRecord(error) && typeof (error as any).mppChallenge === 'string') {\n      return (error as any).mppChallenge as string;\n    }\n\n    // Nested inside data\n    if (isRecord(error.data) && typeof (error.data as any).mppChallenge === 'string') {\n      return (error.data as any).mppChallenge as string;\n    }\n\n    // From responseHeaders map\n    const metadata = isRecord(error) ? (error as any).responseHeaders : undefined;\n    if (isRecord(metadata)) {\n      for (const [key, value] of Object.entries(metadata)) {\n        if (key.toLowerCase() === 'www-authenticate' && typeof value === 'string') {\n          if (/^Payment\\s+/i.test(value.trim())) {\n            return value;\n          }\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Build a synthetic Response from a WS 402 error for mpp.createCredential().\n   * The MPP handler expects a standard Response with WWW-Authenticate header.\n   */\n  function buildSyntheticMppResponse(mppChallenge: string, wsError: X402RelayWsError): Response {\n    const headers = new Headers();\n    headers.set('WWW-Authenticate', mppChallenge);\n\n    // Forward any extra response headers the relay included\n    const responseHeaders = isRecord(wsError) ? (wsError as any).responseHeaders : undefined;\n    if (isRecord(responseHeaders)) {\n      for (const [key, value] of Object.entries(responseHeaders)) {\n        if (typeof value === 'string' && key.toLowerCase() !== 'www-authenticate') {\n          headers.set(key, value);\n        }\n      }\n    }\n\n    return new Response(null, { status: 402, headers });\n  }\n\n  function buildWsResponse(wsResponse: X402RelayWsResponse): Response {\n    const statusFromMetadata =\n      isRecord(wsResponse.metadata) && typeof wsResponse.metadata.status === 'number'\n        ? wsResponse.metadata.status\n        : 200;\n    const status = Number.isInteger(statusFromMetadata) && statusFromMetadata >= 100 && statusFromMetadata <= 599\n      ? statusFromMetadata\n      : 200;\n\n    const headers = new Headers();\n    headers.set('Content-Type', 'application/json');\n\n    if (wsResponse.paymentResponse !== undefined) {\n      headers.set('PAYMENT-RESPONSE', encodeBase64Json(wsResponse.paymentResponse));\n    }\n\n    const bodyPayload = wsResponse.result === undefined ? null : wsResponse.result;\n    return new Response(JSON.stringify(bodyPayload), {\n      status,\n      headers,\n    });\n  }\n\n  // -----------------------------------------------------------------------\n  // Select a payment option from the 402 response's `accepts` array\n  // -----------------------------------------------------------------------\n  function selectAcceptForWallet(a: any): { accept: any; chain: 'solana' | 'evm' } | null {\n    const net = a.network || '';\n    if (isSolana(net) && hasSolanaWallet) {\n      return { accept: a, chain: 'solana' };\n    }\n    if (isEvm(net) && effectiveWallets.evm) {\n      return { accept: a, chain: 'evm' };\n    }\n    return null;\n  }\n\n  function buildNoWalletError(accepts: any[], isWs: boolean): string {\n    const networks = accepts.map((a: any) => a.network).join(', ');\n    if (preferredNetwork && networkSelectionMode === 'strict_preferred') {\n      const preferredCaip2 = NETWORK_CAIP2[preferredNetwork];\n      return (\n        `[relai-x402] Preferred network ${preferredNetwork} (${preferredCaip2}) is required, ` +\n        `but no compatible wallet is connected. Available networks: ${networks}`\n      );\n    }\n\n    return `[relai-x402] No wallet available for${isWs ? ' WS' : ''} networks: ${networks}`;\n  }\n\n  function selectAccept(accepts: any[]): { accept: any; chain: 'solana' | 'evm' } | null {\n    // 1) Preferred network first\n    if (preferredNetwork) {\n      const caip2 = NETWORK_CAIP2[preferredNetwork];\n      for (const a of accepts) {\n        const net = a.network || '';\n        if (net === preferredNetwork || net === caip2) {\n          const selected = selectAcceptForWallet(a);\n          if (selected) {\n            return selected;\n          }\n        }\n      }\n\n      if (networkSelectionMode === 'strict_preferred') {\n        return null;\n      }\n    }\n\n    // 2) First option we have a wallet for\n    for (const a of accepts) {\n      const selected = selectAcceptForWallet(a);\n      if (selected) {\n        return selected;\n      }\n    }\n\n    return null;\n  }\n\n  // -----------------------------------------------------------------------\n  // Bridge extension — cross-chain payment routing (x402 bridge spec)\n  // -----------------------------------------------------------------------\n\n  function getBridgeExtension(requirements: any): any | null {\n    const ext = requirements?.extensions?.bridge;\n    if (!ext?.info?.settleEndpoint || !Array.isArray(ext.info.supportedSourceChains)) return null;\n    return ext.info;\n  }\n\n  function selectBridgeSource(bridge: any): { chain: 'solana' | 'evm'; network: string; asset: string } | null {\n    const sourceChains: string[] = bridge.supportedSourceChains || [];\n    const sourceAssets: string[] = bridge.supportedSourceAssets || [];\n    for (const caip2 of sourceChains) {\n      if (isSolana(caip2) && hasSolanaWallet) {\n        const asset = sourceAssets.find((a: string) => !a.startsWith('0x')) || '';\n        return { chain: 'solana', network: caip2, asset };\n      }\n      if (isEvm(caip2) && effectiveWallets.evm) {\n        const asset = sourceAssets.find((a: string) => a.startsWith('0x')) || '';\n        return { chain: 'evm', network: caip2, asset };\n      }\n    }\n    return null;\n  }\n\n  async function executeBridgePayment(\n    bridge: any,\n    accepts: any[],\n    requirements: any,\n    url: string,\n  ): Promise<string> {\n    const source = selectBridgeSource(bridge);\n    if (!source) {\n      throw new Error('[relai-x402] bridge extension found but no wallet matches supported source chains');\n    }\n\n    // Pick first accept as the target (merchant's preferred chain)\n    const targetAccept = accepts[0];\n    const amount = targetAccept.amount || targetAccept.maxAmountRequired;\n\n    log(`Bridge: ${source.network} → ${targetAccept.network}, amount=${amount}`);\n\n    // Amount guard\n    if (maxAmountAtomic && BigInt(amount) > BigInt(maxAmountAtomic)) {\n      throw new Error(`[relai-x402] Amount ${amount} exceeds max ${maxAmountAtomic}`);\n    }\n\n    // Build source-chain payment header (same logic as direct payment)\n    let sourcePaymentHeader: string;\n    if (source.chain === 'solana') {\n      // Build a synthetic accept entry for the source chain.\n      // payTo must be the bridge facilitator's Solana wallet (bridge.payTo),\n      // NOT the merchant's address (which may be an EVM address).\n      // feePayer comes from bridge.info — facilitator sponsors Solana gas.\n      if (!bridge.payTo) {\n        throw new Error('[relai-x402] bridge.info.payTo is required for Solana source payments');\n      }\n      const sourceAccept = {\n        scheme: 'exact',\n        network: source.network,\n        asset: source.asset,\n        payTo: bridge.payTo,\n        amount: targetAccept.amount || targetAccept.maxAmountRequired,\n        extra: {\n          ...(bridge.feePayerSvm ? { feePayer: bridge.feePayerSvm } : {}),\n          decimals: 6,\n        },\n      };\n      sourcePaymentHeader = await buildSolanaPayment(sourceAccept, requirements, url);\n    } else {\n      const evmNetwork = normalizeNetwork(source.network);\n      const usePermit = evmNetwork && PERMIT_NETWORKS.has(evmNetwork);\n      const sourceAccept = {\n        ...targetAccept,\n        network: source.network,\n        asset: source.asset || targetAccept.asset,\n        ...(bridge.payTo ? { payTo: bridge.payTo } : {}),\n      };\n      sourcePaymentHeader = usePermit\n        ? await buildEvmPermitPayment(sourceAccept, requirements, url)\n        : await buildEvmPayment(sourceAccept, requirements, url);\n    }\n\n    // POST to bridge settle endpoint\n    const bridgeRes = await fetch(bridge.settleEndpoint, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        sourcePayment: sourcePaymentHeader,\n        sourceChain: source.network,\n        targetAccept,\n        requirements,\n        resource: url,\n        paymentFacilitator: bridge.paymentFacilitator || null,\n        ...(bridge.serviceKeyHash ? { serviceKeyHash: bridge.serviceKeyHash } : {}),\n      }),\n    });\n\n    if (!bridgeRes.ok) {\n      const err = await bridgeRes.json().catch(() => ({}));\n      throw new Error(`[relai-x402] bridge settle failed: ${err.error || bridgeRes.status}`);\n    }\n\n    const bridgeData = await bridgeRes.json();\n    if (!bridgeData.xPayment) {\n      throw new Error('[relai-x402] bridge endpoint did not return xPayment header');\n    }\n\n    log(`Bridge settled: sourceTx=${bridgeData.sourceTxId}, targetTx=${bridgeData.targetTxId}`);\n    return bridgeData.xPayment;\n  }\n\n  // -----------------------------------------------------------------------\n  // JSON-RPC helper (for reading EVM contract state without ethers)\n  // -----------------------------------------------------------------------\n  async function evmRpcCall(rpcUrl: string, to: string, data: string): Promise<string> {\n    const res = await fetch(rpcUrl, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        jsonrpc: '2.0',\n        method: 'eth_call',\n        params: [{ to, data }, 'latest'],\n        id: 1,\n      }),\n    });\n    const json = await res.json();\n    if (json.error) throw new Error(`RPC error: ${json.error.message}`);\n    return json.result;\n  }\n\n  function getEvmRpcUrl(network: string): string {\n    return evmRpcUrls[network] || DEFAULT_EVM_RPC_URLS[network] || '';\n  }\n\n  // -----------------------------------------------------------------------\n  // Build EVM payment — EIP-2612 permit (for SKALE Base)\n  // -----------------------------------------------------------------------\n  async function buildEvmPermitPayment(\n    accept: any,\n    requirements: any,\n    url: string,\n  ): Promise<string> {\n    const evmWallet = effectiveWallets.evm!;\n    const extra = accept.extra || {};\n\n    const rawNetwork = accept.network || '';\n    const network = normalizeNetwork(rawNetwork);\n    const chainId = network ? CHAIN_IDS[network] : parseInt(rawNetwork.split(':')[1] || '8453');\n    const paymentAmount = accept.amount || accept.maxAmountRequired;\n    const spender = extra.feePayer || accept.payTo;\n    const usdcAddress = accept.asset;\n\n    const rpcUrl = getEvmRpcUrl(network || rawNetwork);\n    if (!rpcUrl) throw new Error(`[relai-x402] No EVM RPC URL for network ${network || rawNetwork}`);\n\n    log('Building EIP-2612 permit on chain', chainId);\n\n    // Read nonce from USDC contract: nonces(address) = 0x7ecebe00\n    const paddedAddress = evmWallet.address.toLowerCase().replace('0x', '').padStart(64, '0');\n    const nonceHex = await evmRpcCall(rpcUrl, usdcAddress, '0x7ecebe00' + paddedAddress);\n    const nonce = nonceHex ? parseInt(nonceHex, 16) : 0;\n    if (isNaN(nonce)) throw new Error(`[relai-x402] Failed to read permit nonce from ${usdcAddress} on ${rpcUrl}`);\n    log('  Permit nonce:', nonce);\n\n    // Read token name: name() = 0x06fdde03\n    const nameHex = await evmRpcCall(rpcUrl, usdcAddress, '0x06fdde03');\n    // Decode ABI-encoded string\n    let tokenName = 'USD Coin';\n    try {\n      const offset = parseInt(nameHex.slice(2, 66), 16) * 2;\n      const length = parseInt(nameHex.slice(2 + offset, 2 + offset + 64), 16);\n      const hex = nameHex.slice(2 + offset + 64, 2 + offset + 64 + length * 2);\n      tokenName = decodeURIComponent(hex.replace(/[0-9a-f]{2}/g, '%$&'));\n    } catch {\n      tokenName = extra.name || 'USD Coin';\n    }\n    log('  Token name:', tokenName);\n\n    const deadline = Math.floor(Date.now() / 1000) + 600; // 10 min\n\n    const domain = {\n      name: tokenName,\n      version: extra.version || '2',\n      chainId,\n      verifyingContract: usdcAddress,\n    };\n\n    const types = {\n      Permit: [\n        { name: 'owner', type: 'address' },\n        { name: 'spender', type: 'address' },\n        { name: 'value', type: 'uint256' },\n        { name: 'nonce', type: 'uint256' },\n        { name: 'deadline', type: 'uint256' },\n      ],\n    };\n\n    const message = {\n      owner: evmWallet.address,\n      spender,\n      value: paymentAmount,\n      nonce: String(nonce),\n      deadline: String(deadline),\n    };\n\n    log('Signing EIP-2612 permit:', message);\n\n    const signature = await evmWallet.signTypedData({\n      domain,\n      types,\n      message,\n      primaryType: 'Permit',\n    });\n\n    // Split signature into v, r, s\n    const sigHex = (signature as string).replace('0x', '');\n    const r = '0x' + sigHex.slice(0, 64);\n    const s = '0x' + sigHex.slice(64, 128);\n    const v = parseInt(sigHex.slice(128, 130), 16);\n\n    log('  Permit signed: v=%d r=%s s=%s', v, r, s);\n\n    // Build x402 v2 payment payload (SKALE format)\n    const paymentPayload = {\n      x402Version: 2,\n      scheme: 'exact',\n      network: network || rawNetwork,\n      payload: {\n        userAddress: evmWallet.address,\n        permit: { deadline: String(deadline), v, r, s },\n        amount: paymentAmount,\n      },\n    };\n\n    return encodeBase64Json(paymentPayload);\n  }\n\n  // -----------------------------------------------------------------------\n  // Build EVM payment (EIP-3009 transferWithAuthorization)\n  // -----------------------------------------------------------------------\n  async function buildEvmPayment(\n    accept: any,\n    requirements: any,\n    url: string,\n  ): Promise<string> {\n    const evmWallet = effectiveWallets.evm!;\n    const extra = accept.extra || {};\n\n    const rawNetwork = accept.network || '';\n    const network = normalizeNetwork(rawNetwork);\n    const chainId = network ? CHAIN_IDS[network] : parseInt(rawNetwork.split(':')[1] || '8453');\n\n    const paymentAmount = accept.amount || accept.maxAmountRequired;\n\n    // EIP-3009 transferWithAuthorization does NOT require approve\n    // Facilitator executes transfer directly with user's signature (zero gas for user)\n    \n    // For relayer-based facilitators (0xGasless), 'to' is the payTo (merchant).\n    // For standard x402 (RelAI), 'to' is also payTo (merchant).\n    const useRelayer = !!extra.relayerContract;\n\n    const rpcUrl = getEvmRpcUrl(network || rawNetwork);\n    const defaultTokenVersion = chainId === CHAIN_IDS['skale-bite'] ? '1' : '2';\n\n    let tokenName = extra.name || 'USD Coin';\n    if (!useRelayer && rpcUrl) {\n      try {\n        // Read token name from contract to avoid EIP-712 domain mismatch across bridged assets.\n        const nameHex = await evmRpcCall(rpcUrl, accept.asset, '0x06fdde03');\n        const offset = parseInt(nameHex.slice(2, 66), 16) * 2;\n        const length = parseInt(nameHex.slice(2 + offset, 2 + offset + 64), 16);\n        const hex = nameHex.slice(2 + offset + 64, 2 + offset + 64 + length * 2);\n        tokenName = decodeURIComponent(hex.replace(/[0-9a-f]{2}/g, '%$&'));\n      } catch {\n        tokenName = extra.name || 'USD Coin';\n      }\n    }\n\n    // EIP-3009 transferWithAuthorization typed data\n    // When extra.relayerContract is present (e.g. 0xGasless), sign against the\n    // relayer contract's EIP-712 domain instead of the token contract's domain.\n    const domain = {\n      name: useRelayer ? (extra.domainName || 'A402') : tokenName,\n      version: useRelayer ? (extra.domainVersion || '1') : (extra.version || defaultTokenVersion),\n      chainId,\n      verifyingContract: useRelayer ? extra.relayerContract : accept.asset,\n    };\n\n    // Detect whether token supports EIP-2612 permit (but not EIP-3009)\n    const tokenNetworkKey = network || rawNetwork;\n    const networkTokens = NETWORK_TOKENS[tokenNetworkKey as keyof typeof NETWORK_TOKENS];\n    const assetLower = (accept.asset || '').toLowerCase();\n    const tokenInfo = networkTokens?.find((t: any) => t.address.toLowerCase() === assetLower) || networkTokens?.[0];\n    const tokenStandards: string[] = Array.isArray(tokenInfo?.standards) ? tokenInfo.standards : [];\n    const hasEip3009 = tokenStandards.some((s: string) => s.toLowerCase() === 'eip3009');\n    const hasEip2612 = tokenStandards.some((s: string) => s.toLowerCase() === 'eip2612');\n    const usePermit2612 = !hasEip3009 && hasEip2612;\n\n    let message: Record<string, unknown>;\n    let signature: string;\n    let authorizationScheme: string;\n\n    if (usePermit2612) {\n      // EIP-2612 permit flow: read nonce from contract, sign Permit typed data\n      // spender = feePayer (RelAI backend) who will call permit + transferFrom\n      const spender = extra.feePayer || accept.payTo;\n      const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n      let nonce = 0;\n      if (rpcUrl) {\n        try {\n          const paddedAddress = evmWallet.address.toLowerCase().replace('0x', '').padStart(64, '0');\n          const nonceHex = await evmRpcCall(rpcUrl, accept.asset, '0x7ecebe00' + paddedAddress);\n          nonce = nonceHex ? parseInt(nonceHex, 16) : 0;\n        } catch { nonce = 0; }\n      }\n\n      const permitTypes = {\n        Permit: [\n          { name: 'owner', type: 'address' },\n          { name: 'spender', type: 'address' },\n          { name: 'value', type: 'uint256' },\n          { name: 'nonce', type: 'uint256' },\n          { name: 'deadline', type: 'uint256' },\n        ],\n      };\n\n      message = {\n        owner: evmWallet.address,\n        spender,\n        value: paymentAmount,\n        nonce: String(nonce),\n        deadline: String(deadline),\n      };\n\n      log('Signing EIP-2612 permit on chain', chainId);\n\n      signature = await evmWallet.signTypedData({\n        domain,\n        types: permitTypes,\n        message,\n        primaryType: 'Permit',\n      });\n\n      authorizationScheme = 'eip2612';\n    } else {\n      // EIP-3009 transferWithAuthorization flow (default)\n      const validAfter = 0;\n      const validBefore = Math.floor(Date.now() / 1000) + 3600;\n      const nonce = '0x' + [...crypto.getRandomValues(new Uint8Array(32))]\n        .map(b => b.toString(16).padStart(2, '0')).join('');\n\n      const transferTypes = {\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      message = {\n        from: evmWallet.address,\n        to: accept.payTo,\n        value: paymentAmount,\n        validAfter: String(validAfter),\n        validBefore: String(validBefore),\n        nonce,\n      };\n\n      log('Signing EIP-3009 transferWithAuthorization on chain', chainId);\n\n      signature = await evmWallet.signTypedData({\n        domain,\n        types: transferTypes,\n        message,\n        primaryType: 'TransferWithAuthorization',\n      });\n\n      authorizationScheme = 'eip3009';\n    }\n\n    // Build x402 v2 payment payload\n    const paymentPayload = {\n      x402Version: 2,\n      resource: requirements.resource || { url },\n      accepted: accept,\n      payload: {\n        authorization: message,\n        signature,\n        authorizationScheme,\n      },\n      facilitatorUrl,\n    };\n\n    return encodeBase64Json(paymentPayload);\n  }\n\n  // -----------------------------------------------------------------------\n  // Build Solana payment (SPL transfer with fee payer sponsorship)\n  // -----------------------------------------------------------------------\n  async function buildSolanaPayment(\n    accept: any,\n    requirements: any,\n    url: string,\n  ): Promise<string> {\n    const solWallet = effectiveWallets.solana!;\n    const extra = accept.extra || {};\n\n    if (!extra.feePayer) {\n      throw new Error('[relai-x402] Missing feePayer in Solana payment requirements');\n    }\n\n    const connection = new Connection(solanaRpcUrl, 'confirmed');\n    const userPubkey = new PublicKey(solWallet.publicKey!.toString());\n    const merchantPubkey = new PublicKey(accept.payTo);\n    const feePayerPubkey = new PublicKey(extra.feePayer);\n    const mintPubkey = new PublicKey(accept.asset);\n    const paymentAmount = BigInt(accept.amount || accept.maxAmountRequired);\n\n    log('Building Solana SPL transfer');\n    log('  User:', userPubkey.toBase58());\n    log('  Merchant:', merchantPubkey.toBase58());\n    log('  FeePayer:', feePayerPubkey.toBase58());\n    log('  Mint:', mintPubkey.toBase58());\n    log('  Amount:', paymentAmount.toString());\n\n    // Determine token program (TOKEN_PROGRAM_ID vs TOKEN_2022)\n    const mintInfo = await getMint(connection, mintPubkey);\n    const programId = mintInfo.address.equals(mintPubkey)\n      ? (mintInfo as any).owner?.toBase58?.() === TOKEN_2022_PROGRAM_ID.toBase58()\n        ? TOKEN_2022_PROGRAM_ID\n        : TOKEN_PROGRAM_ID\n      : TOKEN_PROGRAM_ID;\n\n    // Get ATAs (allowOffCurve=true for smart wallets / PDA signers)\n    const sourceAta = await getAssociatedTokenAddress(\n      mintPubkey, userPubkey, true, programId,\n    );\n    const destinationAta = await getAssociatedTokenAddress(\n      mintPubkey, merchantPubkey, true, programId,\n    );\n\n    log('  Source ATA:', sourceAta.toBase58());\n    log('  Dest ATA:', destinationAta.toBase58());\n\n    // Build transfer instruction\n    const transferIx = createTransferCheckedInstruction(\n      sourceAta,\n      mintPubkey,\n      destinationAta,\n      userPubkey,\n      paymentAmount,\n      mintInfo.decimals,\n      [],\n      programId,\n    );\n\n    // Build versioned transaction with feePayer\n    const { blockhash } = await connection.getLatestBlockhash('confirmed');\n    const message = new TransactionMessage({\n      payerKey: feePayerPubkey,\n      recentBlockhash: blockhash,\n      instructions: [transferIx],\n    }).compileToV0Message();\n\n    const transaction = new VersionedTransaction(message);\n\n    // User signs (feePayer signs on backend/facilitator side)\n    const signedTx = await solWallet.signTransaction!(transaction) as VersionedTransaction;\n    log('Transaction signed by user');\n\n    // Serialize to base64\n    const serializedTx = Buffer.from(signedTx.serialize()).toString('base64');\n\n    // Build x402 v2 payment payload\n    const paymentPayload = {\n      x402Version: 2,\n      resource: requirements.resource || { url },\n      accepted: accept,\n      payload: {\n        transaction: serializedTx,\n      },\n    };\n\n    return encodeBase64Json(paymentPayload);\n  }\n\n  // -----------------------------------------------------------------------\n  // Main fetch\n  // -----------------------------------------------------------------------\n  function encodeBase64Json(payload: unknown): string {\n    const serialized = JSON.stringify(payload);\n    if (typeof Buffer !== 'undefined') {\n      return Buffer.from(serialized, 'utf8').toString('base64');\n    }\n    if (typeof btoa !== 'undefined') {\n      return btoa(serialized);\n    }\n    throw new Error('[relai-x402] Base64 encoding is not available in this runtime');\n  }\n\n  function decodeBase64Json(encoded: string): any | null {\n    try {\n      const normalized = encoded.trim().replace(/-/g, '+').replace(/_/g, '/');\n      const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n      const decoded = typeof Buffer !== 'undefined'\n        ? Buffer.from(padded, 'base64').toString('utf8')\n        : atob(padded);\n      return JSON.parse(decoded);\n    } catch {\n      return null;\n    }\n  }\n\n  function parsePaymentRequiredHeader(response: Response): any | null {\n    const headerValue =\n      response.headers.get('payment-required') ||\n      response.headers.get('PAYMENT-REQUIRED') ||\n      response.headers.get('x-payment-required') ||\n      response.headers.get('X-PAYMENT-REQUIRED');\n\n    if (!headerValue) return null;\n\n    const trimmed = headerValue.trim();\n    if (!trimmed) return null;\n\n    try {\n      return JSON.parse(trimmed);\n    } catch {\n      return decodeBase64Json(trimmed);\n    }\n  }\n\n  function getAccepts(requirements: any): any[] {\n    if (!requirements || typeof requirements !== 'object') {\n      return [];\n    }\n\n    if (Array.isArray(requirements.accepts)) {\n      return requirements.accepts;\n    }\n\n    if (requirements.paymentRequired && Array.isArray(requirements.paymentRequired.accepts)) {\n      return requirements.paymentRequired.accepts;\n    }\n\n    if (requirements.data && Array.isArray(requirements.data.accepts)) {\n      return requirements.data.accepts;\n    }\n\n    return [];\n  }\n\n  async function x402Fetch(\n    input: string | URL | Request,\n    init?: X402FetchInit,\n  ): Promise<Response> {\n    const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n    log('Request:', url);\n\n    const requestInit = stripInternalInit(init);\n    const integritasOptions = resolveIntegritasOptions(init?.x402?.integritas);\n    const requestMethod = getRequestMethod(input, requestInit);\n    const requestHeaders = applyIntegritasHeaders(\n      getRequestHeaders(input, requestInit),\n      integritasOptions,\n    );\n    const requestInitWithHeaders: RequestInit = {\n      ...(requestInit || {}),\n      headers: requestHeaders,\n    };\n    const requestBody = await resolveRequestBody(input, requestInitWithHeaders);\n\n    if (relayWsEnabled && isRelayRequestUrl(url)) {\n      let wsPaymentPhaseStarted = false;\n      try {\n        log('Using WebSocket relay transport');\n\n        const wsPreflightResponse = await relayCallOverWebSocket({\n          relayUrl: url,\n          requestMethod,\n          requestHeaders,\n          requestBody,\n          timeoutMs: relayWsPreflightTimeoutMs,\n        });\n\n        if (!wsPreflightResponse.error) {\n          return buildWsResponse(wsPreflightResponse);\n        }\n\n        if (Number(wsPreflightResponse.error.code) !== 402) {\n          throw new Error(wsPreflightResponse.error.message || '[relai-x402] WebSocket relay request failed');\n        }\n\n        // ── MPP over WS: check for WWW-Authenticate: Payment challenge ────\n        if (mpp) {\n          const mppChallenge = extractMppChallengeFromWsError(wsPreflightResponse.error);\n          if (mppChallenge) {\n            log('MPP challenge detected in WS 402 response');\n            const syntheticResponse = buildSyntheticMppResponse(mppChallenge, wsPreflightResponse.error);\n            const credential = await mpp.createCredential(syntheticResponse);\n            if (!credential) {\n              throw new Error('[relai-x402] MPP createCredential returned empty credential (WS)');\n            }\n            log('MPP credential created, retrying via WS with Authorization: Payment');\n            wsPaymentPhaseStarted = true;\n            const wsMppResponse = await relayCallOverWebSocket({\n              relayUrl: url,\n              requestMethod,\n              requestHeaders: {\n                ...requestHeaders,\n                'Authorization': credential.startsWith('Payment ') ? credential : `Payment ${credential}`,\n              },\n              requestBody,\n              timeoutMs: relayWsPaymentTimeoutMs,\n            });\n\n            if (wsMppResponse.error) {\n              throw new Error(wsMppResponse.error.message || '[relai-x402] WebSocket MPP payment rejected by server');\n            }\n\n            return buildWsResponse(wsMppResponse);\n          }\n        }\n        // ── End MPP over WS ───────────────────────────────────────────────\n\n        const wsRequirements = extractPaymentRequirementsFromWsError(wsPreflightResponse.error);\n        if (!wsRequirements) {\n          throw new Error(\n            wsPreflightResponse.error.message || '[relai-x402] No payment requirements in WS 402 response'\n          );\n        }\n\n        const wsAccepts = getAccepts(wsRequirements);\n        if (!wsAccepts.length) {\n          throw new Error('[relai-x402] No payment options in WS 402 response');\n        }\n\n        if (wsAccepts.length > 1) {\n          throw new Error(\n            '[relai-x402] WS relay currently supports a single payment payload; use HTTP flow for multi-accept payments'\n          );\n        }\n\n        const wsSelected = selectAccept(wsAccepts);\n        if (!wsSelected) {\n          // Check bridge extension for cross-chain routing (same as HTTP flow)\n          const wsBridge = getBridgeExtension(wsRequirements);\n          if (wsBridge && selectBridgeSource(wsBridge)) {\n            log('No direct wallet match in WS flow — attempting bridge extension');\n            wsPaymentPhaseStarted = true;\n            const bridgePaymentHeader = await executeBridgePayment(wsBridge, wsAccepts, wsRequirements, url);\n            log('Retrying with X-PAYMENT header (bridge via WS fallback to HTTP)');\n            // Bridge payment must go through HTTP (bridge settle is an HTTP POST)\n            // so we fall back to HTTP for the final retry with the bridge payment\n            return fetch(input, {\n              ...(stripInternalInit(init) || {}),\n              headers: { ...requestHeaders, 'X-PAYMENT': bridgePaymentHeader },\n            });\n          }\n          throw new Error(buildNoWalletError(wsAccepts, true));\n        }\n\n        const { accept, chain } = wsSelected;\n        const amount = accept.amount || accept.maxAmountRequired;\n\n        if (maxAmountAtomic && BigInt(amount) > BigInt(maxAmountAtomic)) {\n          throw new Error(`[relai-x402] Amount ${amount} exceeds max ${maxAmountAtomic}`);\n        }\n\n        wsPaymentPhaseStarted = true;\n\n        let paymentHeader: string | null = null;\n        if (chain === 'solana' && hasSolanaWallet) {\n          paymentHeader = await buildSolanaPayment(accept, wsRequirements, url);\n        } else if (chain === 'evm') {\n          const evmNetwork = normalizeNetwork(accept.network || '');\n          const usePermit = evmNetwork && PERMIT_NETWORKS.has(evmNetwork);\n          paymentHeader = usePermit\n            ? await buildEvmPermitPayment(accept, wsRequirements, url)\n            : await buildEvmPayment(accept, wsRequirements, url);\n        }\n\n        if (!paymentHeader) {\n          throw new Error('[relai-x402] Unexpected state - no WS payment handler matched');\n        }\n\n        const paymentPayload = decodeBase64Json(paymentHeader);\n        if (!paymentPayload) {\n          throw new Error('[relai-x402] Failed to decode payment payload for WS relay call');\n        }\n\n        const wsPaidResponse = await relayCallOverWebSocket({\n          relayUrl: url,\n          requestMethod,\n          requestHeaders,\n          requestBody,\n          paymentPayload,\n          timeoutMs: relayWsPaymentTimeoutMs,\n        });\n\n        if (wsPaidResponse.error) {\n          throw new Error(wsPaidResponse.error.message || '[relai-x402] WebSocket paid relay request failed');\n        }\n\n        return buildWsResponse(wsPaidResponse);\n      } catch (wsError) {\n        const wsMessage = wsError instanceof Error ? wsError.message : String(wsError);\n        log('WebSocket relay transport failed:', wsMessage);\n\n        if (wsPaymentPhaseStarted) {\n          // Do not retry over HTTP after payment flow has started (may trigger duplicate signing/payment prompts).\n          throw wsError instanceof Error ? wsError : new Error(`[relai-x402] ${wsMessage}`);\n        }\n\n        if (!relayWsFallbackToHttp) {\n          throw wsError instanceof Error ? wsError : new Error(`[relai-x402] ${wsMessage}`);\n        }\n\n        log('Falling back to HTTP x402 flow');\n      }\n    }\n\n    const response = await fetch(input, requestInitWithHeaders);\n    if (response.status !== 402) return response;\n\n    log('Got 402 Payment Required');\n\n    // ── MPP: check for WWW-Authenticate: Payment challenge ──────────────\n    if (mpp) {\n      const wwwAuth = response.headers.get('www-authenticate');\n      if (wwwAuth && /^Payment\\s+/i.test(wwwAuth.trim())) {\n        log('MPP challenge detected in WWW-Authenticate header');\n        const credential = await mpp.createCredential(response);\n        if (!credential) {\n          throw new Error('[relai-x402] MPP createCredential returned empty credential');\n        }\n        log('MPP credential created, retrying with Authorization: Payment');\n        const mppRetry = await fetch(input, {\n          ...requestInitWithHeaders,\n          headers: {\n            ...requestHeaders,\n            'Authorization': credential.startsWith('Payment ') ? credential : `Payment ${credential}`,\n          },\n        });\n        return mppRetry;\n      }\n    }\n    // ── End MPP ─────────────────────────────────────────────────────────\n\n    let requirementsFromBody: any = null;\n    try {\n      requirementsFromBody = await response.clone().json();\n    } catch {}\n\n    const requirementsFromHeader = parsePaymentRequiredHeader(response);\n\n    let requirements: any = requirementsFromBody;\n    let accepts = getAccepts(requirementsFromBody);\n\n    if (!accepts.length && requirementsFromHeader) {\n      const headerAccepts = getAccepts(requirementsFromHeader);\n\n      if (headerAccepts.length || !requirements || typeof requirements !== 'object') {\n        requirements = requirementsFromHeader;\n        accepts = headerAccepts;\n        log('402 body missing accepts; using PAYMENT-REQUIRED header fallback');\n      }\n    }\n\n    if (!requirements || typeof requirements !== 'object') {\n      throw new Error('[relai-x402] Failed to parse 402 response body/header');\n    }\n\n    if (!accepts.length) throw new Error('[relai-x402] No payment options in 402 response');\n\n    const selected = bridgeConfig?.force ? null : selectAccept(accepts);\n    if (!selected) {\n      // Fallback 1: check bridge extension in 402 response (server-advertised)\n      const bridge = getBridgeExtension(requirements);\n      if (bridge && selectBridgeSource(bridge)) {\n        log('No direct wallet match — attempting bridge extension flow');\n        const paymentHeader = await executeBridgePayment(bridge, accepts, requirements, url);\n        log('Retrying with X-PAYMENT header (bridge)');\n        return fetch(input, {\n          ...requestInitWithHeaders,\n          headers: { ...requestHeaders, 'X-PAYMENT': paymentHeader },\n        });\n      }\n\n      // Fallback 2: auto-bridge via RelAI API (server doesn't need to advertise bridge)\n      if (bridgeConfig?.enabled) {\n        log('No direct wallet match — attempting auto-bridge via RelAI API');\n        try {\n          const info = await _getBridgeInfo(bridgeConfig.baseUrl);\n          const targetAccept = accepts[0];\n          const hasEvm = !!effectiveWallets.evm;\n          const hasSol = !!hasSolanaWallet;\n          const source = _selectSourceChain(info.supportedSourceChains, hasEvm, hasSol);\n          if (source) {\n            const bridgePayTo = info.payTo[source.chain];\n            if (bridgePayTo) {\n              const targetAmount = targetAccept.amount || targetAccept.maxAmountRequired;\n              const sourceAmount = _computeSourceAmount(BigInt(targetAmount), info.feeBps).toString();\n              // Match asset by index (chains & assets arrays are aligned)\n              const sourceChainIdx = info.supportedSourceChains.indexOf(source.chain);\n              const sourceAsset = (sourceChainIdx >= 0 && info.supportedSourceAssets[sourceChainIdx])\n                || (source.type === 'evm'\n                  ? (info.supportedSourceAssets.find((a: string) => a.startsWith('0x')) || targetAccept.asset)\n                  : (info.supportedSourceAssets.find((a: string) => !a.startsWith('0x')) || ''));\n\n              // Build source payment using existing payment builders\n              let sourcePaymentHeader: string;\n              const sourceAccept = {\n                scheme: 'exact',\n                network: source.chain,\n                asset: sourceAsset,\n                payTo: bridgePayTo,\n                amount: sourceAmount,\n                extra: {\n                  ...(targetAccept.extra || {}),\n                  ...(source.type === 'solana' && info.feePayerSvm ? { feePayer: info.feePayerSvm } : {}),\n                },\n              };\n\n              if (source.type === 'solana' && hasSolanaWallet) {\n                sourcePaymentHeader = await buildSolanaPayment(sourceAccept, requirements, url);\n              } else if (source.type === 'evm') {\n                const evmNetwork = normalizeNetwork(source.chain);\n                const usePermit = evmNetwork && PERMIT_NETWORKS.has(evmNetwork);\n                sourcePaymentHeader = usePermit\n                  ? await buildEvmPermitPayment(sourceAccept, requirements, url)\n                  : await buildEvmPayment(sourceAccept, requirements, url);\n              } else {\n                throw new Error(`[relai-x402] No wallet for source chain type: ${source.type}`);\n              }\n\n              // Settle via bridge\n              const settleData = await _settleBridge(info.settleEndpoint, {\n                sourcePayment: sourcePaymentHeader,\n                sourceChain: source.chain,\n                targetAccept: {\n                  scheme: 'exact',\n                  network: targetAccept.network,\n                  asset: targetAccept.asset,\n                  payTo: targetAccept.payTo,\n                  amount: targetAmount,\n                },\n                requirements,\n                resource: url,\n                paymentFacilitator: info.paymentFacilitator,\n              });\n\n              if (settleData.xPayment) {\n                log(`Auto-bridge settled: target=${settleData.targetTxId}`);\n                return fetch(input, {\n                  ...requestInitWithHeaders,\n                  headers: { ...requestHeaders, 'X-PAYMENT': settleData.xPayment },\n                });\n              }\n\n              throw new Error('[relai-x402] Bridge settle did not return xPayment');\n            }\n          }\n        } catch (bridgeErr) {\n          const bridgeMsg = bridgeErr instanceof Error ? bridgeErr.message : String(bridgeErr);\n          log(`Auto-bridge failed: ${bridgeMsg}`);\n          throw new Error(`[relai-x402] Auto-bridge failed: ${bridgeMsg}`);\n        }\n      }\n\n      throw new Error(buildNoWalletError(accepts, false));\n    }\n\n    const { accept, chain } = selected;\n    const amount = accept.amount || accept.maxAmountRequired;\n    log(`Selected: ${chain} / ${accept.network} / amount=${amount}`);\n\n    // Amount guard\n    if (maxAmountAtomic && BigInt(amount) > BigInt(maxAmountAtomic)) {\n      throw new Error(`[relai-x402] Amount ${amount} exceeds max ${maxAmountAtomic}`);\n    }\n\n    // Solana — build SPL transfer natively (no x402-solana dependency)\n    if (chain === 'solana' && hasSolanaWallet) {\n      const paymentHeader = await buildSolanaPayment(accept, requirements, url);\n      log('Retrying with X-PAYMENT header (Solana)');\n      return fetch(input, {\n        ...requestInitWithHeaders,\n        headers: {\n          ...requestHeaders,\n          'X-PAYMENT': paymentHeader,\n        },\n      });\n    }\n\n    // EVM — build payment header and retry\n    if (chain === 'evm') {\n      const evmNetwork = normalizeNetwork(accept.network || '');\n      const usePermit = evmNetwork && PERMIT_NETWORKS.has(evmNetwork);\n      const paymentHeader = usePermit\n        ? await buildEvmPermitPayment(accept, requirements, url)\n        : await buildEvmPayment(accept, requirements, url);\n      log('Retrying with X-PAYMENT header');\n      return fetch(input, {\n        ...requestInitWithHeaders,\n        headers: {\n          ...requestHeaders,\n          'X-PAYMENT': paymentHeader,\n        },\n      });\n    }\n\n    throw new Error('[relai-x402] Unexpected state - no payment handler matched');\n  }\n\n  return { fetch: x402Fetch };\n}\n\nexport default createX402Client;\n","// src/types.ts\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** RelAI Facilitator URL */\nexport const RELAI_FACILITATOR_URL = 'https://facilitator.x402.fi';\n\n// ============================================================================\n// Supported Networks\n// ============================================================================\n\n/** All networks supported by RelAI facilitator */\nexport type RelaiNetwork =\n  | 'solana'\n  | 'solana-devnet'\n  | 'base'\n  | 'avalanche'\n  | 'skale-base'\n  | 'skale-base-sepolia'\n  | 'skale-bite'\n  | 'polygon'\n  | 'ethereum'\n  | 'telos';\n\n/** CAIP-2 network identifiers */\nexport const NETWORK_CAIP2: Record<RelaiNetwork, string> = {\n  'solana': 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n  'solana-devnet': 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n  'base': 'eip155:8453',\n  'avalanche': 'eip155:43114',\n  'skale-base': 'eip155:1187947933',\n  'skale-base-sepolia': 'eip155:324705682',\n  'skale-bite': 'eip155:103698795',\n  'polygon': 'eip155:137',\n  'ethereum': 'eip155:1',\n  'telos': 'eip155:40',\n};\n\n/** Reverse lookup: CAIP-2 → simple network name */\nexport const CAIP2_TO_NETWORK: Record<string, RelaiNetwork> = Object.fromEntries(\n  Object.entries(NETWORK_CAIP2).map(([k, v]) => [v, k as RelaiNetwork])\n) as Record<string, RelaiNetwork>;\n\n/** Chain IDs for EVM networks */\nexport const CHAIN_IDS: Record<string, number> = {\n  'base': 8453,\n  'avalanche': 43114,\n  'skale-base': 1187947933,\n  'skale-base-sepolia': 324705682,\n  'skale-bite': 103698795,\n  'polygon': 137,\n  'ethereum': 1,\n  'telos': 40,\n};\n\nexport interface NetworkToken {\n  address: string;\n  symbol: string;\n  name: string;\n  decimals: number;\n  domainVersion?: string;\n  isStableUsd?: boolean;\n  standards?: string[];\n}\n\n/** Token metadata per network (default token is always the first entry) */\nexport const NETWORK_TOKENS: Partial<Record<RelaiNetwork, NetworkToken[]>> = {\n  'solana': [\n    {\n      address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n      symbol: 'USDC',\n      name: 'USD Coin',\n      decimals: 6,\n    },\n  ],\n  'solana-devnet': [\n    {\n      address: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',\n      symbol: 'USDC',\n      name: 'USD Coin (Devnet)',\n      decimals: 6,\n    },\n  ],\n  'base': [\n    { address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', symbol: 'USDC', name: 'USD Coin', decimals: 6, domainVersion: '2', isStableUsd: true },\n  ],\n  'avalanche': [\n    {\n      address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n      symbol: 'USDC',\n      name: 'USD Coin',\n      decimals: 6,\n      domainVersion: '2',\n      isStableUsd: true,\n    },\n  ],\n  'telos': [\n    {\n      address: '0x818ec0a7fe18ff94269904fced6ae3dae6d6dc0b',\n      symbol: 'USDC',\n      name: 'USD Coin',\n      decimals: 6,\n      isStableUsd: true,\n      standards: ['eip2612'],\n    },\n  ],\n  'skale-base': [\n    {\n      address: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n      symbol: 'USDC',\n      name: 'Bridged USDC (SKALE Bridge)',\n      decimals: 6,\n      domainVersion: '2',\n      isStableUsd: true,\n    },\n    {\n      address: '0x2bF5bF154b515EaA82C31a65ec11554fF5aF7fCA',\n      symbol: 'USDT',\n      name: 'Bridged USDT (SKALE Bridge)',\n      decimals: 6,\n      domainVersion: '1',\n      isStableUsd: true,\n    },\n    {\n      address: '0x1aeeCFE5454c83B42D8A316246CAc9739E7f690e',\n      symbol: 'WBTC',\n      name: 'Wrapped Bitcoin',\n      decimals: 8,\n      domainVersion: '1',\n      isStableUsd: false,\n    },\n    {\n      address: '0x7bD39ABBd0Dd13103542cAe3276C7fA332bCA486',\n      symbol: 'WETH',\n      name: 'Wrapped Ether',\n      decimals: 18,\n      domainVersion: '1',\n      isStableUsd: false,\n    },\n  ],\n  'skale-base-sepolia': [\n    {\n      address: '0x2e08028E3C4c2356572E096d8EF835cD5C6030bD',\n      symbol: 'USDC',\n      name: 'Bridged USDC (SKALE Bridge)',\n      decimals: 6,\n      domainVersion: '2',\n      isStableUsd: true,\n    },\n    {\n      address: '0x3ca0a49f511c2c89c4dcbbf1731120d8919050bf',\n      symbol: 'USDT',\n      name: 'Bridged USDT (SKALE Bridge)',\n      decimals: 6,\n      domainVersion: '1',\n      isStableUsd: true,\n    },\n    {\n      address: '0x4512eacd4186b025186e1cf6cc0d89497c530e87',\n      symbol: 'WBTC',\n      name: 'Wrapped Bitcoin',\n      decimals: 8,\n      domainVersion: '1',\n      isStableUsd: false,\n    },\n    {\n      address: '0xf94056bd7f6965db3757e1b145f200b7346b4fc0',\n      symbol: 'WETH',\n      name: 'Wrapped Ether',\n      decimals: 18,\n      domainVersion: '1',\n      isStableUsd: false,\n    },\n  ],\n  'skale-bite': [\n    {\n      address: '0xc4083B1E81ceb461Ccef3FDa8A9F24F0d764B6D8',\n      symbol: 'USDC',\n      name: 'USDC',\n      decimals: 6,\n      domainVersion: '1',\n      isStableUsd: true,\n    },\n  ],\n  'polygon': [\n    {\n      address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n      symbol: 'USDC',\n      name: 'USD Coin',\n      decimals: 6,\n      domainVersion: '2',\n      isStableUsd: true,\n    },\n  ],\n  'ethereum': [\n    {\n      address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n      symbol: 'USDC',\n      name: 'USD Coin',\n      decimals: 6,\n      domainVersion: '2',\n      isStableUsd: true,\n    },\n  ],\n};\n\nexport function resolveToken(network: RelaiNetwork, asset?: string): NetworkToken | null {\n  const tokens = NETWORK_TOKENS[network];\n  if (!tokens || tokens.length === 0) return null;\n  if (!asset) return tokens[0];\n\n  const normalized = String(asset).toLowerCase();\n  return tokens.find((token) => token.address.toLowerCase() === normalized) || null;\n}\n\n/** USDC contract addresses per network */\nexport const USDC_ADDRESSES: Record<RelaiNetwork, string> = {\n  'solana': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n  'solana-devnet': '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',\n  'base': '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n  'avalanche': '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n  'skale-base': '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n  'skale-base-sepolia': '0x2e08028E3C4c2356572E096d8EF835cD5C6030bD',\n  'skale-bite': '0xc4083B1E81ceb461Ccef3FDa8A9F24F0d764B6D8',\n  'polygon': '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n  'ethereum': '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n  'telos': '0x818ec0a7fe18ff94269904fced6ae3dae6d6dc0b',\n};\n\n/** Explorer URLs per network */\nexport const EXPLORER_TX_URL: Record<RelaiNetwork, (tx: string) => string> = {\n  'solana': (tx) => `https://solscan.io/tx/${tx}`,\n  'solana-devnet': (tx) => `https://solscan.io/tx/${tx}?cluster=devnet`,\n  'base': (tx) => `https://basescan.org/tx/${tx}`,\n  'avalanche': (tx) => `https://snowtrace.io/tx/${tx}`,\n  'skale-base': (tx) => `https://skale-base-explorer.skalenodes.com/tx/${tx}`,\n  'skale-base-sepolia': (tx) => `https://base-sepolia-testnet-explorer.skalenodes.com/tx/${tx}`,\n  'skale-bite': (tx) => `https://base-sepolia-testnet.explorer.skalenodes.com/tx/${tx}`,\n  'polygon': (tx) => `https://polygonscan.com/tx/${tx}`,\n  'ethereum': (tx) => `https://etherscan.io/tx/${tx}`,\n  'telos': (tx) => `https://teloscan.io/tx/${tx}`,\n};\n\n/** Human-readable network labels */\nexport const NETWORK_LABELS: Record<RelaiNetwork, string> = {\n  'solana': 'Solana',\n  'solana-devnet': 'Solana Devnet',\n  'base': 'Base',\n  'avalanche': 'Avalanche',\n  'skale-base': 'SKALE Base',\n  'skale-base-sepolia': 'SKALE Base Sepolia',\n  'skale-bite': 'SKALE BITE V2',\n  'polygon': 'Polygon',\n  'ethereum': 'Ethereum',\n  'telos': 'Telos EVM',\n};\n\n/** Legacy CAIP-2 exports for backward compatibility */\nexport const SOLANA_MAINNET_NETWORK = NETWORK_CAIP2['solana'];\nexport const BASE_MAINNET_NETWORK = NETWORK_CAIP2['base'];\n\n/** Legacy USDC exports for backward compatibility */\nexport const USDC_SOLANA = USDC_ADDRESSES['solana'];\nexport const USDC_BASE = USDC_ADDRESSES['base'];\n\n/** All supported RelAI networks list */\nexport const RELAI_NETWORKS: RelaiNetwork[] = [\n  'solana',\n  'solana-devnet',\n  'base',\n  'avalanche',\n  'skale-base',\n  'skale-base-sepolia',\n  'skale-bite',\n  'polygon',\n  'ethereum',\n  'telos',\n];\n\n/** Check if a network is Solana-based */\nexport function isSolana(network: string): boolean {\n  return network === 'solana' || network === 'solana-devnet' || network.startsWith('solana:');\n}\n\n/** Check if a network is EVM-based */\nexport function isEvm(network: string): boolean {\n  return ['base', 'avalanche', 'skale-base', 'skale-base-sepolia', 'skale-bite', 'polygon', 'ethereum', 'telos'].includes(network) || network.startsWith('eip155:');\n}\n\n/** Normalize CAIP-2 or simple name to RelaiNetwork */\nexport function normalizeNetwork(network: string): RelaiNetwork | null {\n  if (RELAI_NETWORKS.includes(network as RelaiNetwork)) return network as RelaiNetwork;\n  const fromCaip2 = CAIP2_TO_NETWORK[network];\n  if (fromCaip2) return fromCaip2;\n  // Partial match\n  if (network.startsWith('solana:')) return 'solana';\n  if (network.startsWith('eip155:')) {\n    const chainId = parseInt(network.split(':')[1]);\n    const entry = Object.entries(CHAIN_IDS).find(([, id]) => id === chainId);\n    if (entry) return entry[0] as RelaiNetwork;\n  }\n  return null;\n}\n\n// ============================================================================\n// Wallet Types\n// ============================================================================\n\n/** Solana wallet interface */\nexport interface SolanaWallet {\n  publicKey: { toString(): string } | null;\n  signTransaction: ((tx: unknown) => Promise<unknown>) | null;\n  signAllTransactions?: ((txs: unknown[]) => Promise<unknown[]>) | null;\n}\n\n/** EVM wallet interface (viem-compatible) */\nexport interface EvmWallet {\n  address: string;\n  signTypedData: (params: unknown) => Promise<string>;\n  chain?: { id: number };\n}\n\n/** Wallet set for multi-chain support */\nexport interface WalletSet {\n  solana?: SolanaWallet;\n  evm?: EvmWallet;\n}\n\n// ============================================================================\n// Payment Types\n// ============================================================================\n\n/** Extra fields in payment requirements */\nexport interface AcceptsExtra {\n  feePayer?: string;\n  decimals?: number;\n  name?: string;\n  version?: string;\n  [key: string]: unknown;\n}\n\n/** A single payment option */\nexport interface PaymentAccept {\n  x402Version?: 1 | 2;\n  scheme: string;\n  network: string;\n  maxAmountRequired?: string;\n  amount?: string;\n  asset: string;\n  payTo: string;\n  maxTimeoutSeconds?: number;\n  extra?: AcceptsExtra;\n  resource?: string;\n  description?: string;\n  mimeType?: string;\n  outputSchema?: unknown;\n}\n\n/** Resource info for v2 */\nexport interface ResourceInfo {\n  url: string;\n  description?: string;\n  mimeType?: string;\n}\n\n/** Payment requirements (402 response) */\nexport interface PaymentRequired {\n  x402Version: 1 | 2;\n  error?: string;\n  accepts: PaymentAccept[];\n  resource?: ResourceInfo;\n  extensions?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Config Types (server-specific types are in server.ts)\n// ============================================================================\n","/**\n * Core bridge utilities — shared between x402 and MPP clients.\n *\n * Auto-discovers bridge info from the RelAI API and provides helpers\n * for executing cross-chain payments transparently.\n *\n * Usage (MPP):\n * ```ts\n * import { evmChargeWithBridge } from '@relai-fi/x402/mpp/with-bridge'\n * ```\n *\n * Usage (x402):\n * ```ts\n * import { createX402Client } from '@relai-fi/x402'\n * const client = createX402Client({ ..., bridge: { enabled: true } })\n * ```\n */\n\nconst RELAI_API_BASE = 'https://api.relai.fi'\n\nexport interface BridgeInfo {\n  settleEndpoint: string\n  supportedSourceChains: string[]\n  supportedSourceAssets: string[]\n  payTo: Record<string, string>\n  feePayerSvm: string | null\n  feeBps: number\n  paymentFacilitator: string\n}\n\nexport interface BridgeSettleRequest {\n  /** x402 mode: base64-encoded payment header */\n  sourcePayment?: string\n  /** MPP mode: source tx hash */\n  sourceTxHash?: string\n  /** MPP mode: wallet address that sent the source tx */\n  senderAddress?: string\n  /** MPP mode: signature of (sourceTxHash + JSON(targetAccept)) */\n  senderSignature?: string\n  /** CAIP-2 source chain identifier */\n  sourceChain: string\n  targetAccept: {\n    scheme: 'exact'\n    network: string\n    asset: string\n    payTo: string\n    amount: string\n  }\n  /** x402 payment requirements (full 402 body) — needed by settle for x402 flow */\n  requirements?: any\n  resource?: string\n  paymentFacilitator?: string | null\n}\n\nexport interface BridgeSettleResponse {\n  success?: boolean\n  targetTxId?: string\n  sourceTxId?: string\n  /** x402 payment header (returned by x402-flavored settle) */\n  xPayment?: string\n}\n\n// ── Cache (keyed by base URL) ──────────────────────────────────────────\n\nconst _cacheMap = new Map<string, { info: BridgeInfo; time: number }>()\nconst CACHE_TTL = 5 * 60 * 1000 // 5 minutes\n\n/**\n * Fetch bridge info from the RelAI API (cached per base URL for 5 minutes).\n */\nexport async function getBridgeInfo(baseUrl = RELAI_API_BASE): Promise<BridgeInfo> {\n  const key = baseUrl.replace(/\\/$/, '')\n  const now = Date.now()\n  const cached = _cacheMap.get(key)\n  if (cached && now - cached.time < CACHE_TTL) return cached.info\n\n  const url = `${key}/bridge/info`\n  const res = await fetch(url)\n  if (!res.ok) {\n    if (cached) return cached.info // stale cache better than failure\n    throw new Error(`[relai:bridge] Failed to fetch ${url}: ${res.status}`)\n  }\n\n  const data = (await res.json()) as any\n  const info: BridgeInfo = {\n    settleEndpoint: data.settleEndpoint,\n    supportedSourceChains: data.supportedSourceChains || [],\n    supportedSourceAssets: data.supportedSourceAssets || [],\n    payTo: data.payTo || {},\n    feePayerSvm: data.feePayerSvm ?? null,\n    feeBps: data.feeBps ?? 100,\n    paymentFacilitator: data.paymentFacilitator || 'https://facilitator.x402.fi',\n  }\n  _cacheMap.set(key, { info, time: now })\n  return info\n}\n\n/**\n * Call the bridge settle endpoint.\n */\nexport async function settleBridge(\n  settleEndpoint: string,\n  body: BridgeSettleRequest,\n): Promise<BridgeSettleResponse> {\n  const res = await fetch(settleEndpoint, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(body),\n  })\n\n  if (!res.ok) {\n    const err = (await res.json().catch(() => ({}))) as any\n    throw new Error(`[relai:bridge] settle failed: ${err.error || res.status}${err.details ? ' — ' + err.details : ''}`)\n  }\n\n  return res.json() as Promise<BridgeSettleResponse>\n}\n\n/**\n * Select a source chain from supported chains that matches the available wallet.\n */\nexport function selectSourceChain(\n  supportedChains: string[],\n  hasEvmWallet: boolean,\n  hasSolanaWallet: boolean,\n  preferredSourceChainId?: number,\n): { type: 'evm' | 'solana'; chain: string } | null {\n  // If a specific source chain is preferred, try it first\n  if (preferredSourceChainId && hasEvmWallet) {\n    const preferred = `eip155:${preferredSourceChainId}`\n    if (supportedChains.includes(preferred)) {\n      return { type: 'evm', chain: preferred }\n    }\n  }\n\n  // Solana first (lower fees)\n  if (hasSolanaWallet) {\n    const sol = supportedChains.find((c) => c.startsWith('solana:'))\n    if (sol) return { type: 'solana', chain: sol }\n  }\n\n  // Then any EVM chain\n  if (hasEvmWallet) {\n    for (const chain of supportedChains) {\n      if (chain.startsWith('eip155:')) {\n        return { type: 'evm', chain }\n      }\n    }\n  }\n\n  return null\n}\n\n/**\n * Compute source amount including bridge fee.\n */\nexport function computeSourceAmount(targetAmount: bigint, feeBps: number): bigint {\n  const fee = (targetAmount * BigInt(feeBps)) / 10000n\n  return targetAmount + fee\n}\n\n// Known EVM RPC URLs (fallback)\nexport const DEFAULT_EVM_RPC: Record<string, string> = {\n  'eip155:8453': 'https://mainnet.base.org',\n  'eip155:137': 'https://polygon-rpc.com',\n  'eip155:1': 'https://eth.llamarpc.com',\n  'eip155:42161': 'https://arb1.arbitrum.io/rpc',\n  'eip155:43114': 'https://api.avax.network/ext/bc/C/rpc',\n  'eip155:1187947933': 'https://skale-base.skalenodes.com/v1/base',\n}\n"],"mappings":"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","names":["pathPart","accept","chain","amount"]}