diff --git a/src/api/info/_methods/outcomeTemplates.ts b/src/api/info/_methods/outcomeTemplates.ts new file mode 100644 index 00000000..ba4aabb4 --- /dev/null +++ b/src/api/info/_methods/outcomeTemplates.ts @@ -0,0 +1,85 @@ +import * as v from "@valibot/valibot"; + +// ============================================================ +// API Schemas +// ============================================================ + +/** + * Request outcome templates. + * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/hip-4-deployer-actions#read-api + */ +export const OutcomeTemplatesRequest = /* @__PURE__ */ (() => { + return v.object({ + /** Type of request. */ + type: v.literal("outcomeTemplates"), + }); +})(); +export type OutcomeTemplatesRequest = v.InferOutput; + +/** + * Array of templates that outcome deployers instantiate. + * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/hip-4-deployer-actions#read-api + */ +export type OutcomeTemplatesResponse = { + /** Template identifier. */ + id: string; + /** Role of the template. */ + role: { + /** Deploys a single outcome. */ + standaloneOutcome: { + /** Names of the Yes and No sides. */ + sideNames: [string, string]; + }; + }; + /** Display name containing `{keyword}` placeholders. */ + name: string; + /** Description containing `{keyword}` placeholders. */ + description: string; + /** + * Keywords of the template and the value format of each: + * - `dateTime` = `%Y%m%d-%H%M`, within the next year; e.g. `20260712-1830`. + * - `date` = `YYYYMMDD` (end of day), within the next year; e.g. `20260712`. + * - `string` = free text. + * - `hlPerp` = coin name of an existing perp; e.g. `ABC` or `test:ABC`. + */ + keywords: [string, "dateTime" | "date" | "string" | "hlPerp"][]; +}[]; + +// ============================================================ +// Execution Logic +// ============================================================ + +import { parse } from "../../../_base.ts"; +import type { InfoConfig } from "./_base/mod.ts"; + +/** + * Request outcome templates. + * + * @param config General configuration for Info API requests. + * @param signal {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal | AbortSignal} to cancel the request. + * @return Array of templates that outcome deployers instantiate. + * + * @throws {ValidationError} When the request parameters fail validation (before sending). + * @throws {TransportError} When the transport layer throws an error. + * + * @example + * ```ts + * import { HttpTransport } from "@nktkas/hyperliquid"; + * import { outcomeTemplates } from "@nktkas/hyperliquid/api/info"; + * + * const transport = new HttpTransport(); // or `WebSocketTransport` + * + * const data = await outcomeTemplates({ transport }); + * ``` + * + * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/hip-4-deployer-actions#read-api + */ +export function outcomeTemplates( + config: InfoConfig, + signal?: AbortSignal, +): Promise { + const request = parse(OutcomeTemplatesRequest, { + type: "outcomeTemplates", + }); + return config.transport.request("info", request, signal); +} diff --git a/src/api/info/client.ts b/src/api/info/client.ts index 0864ef30..eb282888 100644 --- a/src/api/info/client.ts +++ b/src/api/info/client.ts @@ -100,6 +100,7 @@ import { import { openOrders, type OpenOrdersParameters, type OpenOrdersResponse } from "./_methods/openOrders.ts"; import { orderStatus, type OrderStatusParameters, type OrderStatusResponse } from "./_methods/orderStatus.ts"; import { outcomeMeta, type OutcomeMetaResponse } from "./_methods/outcomeMeta.ts"; +import { outcomeTemplates, type OutcomeTemplatesResponse } from "./_methods/outcomeTemplates.ts"; import { perpAnnotation, type PerpAnnotationParameters, @@ -1211,6 +1212,33 @@ export class InfoClient { return outcomeMeta(this.config_, signal); } + /** + * Request outcome templates. + * + * @param signal {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal | AbortSignal} to cancel the request. + * @return Array of templates that outcome deployers instantiate. + * + * @throws {ValidationError} When the request parameters fail validation (before sending). + * @throws {TransportError} When the transport layer throws an error. + * + * @example + * ```ts + * import * as hl from "@nktkas/hyperliquid"; + * + * const transport = new hl.HttpTransport(); // or `WebSocketTransport` + * const client = new hl.InfoClient({ transport }); + * + * const data = await client.outcomeTemplates(); + * ``` + * + * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/hip-4-deployer-actions#read-api + */ + outcomeTemplates( + signal?: AbortSignal, + ): Promise { + return outcomeTemplates(this.config_, signal); + } + /** * Request perp annotation. * @@ -2470,6 +2498,7 @@ export type { MetaAndAssetCtxsParameters, MetaAndAssetCtxsResponse } from "./_me export type { OpenOrdersParameters, OpenOrdersResponse } from "./_methods/openOrders.ts"; export type { OrderStatusParameters, OrderStatusResponse } from "./_methods/orderStatus.ts"; export type { OutcomeMetaResponse } from "./_methods/outcomeMeta.ts"; +export type { OutcomeTemplatesResponse } from "./_methods/outcomeTemplates.ts"; export type { PerpAnnotationParameters, PerpAnnotationResponse } from "./_methods/perpAnnotation.ts"; export type { PerpCategoriesResponse } from "./_methods/perpCategories.ts"; export type { PerpConciseAnnotationsResponse } from "./_methods/perpConciseAnnotations.ts"; diff --git a/src/api/info/mod.ts b/src/api/info/mod.ts index 7cb3c581..e54cabbb 100644 --- a/src/api/info/mod.ts +++ b/src/api/info/mod.ts @@ -57,6 +57,7 @@ export * from "./_methods/metaAndAssetCtxs.ts"; export * from "./_methods/openOrders.ts"; export * from "./_methods/orderStatus.ts"; export * from "./_methods/outcomeMeta.ts"; +export * from "./_methods/outcomeTemplates.ts"; export * from "./_methods/perpAnnotation.ts"; export * from "./_methods/perpCategories.ts"; export * from "./_methods/perpConciseAnnotations.ts"; diff --git a/tests/api/info/outcomeTemplates.test.ts b/tests/api/info/outcomeTemplates.test.ts new file mode 100644 index 00000000..4452ed40 --- /dev/null +++ b/tests/api/info/outcomeTemplates.test.ts @@ -0,0 +1,17 @@ +import { schemaCoverage } from "../_utils/schemaCoverage.ts"; +import { typeToJsonSchema } from "../_utils/typeToJsonSchema.ts"; +import { runTest } from "./_t.ts"; + +const sourceFile = new URL("../../../src/api/info/_methods/outcomeTemplates.ts", import.meta.url).pathname; +const responseSchema = typeToJsonSchema(sourceFile, "OutcomeTemplatesResponse"); + +runTest({ + name: "outcomeTemplates", + codeTestFn: async (_t, client) => { + const data = await Promise.all([client.outcomeTemplates()]); + + schemaCoverage(responseSchema, data, [ + "#/items/properties/keywords/items/items/1/enum/1", + ]); + }, +});