{"version":3,"sources":["../src/queries/hubState.ts"],"sourcesContent":["import axios, { AxiosError } from 'axios';\nimport { Buffer } from 'buffer';\nimport { ethers } from 'ethers';\nimport {\n  EthCallQueryRequest,\n  EthCallQueryResponse,\n  PerChainQueryRequest,\n  QueryRequest,\n  QueryResponse,\n  hexToUint8Array,\n  isValidHexString,\n} from '@wormhole-foundation/wormhole-query-sdk';\n\nimport { MAINNET_CHAINS, TESTNET_CHAINS } from '../constants.js';\nimport { WORMHOLE_QUERY_PROXY_URLS } from './constants.js';\n\nexport type QueryHubStateNetwork = 'testnet' | 'mainnet';\n\nexport type QueryHubStateOptions = {\n  /** Max response age in seconds (default: 60). */\n  maxAge?: number;\n  network?: QueryHubStateNetwork;\n  /** Maximum attempts including the first try (default: 4). */\n  maxAttempts?: number;\n};\n\nexport type HubStateResult = {\n  nonce: bigint;\n  isRegistered: boolean;\n  blockTime: number;\n  proof: Uint8Array;\n  /** Last action hash (Issue #9/#10 - for action-hash binding) */\n  lastActionHash?: string;\n};\n\nexport type QueryHubStateErrorCode =\n  | 'INVALID_ARGUMENT'\n  | 'UNSUPPORTED_NETWORK'\n  | 'MISSING_HUB_ADDRESS'\n  | 'PROXY_HTTP_ERROR'\n  | 'PROXY_RESPONSE_INVALID'\n  | 'ATTESTATION_STALE'\n  | 'QUERY_RESPONSE_INVALID';\n\nexport class QueryHubStateError extends Error {\n  code: QueryHubStateErrorCode;\n  cause?: unknown;\n\n  constructor(code: QueryHubStateErrorCode, message: string, cause?: unknown) {\n    super(message);\n    this.name = 'QueryHubStateError';\n    this.code = code;\n    this.cause = cause;\n  }\n}\n\nfunction resolveNetwork(options?: QueryHubStateOptions): QueryHubStateNetwork {\n  if (options?.network) return options.network;\n\n  const envCandidates = [\n    (globalThis as any)?.process?.env?.NEXT_PUBLIC_VERIDEX_NETWORK,\n    (globalThis as any)?.process?.env?.VERIDEX_NETWORK,\n    (globalThis as any)?.process?.env?.NEXT_PUBLIC_WORMHOLE_NETWORK,\n    (globalThis as any)?.process?.env?.WORMHOLE_NETWORK,\n  ].filter(Boolean);\n\n  const env = (envCandidates[0] as string | undefined)?.toLowerCase();\n  if (env === 'mainnet' || env === 'testnet') return env;\n\n  // Default to testnet to support Base Sepolia out-of-the-box.\n  return 'testnet';\n}\n\nfunction concatBytes(parts: Uint8Array[]): Uint8Array {\n  const total = parts.reduce((sum, p) => sum + p.length, 0);\n  const out = new Uint8Array(total);\n  let offset = 0;\n  for (const p of parts) {\n    out.set(p, offset);\n    offset += p.length;\n  }\n  return out;\n}\n\nfunction signaturesToProofBytes(signatures: string[]): Uint8Array {\n  const chunks: Uint8Array[] = [];\n\n  for (const sig of signatures) {\n    if (typeof sig !== 'string' || sig.length !== 132 || !/^[0-9a-fA-F]+$/.test(sig)) {\n      throw new QueryHubStateError(\n        'PROXY_RESPONSE_INVALID',\n        `Invalid guardian signature format (expected 132 hex chars): ${String(sig)}`\n      );\n    }\n    // Avoid Node Buffer-backed Uint8Array (can surface as SharedArrayBuffer in DTS types).\n    chunks.push(hexToUint8Array(`0x${sig}`));\n  }\n\n  return concatBytes(chunks);\n}\n\nfunction decodeQueryBytes(bytes: string): Uint8Array {\n  if (typeof bytes !== 'string' || bytes.length === 0) {\n    throw new QueryHubStateError('PROXY_RESPONSE_INVALID', 'Missing query response bytes');\n  }\n\n  // Query Proxy commonly returns a 0x-prefixed hex string.\n  if (isValidHexString(bytes)) {\n    return hexToUint8Array(bytes);\n  }\n\n  // Fallback: attempt base64 decoding.\n  try {\n    if (typeof atob === 'function') {\n      const raw = atob(bytes);\n      const arr = new Uint8Array(raw.length);\n      for (let i = 0; i < raw.length; i++) arr[i] = raw.charCodeAt(i);\n      return arr;\n    }\n  } catch {\n    // ignore\n  }\n\n  try {\n    return new Uint8Array(Buffer.from(bytes, 'base64'));\n  } catch (cause) {\n    throw new QueryHubStateError('PROXY_RESPONSE_INVALID', 'Unrecognized query response bytes encoding', cause);\n  }\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withExponentialBackoff<T>(\n  fn: () => Promise<T>,\n  maxAttempts: number\n): Promise<T> {\n  let attempt = 0;\n  let lastError: unknown;\n\n  while (attempt < maxAttempts) {\n    try {\n      return await fn();\n    } catch (err) {\n      lastError = err;\n      attempt += 1;\n      if (attempt >= maxAttempts) break;\n\n      const baseMs = 250;\n      const backoffMs = Math.min(5_000, baseMs * 2 ** (attempt - 1));\n      const jitterMs = Math.floor(Math.random() * 100);\n      await sleep(backoffMs + jitterMs);\n    }\n  }\n\n  throw lastError;\n}\n\nfunction getHubConfig(network: QueryHubStateNetwork): {\n  wormholeChainId: number;\n  hubAddress: string;\n  endpoint: string;\n  rpcUrl: string;\n} {\n  if (network === 'testnet') {\n    const baseSepolia = TESTNET_CHAINS.baseSepolia;\n    if (!baseSepolia?.contracts?.hub) {\n      throw new QueryHubStateError('MISSING_HUB_ADDRESS', 'Missing Base Sepolia hub address in SDK constants');\n    }\n\n    return {\n      wormholeChainId: baseSepolia.wormholeChainId,\n      hubAddress: baseSepolia.contracts.hub,\n      endpoint: WORMHOLE_QUERY_PROXY_URLS.testnet,\n      rpcUrl: baseSepolia.rpcUrl,\n    };\n  }\n\n  if (network === 'mainnet') {\n    const base = MAINNET_CHAINS.base;\n    const hubAddress = (base?.contracts as any)?.hub as string | undefined;\n\n    if (!hubAddress) {\n      throw new QueryHubStateError(\n        'MISSING_HUB_ADDRESS',\n        'Missing mainnet hub address in SDK constants (MAINNET_CHAINS.base.contracts.hub)'\n      );\n    }\n\n    return {\n      wormholeChainId: base.wormholeChainId,\n      hubAddress,\n      endpoint: WORMHOLE_QUERY_PROXY_URLS.mainnet,\n      rpcUrl: base.rpcUrl,\n    };\n  }\n\n  throw new QueryHubStateError('UNSUPPORTED_NETWORK', `Unsupported network: ${network}`);\n}\n\nfunction encodeHubCalls(hubAddress: string, userKeyHash: string): { to: string; data: string }[] {\n  // Support both the spec name and known on-chain variants.\n  const nonceAbiCandidates = [\n    'function getUserNonce(bytes32 userKeyHash) view returns (uint256)',\n    'function userNonces(bytes32 userKeyHash) view returns (uint256)',\n    'function getNonceByHash(bytes32 userKeyHash) view returns (uint256)',\n  ];\n\n  const registeredAbiCandidates = [\n    'function registeredKeys(bytes32 userKeyHash) view returns (bool)',\n    'function isKeyRegisteredByHash(bytes32 userKeyHash) view returns (bool)',\n  ];\n\n  // Issue #9/#10: Add getUserLastActionHash for action-hash binding\n  const actionHashAbiCandidates = [\n    'function getUserLastActionHash(bytes32 userKeyHash) view returns (bytes32)',\n    'function userLastActionHash(bytes32 userKeyHash) view returns (bytes32)',\n  ];\n\n  // We encode *all* candidates; the proxy will execute each call, and we decode the first successful one.\n  // This makes the client resilient to Hub ABI differences across deployments.\n  const iface = new ethers.Interface([\n    ...nonceAbiCandidates,\n    ...registeredAbiCandidates,\n    ...actionHashAbiCandidates,\n  ]);\n\n  const nonceFnNames = ['getUserNonce', 'userNonces', 'getNonceByHash'] as const;\n  const regFnNames = ['registeredKeys', 'isKeyRegisteredByHash'] as const;\n  const actionHashFnNames = ['getUserLastActionHash', 'userLastActionHash'] as const;\n\n  return [\n    ...nonceFnNames.map((fn) => ({\n      to: hubAddress,\n      data: iface.encodeFunctionData(fn, [userKeyHash]),\n    })),\n    ...regFnNames.map((fn) => ({\n      to: hubAddress,\n      data: iface.encodeFunctionData(fn, [userKeyHash]),\n    })),\n    ...actionHashFnNames.map((fn) => ({\n      to: hubAddress,\n      data: iface.encodeFunctionData(fn, [userKeyHash]),\n    })),\n  ];\n}\n\nfunction decodeFirstNonce(results: string[]): bigint {\n  const candidates = [\n    'function getUserNonce(bytes32 userKeyHash) view returns (uint256)',\n    'function userNonces(bytes32 userKeyHash) view returns (uint256)',\n    'function getNonceByHash(bytes32 userKeyHash) view returns (uint256)',\n  ];\n  const iface = new ethers.Interface(candidates);\n  const fnNames = ['getUserNonce', 'userNonces', 'getNonceByHash'] as const;\n\n  for (let idx = 0; idx < fnNames.length; idx++) {\n    const fnName = fnNames[idx];\n    try {\n      const data = results[idx];\n      if (!data || data === '0x') continue;\n      const decoded = iface.decodeFunctionResult(fnName, data);\n      return decoded[0] as bigint;\n    } catch {\n      // keep trying\n    }\n  }\n\n  throw new QueryHubStateError('QUERY_RESPONSE_INVALID', 'Unable to decode user nonce from query response');\n}\n\nfunction decodeFirstIsRegistered(results: string[]): boolean {\n  const nonceCandidateCount = 3;\n  const candidates = [\n    'function registeredKeys(bytes32 userKeyHash) view returns (bool)',\n    'function isKeyRegisteredByHash(bytes32 userKeyHash) view returns (bool)',\n  ];\n  const iface = new ethers.Interface(candidates);\n  const fnNames = ['registeredKeys', 'isKeyRegisteredByHash'] as const;\n\n  for (let i = 0; i < fnNames.length; i++) {\n    const fnName = fnNames[i];\n    try {\n      const data = results[nonceCandidateCount + i];\n      if (!data || data === '0x') continue;\n      const decoded = iface.decodeFunctionResult(fnName, data);\n      return Boolean(decoded[0]);\n    } catch {\n      // keep trying\n    }\n  }\n\n  // If the hub deployment doesn’t support registration, treat as false.\n  return false;\n}\n\n/** * Decode last action hash from query results (Issue #9/#10)\n * Returns zero hash if not available (backwards compatibility)\n */\nfunction decodeLastActionHash(results: string[]): string {\n  const nonceCandidateCount = 3;\n  const registeredCandidateCount = 2;\n  const actionHashOffset = nonceCandidateCount + registeredCandidateCount;\n\n  const candidates = [\n    'function getUserLastActionHash(bytes32 userKeyHash) view returns (bytes32)',\n    'function userLastActionHash(bytes32 userKeyHash) view returns (bytes32)',\n  ];\n  const iface = new ethers.Interface(candidates);\n  const fnNames = ['getUserLastActionHash', 'userLastActionHash'] as const;\n\n  for (let i = 0; i < fnNames.length; i++) {\n    const fnName = fnNames[i];\n    try {\n      const data = results[actionHashOffset + i];\n      if (!data || data === '0x') continue;\n      const decoded = iface.decodeFunctionResult(fnName, data);\n      return decoded[0] as string;\n    } catch {\n      // keep trying\n    }\n  }\n\n  // Backwards compatibility: return zero hash if not available\n  return ethers.ZeroHash;\n}\n\n/** * Fetch Guardian-attested Hub state directly from the Wormhole Query Proxy.\n *\n * Client-side only: this avoids relayer API costs and produces a Guardian-signed proof\n * that can be forwarded to the relayer for on-chain verification/submission.\n */\nexport async function queryHubState(\n  userKeyHash: string,\n  apiKey: string,\n  options?: QueryHubStateOptions\n): Promise<HubStateResult> {\n  if (typeof userKeyHash !== 'string' || userKeyHash.length === 0) {\n    throw new QueryHubStateError('INVALID_ARGUMENT', 'userKeyHash is required');\n  }\n  if (!isValidHexString(userKeyHash) || hexToUint8Array(userKeyHash).length !== 32) {\n    throw new QueryHubStateError('INVALID_ARGUMENT', 'userKeyHash must be a 32-byte hex string');\n  }\n  if (typeof apiKey !== 'string' || apiKey.length === 0) {\n    throw new QueryHubStateError('INVALID_ARGUMENT', 'apiKey is required');\n  }\n\n  const network = resolveNetwork(options);\n  const maxAgeSeconds = options?.maxAge ?? 60;\n  const maxAttempts = options?.maxAttempts ?? 4;\n\n  const { wormholeChainId, hubAddress, endpoint, rpcUrl } = getHubConfig(network);\n\n  const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n  const callData = encodeHubCalls(hubAddress, userKeyHash);\n\n  const doFetch = async () => {\n    try {\n      const latestBlock = await provider.getBlockNumber();\n      const blockTag = Math.max(0, latestBlock - 2);\n\n      const request = new QueryRequest(Date.now() & 0xffffffff, [\n        new PerChainQueryRequest(wormholeChainId, new EthCallQueryRequest(blockTag, callData)),\n      ]);\n\n      // Wormhole Query Proxy expects raw hex WITHOUT 0x prefix\n      const requestHex = Buffer.from(request.serialize()).toString('hex');\n\n      const response = await axios.post(\n        endpoint,\n        { bytes: requestHex },\n        {\n          headers: {\n            'X-API-Key': apiKey,\n            'Content-Type': 'application/json',\n          },\n          timeout: 10_000,\n        }\n      );\n\n      const data = response.data as any;\n      const signatures = data?.signatures as string[] | undefined;\n      const bytes = data?.bytes as string | undefined;\n\n      if (!Array.isArray(signatures) || typeof bytes !== 'string') {\n        throw new QueryHubStateError('PROXY_RESPONSE_INVALID', 'Query Proxy response missing signatures/bytes');\n      }\n\n      const proof = signaturesToProofBytes(signatures);\n      const queryBytes = decodeQueryBytes(bytes);\n      const parsed = QueryResponse.from(queryBytes);\n\n      const perChain = parsed.responses.find((r) => r.chainId === wormholeChainId);\n      if (!perChain) {\n        throw new QueryHubStateError('QUERY_RESPONSE_INVALID', 'Missing per-chain response for hub chain');\n      }\n\n      // The SDK provides a parser for the chain-specific response.\n      const chainResp = EthCallQueryResponse.from(perChain.response.serialize());\n      const blockTime = Number(chainResp.blockTime);\n\n      const nowSeconds = Math.floor(Date.now() / 1000);\n      if (nowSeconds - blockTime > maxAgeSeconds) {\n        throw new QueryHubStateError(\n          'ATTESTATION_STALE',\n          `Guardian attestation is stale (blockTime=${blockTime}, now=${nowSeconds}, maxAge=${maxAgeSeconds}s)`\n        );\n      }\n\n      const nonce = decodeFirstNonce(chainResp.results);\n      const isRegistered = decodeFirstIsRegistered(chainResp.results);\n      const lastActionHash = decodeLastActionHash(chainResp.results);\n\n      return {\n        nonce,\n        isRegistered,\n        blockTime,\n        proof,\n        lastActionHash,\n      } satisfies HubStateResult;\n    } catch (err) {\n      if (err instanceof QueryHubStateError) throw err;\n      if (axios.isAxiosError(err)) {\n        const ax = err as AxiosError;\n        const status = ax.response?.status;\n        const statusText = ax.response?.statusText;\n        const details = typeof ax.response?.data === 'string' ? ax.response?.data : undefined;\n\n        throw new QueryHubStateError(\n          'PROXY_HTTP_ERROR',\n          `Query Proxy request failed${status ? ` (${status} ${statusText ?? ''})` : ''}${details ? `: ${details}` : ''}`,\n          err\n        );\n      }\n\n      throw new QueryHubStateError('PROXY_HTTP_ERROR', 'Query Proxy request failed', err);\n    }\n  };\n\n  return await withExponentialBackoff(doFetch, maxAttempts);\n}\n"],"mappings":"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","names":[]}