diff --git a/src/api/exchange/_methods/twapOrder.ts b/src/api/exchange/_methods/twapOrder.ts index 695b9ed1..f2ba28f2 100644 --- a/src/api/exchange/_methods/twapOrder.ts +++ b/src/api/exchange/_methods/twapOrder.ts @@ -27,7 +27,7 @@ export const TwapOrderRequest = /* @__PURE__ */ (() => { /** Whether the order is reduce-only. */ r: v.boolean(), /** TWAP duration in minutes. */ - m: v.pipe(UnsignedInteger, v.minValue(5), v.maxValue(1440)), + m: v.pipe(UnsignedInteger, v.minValue(5), v.maxValue(10080)), // 5 minutes to 7 days /** Enable random order timing. */ t: v.boolean(), }), diff --git a/tests/api/exchange/twapOrder.test.ts b/tests/api/exchange/twapOrder.test.ts index d36831e1..39f1079b 100644 --- a/tests/api/exchange/twapOrder.test.ts +++ b/tests/api/exchange/twapOrder.test.ts @@ -1,3 +1,4 @@ +import { assertEquals } from "jsr:@std/assert@1"; import { type TwapOrderParameters, TwapOrderRequest } from "@nktkas/hyperliquid/api/exchange"; import { formatPrice, formatSize } from "@nktkas/hyperliquid/utils"; import * as v from "@valibot/valibot"; @@ -44,3 +45,14 @@ runTest({ schemaCoverage(responseSchema, data); }, }); + +Deno.test("twapOrder: duration bounds (5 minutes to 7 days)", () => { + const twapSchema = TwapOrderRequest.entries.action.entries.twap; + const twap = { a: 0, b: true, s: "1", r: false, t: false }; + for (const m of [5, 1440, 1441, 10080]) { + assertEquals(v.safeParse(twapSchema, { ...twap, m }).success, true, `m=${m} should be accepted`); + } + for (const m of [4, 10081]) { + assertEquals(v.safeParse(twapSchema, { ...twap, m }).success, false, `m=${m} should be rejected`); + } +});