infra-sdk-typescript 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/index.cjs +25 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +84 -13
- package/dist/index.d.ts +84 -13
- package/dist/index.js +25 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -106,6 +106,28 @@ while (final.status === "PENDING" || final.status === "PROCESSING") {
|
|
|
106
106
|
If you want the old synchronous behavior, pass `waitForCompletion: true`. That holds the
|
|
107
107
|
request open until the transaction settles and returns the final result.
|
|
108
108
|
|
|
109
|
+
### Tokenization outcomes
|
|
110
|
+
|
|
111
|
+
Some tokenization writes report their on-chain outcome in the result instead of throwing:
|
|
112
|
+
|
|
113
|
+
- `transferToken` resolves with `status: "FAILED"` when the transfer reverts on-chain, so check
|
|
114
|
+
`status` rather than relying on an error.
|
|
115
|
+
- `claimYield` and `reclaimUnclaimedYield` return `status: "COMPLETED"` once mined. `"SUBMITTED"`
|
|
116
|
+
means the outcome isn't known yet; poll `getTokenTransaction(result.operationRef)` until its
|
|
117
|
+
`status` is `CONFIRMED` or `FAILED`.
|
|
118
|
+
- A wallet's cNGN balance, the currency coupons, yield and principal are paid in, comes from
|
|
119
|
+
`getPayoutBalance({ chainId, walletAddress })`. `getWalletBalance` returns only the token balance.
|
|
120
|
+
- Distributions created with `pushYield: true` record the push on their `SNAPSHOT` transaction:
|
|
121
|
+
`pushStatus` (`PENDING`, `SUBMITTED`, `PUSHED`, `FAILED`), `pushTxHash` and `pushFailureReason`.
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
const claim = await client.tokenization.claimYield({ tokenId, chainId: "84532", investorAddressIndex: 12, snapshotId: 4 });
|
|
125
|
+
if (claim.status === "SUBMITTED") {
|
|
126
|
+
const tx = await client.tokenization.getTokenTransaction(claim.operationRef);
|
|
127
|
+
console.log(tx.status); // PENDING until the chain settles it
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
109
131
|
### Pagination
|
|
110
132
|
|
|
111
133
|
The API hands back three different pagination envelopes depending on which service you're
|
package/dist/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var crypto = require('crypto');
|
|
4
4
|
|
|
5
5
|
// src/core/version.ts
|
|
6
|
-
var SDK_VERSION = "0.
|
|
6
|
+
var SDK_VERSION = "0.5.0";
|
|
7
7
|
|
|
8
8
|
// src/core/errors.ts
|
|
9
9
|
var InfraError = class extends Error {
|
|
@@ -628,7 +628,10 @@ var TokenizationResource = class extends APIResource {
|
|
|
628
628
|
...rest
|
|
629
629
|
});
|
|
630
630
|
}
|
|
631
|
-
/**
|
|
631
|
+
/**
|
|
632
|
+
* Transfers token units between holder addresses. A transfer that is rejected or reverts
|
|
633
|
+
* on-chain still resolves, with `status: "FAILED"`, so check `status` rather than relying on an error.
|
|
634
|
+
*/
|
|
632
635
|
async transferToken(params, overrides = {}) {
|
|
633
636
|
const { idempotencyKey, ...rest } = overrides;
|
|
634
637
|
return this.client.request({
|
|
@@ -675,7 +678,7 @@ var TokenizationResource = class extends APIResource {
|
|
|
675
678
|
}).then((raw) => pageFromFlatResponse(raw, fetchPage));
|
|
676
679
|
return fetchPage({ page: params.page, pageSize: params.pageSize });
|
|
677
680
|
}
|
|
678
|
-
/** Returns a single wallet's balance of a token on a chain
|
|
681
|
+
/** Returns a single wallet's balance of a token on a chain. For its cNGN balance, use {@link getPayoutBalance}. */
|
|
679
682
|
async getWalletBalance(params, overrides = {}) {
|
|
680
683
|
return this.client.request({
|
|
681
684
|
method: "GET",
|
|
@@ -684,6 +687,18 @@ var TokenizationResource = class extends APIResource {
|
|
|
684
687
|
...overrides
|
|
685
688
|
});
|
|
686
689
|
}
|
|
690
|
+
/**
|
|
691
|
+
* Returns a wallet's balance of the chain's payout token (cNGN), in which coupons, yield and
|
|
692
|
+
* principal are paid. It depends only on the chain and wallet, so no token is needed.
|
|
693
|
+
*/
|
|
694
|
+
async getPayoutBalance(params, overrides = {}) {
|
|
695
|
+
return this.client.request({
|
|
696
|
+
method: "GET",
|
|
697
|
+
path: "/v1/tokens/payout-balance",
|
|
698
|
+
query: { ...params },
|
|
699
|
+
...overrides
|
|
700
|
+
});
|
|
701
|
+
}
|
|
687
702
|
/** Fetches a single token transaction by its reference. */
|
|
688
703
|
async getTokenTransaction(ref, overrides = {}) {
|
|
689
704
|
return this.client.request({
|
|
@@ -738,7 +753,11 @@ var TokenizationResource = class extends APIResource {
|
|
|
738
753
|
...rest
|
|
739
754
|
});
|
|
740
755
|
}
|
|
741
|
-
/**
|
|
756
|
+
/**
|
|
757
|
+
* Claims an investor's yield for a given distribution snapshot. `status` is `COMPLETED` once the
|
|
758
|
+
* claim is mined. If it's `SUBMITTED`, the outcome isn't known yet: poll
|
|
759
|
+
* {@link getTokenTransaction} with the result's `operationRef` until its `status` is `CONFIRMED` or `FAILED`.
|
|
760
|
+
*/
|
|
742
761
|
async claimYield(params, overrides = {}) {
|
|
743
762
|
const { idempotencyKey, ...rest } = overrides;
|
|
744
763
|
return this.client.request({
|
|
@@ -788,7 +807,8 @@ var TokenizationResource = class extends APIResource {
|
|
|
788
807
|
}
|
|
789
808
|
/**
|
|
790
809
|
* Returns a snapshot's unclaimed yield to the issuer once its `reclaimAfter` window has
|
|
791
|
-
* passed. An `Idempotency-Key` is generated per call unless you pass your own.
|
|
810
|
+
* passed. An `Idempotency-Key` is generated per call unless you pass your own. As with
|
|
811
|
+
* {@link claimYield}, a `SUBMITTED` status means the outcome should be polled by `operationRef`.
|
|
792
812
|
*/
|
|
793
813
|
async reclaimUnclaimedYield(params, overrides = {}) {
|
|
794
814
|
const { idempotencyKey, ...rest } = overrides;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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. */\r\nexport const SDK_VERSION = \"0.4.0\";\r\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 GetNextCouponParams,\r\n GetWalletBalanceParams,\r\n ListTokenTransactionsParams,\r\n ListTokensParams,\r\n MintTokenParams,\r\n NextCoupon,\r\n PayCouponParams,\r\n ReclaimUnclaimedYieldParams,\r\n ReclaimUnclaimedYieldResult,\r\n RedeemPrincipalParams,\r\n RedeemPrincipalResult,\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 UpdateYieldResult,\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, principal redemption, and reclaiming unclaimed\r\n * payouts) for `YIELD_BEARING` 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, plus its cNGN (payout token) balance. */\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 /**\r\n * Updates the annual yield rate for a yield-bearing token. An `Idempotency-Key` is generated\r\n * per call unless you pass your own.\r\n */\r\n async updateYield(\r\n params: UpdateTokenYieldParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<UpdateYieldResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<UpdateYieldResult>({\r\n method: \"PATCH\",\r\n path: \"/v1/tokens/yield\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\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 /**\r\n * Returns the bond's next coupon date and where it stands on its schedule. Whether a coupon is\r\n * due is decided by the chain's clock, not yours, so check `status` (or `isDue`) rather than\r\n * comparing `nextCouponDate` with local time. Works for paused tokens too.\r\n *\r\n * ```ts\r\n * const next = await client.tokenization.getNextCoupon({ tokenId, chainId: \"84532\" });\r\n * if (next.status === \"DUE\") await client.tokenization.payCoupon({ tokenId, chainId: \"84532\", ... });\r\n * ```\r\n */\r\n async getNextCoupon(\r\n params: GetNextCouponParams,\r\n overrides: RequestOverrides = {},\r\n ): Promise<NextCoupon> {\r\n return this.client.request<NextCoupon>({\r\n method: \"GET\",\r\n path: \"/v1/tokens/yield/next-coupon\",\r\n query: { ...params },\r\n ...overrides,\r\n });\r\n }\r\n\r\n /**\r\n * Redeems principal to holders at maturity, paying from the cNGN deposited in the token contract.\r\n * Issuer-held tokens are burned without a payout so the supply can reach zero and the bond close.\r\n * Holders that can't be redeemed (frozen, unverified, not allowlisted) are left alone and listed in\r\n * `skipped`; check `closed` to see whether the bond is done.\r\n *\r\n * If a run fails part-way, call it again: holders already redeemed are skipped, so it carries on\r\n * where it stopped. Reusing the same `idempotencyKey` only replays the earlier response.\r\n */\r\n async redeemPrincipal(\r\n params: RedeemPrincipalParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<RedeemPrincipalResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<RedeemPrincipalResult>({\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 /**\r\n * Returns a snapshot's unclaimed yield to the issuer once its `reclaimAfter` window has\r\n * passed. An `Idempotency-Key` is generated per call unless you pass your own.\r\n */\r\n async reclaimUnclaimedYield(\r\n params: ReclaimUnclaimedYieldParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<ReclaimUnclaimedYieldResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<ReclaimUnclaimedYieldResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/yield/reclaim\",\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"]}
|
|
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. */\r\nexport const SDK_VERSION = \"0.5.0\";\r\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 GetNextCouponParams,\r\n GetWalletBalanceParams,\r\n GetPayoutBalanceParams,\r\n PayoutBalance,\r\n ListTokenTransactionsParams,\r\n ListTokensParams,\r\n MintTokenParams,\r\n NextCoupon,\r\n PayCouponParams,\r\n ReclaimUnclaimedYieldParams,\r\n ReclaimUnclaimedYieldResult,\r\n RedeemPrincipalParams,\r\n RedeemPrincipalResult,\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 UpdateYieldResult,\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, principal redemption, and reclaiming unclaimed\r\n * payouts) for `YIELD_BEARING` 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 /**\r\n * Transfers token units between holder addresses. A transfer that is rejected or reverts\r\n * on-chain still resolves, with `status: \"FAILED\"`, so check `status` rather than relying on an error.\r\n */\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. For its cNGN balance, use {@link getPayoutBalance}. */\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 /**\r\n * Returns a wallet's balance of the chain's payout token (cNGN), in which coupons, yield and\r\n * principal are paid. It depends only on the chain and wallet, so no token is needed.\r\n */\r\n async getPayoutBalance(\r\n params: GetPayoutBalanceParams,\r\n overrides: RequestOverrides = {},\r\n ): Promise<PayoutBalance> {\r\n return this.client.request<PayoutBalance>({\r\n method: \"GET\",\r\n path: \"/v1/tokens/payout-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 /**\r\n * Updates the annual yield rate for a yield-bearing token. An `Idempotency-Key` is generated\r\n * per call unless you pass your own.\r\n */\r\n async updateYield(\r\n params: UpdateTokenYieldParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<UpdateYieldResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<UpdateYieldResult>({\r\n method: \"PATCH\",\r\n path: \"/v1/tokens/yield\",\r\n body: params,\r\n idempotencyKey: idempotencyKey ?? generateIdempotencyKey(),\r\n ...rest,\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 /**\r\n * Claims an investor's yield for a given distribution snapshot. `status` is `COMPLETED` once the\r\n * claim is mined. If it's `SUBMITTED`, the outcome isn't known yet: poll\r\n * {@link getTokenTransaction} with the result's `operationRef` until its `status` is `CONFIRMED` or `FAILED`.\r\n */\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 /**\r\n * Returns the bond's next coupon date and where it stands on its schedule. Whether a coupon is\r\n * due is decided by the chain's clock, not yours, so check `status` (or `isDue`) rather than\r\n * comparing `nextCouponDate` with local time. Works for paused tokens too.\r\n *\r\n * ```ts\r\n * const next = await client.tokenization.getNextCoupon({ tokenId, chainId: \"84532\" });\r\n * if (next.status === \"DUE\") await client.tokenization.payCoupon({ tokenId, chainId: \"84532\", ... });\r\n * ```\r\n */\r\n async getNextCoupon(\r\n params: GetNextCouponParams,\r\n overrides: RequestOverrides = {},\r\n ): Promise<NextCoupon> {\r\n return this.client.request<NextCoupon>({\r\n method: \"GET\",\r\n path: \"/v1/tokens/yield/next-coupon\",\r\n query: { ...params },\r\n ...overrides,\r\n });\r\n }\r\n\r\n /**\r\n * Redeems principal to holders at maturity, paying from the cNGN deposited in the token contract.\r\n * Issuer-held tokens are burned without a payout so the supply can reach zero and the bond close.\r\n * Holders that can't be redeemed (frozen, unverified, not allowlisted) are left alone and listed in\r\n * `skipped`; check `closed` to see whether the bond is done.\r\n *\r\n * If a run fails part-way, call it again: holders already redeemed are skipped, so it carries on\r\n * where it stopped. Reusing the same `idempotencyKey` only replays the earlier response.\r\n */\r\n async redeemPrincipal(\r\n params: RedeemPrincipalParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<RedeemPrincipalResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<RedeemPrincipalResult>({\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 /**\r\n * Returns a snapshot's unclaimed yield to the issuer once its `reclaimAfter` window has\r\n * passed. An `Idempotency-Key` is generated per call unless you pass your own. As with\r\n * {@link claimYield}, a `SUBMITTED` status means the outcome should be polled by `operationRef`.\r\n */\r\n async reclaimUnclaimedYield(\r\n params: ReclaimUnclaimedYieldParams,\r\n overrides: IdempotentRequestOverrides = {},\r\n ): Promise<ReclaimUnclaimedYieldResult> {\r\n const { idempotencyKey, ...rest } = overrides;\r\n return this.client.request<ReclaimUnclaimedYieldResult>({\r\n method: \"POST\",\r\n path: \"/v1/tokens/yield/reclaim\",\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"]}
|