infra-sdk-typescript 0.1.3 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/version.ts","../src/core/errors.ts","../src/core/http-client.ts","../src/core/auth.ts","../src/resources/resource.ts","../src/core/idempotency.ts","../src/core/pagination.ts","../src/resources/wallet/index.ts","../src/resources/tokenization/index.ts","../src/resources/indexer/index.ts","../src/client.ts","../src/core/webhooks.ts"],"names":["sleep","randomUUID","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Kept in sync with `package.json#version` by the release process; used in the `User-Agent` header. */\nexport const SDK_VERSION = \"0.1.0\";\n","/** Base class for every error raised by this SDK. */\nexport class InfraError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The request never reached the server (DNS/TCP/TLS failure, aborted connection, etc). */\nexport class InfraConnectionError extends InfraError {\n constructor(\n message: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n }\n}\n\nexport class InfraConnectionTimeoutError extends InfraConnectionError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n }\n}\n\n/**\n * Constructed via {@link errorFromResponse}, which picks the most specific subclass for\n * the HTTP status code — prefer catching a subclass (e.g. {@link RateLimitError}) over\n * this base class when you need to branch on the failure kind.\n */\nexport class InfraAPIError extends InfraError {\n constructor(\n readonly status: number,\n message: string,\n /** Field-level validation messages, when the server included an `errors` array. */\n readonly errors: readonly string[] | undefined,\n /** The raw, parsed JSON response body, for callers that need fields this SDK doesn't model. */\n readonly body: unknown,\n /** Response headers, lower-cased keys. */\n readonly headers: Readonly<Record<string, string>>,\n ) {\n super(message);\n }\n}\n\nexport class BadRequestError extends InfraAPIError {}\nexport class AuthenticationError extends InfraAPIError {}\nexport class PaymentRequiredError extends InfraAPIError {}\nexport class PermissionDeniedError extends InfraAPIError {}\nexport class NotFoundError extends InfraAPIError {}\nexport class ConflictError extends InfraAPIError {}\nexport class UnprocessableEntityError extends InfraAPIError {}\n\nexport class RateLimitError extends InfraAPIError {\n constructor(\n status: number,\n message: string,\n errors: readonly string[] | undefined,\n body: unknown,\n headers: Readonly<Record<string, string>>,\n /** Seconds to wait before retrying, from the response body's `retryAfter` or a `Retry-After` header. */\n readonly retryAfterSeconds: number | undefined,\n ) {\n super(status, message, errors, body, headers);\n }\n}\n\nexport class InternalServerError extends InfraAPIError {}\nexport class ServiceUnavailableError extends InfraAPIError {}\nexport class UnknownAPIError extends InfraAPIError {}\n\n/** Builds the most specific {@link InfraAPIError} subclass for a given HTTP status. */\nexport function errorFromResponse(\n status: number,\n parsedBody: unknown,\n headers: Readonly<Record<string, string>>,\n): InfraAPIError {\n const body = (parsedBody ?? {}) as {\n message?: unknown;\n errors?: unknown;\n retryAfter?: unknown;\n };\n const message = typeof body.message === \"string\" ? body.message : `Request failed with status ${status}`;\n const errors = Array.isArray(body.errors) ? body.errors.filter((e): e is string => typeof e === \"string\") : undefined;\n\n switch (status) {\n case 400:\n return new BadRequestError(status, message, errors, parsedBody, headers);\n case 401:\n return new AuthenticationError(status, message, errors, parsedBody, headers);\n case 402:\n return new PaymentRequiredError(status, message, errors, parsedBody, headers);\n case 403:\n return new PermissionDeniedError(status, message, errors, parsedBody, headers);\n case 404:\n return new NotFoundError(status, message, errors, parsedBody, headers);\n case 409:\n return new ConflictError(status, message, errors, parsedBody, headers);\n case 422:\n return new UnprocessableEntityError(status, message, errors, parsedBody, headers);\n case 429: {\n const bodyRetryAfter = typeof body.retryAfter === \"number\" ? body.retryAfter : undefined;\n const headerRetryAfter = headers[\"retry-after\"] !== undefined ? Number(headers[\"retry-after\"]) : undefined;\n const retryAfterSeconds =\n bodyRetryAfter ?? (headerRetryAfter !== undefined && Number.isFinite(headerRetryAfter) ? headerRetryAfter : undefined);\n return new RateLimitError(status, message, errors, parsedBody, headers, retryAfterSeconds);\n }\n case 503:\n return new ServiceUnavailableError(status, message, errors, parsedBody, headers);\n default:\n if (status >= 500) return new InternalServerError(status, message, errors, parsedBody, headers);\n return new UnknownAPIError(status, message, errors, parsedBody, headers);\n }\n}\n\n/** Raised by `POST /v1/oauth/token` failures, which use an OAuth 2.0 error body instead of the standard envelope. */\nexport class InfraAuthTokenError extends InfraError {\n constructor(\n readonly status: number,\n readonly error: string,\n readonly errorDescription: string | undefined,\n ) {\n super(errorDescription ? `${error}: ${errorDescription}` : error);\n }\n}\n\nexport class WebhookSignatureVerificationError extends InfraError {}\n","import { SDK_VERSION } from \"./version.js\";\nimport {\n errorFromResponse,\n InfraConnectionError,\n InfraConnectionTimeoutError,\n RateLimitError,\n ServiceUnavailableError,\n InternalServerError,\n} from \"./errors.js\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n\nexport type QueryValue = string | number | boolean | undefined | null;\n\nexport interface RequestOptions {\n method: HttpMethod;\n path: string;\n query?: Record<string, QueryValue>;\n body?: unknown;\n headers?: Record<string, string>;\n /**\n * Sent as the `Idempotency-Key` header. Besides the header itself, its presence tells\n * the retry logic that a connection failure is safe to retry — the server can dedupe\n * a resubmission with the same key.\n */\n idempotencyKey?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport interface HttpClientOptions {\n baseURL: string;\n /** Invoked before every physical attempt (including retries) to get fresh auth headers. */\n getAuthHeaders: () => Promise<Record<string, string>>;\n fetch?: typeof fetch;\n timeoutMs?: number;\n maxRetries?: number;\n defaultHeaders?: Record<string, string>;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\n\nexport class HttpClient {\n private readonly baseURL: string;\n private readonly getAuthHeaders: () => Promise<Record<string, string>>;\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly defaultHeaders: Record<string, string>;\n\n constructor(options: HttpClientOptions) {\n this.baseURL = options.baseURL;\n this.getAuthHeaders = options.getAuthHeaders;\n this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.defaultHeaders = options.defaultHeaders ?? {};\n }\n\n /** Issues a request against the Infra API and returns the unwrapped `data` field of the response envelope. */\n async request<T>(options: RequestOptions): Promise<T> {\n const url = buildUrl(this.baseURL, options.path, options.query);\n const timeoutMs = options.timeoutMs ?? this.timeoutMs;\n // A connection failure (no response received) is only safe to blindly retry when the\n // request is naturally idempotent (GET) or the caller gave us an Idempotency-Key the\n // server can use to dedupe a resubmission. Otherwise a retry risks double-execution.\n const retryableOnConnectionError = options.method === \"GET\" || Boolean(options.idempotencyKey);\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= this.maxRetries) {\n attempt++;\n\n const authHeaders = await this.getAuthHeaders();\n const requestHeaders: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": `infra-sdk-typescript/${SDK_VERSION}`,\n ...this.defaultHeaders,\n ...authHeaders,\n ...options.headers,\n };\n if (options.body !== undefined) {\n requestHeaders[\"Content-Type\"] = \"application/json\";\n }\n if (options.idempotencyKey) {\n requestHeaders[\"Idempotency-Key\"] = options.idempotencyKey;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const onCallerAbort = () => controller.abort();\n if (options.signal) {\n if (options.signal.aborted) controller.abort();\n else options.signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n }\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method: options.method,\n headers: requestHeaders,\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onCallerAbort);\n\n if (options.signal?.aborted) {\n throw new InfraConnectionError(\"Request aborted by caller\", err);\n }\n const connectionError = isAbortError(err)\n ? new InfraConnectionTimeoutError(timeoutMs)\n : new InfraConnectionError(\"Could not reach the Infra API\", err);\n\n if (!retryableOnConnectionError || attempt > this.maxRetries) {\n throw connectionError;\n }\n lastError = connectionError;\n await sleep(backoffDelayMs(attempt));\n continue;\n }\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onCallerAbort);\n\n const responseHeaders = headersToObject(response.headers);\n const parsedBody = await parseJsonSafely(response);\n\n if (response.ok) {\n const envelope = parsedBody as { data?: T } | undefined;\n return envelope?.data as T;\n }\n\n const apiError = errorFromResponse(response.status, parsedBody, responseHeaders);\n const isRetryableStatus =\n apiError instanceof RateLimitError ||\n apiError instanceof ServiceUnavailableError ||\n apiError instanceof InternalServerError;\n\n // 429/503 mean the server did not execute the request, so retrying is always safe\n // regardless of method — unlike a connection error, we know nothing ran.\n if (!isRetryableStatus || attempt > this.maxRetries) {\n throw apiError;\n }\n lastError = apiError;\n const delayMs =\n apiError instanceof RateLimitError && apiError.retryAfterSeconds !== undefined\n ? apiError.retryAfterSeconds * 1000\n : backoffDelayMs(attempt);\n await sleep(delayMs);\n }\n\n throw lastError;\n }\n}\n\nfunction buildUrl(baseURL: string, path: string, query?: Record<string, QueryValue>): string {\n const base = baseURL.endsWith(\"/\") ? baseURL : `${baseURL}/`;\n const url = new URL(path.replace(/^\\//, \"\"), base);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const obj: Record<string, string> = {};\n headers.forEach((value, key) => {\n obj[key.toLowerCase()] = value;\n });\n return obj;\n}\n\nasync function parseJsonSafely(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof Error && err.name === \"AbortError\";\n}\n\nfunction backoffDelayMs(attempt: number): number {\n const base = Math.min(500 * 2 ** (attempt - 1), 8_000);\n const jitter = Math.random() * 250;\n return base + jitter;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { SDK_VERSION } from \"./version.js\";\nimport { InfraAuthTokenError, InfraConnectionError } from \"./errors.js\";\n\nexport interface TokenManagerOptions {\n apiKey: string;\n baseURL: string;\n /** Space-separated OAuth scopes to request. Omit for a full-access token. */\n scope?: string;\n fetch?: typeof fetch;\n /** Refresh this many seconds before the cached token's actual expiry. Default 30s. */\n clockSkewSeconds?: number;\n /** Retries for transient failures (429/503) while minting a token. Default 2. */\n maxRetries?: number;\n}\n\ninterface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n scope?: string;\n}\n\ninterface OAuthErrorResponse {\n error: string;\n error_description?: string;\n}\n\n/**\n * Exchanges the project API key for a short-lived OAuth 2.0 bearer token\n * (`POST /v1/oauth/token`, `client_credentials` grant) and caches it until shortly\n * before it expires. Concurrent callers during a refresh share the same in-flight\n * request rather than minting redundant tokens.\n */\nexport class TokenManager {\n private readonly apiKey: string;\n private readonly baseURL: string;\n private readonly scope: string | undefined;\n private readonly fetchImpl: typeof fetch;\n private readonly clockSkewSeconds: number;\n private readonly maxRetries: number;\n\n private cached: { accessToken: string; expiresAtMs: number } | null = null;\n private pendingRefresh: Promise<string> | null = null;\n\n constructor(options: TokenManagerOptions) {\n this.apiKey = options.apiKey;\n this.baseURL = options.baseURL;\n this.scope = options.scope;\n this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.clockSkewSeconds = options.clockSkewSeconds ?? 30;\n this.maxRetries = options.maxRetries ?? 2;\n }\n\n /** Returns a valid bearer token, minting or refreshing one only when necessary. */\n async getAccessToken(opts: { forceRefresh?: boolean } = {}): Promise<string> {\n if (!opts.forceRefresh && this.cached && Date.now() < this.cached.expiresAtMs) {\n return this.cached.accessToken;\n }\n if (this.pendingRefresh) {\n return this.pendingRefresh;\n }\n\n this.pendingRefresh = this.fetchToken().finally(() => {\n this.pendingRefresh = null;\n });\n return this.pendingRefresh;\n }\n\n private async fetchToken(): Promise<string> {\n let attempt = 0;\n for (;;) {\n attempt++;\n let response: Response;\n try {\n response = await this.fetchImpl(new URL(\"/v1/oauth/token\", this.baseURL), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `infra-sdk-typescript/${SDK_VERSION}`,\n },\n body: JSON.stringify({\n grant_type: \"client_credentials\",\n client_secret: this.apiKey,\n ...(this.scope ? { scope: this.scope } : {}),\n }),\n });\n } catch (err) {\n throw new InfraConnectionError(\"Could not reach the Infra API to obtain an access token\", err);\n }\n\n const text = await response.text();\n const parsed = text\n ? (JSON.parse(text) as OAuthTokenResponse | (OAuthErrorResponse & { retryAfter?: number }))\n : undefined;\n\n if (response.ok && parsed && \"access_token\" in parsed) {\n const expiresAtMs = Date.now() + Math.max(0, parsed.expires_in - this.clockSkewSeconds) * 1000;\n this.cached = { accessToken: parsed.access_token, expiresAtMs };\n return parsed.access_token;\n }\n\n // 429 on this endpoint uses the standard `{status, message, retryAfter}` envelope\n // rather than the OAuth `{error, error_description}` shape used elsewhere here.\n const errorBody = (parsed ?? { error: \"server_error\" }) as OAuthErrorResponse & { retryAfter?: number };\n const retryable = response.status === 429 || response.status === 503;\n if (retryable && attempt <= this.maxRetries) {\n const delayMs =\n typeof errorBody.retryAfter === \"number\" ? errorBody.retryAfter * 1000 : Math.min(500 * 2 ** (attempt - 1), 4_000);\n await sleep(delayMs);\n continue;\n }\n const fallbackDescription = (parsed as { message?: string } | undefined)?.message;\n throw new InfraAuthTokenError(\n response.status,\n errorBody.error ?? (response.status === 429 ? \"rate_limited\" : \"server_error\"),\n errorBody.error_description ?? fallbackDescription,\n );\n }\n }\n\n /** Drops the cached token, forcing the next call to mint a fresh one. */\n clearCache(): void {\n this.cached = null;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { InfraClient } from \"../client.js\";\n\n/** Base class every resource namespace (`client.wallet`, `client.tokenization`, `client.indexer`) extends. */\nexport abstract class APIResource {\n constructor(protected readonly client: InfraClient) {}\n}\n","import { randomUUID } from \"node:crypto\";\n\n/** Generates a UUIDv4 suitable for use as an `Idempotency-Key` header value. */\nexport function generateIdempotencyKey(): string {\n return randomUUID();\n}\n","/**\n * The Infra API uses three different pagination envelopes depending on the service\n * (see the Conventions doc). {@link Page} normalizes all three into one ergonomic type so\n * callers can iterate any list endpoint the same way:\n *\n * ```ts\n * const page = await client.tokenization.listTokens();\n * for await (const token of page) {\n * console.log(token.ticker);\n * }\n *\n * // or, page by page:\n * let page = await client.wallet.getTransactionHistory();\n * while (true) {\n * for (const tx of page.data) handle(tx);\n * if (!page.hasNextPage()) break;\n * page = await page.getNextPage();\n * }\n * ```\n */\nexport class Page<T> implements AsyncIterable<T> {\n readonly data: readonly T[];\n private readonly nextParams: Record<string, unknown> | null;\n private readonly fetchNext: ((params: Record<string, unknown>) => Promise<Page<T>>) | null;\n\n constructor(opts: {\n data: readonly T[];\n nextParams: Record<string, unknown> | null;\n fetchNext: ((params: Record<string, unknown>) => Promise<Page<T>>) | null;\n }) {\n this.data = opts.data;\n this.nextParams = opts.nextParams;\n this.fetchNext = opts.fetchNext;\n }\n\n hasNextPage(): boolean {\n return this.nextParams !== null && this.fetchNext !== null;\n }\n\n async getNextPage(): Promise<Page<T>> {\n if (!this.fetchNext || !this.nextParams) {\n throw new Error(\"This is the last page — check hasNextPage() before calling getNextPage().\");\n }\n return this.fetchNext(this.nextParams);\n }\n\n /** Walks every page starting with this one, yielding each `Page<T>` in turn. */\n async *iterPages(): AsyncGenerator<Page<T>, void, void> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- `page` walks forward each iteration; `this` is just the starting value.\n let page: Page<T> = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n\n /** Yields every item across all pages, fetching subsequent pages lazily as iteration proceeds. */\n async *[Symbol.asyncIterator](): AsyncGenerator<T, void, void> {\n for await (const page of this.iterPages()) {\n yield* page.data;\n }\n }\n\n /** Eagerly fetches every remaining page and returns all items as a single array. Use with caution on large collections. */\n async toArray(): Promise<T[]> {\n const items: T[] = [];\n for await (const item of this) {\n items.push(item);\n }\n return items;\n }\n}\n\n/** Raw shape returned by limit/offset endpoints (currently: Wallet transaction history). */\nexport interface OffsetPaginatedResponse<T> {\n items: readonly T[];\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n nextOffset: number | null;\n };\n}\n\nexport function pageFromOffsetResponse<T>(\n raw: OffsetPaginatedResponse<T>,\n fetchNext: (params: Record<string, unknown>) => Promise<Page<T>>,\n): Page<T> {\n const hasNext = raw.pagination.hasMore && raw.pagination.nextOffset !== null;\n return new Page({\n data: raw.items,\n nextParams: hasNext ? { offset: raw.pagination.nextOffset, limit: raw.pagination.limit } : null,\n fetchNext: hasNext ? fetchNext : null,\n });\n}\n\n/** Raw shape returned by page/pageSize endpoints with inline totals (currently: Tokenization). */\nexport interface FlatPaginatedResponse<T> {\n items: readonly T[];\n total: number;\n page: number;\n pageSize: number;\n}\n\nexport function pageFromFlatResponse<T>(\n raw: FlatPaginatedResponse<T>,\n fetchNext: (params: Record<string, unknown>) => Promise<Page<T>>,\n): Page<T> {\n const itemsSeenSoFar = (raw.page - 1) * raw.pageSize + raw.items.length;\n const hasNext = itemsSeenSoFar < raw.total;\n return new Page({\n data: raw.items,\n nextParams: hasNext ? { page: raw.page + 1, pageSize: raw.pageSize } : null,\n fetchNext: hasNext ? fetchNext : null,\n });\n}\n\n/** Raw shape returned by page/limit endpoints with a `meta` block (currently: Indexer). */\nexport interface MetaPaginatedResponse<T> {\n data: readonly T[];\n meta: {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n };\n}\n\nexport function pageFromMetaResponse<T>(\n raw: MetaPaginatedResponse<T>,\n fetchNext: (params: Record<string, unknown>) => Promise<Page<T>>,\n): Page<T> {\n const hasNext = raw.meta.page < raw.meta.totalPages;\n return new Page({\n data: raw.data,\n nextParams: hasNext ? { page: raw.meta.page + 1, limit: raw.meta.limit } : null,\n fetchNext: hasNext ? fetchNext : null,\n });\n}\n","import { APIResource } from \"../resource.js\";\nimport { generateIdempotencyKey } from \"../../core/idempotency.js\";\nimport { pageFromOffsetResponse } from \"../../core/pagination.js\";\nimport type { Page, OffsetPaginatedResponse } from \"../../core/pagination.js\";\nimport type { QueryValue } from \"../../core/http-client.js\";\nimport type { RequestOverrides, IdempotentRequestOverrides } from \"../../types.js\";\nimport type {\n DeactivateWalletParams,\n GenerateWalletsParams,\n GeneratedWallet,\n GetTransactionHistoryParams,\n GetWalletByAddressIndexParams,\n GetWalletByAddressParams,\n GetWalletCountParams,\n HdEnabledStatus,\n InitiateTransferParams,\n ListWalletsParams,\n SignTransactionParams,\n SignedTransactionResult,\n SupportedChain,\n Wallet,\n WalletBalance,\n WalletCount,\n WalletTransaction,\n} from \"./types.js\";\n\nexport * from \"./types.js\";\n\n/**\n * The Wallet service — manages the business HD wallet tree: deriving addresses, reading\n * them, signing and submitting transactions, and tracking the USD balance used to pay gas\n * on mainnet transfers.\n *\n * [Initiate transfer]{@link WalletResource.initiateTransfer} and sponsored\n * [Sign transaction]{@link WalletResource.signTransaction} are asynchronous by default:\n * they return a `PENDING` transaction immediately, and you poll\n * {@link WalletResource.getTransaction} (or supply `webhookUrl`) for the outcome. Pass\n * `waitForCompletion: true` for the legacy synchronous behavior.\n */\nexport class WalletResource extends APIResource {\n /** Derives one or more new addresses on the business HD tree. Requires `wallet.hd.generate`. */\n async generateWallets(\n params: GenerateWalletsParams,\n overrides: IdempotentRequestOverrides = {},\n ): Promise<GeneratedWallet[]> {\n const { idempotencyKey, ...rest } = overrides;\n return this.client.request<GeneratedWallet[]>({\n method: \"POST\",\n path: \"/v1/wallet/hd/generate\",\n body: params,\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\n ...rest,\n });\n }\n\n /**\n * Lists derived wallets for the business. Requires `wallet.hd.read`.\n *\n * Note: unlike {@link getTransactionHistory}, the API does not return pagination\n * metadata for this endpoint — it always answers with a plain array sized by `limit`.\n */\n async listWallets(params: ListWalletsParams = {}, overrides: RequestOverrides = {}): Promise<Wallet[]> {\n return this.client.request<Wallet[]>({\n method: \"GET\",\n path: \"/v1/wallet/hd\",\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Returns the number of derived wallets, optionally filtered by chain. Requires `wallet.hd.read`. */\n async getWalletCount(params: GetWalletCountParams = {}, overrides: RequestOverrides = {}): Promise<WalletCount> {\n return this.client.request<WalletCount>({\n method: \"GET\",\n path: \"/v1/wallet/hd/count\",\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Reports whether HD wallets are enabled for the business. Requires `wallet.hd.read`. */\n async getHdEnabled(overrides: RequestOverrides = {}): Promise<HdEnabledStatus> {\n return this.client.request<HdEnabledStatus>({\n method: \"GET\",\n path: \"/v1/wallet/hd/enabled\",\n ...overrides,\n });\n }\n\n /** Fetches a single wallet by its on-chain address. Requires `wallet.hd.read`. */\n async getWalletByAddress(\n address: string,\n params: GetWalletByAddressParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Wallet> {\n return this.client.request<Wallet>({\n method: \"GET\",\n path: `/v1/wallet/hd/address/${encodeURIComponent(address)}`,\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Fetches a wallet by its HD `addressIndex`. Requires `wallet.hd.read`. */\n async getWalletByAddressIndex(\n addressIndex: number,\n params: GetWalletByAddressIndexParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Wallet> {\n return this.client.request<Wallet>({\n method: \"GET\",\n path: `/v1/wallet/hd/address-index/${encodeURIComponent(String(addressIndex))}`,\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /**\n * Signs (and, where applicable, sponsors and submits) a transaction from a derived\n * wallet. Requires `wallet.hd.sign`.\n *\n * Returns a {@link SignedTransactionResult} for local-only signing (a non-EVM chain\n * with `addressIndex` — nothing broadcast), or a {@link WalletTransaction} for a\n * sponsored sign (async `PENDING` by default, or the settled result with\n * `waitForCompletion: true`).\n */\n async signTransaction(\n params: SignTransactionParams,\n overrides: IdempotentRequestOverrides = {},\n ): Promise<SignedTransactionResult | WalletTransaction> {\n const { idempotencyKey, ...rest } = overrides;\n return this.client.request<SignedTransactionResult | WalletTransaction>({\n method: \"POST\",\n path: \"/v1/wallet/hd/sign\",\n body: params,\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\n ...rest,\n });\n }\n\n /** Deactivates a wallet so it is no longer used for new operations. Requires `wallet.hd.deactivate`. */\n async deactivateWallet(\n walletId: string,\n params: DeactivateWalletParams = {},\n overrides: RequestOverrides = {},\n ): Promise<null> {\n return this.client.request<null>({\n method: \"POST\",\n path: `/v1/wallet/hd/deactivate/${encodeURIComponent(walletId)}`,\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Lists the chains the platform can sign and broadcast on. */\n async getSupportedChains(overrides: RequestOverrides = {}): Promise<SupportedChain[]> {\n return this.client.request<SupportedChain[]>({\n method: \"GET\",\n path: \"/v1/wallet/rpc/chains\",\n ...overrides,\n });\n }\n\n /**\n * Submits a token (or native) transfer from a derived wallet. Requires\n * `wallet.transfer.create`.\n *\n * On a `422` (transfer reverted after broadcast, `waitForCompletion: true` only), the\n * thrown {@link UnprocessableEntityError} still carries the failed transaction — read it\n * from `error.body` (shaped like `{ data: WalletTransaction }`) if you need the details\n * rather than just the message.\n */\n async initiateTransfer(\n params: InitiateTransferParams,\n overrides: IdempotentRequestOverrides = {},\n ): Promise<WalletTransaction> {\n const { idempotencyKey, ...rest } = overrides;\n return this.client.request<WalletTransaction>({\n method: \"POST\",\n path: \"/v1/wallet/transaction\",\n body: params,\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\n ...rest,\n });\n }\n\n /**\n * Returns a paginated history of the business's transactions. Requires\n * `wallet.transfer.read`.\n *\n * ```ts\n * const page = await client.wallet.getTransactionHistory({ status: \"COMPLETED\" });\n * for await (const tx of page) {\n * console.log(tx.id, tx.status);\n * }\n * ```\n */\n async getTransactionHistory(\n params: GetTransactionHistoryParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Page<WalletTransaction>> {\n const fetchPage = (query: Record<string, unknown>): Promise<Page<WalletTransaction>> =>\n this.client\n .request<OffsetPaginatedResponse<WalletTransaction>>({\n method: \"GET\",\n path: \"/v1/wallet/transaction/history\",\n query: { ...params, ...query },\n ...overrides,\n })\n .then((raw) => pageFromOffsetResponse(raw, fetchPage));\n\n return fetchPage({ limit: params.limit, offset: params.offset });\n }\n\n /**\n * Fetches a single transaction record — the authoritative view of a transfer's outcome.\n * Poll this after an async `202` until `status` is `COMPLETED` or `FAILED`. Requires\n * `wallet.transfer.read`.\n */\n async getTransaction(id: string, overrides: RequestOverrides = {}): Promise<WalletTransaction> {\n return this.client.request<WalletTransaction>({\n method: \"GET\",\n path: `/v1/wallet/transaction/${encodeURIComponent(id)}`,\n ...overrides,\n });\n }\n\n /** Returns the business's spendable USD balance, used to pay gas on mainnet transfers. Requires `wallet.balance.read`. */\n async getBalance(overrides: RequestOverrides = {}): Promise<WalletBalance> {\n return this.client.request<WalletBalance>({\n method: \"GET\",\n path: \"/v1/wallet/balance\",\n ...overrides,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport { pageFromFlatResponse } from \"../../core/pagination.js\";\nimport type { Page, FlatPaginatedResponse } from \"../../core/pagination.js\";\nimport type { RequestOverrides } from \"../../types.js\";\nimport type {\n BurnTokenParams,\n ClaimYieldParams,\n CreateTokenParams,\n DistributeYieldParams,\n GetTokenHoldersParams,\n ListTokenTransactionsParams,\n ListTokensParams,\n MintTokenParams,\n PayCouponParams,\n RedeemPrincipalParams,\n RegisterTokenWalletParams,\n RegisterTokenWalletResult,\n TokenDeploymentResult,\n TokenDetail,\n TokenHolder,\n TokenOperationResult,\n TokenSummary,\n TokenTransactionRecord,\n TokenTransferResult,\n TransferTokenParams,\n UpdateTokenYieldParams,\n YieldOperationResult,\n YieldTxResult,\n} from \"./types.js\";\n\nexport * from \"./types.js\";\n\n/**\n * The Tokenization service — issues and manages tokenized real-world assets: deployment,\n * mint/burn/transfer, wallet whitelisting, holder balances, and the yield lifecycle\n * (rate updates, coupon payments, claims, and principal redemption) for `YIELD_BEARING`\n * tokens.\n */\nexport class TokenizationResource extends APIResource {\n /**\n * Issues a new tokenized asset and deploys it on the target chain. Returns immediately\n * with a `PENDING` token plus a deployment `operationRef` and `txHash` — poll\n * {@link getToken} until `status` is `ACTIVE`. Supply `yieldParams` for a\n * `YIELD_BEARING` token.\n */\n async createToken(params: CreateTokenParams, overrides: RequestOverrides = {}): Promise<TokenDeploymentResult> {\n return this.client.request<TokenDeploymentResult>({\n method: \"POST\",\n path: \"/v1/tokens\",\n body: params,\n ...overrides,\n });\n }\n\n /**\n * Returns a paginated list of tokens for the calling project.\n *\n * ```ts\n * const page = await client.tokenization.listTokens();\n * for await (const token of page) console.log(token.ticker, token.status);\n * ```\n */\n async listTokens(params: ListTokensParams = {}, overrides: RequestOverrides = {}): Promise<Page<TokenSummary>> {\n const fetchPage = (query: Record<string, unknown>): Promise<Page<TokenSummary>> =>\n this.client\n .request<FlatPaginatedResponse<TokenSummary>>({\n method: \"GET\",\n path: \"/v1/tokens\",\n query: { ...params, ...query },\n ...overrides,\n })\n .then((raw) => pageFromFlatResponse(raw, fetchPage));\n\n return fetchPage({ page: params.page, pageSize: params.pageSize });\n }\n\n /** Fetches a single token by id, including its per-chain deployment details. */\n async getToken(id: string, overrides: RequestOverrides = {}): Promise<TokenDetail> {\n return this.client.request<TokenDetail>({\n method: \"GET\",\n path: `/v1/tokens/${encodeURIComponent(id)}`,\n ...overrides,\n });\n }\n\n /** Mints new units of a token to a recipient address. */\n async mintToken(params: MintTokenParams, overrides: RequestOverrides = {}): Promise<TokenOperationResult> {\n return this.client.request<TokenOperationResult>({\n method: \"POST\",\n path: \"/v1/tokens/mint\",\n body: params,\n ...overrides,\n });\n }\n\n /** Burns units of a token from a holder address. */\n async burnToken(params: BurnTokenParams, overrides: RequestOverrides = {}): Promise<TokenOperationResult> {\n return this.client.request<TokenOperationResult>({\n method: \"POST\",\n path: \"/v1/tokens/burn\",\n body: params,\n ...overrides,\n });\n }\n\n /** Transfers token units between holder addresses. */\n async transferToken(params: TransferTokenParams, overrides: RequestOverrides = {}): Promise<TokenTransferResult> {\n return this.client.request<TokenTransferResult>({\n method: \"POST\",\n path: \"/v1/tokens/transfer\",\n body: params,\n ...overrides,\n });\n }\n\n /** Registers (whitelists) a wallet address so it can hold a given token. */\n async registerWallet(\n params: RegisterTokenWalletParams,\n overrides: RequestOverrides = {},\n ): Promise<RegisterTokenWalletResult> {\n return this.client.request<RegisterTokenWalletResult>({\n method: \"POST\",\n path: \"/v1/tokens/register-wallet\",\n body: params,\n ...overrides,\n });\n }\n\n /** Returns the paginated list of holder wallet addresses and balances for a token on a chain. */\n async getTokenHolders(params: GetTokenHoldersParams, overrides: RequestOverrides = {}): Promise<Page<TokenHolder>> {\n const fetchPage = (query: Record<string, unknown>): Promise<Page<TokenHolder>> =>\n this.client\n .request<FlatPaginatedResponse<TokenHolder>>({\n method: \"GET\",\n path: \"/v1/tokens/holders\",\n query: { ...params, ...query },\n ...overrides,\n })\n .then((raw) => pageFromFlatResponse(raw, fetchPage));\n\n return fetchPage({ page: params.page, pageSize: params.pageSize });\n }\n\n /** Fetches a single token transaction by its reference. */\n async getTokenTransaction(ref: string, overrides: RequestOverrides = {}): Promise<TokenTransactionRecord> {\n return this.client.request<TokenTransactionRecord>({\n method: \"GET\",\n path: `/v1/tokens/transactions/${encodeURIComponent(ref)}`,\n ...overrides,\n });\n }\n\n /** Returns token transactions, optionally filtered by token. */\n async listTokenTransactions(\n params: ListTokenTransactionsParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Page<TokenTransactionRecord>> {\n const fetchPage = (query: Record<string, unknown>): Promise<Page<TokenTransactionRecord>> =>\n this.client\n .request<FlatPaginatedResponse<TokenTransactionRecord>>({\n method: \"GET\",\n path: \"/v1/tokens/transactions\",\n query: { ...params, ...query },\n ...overrides,\n })\n .then((raw) => pageFromFlatResponse(raw, fetchPage));\n\n return fetchPage({ page: params.page, pageSize: params.pageSize });\n }\n\n /** Updates the annual yield rate for a yield-bearing token. */\n async updateYield(params: UpdateTokenYieldParams, overrides: RequestOverrides = {}): Promise<YieldTxResult> {\n return this.client.request<YieldTxResult>({\n method: \"PATCH\",\n path: \"/v1/tokens/yield\",\n body: params,\n ...overrides,\n });\n }\n\n /** Funds and distributes a yield payout to holders. Unclaimed funds may be reclaimed after `reclaimAfter`. */\n async distributeYield(\n params: DistributeYieldParams,\n overrides: RequestOverrides = {},\n ): Promise<YieldOperationResult> {\n return this.client.request<YieldOperationResult>({\n method: \"POST\",\n path: \"/v1/tokens/yield/distribute\",\n body: params,\n ...overrides,\n });\n }\n\n /** Pays the scheduled coupon for a yield-bearing token. Set `pushYield` to push funds rather than let investors claim. */\n async payCoupon(params: PayCouponParams, overrides: RequestOverrides = {}): Promise<YieldOperationResult> {\n return this.client.request<YieldOperationResult>({\n method: \"POST\",\n path: \"/v1/tokens/yield/pay-coupon\",\n body: params,\n ...overrides,\n });\n }\n\n /** Claims an investor's yield for a given distribution snapshot. */\n async claimYield(params: ClaimYieldParams, overrides: RequestOverrides = {}): Promise<YieldTxResult> {\n return this.client.request<YieldTxResult>({\n method: \"POST\",\n path: \"/v1/tokens/yield/claim\",\n body: params,\n ...overrides,\n });\n }\n\n /** Redeems principal to holders at maturity. Set `pushYield` to push funds rather than let investors claim. */\n async redeemPrincipal(params: RedeemPrincipalParams, overrides: RequestOverrides = {}): Promise<YieldTxResult> {\n return this.client.request<YieldTxResult>({\n method: \"POST\",\n path: \"/v1/tokens/yield/redeem\",\n body: params,\n ...overrides,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport { pageFromMetaResponse } from \"../../core/pagination.js\";\nimport type { Page, MetaPaginatedResponse } from \"../../core/pagination.js\";\nimport type { QueryValue } from \"../../core/http-client.js\";\nimport type { RequestOverrides } from \"../../types.js\";\nimport type {\n CreateSubscriptionParams,\n EventCatalogEntry,\n IndexerSubscription,\n IndexerSubscriptionWithSecret,\n ListEventCatalogParams,\n ListSubscriptionsParams,\n UpdateSubscriptionParams,\n} from \"./types.js\";\n\nexport * from \"./types.js\";\n\n/**\n * The Blockchain Events (Indexer) service — subscribe to decoded on-chain events for a\n * contract and receive them at your webhook, signed with a per-subscription secret.\n *\n * Every operation requires a token bound to a project and business, and is gated on a\n * capability granted by your plan (e.g. `indexer.subscribe.evm`).\n */\nexport class IndexerResource extends APIResource {\n /**\n * Creates a subscription that streams decoded events for a contract to your webhook.\n * Requires the network's subscribe capability (e.g. `indexer.subscribe.evm`).\n *\n * The response includes `signingSecret` only on creation — store it securely, it is\n * never shown again (see {@link rotateSigningSecret} if you lose it).\n */\n async createSubscription(\n params: CreateSubscriptionParams,\n overrides: RequestOverrides = {},\n ): Promise<IndexerSubscriptionWithSecret> {\n return this.client.request<IndexerSubscriptionWithSecret>({\n method: \"POST\",\n path: \"/v1/indexer/subscriptions\",\n body: params,\n ...overrides,\n });\n }\n\n /** Lists the project's subscriptions. Requires `indexer.subscription.list`. */\n async listSubscriptions(\n params: ListSubscriptionsParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Page<IndexerSubscription>> {\n const fetchPage = (query: Record<string, unknown>): Promise<Page<IndexerSubscription>> =>\n this.client\n .request<MetaPaginatedResponse<IndexerSubscription>>({\n method: \"GET\",\n path: \"/v1/indexer/subscriptions\",\n query: { ...params, ...query },\n ...overrides,\n })\n .then((raw) => pageFromMetaResponse(raw, fetchPage));\n\n return fetchPage({ page: params.page, limit: params.limit });\n }\n\n /** Fetches one subscription. Requires `indexer.subscription.read`. */\n async getSubscription(id: string, overrides: RequestOverrides = {}): Promise<IndexerSubscription> {\n return this.client.request<IndexerSubscription>({\n method: \"GET\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}`,\n ...overrides,\n });\n }\n\n /** Updates a subscription's webhook, events, or status. At least one field is required. Requires `indexer.subscription.update`. */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n overrides: RequestOverrides = {},\n ): Promise<IndexerSubscription> {\n return this.client.request<IndexerSubscription>({\n method: \"PATCH\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}`,\n body: params,\n ...overrides,\n });\n }\n\n /** Soft-deletes a subscription (`status` becomes `\"deleted\"`; deliveries stop). Requires `indexer.subscription.delete`. */\n async deleteSubscription(id: string, overrides: RequestOverrides = {}): Promise<IndexerSubscription> {\n return this.client.request<IndexerSubscription>({\n method: \"DELETE\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}`,\n ...overrides,\n });\n }\n\n /**\n * Generates a new signing secret and invalidates the old one. Requires\n * `indexer.subscription.rotate_secret`. The response includes the new `signingSecret`\n * once — store it immediately.\n */\n async rotateSigningSecret(\n id: string,\n overrides: RequestOverrides = {},\n ): Promise<IndexerSubscriptionWithSecret> {\n return this.client.request<IndexerSubscriptionWithSecret>({\n method: \"POST\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}/rotate-secret`,\n ...overrides,\n });\n }\n\n /** Returns the catalog of subscribable event keys. Requires `indexer.subscription.list`. */\n async listEventCatalog(\n params: ListEventCatalogParams = {},\n overrides: RequestOverrides = {},\n ): Promise<EventCatalogEntry[]> {\n return this.client.request<EventCatalogEntry[]>({\n method: \"GET\",\n path: \"/v1/indexer/events\",\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n}\n","import { HttpClient, type RequestOptions } from \"./core/http-client.js\";\nimport { TokenManager } from \"./core/auth.js\";\nimport { AuthenticationError } from \"./core/errors.js\";\nimport { WalletResource } from \"./resources/wallet/index.js\";\nimport { TokenizationResource } from \"./resources/tokenization/index.js\";\nimport { IndexerResource } from \"./resources/indexer/index.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.withconvexity.com\";\n\nexport interface InfraClientOptions {\n /** Your Convexity Infra project API key (`sk_live_...` or `sk_test_...`). Exchanged internally for a bearer token. */\n apiKey: string;\n /** Overrides the API host. Defaults to `\"https://api.withconvexity.com\"`. */\n baseURL?: string;\n /** Space-separated OAuth scopes to request for minted tokens. Omit for full access. */\n scope?: string;\n /** Default per-request timeout in milliseconds. Default 30000. */\n timeoutMs?: number;\n /** Default number of retries for rate limits, service-unavailable responses, and safe connection errors. Default 2. */\n maxRetries?: number;\n /** Override the fetch implementation (mainly for testing). Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n}\n\n/**\n * Client for the Convexity Infra API — Wallet, Tokenization, and Blockchain Events (Indexer).\n *\n * ```ts\n * import { InfraClient } from \"infra-sdk-typescript\";\n *\n * const infra = new InfraClient({ apiKey: process.env.INFRA_API_KEY! });\n * const balance = await infra.wallet.getBalance();\n * ```\n */\nexport class InfraClient {\n readonly wallet: WalletResource;\n readonly tokenization: TokenizationResource;\n readonly indexer: IndexerResource;\n\n private readonly http: HttpClient;\n private readonly auth: TokenManager;\n\n constructor(options: InfraClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n \"InfraClient requires an `apiKey`. Request test/live keys from infra@withconvexity.com.\",\n );\n }\n\n const baseURL = options.baseURL ?? DEFAULT_BASE_URL;\n\n this.auth = new TokenManager({\n apiKey: options.apiKey,\n baseURL,\n scope: options.scope,\n fetch: options.fetch,\n });\n\n this.http = new HttpClient({\n baseURL,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n getAuthHeaders: async () => ({ Authorization: `Bearer ${await this.auth.getAccessToken()}` }),\n });\n\n this.wallet = new WalletResource(this);\n this.tokenization = new TokenizationResource(this);\n this.indexer = new IndexerResource(this);\n }\n\n /**\n * Low-level escape hatch that issues a raw request against the Infra API using this\n * client's auth, retry, and timeout configuration. The typed resource methods\n * (`client.wallet.*`, `client.tokenization.*`, `client.indexer.*`) are built on top of\n * this and should be preferred — reach for this only to call an endpoint this SDK\n * version doesn't wrap yet.\n */\n async request<T>(options: RequestOptions): Promise<T> {\n try {\n return await this.http.request<T>(options);\n } catch (err) {\n if (err instanceof AuthenticationError) {\n // The cached token may have expired between mint and use, or been revoked\n // server-side. Force one refresh and retry exactly once before giving up.\n await this.auth.getAccessToken({ forceRefresh: true });\n return await this.http.request<T>(options);\n }\n throw err;\n }\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookSignatureVerificationError } from \"./errors.js\";\n\n/** Default tolerance for {@link verifyWalletWebhookSignature}'s timestamp freshness check. */\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\nexport interface VerifyWalletWebhookOptions {\n /** The exact, unparsed request body as received (Buffer or string) — do not re-serialize parsed JSON. */\n payload: string | Buffer;\n /** Value of the `x-wallet-timestamp` header. */\n timestampHeader: string;\n /** Value of the `x-wallet-signature` header. */\n signatureHeader: string;\n /** The `webhookSecret` you supplied when creating the transfer/sign request. */\n secret: string;\n /** How old (in seconds) a timestamp may be before it's rejected as a possible replay. Default 300 (5 minutes). */\n toleranceSeconds?: number;\n}\n\n/**\n * Verifies a Wallet outcome webhook delivery (`wallet.transfer.completed` /\n * `wallet.transfer.failed` / `wallet.sign.completed` / `wallet.sign.failed`).\n *\n * The signature is `HMAC-SHA256(\"<timestamp>.<rawBody>\")`, hex-encoded, and the delivery\n * is rejected if the timestamp is older than `toleranceSeconds` to block replay attacks.\n *\n * @throws {WebhookSignatureVerificationError} if the timestamp is missing/stale or the signature doesn't match.\n */\nexport function verifyWalletWebhookSignature(options: VerifyWalletWebhookOptions): void {\n const { payload, timestampHeader, signatureHeader, secret, toleranceSeconds = DEFAULT_TOLERANCE_SECONDS } = options;\n\n const timestamp = Number(timestampHeader);\n if (!Number.isFinite(timestamp)) {\n throw new WebhookSignatureVerificationError(\"Missing or invalid x-wallet-timestamp header\");\n }\n const ageSeconds = Math.abs(Date.now() / 1000 - timestamp);\n if (ageSeconds > toleranceSeconds) {\n throw new WebhookSignatureVerificationError(\n `Webhook timestamp is ${Math.round(ageSeconds)}s old, outside the allowed tolerance of ${toleranceSeconds}s`,\n );\n }\n\n const rawBody = typeof payload === \"string\" ? payload : payload.toString(\"utf8\");\n const expected = createHmac(\"sha256\", secret).update(`${timestampHeader}.${rawBody}`).digest(\"hex\");\n if (!constantTimeEqual(expected, signatureHeader)) {\n throw new WebhookSignatureVerificationError(\n \"Signature mismatch — the payload may have been tampered with, or the secret is incorrect\",\n );\n }\n}\n\nexport interface VerifyIndexerWebhookOptions {\n /** The exact, unparsed request body as received (Buffer or string) — do not re-serialize parsed JSON. */\n payload: string | Buffer;\n /** Value of the `X-Indexer-Signature` header. */\n signatureHeader: string;\n /** The subscription's `signingSecret`, returned once on creation or secret rotation. */\n secret: string;\n}\n\n/**\n * Verifies a Blockchain Events (Indexer) webhook delivery. The signature is\n * `HMAC-SHA256(rawBody)`, hex-encoded, with no timestamp component.\n *\n * @throws {WebhookSignatureVerificationError} if the signature doesn't match.\n */\nexport function verifyIndexerWebhookSignature(options: VerifyIndexerWebhookOptions): void {\n const { payload, signatureHeader, secret } = options;\n const rawBody = typeof payload === \"string\" ? payload : payload.toString(\"utf8\");\n const expected = createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\");\n if (!constantTimeEqual(expected, signatureHeader)) {\n throw new WebhookSignatureVerificationError(\n \"Signature mismatch — the payload may have been tampered with, or the secret is incorrect\",\n );\n }\n}\n\nfunction constantTimeEqual(expectedHex: string, actualHex: string): boolean {\n const expected = Buffer.from(expectedHex, \"utf8\");\n const actual = Buffer.from(actualHex, \"utf8\");\n if (expected.length !== actual.length) return false;\n return timingSafeEqual(expected, actual);\n}\n"]}
1
+ {"version":3,"sources":["../src/core/version.ts","../src/core/errors.ts","../src/core/http-client.ts","../src/core/auth.ts","../src/resources/resource.ts","../src/core/idempotency.ts","../src/core/pagination.ts","../src/resources/wallet/index.ts","../src/resources/tokenization/index.ts","../src/resources/indexer/index.ts","../src/client.ts","../src/core/webhooks.ts"],"names":["sleep","randomUUID","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Kept in sync with `package.json#version` by the release process; used in the `User-Agent` header. */\nexport const SDK_VERSION = \"0.1.0\";\n","/** Base class for every error raised by this SDK. */\nexport class InfraError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The request never reached the server (DNS/TCP/TLS failure, aborted connection, etc). */\nexport class InfraConnectionError extends InfraError {\n constructor(\n message: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n }\n}\n\nexport class InfraConnectionTimeoutError extends InfraConnectionError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n }\n}\n\n/**\n * Constructed via {@link errorFromResponse}, which picks the most specific subclass for\n * the HTTP status code — prefer catching a subclass (e.g. {@link RateLimitError}) over\n * this base class when you need to branch on the failure kind.\n */\nexport class InfraAPIError extends InfraError {\n constructor(\n readonly status: number,\n message: string,\n /** Field-level validation messages, when the server included an `errors` array. */\n readonly errors: readonly string[] | undefined,\n /** The raw, parsed JSON response body, for callers that need fields this SDK doesn't model. */\n readonly body: unknown,\n /** Response headers, lower-cased keys. */\n readonly headers: Readonly<Record<string, string>>,\n ) {\n super(message);\n }\n}\n\nexport class BadRequestError extends InfraAPIError {}\nexport class AuthenticationError extends InfraAPIError {}\nexport class PaymentRequiredError extends InfraAPIError {}\nexport class PermissionDeniedError extends InfraAPIError {}\nexport class NotFoundError extends InfraAPIError {}\nexport class ConflictError extends InfraAPIError {}\nexport class UnprocessableEntityError extends InfraAPIError {}\n\nexport class RateLimitError extends InfraAPIError {\n constructor(\n status: number,\n message: string,\n errors: readonly string[] | undefined,\n body: unknown,\n headers: Readonly<Record<string, string>>,\n /** Seconds to wait before retrying, from the response body's `retryAfter` or a `Retry-After` header. */\n readonly retryAfterSeconds: number | undefined,\n ) {\n super(status, message, errors, body, headers);\n }\n}\n\nexport class InternalServerError extends InfraAPIError {}\nexport class ServiceUnavailableError extends InfraAPIError {}\nexport class UnknownAPIError extends InfraAPIError {}\n\n/** Builds the most specific {@link InfraAPIError} subclass for a given HTTP status. */\nexport function errorFromResponse(\n status: number,\n parsedBody: unknown,\n headers: Readonly<Record<string, string>>,\n): InfraAPIError {\n const body = (parsedBody ?? {}) as {\n message?: unknown;\n errors?: unknown;\n retryAfter?: unknown;\n };\n const message = typeof body.message === \"string\" ? body.message : `Request failed with status ${status}`;\n const errors = Array.isArray(body.errors) ? body.errors.filter((e): e is string => typeof e === \"string\") : undefined;\n\n switch (status) {\n case 400:\n return new BadRequestError(status, message, errors, parsedBody, headers);\n case 401:\n return new AuthenticationError(status, message, errors, parsedBody, headers);\n case 402:\n return new PaymentRequiredError(status, message, errors, parsedBody, headers);\n case 403:\n return new PermissionDeniedError(status, message, errors, parsedBody, headers);\n case 404:\n return new NotFoundError(status, message, errors, parsedBody, headers);\n case 409:\n return new ConflictError(status, message, errors, parsedBody, headers);\n case 422:\n return new UnprocessableEntityError(status, message, errors, parsedBody, headers);\n case 429: {\n const bodyRetryAfter = typeof body.retryAfter === \"number\" ? body.retryAfter : undefined;\n const headerRetryAfter = headers[\"retry-after\"] !== undefined ? Number(headers[\"retry-after\"]) : undefined;\n const retryAfterSeconds =\n bodyRetryAfter ?? (headerRetryAfter !== undefined && Number.isFinite(headerRetryAfter) ? headerRetryAfter : undefined);\n return new RateLimitError(status, message, errors, parsedBody, headers, retryAfterSeconds);\n }\n case 503:\n return new ServiceUnavailableError(status, message, errors, parsedBody, headers);\n default:\n if (status >= 500) return new InternalServerError(status, message, errors, parsedBody, headers);\n return new UnknownAPIError(status, message, errors, parsedBody, headers);\n }\n}\n\n/** Raised by `POST /v1/oauth/token` failures, which use an OAuth 2.0 error body instead of the standard envelope. */\nexport class InfraAuthTokenError extends InfraError {\n constructor(\n readonly status: number,\n readonly error: string,\n readonly errorDescription: string | undefined,\n ) {\n super(errorDescription ? `${error}: ${errorDescription}` : error);\n }\n}\n\nexport class WebhookSignatureVerificationError extends InfraError {}\n","import { SDK_VERSION } from \"./version.js\";\nimport {\n errorFromResponse,\n InfraConnectionError,\n InfraConnectionTimeoutError,\n RateLimitError,\n ServiceUnavailableError,\n InternalServerError,\n} from \"./errors.js\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n\nexport type QueryValue = string | number | boolean | undefined | null;\n\nexport interface RequestOptions {\n method: HttpMethod;\n path: string;\n query?: Record<string, QueryValue>;\n body?: unknown;\n headers?: Record<string, string>;\n /**\n * Sent as the `Idempotency-Key` header. Besides the header itself, its presence tells\n * the retry logic that a connection failure is safe to retry — the server can dedupe\n * a resubmission with the same key.\n */\n idempotencyKey?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport interface HttpClientOptions {\n baseURL: string;\n /** Invoked before every physical attempt (including retries) to get fresh auth headers. */\n getAuthHeaders: () => Promise<Record<string, string>>;\n fetch?: typeof fetch;\n timeoutMs?: number;\n maxRetries?: number;\n defaultHeaders?: Record<string, string>;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\n\nexport class HttpClient {\n private readonly baseURL: string;\n private readonly getAuthHeaders: () => Promise<Record<string, string>>;\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly defaultHeaders: Record<string, string>;\n\n constructor(options: HttpClientOptions) {\n this.baseURL = options.baseURL;\n this.getAuthHeaders = options.getAuthHeaders;\n this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.defaultHeaders = options.defaultHeaders ?? {};\n }\n\n /** Issues a request against the Infra API and returns the unwrapped `data` field of the response envelope. */\n async request<T>(options: RequestOptions): Promise<T> {\n const url = buildUrl(this.baseURL, options.path, options.query);\n const timeoutMs = options.timeoutMs ?? this.timeoutMs;\n // A connection failure (no response received) is only safe to blindly retry when the\n // request is naturally idempotent (GET) or the caller gave us an Idempotency-Key the\n // server can use to dedupe a resubmission. Otherwise a retry risks double-execution.\n const retryableOnConnectionError = options.method === \"GET\" || Boolean(options.idempotencyKey);\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= this.maxRetries) {\n attempt++;\n\n const authHeaders = await this.getAuthHeaders();\n const requestHeaders: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": `infra-sdk-typescript/${SDK_VERSION}`,\n ...this.defaultHeaders,\n ...authHeaders,\n ...options.headers,\n };\n if (options.body !== undefined) {\n requestHeaders[\"Content-Type\"] = \"application/json\";\n }\n if (options.idempotencyKey) {\n requestHeaders[\"Idempotency-Key\"] = options.idempotencyKey;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const onCallerAbort = () => controller.abort();\n if (options.signal) {\n if (options.signal.aborted) controller.abort();\n else options.signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n }\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method: options.method,\n headers: requestHeaders,\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onCallerAbort);\n\n if (options.signal?.aborted) {\n throw new InfraConnectionError(\"Request aborted by caller\", err);\n }\n const connectionError = isAbortError(err)\n ? new InfraConnectionTimeoutError(timeoutMs)\n : new InfraConnectionError(\"Could not reach the Infra API\", err);\n\n if (!retryableOnConnectionError || attempt > this.maxRetries) {\n throw connectionError;\n }\n lastError = connectionError;\n await sleep(backoffDelayMs(attempt));\n continue;\n }\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onCallerAbort);\n\n const responseHeaders = headersToObject(response.headers);\n const parsedBody = await parseJsonSafely(response);\n\n if (response.ok) {\n const envelope = parsedBody as { data?: T } | undefined;\n return envelope?.data as T;\n }\n\n const apiError = errorFromResponse(response.status, parsedBody, responseHeaders);\n const isRetryableStatus =\n apiError instanceof RateLimitError ||\n apiError instanceof ServiceUnavailableError ||\n apiError instanceof InternalServerError;\n\n // 429/503 mean the server did not execute the request, so retrying is always safe\n // regardless of method — unlike a connection error, we know nothing ran.\n if (!isRetryableStatus || attempt > this.maxRetries) {\n throw apiError;\n }\n lastError = apiError;\n const delayMs =\n apiError instanceof RateLimitError && apiError.retryAfterSeconds !== undefined\n ? apiError.retryAfterSeconds * 1000\n : backoffDelayMs(attempt);\n await sleep(delayMs);\n }\n\n throw lastError;\n }\n}\n\nfunction buildUrl(baseURL: string, path: string, query?: Record<string, QueryValue>): string {\n const base = baseURL.endsWith(\"/\") ? baseURL : `${baseURL}/`;\n const url = new URL(path.replace(/^\\//, \"\"), base);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const obj: Record<string, string> = {};\n headers.forEach((value, key) => {\n obj[key.toLowerCase()] = value;\n });\n return obj;\n}\n\nasync function parseJsonSafely(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof Error && err.name === \"AbortError\";\n}\n\nfunction backoffDelayMs(attempt: number): number {\n const base = Math.min(500 * 2 ** (attempt - 1), 8_000);\n const jitter = Math.random() * 250;\n return base + jitter;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { SDK_VERSION } from \"./version.js\";\nimport { InfraAuthTokenError, InfraConnectionError } from \"./errors.js\";\n\nexport interface TokenManagerOptions {\n apiKey: string;\n baseURL: string;\n /** Space-separated OAuth scopes to request. Omit for a full-access token. */\n scope?: string;\n fetch?: typeof fetch;\n /** Refresh this many seconds before the cached token's actual expiry. Default 30s. */\n clockSkewSeconds?: number;\n /** Retries for transient failures (429/503) while minting a token. Default 2. */\n maxRetries?: number;\n}\n\ninterface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n scope?: string;\n}\n\ninterface OAuthErrorResponse {\n error: string;\n error_description?: string;\n}\n\n/**\n * Exchanges the project API key for a short-lived OAuth 2.0 bearer token\n * (`POST /v1/oauth/token`, `client_credentials` grant) and caches it until shortly\n * before it expires. Concurrent callers during a refresh share the same in-flight\n * request rather than minting redundant tokens.\n */\nexport class TokenManager {\n private readonly apiKey: string;\n private readonly baseURL: string;\n private readonly scope: string | undefined;\n private readonly fetchImpl: typeof fetch;\n private readonly clockSkewSeconds: number;\n private readonly maxRetries: number;\n\n private cached: { accessToken: string; expiresAtMs: number } | null = null;\n private pendingRefresh: Promise<string> | null = null;\n\n constructor(options: TokenManagerOptions) {\n this.apiKey = options.apiKey;\n this.baseURL = options.baseURL;\n this.scope = options.scope;\n this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.clockSkewSeconds = options.clockSkewSeconds ?? 30;\n this.maxRetries = options.maxRetries ?? 2;\n }\n\n /** Returns a valid bearer token, minting or refreshing one only when necessary. */\n async getAccessToken(opts: { forceRefresh?: boolean } = {}): Promise<string> {\n if (!opts.forceRefresh && this.cached && Date.now() < this.cached.expiresAtMs) {\n return this.cached.accessToken;\n }\n if (this.pendingRefresh) {\n return this.pendingRefresh;\n }\n\n this.pendingRefresh = this.fetchToken().finally(() => {\n this.pendingRefresh = null;\n });\n return this.pendingRefresh;\n }\n\n private async fetchToken(): Promise<string> {\n let attempt = 0;\n for (;;) {\n attempt++;\n let response: Response;\n try {\n response = await this.fetchImpl(new URL(\"/v1/oauth/token\", this.baseURL), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `infra-sdk-typescript/${SDK_VERSION}`,\n },\n body: JSON.stringify({\n grant_type: \"client_credentials\",\n client_secret: this.apiKey,\n ...(this.scope ? { scope: this.scope } : {}),\n }),\n });\n } catch (err) {\n throw new InfraConnectionError(\"Could not reach the Infra API to obtain an access token\", err);\n }\n\n const text = await response.text();\n const parsed = text\n ? (JSON.parse(text) as OAuthTokenResponse | (OAuthErrorResponse & { retryAfter?: number }))\n : undefined;\n\n if (response.ok && parsed && \"access_token\" in parsed) {\n const expiresAtMs = Date.now() + Math.max(0, parsed.expires_in - this.clockSkewSeconds) * 1000;\n this.cached = { accessToken: parsed.access_token, expiresAtMs };\n return parsed.access_token;\n }\n\n // 429 on this endpoint uses the standard `{status, message, retryAfter}` envelope\n // rather than the OAuth `{error, error_description}` shape used elsewhere here.\n const errorBody = (parsed ?? { error: \"server_error\" }) as OAuthErrorResponse & { retryAfter?: number };\n const retryable = response.status === 429 || response.status === 503;\n if (retryable && attempt <= this.maxRetries) {\n const delayMs =\n typeof errorBody.retryAfter === \"number\" ? errorBody.retryAfter * 1000 : Math.min(500 * 2 ** (attempt - 1), 4_000);\n await sleep(delayMs);\n continue;\n }\n const fallbackDescription = (parsed as { message?: string } | undefined)?.message;\n throw new InfraAuthTokenError(\n response.status,\n errorBody.error ?? (response.status === 429 ? \"rate_limited\" : \"server_error\"),\n errorBody.error_description ?? fallbackDescription,\n );\n }\n }\n\n /** Drops the cached token, forcing the next call to mint a fresh one. */\n clearCache(): void {\n this.cached = null;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { InfraClient } from \"../client.js\";\n\n/** Base class every resource namespace (`client.wallet`, `client.tokenization`, `client.indexer`) extends. */\nexport abstract class APIResource {\n constructor(protected readonly client: InfraClient) {}\n}\n","import { randomUUID } from \"node:crypto\";\n\n/** Generates a UUIDv4 suitable for use as an `Idempotency-Key` header value. */\nexport function generateIdempotencyKey(): string {\n return randomUUID();\n}\n","/**\n * The Infra API uses three different pagination envelopes depending on the service\n * (see the Conventions doc). {@link Page} normalizes all three into one ergonomic type so\n * callers can iterate any list endpoint the same way:\n *\n * ```ts\n * const page = await client.tokenization.listTokens();\n * for await (const token of page) {\n * console.log(token.ticker);\n * }\n *\n * // or, page by page:\n * let page = await client.wallet.getTransactionHistory();\n * while (true) {\n * for (const tx of page.data) handle(tx);\n * if (!page.hasNextPage()) break;\n * page = await page.getNextPage();\n * }\n * ```\n */\nexport class Page<T> implements AsyncIterable<T> {\n readonly data: readonly T[];\n private readonly nextParams: Record<string, unknown> | null;\n private readonly fetchNext: ((params: Record<string, unknown>) => Promise<Page<T>>) | null;\n\n constructor(opts: {\n data: readonly T[];\n nextParams: Record<string, unknown> | null;\n fetchNext: ((params: Record<string, unknown>) => Promise<Page<T>>) | null;\n }) {\n this.data = opts.data;\n this.nextParams = opts.nextParams;\n this.fetchNext = opts.fetchNext;\n }\n\n hasNextPage(): boolean {\n return this.nextParams !== null && this.fetchNext !== null;\n }\n\n async getNextPage(): Promise<Page<T>> {\n if (!this.fetchNext || !this.nextParams) {\n throw new Error(\"This is the last page — check hasNextPage() before calling getNextPage().\");\n }\n return this.fetchNext(this.nextParams);\n }\n\n /** Walks every page starting with this one, yielding each `Page<T>` in turn. */\n async *iterPages(): AsyncGenerator<Page<T>, void, void> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- `page` walks forward each iteration; `this` is just the starting value.\n let page: Page<T> = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n\n /** Yields every item across all pages, fetching subsequent pages lazily as iteration proceeds. */\n async *[Symbol.asyncIterator](): AsyncGenerator<T, void, void> {\n for await (const page of this.iterPages()) {\n yield* page.data;\n }\n }\n\n /** Eagerly fetches every remaining page and returns all items as a single array. Use with caution on large collections. */\n async toArray(): Promise<T[]> {\n const items: T[] = [];\n for await (const item of this) {\n items.push(item);\n }\n return items;\n }\n}\n\n/** Raw shape returned by limit/offset endpoints (currently: Wallet transaction history). */\nexport interface OffsetPaginatedResponse<T> {\n items: readonly T[];\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n nextOffset: number | null;\n };\n}\n\nexport function pageFromOffsetResponse<T>(\n raw: OffsetPaginatedResponse<T>,\n fetchNext: (params: Record<string, unknown>) => Promise<Page<T>>,\n): Page<T> {\n const hasNext = raw.pagination.hasMore && raw.pagination.nextOffset !== null;\n return new Page({\n data: raw.items,\n nextParams: hasNext ? { offset: raw.pagination.nextOffset, limit: raw.pagination.limit } : null,\n fetchNext: hasNext ? fetchNext : null,\n });\n}\n\n/** Raw shape returned by page/pageSize endpoints with inline totals (currently: Tokenization). */\nexport interface FlatPaginatedResponse<T> {\n items: readonly T[];\n total: number;\n page: number;\n pageSize: number;\n}\n\nexport function pageFromFlatResponse<T>(\n raw: FlatPaginatedResponse<T>,\n fetchNext: (params: Record<string, unknown>) => Promise<Page<T>>,\n): Page<T> {\n const itemsSeenSoFar = (raw.page - 1) * raw.pageSize + raw.items.length;\n const hasNext = itemsSeenSoFar < raw.total;\n return new Page({\n data: raw.items,\n nextParams: hasNext ? { page: raw.page + 1, pageSize: raw.pageSize } : null,\n fetchNext: hasNext ? fetchNext : null,\n });\n}\n\n/** Raw shape returned by page/limit endpoints with a `meta` block (currently: Indexer). */\nexport interface MetaPaginatedResponse<T> {\n data: readonly T[];\n meta: {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n };\n}\n\nexport function pageFromMetaResponse<T>(\n raw: MetaPaginatedResponse<T>,\n fetchNext: (params: Record<string, unknown>) => Promise<Page<T>>,\n): Page<T> {\n const hasNext = raw.meta.page < raw.meta.totalPages;\n return new Page({\n data: raw.data,\n nextParams: hasNext ? { page: raw.meta.page + 1, limit: raw.meta.limit } : null,\n fetchNext: hasNext ? fetchNext : null,\n });\n}\n","import { APIResource } from \"../resource.js\";\nimport { generateIdempotencyKey } from \"../../core/idempotency.js\";\nimport { pageFromOffsetResponse } from \"../../core/pagination.js\";\nimport type { Page, OffsetPaginatedResponse } from \"../../core/pagination.js\";\nimport type { QueryValue } from \"../../core/http-client.js\";\nimport type { RequestOverrides, IdempotentRequestOverrides } from \"../../types.js\";\nimport type {\n DeactivateWalletParams,\n GenerateWalletsParams,\n GeneratedWallet,\n GetTransactionHistoryParams,\n GetWalletByAddressIndexParams,\n GetWalletByAddressParams,\n GetWalletCountParams,\n HdEnabledStatus,\n InitiateTransferParams,\n ListWalletsParams,\n SignTransactionParams,\n SignedTransactionResult,\n SupportedChain,\n Wallet,\n WalletBalance,\n WalletCount,\n WalletTransaction,\n} from \"./types.js\";\n\nexport * from \"./types.js\";\n\n/**\n * The Wallet service — manages the business HD wallet tree: deriving addresses, reading\n * them, signing and submitting transactions, and tracking the USD balance used to pay gas\n * on mainnet transfers.\n *\n * [Initiate transfer]{@link WalletResource.initiateTransfer} and sponsored\n * [Sign transaction]{@link WalletResource.signTransaction} are asynchronous by default:\n * they return a `PENDING` transaction immediately, and you poll\n * {@link WalletResource.getTransaction} (or supply `webhookUrl`) for the outcome. Pass\n * `waitForCompletion: true` for the legacy synchronous behavior.\n */\nexport class WalletResource extends APIResource {\n /** Derives one or more new addresses on the business HD tree. Requires `wallet.hd.generate`. */\n async generateWallets(\n params: GenerateWalletsParams,\n overrides: IdempotentRequestOverrides = {},\n ): Promise<GeneratedWallet[]> {\n const { idempotencyKey, ...rest } = overrides;\n return this.client.request<GeneratedWallet[]>({\n method: \"POST\",\n path: \"/v1/wallet/hd/generate\",\n body: params,\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\n ...rest,\n });\n }\n\n /**\n * Lists derived wallets for the business. Requires `wallet.hd.read`.\n *\n * Note: unlike {@link getTransactionHistory}, the API does not return pagination\n * metadata for this endpoint — it always answers with a plain array sized by `limit`.\n */\n async listWallets(params: ListWalletsParams = {}, overrides: RequestOverrides = {}): Promise<Wallet[]> {\n return this.client.request<Wallet[]>({\n method: \"GET\",\n path: \"/v1/wallet/hd\",\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Returns the number of derived wallets, optionally filtered by chain. Requires `wallet.hd.read`. */\n async getWalletCount(params: GetWalletCountParams = {}, overrides: RequestOverrides = {}): Promise<WalletCount> {\n return this.client.request<WalletCount>({\n method: \"GET\",\n path: \"/v1/wallet/hd/count\",\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Reports whether HD wallets are enabled for the business. Requires `wallet.hd.read`. */\n async getHdEnabled(overrides: RequestOverrides = {}): Promise<HdEnabledStatus> {\n return this.client.request<HdEnabledStatus>({\n method: \"GET\",\n path: \"/v1/wallet/hd/enabled\",\n ...overrides,\n });\n }\n\n /** Fetches a single wallet by its on-chain address. Requires `wallet.hd.read`. */\n async getWalletByAddress(\n address: string,\n params: GetWalletByAddressParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Wallet> {\n return this.client.request<Wallet>({\n method: \"GET\",\n path: `/v1/wallet/hd/address/${encodeURIComponent(address)}`,\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Fetches a wallet by its HD `addressIndex`. Requires `wallet.hd.read`. */\n async getWalletByAddressIndex(\n addressIndex: number,\n params: GetWalletByAddressIndexParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Wallet> {\n return this.client.request<Wallet>({\n method: \"GET\",\n path: `/v1/wallet/hd/address-index/${encodeURIComponent(String(addressIndex))}`,\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /**\n * Signs (and, where applicable, sponsors and submits) a transaction from a derived\n * wallet. Requires `wallet.hd.sign`.\n *\n * Returns a {@link SignedTransactionResult} for local-only signing (a non-EVM chain\n * with `addressIndex` — nothing broadcast), or a {@link WalletTransaction} for a\n * sponsored sign (async `PENDING` by default, or the settled result with\n * `waitForCompletion: true`).\n */\n async signTransaction(\n params: SignTransactionParams,\n overrides: IdempotentRequestOverrides = {},\n ): Promise<SignedTransactionResult | WalletTransaction> {\n const { idempotencyKey, ...rest } = overrides;\n return this.client.request<SignedTransactionResult | WalletTransaction>({\n method: \"POST\",\n path: \"/v1/wallet/hd/sign\",\n body: params,\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\n ...rest,\n });\n }\n\n /** Deactivates a wallet so it is no longer used for new operations. Requires `wallet.hd.deactivate`. */\n async deactivateWallet(\n walletId: string,\n params: DeactivateWalletParams = {},\n overrides: RequestOverrides = {},\n ): Promise<null> {\n return this.client.request<null>({\n method: \"POST\",\n path: `/v1/wallet/hd/deactivate/${encodeURIComponent(walletId)}`,\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n\n /** Lists the chains the platform can sign and broadcast on. */\n async getSupportedChains(overrides: RequestOverrides = {}): Promise<SupportedChain[]> {\n return this.client.request<SupportedChain[]>({\n method: \"GET\",\n path: \"/v1/wallet/rpc/chains\",\n ...overrides,\n });\n }\n\n /**\n * Submits a token (or native) transfer from a derived wallet. Requires\n * `wallet.transfer.create`.\n *\n * On a `422` (transfer reverted after broadcast, `waitForCompletion: true` only), the\n * thrown {@link UnprocessableEntityError} still carries the failed transaction — read it\n * from `error.body` (shaped like `{ data: WalletTransaction }`) if you need the details\n * rather than just the message.\n */\n async initiateTransfer(\n params: InitiateTransferParams,\n overrides: IdempotentRequestOverrides = {},\n ): Promise<WalletTransaction> {\n const { idempotencyKey, ...rest } = overrides;\n return this.client.request<WalletTransaction>({\n method: \"POST\",\n path: \"/v1/wallet/transaction\",\n body: params,\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\n ...rest,\n });\n }\n\n /**\n * Returns a paginated history of the business's transactions. Requires\n * `wallet.transfer.read`.\n *\n * ```ts\n * const page = await client.wallet.getTransactionHistory({ status: \"COMPLETED\" });\n * for await (const tx of page) {\n * console.log(tx.id, tx.status);\n * }\n * ```\n */\n async getTransactionHistory(\n params: GetTransactionHistoryParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Page<WalletTransaction>> {\n const fetchPage = (query: Record<string, unknown>): Promise<Page<WalletTransaction>> =>\n this.client\n .request<OffsetPaginatedResponse<WalletTransaction>>({\n method: \"GET\",\n path: \"/v1/wallet/transaction/history\",\n query: { ...params, ...query },\n ...overrides,\n })\n .then((raw) => pageFromOffsetResponse(raw, fetchPage));\n\n return fetchPage({ limit: params.limit, offset: params.offset });\n }\n\n /**\n * Fetches a single transaction record — the authoritative view of a transfer's outcome.\n * Poll this after an async `202` until `status` is `COMPLETED` or `FAILED`. Requires\n * `wallet.transfer.read`.\n */\n async getTransaction(id: string, overrides: RequestOverrides = {}): Promise<WalletTransaction> {\n return this.client.request<WalletTransaction>({\n method: \"GET\",\n path: `/v1/wallet/transaction/${encodeURIComponent(id)}`,\n ...overrides,\n });\n }\n\n /** Returns the business's spendable USD balance, used to pay gas on mainnet transfers. Requires `wallet.balance.read`. */\n async getBalance(overrides: RequestOverrides = {}): Promise<WalletBalance> {\n return this.client.request<WalletBalance>({\n method: \"GET\",\n path: \"/v1/wallet/balance\",\n ...overrides,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\r\nimport { pageFromFlatResponse } from \"../../core/pagination.js\";\r\nimport type { Page, FlatPaginatedResponse } from \"../../core/pagination.js\";\r\nimport { generateIdempotencyKey } from \"../../core/idempotency.js\";\r\nimport type { IdempotentRequestOverrides, RequestOverrides } from \"../../types.js\";\r\nimport type {\r\n BurnTokenParams,\r\n ClaimYieldParams,\r\n CreateTokenParams,\r\n DistributeYieldParams,\r\n ForcedTransferTokenParams,\r\n GetTokenHoldersParams,\r\n GetWalletBalanceParams,\r\n ListTokenTransactionsParams,\r\n ListTokensParams,\r\n MintTokenParams,\r\n PayCouponParams,\r\n RedeemPrincipalParams,\r\n RegisterTokenWalletParams,\r\n RegisterTokenWalletResult,\r\n TokenDeploymentResult,\r\n TokenDetail,\r\n TokenHolder,\r\n TokenOperationResult,\r\n TokenSummary,\r\n TokenTransactionRecord,\r\n TokenTransferResult,\r\n TokenWalletBalance,\r\n TransferTokenParams,\r\n UpdateTokenYieldParams,\r\n YieldOperationResult,\r\n YieldTxResult,\r\n} from \"./types.js\";\r\n\r\nexport * from \"./types.js\";\r\n\r\n/**\r\n * The Tokenization service — issues and manages tokenized real-world assets: deployment,\r\n * mint/burn/transfer, wallet whitelisting, holder balances, and the yield lifecycle\r\n * (rate updates, coupon payments, claims, and principal redemption) for `YIELD_BEARING`\r\n * tokens.\r\n */\r\nexport class TokenizationResource extends APIResource {\r\n /**\r\n * Issues a new tokenized asset and deploys it on the target chain. Returns immediately\r\n * with a `PENDING` token plus a deployment `operationRef` and `txHash` — poll\r\n * {@link getToken} until `status` is `ACTIVE`. Supply `yieldParams` for a\r\n * `YIELD_BEARING` token.\r\n */\r\n async createToken(\r\n params: CreateTokenParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<TokenDeploymentResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<TokenDeploymentResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /**\r\n * Returns a paginated list of tokens for the calling project.\r\n *\r\n * ```ts\r\n * const page = await client.tokenization.listTokens();\r\n * for await (const token of page) console.log(token.ticker, token.status);\r\n * ```\r\n */\r\n async listTokens(params: ListTokensParams = {}, overrides: RequestOverrides = {}): Promise<Page<TokenSummary>> {\r\n const fetchPage = (query: Record<string, unknown>): Promise<Page<TokenSummary>> =>\r\n this.client\r\n .request<FlatPaginatedResponse<TokenSummary>>({\r\n method: \"GET\",\r\n path: \"/v1/tokens\",\r\n query: { ...params, ...query },\r\n ...overrides,\r\n })\r\n .then((raw) => pageFromFlatResponse(raw, fetchPage));\r\n\r\n return fetchPage({ page: params.page, pageSize: params.pageSize });\r\n }\r\n\r\n /** Fetches a single token by id, including its per-chain deployment details. */\r\n async getToken(id: string, overrides: RequestOverrides = {}): Promise<TokenDetail> {\r\n return this.client.request<TokenDetail>({\r\n method: \"GET\",\r\n path: `/v1/tokens/${encodeURIComponent(id)}`,\r\n ...overrides,\r\n });\r\n }\r\n\r\n /** Mints new units of a token to a recipient address. */\r\n async mintToken(\r\n params: MintTokenParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<TokenOperationResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<TokenOperationResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/mint\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /** Burns units of a token from a holder address. */\r\n async burnToken(\r\n params: BurnTokenParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<TokenOperationResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<TokenOperationResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/burn\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /** Transfers token units between holder addresses. */\r\n async transferToken(\r\n params: TransferTokenParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<TokenTransferResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<TokenTransferResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/transfer\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /**\r\n * Force-transfers token units out of a holder's address without the holder's signature\r\n * (issuer/admin compliance action, e.g. recovery or court order). An `Idempotency-Key` is\r\n * generated per call unless you pass your own.\r\n */\r\n async forcedTransfer(\r\n params: ForcedTransferTokenParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<TokenOperationResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<TokenOperationResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/forced-transfer\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /** Registers (whitelists) a wallet address so it can hold a given token. */\r\n async registerWallet(\r\n params: RegisterTokenWalletParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<RegisterTokenWalletResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<RegisterTokenWalletResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/register-wallet\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /** Returns the paginated list of holder wallet addresses and balances for a token on a chain. */\r\n async getTokenHolders(params: GetTokenHoldersParams, overrides: RequestOverrides = {}): Promise<Page<TokenHolder>> {\r\n const fetchPage = (query: Record<string, unknown>): Promise<Page<TokenHolder>> =>\r\n this.client\r\n .request<FlatPaginatedResponse<TokenHolder>>({\r\n method: \"GET\",\r\n path: \"/v1/tokens/holders\",\r\n query: { ...params, ...query },\r\n ...overrides,\r\n })\r\n .then((raw) => pageFromFlatResponse(raw, fetchPage));\r\n\r\n return fetchPage({ page: params.page, pageSize: params.pageSize });\r\n }\r\n\r\n /** Returns a single wallet's balance of a token on a chain. */\r\n async getWalletBalance(\r\n params: GetWalletBalanceParams,\r\n overrides: RequestOverrides = {},\r\n ): Promise<TokenWalletBalance> {\r\n return this.client.request<TokenWalletBalance>({\r\n method: \"GET\",\r\n path: \"/v1/tokens/balance\",\r\n query: { ...params },\r\n ...overrides,\r\n });\r\n }\r\n\r\n /** Fetches a single token transaction by its reference. */\r\n async getTokenTransaction(ref: string, overrides: RequestOverrides = {}): Promise<TokenTransactionRecord> {\r\n return this.client.request<TokenTransactionRecord>({\r\n method: \"GET\",\r\n path: `/v1/tokens/transactions/${encodeURIComponent(ref)}`,\r\n ...overrides,\r\n });\r\n }\r\n\r\n /** Returns token transactions, optionally filtered by token. */\r\n async listTokenTransactions(\r\n params: ListTokenTransactionsParams = {},\r\n overrides: RequestOverrides = {},\r\n ): Promise<Page<TokenTransactionRecord>> {\r\n const fetchPage = (query: Record<string, unknown>): Promise<Page<TokenTransactionRecord>> =>\r\n this.client\r\n .request<FlatPaginatedResponse<TokenTransactionRecord>>({\r\n method: \"GET\",\r\n path: \"/v1/tokens/transactions\",\r\n query: { ...params, ...query },\r\n ...overrides,\r\n })\r\n .then((raw) => pageFromFlatResponse(raw, fetchPage));\r\n\r\n return fetchPage({ page: params.page, pageSize: params.pageSize });\r\n }\r\n\r\n /** Updates the annual yield rate for a yield-bearing token. */\r\n async updateYield(params: UpdateTokenYieldParams, overrides: RequestOverrides = {}): Promise<YieldTxResult> {\r\n return this.client.request<YieldTxResult>({\r\n method: \"PATCH\",\r\n path: \"/v1/tokens/yield\",\r\n body: params,\r\n ...overrides,\r\n });\r\n }\r\n\r\n /** Funds and distributes a yield payout to holders. Unclaimed funds may be reclaimed after `reclaimAfter`. */\r\n async distributeYield(\r\n params: DistributeYieldParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<YieldOperationResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<YieldOperationResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/yield/distribute\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /** Pays the scheduled coupon for a yield-bearing token. Set `pushYield` to push funds rather than let investors claim. */\r\n async payCoupon(\r\n params: PayCouponParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<YieldOperationResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<YieldOperationResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/yield/pay-coupon\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /** Claims an investor's yield for a given distribution snapshot. */\r\n async claimYield(\r\n params: ClaimYieldParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<YieldTxResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<YieldTxResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/yield/claim\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n\r\n /** Redeems principal to holders at maturity. Set `pushYield` to push funds rather than let investors claim. */\r\n async redeemPrincipal(\r\n params: RedeemPrincipalParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<YieldTxResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<YieldTxResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/yield/redeem\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\r\n });\r\n }\r\n}\r\n","import { APIResource } from \"../resource.js\";\nimport { pageFromMetaResponse } from \"../../core/pagination.js\";\nimport type { Page, MetaPaginatedResponse } from \"../../core/pagination.js\";\nimport type { QueryValue } from \"../../core/http-client.js\";\nimport type { RequestOverrides } from \"../../types.js\";\nimport type {\n CreateSubscriptionParams,\n EventCatalogEntry,\n IndexerSubscription,\n IndexerSubscriptionWithSecret,\n ListEventCatalogParams,\n ListSubscriptionsParams,\n UpdateSubscriptionParams,\n} from \"./types.js\";\n\nexport * from \"./types.js\";\n\n/**\n * The Blockchain Events (Indexer) service — subscribe to decoded on-chain events for a\n * contract and receive them at your webhook, signed with a per-subscription secret.\n *\n * Every operation requires a token bound to a project and business, and is gated on a\n * capability granted by your plan (e.g. `indexer.subscribe.evm`).\n */\nexport class IndexerResource extends APIResource {\n /**\n * Creates a subscription that streams decoded events for a contract to your webhook.\n * Requires the network's subscribe capability (e.g. `indexer.subscribe.evm`).\n *\n * The response includes `signingSecret` only on creation — store it securely, it is\n * never shown again (see {@link rotateSigningSecret} if you lose it).\n */\n async createSubscription(\n params: CreateSubscriptionParams,\n overrides: RequestOverrides = {},\n ): Promise<IndexerSubscriptionWithSecret> {\n return this.client.request<IndexerSubscriptionWithSecret>({\n method: \"POST\",\n path: \"/v1/indexer/subscriptions\",\n body: params,\n ...overrides,\n });\n }\n\n /** Lists the project's subscriptions. Requires `indexer.subscription.list`. */\n async listSubscriptions(\n params: ListSubscriptionsParams = {},\n overrides: RequestOverrides = {},\n ): Promise<Page<IndexerSubscription>> {\n const fetchPage = (query: Record<string, unknown>): Promise<Page<IndexerSubscription>> =>\n this.client\n .request<MetaPaginatedResponse<IndexerSubscription>>({\n method: \"GET\",\n path: \"/v1/indexer/subscriptions\",\n query: { ...params, ...query },\n ...overrides,\n })\n .then((raw) => pageFromMetaResponse(raw, fetchPage));\n\n return fetchPage({ page: params.page, limit: params.limit });\n }\n\n /** Fetches one subscription. Requires `indexer.subscription.read`. */\n async getSubscription(id: string, overrides: RequestOverrides = {}): Promise<IndexerSubscription> {\n return this.client.request<IndexerSubscription>({\n method: \"GET\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}`,\n ...overrides,\n });\n }\n\n /** Updates a subscription's webhook, events, or status. At least one field is required. Requires `indexer.subscription.update`. */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n overrides: RequestOverrides = {},\n ): Promise<IndexerSubscription> {\n return this.client.request<IndexerSubscription>({\n method: \"PATCH\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}`,\n body: params,\n ...overrides,\n });\n }\n\n /** Soft-deletes a subscription (`status` becomes `\"deleted\"`; deliveries stop). Requires `indexer.subscription.delete`. */\n async deleteSubscription(id: string, overrides: RequestOverrides = {}): Promise<IndexerSubscription> {\n return this.client.request<IndexerSubscription>({\n method: \"DELETE\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}`,\n ...overrides,\n });\n }\n\n /**\n * Generates a new signing secret and invalidates the old one. Requires\n * `indexer.subscription.rotate_secret`. The response includes the new `signingSecret`\n * once — store it immediately.\n */\n async rotateSigningSecret(\n id: string,\n overrides: RequestOverrides = {},\n ): Promise<IndexerSubscriptionWithSecret> {\n return this.client.request<IndexerSubscriptionWithSecret>({\n method: \"POST\",\n path: `/v1/indexer/subscriptions/${encodeURIComponent(id)}/rotate-secret`,\n ...overrides,\n });\n }\n\n /** Returns the catalog of subscribable event keys. Requires `indexer.subscription.list`. */\n async listEventCatalog(\n params: ListEventCatalogParams = {},\n overrides: RequestOverrides = {},\n ): Promise<EventCatalogEntry[]> {\n return this.client.request<EventCatalogEntry[]>({\n method: \"GET\",\n path: \"/v1/indexer/events\",\n query: params as Record<string, QueryValue>,\n ...overrides,\n });\n }\n}\n","import { HttpClient, type RequestOptions } from \"./core/http-client.js\";\nimport { TokenManager } from \"./core/auth.js\";\nimport { AuthenticationError } from \"./core/errors.js\";\nimport { WalletResource } from \"./resources/wallet/index.js\";\nimport { TokenizationResource } from \"./resources/tokenization/index.js\";\nimport { IndexerResource } from \"./resources/indexer/index.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.withconvexity.com\";\n\nexport interface InfraClientOptions {\n /** Your Convexity Infra project API key (`sk_live_...` or `sk_test_...`). Exchanged internally for a bearer token. */\n apiKey: string;\n /** Overrides the API host. Defaults to `\"https://api.withconvexity.com\"`. */\n baseURL?: string;\n /** Space-separated OAuth scopes to request for minted tokens. Omit for full access. */\n scope?: string;\n /** Default per-request timeout in milliseconds. Default 30000. */\n timeoutMs?: number;\n /** Default number of retries for rate limits, service-unavailable responses, and safe connection errors. Default 2. */\n maxRetries?: number;\n /** Override the fetch implementation (mainly for testing). Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n}\n\n/**\n * Client for the Convexity Infra API — Wallet, Tokenization, and Blockchain Events (Indexer).\n *\n * ```ts\n * import { InfraClient } from \"infra-sdk-typescript\";\n *\n * const infra = new InfraClient({ apiKey: process.env.INFRA_API_KEY! });\n * const balance = await infra.wallet.getBalance();\n * ```\n */\nexport class InfraClient {\n readonly wallet: WalletResource;\n readonly tokenization: TokenizationResource;\n readonly indexer: IndexerResource;\n\n private readonly http: HttpClient;\n private readonly auth: TokenManager;\n\n constructor(options: InfraClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n \"InfraClient requires an `apiKey`. Request test/live keys from infra@withconvexity.com.\",\n );\n }\n\n const baseURL = options.baseURL ?? DEFAULT_BASE_URL;\n\n this.auth = new TokenManager({\n apiKey: options.apiKey,\n baseURL,\n scope: options.scope,\n fetch: options.fetch,\n });\n\n this.http = new HttpClient({\n baseURL,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n getAuthHeaders: async () => ({ Authorization: `Bearer ${await this.auth.getAccessToken()}` }),\n });\n\n this.wallet = new WalletResource(this);\n this.tokenization = new TokenizationResource(this);\n this.indexer = new IndexerResource(this);\n }\n\n /**\n * Low-level escape hatch that issues a raw request against the Infra API using this\n * client's auth, retry, and timeout configuration. The typed resource methods\n * (`client.wallet.*`, `client.tokenization.*`, `client.indexer.*`) are built on top of\n * this and should be preferred — reach for this only to call an endpoint this SDK\n * version doesn't wrap yet.\n */\n async request<T>(options: RequestOptions): Promise<T> {\n try {\n return await this.http.request<T>(options);\n } catch (err) {\n if (err instanceof AuthenticationError) {\n // The cached token may have expired between mint and use, or been revoked\n // server-side. Force one refresh and retry exactly once before giving up.\n await this.auth.getAccessToken({ forceRefresh: true });\n return await this.http.request<T>(options);\n }\n throw err;\n }\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookSignatureVerificationError } from \"./errors.js\";\n\n/** Default tolerance for {@link verifyWalletWebhookSignature}'s timestamp freshness check. */\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\nexport interface VerifyWalletWebhookOptions {\n /** The exact, unparsed request body as received (Buffer or string) — do not re-serialize parsed JSON. */\n payload: string | Buffer;\n /** Value of the `x-wallet-timestamp` header. */\n timestampHeader: string;\n /** Value of the `x-wallet-signature` header. */\n signatureHeader: string;\n /** The `webhookSecret` you supplied when creating the transfer/sign request. */\n secret: string;\n /** How old (in seconds) a timestamp may be before it's rejected as a possible replay. Default 300 (5 minutes). */\n toleranceSeconds?: number;\n}\n\n/**\n * Verifies a Wallet outcome webhook delivery (`wallet.transfer.completed` /\n * `wallet.transfer.failed` / `wallet.sign.completed` / `wallet.sign.failed`).\n *\n * The signature is `HMAC-SHA256(\"<timestamp>.<rawBody>\")`, hex-encoded, and the delivery\n * is rejected if the timestamp is older than `toleranceSeconds` to block replay attacks.\n *\n * @throws {WebhookSignatureVerificationError} if the timestamp is missing/stale or the signature doesn't match.\n */\nexport function verifyWalletWebhookSignature(options: VerifyWalletWebhookOptions): void {\n const { payload, timestampHeader, signatureHeader, secret, toleranceSeconds = DEFAULT_TOLERANCE_SECONDS } = options;\n\n const timestamp = Number(timestampHeader);\n if (!Number.isFinite(timestamp)) {\n throw new WebhookSignatureVerificationError(\"Missing or invalid x-wallet-timestamp header\");\n }\n const ageSeconds = Math.abs(Date.now() / 1000 - timestamp);\n if (ageSeconds > toleranceSeconds) {\n throw new WebhookSignatureVerificationError(\n `Webhook timestamp is ${Math.round(ageSeconds)}s old, outside the allowed tolerance of ${toleranceSeconds}s`,\n );\n }\n\n const rawBody = typeof payload === \"string\" ? payload : payload.toString(\"utf8\");\n const expected = createHmac(\"sha256\", secret).update(`${timestampHeader}.${rawBody}`).digest(\"hex\");\n if (!constantTimeEqual(expected, signatureHeader)) {\n throw new WebhookSignatureVerificationError(\n \"Signature mismatch — the payload may have been tampered with, or the secret is incorrect\",\n );\n }\n}\n\nexport interface VerifyIndexerWebhookOptions {\n /** The exact, unparsed request body as received (Buffer or string) — do not re-serialize parsed JSON. */\n payload: string | Buffer;\n /** Value of the `X-Indexer-Signature` header. */\n signatureHeader: string;\n /** The subscription's `signingSecret`, returned once on creation or secret rotation. */\n secret: string;\n}\n\n/**\n * Verifies a Blockchain Events (Indexer) webhook delivery. The signature is\n * `HMAC-SHA256(rawBody)`, hex-encoded, with no timestamp component.\n *\n * @throws {WebhookSignatureVerificationError} if the signature doesn't match.\n */\nexport function verifyIndexerWebhookSignature(options: VerifyIndexerWebhookOptions): void {\n const { payload, signatureHeader, secret } = options;\n const rawBody = typeof payload === \"string\" ? payload : payload.toString(\"utf8\");\n const expected = createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\");\n if (!constantTimeEqual(expected, signatureHeader)) {\n throw new WebhookSignatureVerificationError(\n \"Signature mismatch — the payload may have been tampered with, or the secret is incorrect\",\n );\n }\n}\n\nfunction constantTimeEqual(expectedHex: string, actualHex: string): boolean {\n const expected = Buffer.from(expectedHex, \"utf8\");\n const actual = Buffer.from(actualHex, \"utf8\");\n if (expected.length !== actual.length) return false;\n return timingSafeEqual(expected, actual);\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -477,40 +477,43 @@ interface MintTokenParams {
477
477
  interface TransferTokenParams {
478
478
  tokenId: string;
479
479
  chainId: string;
480
+ /** HD address index of the sending holder wallet. */
481
+ fromAddressIndex: number;
482
+ toAddress: string;
483
+ /** Amount to transfer, in token units. */
484
+ amount: number;
485
+ memo?: string;
486
+ }
487
+ interface ForcedTransferTokenParams {
488
+ tokenId: string;
489
+ chainId: string;
490
+ /** Holder address to move tokens out of. */
480
491
  fromAddress: string;
481
492
  toAddress: string;
482
493
  /** Amount to transfer, in token units. */
483
494
  amount: number;
484
495
  memo?: string;
485
496
  }
486
- /** Result of {@link TokenizationResource.mintToken} / {@link TokenizationResource.burnToken}. */
497
+ /**
498
+ * Result of {@link TokenizationResource.mintToken} / {@link TokenizationResource.burnToken} /
499
+ * {@link TokenizationResource.forcedTransfer}.
500
+ */
487
501
  interface TokenOperationResult {
488
502
  operationRef: string;
489
503
  transactionId: string;
490
504
  txHash: string;
491
505
  }
492
- /** Result of {@link TokenizationResource.transferToken} — the settled on-chain transfer record. */
506
+ /** Result of {@link TokenizationResource.transferToken}. */
493
507
  interface TokenTransferResult {
494
- id: string;
495
- type: string;
496
- chainType: ChainType;
497
- network: Network;
498
- chainId: number;
499
- signerType: string;
500
- fromAddress: string;
501
- addressIndex: number | null;
508
+ tokenId: string;
509
+ status: TokenTransactionStatus;
510
+ transactionId: string;
511
+ fromAddressIndex: number;
502
512
  toAddress: string;
503
- /** Amount in token units, as a decimal string. */
504
- amount: string;
505
- tokenAddress: string | null;
506
- data: string | null;
507
- value: string | null;
513
+ /** Amount transferred, in token units. */
514
+ amount: number;
508
515
  txHash: string;
509
- status: TokenTransactionStatus;
510
- gasUsed: string | null;
511
- feeWei: string | null;
512
- createdAt: string;
513
- updatedAt: string;
516
+ operationRef: string;
514
517
  }
515
518
  interface RegisterTokenWalletParams {
516
519
  tokenId: string;
@@ -533,6 +536,21 @@ interface TokenHolder {
533
536
  /** Balance in token units, as a decimal string. */
534
537
  balance: string;
535
538
  }
539
+ interface GetWalletBalanceParams {
540
+ tokenId: string;
541
+ chainId: string;
542
+ walletAddress: string;
543
+ }
544
+ /** A single wallet's balance of a token, returned by {@link TokenizationResource.getWalletBalance}. */
545
+ interface TokenWalletBalance {
546
+ tokenId: string;
547
+ ticker: string;
548
+ chainId: string;
549
+ walletAddress: string;
550
+ /** Balance in token units, as a decimal string. */
551
+ balance: string;
552
+ decimals: number;
553
+ }
536
554
  interface ListTokenTransactionsParams {
537
555
  tokenId?: string;
538
556
  chainId?: string;
@@ -630,7 +648,7 @@ declare class TokenizationResource extends APIResource {
630
648
  * {@link getToken} until `status` is `ACTIVE`. Supply `yieldParams` for a
631
649
  * `YIELD_BEARING` token.
632
650
  */
633
- createToken(params: CreateTokenParams, overrides?: RequestOverrides): Promise<TokenDeploymentResult>;
651
+ createToken(params: CreateTokenParams, overrides?: IdempotentRequestOverrides): Promise<TokenDeploymentResult>;
634
652
  /**
635
653
  * Returns a paginated list of tokens for the calling project.
636
654
  *
@@ -643,15 +661,23 @@ declare class TokenizationResource extends APIResource {
643
661
  /** Fetches a single token by id, including its per-chain deployment details. */
644
662
  getToken(id: string, overrides?: RequestOverrides): Promise<TokenDetail>;
645
663
  /** Mints new units of a token to a recipient address. */
646
- mintToken(params: MintTokenParams, overrides?: RequestOverrides): Promise<TokenOperationResult>;
664
+ mintToken(params: MintTokenParams, overrides?: IdempotentRequestOverrides): Promise<TokenOperationResult>;
647
665
  /** Burns units of a token from a holder address. */
648
- burnToken(params: BurnTokenParams, overrides?: RequestOverrides): Promise<TokenOperationResult>;
666
+ burnToken(params: BurnTokenParams, overrides?: IdempotentRequestOverrides): Promise<TokenOperationResult>;
649
667
  /** Transfers token units between holder addresses. */
650
- transferToken(params: TransferTokenParams, overrides?: RequestOverrides): Promise<TokenTransferResult>;
668
+ transferToken(params: TransferTokenParams, overrides?: IdempotentRequestOverrides): Promise<TokenTransferResult>;
669
+ /**
670
+ * Force-transfers token units out of a holder's address without the holder's signature
671
+ * (issuer/admin compliance action, e.g. recovery or court order). An `Idempotency-Key` is
672
+ * generated per call unless you pass your own.
673
+ */
674
+ forcedTransfer(params: ForcedTransferTokenParams, overrides?: IdempotentRequestOverrides): Promise<TokenOperationResult>;
651
675
  /** Registers (whitelists) a wallet address so it can hold a given token. */
652
- registerWallet(params: RegisterTokenWalletParams, overrides?: RequestOverrides): Promise<RegisterTokenWalletResult>;
676
+ registerWallet(params: RegisterTokenWalletParams, overrides?: IdempotentRequestOverrides): Promise<RegisterTokenWalletResult>;
653
677
  /** Returns the paginated list of holder wallet addresses and balances for a token on a chain. */
654
678
  getTokenHolders(params: GetTokenHoldersParams, overrides?: RequestOverrides): Promise<Page<TokenHolder>>;
679
+ /** Returns a single wallet's balance of a token on a chain. */
680
+ getWalletBalance(params: GetWalletBalanceParams, overrides?: RequestOverrides): Promise<TokenWalletBalance>;
655
681
  /** Fetches a single token transaction by its reference. */
656
682
  getTokenTransaction(ref: string, overrides?: RequestOverrides): Promise<TokenTransactionRecord>;
657
683
  /** Returns token transactions, optionally filtered by token. */
@@ -659,13 +685,13 @@ declare class TokenizationResource extends APIResource {
659
685
  /** Updates the annual yield rate for a yield-bearing token. */
660
686
  updateYield(params: UpdateTokenYieldParams, overrides?: RequestOverrides): Promise<YieldTxResult>;
661
687
  /** Funds and distributes a yield payout to holders. Unclaimed funds may be reclaimed after `reclaimAfter`. */
662
- distributeYield(params: DistributeYieldParams, overrides?: RequestOverrides): Promise<YieldOperationResult>;
688
+ distributeYield(params: DistributeYieldParams, overrides?: IdempotentRequestOverrides): Promise<YieldOperationResult>;
663
689
  /** Pays the scheduled coupon for a yield-bearing token. Set `pushYield` to push funds rather than let investors claim. */
664
- payCoupon(params: PayCouponParams, overrides?: RequestOverrides): Promise<YieldOperationResult>;
690
+ payCoupon(params: PayCouponParams, overrides?: IdempotentRequestOverrides): Promise<YieldOperationResult>;
665
691
  /** Claims an investor's yield for a given distribution snapshot. */
666
- claimYield(params: ClaimYieldParams, overrides?: RequestOverrides): Promise<YieldTxResult>;
692
+ claimYield(params: ClaimYieldParams, overrides?: IdempotentRequestOverrides): Promise<YieldTxResult>;
667
693
  /** Redeems principal to holders at maturity. Set `pushYield` to push funds rather than let investors claim. */
668
- redeemPrincipal(params: RedeemPrincipalParams, overrides?: RequestOverrides): Promise<YieldTxResult>;
694
+ redeemPrincipal(params: RedeemPrincipalParams, overrides?: IdempotentRequestOverrides): Promise<YieldTxResult>;
669
695
  }
670
696
 
671
697
  type SubscriptionStatus = LooseUnion<"active" | "paused" | "deleted">;