{"version":3,"file":"json-rpc-client-BiAmg_ho.cjs","sources":["../src/tbv/core/clients/vault-provider/types.ts","../src/tbv/core/clients/vault-provider/json-rpc-client.ts"],"sourcesContent":["/**\n * Type definitions for Vault Provider JSON-RPC API.\n *\n * These types match the `vaultProvider_*` RPC namespace defined by the\n * btc-vault daemon. They are the SDK's canonical copy of the VP protocol\n * contract, independent of any frontend framework.\n *\n * @see https://github.com/babylonlabs-io/btc-vault/blob/main/docs/pegin.md\n */\n\n// ============================================================================\n// Daemon Status\n// ============================================================================\n\n/**\n * Backend daemon status (vault provider database).\n * Source: btc-vault crates/vaultd/src/workers/claimer/mod.rs PegInStatus enum\n *\n * State flow (happy path):\n * PendingIngestion -> PendingDepositorWotsPK -> PendingBabeSetup -> PendingChallengerPresigning\n *   -> PendingPeginSigsAvailability -> PendingPrePegInConfirmations\n *   -> PendingDepositorSignatures -> PendingACKs -> PendingActivation\n *   -> ActivatedPendingBroadcast -> Activated\n *\n * Branching / terminal states:\n * - IngestionRejected: terminal — ingestion permanently failed (e.g. malformed\n *   Pre-PegIn, invalid HTLC outputs); reachable directly from PendingIngestion.\n * - Expired: activation timed out; non-terminal during the grace window\n *   (RFC 003) — transitions to ExpiredCleanedUp or ExpiredInClaim.\n * - InvalidSigInContract: terminal — pegin input signature posted on\n *   chain failed verification.\n * - AmlRejected: terminal — AML address screening rejected the pegin.\n * - ExpiredCleanedUp: terminal — grace window expired, per-pegin\n *   artifacts deleted.\n * - ExpiredInClaim: terminal at the pegin-state-machine level; pegout-side\n *   work continues on the pegout_tracking row.\n */\nexport enum DaemonStatus {\n  PENDING_INGESTION = \"PendingIngestion\",\n  PENDING_DEPOSITOR_WOTS_PK = \"PendingDepositorWotsPK\",\n  PENDING_BABE_SETUP = \"PendingBabeSetup\",\n  PENDING_CHALLENGER_PRESIGNING = \"PendingChallengerPresigning\",\n  PENDING_PEGIN_SIGS_AVAILABILITY = \"PendingPeginSigsAvailability\",\n  PENDING_PRE_PEGIN_CONFIRMATIONS = \"PendingPrePegInConfirmations\",\n  PENDING_DEPOSITOR_SIGNATURES = \"PendingDepositorSignatures\",\n  PENDING_ACKS = \"PendingACKs\",\n  PENDING_ACTIVATION = \"PendingActivation\",\n  ACTIVATED_PENDING_BROADCAST = \"ActivatedPendingBroadcast\",\n  ACTIVATED = \"Activated\",\n  EXPIRED = \"Expired\",\n  INGESTION_REJECTED = \"IngestionRejected\",\n  INVALID_SIG_IN_CONTRACT = \"InvalidSigInContract\",\n  AML_REJECTED = \"AmlRejected\",\n  EXPIRED_CLEANED_UP = \"ExpiredCleanedUp\",\n  EXPIRED_IN_CLAIM = \"ExpiredInClaim\",\n}\n\n// ============================================================================\n// Status Groups\n// ============================================================================\n\n/**\n * States where the VP is still processing (no depositor action needed).\n * Excludes PENDING_DEPOSITOR_WOTS_PK (requires depositor action).\n */\nexport const PRE_DEPOSITOR_SIGNATURES_STATES: readonly DaemonStatus[] = [\n  DaemonStatus.PENDING_INGESTION,\n  DaemonStatus.PENDING_BABE_SETUP,\n  DaemonStatus.PENDING_CHALLENGER_PRESIGNING,\n  DaemonStatus.PENDING_PEGIN_SIGS_AVAILABILITY,\n  DaemonStatus.PENDING_PRE_PEGIN_CONFIRMATIONS,\n];\n\n/** States after PendingDepositorSignatures where the depositor has no action. */\nconst POST_PAYOUT_SIGNATURE_STATUSES: readonly DaemonStatus[] = [\n  DaemonStatus.PENDING_ACKS,\n  DaemonStatus.PENDING_ACTIVATION,\n  DaemonStatus.ACTIVATED_PENDING_BROADCAST,\n  DaemonStatus.ACTIVATED,\n];\n\n/**\n * Statuses where no depositor action is needed (VP processing or already past\n * depositor interaction). Excludes PENDING_INGESTION and PENDING_DEPOSITOR_WOTS_PK.\n */\nexport const VP_TRANSIENT_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n  DaemonStatus.PENDING_BABE_SETUP,\n  DaemonStatus.PENDING_CHALLENGER_PRESIGNING,\n  DaemonStatus.PENDING_PEGIN_SIGS_AVAILABILITY,\n  DaemonStatus.PENDING_PRE_PEGIN_CONFIRMATIONS,\n  ...POST_PAYOUT_SIGNATURE_STATUSES,\n]);\n\n/**\n * Terminal VP statuses that represent failure outcomes — polling should\n * stop immediately with an error rather than wait for timeout.\n *\n * Mirrors the failure subset of the server-side terminals\n * (`allowed_transitions()` empty, see\n * `btc-vault/crates/vaultd/src/workers/claimer/mod.rs:230-242`).\n * `Activated` IS terminal on-chain but is the success outcome, so it is\n * intentionally excluded — a caller polling for an earlier state that\n * races straight to `Activated` should treat that as success-via-overshoot,\n * not failure. `Expired` is also excluded — under RFC 003 it is a\n * grace-window interim that transitions to `ExpiredCleanedUp` or\n * `ExpiredInClaim`. Callers that want to stop polling on any expiry\n * should check `status === DaemonStatus.EXPIRED ||\n * VP_TERMINAL_FAILURE_STATUSES.has(status)`.\n */\nexport const VP_TERMINAL_FAILURE_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n  DaemonStatus.INGESTION_REJECTED,\n  DaemonStatus.INVALID_SIG_IN_CONTRACT,\n  DaemonStatus.AML_REJECTED,\n  DaemonStatus.EXPIRED_CLEANED_UP,\n  DaemonStatus.EXPIRED_IN_CLAIM,\n]);\n\n/**\n * Statuses that come after WOTS key submission.\n * If the VP is already in one of these states, the WOTS key was already\n * submitted and we can skip.\n */\nexport const POST_WOTS_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n  ...VP_TRANSIENT_STATUSES,\n  DaemonStatus.PENDING_DEPOSITOR_SIGNATURES,\n]);\n\n// ============================================================================\n// WOTS Types (needed by SubmitDepositorWotsKeyParams)\n// ============================================================================\n\n/**\n * WOTS configuration for a single block.\n * Matches Rust `babe::wots::Config` serde format.\n */\nexport interface WotsConfig {\n  /** Digit bit-width (e.g. 4 → base-16 digits). */\n  d: number;\n  /** Number of message digits in this block. */\n  n: number;\n  /** Radix used for the checksum computation. */\n  checksum_radix: number;\n}\n\n/**\n * A single block of WOTS public keys.\n * Chain values are arrays of byte values (matching Rust `[u8; 20]`).\n */\nexport interface WotsBlockPublicKey {\n  config: WotsConfig;\n  message_terminals: number[][];\n  checksum_major_terminal: number[];\n  checksum_minor_terminal: number[];\n}\n\n// ============================================================================\n// Request Parameter Types\n// ============================================================================\n\n/** Params for requesting the payout/claim/assert transactions to pre-sign. */\nexport interface RequestDepositorPresignTransactionsParams {\n  pegin_txid: string;\n  depositor_pk: string;\n}\n\n/** Params for submitting the depositor's WOTS public key to the VP. */\nexport interface SubmitDepositorWotsKeyParams {\n  pegin_txid: string;\n  depositor_pk: string;\n  wots_public_keys: WotsBlockPublicKey[];\n}\n\n/** Per-challenger signatures for the depositor-as-claimer flow. */\nexport interface DepositorPreSigsPerChallenger {\n  nopayout_signature: string;\n}\n\n/** Depositor-as-claimer pre-signatures (payout + per-challenger). */\nexport interface DepositorAsClaimerPresignatures {\n  payout_signatures: ClaimerSignatures;\n  per_challenger: Record<string, DepositorPreSigsPerChallenger>;\n}\n\n/** Params for submitting depositor pre-signatures including claimer presignatures. */\nexport interface SubmitDepositorPresignaturesParams {\n  pegin_txid: string;\n  depositor_pk: string;\n  signatures: Record<string, ClaimerSignatures>;\n  depositor_claimer_presignatures: DepositorAsClaimerPresignatures;\n}\n\n/** Payout signatures per claimer. */\nexport interface ClaimerSignatures {\n  payout_signature: string;\n}\n\n/** Params for requesting BaBe DecryptorArtifacts from the VP. */\nexport interface RequestDepositorClaimerArtifactsParams {\n  pegin_txid: string;\n  depositor_pk: string;\n}\n\n/** Params for querying pegin status. Either pegin_txid or vault_id must be provided. */\nexport type GetPeginStatusParams =\n  | { pegin_txid: string; vault_id?: never }\n  | { vault_id: string; pegin_txid?: never };\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/** A raw Bitcoin transaction with its hex encoding. */\nexport interface TransactionData {\n  tx_hex: string;\n}\n\n/** Set of transactions the depositor must pre-sign for a single claimer. */\nexport interface ClaimerTransactions {\n  claimer_pubkey: string;\n  claim_tx: TransactionData;\n  assert_tx: TransactionData;\n  payout_tx: TransactionData;\n  payout_psbt: string;\n}\n\n/** Per-segment connector data for ChallengeAssert inputs. */\nexport interface ChallengeAssertConnectorData {\n  wots_pks_json: string;\n  gc_wots_keys_json: string;\n}\n\n/** Challenger-specific transactions and signing data for the depositor graph. */\nexport interface PresignDataPerChallenger {\n  challenger_pubkey: string;\n  challenge_assert_x_tx: TransactionData;\n  challenge_assert_y_tx: TransactionData;\n  nopayout_tx: TransactionData;\n  nopayout_psbt: string;\n  challenge_assert_connectors: ChallengeAssertConnectorData[];\n  output_label_hashes: string[];\n}\n\n/** Depositor-as-claimer TxGraph transactions. */\nexport interface DepositorGraphTransactions {\n  claim_tx: TransactionData;\n  assert_tx: TransactionData;\n  payout_tx: TransactionData;\n  payout_psbt: string;\n  challenger_presign_data: PresignDataPerChallenger[];\n  offchain_params_version: number;\n}\n\n/** Response from `requestDepositorPresignTransactions`. */\nexport interface RequestDepositorPresignTransactionsResponse {\n  txs: ClaimerTransactions[];\n  depositor_graph: DepositorGraphTransactions;\n}\n\n/** BaBe garbled-circuit session data for a single challenger. */\nexport interface BaBeSessionData {\n  decryptor_artifacts_hex: string;\n}\n\n/** Response from `requestDepositorClaimerArtifacts`. */\nexport interface RequestDepositorClaimerArtifactsResponse {\n  tx_graph_json: string;\n  verifying_key_hex: string;\n  babe_sessions: Record<string, BaBeSessionData>;\n}\n\n/** Progress tracker for a multi-challenger operation. */\nexport interface ChallengerProgress {\n  total_challengers: number;\n  completed_challengers: number;\n  completed_challenger_pubkeys: string[];\n  pending_challenger_pubkeys: string[];\n}\n\nexport type GcDataProgress = ChallengerProgress;\nexport type AckCollectionProgress = ChallengerProgress;\n\n/** Extended presigning progress with all 3 concurrent phases. */\nexport interface PresigningProgress extends ChallengerProgress {\n  depositor_graph_created?: boolean;\n  vk_challenger_presigning_completed?: number;\n  vk_challenger_presigning_total?: number;\n}\n\n/** Detailed progress breakdown for an in-progress pegin. */\nexport interface PeginProgressDetails {\n  gc_data?: GcDataProgress;\n  presigning?: PresigningProgress;\n  ack_collection?: AckCollectionProgress;\n  claimer_graphs?: ClaimerGraphStatus[];\n}\n\n/** Per-claimer graph status (challenger perspective). */\nexport interface ClaimerGraphStatus {\n  claimer_pubkey: string;\n  presigned: boolean;\n}\n\n/** Response from `getPeginStatus`. */\nexport interface GetPeginStatusResponse {\n  pegin_txid: string;\n  status: string;\n  progress: PeginProgressDetails;\n  health_info: string;\n  last_error?: string;\n}\n\n// ============================================================================\n// Pegout Types\n// ============================================================================\n\n/**\n * Claimer-side pegout progress.\n * Source: btc-vault crates/vaultd/src/rpc/server/pegout_status.rs ClaimerPegoutStatus.\n */\nexport interface ClaimerPegoutStatus {\n  /** Wire string from PegoutStatus enum. */\n  status: string;\n  failed: boolean;\n  claim_txid: string;\n  claimer_pubkey: string;\n  assert_txid: string;\n  /** Unix epoch seconds. */\n  created_at: number;\n  /** Unix epoch seconds. */\n  updated_at: number;\n}\n\n/**\n * Challenger-side pegout progress.\n * Source: btc-vault crates/vaultd/src/rpc/server/pegout_status.rs ChallengerStatus.\n */\nexport interface ChallengerStatus {\n  status: string;\n  claim_txid: string;\n  claimer_pubkey: string;\n  assert_txid: string | null;\n  challenge_assert_x_txid: string | null;\n  challenge_assert_y_txid: string | null;\n  nopayout_txid: string | null;\n  created_at: number;\n  updated_at: number;\n}\n\n/**\n * Pegout status response. Embedded by `batchGetPegoutStatus` per-result\n * envelopes. Mirrors btc-vault `GetPegoutStatusResponse`.\n */\nexport interface GetPegoutStatusResponse {\n  pegin_txid: string;\n  found: boolean;\n  claimer: ClaimerPegoutStatus | null;\n  challengers: ChallengerStatus[];\n}\n\n// ============================================================================\n// Batch Status Types (peginStatus + pegoutStatus)\n// ============================================================================\n\n/** Params for `batchGetPeginStatus`. */\nexport interface BatchGetPeginStatusParams {\n  /** Up to MAX_BATCH_SIZE (50) txids per call. */\n  pegin_txids: string[];\n}\n\n/** Per-pegin entry in a `batchGetPeginStatus` response. */\nexport interface BatchPeginStatusResult {\n  pegin_txid: string;\n  result: GetPeginStatusResponse | null;\n  error: string | null;\n}\n\n/** Response from `batchGetPeginStatus`. Results are returned in request order. */\nexport interface BatchGetPeginStatusResponse {\n  results: BatchPeginStatusResult[];\n}\n\n/** Params for `batchGetPegoutStatus`. */\nexport interface BatchGetPegoutStatusParams {\n  pegin_txids: string[];\n}\n\n/** Per-vault entry in a `batchGetPegoutStatus` response. */\nexport interface BatchPegoutStatusResult {\n  pegin_txid: string;\n  result: GetPegoutStatusResponse | null;\n  error: string | null;\n}\n\n/** Response from `batchGetPegoutStatus`. Results are returned in request order. */\nexport interface BatchGetPegoutStatusResponse {\n  results: BatchPegoutStatusResult[];\n}\n\n/**\n * Maximum number of items per batch call. Mirrors the server-side\n * `MAX_BATCH_SIZE` in btc-vault (`crates/vaultd/src/rpc/server/vault_provider.rs:7`).\n * Callers must chunk requests larger than this.\n */\nexport const VP_BATCH_MAX_SIZE = 50;\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\n/**\n * JSON-RPC error codes returned by the vault provider.\n * Source: btc-vault `crates/vaultd/src/rpc/error.rs::RpcError::error_code`.\n */\nexport enum RpcErrorCode {\n  PEGIN_NOT_FOUND = 4001,\n}\n","/**\n * Generic JSON-RPC 2.0 HTTP Client\n *\n * Framework-agnostic client using `fetch()` — works in browsers and Node.js 18+.\n * Includes configurable retry policy and AbortSignal passthrough.\n */\n\nexport interface JsonRpcRequest<T = unknown> {\n  jsonrpc: \"2.0\";\n  method: string;\n  params: T;\n  id: number | string;\n}\n\nexport interface JsonRpcSuccessResponse<T = unknown> {\n  jsonrpc: \"2.0\";\n  result: T;\n  id: number | string;\n}\n\nexport interface JsonRpcErrorResponse {\n  jsonrpc: \"2.0\";\n  error: {\n    code: number;\n    message: string;\n    data?: unknown;\n  };\n  id: number | string;\n}\n\nexport type JsonRpcResponse<T = unknown> =\n  | JsonRpcSuccessResponse<T>\n  | JsonRpcErrorResponse;\n\n/**\n * Injects bearer tokens into requests for auth-gated methods, and is\n * notified when the server rejects a bearer so it can invalidate its cache.\n *\n * The `JsonRpcClient` is agnostic to which methods are auth-gated —\n * the provider's `getToken(method)` decides. Returning `null` means\n * \"no auth required for this method\"; the client then sends the\n * request with no `Authorization` header.\n */\nexport interface BearerTokenProvider {\n  /**\n   * Return the bearer token to inject for `method`, or `null` if the\n   * method does not require auth.\n   */\n  getToken(method: string): Promise<string | null>;\n  /**\n   * Drop the cached token. Next call to `getToken` must re-acquire.\n   * Called by the client on reactive-refresh-trigger responses.\n   */\n  invalidate(): void;\n}\n\nexport interface JsonRpcClientConfig {\n  /** Base URL of the RPC service */\n  baseUrl: string;\n  /** Timeout in milliseconds per request attempt */\n  timeout: number;\n  /** Optional custom headers */\n  headers?: Record<string, string>;\n  /** Number of retry attempts for transient errors (default: 3) */\n  retries?: number;\n  /** Initial retry delay in milliseconds (default: 1000) */\n  retryDelay?: number;\n  /**\n   * Maximum response body size, in bytes, for typed JSON-RPC calls.\n   * `callRaw` intentionally returns the unparsed Response and is not capped here.\n   * Default: 2 MiB.\n   */\n  maxResponseBytes?: number;\n  /**\n   * Predicate that decides which methods retry on transient errors.\n   * Default retries only `getPeginStatus`, `batchGetPeginStatus`,\n   * `batchGetPegoutStatus`, and `requestDepositorPresignTransactions`.\n   * Write methods are not retried by default.\n   */\n  retryableFor?: (method: string) => boolean;\n  /**\n   * Per-request bearer-token source. A non-null return attaches\n   * `Authorization: Bearer <token>`; `null` skips auth. `call`\n   * additionally retries once when the server rejects the bearer\n   * (invalidate + refetch + retry) — see {@link isAuthRejectedError}.\n   * `callRaw` skips reactive refresh.\n   */\n  tokenProvider?: BearerTokenProvider;\n}\n\n// \"wire\" = parsed from a JSON-RPC error envelope; \"local\" = timeout/network/parse failure.\nexport type JsonRpcErrorSource = \"wire\" | \"local\";\n\nexport class JsonRpcError extends Error {\n  constructor(\n    public code: number,\n    message: string,\n    /** \"wire\" for server-returned envelopes; \"local\" for SDK-side failures. */\n    public source: JsonRpcErrorSource = \"local\",\n    /** Structured data from the server `error.data` field, if any. */\n    public data?: unknown,\n  ) {\n    super(message);\n    this.name = \"JsonRpcError\";\n  }\n}\n\nexport const JSON_RPC_ERROR_CODES = {\n  TIMEOUT: -32000,\n  NETWORK: -32001,\n  /** VP proxy: request timed out at proxy level */\n  PROXY_TIMEOUT: -32002,\n  /** VP proxy: VP unreachable / DNS failure / response too large */\n  PROXY_UNAVAILABLE: -32003,\n  /** SDK client: response missing \"result\" field (malformed JSON-RPC) */\n  INVALID_RESPONSE: -32700,\n  /** SDK client: response body exceeded the configured byte limit */\n  RESPONSE_TOO_LARGE: -32701,\n} as const;\n\n/** JSON-RPC protocol version */\nconst JSON_RPC_VERSION = \"2.0\" as const;\n\n/** Default number of retry attempts for transient errors */\nconst DEFAULT_RETRY_ATTEMPTS = 3;\n\n/** Default initial retry delay in milliseconds */\nconst DEFAULT_RETRY_DELAY_MS = 1000;\n\n/** Default maximum JSON-RPC response size for typed calls (2 MiB) */\nconst DEFAULT_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;\n\n/**\n * TODO: Temporary typed-call exceptions for methods that currently return large\n * artifact payloads as JSON-RPC results.\n */\nconst UNCAPPED_TYPED_RESPONSE_METHODS: ReadonlySet<string> = new Set([\n  \"vaultProvider_requestDepositorClaimerArtifacts\",\n]);\n\n/** HTTP status codes that indicate transient server errors and are safe to retry */\nconst RETRYABLE_HTTP_STATUS_CODES: ReadonlySet<number> = new Set([\n  408, // Request Timeout\n  429, // Too Many Requests\n  500, // Internal Server Error\n  502, // Bad Gateway\n  503, // Service Unavailable\n  504, // Gateway Timeout\n]);\n\n/** Default retry predicate: only retry read-only / idempotent methods */\nconst DEFAULT_RETRYABLE_METHODS: ReadonlySet<string> = new Set([\n  \"vaultProvider_getPeginStatus\",\n  \"vaultProvider_batchGetPeginStatus\",\n  \"vaultProvider_batchGetPegoutStatus\",\n  \"vaultProvider_requestDepositorPresignTransactions\",\n]);\n\nfunction defaultRetryableFor(method: string): boolean {\n  return DEFAULT_RETRYABLE_METHODS.has(method);\n}\n\n/**\n * JSON-RPC error code the vault provider returns for every bearer-token\n * rejection: expired, not-yet-valid, missing bearer, invalid signature,\n * invalid claims, invalid structure, subject mismatch, issuer mismatch.\n * All eight variants collapse onto this one code, distinguished only by\n * message text — see btc-vault `crates/btc-auth/src/rpc.rs`\n * (`auth_error_to_rpc_error`). Operationally they all mean the same\n * thing: this bearer is dead, mint a new one.\n *\n * Numerically equal to {@link JSON_RPC_ERROR_CODES.NETWORK}, which this\n * client throws for local network failures. `source` is what separates\n * them — see {@link isAuthRejectedError}.\n */\nexport const AUTH_REJECTED_RPC_CODE = -32001;\n\n/**\n * True when `error` is the vault provider rejecting our bearer token.\n *\n * Classified on the error code, which is the only thing the server\n * guarantees: its auth errors carry `data: null` unconditionally\n * (`rpc_error` passes `None::<()>`), so any predicate keyed on an\n * `error.data` field can never match a real response.\n *\n * `source === \"wire\"` is load-bearing: this client reuses -32001\n * internally as {@link JSON_RPC_ERROR_CODES.NETWORK}, always with\n * source \"local\".\n *\n * Known, bounded collision: the vault-provider proxy reuses -32001 for\n * \"Provider not found\". A call to a deregistered provider therefore\n * costs one wasted token-mint round-trip, which fails against the same\n * registry check and surfaces the same message.\n */\nexport function isAuthRejectedError(error: unknown): boolean {\n  return (\n    error instanceof JsonRpcError &&\n    error.source === \"wire\" &&\n    error.code === AUTH_REJECTED_RPC_CODE\n  );\n}\n\n/**\n * Per-`call` record of whether a bearer was actually attached to the\n * request. Scoped to one `call` (not client state) so concurrent\n * requests can't observe each other's auth state.\n */\ninterface AttemptAuthState {\n  bearerAttached: boolean;\n}\n\n/**\n * Generic JSON-RPC 2.0 HTTP client with safe retry policy.\n */\nexport class JsonRpcClient {\n  private baseUrl: string;\n  private timeout: number;\n  private headers: Record<string, string>;\n  private requestId = 0;\n  private retries: number;\n  private retryDelay: number;\n  private maxResponseBytes: number;\n  private retryableFor: (method: string) => boolean;\n  private tokenProvider?: BearerTokenProvider;\n\n  constructor(config: JsonRpcClientConfig) {\n    this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n    this.timeout = config.timeout;\n    this.headers = {\n      \"Content-Type\": \"application/json\",\n      ...config.headers,\n    };\n    this.retries = config.retries ?? DEFAULT_RETRY_ATTEMPTS;\n    this.retryDelay = config.retryDelay ?? DEFAULT_RETRY_DELAY_MS;\n    this.maxResponseBytes =\n      config.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES;\n    if (!Number.isFinite(this.maxResponseBytes) || this.maxResponseBytes <= 0) {\n      throw new Error(\"maxResponseBytes must be a positive finite number\");\n    }\n    this.retryableFor = config.retryableFor ?? defaultRetryableFor;\n    this.tokenProvider = config.tokenProvider;\n  }\n\n  private async buildHeaders(\n    method: string,\n    authState?: AttemptAuthState,\n  ): Promise<Record<string, string>> {\n    const headers: Record<string, string> = { ...this.headers };\n    if (this.tokenProvider) {\n      const token = await this.tokenProvider.getToken(method);\n      if (token) {\n        headers.Authorization = `Bearer ${token}`;\n        if (authState) authState.bearerAttached = true;\n      }\n    }\n    return headers;\n  }\n\n  /**\n   * Make a JSON-RPC request with optional retry for safe methods.\n   *\n   * If the server rejects the bearer token and a `tokenProvider` is\n   * configured, the client invalidates its cached token and retries the\n   * request once with a freshly-acquired bearer.\n   *\n   * @param method - The RPC method name\n   * @param params - The method parameters\n   * @param signal - Optional AbortSignal for caller-controlled cancellation\n   * @returns The result from the RPC method\n   * @throws JsonRpcError if the RPC call fails\n   */\n  async call<TParams, TResult>(\n    method: string,\n    params: TParams,\n    signal?: AbortSignal,\n  ): Promise<TResult> {\n    const authState: AttemptAuthState = { bearerAttached: false };\n    try {\n      return await this.callOnce<TParams, TResult>(\n        method,\n        params,\n        signal,\n        authState,\n      );\n    } catch (error) {\n      // The re-auth retry fires for ALL methods, including mutating ones.\n      // This is intentional and safe: the server's auth middleware rejects\n      // the request BEFORE dispatching to the method handler, so a\n      // rejected bearer means the handler never ran and no state was\n      // mutated. Confirmed against btc-vault\n      // `crates/btc-auth/src/middleware/jsonrpc.rs` — `unauthorized_response`\n      // returns without ever calling `service.call(req)`, in both `call`\n      // and `batch`. The `retryableFor` guard on HTTP-transient-error\n      // retries doesn't apply here because that guard is about retrying\n      // after a request the server may have started processing.\n      //\n      // `bearerAttached` keeps this off methods that sent no token — most\n      // importantly the token-issuing calls themselves, which would\n      // otherwise burn a round-trip re-minting against the proxy's\n      // colliding -32001 \"Provider not found\".\n      //\n      // Bounded to one retry: the retried call is not wrapped in this\n      // handler. If the freshly-minted token is rejected too, the problem\n      // is the pinned server key rather than the token, and that surfaces\n      // instead of looping.\n      if (\n        this.tokenProvider &&\n        authState.bearerAttached &&\n        isAuthRejectedError(error)\n      ) {\n        this.tokenProvider.invalidate();\n        return await this.callOnce<TParams, TResult>(method, params, signal);\n      }\n      throw error;\n    }\n  }\n\n  private async callOnce<TParams, TResult>(\n    method: string,\n    params: TParams,\n    signal: AbortSignal | undefined,\n    authState?: AttemptAuthState,\n  ): Promise<TResult> {\n    const response = await this.fetchWithRetry(\n      method,\n      params,\n      signal,\n      authState,\n    );\n\n    let jsonResponse: unknown;\n    try {\n      const responseText = UNCAPPED_TYPED_RESPONSE_METHODS.has(method)\n        ? await response.text()\n        : await readResponseTextWithLimit(response, this.maxResponseBytes);\n      jsonResponse = JSON.parse(responseText);\n    } catch (error) {\n      if (error instanceof JsonRpcError) {\n        throw error;\n      }\n      throw new JsonRpcError(\n        JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n        \"Invalid JSON-RPC response: body is not valid JSON\",\n        \"local\",\n      );\n    }\n\n    if (\n      jsonResponse === null ||\n      typeof jsonResponse !== \"object\" ||\n      Array.isArray(jsonResponse)\n    ) {\n      throw new JsonRpcError(\n        JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n        `Invalid JSON-RPC response: expected an object, got ${typeof jsonResponse}`,\n        \"local\",\n      );\n    }\n\n    const rpcResponse = jsonResponse as Record<string, unknown>;\n\n    if (\"error\" in rpcResponse && rpcResponse.error != null) {\n      const err = rpcResponse.error as {\n        code?: number;\n        message?: string;\n        data?: unknown;\n      };\n      throw new JsonRpcError(\n        err.code ?? JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n        err.message ?? \"Unknown RPC error\",\n        \"wire\",\n        err.data,\n      );\n    }\n\n    if (!(\"result\" in rpcResponse)) {\n      throw new JsonRpcError(\n        JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n        `Invalid JSON-RPC response: missing \"result\" field`,\n        \"local\",\n      );\n    }\n\n    return rpcResponse.result as TResult;\n  }\n\n  /**\n   * Make a JSON-RPC request returning the raw Response (unparsed body).\n   *\n   * Bearer tokens are injected identically to `call`. **Reactive refresh\n   * is NOT performed here** — the response body may be unbounded (e.g.\n   * claimer-artifact downloads), so the client refuses to parse it to\n   * detect auth errors. Callers relying on token-expired retries for\n   * large downloads must read the body themselves and re-invoke\n   * `callRaw` after `tokenProvider.invalidate()`.\n   */\n  async callRaw<TParams>(\n    method: string,\n    params: TParams,\n    signal?: AbortSignal,\n  ): Promise<Response> {\n    return this.fetchWithRetry(method, params, signal);\n  }\n\n  private async fetchWithRetry<TParams>(\n    method: string,\n    params: TParams,\n    callerSignal?: AbortSignal,\n    authState?: AttemptAuthState,\n  ): Promise<Response> {\n    const requestId = ++this.requestId;\n    const maxRetries = this.retryableFor(method) ? this.retries : 0;\n\n    // jsonrpsee (Rust backend) expects params as an array (positional parameters)\n    const request: JsonRpcRequest<TParams[]> = {\n      jsonrpc: JSON_RPC_VERSION,\n      method,\n      params: [params],\n      id: requestId,\n    };\n\n    const body = JSON.stringify(request);\n    let lastError: Error | null = null;\n\n    for (let attempt = 0; attempt <= maxRetries; attempt++) {\n      // Merge caller signal with per-request timeout signal\n      const timeoutController = new AbortController();\n      const timeoutId = setTimeout(\n        () => timeoutController.abort(),\n        this.timeout,\n      );\n\n      const merged = callerSignal\n        ? mergeAbortSignals(callerSignal, timeoutController.signal)\n        : null;\n      const signal = merged ? merged.signal : timeoutController.signal;\n\n      try {\n        // Build headers per-attempt so the token provider can return a\n        // freshly-acquired bearer after a prior invalidate() on this\n        // request (retry loop path) without plumbing state through.\n        const headers = await this.buildHeaders(method, authState);\n\n        const response = await fetch(this.baseUrl, {\n          method: \"POST\",\n          headers,\n          body,\n          signal,\n        });\n\n        clearTimeout(timeoutId);\n        merged?.cleanup();\n\n        if (!response.ok) {\n          const shouldRetry =\n            attempt < maxRetries &&\n            RETRYABLE_HTTP_STATUS_CODES.has(response.status);\n\n          if (shouldRetry) {\n            const delay = this.retryDelay * Math.pow(2, attempt);\n            await this.sleep(delay, callerSignal);\n            continue;\n          }\n\n          throw new Error(\n            `HTTP error: ${response.status} ${response.statusText}`,\n          );\n        }\n\n        return response;\n      } catch (error) {\n        clearTimeout(timeoutId);\n        merged?.cleanup();\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        // Check if caller aborted (not our timeout)\n        if (callerSignal?.aborted) {\n          throw new Error(\"Request aborted\");\n        }\n\n        if (error instanceof Error && error.name === \"AbortError\") {\n          if (attempt < maxRetries) {\n            const delay = this.retryDelay * Math.pow(2, attempt);\n            await this.sleep(delay, callerSignal);\n            continue;\n          }\n          throw new JsonRpcError(\n            JSON_RPC_ERROR_CODES.TIMEOUT,\n            `Request timeout after ${this.timeout}ms (${maxRetries + 1} attempts)`,\n            \"local\",\n          );\n        }\n\n        // Handle network errors (CORS, connection refused, etc.)\n        if (error instanceof TypeError) {\n          if (attempt < maxRetries) {\n            const delay = this.retryDelay * Math.pow(2, attempt);\n            await this.sleep(delay, callerSignal);\n            continue;\n          }\n          throw new JsonRpcError(\n            JSON_RPC_ERROR_CODES.NETWORK,\n            `Network error: ${error.message} (${maxRetries + 1} attempts)`,\n            \"local\",\n          );\n        }\n\n        // Don't retry JSON-RPC errors (business logic errors)\n        throw error;\n      }\n    }\n\n    throw lastError || new Error(\"Unknown error after retries\");\n  }\n\n  private sleep(ms: number, signal?: AbortSignal): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (signal?.aborted) {\n        reject(new Error(\"Request aborted\"));\n        return;\n      }\n      const timeoutId = setTimeout(() => {\n        signal?.removeEventListener(\"abort\", onAbort);\n        resolve();\n      }, ms);\n      const onAbort = () => {\n        clearTimeout(timeoutId);\n        reject(new Error(\"Request aborted\"));\n      };\n      signal?.addEventListener(\"abort\", onAbort, { once: true });\n    });\n  }\n\n  getBaseUrl(): string {\n    return this.baseUrl;\n  }\n}\n\ninterface MergedSignal {\n  signal: AbortSignal;\n  /** Remove listeners from the source signals. Call after the request completes. */\n  cleanup: () => void;\n}\n\n/**\n * Merge two AbortSignals — the returned signal aborts if either input aborts.\n * Returns a cleanup function to remove listeners when the request completes\n * normally, preventing listener accumulation in long-lived polling flows.\n */\nfunction mergeAbortSignals(a: AbortSignal, b: AbortSignal): MergedSignal {\n  if (a.aborted) return { signal: a, cleanup: () => {} };\n  if (b.aborted) return { signal: b, cleanup: () => {} };\n\n  const controller = new AbortController();\n  const onAbortA = () => {\n    b.removeEventListener(\"abort\", onAbortB);\n    controller.abort();\n  };\n  const onAbortB = () => {\n    a.removeEventListener(\"abort\", onAbortA);\n    controller.abort();\n  };\n  a.addEventListener(\"abort\", onAbortA, { once: true });\n  b.addEventListener(\"abort\", onAbortB, { once: true });\n\n  const cleanup = () => {\n    a.removeEventListener(\"abort\", onAbortA);\n    b.removeEventListener(\"abort\", onAbortB);\n  };\n\n  return { signal: controller.signal, cleanup };\n}\n\nasync function readResponseTextWithLimit(\n  response: Response,\n  maxBytes: number,\n): Promise<string> {\n  const contentLength = response.headers.get(\"content-length\");\n  if (contentLength !== null) {\n    const parsedContentLength = Number(contentLength);\n    if (\n      Number.isFinite(parsedContentLength) &&\n      parsedContentLength > maxBytes\n    ) {\n      throw responseTooLargeError(maxBytes);\n    }\n  }\n\n  if (!response.body) {\n    return \"\";\n  }\n\n  const reader = response.body.getReader();\n  const decoder = new TextDecoder();\n  let totalBytes = 0;\n  let responseText = \"\";\n\n  try {\n    for (;;) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      if (!value) continue;\n\n      totalBytes += value.byteLength;\n      if (totalBytes > maxBytes) {\n        await reader.cancel();\n        throw responseTooLargeError(maxBytes);\n      }\n      responseText += decoder.decode(value, { stream: true });\n    }\n  } finally {\n    reader.releaseLock();\n  }\n\n  return responseText + decoder.decode();\n}\n\nfunction responseTooLargeError(maxBytes: number): JsonRpcError {\n  return new JsonRpcError(\n    JSON_RPC_ERROR_CODES.RESPONSE_TOO_LARGE,\n    `JSON-RPC response exceeds maximum size of ${maxBytes} bytes`,\n    \"local\",\n  );\n}\n"],"names":["DaemonStatus","PRE_DEPOSITOR_SIGNATURES_STATES","POST_PAYOUT_SIGNATURE_STATUSES","VP_TRANSIENT_STATUSES","VP_TERMINAL_FAILURE_STATUSES","POST_WOTS_STATUSES","VP_BATCH_MAX_SIZE","RpcErrorCode","JsonRpcError","code","message","source","data","JSON_RPC_ERROR_CODES","JSON_RPC_VERSION","DEFAULT_RETRY_ATTEMPTS","DEFAULT_RETRY_DELAY_MS","DEFAULT_MAX_RESPONSE_BYTES","UNCAPPED_TYPED_RESPONSE_METHODS","RETRYABLE_HTTP_STATUS_CODES","DEFAULT_RETRYABLE_METHODS","defaultRetryableFor","method","AUTH_REJECTED_RPC_CODE","isAuthRejectedError","error","JsonRpcClient","config","__publicField","authState","headers","token","params","signal","response","jsonResponse","responseText","readResponseTextWithLimit","rpcResponse","err","callerSignal","requestId","maxRetries","body","lastError","attempt","timeoutController","timeoutId","merged","mergeAbortSignals","delay","ms","resolve","reject","onAbort","a","b","controller","onAbortA","onAbortB","cleanup","maxBytes","contentLength","parsedContentLength","responseTooLargeError","reader","decoder","totalBytes","done","value"],"mappings":"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"}