@elsoul/erpc-sdk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +11 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/transport/rest.ts","../src/account.ts","../src/catalog.ts","../src/config.ts","../src/price.ts","../src/rpc/client.ts","../src/rpc/ethereum.ts","../src/rpc/solana.ts","../src/transport/websocket.ts","../src/subscriptions.ts","../src/transport/http.ts","../src/usage.ts","../src/client.ts","../src/credit.ts","../src/resources.ts","../src/cloud.ts"],"names":["controlledSignal","isObject","objectValue","resourceKinds","resourceModes","isDateTime","requireFetch"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { JsonRpcErrorObject } from './rpc/types'\n\nconst REDACTED = '[REDACTED]'\n\nconst credentialVariants = (credential: string): readonly string[] => {\n const queryEncoded = new URLSearchParams({ value: credential })\n .toString()\n .slice('value='.length)\n let componentEncoded: string | undefined\n try {\n componentEncoded = encodeURIComponent(credential)\n } catch {\n // URLSearchParams still provides a safe encoded representation.\n }\n return [...new Set([credential, componentEncoded, queryEncoded])]\n .filter((value): value is string => Boolean(value))\n .sort((left, right) => right.length - left.length)\n}\n\nconst redactString = (value: string, variants: readonly string[]): string => {\n let redacted = value\n for (const variant of variants) redacted = redacted.replaceAll(variant, REDACTED)\n return redacted\n}\n\nconst redactValue = (\n value: unknown,\n variants: readonly string[],\n seen: WeakSet<object>,\n depth: number,\n): unknown => {\n if (typeof value === 'string') return redactString(value, variants)\n if (typeof value !== 'object' || value === null) return value\n if (depth >= 32 || seen.has(value)) return REDACTED\n\n seen.add(value)\n if (Array.isArray(value)) {\n return value.map((item) => redactValue(item, variants, seen, depth + 1))\n }\n\n const result: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value)) {\n Object.defineProperty(result, key, {\n configurable: true,\n enumerable: true,\n value: redactValue(item, variants, seen, depth + 1),\n writable: true,\n })\n }\n return result\n}\n\nexport const redactJsonRpcError = (\n error: JsonRpcErrorObject,\n credential: string | undefined,\n): JsonRpcErrorObject => {\n if (!credential) return error\n const variants = credentialVariants(credential)\n const result: {\n code: number\n data?: unknown\n message: string\n } = {\n code: error.code,\n message: redactString(error.message, variants),\n }\n if (error.data !== undefined) {\n result.data = redactValue(error.data, variants, new WeakSet(), 0)\n }\n return result\n}\n\nexport type ErpcErrorCode =\n | 'ERPC_ABORTED'\n | 'ERPC_BATCH_POLICY'\n | 'ERPC_CONFIG'\n | 'ERPC_HTTP'\n | 'ERPC_INVALID_RESPONSE'\n | 'ERPC_RPC'\n | 'ERPC_TIMEOUT'\n | 'ERPC_TRANSPORT'\n\nexport class ErpcError extends Error {\n readonly code: ErpcErrorCode\n\n constructor(code: ErpcErrorCode, message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ErpcError'\n this.code = code\n }\n}\n\nexport class ErpcConfigError extends ErpcError {\n constructor(message: string) {\n super('ERPC_CONFIG', message)\n this.name = 'ErpcConfigError'\n }\n}\n\nexport class ErpcTransportError extends ErpcError {\n constructor(message: string, options?: ErrorOptions) {\n super('ERPC_TRANSPORT', message, options)\n this.name = 'ErpcTransportError'\n }\n}\n\nexport class ErpcHttpError extends ErpcError {\n readonly status: number\n\n constructor(status: number, message = `ERPC request failed with HTTP ${status}`) {\n super('ERPC_HTTP', message)\n this.name = 'ErpcHttpError'\n this.status = status\n }\n}\n\nexport class ErpcTimeoutError extends ErpcError {\n readonly timeoutMs: number\n\n constructor(timeoutMs: number) {\n super('ERPC_TIMEOUT', `ERPC request timed out after ${timeoutMs}ms`)\n this.name = 'ErpcTimeoutError'\n this.timeoutMs = timeoutMs\n }\n}\n\nexport class ErpcAbortedError extends ErpcError {\n constructor() {\n super('ERPC_ABORTED', 'ERPC request was aborted')\n this.name = 'ErpcAbortedError'\n }\n}\n\nexport class ErpcInvalidResponseError extends ErpcError {\n constructor(message = 'ERPC returned an invalid response') {\n super('ERPC_INVALID_RESPONSE', message)\n this.name = 'ErpcInvalidResponseError'\n }\n}\n\nexport class ErpcJsonRpcError extends ErpcError {\n readonly rpcCode: number\n readonly data?: unknown\n\n constructor(error: JsonRpcErrorObject) {\n super('ERPC_RPC', error.message)\n this.name = 'ErpcJsonRpcError'\n this.rpcCode = error.code\n if (error.data !== undefined) this.data = error.data\n }\n}\n\nexport class ErpcBatchPolicyError extends ErpcError {\n constructor(message: string) {\n super('ERPC_BATCH_POLICY', message)\n this.name = 'ErpcBatchPolicyError'\n }\n}\n","import {\n ErpcAbortedError,\n ErpcHttpError,\n ErpcInvalidResponseError,\n ErpcTimeoutError,\n ErpcTransportError,\n} from '../errors'\nimport type { RpcSendOptions } from '../rpc/types'\n\nexport type QueryValue =\n | boolean\n | number\n | readonly string[]\n | string\n | undefined\n\nexport type Query = Readonly<Record<string, QueryValue>>\n\nexport interface RestTransportConfig {\n readonly apiKey: string\n readonly endpoint: URL\n readonly fetch: typeof globalThis.fetch\n readonly headers: Readonly<Record<string, string>>\n readonly timeoutMs: number\n}\n\nexport interface RestStreamResponse {\n readonly response: Response\n close(): void\n normalizeError(error: unknown): Error\n}\n\ninterface ControlledSignal {\n readonly cleanup: () => void\n readonly signal: AbortSignal\n readonly stopTimeout: () => void\n readonly timeoutMs: number\n readonly timedOut: () => boolean\n}\n\nconst controlledSignal = (\n timeoutMs: number,\n external?: AbortSignal,\n): ControlledSignal => {\n const controller = new AbortController()\n let didTimeOut = false\n let timeout: ReturnType<typeof setTimeout> | undefined = setTimeout(() => {\n didTimeOut = true\n controller.abort()\n }, timeoutMs)\n\n const abort = () => controller.abort()\n if (external?.aborted) controller.abort()\n else external?.addEventListener('abort', abort, { once: true })\n\n const stopTimeout = () => {\n if (timeout === undefined) return\n clearTimeout(timeout)\n timeout = undefined\n }\n\n return {\n signal: controller.signal,\n stopTimeout,\n timeoutMs,\n timedOut: () => didTimeOut,\n cleanup: () => {\n stopTimeout()\n external?.removeEventListener('abort', abort)\n },\n }\n}\n\nconst normalizeError = (\n error: unknown,\n controlled: ControlledSignal,\n external?: AbortSignal,\n): Error => {\n if (\n error instanceof ErpcAbortedError ||\n error instanceof ErpcHttpError ||\n error instanceof ErpcInvalidResponseError ||\n error instanceof ErpcTimeoutError ||\n error instanceof ErpcTransportError\n ) {\n return error\n }\n if (controlled.timedOut()) {\n return new ErpcTimeoutError(controlled.timeoutMs)\n }\n if (external?.aborted) return new ErpcAbortedError()\n return new ErpcTransportError('Unable to reach ERPC')\n}\n\nconst applyQuery = (url: URL, query?: Query): void => {\n if (!query) return\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue\n if (Array.isArray(value)) {\n for (const item of value) url.searchParams.append(key, item)\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n}\n\nexport class RestTransport {\n readonly endpoint: string\n\n readonly #apiKey: string\n readonly #endpoint: URL\n readonly #fetch: typeof globalThis.fetch\n readonly #headers: Readonly<Record<string, string>>\n readonly #timeoutMs: number\n\n constructor(config: RestTransportConfig) {\n this.#apiKey = config.apiKey\n this.#endpoint = new URL(config.endpoint)\n this.#fetch = config.fetch\n this.#headers = config.headers\n this.#timeoutMs = config.timeoutMs\n const endpoint = new URL(config.endpoint)\n endpoint.search = ''\n endpoint.hash = ''\n this.endpoint = endpoint.toString()\n }\n\n url(path: string, query?: Query): URL {\n const url = new URL(this.#endpoint)\n const base = url.pathname === '/' ? '' : url.pathname.replace(/\\/+$/, '')\n url.pathname = `${base}/${path.replace(/^\\/+/, '')}`.replace(/\\/{2,}/g, '/')\n applyQuery(url, query)\n return url\n }\n\n async get<TResult>(\n path: string,\n query?: Query,\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n const controlled = controlledSignal(this.#timeoutMs, options.signal)\n try {\n const response = await this.#get(path, query, controlled.signal)\n if (!response.ok) throw new ErpcHttpError(response.status)\n const text = await response.text()\n try {\n return JSON.parse(text) as TResult\n } catch {\n throw new ErpcInvalidResponseError('ERPC returned malformed JSON')\n }\n } catch (error) {\n throw normalizeError(error, controlled, options.signal)\n } finally {\n controlled.cleanup()\n }\n }\n\n async stream(\n path: string,\n query?: Query,\n options: RpcSendOptions = {},\n ): Promise<RestStreamResponse> {\n const controlled = controlledSignal(this.#timeoutMs, options.signal)\n try {\n const response = await this.#get(path, query, controlled.signal)\n if (!response.ok) throw new ErpcHttpError(response.status)\n\n // Long-lived streams use the timeout for connection establishment only.\n // The caller's AbortSignal remains attached until close() is called.\n controlled.stopTimeout()\n return {\n response,\n close: controlled.cleanup,\n normalizeError: (error) =>\n normalizeError(error, controlled, options.signal),\n }\n } catch (error) {\n controlled.cleanup()\n throw normalizeError(error, controlled, options.signal)\n }\n }\n\n #get(path: string, query: Query | undefined, signal: AbortSignal) {\n return this.#fetch(this.url(path, query), {\n method: 'GET',\n headers: {\n ...this.#headers,\n authorization: `Bearer ${this.#apiKey}`,\n accept: 'application/json',\n },\n signal,\n })\n }\n}\n","import type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport type ErpcPlan = 'business' | 'developer' | 'free' | 'pro'\n\nexport interface TokenBalance {\n readonly max_tokens: number\n readonly next_refill_at: string | null\n readonly plan: ErpcPlan\n readonly remaining_tokens: number\n}\n\nexport class AccountClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n getTokenBalance(options?: RpcSendOptions): Promise<TokenBalance> {\n return this.#transport.get('/v3/erpc/token-balance', undefined, options)\n }\n}\n","import { ErpcInvalidResponseError } from './errors'\nimport type { CloudResourceKind, CloudResourceMode } from './resources'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport interface CloudOfferingBilling {\n readonly amountCents: number\n readonly unit: 'cents-per-hour'\n}\n\nexport interface CloudOfferingCompute {\n readonly tenancy: 'bare-metal' | 'virtual-machine'\n}\n\nexport interface CloudOfferingSolana {\n readonly transport: 'grpc' | 'shredstream'\n}\n\nexport interface CloudOffering {\n readonly billing?: CloudOfferingBilling\n readonly capabilities: readonly string[]\n readonly compute?: CloudOfferingCompute\n readonly description: string\n readonly id: string\n readonly kind: CloudResourceKind\n readonly mode?: CloudResourceMode\n readonly name: string\n readonly regions: readonly string[]\n readonly solana?: CloudOfferingSolana\n}\n\nconst resourceKinds: readonly CloudResourceKind[] = [\n 'bare-metal',\n 'solana-grpc',\n 'solana-shredstream',\n 'vps',\n]\nconst resourceModes: readonly CloudResourceMode[] = [\n 'dedicated',\n 'direct',\n 'shared',\n]\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst stringArray = (value: unknown): readonly string[] | null =>\n Array.isArray(value) && value.every((item) => typeof item === 'string')\n ? value\n : null\n\nconst parseOffering = (value: unknown): CloudOffering | null => {\n const offering = objectValue(value)\n if (\n offering === null ||\n typeof offering.id !== 'string' ||\n typeof offering.kind !== 'string' ||\n !resourceKinds.includes(offering.kind as CloudResourceKind) ||\n typeof offering.name !== 'string' ||\n typeof offering.description !== 'string' ||\n (offering.mode !== undefined &&\n (typeof offering.mode !== 'string' ||\n !resourceModes.includes(offering.mode as CloudResourceMode)))\n ) return null\n\n const regions = stringArray(offering.regions)\n const capabilities = stringArray(offering.capabilities)\n if (regions === null || capabilities === null) return null\n\n const compute = offering.compute === undefined\n ? undefined\n : objectValue(offering.compute)\n if (\n compute !== undefined &&\n (compute === null ||\n (compute.tenancy !== 'virtual-machine' &&\n compute.tenancy !== 'bare-metal'))\n ) return null\n\n const solana = offering.solana === undefined\n ? undefined\n : objectValue(offering.solana)\n if (\n solana !== undefined &&\n (solana === null ||\n (solana.transport !== 'grpc' && solana.transport !== 'shredstream'))\n ) return null\n\n const billing = offering.billing === undefined\n ? undefined\n : objectValue(offering.billing)\n if (\n billing !== undefined &&\n (billing === null ||\n billing.unit !== 'cents-per-hour' ||\n typeof billing.amountCents !== 'number' ||\n !Number.isInteger(billing.amountCents) ||\n billing.amountCents < 0)\n ) return null\n\n return {\n id: offering.id,\n kind: offering.kind as CloudResourceKind,\n name: offering.name,\n description: offering.description,\n regions,\n capabilities,\n ...(typeof offering.mode === 'string'\n ? { mode: offering.mode as CloudResourceMode }\n : {}),\n ...(compute &&\n (compute.tenancy === 'virtual-machine' || compute.tenancy === 'bare-metal')\n ? { compute: { tenancy: compute.tenancy } }\n : {}),\n ...(solana &&\n (solana.transport === 'grpc' || solana.transport === 'shredstream')\n ? { solana: { transport: solana.transport } }\n : {}),\n ...(billing &&\n billing.unit === 'cents-per-hour' &&\n typeof billing.amountCents === 'number'\n ? {\n billing: {\n amountCents: billing.amountCents,\n unit: billing.unit,\n },\n }\n : {}),\n }\n}\n\nexport class CloudCatalogClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async list(options?: RpcSendOptions): Promise<readonly CloudOffering[]> {\n const response: unknown = await this.#transport.get(\n '/v4/cloud/catalog',\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const message = objectValue(envelope?.message)\n if (envelope?.success !== true || !Array.isArray(message?.offerings)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud catalog',\n )\n }\n const offerings = message.offerings.map(parseOffering)\n if (offerings.some((offering) => offering === null)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud catalog',\n )\n }\n return offerings as readonly CloudOffering[]\n }\n}\n","import { ErpcConfigError } from './errors'\n\nexport const DEFAULT_ENDPOINT = 'https://edge.erpc.global'\nexport const DEFAULT_ACCOUNT_ENDPOINT = 'https://solana-rpc.erpc.global'\nexport const DEFAULT_USER_ENDPOINT = 'https://user-api.erpc.global'\nexport const DEFAULT_TIMEOUT_MS = 30_000\n\nexport interface ErpcClientConfig {\n readonly accountEndpoint?: string\n readonly apiKey: string\n readonly endpoint?: string\n readonly fetch?: typeof globalThis.fetch\n readonly headers?: Readonly<Record<string, string>>\n readonly timeoutMs?: number\n readonly userEndpoint?: string\n readonly webSocket?: typeof globalThis.WebSocket\n}\n\nexport interface ResolvedErpcClientConfig {\n readonly accountEndpoint: URL\n readonly apiKey: string\n readonly endpoint: URL\n readonly fetch: typeof globalThis.fetch\n readonly headers: Readonly<Record<string, string>>\n readonly timeoutMs: number\n readonly userEndpoint: URL\n readonly webSocket?: typeof globalThis.WebSocket\n}\n\nconst requireFetch = (provided?: typeof globalThis.fetch) => {\n const implementation = provided ?? globalThis.fetch\n if (typeof implementation !== 'function') {\n throw new ErpcConfigError(\n 'A Fetch API implementation is required in this runtime',\n )\n }\n return implementation\n}\n\nexport const resolveConfig = (\n config: ErpcClientConfig,\n): ResolvedErpcClientConfig => {\n const apiKey = config.apiKey.trim()\n if (!apiKey) throw new ErpcConfigError('apiKey must not be empty')\n\n let endpoint: URL\n let accountEndpoint: URL\n let userEndpoint: URL\n try {\n endpoint = new URL(config.endpoint ?? DEFAULT_ENDPOINT)\n accountEndpoint = new URL(\n config.accountEndpoint ?? DEFAULT_ACCOUNT_ENDPOINT,\n )\n userEndpoint = new URL(config.userEndpoint ?? DEFAULT_USER_ENDPOINT)\n } catch {\n throw new ErpcConfigError('endpoint must be an absolute HTTP(S) URL')\n }\n\n if (endpoint.protocol !== 'https:' && endpoint.protocol !== 'http:') {\n throw new ErpcConfigError('endpoint must use HTTP or HTTPS')\n }\n if (\n accountEndpoint.protocol !== 'https:' &&\n accountEndpoint.protocol !== 'http:'\n ) {\n throw new ErpcConfigError('accountEndpoint must use HTTP or HTTPS')\n }\n if (\n userEndpoint.protocol !== 'https:' &&\n userEndpoint.protocol !== 'http:'\n ) {\n throw new ErpcConfigError('userEndpoint must use HTTP or HTTPS')\n }\n\n endpoint.search = ''\n endpoint.hash = ''\n endpoint.pathname = endpoint.pathname.replace(/\\/+$/, '') || '/'\n accountEndpoint.search = ''\n accountEndpoint.hash = ''\n accountEndpoint.pathname =\n accountEndpoint.pathname.replace(/\\/+$/, '') || '/'\n userEndpoint.search = ''\n userEndpoint.hash = ''\n userEndpoint.pathname = userEndpoint.pathname.replace(/\\/+$/, '') || '/'\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new ErpcConfigError('timeoutMs must be a positive finite number')\n }\n\n return {\n accountEndpoint,\n apiKey,\n endpoint,\n fetch: requireFetch(config.fetch),\n headers: config.headers ?? {},\n timeoutMs,\n userEndpoint,\n ...(config.webSocket === undefined\n ? {}\n : { webSocket: config.webSocket }),\n }\n}\n\nexport const endpointWithPath = (endpoint: URL, path: string): URL => {\n const url = new URL(endpoint)\n const base = endpoint.pathname === '/' ? '' : endpoint.pathname\n url.pathname = `${base}/${path.replace(/^\\/+/, '')}`.replace(/\\/{2,}/g, '/')\n return url\n}\n\nexport const websocketUrl = (\n endpoint: URL,\n apiKey: string,\n path = '',\n): URL => {\n const url = endpointWithPath(endpoint, path)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n url.searchParams.set('api-key', apiKey)\n return url\n}\n","import { ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport type { Query } from './transport/rest'\nimport { RestTransport } from './transport/rest'\n\nexport type PriceEncoding = 'base64' | 'hex'\nexport type PriceAssetType = 'crypto' | 'equity' | 'fx' | 'metal' | 'rates'\n\nexport interface PriceFeedMetadata {\n readonly attributes?: Readonly<Record<string, string>>\n readonly id: string\n}\n\nexport interface PricePoint {\n readonly conf: string\n readonly expo: number\n readonly price: string\n readonly publish_time: number\n}\n\nexport interface ParsedPriceUpdate {\n readonly ema_price: PricePoint\n readonly id: string\n readonly metadata?: {\n readonly prev_publish_time?: number\n readonly proof_available_time?: number\n readonly slot?: number\n }\n readonly price: PricePoint\n}\n\nexport interface BinaryUpdate {\n readonly data: readonly string[]\n readonly encoding: string\n}\n\nexport interface PriceUpdateResponse {\n readonly binary: BinaryUpdate\n readonly parsed?: readonly ParsedPriceUpdate[]\n}\n\nexport interface PriceUpdateOptions {\n readonly encoding?: PriceEncoding\n readonly ids: readonly string[]\n readonly ignoreInvalidPriceIds?: boolean\n readonly parsed?: boolean\n}\n\nexport interface PriceStreamOptions extends PriceUpdateOptions {\n readonly allowUnordered?: boolean\n readonly benchmarksOnly?: boolean\n}\n\nexport interface PublisherStakeCap {\n readonly cap: number\n readonly publisher: string\n}\n\nexport interface PublisherStakeCapsResponse {\n readonly binary: BinaryUpdate\n readonly parsed?: readonly {\n readonly publisher_stake_caps: readonly PublisherStakeCap[]\n }[]\n}\n\nexport interface PriceStreamEvent {\n readonly data: PriceUpdateResponse\n readonly event?: string\n readonly id?: string\n}\n\nconst updateQuery = (options: PriceUpdateOptions): Query => ({\n 'ids[]': options.ids,\n encoding: options.encoding,\n parsed: options.parsed,\n ignore_invalid_price_ids: options.ignoreInvalidPriceIds,\n})\n\nconst parseSseBlock = (block: string): PriceStreamEvent | null => {\n const data: string[] = []\n let event: string | undefined\n let id: string | undefined\n\n for (const line of block.split(/\\r?\\n/)) {\n if (!line || line.startsWith(':')) continue\n const separator = line.indexOf(':')\n const field = separator === -1 ? line : line.slice(0, separator)\n const raw = separator === -1 ? '' : line.slice(separator + 1)\n const value = raw.startsWith(' ') ? raw.slice(1) : raw\n if (field === 'data') data.push(value)\n else if (field === 'event') event = value\n else if (field === 'id') id = value\n }\n\n if (data.length === 0) return null\n let parsed: PriceUpdateResponse\n try {\n parsed = JSON.parse(data.join('\\n')) as PriceUpdateResponse\n } catch {\n throw new ErpcInvalidResponseError('ERPC returned malformed stream data')\n }\n const result: {\n data: PriceUpdateResponse\n event?: string\n id?: string\n } = { data: parsed }\n if (event !== undefined) result.event = event\n if (id !== undefined) result.id = id\n return result\n}\n\nexport class PriceClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n getPriceFeeds(\n options: {\n readonly assetType?: PriceAssetType\n readonly query?: string\n } = {},\n sendOptions?: RpcSendOptions,\n ): Promise<readonly PriceFeedMetadata[]> {\n return this.#transport.get(\n '/v2/price_feeds',\n { query: options.query, asset_type: options.assetType },\n sendOptions,\n )\n }\n\n getLatestPriceUpdates(\n options: PriceUpdateOptions,\n sendOptions?: RpcSendOptions,\n ): Promise<PriceUpdateResponse> {\n return this.#transport.get(\n '/v2/updates/price/latest',\n updateQuery(options),\n sendOptions,\n )\n }\n\n getPriceUpdatesAtTimestamp(\n publishTime: number | string,\n options: PriceUpdateOptions,\n sendOptions?: RpcSendOptions,\n ): Promise<PriceUpdateResponse> {\n return this.#transport.get(\n `/v2/updates/price/${encodeURIComponent(String(publishTime))}`,\n updateQuery(options),\n sendOptions,\n )\n }\n\n getLatestPublisherStakeCaps(\n options: { readonly encoding?: PriceEncoding; readonly parsed?: boolean } = {},\n sendOptions?: RpcSendOptions,\n ): Promise<PublisherStakeCapsResponse> {\n return this.#transport.get(\n '/v2/updates/publisher_stake_caps/latest',\n options,\n sendOptions,\n )\n }\n\n async *streamPriceUpdates(\n options: PriceStreamOptions,\n sendOptions?: RpcSendOptions,\n ): AsyncGenerator<PriceStreamEvent, void, undefined> {\n const stream = await this.#transport.stream(\n '/v2/updates/price/stream',\n {\n ...updateQuery(options),\n allow_unordered: options.allowUnordered,\n benchmarks_only: options.benchmarksOnly,\n },\n sendOptions,\n )\n const response = stream.response\n if (!response.body) {\n stream.close()\n throw new ErpcInvalidResponseError('ERPC returned an empty stream')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n try {\n while (true) {\n const { done, value } = await reader.read()\n buffer += decoder.decode(value, { stream: !done })\n let boundary = buffer.search(/\\r?\\n\\r?\\n/)\n while (boundary !== -1) {\n const separatorLength = buffer.slice(boundary).startsWith('\\r\\n')\n ? 4\n : 2\n const block = buffer.slice(0, boundary)\n buffer = buffer.slice(boundary + separatorLength)\n const event = parseSseBlock(block)\n if (event) yield event\n boundary = buffer.search(/\\r?\\n\\r?\\n/)\n }\n if (done) break\n }\n const finalEvent = parseSseBlock(buffer)\n if (finalEvent) yield finalEvent\n } catch (error) {\n throw stream.normalizeError(error)\n } finally {\n try {\n await reader.cancel()\n } catch {\n // Preserve the original stream result or error.\n } finally {\n reader.releaseLock()\n stream.close()\n }\n }\n }\n}\n","import type {\n JsonRpcParams,\n RpcBatchCall,\n RpcMethodSpec,\n RpcParams,\n RpcResult,\n RpcSendOptions,\n} from './types'\n\nexport interface JsonRpcTransport {\n readonly endpoint: string\n readonly maxBatchSize: number\n\n batch<TResult extends readonly unknown[]>(\n calls: readonly RpcBatchCall[],\n options?: RpcSendOptions,\n ): Promise<TResult>\n\n request<TResult>(\n method: string,\n params?: JsonRpcParams,\n options?: RpcSendOptions,\n ): Promise<TResult>\n}\n\nexport class PendingRpcRequest<TResult> {\n readonly #send: (options?: RpcSendOptions) => Promise<TResult>\n\n constructor(send: (options?: RpcSendOptions) => Promise<TResult>) {\n this.#send = send\n }\n\n send(options?: RpcSendOptions): Promise<TResult> {\n return this.#send(options)\n }\n}\n\nexport class PendingRpcBatchRequest<TResult extends readonly unknown[]> {\n readonly #send: (options?: RpcSendOptions) => Promise<TResult>\n\n constructor(send: (options?: RpcSendOptions) => Promise<TResult>) {\n this.#send = send\n }\n\n send(options?: RpcSendOptions): Promise<TResult> {\n return this.#send(options)\n }\n}\n\ntype SchemaConstraint<TSchema> = {\n readonly [TMethod in keyof TSchema]: RpcMethodSpec<\n JsonRpcParams | undefined,\n unknown\n >\n}\n\ntype MethodName<TSchema> = Extract<keyof TSchema, string>\n\ntype MethodFunction<TSpec> = TSpec extends RpcMethodSpec<\n infer TParams,\n infer TResult\n>\n ? TParams extends readonly unknown[]\n ? (...params: TParams) => PendingRpcRequest<TResult>\n : TParams extends object\n ? (params: TParams) => PendingRpcRequest<TResult>\n : () => PendingRpcRequest<TResult>\n : never\n\ntype BatchCall<TSchema> = {\n readonly [TMethod in MethodName<TSchema>]: RpcParams<\n TSchema[TMethod]\n > extends undefined\n ? { readonly method: TMethod; readonly params?: undefined }\n : {\n readonly method: TMethod\n readonly params: RpcParams<TSchema[TMethod]>\n }\n}[MethodName<TSchema>]\n\ntype BatchResults<\n TSchema,\n TCalls extends readonly BatchCall<TSchema>[],\n> = {\n readonly [TIndex in keyof TCalls]: TCalls[TIndex] extends {\n readonly method: infer TMethod\n }\n ? TMethod extends MethodName<TSchema>\n ? RpcResult<TSchema[TMethod]>\n : never\n : never\n}\n\nexport interface RpcNamespaceBase<TSchema> {\n readonly endpoint: string\n\n batch<const TCalls extends readonly BatchCall<TSchema>[]>(\n calls: TCalls,\n ): PendingRpcBatchRequest<BatchResults<TSchema, TCalls>>\n\n raw<TResult = unknown>(\n method: string,\n params?: JsonRpcParams,\n ): PendingRpcRequest<TResult>\n\n request<TMethod extends MethodName<TSchema>>(\n method: TMethod,\n ...params: RpcParams<TSchema[TMethod]> extends undefined\n ? []\n : [params: RpcParams<TSchema[TMethod]>]\n ): PendingRpcRequest<RpcResult<TSchema[TMethod]>>\n}\n\nexport type RpcNamespace<TSchema extends SchemaConstraint<TSchema>> =\n RpcNamespaceBase<TSchema> & {\n readonly [TMethod in MethodName<TSchema>]: MethodFunction<TSchema[TMethod]>\n }\n\nexport interface CreateRpcNamespaceConfig {\n readonly parameterMode: 'named' | 'positional'\n readonly transport: JsonRpcTransport\n readonly validateBatch?: (calls: readonly RpcBatchCall[]) => void\n}\n\nconst methodParams = (\n mode: CreateRpcNamespaceConfig['parameterMode'],\n args: readonly unknown[],\n): JsonRpcParams | undefined => {\n if (mode === 'positional') return args\n if (args.length === 0) return undefined\n return args[0] as object\n}\n\nexport const createRpcNamespace = <\n TSchema extends SchemaConstraint<TSchema>,\n>(config: CreateRpcNamespaceConfig): RpcNamespace<TSchema> => {\n const base: RpcNamespaceBase<TSchema> = {\n endpoint: config.transport.endpoint,\n batch: <const TCalls extends readonly BatchCall<TSchema>[]>(calls: TCalls) => {\n const wireCalls = calls as readonly RpcBatchCall[]\n config.validateBatch?.(wireCalls)\n return new PendingRpcBatchRequest((options) =>\n config.transport.batch<BatchResults<TSchema, TCalls>>(\n wireCalls,\n options,\n ),\n )\n },\n raw: <TResult>(method: string, params?: JsonRpcParams) =>\n new PendingRpcRequest<TResult>((options) =>\n config.transport.request<TResult>(method, params, options),\n ),\n request: <TMethod extends MethodName<TSchema>>(\n method: TMethod,\n ...params: RpcParams<TSchema[TMethod]> extends undefined\n ? []\n : [params: RpcParams<TSchema[TMethod]>]\n ) =>\n new PendingRpcRequest<RpcResult<TSchema[TMethod]>>((options) =>\n config.transport.request<RpcResult<TSchema[TMethod]>>(\n method,\n params[0] as JsonRpcParams | undefined,\n options,\n ),\n ),\n }\n\n return new Proxy(base as RpcNamespace<TSchema>, {\n get(target, property, receiver) {\n if (typeof property !== 'string' || property in target) {\n return Reflect.get(target, property, receiver) as unknown\n }\n if (property === 'then') return undefined\n return (...args: readonly unknown[]) =>\n new PendingRpcRequest((options) =>\n config.transport.request(\n property,\n methodParams(config.parameterMode, args),\n options,\n ),\n )\n },\n })\n}\n","import type { HttpJsonRpcTransport } from '../transport/http'\nimport { createRpcNamespace, type RpcNamespace } from './client'\nimport type { JsonValue, RpcMethodSpec } from './types'\n\nexport type Hex = `0x${string}`\nexport type EthereumAddress = Hex\nexport type EthereumBlockTag =\n | 'earliest'\n | 'finalized'\n | 'latest'\n | 'pending'\n | 'safe'\n | Hex\n\nexport type EthereumObject = Readonly<Record<string, unknown>>\nexport type EthereumTransactionRequest = EthereumObject\nexport type EthereumFilter = EthereumObject\n\nexport interface EthereumRpcSchema {\n readonly eth_accounts: RpcMethodSpec<readonly [], readonly EthereumAddress[]>\n readonly eth_baseFee: RpcMethodSpec<readonly [], Hex>\n readonly eth_blobBaseFee: RpcMethodSpec<readonly [], Hex>\n readonly eth_blockNumber: RpcMethodSpec<readonly [], Hex>\n readonly eth_call: RpcMethodSpec<\n readonly [\n transaction: EthereumTransactionRequest,\n block?: EthereumBlockTag,\n stateOverride?: EthereumObject,\n ],\n Hex\n >\n readonly eth_callMany: RpcMethodSpec<\n readonly [\n calls: readonly EthereumObject[],\n simulationContext?: EthereumObject,\n stateOverride?: EthereumObject,\n timeout?: number,\n ],\n JsonValue\n >\n readonly eth_capabilities: RpcMethodSpec<readonly [], JsonValue>\n readonly eth_chainId: RpcMethodSpec<readonly [], Hex>\n readonly eth_createAccessList: RpcMethodSpec<\n readonly [\n transaction: EthereumTransactionRequest,\n block?: EthereumBlockTag,\n ],\n JsonValue\n >\n readonly eth_estimateGas: RpcMethodSpec<\n readonly [\n transaction: EthereumTransactionRequest,\n block?: EthereumBlockTag,\n stateOverride?: EthereumObject,\n ],\n Hex\n >\n readonly eth_feeHistory: RpcMethodSpec<\n readonly [\n blockCount: Hex,\n newestBlock: EthereumBlockTag,\n rewardPercentiles: readonly number[],\n ],\n JsonValue\n >\n readonly eth_gasPrice: RpcMethodSpec<readonly [], Hex>\n readonly eth_getAccount: RpcMethodSpec<\n readonly [address: EthereumAddress, block: EthereumBlockTag],\n JsonValue\n >\n readonly eth_getBalance: RpcMethodSpec<\n readonly [address: EthereumAddress, block?: EthereumBlockTag],\n Hex\n >\n readonly eth_getBlockByHash: RpcMethodSpec<\n readonly [hash: Hex, includeTransactions: boolean],\n JsonValue | null\n >\n readonly eth_getBlockByNumber: RpcMethodSpec<\n readonly [block: EthereumBlockTag, includeTransactions: boolean],\n JsonValue | null\n >\n readonly eth_getBlockReceipts: RpcMethodSpec<\n readonly [block: EthereumBlockTag],\n JsonValue | null\n >\n readonly eth_getBlockTransactionCountByHash: RpcMethodSpec<\n readonly [hash: Hex],\n Hex | null\n >\n readonly eth_getBlockTransactionCountByNumber: RpcMethodSpec<\n readonly [block: EthereumBlockTag],\n Hex | null\n >\n readonly eth_getCode: RpcMethodSpec<\n readonly [address: EthereumAddress, block?: EthereumBlockTag],\n Hex\n >\n readonly eth_getFilterChanges: RpcMethodSpec<readonly [filterId: Hex], JsonValue>\n readonly eth_getFilterLogs: RpcMethodSpec<readonly [filterId: Hex], JsonValue>\n readonly eth_getLogs: RpcMethodSpec<\n readonly [filter?: EthereumFilter],\n JsonValue\n >\n readonly eth_getProof: RpcMethodSpec<\n readonly [\n address: EthereumAddress,\n storageKeys: readonly Hex[],\n block: EthereumBlockTag,\n ],\n JsonValue\n >\n readonly eth_getRawTransactionByHash: RpcMethodSpec<\n readonly [hash: Hex],\n Hex | null\n >\n readonly eth_getStorageAt: RpcMethodSpec<\n readonly [\n address: EthereumAddress,\n position: Hex,\n block?: EthereumBlockTag,\n ],\n Hex\n >\n readonly eth_getTransactionByBlockHashAndIndex: RpcMethodSpec<\n readonly [blockHash: Hex, index: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionByBlockNumberAndIndex: RpcMethodSpec<\n readonly [block: EthereumBlockTag, index: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionByHash: RpcMethodSpec<\n readonly [hash: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionBySenderAndNonce: RpcMethodSpec<\n readonly [sender: EthereumAddress, nonce: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionCount: RpcMethodSpec<\n readonly [address: EthereumAddress, block?: EthereumBlockTag],\n Hex\n >\n readonly eth_getTransactionReceipt: RpcMethodSpec<\n readonly [hash: Hex],\n JsonValue | null\n >\n readonly eth_getUncleCountByBlockHash: RpcMethodSpec<\n readonly [hash: Hex],\n Hex\n >\n readonly eth_getUncleCountByBlockNumber: RpcMethodSpec<\n readonly [block: EthereumBlockTag],\n Hex\n >\n readonly eth_maxPriorityFeePerGas: RpcMethodSpec<readonly [], Hex>\n readonly eth_newBlockFilter: RpcMethodSpec<readonly [], Hex>\n readonly eth_newFilter: RpcMethodSpec<\n readonly [filter?: EthereumFilter],\n Hex\n >\n readonly eth_newPendingTransactionFilter: RpcMethodSpec<readonly [], Hex>\n readonly eth_sendRawTransaction: RpcMethodSpec<\n readonly [transaction: Hex],\n Hex\n >\n readonly eth_signTransaction: RpcMethodSpec<\n readonly [transaction: EthereumTransactionRequest],\n Hex\n >\n readonly eth_simulateV1: RpcMethodSpec<\n readonly [simulation: EthereumObject, block?: EthereumBlockTag],\n JsonValue\n >\n readonly eth_submitWork: RpcMethodSpec<\n readonly [nonce: Hex, proofOfWorkHash: Hex, digest: Hex],\n boolean\n >\n readonly eth_syncing: RpcMethodSpec<readonly [], boolean | JsonValue>\n readonly eth_uninstallFilter: RpcMethodSpec<readonly [filterId: Hex], boolean>\n readonly net_listening: RpcMethodSpec<readonly [], boolean>\n readonly net_peerCount: RpcMethodSpec<readonly [], Hex>\n readonly net_version: RpcMethodSpec<readonly [], string>\n readonly txpool_content: RpcMethodSpec<readonly [], JsonValue>\n readonly txpool_contentFrom: RpcMethodSpec<\n readonly [address: EthereumAddress],\n JsonValue\n >\n readonly txpool_inspect: RpcMethodSpec<readonly [], JsonValue>\n readonly txpool_status: RpcMethodSpec<readonly [], JsonValue>\n readonly web3_clientVersion: RpcMethodSpec<readonly [], string>\n readonly web3_sha3: RpcMethodSpec<readonly [data: Hex], Hex>\n}\n\nexport interface EthereumSubscriptionSchema {\n readonly eth_subscribe: RpcMethodSpec<\n readonly [subscription: string, ...options: readonly unknown[]],\n string\n >\n readonly eth_unsubscribe: RpcMethodSpec<\n readonly [subscriptionId: string],\n boolean\n >\n}\n\nexport const ETHEREUM_RPC_METHODS = [\n 'eth_accounts',\n 'eth_baseFee',\n 'eth_blobBaseFee',\n 'eth_blockNumber',\n 'eth_call',\n 'eth_callMany',\n 'eth_capabilities',\n 'eth_chainId',\n 'eth_createAccessList',\n 'eth_estimateGas',\n 'eth_feeHistory',\n 'eth_gasPrice',\n 'eth_getAccount',\n 'eth_getBalance',\n 'eth_getBlockByHash',\n 'eth_getBlockByNumber',\n 'eth_getBlockReceipts',\n 'eth_getBlockTransactionCountByHash',\n 'eth_getBlockTransactionCountByNumber',\n 'eth_getCode',\n 'eth_getFilterChanges',\n 'eth_getFilterLogs',\n 'eth_getLogs',\n 'eth_getProof',\n 'eth_getRawTransactionByHash',\n 'eth_getStorageAt',\n 'eth_getTransactionByBlockHashAndIndex',\n 'eth_getTransactionByBlockNumberAndIndex',\n 'eth_getTransactionByHash',\n 'eth_getTransactionBySenderAndNonce',\n 'eth_getTransactionCount',\n 'eth_getTransactionReceipt',\n 'eth_getUncleCountByBlockHash',\n 'eth_getUncleCountByBlockNumber',\n 'eth_maxPriorityFeePerGas',\n 'eth_newBlockFilter',\n 'eth_newFilter',\n 'eth_newPendingTransactionFilter',\n 'eth_sendRawTransaction',\n 'eth_signTransaction',\n 'eth_simulateV1',\n 'eth_submitWork',\n 'eth_syncing',\n 'eth_uninstallFilter',\n 'net_listening',\n 'net_peerCount',\n 'net_version',\n 'txpool_content',\n 'txpool_contentFrom',\n 'txpool_inspect',\n 'txpool_status',\n 'web3_clientVersion',\n 'web3_sha3',\n] as const satisfies readonly (keyof EthereumRpcSchema)[]\n\nexport const ETHEREUM_SUBSCRIPTION_METHODS = [\n 'eth_subscribe',\n 'eth_unsubscribe',\n] as const satisfies readonly (keyof EthereumSubscriptionSchema)[]\n\nexport interface EthereumClient {\n readonly rpc: RpcNamespace<EthereumRpcSchema>\n}\n\nexport const createEthereumClient = (\n transport: HttpJsonRpcTransport,\n): EthereumClient => ({\n rpc: createRpcNamespace<EthereumRpcSchema>({\n transport,\n parameterMode: 'positional',\n }),\n})\n","import { ErpcBatchPolicyError } from '../errors'\nimport type { HttpJsonRpcTransport } from '../transport/http'\nimport { createRpcNamespace, type RpcNamespace } from './client'\nimport type {\n JsonObject,\n JsonValue,\n RpcBatchCall,\n RpcMethodSpec,\n} from './types'\n\nexport type SolanaCommitment = 'confirmed' | 'finalized' | 'processed'\nexport type SolanaEncoding = 'base58' | 'base64' | 'base64+zstd' | 'jsonParsed'\nexport type SolanaConfig = Readonly<Record<string, unknown>>\n\nexport interface SolanaContext {\n readonly apiVersion?: string\n readonly slot: number\n}\n\nexport interface SolanaContextResult<TValue> {\n readonly context: SolanaContext\n readonly value: TValue\n}\n\nexport interface PriorityFeeEstimate {\n readonly priorityFeeEstimate: number\n readonly [key: string]: unknown\n}\n\nexport interface SolanaRpcSchema {\n readonly getAccountInfo: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n SolanaContextResult<JsonValue | null>\n >\n readonly getBalance: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n SolanaContextResult<number>\n >\n readonly getBlock: RpcMethodSpec<\n readonly [slot: number, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getBlockCommitment: RpcMethodSpec<\n readonly [slot: number],\n JsonValue\n >\n readonly getBlockHeight: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n number\n >\n readonly getBlockProduction: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getBlockTime: RpcMethodSpec<\n readonly [slot: number],\n number | null\n >\n readonly getBlocks: RpcMethodSpec<\n readonly [startSlot: number, endSlot?: number, commitment?: SolanaCommitment],\n readonly number[]\n >\n readonly getBlocksWithLimit: RpcMethodSpec<\n readonly [startSlot: number, limit: number, commitment?: SolanaCommitment],\n readonly number[]\n >\n readonly getClusterNodes: RpcMethodSpec<readonly [], JsonValue>\n readonly getEpochInfo: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getEpochSchedule: RpcMethodSpec<readonly [], JsonValue>\n readonly getFeeForMessage: RpcMethodSpec<\n readonly [message: string, config?: SolanaConfig],\n SolanaContextResult<number | null>\n >\n readonly getFirstAvailableBlock: RpcMethodSpec<readonly [], number>\n readonly getGenesisHash: RpcMethodSpec<readonly [], string>\n readonly getHealth: RpcMethodSpec<readonly [], string>\n readonly getHighestSnapshotSlot: RpcMethodSpec<readonly [], JsonValue>\n readonly getIdentity: RpcMethodSpec<readonly [], JsonValue>\n readonly getInflationGovernor: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getInflationRate: RpcMethodSpec<readonly [], JsonValue>\n readonly getInflationReward: RpcMethodSpec<\n readonly [addresses: readonly string[], config?: SolanaConfig],\n JsonValue\n >\n readonly getLargestAccounts: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getLatestBlockhash: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getLeaderSchedule: RpcMethodSpec<\n readonly [slot?: number | null, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getMaxRetransmitSlot: RpcMethodSpec<readonly [], number>\n readonly getMaxShredInsertSlot: RpcMethodSpec<readonly [], number>\n readonly getMinimumBalanceForRentExemption: RpcMethodSpec<\n readonly [dataLength: number, config?: SolanaConfig],\n number\n >\n readonly getMultipleAccounts: RpcMethodSpec<\n readonly [addresses: readonly string[], config?: SolanaConfig],\n SolanaContextResult<JsonValue>\n >\n readonly getParsedTransaction: RpcMethodSpec<\n readonly [signature: string, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getPriorityFeeEstimate: RpcMethodSpec<\n readonly [request: SolanaConfig],\n PriorityFeeEstimate\n >\n readonly getProgramAccounts: RpcMethodSpec<\n readonly [programAddress: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getProgramAccountsV2: RpcMethodSpec<\n readonly [programAddress: string, config: SolanaConfig],\n JsonValue\n >\n readonly getRecentPerformanceSamples: RpcMethodSpec<\n readonly [limit?: number],\n JsonValue\n >\n readonly getRecentPrioritizationFees: RpcMethodSpec<\n readonly [addresses?: readonly string[]],\n JsonValue\n >\n readonly getSignatureStatuses: RpcMethodSpec<\n readonly [signatures: readonly string[], config?: SolanaConfig],\n JsonValue\n >\n readonly getSignaturesForAddress: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getSlot: RpcMethodSpec<readonly [config?: SolanaConfig], number>\n readonly getSlotLeader: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n string\n >\n readonly getSlotLeaders: RpcMethodSpec<\n readonly [startSlot: number, limit: number],\n readonly string[]\n >\n readonly getStakeMinimumDelegation: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n SolanaContextResult<number>\n >\n readonly getSupply: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenAccountBalance: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenAccountsByDelegate: RpcMethodSpec<\n readonly [delegate: string, filter: SolanaConfig, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenAccountsByOwner: RpcMethodSpec<\n readonly [owner: string, filter: SolanaConfig, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenLargestAccounts: RpcMethodSpec<\n readonly [mint: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenSupply: RpcMethodSpec<\n readonly [mint: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getTransaction: RpcMethodSpec<\n readonly [signature: string, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getTransactionCount: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n number\n >\n readonly getVersion: RpcMethodSpec<readonly [], JsonObject>\n readonly getVoteAccounts: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly isBlockhashValid: RpcMethodSpec<\n readonly [blockhash: string, config?: SolanaConfig],\n SolanaContextResult<boolean>\n >\n readonly minimumLedgerSlot: RpcMethodSpec<readonly [], number>\n readonly requestAirdrop: RpcMethodSpec<\n readonly [address: string, lamports: number, config?: SolanaConfig],\n string\n >\n readonly sendTransaction: RpcMethodSpec<\n readonly [transaction: string, config?: SolanaConfig],\n string\n >\n readonly simulateTransaction: RpcMethodSpec<\n readonly [transaction: string, config?: SolanaConfig],\n JsonValue\n >\n}\n\nexport interface AssetRequest {\n readonly id: string\n readonly displayOptions?: Readonly<Record<string, boolean>>\n}\n\nexport interface AssetBatchRequest {\n readonly ids: readonly string[]\n readonly displayOptions?: Readonly<Record<string, boolean>>\n}\n\nexport interface AssetListRequest {\n readonly cursor?: string\n readonly limit?: number\n readonly page?: number\n readonly [key: string]: unknown\n}\n\nexport type IndexedAsset = Readonly<Record<string, unknown>>\nexport type IndexedAssetProof = Readonly<Record<string, unknown>>\n\nexport interface IndexedAssetList<TItem = IndexedAsset> {\n readonly cursor?: string\n readonly items: readonly TItem[]\n readonly limit?: number\n readonly page?: number\n readonly total?: number\n readonly [key: string]: unknown\n}\n\nexport interface SolanaDasSchema {\n readonly getAsset: RpcMethodSpec<AssetRequest, IndexedAsset | null>\n readonly getAssetBatch: RpcMethodSpec<\n AssetBatchRequest,\n readonly (IndexedAsset | null)[]\n >\n readonly getAssetProof: RpcMethodSpec<AssetRequest, IndexedAssetProof | null>\n readonly getAssetProofBatch: RpcMethodSpec<\n AssetBatchRequest,\n readonly (IndexedAssetProof | null)[]\n >\n readonly getAssetsByAuthority: RpcMethodSpec<\n AssetListRequest & { readonly authorityAddress: string },\n IndexedAssetList\n >\n readonly getAssetsByCreator: RpcMethodSpec<\n AssetListRequest & {\n readonly creatorAddress: string\n readonly onlyVerified?: boolean\n },\n IndexedAssetList\n >\n readonly getAssetsByGroup: RpcMethodSpec<\n AssetListRequest & {\n readonly groupKey: string\n readonly groupValue: string\n },\n IndexedAssetList\n >\n readonly getAssetsByOwner: RpcMethodSpec<\n AssetListRequest & { readonly ownerAddress: string },\n IndexedAssetList\n >\n readonly getNftEditions: RpcMethodSpec<\n AssetListRequest & { readonly mint: string },\n Readonly<Record<string, unknown>>\n >\n readonly getSignaturesForAsset: RpcMethodSpec<\n AssetListRequest & { readonly id: string },\n Readonly<Record<string, unknown>>\n >\n readonly getTokenAccounts: RpcMethodSpec<\n AssetListRequest,\n Readonly<Record<string, unknown>>\n >\n readonly getTokensByDelegate: RpcMethodSpec<\n AssetListRequest & { readonly delegate: string },\n Readonly<Record<string, unknown>>\n >\n readonly getTokensByOwner: RpcMethodSpec<\n AssetListRequest & { readonly owner: string },\n Readonly<Record<string, unknown>>\n >\n readonly searchAssets: RpcMethodSpec<AssetListRequest, IndexedAssetList>\n}\n\nexport interface NumericFilter {\n readonly eq?: number\n readonly gt?: number\n readonly gte?: number\n readonly lt?: number\n readonly lte?: number\n}\n\nexport interface AddressTransactionsOptions {\n readonly before?: string\n readonly commitment?: SolanaCommitment\n readonly encoding?: 'base58' | 'base64' | 'json'\n readonly filters?: Readonly<Record<string, unknown>>\n readonly limit?: number\n readonly maxSupportedTransactionVersion?: number\n readonly paginationToken?: string\n readonly sortOrder?: 'asc' | 'desc'\n readonly transactionDetails?: 'full' | 'signatures'\n readonly until?: string\n}\n\nexport interface AddressTransaction {\n readonly blockTime: number | null\n readonly confirmationStatus: SolanaCommitment\n readonly err: unknown\n readonly memo: string | null\n readonly meta?: unknown\n readonly signature: string\n readonly slot: number\n readonly transaction?: unknown\n readonly transactionIndex: number\n readonly version?: unknown\n readonly [key: string]: unknown\n}\n\nexport interface AddressTransactionPage {\n readonly data: readonly AddressTransaction[]\n readonly paginationToken: string | null\n readonly windowStart: number | null\n}\n\nexport interface AddressTransfersOptions {\n readonly commitment?: SolanaCommitment\n readonly direction?: 'any' | 'in' | 'out'\n readonly filters?: {\n readonly amount?: NumericFilter\n readonly blockTime?: NumericFilter\n readonly slot?: NumericFilter\n }\n readonly limit?: number\n readonly mint?: string\n readonly paginationToken?: string\n readonly solMode?: 'merged' | 'separate'\n readonly sortOrder?: 'asc' | 'desc'\n readonly with?: string\n}\n\nexport interface AddressTransfer {\n readonly amount: string\n readonly blockTime: number | null\n readonly confirmationStatus: 'finalized'\n readonly decimals: number\n readonly feeAmount: string | null\n readonly feeUiAmount: string | null\n readonly fromTokenAccount: string | null\n readonly fromUserAccount: string | null\n readonly innerInstructionIdx: number\n readonly instructionIdx: number\n readonly mint: string | null\n readonly signature: string\n readonly slot: number\n readonly toTokenAccount: string | null\n readonly toUserAccount: string | null\n readonly transactionIdx: number\n readonly type:\n | 'burn'\n | 'changeOwner'\n | 'mint'\n | 'transfer'\n | 'unwrap'\n | 'withdrawWithheldFee'\n | 'wrap'\n readonly uiAmount: string\n readonly [key: string]: unknown\n}\n\nexport interface AddressTransferPage {\n readonly data: readonly AddressTransfer[]\n readonly paginationToken: string | null\n readonly windowStart: number | null\n}\n\nexport interface SolanaHistorySchema {\n readonly getTransactionsForAddress: RpcMethodSpec<\n readonly [address: string, options?: AddressTransactionsOptions],\n AddressTransactionPage | null\n >\n readonly getTransfersByAddress: RpcMethodSpec<\n readonly [address: string, options?: AddressTransfersOptions],\n AddressTransferPage\n >\n}\n\nexport interface PingMeasurement {\n readonly city: string | null\n readonly country: string | null\n readonly fromIp: string | null\n readonly icmpReplied: boolean\n readonly lat: number | null\n readonly lon: number | null\n readonly measuredAt: string | null\n readonly ms: number | null\n readonly org: string | null\n readonly postal: string | null\n readonly region: string | null\n readonly timezone: string | null\n readonly [key: string]: unknown\n}\n\nexport interface LeaderSlot {\n readonly epoch: number\n readonly featureSet: string | null\n readonly gossipPort: number | null\n readonly gossipUpdatedAt: string | null\n readonly identity: string\n readonly ipAddress: string | null\n readonly leaderCity: string | null\n readonly leaderCountry: string | null\n readonly leaderLat: number | null\n readonly leaderLon: number | null\n readonly leaderOrg: string | null\n readonly leaderRegion: string | null\n readonly leaderTimezone: string | null\n readonly pingToLeaders: readonly PingMeasurement[]\n readonly rpcAddress: string | null\n readonly slot: string\n readonly stakeWeight: number\n readonly tpuPort: number | null\n readonly tpuQuicPort: number | null\n readonly version: string | null\n readonly [key: string]: unknown\n}\n\nexport interface LeaderSlotsResult {\n readonly data: readonly LeaderSlot[]\n readonly message: string\n readonly success: boolean\n readonly total: number\n readonly [key: string]: unknown\n}\n\nexport interface ValidatorInformation\n extends Omit<LeaderSlot, 'epoch' | 'slot'> {\n readonly gossipNodeId: number | null\n readonly slotCount: number\n}\n\nexport interface ValidatorsInformationOptions {\n readonly country?: string\n readonly limit?: number\n readonly region?: string\n}\n\nexport interface ValidatorsInformationResult {\n readonly data: readonly ValidatorInformation[]\n readonly epoch: number\n readonly message: string\n readonly success: boolean\n readonly total: number\n readonly totalValidators: number\n readonly [key: string]: unknown\n}\n\nexport interface SolanaLeaderSchema {\n readonly getLeaderSlots: RpcMethodSpec<\n readonly [slot: number],\n LeaderSlotsResult\n >\n readonly getValidatorsInformation: RpcMethodSpec<\n readonly [options: ValidatorsInformationOptions],\n ValidatorsInformationResult\n >\n}\n\nexport type AnalyticsTimeBound = number | string\n\nexport interface TopProgramsOptions {\n readonly includeVotes?: boolean\n readonly limit?: number\n readonly since?: AnalyticsTimeBound\n readonly until?: AnalyticsTimeBound\n}\n\nexport interface TopProgramRow {\n readonly errors: string\n readonly invocations: string\n readonly program: string\n readonly total_cus: string\n readonly [key: string]: unknown\n}\n\nexport type SlotStatsOptions =\n | { readonly slot: number }\n | { readonly fromSlot: number; readonly toSlot: number }\n\nexport interface SlotStatsRow {\n readonly block_time: number\n readonly non_vote_transaction_count: number\n readonly slot: number\n readonly transaction_count: number\n readonly vote_transaction_count: number\n readonly [key: string]: unknown\n}\n\nexport interface TpsTimeseriesOptions {\n readonly bucketSec?: number\n readonly from: AnalyticsTimeBound\n readonly to: AnalyticsTimeBound\n}\n\nexport interface TpsBucket {\n readonly bucket: number\n readonly non_vote_tps: number\n readonly total_tps: number\n readonly [key: string]: unknown\n}\n\nexport interface EpochSummary {\n readonly distinct_programs: string\n readonly epoch: number\n readonly first_block_time: number\n readonly last_block_time: number\n readonly non_vote_txs: string\n readonly program_invocations: string\n readonly slots: string\n readonly total_txs: string\n readonly vote_txs: string\n readonly [key: string]: unknown\n}\n\nexport interface ProgramStatsOptions {\n readonly bucketSec?: number\n readonly programIdBase58: string\n readonly since?: AnalyticsTimeBound\n readonly until?: AnalyticsTimeBound\n}\n\nexport interface ProgramStatsBucket {\n readonly bucket: number\n readonly errors: string\n readonly invocations: string\n readonly total_cus: string\n readonly [key: string]: unknown\n}\n\nexport interface SolanaAnalyticsSchema {\n readonly jetEpochSummary: RpcMethodSpec<\n readonly [options: { readonly epoch: number }],\n EpochSummary | null\n >\n readonly jetProgramStats: RpcMethodSpec<\n readonly [options: ProgramStatsOptions],\n readonly ProgramStatsBucket[]\n >\n readonly jetSlotStats: RpcMethodSpec<\n readonly [options: SlotStatsOptions],\n readonly SlotStatsRow[]\n >\n readonly jetTopPrograms: RpcMethodSpec<\n readonly [options: TopProgramsOptions],\n readonly TopProgramRow[]\n >\n readonly jetTpsTimeseries: RpcMethodSpec<\n readonly [options: TpsTimeseriesOptions],\n readonly TpsBucket[]\n >\n}\n\nexport const SOLANA_RPC_METHODS = [\n 'getAccountInfo',\n 'getBalance',\n 'getBlock',\n 'getBlockCommitment',\n 'getBlockHeight',\n 'getBlockProduction',\n 'getBlockTime',\n 'getBlocks',\n 'getBlocksWithLimit',\n 'getClusterNodes',\n 'getEpochInfo',\n 'getEpochSchedule',\n 'getFeeForMessage',\n 'getFirstAvailableBlock',\n 'getGenesisHash',\n 'getHealth',\n 'getHighestSnapshotSlot',\n 'getIdentity',\n 'getInflationGovernor',\n 'getInflationRate',\n 'getInflationReward',\n 'getLargestAccounts',\n 'getLatestBlockhash',\n 'getLeaderSchedule',\n 'getMaxRetransmitSlot',\n 'getMaxShredInsertSlot',\n 'getMinimumBalanceForRentExemption',\n 'getMultipleAccounts',\n 'getParsedTransaction',\n 'getPriorityFeeEstimate',\n 'getProgramAccounts',\n 'getProgramAccountsV2',\n 'getRecentPerformanceSamples',\n 'getRecentPrioritizationFees',\n 'getSignatureStatuses',\n 'getSignaturesForAddress',\n 'getSlot',\n 'getSlotLeader',\n 'getSlotLeaders',\n 'getStakeMinimumDelegation',\n 'getSupply',\n 'getTokenAccountBalance',\n 'getTokenAccountsByDelegate',\n 'getTokenAccountsByOwner',\n 'getTokenLargestAccounts',\n 'getTokenSupply',\n 'getTransaction',\n 'getTransactionCount',\n 'getVersion',\n 'getVoteAccounts',\n 'isBlockhashValid',\n 'minimumLedgerSlot',\n 'requestAirdrop',\n 'sendTransaction',\n 'simulateTransaction',\n] as const satisfies readonly (keyof SolanaRpcSchema)[]\n\nexport const SOLANA_DAS_METHODS = [\n 'getAsset',\n 'getAssetBatch',\n 'getAssetProof',\n 'getAssetProofBatch',\n 'getAssetsByAuthority',\n 'getAssetsByCreator',\n 'getAssetsByGroup',\n 'getAssetsByOwner',\n 'getNftEditions',\n 'getSignaturesForAsset',\n 'getTokenAccounts',\n 'getTokensByDelegate',\n 'getTokensByOwner',\n 'searchAssets',\n] as const satisfies readonly (keyof SolanaDasSchema)[]\n\nexport const SOLANA_HISTORY_METHODS = [\n 'getTransactionsForAddress',\n 'getTransfersByAddress',\n] as const satisfies readonly (keyof SolanaHistorySchema)[]\n\nexport const SOLANA_LEADER_METHODS = [\n 'getLeaderSlots',\n 'getValidatorsInformation',\n] as const satisfies readonly (keyof SolanaLeaderSchema)[]\n\nexport const SOLANA_ANALYTICS_METHODS = [\n 'jetEpochSummary',\n 'jetProgramStats',\n 'jetSlotStats',\n 'jetTopPrograms',\n 'jetTpsTimeseries',\n] as const satisfies readonly (keyof SolanaAnalyticsSchema)[]\n\nconst heavyRpcMethods = new Set<string>([\n 'getPriorityFeeEstimate',\n 'getProgramAccounts',\n 'getProgramAccountsV2',\n 'getTokenLargestAccounts',\n])\n\nconst validateStandardBatch = (calls: readonly RpcBatchCall[]) => {\n let containsHeavy = false\n let containsStandard = false\n for (const call of calls) {\n if (heavyRpcMethods.has(call.method)) containsHeavy = true\n else containsStandard = true\n }\n if (containsHeavy && containsStandard) {\n throw new ErpcBatchPolicyError(\n 'Solana indexed and standard RPC methods cannot share a batch',\n )\n }\n}\n\nconst rejectLeaderBatch = (calls: readonly RpcBatchCall[]) => {\n if (calls.length > 0) {\n throw new ErpcBatchPolicyError('Leader RPC methods do not support batching')\n }\n}\n\nexport interface SolanaClient {\n readonly analytics: RpcNamespace<SolanaAnalyticsSchema>\n readonly das: RpcNamespace<SolanaDasSchema>\n readonly history: RpcNamespace<SolanaHistorySchema>\n readonly leaders: RpcNamespace<SolanaLeaderSchema>\n readonly rpc: RpcNamespace<SolanaRpcSchema>\n}\n\nexport const createSolanaClient = (\n transport: HttpJsonRpcTransport,\n): SolanaClient => ({\n rpc: createRpcNamespace<SolanaRpcSchema>({\n transport,\n parameterMode: 'positional',\n validateBatch: validateStandardBatch,\n }),\n das: createRpcNamespace<SolanaDasSchema>({\n transport,\n parameterMode: 'named',\n }),\n history: createRpcNamespace<SolanaHistorySchema>({\n transport,\n parameterMode: 'positional',\n }),\n leaders: createRpcNamespace<SolanaLeaderSchema>({\n transport,\n parameterMode: 'positional',\n validateBatch: rejectLeaderBatch,\n }),\n analytics: createRpcNamespace<SolanaAnalyticsSchema>({\n transport,\n parameterMode: 'positional',\n }),\n})\n","import {\n ErpcAbortedError,\n ErpcConfigError,\n ErpcInvalidResponseError,\n ErpcJsonRpcError,\n ErpcTimeoutError,\n ErpcTransportError,\n redactJsonRpcError,\n} from '../errors'\nimport type { JsonRpcTransport } from '../rpc/client'\nimport type {\n JsonRpcErrorObject,\n JsonRpcId,\n JsonRpcParams,\n RpcBatchCall,\n RpcSendOptions,\n} from '../rpc/types'\n\nexport interface RpcNotification {\n readonly jsonrpc: '2.0'\n readonly method: string\n readonly params: unknown\n}\n\nexport type RpcNotificationListener = (notification: RpcNotification) => void\n\nexport interface WebSocketTransportConfig {\n readonly endpoint: URL\n readonly maxBatchSize?: number\n readonly timeoutMs: number\n readonly webSocket?: typeof globalThis.WebSocket\n}\n\ninterface PendingResponse {\n readonly cleanup: () => void\n readonly reject: (reason: unknown) => void\n readonly resolve: (value: unknown) => void\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isRpcError = (value: unknown): value is JsonRpcErrorObject =>\n isObject(value) &&\n typeof value.code === 'number' &&\n typeof value.message === 'string'\n\nconst publicEndpoint = (endpoint: URL): string => {\n const url = new URL(endpoint)\n url.search = ''\n url.hash = ''\n return url.toString()\n}\n\nexport class WebSocketJsonRpcTransport implements JsonRpcTransport {\n readonly endpoint: string\n readonly maxBatchSize: number\n\n readonly #connectionUrl: string\n readonly #credential: string | undefined\n readonly #listeners = new Set<RpcNotificationListener>()\n readonly #pending = new Map<JsonRpcId, PendingResponse>()\n readonly #timeoutMs: number\n readonly #webSocket?: typeof globalThis.WebSocket\n #connectPromise: Promise<void> | undefined\n #nextId = 1\n #socket: WebSocket | undefined\n\n constructor(config: WebSocketTransportConfig) {\n const implementation = config.webSocket ?? globalThis.WebSocket\n if (typeof implementation === 'function') this.#webSocket = implementation\n this.#credential = config.endpoint.searchParams.get('api-key') ?? undefined\n this.#connectionUrl = config.endpoint.toString()\n this.endpoint = publicEndpoint(config.endpoint)\n this.maxBatchSize = config.maxBatchSize ?? 256\n this.#timeoutMs = config.timeoutMs\n }\n\n async connect(): Promise<void> {\n if (this.#socket?.readyState === 1) return\n if (this.#connectPromise) return this.#connectPromise\n if (!this.#webSocket) {\n throw new ErpcConfigError(\n 'A WebSocket implementation is required for subscriptions',\n )\n }\n\n this.#connectPromise = new Promise<void>((resolve, reject) => {\n const socket = new this.#webSocket!(this.#connectionUrl)\n this.#socket = socket\n\n const timeout = setTimeout(() => {\n socket.close()\n reject(new ErpcTimeoutError(this.#timeoutMs))\n }, this.#timeoutMs)\n\n socket.addEventListener(\n 'open',\n () => {\n clearTimeout(timeout)\n resolve()\n },\n { once: true },\n )\n socket.addEventListener(\n 'error',\n () => {\n clearTimeout(timeout)\n reject(new ErpcTransportError('Unable to connect to ERPC WebSocket'))\n },\n { once: true },\n )\n socket.addEventListener('message', (event: MessageEvent<unknown>) => {\n void this.#onMessage(event.data)\n })\n socket.addEventListener('close', () => {\n this.#socket = undefined\n this.#connectPromise = undefined\n const error = new ErpcTransportError('ERPC WebSocket connection closed')\n for (const pending of this.#pending.values()) pending.reject(error)\n this.#pending.clear()\n })\n }).catch((error: unknown) => {\n this.#connectPromise = undefined\n throw error\n })\n\n return this.#connectPromise\n }\n\n close(code = 1000, reason = 'Client closed connection'): void {\n this.#socket?.close(code, reason)\n this.#socket = undefined\n this.#connectPromise = undefined\n }\n\n onNotification(listener: RpcNotificationListener): () => void {\n this.#listeners.add(listener)\n return () => this.#listeners.delete(listener)\n }\n\n async request<TResult>(\n method: string,\n params?: JsonRpcParams,\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n await this.connect()\n const id = this.#id()\n const promise = this.#waitFor<TResult>(id, options)\n const request: Record<string, unknown> = { jsonrpc: '2.0', id, method }\n if (params !== undefined) request.params = params\n this.#send(request, id)\n return promise\n }\n\n async batch<TResult extends readonly unknown[]>(\n calls: readonly RpcBatchCall[],\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n if (calls.length === 0) return [] as unknown as TResult\n if (calls.length > this.maxBatchSize) {\n throw new ErpcInvalidResponseError(\n `A batch may contain at most ${this.maxBatchSize} calls`,\n )\n }\n\n await this.connect()\n const requests = calls.map((call) => {\n const id = this.#id()\n const request: Record<string, unknown> = {\n jsonrpc: '2.0',\n id,\n method: call.method,\n }\n if (call.params !== undefined) request.params = call.params\n return { id, request, response: this.#waitFor(id, options) }\n })\n\n try {\n this.#socket?.send(JSON.stringify(requests.map(({ request }) => request)))\n } catch (error) {\n for (const { id } of requests) this.#reject(id, error)\n }\n return Promise.all(requests.map(({ response }) => response)) as unknown as Promise<TResult>\n }\n\n #id(): number {\n const id = this.#nextId\n this.#nextId = id >= Number.MAX_SAFE_INTEGER ? 1 : id + 1\n return id\n }\n\n #send(request: unknown, id: JsonRpcId): void {\n try {\n this.#socket?.send(JSON.stringify(request))\n } catch (error) {\n this.#reject(id, error)\n }\n }\n\n #waitFor<TResult>(\n id: JsonRpcId,\n options: RpcSendOptions,\n ): Promise<TResult> {\n return new Promise<TResult>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.#pending.delete(id)\n reject(new ErpcTimeoutError(this.#timeoutMs))\n }, this.#timeoutMs)\n\n const abort = () => {\n clearTimeout(timeout)\n this.#pending.delete(id)\n reject(new ErpcAbortedError())\n }\n options.signal?.addEventListener('abort', abort, { once: true })\n\n const cleanup = () => {\n clearTimeout(timeout)\n options.signal?.removeEventListener('abort', abort)\n }\n this.#pending.set(id, {\n resolve: (value) => resolve(value as TResult),\n reject,\n cleanup,\n })\n if (options.signal?.aborted) abort()\n })\n }\n\n #reject(id: JsonRpcId, _reason: unknown): void {\n const pending = this.#pending.get(id)\n if (!pending) return\n pending.cleanup()\n this.#pending.delete(id)\n // A custom WebSocket implementation may include its connection URL in a\n // thrown error, so never retain the original error as a public cause.\n pending.reject(\n new ErpcTransportError('Unable to send ERPC WebSocket request'),\n )\n }\n\n async #onMessage(data: unknown): Promise<void> {\n const text = await this.#messageText(data)\n if (text === null) return\n\n let parsed: unknown\n try {\n parsed = JSON.parse(text) as unknown\n } catch {\n return\n }\n\n if (Array.isArray(parsed)) {\n for (const item of parsed) this.#dispatch(item)\n } else {\n this.#dispatch(parsed)\n }\n }\n\n async #messageText(data: unknown): Promise<string | null> {\n if (typeof data === 'string') return data\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data)\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength),\n )\n }\n if (typeof Blob !== 'undefined' && data instanceof Blob) return data.text()\n return null\n }\n\n #dispatch(message: unknown): void {\n if (!isObject(message)) return\n const id = message.id\n if (typeof id === 'number' || typeof id === 'string') {\n const pending = this.#pending.get(id)\n if (!pending) return\n pending.cleanup()\n this.#pending.delete(id)\n if (isRpcError(message.error)) {\n pending.reject(\n new ErpcJsonRpcError(\n redactJsonRpcError(message.error, this.#credential),\n ),\n )\n }\n else if ('result' in message) pending.resolve(message.result)\n else pending.reject(new ErpcInvalidResponseError())\n return\n }\n\n if (\n message.jsonrpc === '2.0' &&\n typeof message.method === 'string' &&\n 'params' in message\n ) {\n const notification: RpcNotification = {\n jsonrpc: '2.0',\n method: message.method,\n params: message.params,\n }\n for (const listener of this.#listeners) listener(notification)\n }\n }\n}\n","import { createRpcNamespace, type RpcNamespace } from './rpc/client'\nimport type { EthereumSubscriptionSchema } from './rpc/ethereum'\nimport type { RpcMethodSpec } from './rpc/types'\nimport {\n WebSocketJsonRpcTransport,\n type RpcNotification,\n type RpcNotificationListener,\n} from './transport/websocket'\n\nexport type SubscriptionId = number | string\nexport type SubscriptionListener<TResult> = (result: TResult) => void\n\ninterface NotificationParams {\n readonly result: unknown\n readonly subscription: SubscriptionId\n}\n\nconst notificationParams = (\n notification: RpcNotification,\n): NotificationParams | null => {\n if (typeof notification.params !== 'object' || notification.params === null) {\n return null\n }\n const params = notification.params as Record<string, unknown>\n if (\n (typeof params.subscription !== 'number' &&\n typeof params.subscription !== 'string') ||\n !('result' in params)\n ) {\n return null\n }\n return {\n subscription: params.subscription,\n result: params.result,\n }\n}\n\nexport class RpcSubscription<TId extends SubscriptionId = SubscriptionId> {\n readonly id: TId\n readonly #unsubscribe: () => Promise<boolean>\n #closed = false\n\n constructor(id: TId, unsubscribe: () => Promise<boolean>) {\n this.id = id\n this.#unsubscribe = unsubscribe\n }\n\n async unsubscribe(): Promise<boolean> {\n if (this.#closed) return true\n const result = await this.#unsubscribe()\n if (result) this.#closed = true\n return result\n }\n}\n\nexport class EthereumSubscriptions {\n readonly rpc: RpcNamespace<EthereumSubscriptionSchema>\n readonly #transport: WebSocketJsonRpcTransport\n\n constructor(transport: WebSocketJsonRpcTransport) {\n this.#transport = transport\n this.rpc = createRpcNamespace<EthereumSubscriptionSchema>({\n transport,\n parameterMode: 'positional',\n })\n }\n\n close(): void {\n this.#transport.close()\n }\n\n onNotification(listener: RpcNotificationListener): () => void {\n return this.#transport.onNotification(listener)\n }\n\n async subscribe<TResult = unknown>(\n subscription: string,\n listener: SubscriptionListener<TResult>,\n ...options: readonly unknown[]\n ): Promise<RpcSubscription<string>> {\n let id: string | undefined\n const removeListener = this.#transport.onNotification((notification) => {\n const params = notificationParams(notification)\n if (params && params.subscription === id) listener(params.result as TResult)\n })\n\n try {\n id = await this.#transport.request<string>('eth_subscribe', [\n subscription,\n ...options,\n ])\n } catch (error) {\n removeListener()\n throw error\n }\n\n return new RpcSubscription(id, async () => {\n const result = await this.#transport.request<boolean>('eth_unsubscribe', [\n id,\n ])\n if (result) removeListener()\n return result\n })\n }\n}\n\nexport interface SolanaEnhancedSubscriptionSchema {\n readonly accountSubscribe: RpcMethodSpec<\n readonly [address: string, options?: Readonly<Record<string, unknown>>],\n number\n >\n readonly accountUnsubscribe: RpcMethodSpec<\n readonly [subscriptionId: number],\n boolean\n >\n readonly transactionSubscribe: RpcMethodSpec<\n readonly [\n filter: Readonly<Record<string, unknown>>,\n options?: Readonly<Record<string, unknown>>,\n ],\n number\n >\n readonly transactionUnsubscribe: RpcMethodSpec<\n readonly [subscriptionId: number],\n boolean\n >\n}\n\nexport const SOLANA_ENHANCED_SUBSCRIPTION_METHODS = [\n 'accountSubscribe',\n 'accountUnsubscribe',\n 'transactionSubscribe',\n 'transactionUnsubscribe',\n] as const satisfies readonly (keyof SolanaEnhancedSubscriptionSchema)[]\n\nexport class SolanaSubscriptions {\n readonly rpc: RpcNamespace<SolanaEnhancedSubscriptionSchema>\n readonly #transport: WebSocketJsonRpcTransport\n\n constructor(transport: WebSocketJsonRpcTransport) {\n this.#transport = transport\n this.rpc = createRpcNamespace<SolanaEnhancedSubscriptionSchema>({\n transport,\n parameterMode: 'positional',\n })\n }\n\n close(): void {\n this.#transport.close()\n }\n\n onNotification(listener: RpcNotificationListener): () => void {\n return this.#transport.onNotification(listener)\n }\n\n accountSubscribe<TResult = unknown>(\n address: string,\n listener: SubscriptionListener<TResult>,\n options?: Readonly<Record<string, unknown>>,\n ): Promise<RpcSubscription<number>> {\n const params = options === undefined ? [address] : [address, options]\n return this.#subscribe<number, TResult>(\n 'accountSubscribe',\n params,\n 'accountUnsubscribe',\n listener,\n )\n }\n\n transactionSubscribe<TResult = unknown>(\n filter: Readonly<Record<string, unknown>>,\n listener: SubscriptionListener<TResult>,\n options?: Readonly<Record<string, unknown>>,\n ): Promise<RpcSubscription<number>> {\n const params = options === undefined ? [filter] : [filter, options]\n return this.#subscribe<number, TResult>(\n 'transactionSubscribe',\n params,\n 'transactionUnsubscribe',\n listener,\n )\n }\n\n async rawSubscribe<TResult = unknown>(\n subscribeMethod: string,\n params: readonly unknown[],\n unsubscribeMethod: string,\n listener: SubscriptionListener<TResult>,\n ): Promise<RpcSubscription> {\n return this.#subscribe(\n subscribeMethod,\n params,\n unsubscribeMethod,\n listener,\n )\n }\n\n async #subscribe<TId extends SubscriptionId, TResult>(\n subscribeMethod: string,\n params: readonly unknown[],\n unsubscribeMethod: string,\n listener: SubscriptionListener<TResult>,\n ): Promise<RpcSubscription<TId>> {\n let id: TId | undefined\n const removeListener = this.#transport.onNotification((notification) => {\n const value = notificationParams(notification)\n if (value && value.subscription === id) listener(value.result as TResult)\n })\n\n try {\n id = await this.#transport.request<TId>(subscribeMethod, params)\n } catch (error) {\n removeListener()\n throw error\n }\n\n return new RpcSubscription(id, async () => {\n const result = await this.#transport.request<boolean>(unsubscribeMethod, [\n id,\n ])\n if (result) removeListener()\n return result\n })\n }\n}\n","import {\n ErpcAbortedError,\n ErpcHttpError,\n ErpcInvalidResponseError,\n ErpcJsonRpcError,\n ErpcTimeoutError,\n ErpcTransportError,\n redactJsonRpcError,\n} from '../errors'\nimport type {\n JsonRpcFailure,\n JsonRpcId,\n JsonRpcParams,\n JsonRpcRequest,\n JsonRpcResponse,\n RpcBatchCall,\n RpcSendOptions,\n} from '../rpc/types'\n\nexport interface HttpTransportConfig {\n readonly apiKey: string\n readonly endpoint: URL\n readonly fetch: typeof globalThis.fetch\n readonly headers: Readonly<Record<string, string>>\n readonly maxBatchSize?: number\n readonly timeoutMs: number\n}\n\ninterface ControlledSignal {\n readonly cleanup: () => void\n readonly signal: AbortSignal\n readonly timedOut: () => boolean\n}\n\nconst controlledSignal = (\n timeoutMs: number,\n external?: AbortSignal,\n): ControlledSignal => {\n const controller = new AbortController()\n let didTimeOut = false\n\n const timeout = setTimeout(() => {\n didTimeOut = true\n controller.abort()\n }, timeoutMs)\n\n const abort = () => controller.abort()\n if (external?.aborted) controller.abort()\n else external?.addEventListener('abort', abort, { once: true })\n\n return {\n signal: controller.signal,\n timedOut: () => didTimeOut,\n cleanup: () => {\n clearTimeout(timeout)\n external?.removeEventListener('abort', abort)\n },\n }\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isFailure = (value: unknown): value is JsonRpcFailure =>\n isObject(value) &&\n isObject(value.error) &&\n typeof value.error.code === 'number' &&\n typeof value.error.message === 'string'\n\nconst parseJson = (text: string): unknown => {\n try {\n return JSON.parse(text) as unknown\n } catch {\n throw new ErpcInvalidResponseError('ERPC returned malformed JSON')\n }\n}\n\nexport class HttpJsonRpcTransport {\n readonly endpoint: string\n readonly maxBatchSize: number\n\n readonly #apiKey: string\n readonly #fetch: typeof globalThis.fetch\n readonly #headers: Readonly<Record<string, string>>\n readonly #timeoutMs: number\n #nextId = 1\n\n constructor(config: HttpTransportConfig) {\n this.#apiKey = config.apiKey\n this.#fetch = config.fetch\n this.#headers = config.headers\n this.#timeoutMs = config.timeoutMs\n this.maxBatchSize = config.maxBatchSize ?? 256\n\n const endpoint = new URL(config.endpoint)\n endpoint.search = ''\n endpoint.hash = ''\n this.endpoint = endpoint.toString()\n }\n\n async request<TResult>(\n method: string,\n params?: JsonRpcParams,\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n const id = this.#id()\n const request = this.#request(id, method, params)\n const response = await this.#post(request, options)\n return this.#unwrap<TResult>(response, id)\n }\n\n async batch<TResult extends readonly unknown[]>(\n calls: readonly RpcBatchCall[],\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n if (calls.length === 0) return [] as unknown as TResult\n if (calls.length > this.maxBatchSize) {\n throw new ErpcInvalidResponseError(\n `A batch may contain at most ${this.maxBatchSize} calls`,\n )\n }\n\n const requests = calls.map((call) => {\n const id = this.#id()\n return this.#request(id, call.method, call.params)\n })\n const raw = await this.#post(requests, options)\n if (!Array.isArray(raw)) {\n if (isFailure(raw)) {\n throw new ErpcJsonRpcError(redactJsonRpcError(raw.error, this.#apiKey))\n }\n throw new ErpcInvalidResponseError('ERPC returned a non-array batch response')\n }\n\n const byId = new Map<JsonRpcId, unknown>()\n for (const response of raw) {\n if (!isObject(response) || !('id' in response)) {\n throw new ErpcInvalidResponseError('ERPC returned an invalid batch item')\n }\n const id = response.id\n if (typeof id !== 'number' && typeof id !== 'string') {\n throw new ErpcInvalidResponseError('ERPC returned an invalid batch id')\n }\n byId.set(id, response)\n }\n\n const results = requests.map((request) => {\n const response = byId.get(request.id)\n if (response === undefined) {\n throw new ErpcInvalidResponseError(\n `ERPC omitted batch response id ${String(request.id)}`,\n )\n }\n return this.#unwrap(response, request.id)\n })\n return results as unknown as TResult\n }\n\n #id(): number {\n const id = this.#nextId\n this.#nextId = id >= Number.MAX_SAFE_INTEGER ? 1 : id + 1\n return id\n }\n\n #request(\n id: JsonRpcId,\n method: string,\n params?: JsonRpcParams,\n ): JsonRpcRequest<JsonRpcParams> {\n const request: {\n jsonrpc: '2.0'\n id: JsonRpcId\n method: string\n params?: JsonRpcParams\n } = { jsonrpc: '2.0', id, method }\n if (params !== undefined) request.params = params\n return request\n }\n\n async #post(\n body: unknown,\n options: RpcSendOptions,\n ): Promise<unknown> {\n const url = new URL(this.endpoint)\n url.searchParams.set('api-key', this.#apiKey)\n const controlled = controlledSignal(this.#timeoutMs, options.signal)\n\n try {\n const response = await this.#fetch(url, {\n method: 'POST',\n headers: {\n ...this.#headers,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n signal: controlled.signal,\n })\n const text = await response.text()\n if (!response.ok) throw new ErpcHttpError(response.status)\n return parseJson(text)\n } catch (error) {\n if (error instanceof ErpcHttpError || error instanceof ErpcInvalidResponseError) {\n throw error\n }\n if (controlled.timedOut()) throw new ErpcTimeoutError(this.#timeoutMs)\n if (options.signal?.aborted) throw new ErpcAbortedError()\n // Do not retain the underlying fetch error: custom runtimes may include\n // the credential-bearing request URL or headers in its message.\n throw new ErpcTransportError('Unable to reach ERPC')\n } finally {\n controlled.cleanup()\n }\n }\n\n #unwrap<TResult>(response: unknown, expectedId: JsonRpcId): TResult {\n if (!isObject(response)) throw new ErpcInvalidResponseError()\n if (response.id !== expectedId) {\n throw new ErpcInvalidResponseError('ERPC returned an unexpected response id')\n }\n if (isFailure(response)) {\n throw new ErpcJsonRpcError(\n redactJsonRpcError(response.error, this.#apiKey),\n )\n }\n if (!('result' in response)) throw new ErpcInvalidResponseError()\n return (response as unknown as JsonRpcResponse<TResult> & { result: TResult })\n .result\n }\n}\n","import { ErpcConfigError, ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport interface MonthlyApiKeyMethodUsage {\n readonly count: number\n readonly creditCost: number\n readonly credits: number\n readonly method: string\n readonly updatedAt: string | null\n}\n\nexport interface MonthlyApiKeyChainUsage {\n readonly chain: string\n readonly count: number\n readonly credits: number\n readonly methods: readonly MonthlyApiKeyMethodUsage[]\n readonly updatedAt: string | null\n}\n\nexport interface MonthlyApiKeyUsageEntry {\n readonly apiKeyLast4: string\n readonly apiKeyLength: number\n readonly chains: readonly MonthlyApiKeyChainUsage[]\n readonly count: number\n readonly credits: number\n readonly keyId: number | null\n readonly updatedAt: string | null\n}\n\nexport interface MonthlyApiKeyUsage {\n readonly apiKeys: readonly MonthlyApiKeyUsageEntry[]\n readonly chains: readonly MonthlyApiKeyChainUsage[]\n readonly hasStrandedUsage: boolean\n readonly keyCount: number\n readonly totalCount: number\n readonly totalCredits: number\n readonly updatedAt: string | null\n readonly yearMonth: string\n}\n\nexport interface MonthlyApiKeyUsageParams {\n /** Calendar month in `YYYY-MM` format. The current month is used when omitted. */\n readonly yearMonth?: string\n}\n\nconst YEAR_MONTH = /^\\d{4}-(0[1-9]|1[0-2])$/\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst isTimestamp = (value: unknown): value is string | null =>\n value === null || typeof value === 'string'\n\nconst parseMethod = (value: unknown): MonthlyApiKeyMethodUsage | null => {\n const method = objectValue(value)\n if (\n method === null ||\n typeof method.count !== 'number' ||\n typeof method.creditCost !== 'number' ||\n typeof method.credits !== 'number' ||\n typeof method.method !== 'string' ||\n !isTimestamp(method.updatedAt)\n ) return null\n return {\n count: method.count,\n creditCost: method.creditCost,\n credits: method.credits,\n method: method.method,\n updatedAt: method.updatedAt,\n }\n}\n\nconst parseChain = (value: unknown): MonthlyApiKeyChainUsage | null => {\n const chain = objectValue(value)\n if (\n chain === null ||\n typeof chain.chain !== 'string' ||\n typeof chain.count !== 'number' ||\n typeof chain.credits !== 'number' ||\n !Array.isArray(chain.methods) ||\n !isTimestamp(chain.updatedAt)\n ) return null\n const methods = chain.methods.map(parseMethod)\n if (methods.some((method) => method === null)) return null\n return {\n chain: chain.chain,\n count: chain.count,\n credits: chain.credits,\n methods: methods as readonly MonthlyApiKeyMethodUsage[],\n updatedAt: chain.updatedAt,\n }\n}\n\nconst parseApiKey = (value: unknown): MonthlyApiKeyUsageEntry | null => {\n const apiKey = objectValue(value)\n if (\n apiKey === null ||\n typeof apiKey.apiKeyLast4 !== 'string' ||\n typeof apiKey.apiKeyLength !== 'number' ||\n !Array.isArray(apiKey.chains) ||\n typeof apiKey.count !== 'number' ||\n typeof apiKey.credits !== 'number' ||\n (apiKey.keyId !== null && typeof apiKey.keyId !== 'number') ||\n !isTimestamp(apiKey.updatedAt)\n ) return null\n const chains = apiKey.chains.map(parseChain)\n if (chains.some((chain) => chain === null)) return null\n return {\n apiKeyLast4: apiKey.apiKeyLast4,\n apiKeyLength: apiKey.apiKeyLength,\n chains: chains as readonly MonthlyApiKeyChainUsage[],\n count: apiKey.count,\n credits: apiKey.credits,\n keyId: apiKey.keyId,\n updatedAt: apiKey.updatedAt,\n }\n}\n\nconst parseMonthlyUsage = (value: unknown): MonthlyApiKeyUsage | null => {\n const usage = objectValue(value)\n if (\n usage === null ||\n !Array.isArray(usage.apiKeys) ||\n !Array.isArray(usage.chains) ||\n typeof usage.hasStrandedUsage !== 'boolean' ||\n typeof usage.keyCount !== 'number' ||\n typeof usage.totalCount !== 'number' ||\n typeof usage.totalCredits !== 'number' ||\n !isTimestamp(usage.updatedAt) ||\n typeof usage.yearMonth !== 'string' ||\n !YEAR_MONTH.test(usage.yearMonth)\n ) return null\n const apiKeys = usage.apiKeys.map(parseApiKey)\n const chains = usage.chains.map(parseChain)\n if (\n apiKeys.some((apiKey) => apiKey === null) ||\n chains.some((chain) => chain === null)\n ) return null\n return {\n apiKeys: apiKeys as readonly MonthlyApiKeyUsageEntry[],\n chains: chains as readonly MonthlyApiKeyChainUsage[],\n hasStrandedUsage: usage.hasStrandedUsage,\n keyCount: usage.keyCount,\n totalCount: usage.totalCount,\n totalCredits: usage.totalCredits,\n updatedAt: usage.updatedAt,\n yearMonth: usage.yearMonth,\n }\n}\n\nexport class UsageClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async getMonthlyApiKeyUsage(\n params: MonthlyApiKeyUsageParams = {},\n options?: RpcSendOptions,\n ): Promise<MonthlyApiKeyUsage> {\n if (params.yearMonth !== undefined && !YEAR_MONTH.test(params.yearMonth)) {\n throw new ErpcConfigError('yearMonth must use YYYY-MM format')\n }\n\n const response: unknown = await this.#transport.get(\n '/v3/user/api-keys/usage',\n { yearMonth: params.yearMonth },\n options,\n )\n const envelope = objectValue(response)\n const usage = envelope?.success === true\n ? parseMonthlyUsage(envelope.message)\n : null\n if (usage === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid monthly API key usage response',\n )\n }\n return usage\n }\n}\n","import { AccountClient } from './account'\nimport {\n endpointWithPath,\n resolveConfig,\n websocketUrl,\n type ErpcClientConfig,\n} from './config'\nimport { PriceClient } from './price'\nimport {\n createEthereumClient,\n type EthereumClient,\n} from './rpc/ethereum'\nimport { createSolanaClient, type SolanaClient } from './rpc/solana'\nimport {\n EthereumSubscriptions,\n SolanaSubscriptions,\n} from './subscriptions'\nimport { HttpJsonRpcTransport } from './transport/http'\nimport { RestTransport } from './transport/rest'\nimport { WebSocketJsonRpcTransport } from './transport/websocket'\nimport { UsageClient } from './usage'\n\nexport interface ErpcSolanaClient extends SolanaClient {\n readonly subscriptions: SolanaSubscriptions\n}\n\nexport interface ErpcEthereumClient extends EthereumClient {\n readonly subscriptions: EthereumSubscriptions\n}\n\nexport interface ErpcClient {\n readonly account: AccountClient\n readonly ethereum: ErpcEthereumClient\n readonly price: PriceClient\n readonly solana: ErpcSolanaClient\n readonly usage: UsageClient\n close(): void\n}\n\nexport const createErpcClient = (config: ErpcClientConfig): ErpcClient => {\n const resolved = resolveConfig(config)\n const sharedTransport = {\n apiKey: resolved.apiKey,\n fetch: resolved.fetch,\n headers: resolved.headers,\n timeoutMs: resolved.timeoutMs,\n }\n\n const solanaTransport = new HttpJsonRpcTransport({\n ...sharedTransport,\n endpoint: resolved.endpoint,\n })\n const ethereumEndpoint = endpointWithPath(resolved.endpoint, '/eth')\n const ethereumTransport = new HttpJsonRpcTransport({\n ...sharedTransport,\n endpoint: ethereumEndpoint,\n })\n\n const solanaWebSocket = new WebSocketJsonRpcTransport({\n endpoint: websocketUrl(resolved.endpoint, resolved.apiKey),\n timeoutMs: resolved.timeoutMs,\n ...(resolved.webSocket === undefined\n ? {}\n : { webSocket: resolved.webSocket }),\n })\n const ethereumWebSocket = new WebSocketJsonRpcTransport({\n endpoint: websocketUrl(resolved.endpoint, resolved.apiKey, '/eth'),\n timeoutMs: resolved.timeoutMs,\n ...(resolved.webSocket === undefined\n ? {}\n : { webSocket: resolved.webSocket }),\n })\n\n const priceTransport = new RestTransport({\n ...sharedTransport,\n endpoint: resolved.endpoint,\n })\n const accountTransport = new RestTransport({\n ...sharedTransport,\n endpoint: resolved.accountEndpoint,\n })\n const userTransport = new RestTransport({\n ...sharedTransport,\n endpoint: resolved.userEndpoint,\n })\n\n const solana: ErpcSolanaClient = {\n ...createSolanaClient(solanaTransport),\n subscriptions: new SolanaSubscriptions(solanaWebSocket),\n }\n const ethereum: ErpcEthereumClient = {\n ...createEthereumClient(ethereumTransport),\n subscriptions: new EthereumSubscriptions(ethereumWebSocket),\n }\n\n return {\n solana,\n ethereum,\n price: new PriceClient(priceTransport),\n account: new AccountClient(accountTransport),\n usage: new UsageClient(userTransport),\n close: () => {\n solana.subscriptions.close()\n ethereum.subscriptions.close()\n },\n }\n}\n","import { ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport type CloudCreditAlertLevel =\n | 'critical'\n | 'normal'\n | 'suspended'\n | 'warning'\n\nexport interface CloudCredit {\n readonly alertLevel: CloudCreditAlertLevel\n readonly balanceCents: number\n readonly burnRateCentsPerHour: number\n readonly quoteExpiresAt: string\n readonly quoteTimestamp: string\n readonly timeToZeroHours: number | null\n}\n\nconst alertLevels: readonly CloudCreditAlertLevel[] = [\n 'critical',\n 'normal',\n 'suspended',\n 'warning',\n]\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst isDateTime = (value: unknown): value is string =>\n typeof value === 'string' && Number.isFinite(Date.parse(value))\n\nconst parseCredit = (value: unknown): CloudCredit | null => {\n const credit = objectValue(value)\n if (\n credit === null ||\n typeof credit.balanceCents !== 'number' ||\n !Number.isInteger(credit.balanceCents) ||\n typeof credit.burnRateCentsPerHour !== 'number' ||\n !Number.isInteger(credit.burnRateCentsPerHour) ||\n credit.burnRateCentsPerHour < 0 ||\n (credit.timeToZeroHours !== null &&\n (typeof credit.timeToZeroHours !== 'number' ||\n !Number.isFinite(credit.timeToZeroHours) ||\n credit.timeToZeroHours < 0)) ||\n typeof credit.alertLevel !== 'string' ||\n !alertLevels.includes(credit.alertLevel as CloudCreditAlertLevel) ||\n !isDateTime(credit.quoteTimestamp) ||\n !isDateTime(credit.quoteExpiresAt)\n ) return null\n\n return {\n alertLevel: credit.alertLevel as CloudCreditAlertLevel,\n balanceCents: credit.balanceCents,\n burnRateCentsPerHour: credit.burnRateCentsPerHour,\n quoteExpiresAt: credit.quoteExpiresAt,\n quoteTimestamp: credit.quoteTimestamp,\n timeToZeroHours: credit.timeToZeroHours,\n }\n}\n\nexport class CloudCreditClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async get(options?: RpcSendOptions): Promise<CloudCredit> {\n const response: unknown = await this.#transport.get(\n '/v4/cloud/credit',\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const credit = envelope?.success === true\n ? parseCredit(envelope.message)\n : null\n if (credit === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud credit snapshot',\n )\n }\n return credit\n }\n}\n","import { ErpcConfigError, ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport type CloudResourceKind =\n | 'bare-metal'\n | 'solana-grpc'\n | 'solana-shredstream'\n | 'vps'\n\nexport type CloudResourceMode = 'dedicated' | 'direct' | 'shared'\n\n/** A credential-free projection of an ERPC Cloud resource. */\nexport interface CloudResource {\n readonly createdAt?: string\n readonly id: string\n readonly kind: CloudResourceKind\n readonly mode?: CloudResourceMode\n readonly name?: string\n readonly region?: string\n readonly status: string\n}\n\nexport interface CloudResourceStatusBilling {\n readonly graceEndsAt?: string\n readonly hourlyCredits?: number\n readonly nextChargeAt?: string\n readonly status: 'active' | 'grace-period' | 'inactive' | 'suspended'\n}\n\nexport interface CloudResourceStatus {\n readonly billing?: CloudResourceStatusBilling\n readonly id: string\n readonly status: string\n}\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst resourceKinds: readonly CloudResourceKind[] = [\n 'bare-metal',\n 'solana-grpc',\n 'solana-shredstream',\n 'vps',\n]\nconst resourceModes: readonly CloudResourceMode[] = [\n 'dedicated',\n 'direct',\n 'shared',\n]\nconst billingStatuses: readonly CloudResourceStatusBilling['status'][] = [\n 'active',\n 'grace-period',\n 'inactive',\n 'suspended',\n]\n\nconst isDateTime = (value: unknown): value is string =>\n typeof value === 'string' && Number.isFinite(Date.parse(value))\n\nconst parseStatusBilling = (\n value: unknown,\n): CloudResourceStatusBilling | null => {\n const billing = objectValue(value)\n if (\n billing === null ||\n typeof billing.status !== 'string' ||\n !billingStatuses.includes(\n billing.status as CloudResourceStatusBilling['status'],\n ) ||\n (billing.hourlyCredits !== undefined &&\n (typeof billing.hourlyCredits !== 'number' ||\n !Number.isFinite(billing.hourlyCredits) ||\n billing.hourlyCredits < 0)) ||\n (billing.nextChargeAt !== undefined &&\n !isDateTime(billing.nextChargeAt)) ||\n (billing.graceEndsAt !== undefined &&\n !isDateTime(billing.graceEndsAt))\n ) return null\n\n return {\n status: billing.status as CloudResourceStatusBilling['status'],\n ...(typeof billing.hourlyCredits === 'number'\n ? { hourlyCredits: billing.hourlyCredits }\n : {}),\n ...(typeof billing.nextChargeAt === 'string'\n ? { nextChargeAt: billing.nextChargeAt }\n : {}),\n ...(typeof billing.graceEndsAt === 'string'\n ? { graceEndsAt: billing.graceEndsAt }\n : {}),\n }\n}\n\nconst parseResourceStatus = (value: unknown): CloudResourceStatus | null => {\n const status = objectValue(value)\n if (\n status === null ||\n typeof status.id !== 'string' ||\n typeof status.status !== 'string'\n ) return null\n const billing = status.billing === undefined\n ? undefined\n : parseStatusBilling(status.billing)\n if (status.billing !== undefined && billing === null) return null\n return {\n id: status.id,\n status: status.status,\n ...(billing ? { billing } : {}),\n }\n}\nconst parseResource = (value: unknown): CloudResource | null => {\n const resource = objectValue(value)\n if (\n resource === null ||\n typeof resource.id !== 'string' ||\n typeof resource.kind !== 'string' ||\n !resourceKinds.includes(resource.kind as CloudResourceKind) ||\n typeof resource.status !== 'string' ||\n (resource.mode !== undefined &&\n (typeof resource.mode !== 'string' ||\n !resourceModes.includes(resource.mode as CloudResourceMode))) ||\n (resource.name !== undefined && typeof resource.name !== 'string') ||\n (resource.region !== undefined && typeof resource.region !== 'string') ||\n (resource.createdAt !== undefined && typeof resource.createdAt !== 'string')\n ) return null\n\n return {\n id: resource.id,\n kind: resource.kind as CloudResourceKind,\n status: resource.status,\n ...(typeof resource.mode === 'string'\n ? { mode: resource.mode as CloudResourceMode }\n : {}),\n ...(typeof resource.name === 'string' ? { name: resource.name } : {}),\n ...(typeof resource.region === 'string' ? { region: resource.region } : {}),\n ...(typeof resource.createdAt === 'string'\n ? { createdAt: resource.createdAt }\n : {}),\n }\n}\n\nexport class CloudResourcesClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async list(options?: RpcSendOptions): Promise<readonly CloudResource[]> {\n const response: unknown = await this.#transport.get(\n '/v4/cloud/resources',\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const message = objectValue(envelope?.message)\n if (envelope?.success !== true || !Array.isArray(message?.resources)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource list',\n )\n }\n const resources = message.resources.map(parseResource)\n if (resources.some((resource) => resource === null)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource list',\n )\n }\n return resources as readonly CloudResource[]\n }\n\n async get(\n resourceId: string,\n options?: RpcSendOptions,\n ): Promise<CloudResource> {\n const normalizedId = resourceId.trim()\n if (!normalizedId) {\n throw new ErpcConfigError('resourceId must not be empty')\n }\n const response: unknown = await this.#transport.get(\n `/v4/cloud/resources/${encodeURIComponent(normalizedId)}`,\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const message = objectValue(envelope?.message)\n const resource = envelope?.success === true\n ? parseResource(message?.resource)\n : null\n if (resource === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource',\n )\n }\n return resource\n }\n\n async getStatus(\n resourceId: string,\n options?: RpcSendOptions,\n ): Promise<CloudResourceStatus> {\n const normalizedId = resourceId.trim()\n if (!normalizedId) {\n throw new ErpcConfigError('resourceId must not be empty')\n }\n const response: unknown = await this.#transport.get(\n `/v4/cloud/resources/${encodeURIComponent(normalizedId)}/status`,\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const status = envelope?.success === true\n ? parseResourceStatus(envelope.message)\n : null\n if (status === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource status',\n )\n }\n return status\n }\n}\n","import { ErpcConfigError } from './errors'\nimport { CloudCatalogClient } from './catalog'\nimport { CloudCreditClient } from './credit'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\nimport { UsageClient } from './usage'\nimport { CloudResourcesClient } from './resources'\nimport { DEFAULT_TIMEOUT_MS, DEFAULT_USER_ENDPOINT } from './config'\n\nexport interface ErpcCloudClientConfig {\n readonly accessToken: string\n readonly endpoint?: string\n readonly fetch?: typeof globalThis.fetch\n readonly headers?: Readonly<Record<string, string>>\n readonly timeoutMs?: number\n}\n\nexport interface ErpcCloudClient {\n readonly catalog: CloudCatalogClient\n readonly credit: CloudCreditClient\n readonly resources: CloudResourcesClient\n readonly usage: UsageClient\n}\n\nconst requireFetch = (provided?: typeof globalThis.fetch) => {\n const implementation = provided ?? globalThis.fetch\n if (typeof implementation !== 'function') {\n throw new ErpcConfigError(\n 'A Fetch API implementation is required in this runtime',\n )\n }\n return implementation\n}\n\nconst cloudEndpoint = (value?: string): URL => {\n let endpoint: URL\n try {\n endpoint = new URL(value ?? DEFAULT_USER_ENDPOINT)\n } catch {\n throw new ErpcConfigError('endpoint must be an absolute HTTP(S) URL')\n }\n const isLocalHttp = endpoint.protocol === 'http:' &&\n ['127.0.0.1', '::1', '[::1]', 'localhost'].includes(endpoint.hostname)\n if (endpoint.protocol !== 'https:' && !isLocalHttp) {\n throw new ErpcConfigError('endpoint must use HTTPS except on localhost')\n }\n endpoint.search = ''\n endpoint.hash = ''\n endpoint.pathname = endpoint.pathname.replace(/\\/+$/, '') || '/'\n return endpoint\n}\n\nexport const createErpcCloudClient = (\n config: ErpcCloudClientConfig,\n): ErpcCloudClient => {\n const accessToken = config.accessToken.trim()\n if (!accessToken) {\n throw new ErpcConfigError('accessToken must not be empty')\n }\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new ErpcConfigError('timeoutMs must be a positive finite number')\n }\n\n const transport = new RestTransport({\n apiKey: accessToken,\n endpoint: cloudEndpoint(config.endpoint),\n fetch: requireFetch(config.fetch),\n headers: config.headers ?? {},\n timeoutMs,\n })\n\n return {\n catalog: new CloudCatalogClient(transport),\n credit: new CloudCreditClient(transport),\n resources: new CloudResourcesClient(transport),\n usage: new UsageClient(transport),\n }\n}\n\nexport type ErpcCloudRequestOptions = RpcSendOptions\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/transport/rest.ts","../src/account.ts","../src/catalog.ts","../src/config.ts","../src/price.ts","../src/rpc/client.ts","../src/rpc/ethereum.ts","../src/rpc/solana.ts","../src/transport/websocket.ts","../src/subscriptions.ts","../src/transport/http.ts","../src/usage.ts","../src/client.ts","../src/credit.ts","../src/resources.ts","../src/cloud.ts"],"names":["controlledSignal","isObject","objectValue","resourceKinds","resourceModes","isDateTime","requireFetch"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { JsonRpcErrorObject } from './rpc/types'\n\nconst REDACTED = '[REDACTED]'\n\nconst credentialVariants = (credential: string): readonly string[] => {\n const queryEncoded = new URLSearchParams({ value: credential })\n .toString()\n .slice('value='.length)\n let componentEncoded: string | undefined\n try {\n componentEncoded = encodeURIComponent(credential)\n } catch {\n // URLSearchParams still provides a safe encoded representation.\n }\n return [...new Set([credential, componentEncoded, queryEncoded])]\n .filter((value): value is string => Boolean(value))\n .sort((left, right) => right.length - left.length)\n}\n\nconst redactString = (value: string, variants: readonly string[]): string => {\n let redacted = value\n for (const variant of variants) redacted = redacted.replaceAll(variant, REDACTED)\n return redacted\n}\n\nconst redactValue = (\n value: unknown,\n variants: readonly string[],\n seen: WeakSet<object>,\n depth: number,\n): unknown => {\n if (typeof value === 'string') return redactString(value, variants)\n if (typeof value !== 'object' || value === null) return value\n if (depth >= 32 || seen.has(value)) return REDACTED\n\n seen.add(value)\n if (Array.isArray(value)) {\n return value.map((item) => redactValue(item, variants, seen, depth + 1))\n }\n\n const result: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value)) {\n Object.defineProperty(result, key, {\n configurable: true,\n enumerable: true,\n value: redactValue(item, variants, seen, depth + 1),\n writable: true,\n })\n }\n return result\n}\n\nexport const redactJsonRpcError = (\n error: JsonRpcErrorObject,\n credential: string | undefined,\n): JsonRpcErrorObject => {\n if (!credential) return error\n const variants = credentialVariants(credential)\n const result: {\n code: number\n data?: unknown\n message: string\n } = {\n code: error.code,\n message: redactString(error.message, variants),\n }\n if (error.data !== undefined) {\n result.data = redactValue(error.data, variants, new WeakSet(), 0)\n }\n return result\n}\n\nexport type ErpcErrorCode =\n | 'ERPC_ABORTED'\n | 'ERPC_BATCH_POLICY'\n | 'ERPC_CONFIG'\n | 'ERPC_HTTP'\n | 'ERPC_INVALID_RESPONSE'\n | 'ERPC_RPC'\n | 'ERPC_TIMEOUT'\n | 'ERPC_TRANSPORT'\n\nexport class ErpcError extends Error {\n readonly code: ErpcErrorCode\n\n constructor(code: ErpcErrorCode, message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ErpcError'\n this.code = code\n }\n}\n\nexport class ErpcConfigError extends ErpcError {\n constructor(message: string) {\n super('ERPC_CONFIG', message)\n this.name = 'ErpcConfigError'\n }\n}\n\nexport class ErpcTransportError extends ErpcError {\n constructor(message: string, options?: ErrorOptions) {\n super('ERPC_TRANSPORT', message, options)\n this.name = 'ErpcTransportError'\n }\n}\n\nexport class ErpcHttpError extends ErpcError {\n readonly status: number\n\n constructor(status: number, message = `ERPC request failed with HTTP ${status}`) {\n super('ERPC_HTTP', message)\n this.name = 'ErpcHttpError'\n this.status = status\n }\n}\n\nexport class ErpcTimeoutError extends ErpcError {\n readonly timeoutMs: number\n\n constructor(timeoutMs: number) {\n super('ERPC_TIMEOUT', `ERPC request timed out after ${timeoutMs}ms`)\n this.name = 'ErpcTimeoutError'\n this.timeoutMs = timeoutMs\n }\n}\n\nexport class ErpcAbortedError extends ErpcError {\n constructor() {\n super('ERPC_ABORTED', 'ERPC request was aborted')\n this.name = 'ErpcAbortedError'\n }\n}\n\nexport class ErpcInvalidResponseError extends ErpcError {\n constructor(message = 'ERPC returned an invalid response') {\n super('ERPC_INVALID_RESPONSE', message)\n this.name = 'ErpcInvalidResponseError'\n }\n}\n\nexport class ErpcJsonRpcError extends ErpcError {\n readonly rpcCode: number\n readonly data?: unknown\n\n constructor(error: JsonRpcErrorObject) {\n super('ERPC_RPC', error.message)\n this.name = 'ErpcJsonRpcError'\n this.rpcCode = error.code\n if (error.data !== undefined) this.data = error.data\n }\n}\n\nexport class ErpcBatchPolicyError extends ErpcError {\n constructor(message: string) {\n super('ERPC_BATCH_POLICY', message)\n this.name = 'ErpcBatchPolicyError'\n }\n}\n","import {\n ErpcAbortedError,\n ErpcHttpError,\n ErpcInvalidResponseError,\n ErpcTimeoutError,\n ErpcTransportError,\n} from '../errors'\nimport type { RpcSendOptions } from '../rpc/types'\n\nexport type QueryValue =\n | boolean\n | number\n | readonly string[]\n | string\n | undefined\n\nexport type Query = Readonly<Record<string, QueryValue>>\n\nexport interface RestTransportConfig {\n readonly apiKey: string\n readonly endpoint: URL\n readonly fetch: typeof globalThis.fetch\n readonly headers: Readonly<Record<string, string>>\n readonly timeoutMs: number\n}\n\nexport interface RestStreamResponse {\n readonly response: Response\n close(): void\n normalizeError(error: unknown): Error\n}\n\ninterface ControlledSignal {\n readonly cleanup: () => void\n readonly signal: AbortSignal\n readonly stopTimeout: () => void\n readonly timeoutMs: number\n readonly timedOut: () => boolean\n}\n\nconst controlledSignal = (\n timeoutMs: number,\n external?: AbortSignal,\n): ControlledSignal => {\n const controller = new AbortController()\n let didTimeOut = false\n let timeout: ReturnType<typeof setTimeout> | undefined = setTimeout(() => {\n didTimeOut = true\n controller.abort()\n }, timeoutMs)\n\n const abort = () => controller.abort()\n if (external?.aborted) controller.abort()\n else external?.addEventListener('abort', abort, { once: true })\n\n const stopTimeout = () => {\n if (timeout === undefined) return\n clearTimeout(timeout)\n timeout = undefined\n }\n\n return {\n signal: controller.signal,\n stopTimeout,\n timeoutMs,\n timedOut: () => didTimeOut,\n cleanup: () => {\n stopTimeout()\n external?.removeEventListener('abort', abort)\n },\n }\n}\n\nconst normalizeError = (\n error: unknown,\n controlled: ControlledSignal,\n external?: AbortSignal,\n): Error => {\n if (\n error instanceof ErpcAbortedError ||\n error instanceof ErpcHttpError ||\n error instanceof ErpcInvalidResponseError ||\n error instanceof ErpcTimeoutError ||\n error instanceof ErpcTransportError\n ) {\n return error\n }\n if (controlled.timedOut()) {\n return new ErpcTimeoutError(controlled.timeoutMs)\n }\n if (external?.aborted) return new ErpcAbortedError()\n return new ErpcTransportError('Unable to reach ERPC')\n}\n\nconst applyQuery = (url: URL, query?: Query): void => {\n if (!query) return\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue\n if (Array.isArray(value)) {\n for (const item of value) url.searchParams.append(key, item)\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n}\n\nexport class RestTransport {\n readonly endpoint: string\n\n readonly #apiKey: string\n readonly #endpoint: URL\n readonly #fetch: typeof globalThis.fetch\n readonly #headers: Readonly<Record<string, string>>\n readonly #timeoutMs: number\n\n constructor(config: RestTransportConfig) {\n this.#apiKey = config.apiKey\n this.#endpoint = new URL(config.endpoint)\n this.#fetch = config.fetch\n this.#headers = config.headers\n this.#timeoutMs = config.timeoutMs\n const endpoint = new URL(config.endpoint)\n endpoint.search = ''\n endpoint.hash = ''\n this.endpoint = endpoint.toString()\n }\n\n url(path: string, query?: Query): URL {\n const url = new URL(this.#endpoint)\n const base = url.pathname === '/' ? '' : url.pathname.replace(/\\/+$/, '')\n url.pathname = `${base}/${path.replace(/^\\/+/, '')}`.replace(/\\/{2,}/g, '/')\n applyQuery(url, query)\n return url\n }\n\n async get<TResult>(\n path: string,\n query?: Query,\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n const controlled = controlledSignal(this.#timeoutMs, options.signal)\n try {\n const response = await this.#get(path, query, controlled.signal)\n if (!response.ok) throw new ErpcHttpError(response.status)\n const text = await response.text()\n try {\n return JSON.parse(text) as TResult\n } catch {\n throw new ErpcInvalidResponseError('ERPC returned malformed JSON')\n }\n } catch (error) {\n throw normalizeError(error, controlled, options.signal)\n } finally {\n controlled.cleanup()\n }\n }\n\n async stream(\n path: string,\n query?: Query,\n options: RpcSendOptions = {},\n ): Promise<RestStreamResponse> {\n const controlled = controlledSignal(this.#timeoutMs, options.signal)\n try {\n const response = await this.#get(path, query, controlled.signal)\n if (!response.ok) throw new ErpcHttpError(response.status)\n\n // Long-lived streams use the timeout for connection establishment only.\n // The caller's AbortSignal remains attached until close() is called.\n controlled.stopTimeout()\n return {\n response,\n close: controlled.cleanup,\n normalizeError: (error) =>\n normalizeError(error, controlled, options.signal),\n }\n } catch (error) {\n controlled.cleanup()\n throw normalizeError(error, controlled, options.signal)\n }\n }\n\n #get(path: string, query: Query | undefined, signal: AbortSignal) {\n return this.#fetch(this.url(path, query), {\n method: 'GET',\n headers: {\n ...this.#headers,\n authorization: `Bearer ${this.#apiKey}`,\n accept: 'application/json',\n },\n signal,\n })\n }\n}\n","import type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport type ErpcPlan = 'business' | 'developer' | 'free' | 'pro'\n\nexport interface TokenBalance {\n readonly max_tokens: number\n readonly next_refill_at: string | null\n readonly plan: ErpcPlan\n readonly remaining_tokens: number\n}\n\nexport class AccountClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n getTokenBalance(options?: RpcSendOptions): Promise<TokenBalance> {\n return this.#transport.get('/v3/erpc/token-balance', undefined, options)\n }\n}\n","import { ErpcInvalidResponseError } from './errors'\nimport type { CloudResourceKind, CloudResourceMode } from './resources'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport interface CloudOfferingBilling {\n readonly amountCents: number\n readonly unit: 'cents-per-hour'\n}\n\nexport interface CloudOfferingCompute {\n readonly tenancy: 'bare-metal' | 'virtual-machine'\n}\n\nexport interface CloudOfferingSolana {\n readonly transport: 'grpc' | 'shredstream'\n}\n\nexport interface CloudOffering {\n readonly billing?: CloudOfferingBilling\n readonly capabilities: readonly string[]\n readonly compute?: CloudOfferingCompute\n readonly description: string\n readonly id: string\n readonly kind: CloudResourceKind\n readonly mode?: CloudResourceMode\n readonly name: string\n readonly regions: readonly string[]\n readonly solana?: CloudOfferingSolana\n}\n\nconst resourceKinds: readonly CloudResourceKind[] = [\n 'bare-metal',\n 'solana-grpc',\n 'solana-shredstream',\n 'vps',\n]\nconst resourceModes: readonly CloudResourceMode[] = [\n 'dedicated',\n 'direct',\n 'shared',\n]\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst stringArray = (value: unknown): readonly string[] | null =>\n Array.isArray(value) && value.every((item) => typeof item === 'string')\n ? value\n : null\n\nconst parseOffering = (value: unknown): CloudOffering | null => {\n const offering = objectValue(value)\n if (\n offering === null ||\n typeof offering.id !== 'string' ||\n typeof offering.kind !== 'string' ||\n !resourceKinds.includes(offering.kind as CloudResourceKind) ||\n typeof offering.name !== 'string' ||\n typeof offering.description !== 'string' ||\n (offering.mode !== undefined &&\n (typeof offering.mode !== 'string' ||\n !resourceModes.includes(offering.mode as CloudResourceMode)))\n ) return null\n\n const regions = stringArray(offering.regions)\n const capabilities = stringArray(offering.capabilities)\n if (regions === null || capabilities === null) return null\n\n const compute = offering.compute === undefined\n ? undefined\n : objectValue(offering.compute)\n if (\n compute !== undefined &&\n (compute === null ||\n (compute.tenancy !== 'virtual-machine' &&\n compute.tenancy !== 'bare-metal'))\n ) return null\n\n const solana = offering.solana === undefined\n ? undefined\n : objectValue(offering.solana)\n if (\n solana !== undefined &&\n (solana === null ||\n (solana.transport !== 'grpc' && solana.transport !== 'shredstream'))\n ) return null\n\n const billing = offering.billing === undefined\n ? undefined\n : objectValue(offering.billing)\n if (\n billing !== undefined &&\n (billing === null ||\n billing.unit !== 'cents-per-hour' ||\n typeof billing.amountCents !== 'number' ||\n !Number.isInteger(billing.amountCents) ||\n billing.amountCents < 0)\n ) return null\n\n return {\n id: offering.id,\n kind: offering.kind as CloudResourceKind,\n name: offering.name,\n description: offering.description,\n regions,\n capabilities,\n ...(typeof offering.mode === 'string'\n ? { mode: offering.mode as CloudResourceMode }\n : {}),\n ...(compute &&\n (compute.tenancy === 'virtual-machine' || compute.tenancy === 'bare-metal')\n ? { compute: { tenancy: compute.tenancy } }\n : {}),\n ...(solana &&\n (solana.transport === 'grpc' || solana.transport === 'shredstream')\n ? { solana: { transport: solana.transport } }\n : {}),\n ...(billing &&\n billing.unit === 'cents-per-hour' &&\n typeof billing.amountCents === 'number'\n ? {\n billing: {\n amountCents: billing.amountCents,\n unit: billing.unit,\n },\n }\n : {}),\n }\n}\n\nexport class CloudCatalogClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async list(options?: RpcSendOptions): Promise<readonly CloudOffering[]> {\n const response: unknown = await this.#transport.get(\n '/v4/cloud/catalog',\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const message = objectValue(envelope?.message)\n if (envelope?.success !== true || !Array.isArray(message?.offerings)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud catalog',\n )\n }\n const offerings = message.offerings.map(parseOffering)\n if (offerings.some((offering) => offering === null)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud catalog',\n )\n }\n return offerings as readonly CloudOffering[]\n }\n}\n","import { ErpcConfigError } from './errors'\n\nexport const DEFAULT_ENDPOINT = 'https://edge.erpc.global'\nexport const DEFAULT_ACCOUNT_ENDPOINT = 'https://solana-rpc.erpc.global'\nexport const DEFAULT_USER_ENDPOINT = 'https://user-api.erpc.global'\nexport const DEFAULT_TIMEOUT_MS = 30_000\n\nexport interface ErpcClientConfig {\n readonly accountEndpoint?: string\n readonly apiKey: string\n readonly endpoint?: string\n readonly fetch?: typeof globalThis.fetch\n readonly headers?: Readonly<Record<string, string>>\n readonly timeoutMs?: number\n readonly userEndpoint?: string\n readonly webSocket?: typeof globalThis.WebSocket\n}\n\nexport interface ResolvedErpcClientConfig {\n readonly accountEndpoint: URL\n readonly apiKey: string\n readonly endpoint: URL\n readonly fetch: typeof globalThis.fetch\n readonly headers: Readonly<Record<string, string>>\n readonly timeoutMs: number\n readonly userEndpoint: URL\n readonly webSocket?: typeof globalThis.WebSocket\n}\n\nconst requireFetch = (provided?: typeof globalThis.fetch) => {\n const implementation = provided ?? globalThis.fetch\n if (typeof implementation !== 'function') {\n throw new ErpcConfigError(\n 'A Fetch API implementation is required in this runtime',\n )\n }\n return implementation\n}\n\nexport const resolveConfig = (\n config: ErpcClientConfig,\n): ResolvedErpcClientConfig => {\n const apiKey = config.apiKey.trim()\n if (!apiKey) throw new ErpcConfigError('apiKey must not be empty')\n\n let endpoint: URL\n let accountEndpoint: URL\n let userEndpoint: URL\n try {\n endpoint = new URL(config.endpoint ?? DEFAULT_ENDPOINT)\n accountEndpoint = new URL(\n config.accountEndpoint ?? DEFAULT_ACCOUNT_ENDPOINT,\n )\n userEndpoint = new URL(config.userEndpoint ?? DEFAULT_USER_ENDPOINT)\n } catch {\n throw new ErpcConfigError('endpoint must be an absolute HTTP(S) URL')\n }\n\n if (endpoint.protocol !== 'https:' && endpoint.protocol !== 'http:') {\n throw new ErpcConfigError('endpoint must use HTTP or HTTPS')\n }\n if (\n accountEndpoint.protocol !== 'https:' &&\n accountEndpoint.protocol !== 'http:'\n ) {\n throw new ErpcConfigError('accountEndpoint must use HTTP or HTTPS')\n }\n if (\n userEndpoint.protocol !== 'https:' &&\n userEndpoint.protocol !== 'http:'\n ) {\n throw new ErpcConfigError('userEndpoint must use HTTP or HTTPS')\n }\n\n endpoint.search = ''\n endpoint.hash = ''\n endpoint.pathname = endpoint.pathname.replace(/\\/+$/, '') || '/'\n accountEndpoint.search = ''\n accountEndpoint.hash = ''\n accountEndpoint.pathname =\n accountEndpoint.pathname.replace(/\\/+$/, '') || '/'\n userEndpoint.search = ''\n userEndpoint.hash = ''\n userEndpoint.pathname = userEndpoint.pathname.replace(/\\/+$/, '') || '/'\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new ErpcConfigError('timeoutMs must be a positive finite number')\n }\n\n return {\n accountEndpoint,\n apiKey,\n endpoint,\n fetch: requireFetch(config.fetch),\n headers: config.headers ?? {},\n timeoutMs,\n userEndpoint,\n ...(config.webSocket === undefined\n ? {}\n : { webSocket: config.webSocket }),\n }\n}\n\nexport const endpointWithPath = (endpoint: URL, path: string): URL => {\n const url = new URL(endpoint)\n const base = endpoint.pathname === '/' ? '' : endpoint.pathname\n url.pathname = `${base}/${path.replace(/^\\/+/, '')}`.replace(/\\/{2,}/g, '/')\n return url\n}\n\nexport const websocketUrl = (\n endpoint: URL,\n apiKey: string,\n path = '',\n): URL => {\n const url = endpointWithPath(endpoint, path)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n url.searchParams.set('api-key', apiKey)\n return url\n}\n","import { ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport type { Query } from './transport/rest'\nimport { RestTransport } from './transport/rest'\n\nexport type PriceEncoding = 'base64' | 'hex'\nexport type PriceAssetType = 'crypto' | 'equity' | 'fx' | 'metal' | 'rates'\n\nexport interface PriceFeedMetadata {\n readonly attributes?: Readonly<Record<string, string>>\n readonly id: string\n}\n\nexport interface PricePoint {\n readonly conf: string\n readonly expo: number\n readonly price: string\n readonly publish_time: number\n}\n\nexport interface ParsedPriceUpdate {\n readonly ema_price: PricePoint\n readonly id: string\n readonly metadata?: {\n readonly prev_publish_time?: number\n readonly proof_available_time?: number\n readonly slot?: number\n }\n readonly price: PricePoint\n}\n\nexport interface BinaryUpdate {\n readonly data: readonly string[]\n readonly encoding: string\n}\n\nexport interface PriceUpdateResponse {\n readonly binary: BinaryUpdate\n readonly parsed?: readonly ParsedPriceUpdate[]\n}\n\nexport interface PriceUpdateOptions {\n readonly encoding?: PriceEncoding\n readonly ids: readonly string[]\n readonly ignoreInvalidPriceIds?: boolean\n readonly parsed?: boolean\n}\n\nexport interface PriceStreamOptions extends PriceUpdateOptions {\n readonly allowUnordered?: boolean\n readonly benchmarksOnly?: boolean\n}\n\nexport interface PublisherStakeCap {\n readonly cap: number\n readonly publisher: string\n}\n\nexport interface PublisherStakeCapsResponse {\n readonly binary: BinaryUpdate\n readonly parsed?: readonly {\n readonly publisher_stake_caps: readonly PublisherStakeCap[]\n }[]\n}\n\nexport interface PriceStreamEvent {\n readonly data: PriceUpdateResponse\n readonly event?: string\n readonly id?: string\n}\n\nconst updateQuery = (options: PriceUpdateOptions): Query => ({\n 'ids[]': options.ids,\n encoding: options.encoding,\n parsed: options.parsed,\n ignore_invalid_price_ids: options.ignoreInvalidPriceIds,\n})\n\nconst parseSseBlock = (block: string): PriceStreamEvent | null => {\n const data: string[] = []\n let event: string | undefined\n let id: string | undefined\n\n for (const line of block.split(/\\r?\\n/)) {\n if (!line || line.startsWith(':')) continue\n const separator = line.indexOf(':')\n const field = separator === -1 ? line : line.slice(0, separator)\n const raw = separator === -1 ? '' : line.slice(separator + 1)\n const value = raw.startsWith(' ') ? raw.slice(1) : raw\n if (field === 'data') data.push(value)\n else if (field === 'event') event = value\n else if (field === 'id') id = value\n }\n\n if (data.length === 0) return null\n let parsed: PriceUpdateResponse\n try {\n parsed = JSON.parse(data.join('\\n')) as PriceUpdateResponse\n } catch {\n throw new ErpcInvalidResponseError('ERPC returned malformed stream data')\n }\n const result: {\n data: PriceUpdateResponse\n event?: string\n id?: string\n } = { data: parsed }\n if (event !== undefined) result.event = event\n if (id !== undefined) result.id = id\n return result\n}\n\nexport class PriceClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n getPriceFeeds(\n options: {\n readonly assetType?: PriceAssetType\n readonly query?: string\n } = {},\n sendOptions?: RpcSendOptions,\n ): Promise<readonly PriceFeedMetadata[]> {\n return this.#transport.get(\n '/v2/price_feeds',\n { query: options.query, asset_type: options.assetType },\n sendOptions,\n )\n }\n\n getLatestPriceUpdates(\n options: PriceUpdateOptions,\n sendOptions?: RpcSendOptions,\n ): Promise<PriceUpdateResponse> {\n return this.#transport.get(\n '/v2/updates/price/latest',\n updateQuery(options),\n sendOptions,\n )\n }\n\n getPriceUpdatesAtTimestamp(\n publishTime: number | string,\n options: PriceUpdateOptions,\n sendOptions?: RpcSendOptions,\n ): Promise<PriceUpdateResponse> {\n return this.#transport.get(\n `/v2/updates/price/${encodeURIComponent(String(publishTime))}`,\n updateQuery(options),\n sendOptions,\n )\n }\n\n getLatestPublisherStakeCaps(\n options: { readonly encoding?: PriceEncoding; readonly parsed?: boolean } = {},\n sendOptions?: RpcSendOptions,\n ): Promise<PublisherStakeCapsResponse> {\n return this.#transport.get(\n '/v2/updates/publisher_stake_caps/latest',\n options,\n sendOptions,\n )\n }\n\n async *streamPriceUpdates(\n options: PriceStreamOptions,\n sendOptions?: RpcSendOptions,\n ): AsyncGenerator<PriceStreamEvent, void, undefined> {\n const stream = await this.#transport.stream(\n '/v2/updates/price/stream',\n {\n ...updateQuery(options),\n allow_unordered: options.allowUnordered,\n benchmarks_only: options.benchmarksOnly,\n },\n sendOptions,\n )\n const response = stream.response\n if (!response.body) {\n stream.close()\n throw new ErpcInvalidResponseError('ERPC returned an empty stream')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n try {\n while (true) {\n const { done, value } = await reader.read()\n buffer += decoder.decode(value, { stream: !done })\n let boundary = buffer.search(/\\r?\\n\\r?\\n/)\n while (boundary !== -1) {\n const separatorLength = buffer.slice(boundary).startsWith('\\r\\n')\n ? 4\n : 2\n const block = buffer.slice(0, boundary)\n buffer = buffer.slice(boundary + separatorLength)\n const event = parseSseBlock(block)\n if (event) yield event\n boundary = buffer.search(/\\r?\\n\\r?\\n/)\n }\n if (done) break\n }\n const finalEvent = parseSseBlock(buffer)\n if (finalEvent) yield finalEvent\n } catch (error) {\n throw stream.normalizeError(error)\n } finally {\n try {\n await reader.cancel()\n } catch {\n // Preserve the original stream result or error.\n } finally {\n reader.releaseLock()\n stream.close()\n }\n }\n }\n}\n","import type {\n JsonRpcParams,\n RpcBatchCall,\n RpcMethodSpec,\n RpcParams,\n RpcResult,\n RpcSendOptions,\n} from './types'\n\nexport interface JsonRpcTransport {\n readonly endpoint: string\n readonly maxBatchSize: number\n\n batch<TResult extends readonly unknown[]>(\n calls: readonly RpcBatchCall[],\n options?: RpcSendOptions,\n ): Promise<TResult>\n\n request<TResult>(\n method: string,\n params?: JsonRpcParams,\n options?: RpcSendOptions,\n ): Promise<TResult>\n}\n\nexport class PendingRpcRequest<TResult> {\n readonly #send: (options?: RpcSendOptions) => Promise<TResult>\n\n constructor(send: (options?: RpcSendOptions) => Promise<TResult>) {\n this.#send = send\n }\n\n send(options?: RpcSendOptions): Promise<TResult> {\n return this.#send(options)\n }\n}\n\nexport class PendingRpcBatchRequest<TResult extends readonly unknown[]> {\n readonly #send: (options?: RpcSendOptions) => Promise<TResult>\n\n constructor(send: (options?: RpcSendOptions) => Promise<TResult>) {\n this.#send = send\n }\n\n send(options?: RpcSendOptions): Promise<TResult> {\n return this.#send(options)\n }\n}\n\ntype SchemaConstraint<TSchema> = {\n readonly [TMethod in keyof TSchema]: RpcMethodSpec<\n JsonRpcParams | undefined,\n unknown\n >\n}\n\ntype MethodName<TSchema> = Extract<keyof TSchema, string>\n\ntype MethodFunction<TSpec> = TSpec extends RpcMethodSpec<\n infer TParams,\n infer TResult\n>\n ? TParams extends readonly unknown[]\n ? (...params: TParams) => PendingRpcRequest<TResult>\n : TParams extends object\n ? (params: TParams) => PendingRpcRequest<TResult>\n : () => PendingRpcRequest<TResult>\n : never\n\ntype BatchCall<TSchema> = {\n readonly [TMethod in MethodName<TSchema>]: RpcParams<\n TSchema[TMethod]\n > extends undefined\n ? { readonly method: TMethod; readonly params?: undefined }\n : {\n readonly method: TMethod\n readonly params: RpcParams<TSchema[TMethod]>\n }\n}[MethodName<TSchema>]\n\ntype BatchResults<\n TSchema,\n TCalls extends readonly BatchCall<TSchema>[],\n> = {\n readonly [TIndex in keyof TCalls]: TCalls[TIndex] extends {\n readonly method: infer TMethod\n }\n ? TMethod extends MethodName<TSchema>\n ? RpcResult<TSchema[TMethod]>\n : never\n : never\n}\n\nexport interface RpcNamespaceBase<TSchema> {\n readonly endpoint: string\n\n batch<const TCalls extends readonly BatchCall<TSchema>[]>(\n calls: TCalls,\n ): PendingRpcBatchRequest<BatchResults<TSchema, TCalls>>\n\n raw<TResult = unknown>(\n method: string,\n params?: JsonRpcParams,\n ): PendingRpcRequest<TResult>\n\n request<TMethod extends MethodName<TSchema>>(\n method: TMethod,\n ...params: RpcParams<TSchema[TMethod]> extends undefined\n ? []\n : [params: RpcParams<TSchema[TMethod]>]\n ): PendingRpcRequest<RpcResult<TSchema[TMethod]>>\n}\n\nexport type RpcNamespace<TSchema extends SchemaConstraint<TSchema>> =\n RpcNamespaceBase<TSchema> & {\n readonly [TMethod in MethodName<TSchema>]: MethodFunction<TSchema[TMethod]>\n }\n\nexport interface CreateRpcNamespaceConfig {\n readonly parameterMode: 'named' | 'positional'\n readonly transport: JsonRpcTransport\n readonly validateBatch?: (calls: readonly RpcBatchCall[]) => void\n}\n\nconst methodParams = (\n mode: CreateRpcNamespaceConfig['parameterMode'],\n args: readonly unknown[],\n): JsonRpcParams | undefined => {\n if (mode === 'positional') return args\n if (args.length === 0) return undefined\n return args[0] as object\n}\n\nexport const createRpcNamespace = <\n TSchema extends SchemaConstraint<TSchema>,\n>(config: CreateRpcNamespaceConfig): RpcNamespace<TSchema> => {\n const base: RpcNamespaceBase<TSchema> = {\n endpoint: config.transport.endpoint,\n batch: <const TCalls extends readonly BatchCall<TSchema>[]>(calls: TCalls) => {\n const wireCalls = calls as readonly RpcBatchCall[]\n config.validateBatch?.(wireCalls)\n return new PendingRpcBatchRequest((options) =>\n config.transport.batch<BatchResults<TSchema, TCalls>>(\n wireCalls,\n options,\n ),\n )\n },\n raw: <TResult>(method: string, params?: JsonRpcParams) =>\n new PendingRpcRequest<TResult>((options) =>\n config.transport.request<TResult>(method, params, options),\n ),\n request: <TMethod extends MethodName<TSchema>>(\n method: TMethod,\n ...params: RpcParams<TSchema[TMethod]> extends undefined\n ? []\n : [params: RpcParams<TSchema[TMethod]>]\n ) =>\n new PendingRpcRequest<RpcResult<TSchema[TMethod]>>((options) =>\n config.transport.request<RpcResult<TSchema[TMethod]>>(\n method,\n params[0] as JsonRpcParams | undefined,\n options,\n ),\n ),\n }\n\n return new Proxy(base as RpcNamespace<TSchema>, {\n get(target, property, receiver) {\n if (typeof property !== 'string' || property in target) {\n return Reflect.get(target, property, receiver) as unknown\n }\n if (property === 'then') return undefined\n return (...args: readonly unknown[]) =>\n new PendingRpcRequest((options) =>\n config.transport.request(\n property,\n methodParams(config.parameterMode, args),\n options,\n ),\n )\n },\n })\n}\n","import type { HttpJsonRpcTransport } from '../transport/http'\nimport { createRpcNamespace, type RpcNamespace } from './client'\nimport type { JsonValue, RpcMethodSpec } from './types'\n\nexport type Hex = `0x${string}`\nexport type EthereumAddress = Hex\nexport type EthereumBlockTag =\n | 'earliest'\n | 'finalized'\n | 'latest'\n | 'pending'\n | 'safe'\n | Hex\n\nexport type EthereumObject = Readonly<Record<string, unknown>>\nexport type EthereumTransactionRequest = EthereumObject\nexport type EthereumFilter = EthereumObject\n\nexport interface EthereumRpcSchema {\n readonly eth_accounts: RpcMethodSpec<readonly [], readonly EthereumAddress[]>\n readonly eth_baseFee: RpcMethodSpec<readonly [], Hex>\n readonly eth_blobBaseFee: RpcMethodSpec<readonly [], Hex>\n readonly eth_blockNumber: RpcMethodSpec<readonly [], Hex>\n readonly eth_call: RpcMethodSpec<\n readonly [\n transaction: EthereumTransactionRequest,\n block?: EthereumBlockTag,\n stateOverride?: EthereumObject,\n ],\n Hex\n >\n readonly eth_callMany: RpcMethodSpec<\n readonly [\n calls: readonly EthereumObject[],\n simulationContext?: EthereumObject,\n stateOverride?: EthereumObject,\n timeout?: number,\n ],\n JsonValue\n >\n readonly eth_capabilities: RpcMethodSpec<readonly [], JsonValue>\n readonly eth_chainId: RpcMethodSpec<readonly [], Hex>\n readonly eth_createAccessList: RpcMethodSpec<\n readonly [\n transaction: EthereumTransactionRequest,\n block?: EthereumBlockTag,\n ],\n JsonValue\n >\n readonly eth_estimateGas: RpcMethodSpec<\n readonly [\n transaction: EthereumTransactionRequest,\n block?: EthereumBlockTag,\n stateOverride?: EthereumObject,\n ],\n Hex\n >\n readonly eth_feeHistory: RpcMethodSpec<\n readonly [\n blockCount: Hex,\n newestBlock: EthereumBlockTag,\n rewardPercentiles: readonly number[],\n ],\n JsonValue\n >\n readonly eth_gasPrice: RpcMethodSpec<readonly [], Hex>\n readonly eth_getAccount: RpcMethodSpec<\n readonly [address: EthereumAddress, block: EthereumBlockTag],\n JsonValue\n >\n readonly eth_getBalance: RpcMethodSpec<\n readonly [address: EthereumAddress, block?: EthereumBlockTag],\n Hex\n >\n readonly eth_getBlockByHash: RpcMethodSpec<\n readonly [hash: Hex, includeTransactions: boolean],\n JsonValue | null\n >\n readonly eth_getBlockByNumber: RpcMethodSpec<\n readonly [block: EthereumBlockTag, includeTransactions: boolean],\n JsonValue | null\n >\n readonly eth_getBlockReceipts: RpcMethodSpec<\n readonly [block: EthereumBlockTag],\n JsonValue | null\n >\n readonly eth_getBlockTransactionCountByHash: RpcMethodSpec<\n readonly [hash: Hex],\n Hex | null\n >\n readonly eth_getBlockTransactionCountByNumber: RpcMethodSpec<\n readonly [block: EthereumBlockTag],\n Hex | null\n >\n readonly eth_getCode: RpcMethodSpec<\n readonly [address: EthereumAddress, block?: EthereumBlockTag],\n Hex\n >\n readonly eth_getFilterChanges: RpcMethodSpec<readonly [filterId: Hex], JsonValue>\n readonly eth_getFilterLogs: RpcMethodSpec<readonly [filterId: Hex], JsonValue>\n readonly eth_getLogs: RpcMethodSpec<\n readonly [filter?: EthereumFilter],\n JsonValue\n >\n readonly eth_getProof: RpcMethodSpec<\n readonly [\n address: EthereumAddress,\n storageKeys: readonly Hex[],\n block: EthereumBlockTag,\n ],\n JsonValue\n >\n readonly eth_getRawTransactionByHash: RpcMethodSpec<\n readonly [hash: Hex],\n Hex | null\n >\n readonly eth_getStorageAt: RpcMethodSpec<\n readonly [\n address: EthereumAddress,\n position: Hex,\n block?: EthereumBlockTag,\n ],\n Hex\n >\n readonly eth_getTransactionByBlockHashAndIndex: RpcMethodSpec<\n readonly [blockHash: Hex, index: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionByBlockNumberAndIndex: RpcMethodSpec<\n readonly [block: EthereumBlockTag, index: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionByHash: RpcMethodSpec<\n readonly [hash: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionBySenderAndNonce: RpcMethodSpec<\n readonly [sender: EthereumAddress, nonce: Hex],\n JsonValue | null\n >\n readonly eth_getTransactionCount: RpcMethodSpec<\n readonly [address: EthereumAddress, block?: EthereumBlockTag],\n Hex\n >\n readonly eth_getTransactionReceipt: RpcMethodSpec<\n readonly [hash: Hex],\n JsonValue | null\n >\n readonly eth_getUncleCountByBlockHash: RpcMethodSpec<\n readonly [hash: Hex],\n Hex\n >\n readonly eth_getUncleCountByBlockNumber: RpcMethodSpec<\n readonly [block: EthereumBlockTag],\n Hex\n >\n readonly eth_maxPriorityFeePerGas: RpcMethodSpec<readonly [], Hex>\n readonly eth_newBlockFilter: RpcMethodSpec<readonly [], Hex>\n readonly eth_newFilter: RpcMethodSpec<\n readonly [filter?: EthereumFilter],\n Hex\n >\n readonly eth_newPendingTransactionFilter: RpcMethodSpec<readonly [], Hex>\n readonly eth_sendRawTransaction: RpcMethodSpec<\n readonly [transaction: Hex],\n Hex\n >\n readonly eth_signTransaction: RpcMethodSpec<\n readonly [transaction: EthereumTransactionRequest],\n Hex\n >\n readonly eth_simulateV1: RpcMethodSpec<\n readonly [simulation: EthereumObject, block?: EthereumBlockTag],\n JsonValue\n >\n readonly eth_submitWork: RpcMethodSpec<\n readonly [nonce: Hex, proofOfWorkHash: Hex, digest: Hex],\n boolean\n >\n readonly eth_syncing: RpcMethodSpec<readonly [], boolean | JsonValue>\n readonly eth_uninstallFilter: RpcMethodSpec<readonly [filterId: Hex], boolean>\n readonly net_listening: RpcMethodSpec<readonly [], boolean>\n readonly net_peerCount: RpcMethodSpec<readonly [], Hex>\n readonly net_version: RpcMethodSpec<readonly [], string>\n readonly txpool_content: RpcMethodSpec<readonly [], JsonValue>\n readonly txpool_contentFrom: RpcMethodSpec<\n readonly [address: EthereumAddress],\n JsonValue\n >\n readonly txpool_inspect: RpcMethodSpec<readonly [], JsonValue>\n readonly txpool_status: RpcMethodSpec<readonly [], JsonValue>\n readonly web3_clientVersion: RpcMethodSpec<readonly [], string>\n readonly web3_sha3: RpcMethodSpec<readonly [data: Hex], Hex>\n}\n\nexport interface EthereumSubscriptionSchema {\n readonly eth_subscribe: RpcMethodSpec<\n readonly [subscription: string, ...options: readonly unknown[]],\n string\n >\n readonly eth_unsubscribe: RpcMethodSpec<\n readonly [subscriptionId: string],\n boolean\n >\n}\n\nexport const ETHEREUM_RPC_METHODS = [\n 'eth_accounts',\n 'eth_baseFee',\n 'eth_blobBaseFee',\n 'eth_blockNumber',\n 'eth_call',\n 'eth_callMany',\n 'eth_capabilities',\n 'eth_chainId',\n 'eth_createAccessList',\n 'eth_estimateGas',\n 'eth_feeHistory',\n 'eth_gasPrice',\n 'eth_getAccount',\n 'eth_getBalance',\n 'eth_getBlockByHash',\n 'eth_getBlockByNumber',\n 'eth_getBlockReceipts',\n 'eth_getBlockTransactionCountByHash',\n 'eth_getBlockTransactionCountByNumber',\n 'eth_getCode',\n 'eth_getFilterChanges',\n 'eth_getFilterLogs',\n 'eth_getLogs',\n 'eth_getProof',\n 'eth_getRawTransactionByHash',\n 'eth_getStorageAt',\n 'eth_getTransactionByBlockHashAndIndex',\n 'eth_getTransactionByBlockNumberAndIndex',\n 'eth_getTransactionByHash',\n 'eth_getTransactionBySenderAndNonce',\n 'eth_getTransactionCount',\n 'eth_getTransactionReceipt',\n 'eth_getUncleCountByBlockHash',\n 'eth_getUncleCountByBlockNumber',\n 'eth_maxPriorityFeePerGas',\n 'eth_newBlockFilter',\n 'eth_newFilter',\n 'eth_newPendingTransactionFilter',\n 'eth_sendRawTransaction',\n 'eth_signTransaction',\n 'eth_simulateV1',\n 'eth_submitWork',\n 'eth_syncing',\n 'eth_uninstallFilter',\n 'net_listening',\n 'net_peerCount',\n 'net_version',\n 'txpool_content',\n 'txpool_contentFrom',\n 'txpool_inspect',\n 'txpool_status',\n 'web3_clientVersion',\n 'web3_sha3',\n] as const satisfies readonly (keyof EthereumRpcSchema)[]\n\nexport const ETHEREUM_SUBSCRIPTION_METHODS = [\n 'eth_subscribe',\n 'eth_unsubscribe',\n] as const satisfies readonly (keyof EthereumSubscriptionSchema)[]\n\nexport interface EthereumClient {\n readonly rpc: RpcNamespace<EthereumRpcSchema>\n}\n\nexport const createEthereumClient = (\n transport: HttpJsonRpcTransport,\n): EthereumClient => ({\n rpc: createRpcNamespace<EthereumRpcSchema>({\n transport,\n parameterMode: 'positional',\n }),\n})\n","import { ErpcBatchPolicyError } from '../errors'\nimport type { HttpJsonRpcTransport } from '../transport/http'\nimport { createRpcNamespace, type RpcNamespace } from './client'\nimport type {\n JsonObject,\n JsonValue,\n RpcBatchCall,\n RpcMethodSpec,\n} from './types'\n\nexport type SolanaCommitment = 'confirmed' | 'finalized' | 'processed'\nexport type SolanaEncoding = 'base58' | 'base64' | 'base64+zstd' | 'jsonParsed'\nexport type SolanaConfig = Readonly<Record<string, unknown>>\n\nexport interface SolanaContext {\n readonly apiVersion?: string\n readonly slot: number\n}\n\nexport interface SolanaContextResult<TValue> {\n readonly context: SolanaContext\n readonly value: TValue\n}\n\nexport interface PriorityFeeEstimate {\n readonly priorityFeeEstimate: number\n readonly [key: string]: unknown\n}\n\nexport interface SolanaRpcSchema {\n readonly getAccountInfo: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n SolanaContextResult<JsonValue | null>\n >\n readonly getBalance: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n SolanaContextResult<number>\n >\n readonly getBlock: RpcMethodSpec<\n readonly [slot: number, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getBlockCommitment: RpcMethodSpec<\n readonly [slot: number],\n JsonValue\n >\n readonly getBlockHeight: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n number\n >\n readonly getBlockProduction: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getBlockTime: RpcMethodSpec<\n readonly [slot: number],\n number | null\n >\n readonly getBlocks: RpcMethodSpec<\n readonly [startSlot: number, endSlot?: number, commitment?: SolanaCommitment],\n readonly number[]\n >\n readonly getBlocksWithLimit: RpcMethodSpec<\n readonly [startSlot: number, limit: number, commitment?: SolanaCommitment],\n readonly number[]\n >\n readonly getClusterNodes: RpcMethodSpec<readonly [], JsonValue>\n readonly getEpochInfo: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getEpochSchedule: RpcMethodSpec<readonly [], JsonValue>\n readonly getFeeForMessage: RpcMethodSpec<\n readonly [message: string, config?: SolanaConfig],\n SolanaContextResult<number | null>\n >\n readonly getFirstAvailableBlock: RpcMethodSpec<readonly [], number>\n readonly getGenesisHash: RpcMethodSpec<readonly [], string>\n readonly getHealth: RpcMethodSpec<readonly [], string>\n readonly getHighestSnapshotSlot: RpcMethodSpec<readonly [], JsonValue>\n readonly getIdentity: RpcMethodSpec<readonly [], JsonValue>\n readonly getInflationGovernor: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getInflationRate: RpcMethodSpec<readonly [], JsonValue>\n readonly getInflationReward: RpcMethodSpec<\n readonly [addresses: readonly string[], config?: SolanaConfig],\n JsonValue\n >\n readonly getLargestAccounts: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getLatestBlockhash: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getLeaderSchedule: RpcMethodSpec<\n readonly [slot?: number | null, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getMaxRetransmitSlot: RpcMethodSpec<readonly [], number>\n readonly getMaxShredInsertSlot: RpcMethodSpec<readonly [], number>\n readonly getMinimumBalanceForRentExemption: RpcMethodSpec<\n readonly [dataLength: number, config?: SolanaConfig],\n number\n >\n readonly getMultipleAccounts: RpcMethodSpec<\n readonly [addresses: readonly string[], config?: SolanaConfig],\n SolanaContextResult<JsonValue>\n >\n readonly getParsedTransaction: RpcMethodSpec<\n readonly [signature: string, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getPriorityFeeEstimate: RpcMethodSpec<\n readonly [request: SolanaConfig],\n PriorityFeeEstimate\n >\n readonly getProgramAccounts: RpcMethodSpec<\n readonly [programAddress: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getProgramAccountsV2: RpcMethodSpec<\n readonly [programAddress: string, config: SolanaConfig],\n JsonValue\n >\n readonly getRecentPerformanceSamples: RpcMethodSpec<\n readonly [limit?: number],\n JsonValue\n >\n readonly getRecentPrioritizationFees: RpcMethodSpec<\n readonly [addresses?: readonly string[]],\n JsonValue\n >\n readonly getSignatureStatuses: RpcMethodSpec<\n readonly [signatures: readonly string[], config?: SolanaConfig],\n JsonValue\n >\n readonly getSignaturesForAddress: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getSlot: RpcMethodSpec<readonly [config?: SolanaConfig], number>\n readonly getSlotLeader: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n string\n >\n readonly getSlotLeaders: RpcMethodSpec<\n readonly [startSlot: number, limit: number],\n readonly string[]\n >\n readonly getStakeMinimumDelegation: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n SolanaContextResult<number>\n >\n readonly getSupply: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenAccountBalance: RpcMethodSpec<\n readonly [address: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenAccountsByDelegate: RpcMethodSpec<\n readonly [delegate: string, filter: SolanaConfig, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenAccountsByOwner: RpcMethodSpec<\n readonly [owner: string, filter: SolanaConfig, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenLargestAccounts: RpcMethodSpec<\n readonly [mint: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getTokenSupply: RpcMethodSpec<\n readonly [mint: string, config?: SolanaConfig],\n JsonValue\n >\n readonly getTransaction: RpcMethodSpec<\n readonly [signature: string, config?: SolanaConfig],\n JsonValue | null\n >\n readonly getTransactionCount: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n number\n >\n readonly getVersion: RpcMethodSpec<readonly [], JsonObject>\n readonly getVoteAccounts: RpcMethodSpec<\n readonly [config?: SolanaConfig],\n JsonValue\n >\n readonly isBlockhashValid: RpcMethodSpec<\n readonly [blockhash: string, config?: SolanaConfig],\n SolanaContextResult<boolean>\n >\n readonly minimumLedgerSlot: RpcMethodSpec<readonly [], number>\n readonly requestAirdrop: RpcMethodSpec<\n readonly [address: string, lamports: number, config?: SolanaConfig],\n string\n >\n readonly sendTransaction: RpcMethodSpec<\n readonly [transaction: string, config?: SolanaConfig],\n string\n >\n readonly simulateTransaction: RpcMethodSpec<\n readonly [transaction: string, config?: SolanaConfig],\n JsonValue\n >\n}\n\nexport interface AssetRequest {\n readonly id: string\n readonly displayOptions?: Readonly<Record<string, boolean>>\n}\n\nexport interface AssetBatchRequest {\n readonly ids: readonly string[]\n readonly displayOptions?: Readonly<Record<string, boolean>>\n}\n\nexport interface AssetListRequest {\n readonly cursor?: string\n readonly limit?: number\n readonly page?: number\n readonly [key: string]: unknown\n}\n\nexport type IndexedAsset = Readonly<Record<string, unknown>>\nexport type IndexedAssetProof = Readonly<Record<string, unknown>>\n\nexport interface IndexedAssetList<TItem = IndexedAsset> {\n readonly cursor?: string\n readonly items: readonly TItem[]\n readonly limit?: number\n readonly page?: number\n readonly total?: number\n readonly [key: string]: unknown\n}\n\nexport interface SolanaDasSchema {\n readonly getAsset: RpcMethodSpec<AssetRequest, IndexedAsset | null>\n readonly getAssetBatch: RpcMethodSpec<\n AssetBatchRequest,\n readonly (IndexedAsset | null)[]\n >\n readonly getAssetProof: RpcMethodSpec<AssetRequest, IndexedAssetProof | null>\n readonly getAssetProofBatch: RpcMethodSpec<\n AssetBatchRequest,\n readonly (IndexedAssetProof | null)[]\n >\n readonly getAssetsByAuthority: RpcMethodSpec<\n AssetListRequest & { readonly authorityAddress: string },\n IndexedAssetList\n >\n readonly getAssetsByCreator: RpcMethodSpec<\n AssetListRequest & {\n readonly creatorAddress: string\n readonly onlyVerified?: boolean\n },\n IndexedAssetList\n >\n readonly getAssetsByGroup: RpcMethodSpec<\n AssetListRequest & {\n readonly groupKey: string\n readonly groupValue: string\n },\n IndexedAssetList\n >\n readonly getAssetsByOwner: RpcMethodSpec<\n AssetListRequest & { readonly ownerAddress: string },\n IndexedAssetList\n >\n readonly getNftEditions: RpcMethodSpec<\n AssetListRequest & { readonly mint: string },\n Readonly<Record<string, unknown>>\n >\n readonly getSignaturesForAsset: RpcMethodSpec<\n AssetListRequest & { readonly id: string },\n Readonly<Record<string, unknown>>\n >\n readonly getTokenAccounts: RpcMethodSpec<\n AssetListRequest,\n Readonly<Record<string, unknown>>\n >\n readonly getTokensByDelegate: RpcMethodSpec<\n AssetListRequest & { readonly delegate: string },\n Readonly<Record<string, unknown>>\n >\n readonly getTokensByOwner: RpcMethodSpec<\n AssetListRequest & { readonly owner: string },\n Readonly<Record<string, unknown>>\n >\n readonly searchAssets: RpcMethodSpec<AssetListRequest, IndexedAssetList>\n}\n\nexport interface NumericFilter {\n readonly eq?: number\n readonly gt?: number\n readonly gte?: number\n readonly lt?: number\n readonly lte?: number\n}\n\nexport interface AddressTransactionsOptions {\n readonly before?: string\n readonly commitment?: SolanaCommitment\n readonly encoding?: 'base58' | 'base64' | 'json'\n readonly filters?: Readonly<Record<string, unknown>>\n readonly limit?: number\n readonly maxSupportedTransactionVersion?: number\n readonly paginationToken?: string\n readonly sortOrder?: 'asc' | 'desc'\n readonly transactionDetails?: 'full' | 'signatures'\n readonly until?: string\n}\n\nexport interface AddressTransaction {\n readonly blockTime: number | null\n readonly confirmationStatus: SolanaCommitment\n readonly err: unknown\n readonly memo: string | null\n readonly meta?: unknown\n readonly signature: string\n readonly slot: number\n readonly transaction?: unknown\n readonly transactionIndex: number\n readonly version?: unknown\n readonly [key: string]: unknown\n}\n\nexport interface AddressTransactionPage {\n readonly data: readonly AddressTransaction[]\n readonly paginationToken: string | null\n readonly windowStart: number | null\n}\n\nexport interface AddressTransfersOptions {\n readonly commitment?: SolanaCommitment\n readonly direction?: 'any' | 'in' | 'out'\n readonly filters?: {\n readonly amount?: NumericFilter\n readonly blockTime?: NumericFilter\n readonly slot?: NumericFilter\n }\n readonly limit?: number\n readonly mint?: string\n readonly paginationToken?: string\n readonly solMode?: 'merged' | 'separate'\n readonly sortOrder?: 'asc' | 'desc'\n readonly with?: string\n}\n\nexport interface AddressTransfer {\n readonly amount: string\n readonly blockTime: number | null\n readonly confirmationStatus: 'finalized'\n readonly decimals: number\n readonly feeAmount: string | null\n readonly feeUiAmount: string | null\n readonly fromTokenAccount: string | null\n readonly fromUserAccount: string | null\n readonly innerInstructionIdx: number\n readonly instructionIdx: number\n readonly mint: string | null\n readonly signature: string\n readonly slot: number\n readonly toTokenAccount: string | null\n readonly toUserAccount: string | null\n readonly transactionIdx: number\n readonly type:\n | 'burn'\n | 'changeOwner'\n | 'mint'\n | 'transfer'\n | 'unwrap'\n | 'withdrawWithheldFee'\n | 'wrap'\n readonly uiAmount: string\n readonly [key: string]: unknown\n}\n\nexport interface AddressTransferPage {\n readonly data: readonly AddressTransfer[]\n readonly paginationToken: string | null\n readonly windowStart: number | null\n}\n\nexport interface SolanaHistorySchema {\n readonly getTransactionsForAddress: RpcMethodSpec<\n readonly [address: string, options?: AddressTransactionsOptions],\n AddressTransactionPage | null\n >\n readonly getTransfersByAddress: RpcMethodSpec<\n readonly [address: string, options?: AddressTransfersOptions],\n AddressTransferPage\n >\n}\n\nexport interface PingMeasurement {\n readonly city: string | null\n readonly country: string | null\n readonly fromIp: string | null\n readonly icmpReplied: boolean\n readonly lat: number | null\n readonly lon: number | null\n readonly measuredAt: string | null\n readonly ms: number | null\n readonly org: string | null\n readonly postal: string | null\n readonly region: string | null\n readonly timezone: string | null\n readonly [key: string]: unknown\n}\n\nexport interface LeaderSlot {\n readonly epoch: number\n readonly featureSet: string | null\n readonly gossipPort: number | null\n readonly gossipUpdatedAt: string | null\n readonly identity: string\n readonly ipAddress: string | null\n readonly leaderCity: string | null\n readonly leaderCountry: string | null\n readonly leaderLat: number | null\n readonly leaderLon: number | null\n readonly leaderOrg: string | null\n readonly leaderRegion: string | null\n readonly leaderTimezone: string | null\n readonly pingToLeaders: readonly PingMeasurement[]\n readonly rpcAddress: string | null\n readonly slot: string\n readonly stakeWeight: number\n readonly tpuPort: number | null\n readonly tpuQuicPort: number | null\n readonly version: string | null\n readonly [key: string]: unknown\n}\n\nexport interface LeaderSlotsResult {\n readonly data: readonly LeaderSlot[]\n readonly message: string\n readonly success: boolean\n readonly total: number\n readonly [key: string]: unknown\n}\n\nexport interface ValidatorInformation\n extends Omit<LeaderSlot, 'epoch' | 'slot'> {\n readonly gossipNodeId: number | null\n readonly slotCount: number\n}\n\nexport interface ValidatorsInformationOptions {\n readonly country?: string\n readonly limit?: number\n readonly region?: string\n}\n\nexport interface ValidatorsInformationResult {\n readonly data: readonly ValidatorInformation[]\n readonly epoch: number\n readonly message: string\n readonly success: boolean\n readonly total: number\n readonly totalValidators: number\n readonly [key: string]: unknown\n}\n\nexport interface SolanaLeaderSchema {\n readonly getLeaderSlots: RpcMethodSpec<\n readonly [slot: number],\n LeaderSlotsResult\n >\n readonly getValidatorsInformation: RpcMethodSpec<\n readonly [options: ValidatorsInformationOptions],\n ValidatorsInformationResult\n >\n}\n\nexport type AnalyticsTimeBound = number | string\n\nexport interface TopProgramsOptions {\n readonly includeVotes?: boolean\n readonly limit?: number\n readonly since?: AnalyticsTimeBound\n readonly until?: AnalyticsTimeBound\n}\n\nexport interface TopProgramRow {\n readonly errors: string\n readonly invocations: string\n readonly program: string\n readonly total_cus: string\n readonly [key: string]: unknown\n}\n\nexport type SlotStatsOptions =\n | { readonly slot: number }\n | { readonly fromSlot: number; readonly toSlot: number }\n\nexport interface SlotStatsRow {\n readonly block_time: number\n readonly non_vote_transaction_count: number\n readonly slot: number\n readonly transaction_count: number\n readonly vote_transaction_count: number\n readonly [key: string]: unknown\n}\n\nexport interface TpsTimeseriesOptions {\n readonly bucketSec?: number\n readonly from: AnalyticsTimeBound\n readonly to: AnalyticsTimeBound\n}\n\nexport interface TpsBucket {\n readonly bucket: number\n readonly non_vote_tps: number\n readonly total_tps: number\n readonly [key: string]: unknown\n}\n\nexport interface EpochSummary {\n readonly distinct_programs: string\n readonly epoch: number\n readonly first_block_time: number\n readonly last_block_time: number\n readonly non_vote_txs: string\n readonly program_invocations: string\n readonly slots: string\n readonly total_txs: string\n readonly vote_txs: string\n readonly [key: string]: unknown\n}\n\nexport interface ProgramStatsOptions {\n readonly bucketSec?: number\n readonly programIdBase58: string\n readonly since?: AnalyticsTimeBound\n readonly until?: AnalyticsTimeBound\n}\n\nexport interface ProgramStatsBucket {\n readonly bucket: number\n readonly errors: string\n readonly invocations: string\n readonly total_cus: string\n readonly [key: string]: unknown\n}\n\nexport interface SolanaAnalyticsSchema {\n readonly jetEpochSummary: RpcMethodSpec<\n readonly [options: { readonly epoch: number }],\n EpochSummary | null\n >\n readonly jetProgramStats: RpcMethodSpec<\n readonly [options: ProgramStatsOptions],\n readonly ProgramStatsBucket[]\n >\n readonly jetSlotStats: RpcMethodSpec<\n readonly [options: SlotStatsOptions],\n readonly SlotStatsRow[]\n >\n readonly jetTopPrograms: RpcMethodSpec<\n readonly [options: TopProgramsOptions],\n readonly TopProgramRow[]\n >\n readonly jetTpsTimeseries: RpcMethodSpec<\n readonly [options: TpsTimeseriesOptions],\n readonly TpsBucket[]\n >\n}\n\nexport const SOLANA_RPC_METHODS = [\n 'getAccountInfo',\n 'getBalance',\n 'getBlock',\n 'getBlockCommitment',\n 'getBlockHeight',\n 'getBlockProduction',\n 'getBlockTime',\n 'getBlocks',\n 'getBlocksWithLimit',\n 'getClusterNodes',\n 'getEpochInfo',\n 'getEpochSchedule',\n 'getFeeForMessage',\n 'getFirstAvailableBlock',\n 'getGenesisHash',\n 'getHealth',\n 'getHighestSnapshotSlot',\n 'getIdentity',\n 'getInflationGovernor',\n 'getInflationRate',\n 'getInflationReward',\n 'getLargestAccounts',\n 'getLatestBlockhash',\n 'getLeaderSchedule',\n 'getMaxRetransmitSlot',\n 'getMaxShredInsertSlot',\n 'getMinimumBalanceForRentExemption',\n 'getMultipleAccounts',\n 'getParsedTransaction',\n 'getPriorityFeeEstimate',\n 'getProgramAccounts',\n 'getProgramAccountsV2',\n 'getRecentPerformanceSamples',\n 'getRecentPrioritizationFees',\n 'getSignatureStatuses',\n 'getSignaturesForAddress',\n 'getSlot',\n 'getSlotLeader',\n 'getSlotLeaders',\n 'getStakeMinimumDelegation',\n 'getSupply',\n 'getTokenAccountBalance',\n 'getTokenAccountsByDelegate',\n 'getTokenAccountsByOwner',\n 'getTokenLargestAccounts',\n 'getTokenSupply',\n 'getTransaction',\n 'getTransactionCount',\n 'getVersion',\n 'getVoteAccounts',\n 'isBlockhashValid',\n 'minimumLedgerSlot',\n 'requestAirdrop',\n 'sendTransaction',\n 'simulateTransaction',\n] as const satisfies readonly (keyof SolanaRpcSchema)[]\n\nexport const SOLANA_DAS_METHODS = [\n 'getAsset',\n 'getAssetBatch',\n 'getAssetProof',\n 'getAssetProofBatch',\n 'getAssetsByAuthority',\n 'getAssetsByCreator',\n 'getAssetsByGroup',\n 'getAssetsByOwner',\n 'getNftEditions',\n 'getSignaturesForAsset',\n 'getTokenAccounts',\n 'getTokensByDelegate',\n 'getTokensByOwner',\n 'searchAssets',\n] as const satisfies readonly (keyof SolanaDasSchema)[]\n\nexport const SOLANA_HISTORY_METHODS = [\n 'getTransactionsForAddress',\n 'getTransfersByAddress',\n] as const satisfies readonly (keyof SolanaHistorySchema)[]\n\nexport const SOLANA_LEADER_METHODS = [\n 'getLeaderSlots',\n 'getValidatorsInformation',\n] as const satisfies readonly (keyof SolanaLeaderSchema)[]\n\nexport const SOLANA_ANALYTICS_METHODS = [\n 'jetEpochSummary',\n 'jetProgramStats',\n 'jetSlotStats',\n 'jetTopPrograms',\n 'jetTpsTimeseries',\n] as const satisfies readonly (keyof SolanaAnalyticsSchema)[]\n\nconst heavyRpcMethods = new Set<string>([\n 'getPriorityFeeEstimate',\n 'getProgramAccounts',\n 'getProgramAccountsV2',\n 'getTokenLargestAccounts',\n])\n\nconst validateStandardBatch = (calls: readonly RpcBatchCall[]) => {\n let containsHeavy = false\n let containsStandard = false\n for (const call of calls) {\n if (heavyRpcMethods.has(call.method)) containsHeavy = true\n else containsStandard = true\n }\n if (containsHeavy && containsStandard) {\n throw new ErpcBatchPolicyError(\n 'Solana indexed and standard RPC methods cannot share a batch',\n )\n }\n}\n\nconst rejectLeaderBatch = (calls: readonly RpcBatchCall[]) => {\n if (calls.length > 0) {\n throw new ErpcBatchPolicyError('Leader RPC methods do not support batching')\n }\n}\n\nexport interface SolanaClient {\n readonly analytics: RpcNamespace<SolanaAnalyticsSchema>\n readonly das: RpcNamespace<SolanaDasSchema>\n readonly history: RpcNamespace<SolanaHistorySchema>\n readonly leaders: RpcNamespace<SolanaLeaderSchema>\n readonly rpc: RpcNamespace<SolanaRpcSchema>\n}\n\nexport const createSolanaClient = (\n transport: HttpJsonRpcTransport,\n): SolanaClient => ({\n rpc: createRpcNamespace<SolanaRpcSchema>({\n transport,\n parameterMode: 'positional',\n validateBatch: validateStandardBatch,\n }),\n das: createRpcNamespace<SolanaDasSchema>({\n transport,\n parameterMode: 'named',\n }),\n history: createRpcNamespace<SolanaHistorySchema>({\n transport,\n parameterMode: 'positional',\n }),\n leaders: createRpcNamespace<SolanaLeaderSchema>({\n transport,\n parameterMode: 'positional',\n validateBatch: rejectLeaderBatch,\n }),\n analytics: createRpcNamespace<SolanaAnalyticsSchema>({\n transport,\n parameterMode: 'positional',\n }),\n})\n","import {\n ErpcAbortedError,\n ErpcConfigError,\n ErpcInvalidResponseError,\n ErpcJsonRpcError,\n ErpcTimeoutError,\n ErpcTransportError,\n redactJsonRpcError,\n} from '../errors'\nimport type { JsonRpcTransport } from '../rpc/client'\nimport type {\n JsonRpcErrorObject,\n JsonRpcId,\n JsonRpcParams,\n RpcBatchCall,\n RpcSendOptions,\n} from '../rpc/types'\n\nexport interface RpcNotification {\n readonly jsonrpc: '2.0'\n readonly method: string\n readonly params: unknown\n}\n\nexport type RpcNotificationListener = (notification: RpcNotification) => void\n\nexport interface WebSocketTransportConfig {\n readonly endpoint: URL\n readonly maxBatchSize?: number\n readonly timeoutMs: number\n readonly webSocket?: typeof globalThis.WebSocket\n}\n\ninterface PendingResponse {\n readonly cleanup: () => void\n readonly reject: (reason: unknown) => void\n readonly resolve: (value: unknown) => void\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isRpcError = (value: unknown): value is JsonRpcErrorObject =>\n isObject(value) &&\n typeof value.code === 'number' &&\n typeof value.message === 'string'\n\nconst publicEndpoint = (endpoint: URL): string => {\n const url = new URL(endpoint)\n url.search = ''\n url.hash = ''\n return url.toString()\n}\n\nexport class WebSocketJsonRpcTransport implements JsonRpcTransport {\n readonly endpoint: string\n readonly maxBatchSize: number\n\n readonly #connectionUrl: string\n readonly #credential: string | undefined\n readonly #listeners = new Set<RpcNotificationListener>()\n readonly #pending = new Map<JsonRpcId, PendingResponse>()\n readonly #timeoutMs: number\n readonly #webSocket?: typeof globalThis.WebSocket\n #connectPromise: Promise<void> | undefined\n #nextId = 1\n #socket: WebSocket | undefined\n\n constructor(config: WebSocketTransportConfig) {\n const implementation = config.webSocket ?? globalThis.WebSocket\n if (typeof implementation === 'function') this.#webSocket = implementation\n this.#credential = config.endpoint.searchParams.get('api-key') ?? undefined\n this.#connectionUrl = config.endpoint.toString()\n this.endpoint = publicEndpoint(config.endpoint)\n this.maxBatchSize = config.maxBatchSize ?? 256\n this.#timeoutMs = config.timeoutMs\n }\n\n async connect(): Promise<void> {\n if (this.#socket?.readyState === 1) return\n if (this.#connectPromise) return this.#connectPromise\n if (!this.#webSocket) {\n throw new ErpcConfigError(\n 'A WebSocket implementation is required for subscriptions',\n )\n }\n\n this.#connectPromise = new Promise<void>((resolve, reject) => {\n const socket = new this.#webSocket!(this.#connectionUrl)\n this.#socket = socket\n\n const timeout = setTimeout(() => {\n socket.close()\n reject(new ErpcTimeoutError(this.#timeoutMs))\n }, this.#timeoutMs)\n\n socket.addEventListener(\n 'open',\n () => {\n clearTimeout(timeout)\n resolve()\n },\n { once: true },\n )\n socket.addEventListener(\n 'error',\n () => {\n clearTimeout(timeout)\n reject(new ErpcTransportError('Unable to connect to ERPC WebSocket'))\n },\n { once: true },\n )\n socket.addEventListener('message', (event: MessageEvent<unknown>) => {\n void this.#onMessage(event.data)\n })\n socket.addEventListener('close', () => {\n this.#socket = undefined\n this.#connectPromise = undefined\n const error = new ErpcTransportError('ERPC WebSocket connection closed')\n for (const pending of this.#pending.values()) pending.reject(error)\n this.#pending.clear()\n })\n }).catch((error: unknown) => {\n this.#connectPromise = undefined\n throw error\n })\n\n return this.#connectPromise\n }\n\n close(code = 1000, reason = 'Client closed connection'): void {\n this.#socket?.close(code, reason)\n this.#socket = undefined\n this.#connectPromise = undefined\n }\n\n onNotification(listener: RpcNotificationListener): () => void {\n this.#listeners.add(listener)\n return () => this.#listeners.delete(listener)\n }\n\n async request<TResult>(\n method: string,\n params?: JsonRpcParams,\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n await this.connect()\n const id = this.#id()\n const promise = this.#waitFor<TResult>(id, options)\n const request: Record<string, unknown> = { jsonrpc: '2.0', id, method }\n if (params !== undefined) request.params = params\n this.#send(request, id)\n return promise\n }\n\n async batch<TResult extends readonly unknown[]>(\n calls: readonly RpcBatchCall[],\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n if (calls.length === 0) return [] as unknown as TResult\n if (calls.length > this.maxBatchSize) {\n throw new ErpcInvalidResponseError(\n `A batch may contain at most ${this.maxBatchSize} calls`,\n )\n }\n\n await this.connect()\n const requests = calls.map((call) => {\n const id = this.#id()\n const request: Record<string, unknown> = {\n jsonrpc: '2.0',\n id,\n method: call.method,\n }\n if (call.params !== undefined) request.params = call.params\n return { id, request, response: this.#waitFor(id, options) }\n })\n\n try {\n this.#socket?.send(JSON.stringify(requests.map(({ request }) => request)))\n } catch (error) {\n for (const { id } of requests) this.#reject(id, error)\n }\n return Promise.all(requests.map(({ response }) => response)) as unknown as Promise<TResult>\n }\n\n #id(): number {\n const id = this.#nextId\n this.#nextId = id >= Number.MAX_SAFE_INTEGER ? 1 : id + 1\n return id\n }\n\n #send(request: unknown, id: JsonRpcId): void {\n try {\n this.#socket?.send(JSON.stringify(request))\n } catch (error) {\n this.#reject(id, error)\n }\n }\n\n #waitFor<TResult>(\n id: JsonRpcId,\n options: RpcSendOptions,\n ): Promise<TResult> {\n return new Promise<TResult>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.#pending.delete(id)\n reject(new ErpcTimeoutError(this.#timeoutMs))\n }, this.#timeoutMs)\n\n const abort = () => {\n clearTimeout(timeout)\n this.#pending.delete(id)\n reject(new ErpcAbortedError())\n }\n options.signal?.addEventListener('abort', abort, { once: true })\n\n const cleanup = () => {\n clearTimeout(timeout)\n options.signal?.removeEventListener('abort', abort)\n }\n this.#pending.set(id, {\n resolve: (value) => resolve(value as TResult),\n reject,\n cleanup,\n })\n if (options.signal?.aborted) abort()\n })\n }\n\n #reject(id: JsonRpcId, _reason: unknown): void {\n const pending = this.#pending.get(id)\n if (!pending) return\n pending.cleanup()\n this.#pending.delete(id)\n // A custom WebSocket implementation may include its connection URL in a\n // thrown error, so never retain the original error as a public cause.\n pending.reject(\n new ErpcTransportError('Unable to send ERPC WebSocket request'),\n )\n }\n\n async #onMessage(data: unknown): Promise<void> {\n const text = await this.#messageText(data)\n if (text === null) return\n\n let parsed: unknown\n try {\n parsed = JSON.parse(text) as unknown\n } catch {\n return\n }\n\n if (Array.isArray(parsed)) {\n for (const item of parsed) this.#dispatch(item)\n } else {\n this.#dispatch(parsed)\n }\n }\n\n async #messageText(data: unknown): Promise<string | null> {\n if (typeof data === 'string') return data\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data)\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength),\n )\n }\n if (typeof Blob !== 'undefined' && data instanceof Blob) return data.text()\n return null\n }\n\n #dispatch(message: unknown): void {\n if (!isObject(message)) return\n const id = message.id\n if (typeof id === 'number' || typeof id === 'string') {\n const pending = this.#pending.get(id)\n if (!pending) return\n pending.cleanup()\n this.#pending.delete(id)\n if (isRpcError(message.error)) {\n pending.reject(\n new ErpcJsonRpcError(\n redactJsonRpcError(message.error, this.#credential),\n ),\n )\n }\n else if ('result' in message) pending.resolve(message.result)\n else pending.reject(new ErpcInvalidResponseError())\n return\n }\n\n if (\n message.jsonrpc === '2.0' &&\n typeof message.method === 'string' &&\n 'params' in message\n ) {\n const notification: RpcNotification = {\n jsonrpc: '2.0',\n method: message.method,\n params: message.params,\n }\n for (const listener of this.#listeners) listener(notification)\n }\n }\n}\n","import { createRpcNamespace, type RpcNamespace } from './rpc/client'\nimport type { EthereumSubscriptionSchema } from './rpc/ethereum'\nimport type { RpcMethodSpec } from './rpc/types'\nimport {\n WebSocketJsonRpcTransport,\n type RpcNotification,\n type RpcNotificationListener,\n} from './transport/websocket'\n\nexport type SubscriptionId = number | string\nexport type SubscriptionListener<TResult> = (result: TResult) => void\n\ninterface NotificationParams {\n readonly result: unknown\n readonly subscription: SubscriptionId\n}\n\nconst notificationParams = (\n notification: RpcNotification,\n): NotificationParams | null => {\n if (typeof notification.params !== 'object' || notification.params === null) {\n return null\n }\n const params = notification.params as Record<string, unknown>\n if (\n (typeof params.subscription !== 'number' &&\n typeof params.subscription !== 'string') ||\n !('result' in params)\n ) {\n return null\n }\n return {\n subscription: params.subscription,\n result: params.result,\n }\n}\n\nexport class RpcSubscription<TId extends SubscriptionId = SubscriptionId> {\n readonly id: TId\n readonly #unsubscribe: () => Promise<boolean>\n #closed = false\n\n constructor(id: TId, unsubscribe: () => Promise<boolean>) {\n this.id = id\n this.#unsubscribe = unsubscribe\n }\n\n async unsubscribe(): Promise<boolean> {\n if (this.#closed) return true\n const result = await this.#unsubscribe()\n if (result) this.#closed = true\n return result\n }\n}\n\nexport class EthereumSubscriptions {\n readonly rpc: RpcNamespace<EthereumSubscriptionSchema>\n readonly #transport: WebSocketJsonRpcTransport\n\n constructor(transport: WebSocketJsonRpcTransport) {\n this.#transport = transport\n this.rpc = createRpcNamespace<EthereumSubscriptionSchema>({\n transport,\n parameterMode: 'positional',\n })\n }\n\n close(): void {\n this.#transport.close()\n }\n\n onNotification(listener: RpcNotificationListener): () => void {\n return this.#transport.onNotification(listener)\n }\n\n async subscribe<TResult = unknown>(\n subscription: string,\n listener: SubscriptionListener<TResult>,\n ...options: readonly unknown[]\n ): Promise<RpcSubscription<string>> {\n let id: string | undefined\n const removeListener = this.#transport.onNotification((notification) => {\n const params = notificationParams(notification)\n if (params && params.subscription === id) listener(params.result as TResult)\n })\n\n try {\n id = await this.#transport.request<string>('eth_subscribe', [\n subscription,\n ...options,\n ])\n } catch (error) {\n removeListener()\n throw error\n }\n\n return new RpcSubscription(id, async () => {\n const result = await this.#transport.request<boolean>('eth_unsubscribe', [\n id,\n ])\n if (result) removeListener()\n return result\n })\n }\n}\n\nexport interface SolanaEnhancedSubscriptionSchema {\n readonly accountSubscribe: RpcMethodSpec<\n readonly [address: string, options?: Readonly<Record<string, unknown>>],\n number\n >\n readonly accountUnsubscribe: RpcMethodSpec<\n readonly [subscriptionId: number],\n boolean\n >\n readonly transactionSubscribe: RpcMethodSpec<\n readonly [\n filter: Readonly<Record<string, unknown>>,\n options?: Readonly<Record<string, unknown>>,\n ],\n number\n >\n readonly transactionUnsubscribe: RpcMethodSpec<\n readonly [subscriptionId: number],\n boolean\n >\n}\n\nexport const SOLANA_ENHANCED_SUBSCRIPTION_METHODS = [\n 'accountSubscribe',\n 'accountUnsubscribe',\n 'transactionSubscribe',\n 'transactionUnsubscribe',\n] as const satisfies readonly (keyof SolanaEnhancedSubscriptionSchema)[]\n\nexport class SolanaSubscriptions {\n readonly rpc: RpcNamespace<SolanaEnhancedSubscriptionSchema>\n readonly #transport: WebSocketJsonRpcTransport\n\n constructor(transport: WebSocketJsonRpcTransport) {\n this.#transport = transport\n this.rpc = createRpcNamespace<SolanaEnhancedSubscriptionSchema>({\n transport,\n parameterMode: 'positional',\n })\n }\n\n close(): void {\n this.#transport.close()\n }\n\n onNotification(listener: RpcNotificationListener): () => void {\n return this.#transport.onNotification(listener)\n }\n\n accountSubscribe<TResult = unknown>(\n address: string,\n listener: SubscriptionListener<TResult>,\n options?: Readonly<Record<string, unknown>>,\n ): Promise<RpcSubscription<number>> {\n const params = options === undefined ? [address] : [address, options]\n return this.#subscribe<number, TResult>(\n 'accountSubscribe',\n params,\n 'accountUnsubscribe',\n listener,\n )\n }\n\n transactionSubscribe<TResult = unknown>(\n filter: Readonly<Record<string, unknown>>,\n listener: SubscriptionListener<TResult>,\n options?: Readonly<Record<string, unknown>>,\n ): Promise<RpcSubscription<number>> {\n const params = options === undefined ? [filter] : [filter, options]\n return this.#subscribe<number, TResult>(\n 'transactionSubscribe',\n params,\n 'transactionUnsubscribe',\n listener,\n )\n }\n\n async rawSubscribe<TResult = unknown>(\n subscribeMethod: string,\n params: readonly unknown[],\n unsubscribeMethod: string,\n listener: SubscriptionListener<TResult>,\n ): Promise<RpcSubscription> {\n return this.#subscribe(\n subscribeMethod,\n params,\n unsubscribeMethod,\n listener,\n )\n }\n\n async #subscribe<TId extends SubscriptionId, TResult>(\n subscribeMethod: string,\n params: readonly unknown[],\n unsubscribeMethod: string,\n listener: SubscriptionListener<TResult>,\n ): Promise<RpcSubscription<TId>> {\n let id: TId | undefined\n const removeListener = this.#transport.onNotification((notification) => {\n const value = notificationParams(notification)\n if (value && value.subscription === id) listener(value.result as TResult)\n })\n\n try {\n id = await this.#transport.request<TId>(subscribeMethod, params)\n } catch (error) {\n removeListener()\n throw error\n }\n\n return new RpcSubscription(id, async () => {\n const result = await this.#transport.request<boolean>(unsubscribeMethod, [\n id,\n ])\n if (result) removeListener()\n return result\n })\n }\n}\n","import {\n ErpcAbortedError,\n ErpcHttpError,\n ErpcInvalidResponseError,\n ErpcJsonRpcError,\n ErpcTimeoutError,\n ErpcTransportError,\n redactJsonRpcError,\n} from '../errors'\nimport type {\n JsonRpcFailure,\n JsonRpcId,\n JsonRpcParams,\n JsonRpcRequest,\n JsonRpcResponse,\n RpcBatchCall,\n RpcSendOptions,\n} from '../rpc/types'\n\nexport interface HttpTransportConfig {\n readonly apiKey: string\n readonly endpoint: URL\n readonly fetch: typeof globalThis.fetch\n readonly headers: Readonly<Record<string, string>>\n readonly maxBatchSize?: number\n readonly timeoutMs: number\n}\n\ninterface ControlledSignal {\n readonly cleanup: () => void\n readonly signal: AbortSignal\n readonly timedOut: () => boolean\n}\n\nconst controlledSignal = (\n timeoutMs: number,\n external?: AbortSignal,\n): ControlledSignal => {\n const controller = new AbortController()\n let didTimeOut = false\n\n const timeout = setTimeout(() => {\n didTimeOut = true\n controller.abort()\n }, timeoutMs)\n\n const abort = () => controller.abort()\n if (external?.aborted) controller.abort()\n else external?.addEventListener('abort', abort, { once: true })\n\n return {\n signal: controller.signal,\n timedOut: () => didTimeOut,\n cleanup: () => {\n clearTimeout(timeout)\n external?.removeEventListener('abort', abort)\n },\n }\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isFailure = (value: unknown): value is JsonRpcFailure =>\n isObject(value) &&\n isObject(value.error) &&\n typeof value.error.code === 'number' &&\n typeof value.error.message === 'string'\n\nconst parseJson = (text: string): unknown => {\n try {\n return JSON.parse(text) as unknown\n } catch {\n throw new ErpcInvalidResponseError('ERPC returned malformed JSON')\n }\n}\n\nexport class HttpJsonRpcTransport {\n readonly endpoint: string\n readonly maxBatchSize: number\n\n readonly #apiKey: string\n readonly #fetch: typeof globalThis.fetch\n readonly #headers: Readonly<Record<string, string>>\n readonly #timeoutMs: number\n #nextId = 1\n\n constructor(config: HttpTransportConfig) {\n this.#apiKey = config.apiKey\n this.#fetch = config.fetch\n this.#headers = config.headers\n this.#timeoutMs = config.timeoutMs\n this.maxBatchSize = config.maxBatchSize ?? 256\n\n const endpoint = new URL(config.endpoint)\n endpoint.search = ''\n endpoint.hash = ''\n this.endpoint = endpoint.toString()\n }\n\n async request<TResult>(\n method: string,\n params?: JsonRpcParams,\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n const id = this.#id()\n const request = this.#request(id, method, params)\n const response = await this.#post(request, options)\n return this.#unwrap<TResult>(response, id)\n }\n\n async batch<TResult extends readonly unknown[]>(\n calls: readonly RpcBatchCall[],\n options: RpcSendOptions = {},\n ): Promise<TResult> {\n if (calls.length === 0) return [] as unknown as TResult\n if (calls.length > this.maxBatchSize) {\n throw new ErpcInvalidResponseError(\n `A batch may contain at most ${this.maxBatchSize} calls`,\n )\n }\n\n const requests = calls.map((call) => {\n const id = this.#id()\n return this.#request(id, call.method, call.params)\n })\n const raw = await this.#post(requests, options)\n if (!Array.isArray(raw)) {\n if (isFailure(raw)) {\n throw new ErpcJsonRpcError(redactJsonRpcError(raw.error, this.#apiKey))\n }\n throw new ErpcInvalidResponseError('ERPC returned a non-array batch response')\n }\n\n const expectedIds = new Set<JsonRpcId>(requests.map((request) => request.id))\n const byId = new Map<JsonRpcId, unknown>()\n for (const response of raw) {\n if (!isObject(response) || !('id' in response)) {\n throw new ErpcInvalidResponseError('ERPC returned an invalid batch item')\n }\n const id = response.id\n if (typeof id !== 'number' && typeof id !== 'string') {\n throw new ErpcInvalidResponseError('ERPC returned an invalid batch id')\n }\n if (!expectedIds.has(id)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an unexpected batch response id',\n )\n }\n if (byId.has(id)) {\n throw new ErpcInvalidResponseError(\n `ERPC returned duplicate batch response id ${String(id)}`,\n )\n }\n byId.set(id, response)\n }\n\n const results = requests.map((request) => {\n const response = byId.get(request.id)\n if (response === undefined) {\n throw new ErpcInvalidResponseError(\n `ERPC omitted batch response id ${String(request.id)}`,\n )\n }\n return this.#unwrap(response, request.id)\n })\n return results as unknown as TResult\n }\n\n #id(): number {\n const id = this.#nextId\n this.#nextId = id >= Number.MAX_SAFE_INTEGER ? 1 : id + 1\n return id\n }\n\n #request(\n id: JsonRpcId,\n method: string,\n params?: JsonRpcParams,\n ): JsonRpcRequest<JsonRpcParams> {\n const request: {\n jsonrpc: '2.0'\n id: JsonRpcId\n method: string\n params?: JsonRpcParams\n } = { jsonrpc: '2.0', id, method }\n if (params !== undefined) request.params = params\n return request\n }\n\n async #post(\n body: unknown,\n options: RpcSendOptions,\n ): Promise<unknown> {\n const url = new URL(this.endpoint)\n url.searchParams.set('api-key', this.#apiKey)\n const controlled = controlledSignal(this.#timeoutMs, options.signal)\n\n try {\n const response = await this.#fetch(url, {\n method: 'POST',\n headers: {\n ...this.#headers,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n signal: controlled.signal,\n })\n const text = await response.text()\n if (!response.ok) throw new ErpcHttpError(response.status)\n return parseJson(text)\n } catch (error) {\n if (error instanceof ErpcHttpError || error instanceof ErpcInvalidResponseError) {\n throw error\n }\n if (controlled.timedOut()) throw new ErpcTimeoutError(this.#timeoutMs)\n if (options.signal?.aborted) throw new ErpcAbortedError()\n // Do not retain the underlying fetch error: custom runtimes may include\n // the credential-bearing request URL or headers in its message.\n throw new ErpcTransportError('Unable to reach ERPC')\n } finally {\n controlled.cleanup()\n }\n }\n\n #unwrap<TResult>(response: unknown, expectedId: JsonRpcId): TResult {\n if (!isObject(response)) throw new ErpcInvalidResponseError()\n if (response.id !== expectedId) {\n throw new ErpcInvalidResponseError('ERPC returned an unexpected response id')\n }\n if (isFailure(response)) {\n throw new ErpcJsonRpcError(\n redactJsonRpcError(response.error, this.#apiKey),\n )\n }\n if (!('result' in response)) throw new ErpcInvalidResponseError()\n return (response as unknown as JsonRpcResponse<TResult> & { result: TResult })\n .result\n }\n}\n","import { ErpcConfigError, ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport interface MonthlyApiKeyMethodUsage {\n readonly count: number\n readonly creditCost: number\n readonly credits: number\n readonly method: string\n readonly updatedAt: string | null\n}\n\nexport interface MonthlyApiKeyChainUsage {\n readonly chain: string\n readonly count: number\n readonly credits: number\n readonly methods: readonly MonthlyApiKeyMethodUsage[]\n readonly updatedAt: string | null\n}\n\nexport interface MonthlyApiKeyUsageEntry {\n readonly apiKeyLast4: string\n readonly apiKeyLength: number\n readonly chains: readonly MonthlyApiKeyChainUsage[]\n readonly count: number\n readonly credits: number\n readonly keyId: number | null\n readonly updatedAt: string | null\n}\n\nexport interface MonthlyApiKeyUsage {\n readonly apiKeys: readonly MonthlyApiKeyUsageEntry[]\n readonly chains: readonly MonthlyApiKeyChainUsage[]\n readonly hasStrandedUsage: boolean\n readonly keyCount: number\n readonly totalCount: number\n readonly totalCredits: number\n readonly updatedAt: string | null\n readonly yearMonth: string\n}\n\nexport interface MonthlyApiKeyUsageParams {\n /** Calendar month in `YYYY-MM` format. The current month is used when omitted. */\n readonly yearMonth?: string\n}\n\nconst YEAR_MONTH = /^\\d{4}-(0[1-9]|1[0-2])$/\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst isTimestamp = (value: unknown): value is string | null =>\n value === null || typeof value === 'string'\n\nconst parseMethod = (value: unknown): MonthlyApiKeyMethodUsage | null => {\n const method = objectValue(value)\n if (\n method === null ||\n typeof method.count !== 'number' ||\n typeof method.creditCost !== 'number' ||\n typeof method.credits !== 'number' ||\n typeof method.method !== 'string' ||\n !isTimestamp(method.updatedAt)\n ) return null\n return {\n count: method.count,\n creditCost: method.creditCost,\n credits: method.credits,\n method: method.method,\n updatedAt: method.updatedAt,\n }\n}\n\nconst parseChain = (value: unknown): MonthlyApiKeyChainUsage | null => {\n const chain = objectValue(value)\n if (\n chain === null ||\n typeof chain.chain !== 'string' ||\n typeof chain.count !== 'number' ||\n typeof chain.credits !== 'number' ||\n !Array.isArray(chain.methods) ||\n !isTimestamp(chain.updatedAt)\n ) return null\n const methods = chain.methods.map(parseMethod)\n if (methods.some((method) => method === null)) return null\n return {\n chain: chain.chain,\n count: chain.count,\n credits: chain.credits,\n methods: methods as readonly MonthlyApiKeyMethodUsage[],\n updatedAt: chain.updatedAt,\n }\n}\n\nconst parseApiKey = (value: unknown): MonthlyApiKeyUsageEntry | null => {\n const apiKey = objectValue(value)\n if (\n apiKey === null ||\n typeof apiKey.apiKeyLast4 !== 'string' ||\n typeof apiKey.apiKeyLength !== 'number' ||\n !Array.isArray(apiKey.chains) ||\n typeof apiKey.count !== 'number' ||\n typeof apiKey.credits !== 'number' ||\n (apiKey.keyId !== null && typeof apiKey.keyId !== 'number') ||\n !isTimestamp(apiKey.updatedAt)\n ) return null\n const chains = apiKey.chains.map(parseChain)\n if (chains.some((chain) => chain === null)) return null\n return {\n apiKeyLast4: apiKey.apiKeyLast4,\n apiKeyLength: apiKey.apiKeyLength,\n chains: chains as readonly MonthlyApiKeyChainUsage[],\n count: apiKey.count,\n credits: apiKey.credits,\n keyId: apiKey.keyId,\n updatedAt: apiKey.updatedAt,\n }\n}\n\nconst parseMonthlyUsage = (value: unknown): MonthlyApiKeyUsage | null => {\n const usage = objectValue(value)\n if (\n usage === null ||\n !Array.isArray(usage.apiKeys) ||\n !Array.isArray(usage.chains) ||\n typeof usage.hasStrandedUsage !== 'boolean' ||\n typeof usage.keyCount !== 'number' ||\n typeof usage.totalCount !== 'number' ||\n typeof usage.totalCredits !== 'number' ||\n !isTimestamp(usage.updatedAt) ||\n typeof usage.yearMonth !== 'string' ||\n !YEAR_MONTH.test(usage.yearMonth)\n ) return null\n const apiKeys = usage.apiKeys.map(parseApiKey)\n const chains = usage.chains.map(parseChain)\n if (\n apiKeys.some((apiKey) => apiKey === null) ||\n chains.some((chain) => chain === null)\n ) return null\n return {\n apiKeys: apiKeys as readonly MonthlyApiKeyUsageEntry[],\n chains: chains as readonly MonthlyApiKeyChainUsage[],\n hasStrandedUsage: usage.hasStrandedUsage,\n keyCount: usage.keyCount,\n totalCount: usage.totalCount,\n totalCredits: usage.totalCredits,\n updatedAt: usage.updatedAt,\n yearMonth: usage.yearMonth,\n }\n}\n\nexport class UsageClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async getMonthlyApiKeyUsage(\n params: MonthlyApiKeyUsageParams = {},\n options?: RpcSendOptions,\n ): Promise<MonthlyApiKeyUsage> {\n if (params.yearMonth !== undefined && !YEAR_MONTH.test(params.yearMonth)) {\n throw new ErpcConfigError('yearMonth must use YYYY-MM format')\n }\n\n const response: unknown = await this.#transport.get(\n '/v3/user/api-keys/usage',\n { yearMonth: params.yearMonth },\n options,\n )\n const envelope = objectValue(response)\n const usage = envelope?.success === true\n ? parseMonthlyUsage(envelope.message)\n : null\n if (usage === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid monthly API key usage response',\n )\n }\n return usage\n }\n}\n","import { AccountClient } from './account'\nimport {\n endpointWithPath,\n resolveConfig,\n websocketUrl,\n type ErpcClientConfig,\n} from './config'\nimport { PriceClient } from './price'\nimport {\n createEthereumClient,\n type EthereumClient,\n} from './rpc/ethereum'\nimport { createSolanaClient, type SolanaClient } from './rpc/solana'\nimport {\n EthereumSubscriptions,\n SolanaSubscriptions,\n} from './subscriptions'\nimport { HttpJsonRpcTransport } from './transport/http'\nimport { RestTransport } from './transport/rest'\nimport { WebSocketJsonRpcTransport } from './transport/websocket'\nimport { UsageClient } from './usage'\n\nexport interface ErpcSolanaClient extends SolanaClient {\n readonly subscriptions: SolanaSubscriptions\n}\n\nexport interface ErpcEthereumClient extends EthereumClient {\n readonly subscriptions: EthereumSubscriptions\n}\n\nexport interface ErpcClient {\n readonly account: AccountClient\n readonly ethereum: ErpcEthereumClient\n readonly price: PriceClient\n readonly solana: ErpcSolanaClient\n readonly usage: UsageClient\n close(): void\n}\n\nexport const createErpcClient = (config: ErpcClientConfig): ErpcClient => {\n const resolved = resolveConfig(config)\n const sharedTransport = {\n apiKey: resolved.apiKey,\n fetch: resolved.fetch,\n headers: resolved.headers,\n timeoutMs: resolved.timeoutMs,\n }\n\n const solanaTransport = new HttpJsonRpcTransport({\n ...sharedTransport,\n endpoint: resolved.endpoint,\n })\n const ethereumEndpoint = endpointWithPath(resolved.endpoint, '/eth')\n const ethereumTransport = new HttpJsonRpcTransport({\n ...sharedTransport,\n endpoint: ethereumEndpoint,\n })\n\n const solanaWebSocket = new WebSocketJsonRpcTransport({\n endpoint: websocketUrl(resolved.endpoint, resolved.apiKey),\n timeoutMs: resolved.timeoutMs,\n ...(resolved.webSocket === undefined\n ? {}\n : { webSocket: resolved.webSocket }),\n })\n const ethereumWebSocket = new WebSocketJsonRpcTransport({\n endpoint: websocketUrl(resolved.endpoint, resolved.apiKey, '/eth'),\n timeoutMs: resolved.timeoutMs,\n ...(resolved.webSocket === undefined\n ? {}\n : { webSocket: resolved.webSocket }),\n })\n\n const priceTransport = new RestTransport({\n ...sharedTransport,\n endpoint: resolved.endpoint,\n })\n const accountTransport = new RestTransport({\n ...sharedTransport,\n endpoint: resolved.accountEndpoint,\n })\n const userTransport = new RestTransport({\n ...sharedTransport,\n endpoint: resolved.userEndpoint,\n })\n\n const solana: ErpcSolanaClient = {\n ...createSolanaClient(solanaTransport),\n subscriptions: new SolanaSubscriptions(solanaWebSocket),\n }\n const ethereum: ErpcEthereumClient = {\n ...createEthereumClient(ethereumTransport),\n subscriptions: new EthereumSubscriptions(ethereumWebSocket),\n }\n\n return {\n solana,\n ethereum,\n price: new PriceClient(priceTransport),\n account: new AccountClient(accountTransport),\n usage: new UsageClient(userTransport),\n close: () => {\n solana.subscriptions.close()\n ethereum.subscriptions.close()\n },\n }\n}\n","import { ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport type CloudCreditAlertLevel =\n | 'critical'\n | 'normal'\n | 'suspended'\n | 'warning'\n\nexport interface CloudCredit {\n readonly alertLevel: CloudCreditAlertLevel\n readonly balanceCents: number\n readonly burnRateCentsPerHour: number\n readonly quoteExpiresAt: string\n readonly quoteTimestamp: string\n readonly timeToZeroHours: number | null\n}\n\nconst alertLevels: readonly CloudCreditAlertLevel[] = [\n 'critical',\n 'normal',\n 'suspended',\n 'warning',\n]\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst isDateTime = (value: unknown): value is string =>\n typeof value === 'string' && Number.isFinite(Date.parse(value))\n\nconst parseCredit = (value: unknown): CloudCredit | null => {\n const credit = objectValue(value)\n if (\n credit === null ||\n typeof credit.balanceCents !== 'number' ||\n !Number.isInteger(credit.balanceCents) ||\n typeof credit.burnRateCentsPerHour !== 'number' ||\n !Number.isInteger(credit.burnRateCentsPerHour) ||\n credit.burnRateCentsPerHour < 0 ||\n (credit.timeToZeroHours !== null &&\n (typeof credit.timeToZeroHours !== 'number' ||\n !Number.isFinite(credit.timeToZeroHours) ||\n credit.timeToZeroHours < 0)) ||\n typeof credit.alertLevel !== 'string' ||\n !alertLevels.includes(credit.alertLevel as CloudCreditAlertLevel) ||\n !isDateTime(credit.quoteTimestamp) ||\n !isDateTime(credit.quoteExpiresAt)\n ) return null\n\n return {\n alertLevel: credit.alertLevel as CloudCreditAlertLevel,\n balanceCents: credit.balanceCents,\n burnRateCentsPerHour: credit.burnRateCentsPerHour,\n quoteExpiresAt: credit.quoteExpiresAt,\n quoteTimestamp: credit.quoteTimestamp,\n timeToZeroHours: credit.timeToZeroHours,\n }\n}\n\nexport class CloudCreditClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async get(options?: RpcSendOptions): Promise<CloudCredit> {\n const response: unknown = await this.#transport.get(\n '/v4/cloud/credit',\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const credit = envelope?.success === true\n ? parseCredit(envelope.message)\n : null\n if (credit === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud credit snapshot',\n )\n }\n return credit\n }\n}\n","import { ErpcConfigError, ErpcInvalidResponseError } from './errors'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\n\nexport type CloudResourceKind =\n | 'bare-metal'\n | 'solana-grpc'\n | 'solana-shredstream'\n | 'vps'\n\nexport type CloudResourceMode = 'dedicated' | 'direct' | 'shared'\n\n/** A credential-free projection of an ERPC Cloud resource. */\nexport interface CloudResource {\n readonly createdAt?: string\n readonly id: string\n readonly kind: CloudResourceKind\n readonly mode?: CloudResourceMode\n readonly name?: string\n readonly region?: string\n readonly status: string\n}\n\nexport interface CloudResourceStatusBilling {\n readonly graceEndsAt?: string\n readonly hourlyCredits?: number\n readonly nextChargeAt?: string\n readonly status: 'active' | 'grace-period' | 'inactive' | 'suspended'\n}\n\nexport interface CloudResourceStatus {\n readonly billing?: CloudResourceStatusBilling\n readonly id: string\n readonly status: string\n}\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null\n ? value as Record<string, unknown>\n : null\n\nconst resourceKinds: readonly CloudResourceKind[] = [\n 'bare-metal',\n 'solana-grpc',\n 'solana-shredstream',\n 'vps',\n]\nconst resourceModes: readonly CloudResourceMode[] = [\n 'dedicated',\n 'direct',\n 'shared',\n]\nconst billingStatuses: readonly CloudResourceStatusBilling['status'][] = [\n 'active',\n 'grace-period',\n 'inactive',\n 'suspended',\n]\n\nconst isDateTime = (value: unknown): value is string =>\n typeof value === 'string' && Number.isFinite(Date.parse(value))\n\nconst parseStatusBilling = (\n value: unknown,\n): CloudResourceStatusBilling | null => {\n const billing = objectValue(value)\n if (\n billing === null ||\n typeof billing.status !== 'string' ||\n !billingStatuses.includes(\n billing.status as CloudResourceStatusBilling['status'],\n ) ||\n (billing.hourlyCredits !== undefined &&\n (typeof billing.hourlyCredits !== 'number' ||\n !Number.isFinite(billing.hourlyCredits) ||\n billing.hourlyCredits < 0)) ||\n (billing.nextChargeAt !== undefined &&\n !isDateTime(billing.nextChargeAt)) ||\n (billing.graceEndsAt !== undefined &&\n !isDateTime(billing.graceEndsAt))\n ) return null\n\n return {\n status: billing.status as CloudResourceStatusBilling['status'],\n ...(typeof billing.hourlyCredits === 'number'\n ? { hourlyCredits: billing.hourlyCredits }\n : {}),\n ...(typeof billing.nextChargeAt === 'string'\n ? { nextChargeAt: billing.nextChargeAt }\n : {}),\n ...(typeof billing.graceEndsAt === 'string'\n ? { graceEndsAt: billing.graceEndsAt }\n : {}),\n }\n}\n\nconst parseResourceStatus = (value: unknown): CloudResourceStatus | null => {\n const status = objectValue(value)\n if (\n status === null ||\n typeof status.id !== 'string' ||\n typeof status.status !== 'string'\n ) return null\n const billing = status.billing === undefined\n ? undefined\n : parseStatusBilling(status.billing)\n if (status.billing !== undefined && billing === null) return null\n return {\n id: status.id,\n status: status.status,\n ...(billing ? { billing } : {}),\n }\n}\nconst parseResource = (value: unknown): CloudResource | null => {\n const resource = objectValue(value)\n if (\n resource === null ||\n typeof resource.id !== 'string' ||\n typeof resource.kind !== 'string' ||\n !resourceKinds.includes(resource.kind as CloudResourceKind) ||\n typeof resource.status !== 'string' ||\n (resource.mode !== undefined &&\n (typeof resource.mode !== 'string' ||\n !resourceModes.includes(resource.mode as CloudResourceMode))) ||\n (resource.name !== undefined && typeof resource.name !== 'string') ||\n (resource.region !== undefined && typeof resource.region !== 'string') ||\n (resource.createdAt !== undefined && typeof resource.createdAt !== 'string')\n ) return null\n\n return {\n id: resource.id,\n kind: resource.kind as CloudResourceKind,\n status: resource.status,\n ...(typeof resource.mode === 'string'\n ? { mode: resource.mode as CloudResourceMode }\n : {}),\n ...(typeof resource.name === 'string' ? { name: resource.name } : {}),\n ...(typeof resource.region === 'string' ? { region: resource.region } : {}),\n ...(typeof resource.createdAt === 'string'\n ? { createdAt: resource.createdAt }\n : {}),\n }\n}\n\nexport class CloudResourcesClient {\n readonly #transport: RestTransport\n\n constructor(transport: RestTransport) {\n this.#transport = transport\n }\n\n async list(options?: RpcSendOptions): Promise<readonly CloudResource[]> {\n const response: unknown = await this.#transport.get(\n '/v4/cloud/resources',\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const message = objectValue(envelope?.message)\n if (envelope?.success !== true || !Array.isArray(message?.resources)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource list',\n )\n }\n const resources = message.resources.map(parseResource)\n if (resources.some((resource) => resource === null)) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource list',\n )\n }\n return resources as readonly CloudResource[]\n }\n\n async get(\n resourceId: string,\n options?: RpcSendOptions,\n ): Promise<CloudResource> {\n const normalizedId = resourceId.trim()\n if (!normalizedId) {\n throw new ErpcConfigError('resourceId must not be empty')\n }\n const response: unknown = await this.#transport.get(\n `/v4/cloud/resources/${encodeURIComponent(normalizedId)}`,\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const message = objectValue(envelope?.message)\n const resource = envelope?.success === true\n ? parseResource(message?.resource)\n : null\n if (resource === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource',\n )\n }\n return resource\n }\n\n async getStatus(\n resourceId: string,\n options?: RpcSendOptions,\n ): Promise<CloudResourceStatus> {\n const normalizedId = resourceId.trim()\n if (!normalizedId) {\n throw new ErpcConfigError('resourceId must not be empty')\n }\n const response: unknown = await this.#transport.get(\n `/v4/cloud/resources/${encodeURIComponent(normalizedId)}/status`,\n undefined,\n options,\n )\n const envelope = objectValue(response)\n const status = envelope?.success === true\n ? parseResourceStatus(envelope.message)\n : null\n if (status === null) {\n throw new ErpcInvalidResponseError(\n 'ERPC returned an invalid Cloud resource status',\n )\n }\n return status\n }\n}\n","import { ErpcConfigError } from './errors'\nimport { CloudCatalogClient } from './catalog'\nimport { CloudCreditClient } from './credit'\nimport type { RpcSendOptions } from './rpc/types'\nimport { RestTransport } from './transport/rest'\nimport { UsageClient } from './usage'\nimport { CloudResourcesClient } from './resources'\nimport { DEFAULT_TIMEOUT_MS, DEFAULT_USER_ENDPOINT } from './config'\n\nexport interface ErpcCloudClientConfig {\n readonly accessToken: string\n readonly endpoint?: string\n readonly fetch?: typeof globalThis.fetch\n readonly headers?: Readonly<Record<string, string>>\n readonly timeoutMs?: number\n}\n\nexport interface ErpcCloudClient {\n readonly catalog: CloudCatalogClient\n readonly credit: CloudCreditClient\n readonly resources: CloudResourcesClient\n readonly usage: UsageClient\n}\n\nconst requireFetch = (provided?: typeof globalThis.fetch) => {\n const implementation = provided ?? globalThis.fetch\n if (typeof implementation !== 'function') {\n throw new ErpcConfigError(\n 'A Fetch API implementation is required in this runtime',\n )\n }\n return implementation\n}\n\nconst cloudEndpoint = (value?: string): URL => {\n let endpoint: URL\n try {\n endpoint = new URL(value ?? DEFAULT_USER_ENDPOINT)\n } catch {\n throw new ErpcConfigError('endpoint must be an absolute HTTP(S) URL')\n }\n const isLocalHttp = endpoint.protocol === 'http:' &&\n ['127.0.0.1', '::1', '[::1]', 'localhost'].includes(endpoint.hostname)\n if (endpoint.protocol !== 'https:' && !isLocalHttp) {\n throw new ErpcConfigError('endpoint must use HTTPS except on localhost')\n }\n endpoint.search = ''\n endpoint.hash = ''\n endpoint.pathname = endpoint.pathname.replace(/\\/+$/, '') || '/'\n return endpoint\n}\n\nexport const createErpcCloudClient = (\n config: ErpcCloudClientConfig,\n): ErpcCloudClient => {\n const accessToken = config.accessToken.trim()\n if (!accessToken) {\n throw new ErpcConfigError('accessToken must not be empty')\n }\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new ErpcConfigError('timeoutMs must be a positive finite number')\n }\n\n const transport = new RestTransport({\n apiKey: accessToken,\n endpoint: cloudEndpoint(config.endpoint),\n fetch: requireFetch(config.fetch),\n headers: config.headers ?? {},\n timeoutMs,\n })\n\n return {\n catalog: new CloudCatalogClient(transport),\n credit: new CloudCreditClient(transport),\n resources: new CloudResourcesClient(transport),\n usage: new UsageClient(transport),\n }\n}\n\nexport type ErpcCloudRequestOptions = RpcSendOptions\n"]}
|