@outcome.xyz/hip4 1.0.0-beta

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/precision/primitives/_decimal-impl.ts","../src/lib/precision/primitives/core.ts","../src/lib/precision/primitives/compare.ts","../src/lib/precision/primitives/clamp.ts","../src/lib/precision/io/format.ts","../src/adapter/hyperliquid/client.ts","../src/adapter/hyperliquid/account.ts","../src/adapter/hyperliquid/auth.ts","../src/adapter/hyperliquid/market-discovery.ts","../src/adapter/hyperliquid/market-classification.ts","../src/adapter/hyperliquid/events.ts","../src/adapter/hyperliquid/market-data.ts","../src/adapter/hyperliquid/pricing.ts","../src/adapter/hyperliquid/types.ts","../src/adapter/hyperliquid/signing.ts","../src/adapter/hyperliquid/trading.ts","../src/lib/precision/financial/price.ts","../src/adapter/hyperliquid/core-evm-system-address.ts","../src/adapter/hyperliquid/wallet.ts","../src/adapter/hyperliquid/index.ts","../src/adapter/factory.ts","../src/adapter/hyperliquid/agent-wallet.ts","../src/adapter/hyperliquid/core-to-evm-fees.ts","../src/adapter/hyperliquid/hype-spot-mark-px.ts","../src/streams/candle-utils.ts","../src/streams/perp-price-feed.ts","../src/streams/price-feed.ts","../src/utils/orderbook.ts"],"names":["neg","abs","names","min","PREDICTION_ASSET_OFFSET","market","outcome","amount","question","a","b","processTick"],"mappings":"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","file":"index.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// Self-contained arbitrary-precision decimal arithmetic.\n//\n// Backs the precision lib's Decimal class. Mirrors decimal.js behavior for\n// the subset of operations used by this SDK. No runtime dependencies.\n//\n// Internal representation:\n// value = (-1)^neg * mantissa * 10^exp\n//\n// mantissa: bigint, always >= 0n (zero only for the value 0)\n// exp: integer\n// neg: boolean (always false when mantissa is 0n)\n//\n// Normalization invariants:\n// - Zero is canonical: { neg: false, mantissa: 0n, exp: 0 }\n// - Non-zero mantissa has no trailing zero digits - trailing zeros are\n// hoisted into exp. So \"100\" is { mantissa: 1n, exp: 2 }, not 100/exp:0.\n//\n// Working precision: PRECISION (default 28). Division and any operation\n// whose exact result exceeds PRECISION significant digits is rounded\n// HALF_UP to PRECISION sig figs, matching decimal.js's default config.\n// + - * are exact when their exact result fits in PRECISION sig figs.\n// ---------------------------------------------------------------------------\n\nconst PRECISION = 28;\n// Match decimal.js defaults: values whose decimal exponent is <= TO_EXP_NEG\n// or >= TO_EXP_POS render in exponential notation.\nconst TO_EXP_NEG = -7;\nconst TO_EXP_POS = 21;\n\nexport type RoundingMode = 0 | 1 | 4;\nexport const ROUND_UP: RoundingMode = 0;\nexport const ROUND_DOWN: RoundingMode = 1;\nexport const ROUND_HALF_UP: RoundingMode = 4;\n\n// ---------------------------------------------------------------------------\n// pow10 cache - 10n ** BigInt(n) is hot\n// ---------------------------------------------------------------------------\n\nconst POW10_CACHE: bigint[] = [1n];\nfunction pow10(n: number): bigint {\n if (n < 0) throw new Error(`pow10: negative n (${n})`);\n if (n < POW10_CACHE.length) return POW10_CACHE[n]!;\n let last = POW10_CACHE[POW10_CACHE.length - 1]!;\n for (let i = POW10_CACHE.length; i <= n; i++) {\n last = last * 10n;\n POW10_CACHE.push(last);\n }\n return POW10_CACHE[n]!;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction digitCount(n: bigint): number {\n // n must be non-negative\n if (n === 0n) return 0;\n // toString allocates but is by far the simplest correct approach for\n // arbitrary-magnitude bigints. Faster alternatives (binary log + correction)\n // exist but aren't needed here.\n return n.toString().length;\n}\n\nfunction trimTrailingZeros(m: bigint, e: number): { m: bigint; e: number } {\n if (m === 0n) return { m: 0n, e: 0 };\n let mantissa = m;\n let exp = e;\n // Strip trailing zeros via repeated /10n. Bounded by digit count.\n while (mantissa % 10n === 0n) {\n mantissa /= 10n;\n exp += 1;\n }\n return { m: mantissa, e: exp };\n}\n\n// Parse \"[+-]? (digits[.digits]? | .digits) ([eE][+-]?digits)?\"\nfunction parseString(input: string): {\n neg: boolean;\n mantissa: bigint;\n exp: number;\n} {\n const s = input.trim();\n if (s === \"\") throw new Error(\"Invalid decimal: empty string\");\n const m = s.match(\n /^([+-]?)(?:(\\d+)(?:\\.(\\d*))?|\\.(\\d+))(?:[eE]([+-]?\\d+))?$/,\n );\n if (!m) throw new Error(`Invalid decimal: \"${input}\"`);\n const sign = m[1];\n const intPart = m[2] ?? \"\";\n const fracPart = m[3] ?? m[4] ?? \"\";\n const expPart = m[5] ?? \"0\";\n\n let digits = intPart + fracPart;\n // Strip leading zeros\n digits = digits.replace(/^0+/, \"\");\n let exp = parseInt(expPart, 10) - fracPart.length;\n\n if (digits === \"\") {\n // Preserve the sign for \"-0\" / \"-0.0\" inputs to match decimal.js, which\n // distinguishes -0 from +0 for predicates like isNegative(). Arithmetic\n // results that hit zero still canonicalize to +0 - only the constructor\n // path retains an explicit negative-zero.\n return { neg: sign === \"-\", mantissa: 0n, exp: 0 };\n }\n\n const mantissa0 = BigInt(digits);\n const trimmed = trimTrailingZeros(mantissa0, exp);\n return {\n neg: sign === \"-\",\n mantissa: trimmed.m,\n exp: trimmed.e,\n };\n}\n\nfunction fromParts(neg: boolean, mantissa: bigint, exp: number): Decimal {\n const t = trimTrailingZeros(mantissa, exp);\n // canonicalize zero\n const sign = t.m === 0n ? false : neg;\n // We bypass the public string constructor for performance & to avoid\n // re-parsing. Construct via the internal sentinel.\n return new Decimal(_INTERNAL, sign, t.m, t.e);\n}\n\nconst _INTERNAL = Symbol(\"DecimalInternal\");\n\n// ---------------------------------------------------------------------------\n// Compare absolute magnitudes\n// ---------------------------------------------------------------------------\n\n// Returns -1 / 0 / 1 for |a| vs |b|. Both must be non-zero or this still works.\nfunction cmpAbs(a: Decimal, b: Decimal): -1 | 0 | 1 {\n if (a.mantissa === 0n && b.mantissa === 0n) return 0;\n if (a.mantissa === 0n) return -1;\n if (b.mantissa === 0n) return 1;\n // Compare by decimal exponent of value: floor(log10(|x|)) = digits(m) - 1 + exp\n const ea = digitCount(a.mantissa) - 1 + a.exp;\n const eb = digitCount(b.mantissa) - 1 + b.exp;\n if (ea !== eb) return ea < eb ? -1 : 1;\n // Same magnitude - align exps and compare mantissas\n if (a.exp === b.exp) {\n return a.mantissa === b.mantissa ? 0 : a.mantissa < b.mantissa ? -1 : 1;\n }\n if (a.exp > b.exp) {\n const aScaled = a.mantissa * pow10(a.exp - b.exp);\n return aScaled === b.mantissa ? 0 : aScaled < b.mantissa ? -1 : 1;\n }\n const bScaled = b.mantissa * pow10(b.exp - a.exp);\n return a.mantissa === bScaled ? 0 : a.mantissa < bScaled ? -1 : 1;\n}\n\n// ---------------------------------------------------------------------------\n// Round a (mantissa, exp) value to `sigFigs` significant digits HALF_UP.\n// Used for division and to enforce PRECISION on operations whose exact\n// result would exceed it. Sign is handled outside.\n// ---------------------------------------------------------------------------\n\nfunction roundToSigFigs(\n mantissa: bigint,\n exp: number,\n sigFigs: number,\n hasMoreNonZeroBeyond: boolean = false,\n): { m: bigint; e: number } {\n if (mantissa === 0n) return { m: 0n, e: 0 };\n const d = digitCount(mantissa);\n if (d <= sigFigs) return trimTrailingZeros(mantissa, exp);\n const trim = d - sigFigs;\n const divisor = pow10(trim);\n const trunc = mantissa / divisor;\n const rem = mantissa % divisor;\n const half = pow10(trim - 1) * 5n;\n let rounded: bigint;\n if (rem > half || (rem === half && hasMoreNonZeroBeyond)) {\n rounded = trunc + 1n;\n } else if (rem < half) {\n rounded = trunc;\n } else {\n // exact half - HALF_UP rounds away from zero (we hold absolute value here)\n rounded = trunc + 1n;\n }\n // After rounding, mantissa may overflow into one more digit (e.g. 999...→1000).\n // trimTrailingZeros handles trailing zeros from this overflow correctly.\n return trimTrailingZeros(rounded, exp + trim);\n}\n\n// ---------------------------------------------------------------------------\n// Decimal class\n// ---------------------------------------------------------------------------\n\nexport type DecimalLike = string | number | Decimal;\n\nexport class Decimal {\n static readonly ROUND_UP = ROUND_UP;\n static readonly ROUND_DOWN = ROUND_DOWN;\n static readonly ROUND_HALF_UP = ROUND_HALF_UP;\n\n readonly neg: boolean;\n readonly mantissa: bigint;\n readonly exp: number;\n\n constructor(input: DecimalLike);\n constructor(\n token: typeof _INTERNAL,\n neg: boolean,\n mantissa: bigint,\n exp: number,\n );\n constructor(\n a: DecimalLike | typeof _INTERNAL,\n b?: boolean,\n c?: bigint,\n d?: number,\n ) {\n if (a === _INTERNAL) {\n this.neg = b!;\n this.mantissa = c!;\n this.exp = d!;\n return;\n }\n if (a instanceof Decimal) {\n this.neg = a.neg;\n this.mantissa = a.mantissa;\n this.exp = a.exp;\n return;\n }\n let s: string;\n if (typeof a === \"number\") {\n if (!Number.isFinite(a)) throw new Error(`Invalid number: ${a}`);\n // String(n) handles scientific notation produced by the JS runtime.\n s = String(a);\n } else if (typeof a === \"string\") {\n s = a;\n } else {\n throw new Error(`Unsupported input type: ${typeof a}`);\n }\n const parsed = parseString(s);\n // Construction is exact - decimal.js does not round inputs at construction\n // time, only on operations. We match that behavior so that constructor\n // round-trips through `toString` preserve all significant digits.\n this.neg = parsed.neg;\n this.mantissa = parsed.mantissa;\n this.exp = parsed.exp;\n }\n\n // -- predicates -----------------------------------------------------------\n\n isZero(): boolean {\n return this.mantissa === 0n;\n }\n isNegative(): boolean {\n return this.neg;\n }\n isNeg(): boolean {\n return this.neg;\n }\n isPositive(): boolean {\n // Match decimal.js: returns true for zero too. Code that wants\n // \"strictly positive\" must combine with `!isZero()`.\n return !this.neg;\n }\n isPos(): boolean {\n return this.isPositive();\n }\n isInteger(): boolean {\n if (this.mantissa === 0n) return true;\n return this.exp >= 0;\n }\n\n // -- comparisons ----------------------------------------------------------\n\n comparedTo(other: DecimalLike): -1 | 0 | 1 {\n const b = toDec(other);\n if (this.mantissa === 0n && b.mantissa === 0n) return 0;\n if (this.neg && !b.neg) return -1;\n if (!this.neg && b.neg) return 1;\n // same sign (or one of them is zero with neg=false)\n if (this.mantissa === 0n) return b.neg ? 1 : -1;\n if (b.mantissa === 0n) return this.neg ? -1 : 1;\n const c = cmpAbs(this, b);\n return this.neg ? (-c as -1 | 0 | 1) : c;\n }\n cmp(other: DecimalLike): -1 | 0 | 1 {\n return this.comparedTo(other);\n }\n equals(other: DecimalLike): boolean {\n return this.comparedTo(other) === 0;\n }\n eq(other: DecimalLike): boolean {\n return this.equals(other);\n }\n greaterThan(other: DecimalLike): boolean {\n return this.comparedTo(other) > 0;\n }\n gt(other: DecimalLike): boolean {\n return this.greaterThan(other);\n }\n greaterThanOrEqualTo(other: DecimalLike): boolean {\n return this.comparedTo(other) >= 0;\n }\n gte(other: DecimalLike): boolean {\n return this.greaterThanOrEqualTo(other);\n }\n lessThan(other: DecimalLike): boolean {\n return this.comparedTo(other) < 0;\n }\n lt(other: DecimalLike): boolean {\n return this.lessThan(other);\n }\n lessThanOrEqualTo(other: DecimalLike): boolean {\n return this.comparedTo(other) <= 0;\n }\n lte(other: DecimalLike): boolean {\n return this.lessThanOrEqualTo(other);\n }\n\n // -- unary ----------------------------------------------------------------\n\n abs(): Decimal {\n if (!this.neg) return this;\n return fromParts(false, this.mantissa, this.exp);\n }\n negated(): Decimal {\n if (this.mantissa === 0n) return this;\n return fromParts(!this.neg, this.mantissa, this.exp);\n }\n neg_(): Decimal {\n return this.negated();\n }\n\n // -- arithmetic -----------------------------------------------------------\n\n plus(other: DecimalLike): Decimal {\n const b = toDec(other);\n\n // Even when one operand is zero, decimal.js applies precision rounding\n // to the result. So `Decimal(\"1.234...long\").plus(0)` returns the value\n // rounded to PRECISION sig figs, not the original.\n if (this.mantissa === 0n) {\n const r = roundToSigFigs(b.mantissa, b.exp, PRECISION);\n return fromParts(r.m === 0n ? false : b.neg, r.m, r.e);\n }\n if (b.mantissa === 0n) {\n const r = roundToSigFigs(this.mantissa, this.exp, PRECISION);\n return fromParts(r.m === 0n ? false : this.neg, r.m, r.e);\n }\n\n // Align exps so we can add mantissas as bigints.\n const minExp = Math.min(this.exp, b.exp);\n const aM = this.mantissa * pow10(this.exp - minExp);\n const bM = b.mantissa * pow10(b.exp - minExp);\n\n let resNeg: boolean;\n let resM: bigint;\n if (this.neg === b.neg) {\n resNeg = this.neg;\n resM = aM + bM;\n } else if (aM === bM) {\n return ZERO;\n } else if (aM > bM) {\n resNeg = this.neg;\n resM = aM - bM;\n } else {\n resNeg = b.neg;\n resM = bM - aM;\n }\n\n const rounded = roundToSigFigs(resM, minExp, PRECISION);\n return fromParts(resNeg, rounded.m, rounded.e);\n }\n\n minus(other: DecimalLike): Decimal {\n const b = toDec(other);\n return this.plus(fromParts(!b.neg, b.mantissa, b.exp));\n }\n\n times(other: DecimalLike): Decimal {\n const b = toDec(other);\n if (this.mantissa === 0n || b.mantissa === 0n) return ZERO;\n const m = this.mantissa * b.mantissa;\n const e = this.exp + b.exp;\n const sign = this.neg !== b.neg;\n const rounded = roundToSigFigs(m, e, PRECISION);\n return fromParts(sign, rounded.m, rounded.e);\n }\n\n dividedBy(other: DecimalLike): Decimal {\n const b = toDec(other);\n if (b.mantissa === 0n) throw new Error(\"Division by zero\");\n if (this.mantissa === 0n) return ZERO;\n const sign = this.neg !== b.neg;\n\n // Strategy: compute scaledNum / b.mantissa with enough digits that\n // the quotient has at least PRECISION+1 significant digits, then round\n // to PRECISION HALF_UP. Use the remainder for tie-breaking.\n const aDigits = digitCount(this.mantissa);\n const bDigits = digitCount(b.mantissa);\n // Quotient's leading-digit position before any scaling: roughly\n // aDigits - bDigits + (a.m >= b.m ? 1 : 0). We want PRECISION+2 digits,\n // so scale numerator up by enough.\n const wantDigits = PRECISION + 2;\n const haveDigits =\n aDigits - bDigits + (this.mantissa >= b.mantissa ? 1 : 0);\n const shift = Math.max(0, wantDigits - haveDigits);\n\n const scaledNum = this.mantissa * pow10(shift);\n const q = scaledNum / b.mantissa;\n const rem = scaledNum % b.mantissa;\n const newExp = this.exp - b.exp - shift;\n\n const rounded = roundToSigFigs(q, newExp, PRECISION, rem !== 0n);\n return fromParts(sign, rounded.m, rounded.e);\n }\n div(other: DecimalLike): Decimal {\n return this.dividedBy(other);\n }\n\n // Integer-exponent power. Throws on non-integer exponent.\n pow(exponent: DecimalLike): Decimal {\n const e = toDec(exponent);\n if (!e.isInteger()) {\n throw new Error(\"pow: only integer exponents are supported\");\n }\n // Convert exponent to a JS number; mantissa fits if |exp value| < 2^53,\n // which is comfortably more than any real-world need.\n let n: number;\n if (e.mantissa === 0n) {\n return ONE;\n }\n if (e.exp === 0) {\n if (e.mantissa > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"pow: exponent too large\");\n }\n n = Number(e.mantissa) * (e.neg ? -1 : 1);\n } else {\n // exp >= 0 and mantissa has trailing zeros stripped - combine\n const full = e.mantissa * pow10(e.exp);\n if (full > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"pow: exponent too large\");\n }\n n = Number(full) * (e.neg ? -1 : 1);\n }\n if (n === 0) return ONE;\n if (this.mantissa === 0n) {\n if (n < 0)\n throw new Error(\"pow: 0 cannot be raised to a negative exponent\");\n return ZERO;\n }\n\n const negResult = this.neg && n % 2 !== 0;\n const absExp = Math.abs(n);\n // Square-and-multiply on the absolute mantissa\n let baseM = this.mantissa;\n let baseE = this.exp;\n let resM = 1n;\n let resE = 0;\n let k = absExp;\n while (k > 0) {\n if (k & 1) {\n resM = resM * baseM;\n resE = resE + baseE;\n const r = roundToSigFigs(resM, resE, PRECISION);\n resM = r.m;\n resE = r.e;\n }\n k >>>= 1;\n if (k > 0) {\n baseM = baseM * baseM;\n baseE = baseE + baseE;\n const r = roundToSigFigs(baseM, baseE, PRECISION);\n baseM = r.m;\n baseE = r.e;\n }\n }\n if (n < 0) {\n // Reciprocal: 1 / result\n return fromParts(negResult, 1n, 0).dividedBy(\n fromParts(false, resM, resE),\n );\n }\n return fromParts(negResult, resM, resE);\n }\n\n // -- rounding to integer using global mode (HALF_UP) ----------------------\n\n round(): Decimal {\n return roundDp(this, 0, ROUND_HALF_UP);\n }\n floor(): Decimal {\n return roundDp(this, 0, ROUND_FLOOR_INTERNAL);\n }\n ceil(): Decimal {\n return roundDp(this, 0, ROUND_CEIL_INTERNAL);\n }\n\n // -- toFixed --------------------------------------------------------------\n\n toFixed(dp?: number, mode: RoundingMode = ROUND_HALF_UP): string {\n if (dp === undefined) {\n // Match decimal.js: toFixed() with no arg returns the canonical string\n // (no fixed dp, no exponential).\n return this.toFixedFlat();\n }\n if (!Number.isInteger(dp) || dp < 0) {\n throw new RangeError(\n `toFixed: dp must be a non-negative integer (got ${dp})`,\n );\n }\n if (this.mantissa === 0n) {\n return dp === 0 ? \"0\" : \"0.\" + \"0\".repeat(dp);\n }\n\n // Round absolute mantissa at 10^-dp granularity. Sign stays separate\n // so we can preserve \"-0\" output (matches decimal.js for both DOWN\n // truncation and HALF_UP rounding of tiny negatives).\n const targetExp = -dp;\n let m: bigint;\n if (this.exp >= targetExp) {\n m = this.mantissa * pow10(this.exp - targetExp);\n } else {\n const trim = targetExp - this.exp;\n const divisor = pow10(trim);\n const trunc = this.mantissa / divisor;\n const rem = this.mantissa % divisor;\n const half = pow10(trim - 1) * 5n;\n switch (mode) {\n case ROUND_DOWN:\n m = trunc;\n break;\n case ROUND_UP:\n m = rem === 0n ? trunc : trunc + 1n;\n break;\n case ROUND_HALF_UP:\n if (rem > half) m = trunc + 1n;\n else if (rem < half) m = trunc;\n else m = trunc + 1n; // tie → away from zero\n break;\n default:\n throw new Error(`toFixed: unsupported rounding mode (${mode})`);\n }\n }\n\n const sign = this.neg ? \"-\" : \"\";\n const s = m.toString();\n if (dp === 0) return sign + s;\n if (s.length <= dp) {\n return sign + \"0.\" + \"0\".repeat(dp - s.length) + s;\n }\n return sign + s.slice(0, s.length - dp) + \".\" + s.slice(s.length - dp);\n }\n\n // toString without exponential notation, full precision (matches decimal.js\n // toFixed() with no args for the values produced in this codebase).\n private toFixedFlat(): string {\n if (this.mantissa === 0n) return \"0\";\n return formatPlain(this);\n }\n\n // -- toString -------------------------------------------------------------\n\n toString(): string {\n if (this.mantissa === 0n) return \"0\";\n // Decimal exponent of the value: floor(log10(|value|))\n const valExp = digitCount(this.mantissa) - 1 + this.exp;\n if (valExp <= TO_EXP_NEG || valExp >= TO_EXP_POS) {\n return formatExponential(this, valExp);\n }\n return formatPlain(this);\n }\n valueOf(): string {\n return this.toString();\n }\n\n // -- toNumber -------------------------------------------------------------\n\n toNumber(): number {\n if (this.mantissa === 0n) return 0;\n // Use parseFloat on toString - handles huge & tiny via exponential.\n return parseFloat(this.toString());\n }\n\n // -- floor of log10(|this|) - used internally; not on decimal.js's API ----\n //\n // Returns floor(log10(|value|)) as a Decimal integer. Throws on zero.\n // Equivalent to (digitCount(mantissa) - 1 + exp).\n floorLog10(): Decimal {\n if (this.mantissa === 0n) {\n throw new RangeError(\"floorLog10: log of zero is undefined\");\n }\n const v = digitCount(this.mantissa) - 1 + this.exp;\n return fromInt(v);\n }\n\n // -- significant digits ---------------------------------------------------\n\n toSignificantDigits(sigFigs: number): Decimal {\n if (!Number.isInteger(sigFigs) || sigFigs < 1) {\n throw new RangeError(\n `toSignificantDigits: sigFigs must be >= 1 (got ${sigFigs})`,\n );\n }\n if (this.mantissa === 0n) return this;\n const r = roundToSigFigs(this.mantissa, this.exp, sigFigs);\n return fromParts(this.neg, r.m, r.e);\n }\n\n // -- statics --------------------------------------------------------------\n\n static min(...values: DecimalLike[]): Decimal {\n if (values.length === 0)\n throw new Error(\"min: at least one argument required\");\n let best = toDec(values[0]!);\n for (let i = 1; i < values.length; i++) {\n const v = toDec(values[i]!);\n if (v.lt(best)) best = v;\n }\n return best;\n }\n static max(...values: DecimalLike[]): Decimal {\n if (values.length === 0)\n throw new Error(\"max: at least one argument required\");\n let best = toDec(values[0]!);\n for (let i = 1; i < values.length; i++) {\n const v = toDec(values[i]!);\n if (v.gt(best)) best = v;\n }\n return best;\n }\n static sum(...values: DecimalLike[]): Decimal {\n let acc = ZERO;\n for (const v of values) acc = acc.plus(toDec(v));\n return acc;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal rounding helpers\n// ---------------------------------------------------------------------------\n\nconst ROUND_FLOOR_INTERNAL = 100 as const;\nconst ROUND_CEIL_INTERNAL = 101 as const;\n\ntype InternalMode =\n | RoundingMode\n | typeof ROUND_FLOOR_INTERNAL\n | typeof ROUND_CEIL_INTERNAL;\n\n// Round a Decimal to `dp` decimal places. Returns a new Decimal whose exp\n// is normalized (trailing zeros stripped), so the value is the rounded\n// magnitude - but `formatFixed` re-pads to dp for display.\nfunction roundDp(d: Decimal, dp: number, mode: InternalMode): Decimal {\n if (d.mantissa === 0n) return ZERO;\n const targetExp = -dp;\n if (d.exp >= targetExp) {\n // No rounding needed; value already lands on a multiple of 10^-dp.\n return d;\n }\n // exp < targetExp: trim (targetExp - exp) lowest digits.\n const trim = targetExp - d.exp;\n const divisor = pow10(trim);\n const trunc = d.mantissa / divisor;\n const rem = d.mantissa % divisor;\n const half = pow10(trim - 1) * 5n;\n\n let rounded: bigint;\n switch (mode) {\n case ROUND_DOWN:\n // Toward zero - abs truncates regardless of sign.\n rounded = trunc;\n break;\n case ROUND_UP:\n // Away from zero.\n rounded = rem === 0n ? trunc : trunc + 1n;\n break;\n case ROUND_HALF_UP:\n if (rem > half) rounded = trunc + 1n;\n else if (rem < half) rounded = trunc;\n else rounded = trunc + 1n; // tie → away from zero\n break;\n case ROUND_FLOOR_INTERNAL:\n // Toward -Infinity.\n if (d.neg) rounded = rem === 0n ? trunc : trunc + 1n;\n else rounded = trunc;\n break;\n case ROUND_CEIL_INTERNAL:\n // Toward +Infinity.\n if (d.neg) rounded = trunc;\n else rounded = rem === 0n ? trunc : trunc + 1n;\n break;\n default:\n throw new Error(`Unsupported rounding mode: ${mode}`);\n }\n\n if (rounded === 0n) return ZERO;\n return fromParts(d.neg, rounded, targetExp);\n}\n\n// ---------------------------------------------------------------------------\n// String formatting\n// ---------------------------------------------------------------------------\n\n// Plain decimal notation, no exponent. Includes leading \"-\".\nfunction formatPlain(d: Decimal): string {\n if (d.mantissa === 0n) return \"0\";\n const digits = d.mantissa.toString();\n const sign = d.neg ? \"-\" : \"\";\n if (d.exp >= 0) {\n // Integer with possible trailing zeros\n return sign + digits + \"0\".repeat(d.exp);\n }\n const fracLen = -d.exp;\n if (fracLen >= digits.length) {\n return sign + \"0.\" + \"0\".repeat(fracLen - digits.length) + digits;\n }\n const intPart = digits.slice(0, digits.length - fracLen);\n const fracPart = digits.slice(digits.length - fracLen);\n return sign + intPart + \".\" + fracPart;\n}\n\n// \"1.5e+25\" style. valExp = floor(log10(|value|)).\nfunction formatExponential(d: Decimal, valExp: number): string {\n const digits = d.mantissa.toString();\n const sign = d.neg ? \"-\" : \"\";\n const head = digits[0]!;\n const tail = digits.slice(1);\n const mant = tail.length === 0 ? head : `${head}.${tail}`;\n const expPart = valExp >= 0 ? `e+${valExp}` : `e${valExp}`;\n return sign + mant + expPart;\n}\n\n// \"x.yyyy\" with exactly `dp` decimals. d's value must be exactly representable\n// at 10^-dp granularity (i.e., this is called only after roundDp).\nfunction formatFixed(d: Decimal, dp: number): string {\n if (d.mantissa === 0n) {\n return dp === 0 ? \"0\" : \"0.\" + \"0\".repeat(dp);\n }\n const sign = d.neg ? \"-\" : \"\";\n // Convert d to the form mantissa' * 10^-dp by scaling mantissa up.\n let m: bigint;\n if (d.exp >= -dp) {\n m = d.mantissa * pow10(d.exp + dp);\n } else {\n // shouldn't happen post-roundDp, but guard anyway by truncating\n m = d.mantissa / pow10(-dp - d.exp);\n }\n const s = m.toString();\n if (dp === 0) return sign + s;\n if (s.length <= dp) {\n return sign + \"0.\" + \"0\".repeat(dp - s.length) + s;\n }\n const intPart = s.slice(0, s.length - dp);\n const fracPart = s.slice(s.length - dp);\n return sign + intPart + \".\" + fracPart;\n}\n\n// ---------------------------------------------------------------------------\n// Coercion + constants\n// ---------------------------------------------------------------------------\n\nfunction toDec(x: DecimalLike): Decimal {\n return x instanceof Decimal ? x : new Decimal(x);\n}\n\nfunction fromInt(n: number): Decimal {\n if (!Number.isInteger(n)) throw new Error(\"fromInt: not an integer\");\n if (n === 0) return ZERO;\n const neg = n < 0;\n const abs = Math.abs(n);\n return fromParts(neg, BigInt(abs), 0);\n}\n\nconst ZERO = new Decimal(_INTERNAL, false, 0n, 0);\nconst ONE = new Decimal(_INTERNAL, false, 1n, 0);\n","// ---------------------------------------------------------------------------\n// Decimal arithmetic core. Re-exports the inline `Decimal` class from\n// `_decimal-impl.ts` and provides the lib's functional helpers.\n//\n// Intentionally zero runtime dependencies - see _decimal-impl.ts for the\n// implementation and tests/unit/decimal-parity.test.ts for parity coverage\n// against decimal.js.\n// ---------------------------------------------------------------------------\n\nimport { Decimal } from \"./_decimal-impl\";\nimport type { DecimalInput } from \"./types\";\n\nfunction toDecimal(value: DecimalInput): Decimal {\n if (value instanceof Decimal) return value;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(`Invalid numeric input: ${value}`);\n }\n return new Decimal(value);\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed === \"\") {\n throw new Error(\"Empty string is not a valid decimal input\");\n }\n return new Decimal(trimmed);\n }\n throw new Error(`Unsupported input type: ${typeof value}`);\n}\n\nfunction toNum(value: DecimalInput): number {\n return toDecimal(value).toNumber();\n}\n\nfunction add(a: DecimalInput, b: DecimalInput): string {\n return toDecimal(a).plus(toDecimal(b)).toString();\n}\n\nfunction sub(a: DecimalInput, b: DecimalInput): string {\n return toDecimal(a).minus(toDecimal(b)).toString();\n}\n\nfunction mul(a: DecimalInput, b: DecimalInput): string {\n return toDecimal(a).times(toDecimal(b)).toString();\n}\n\nfunction div(a: DecimalInput, b: DecimalInput, dp?: number): string {\n const divisor = toDecimal(b);\n if (divisor.isZero()) throw new Error(\"Division by zero\");\n const result = toDecimal(a).dividedBy(divisor);\n return dp !== undefined ? result.toFixed(dp) : result.toString();\n}\n\nfunction abs(value: DecimalInput): string {\n return toDecimal(value).abs().toString();\n}\n\nfunction neg(value: DecimalInput): string {\n return toDecimal(value).negated().toString();\n}\n\nfunction pow(base: DecimalInput, exp: DecimalInput): string {\n return toDecimal(base).pow(toDecimal(exp)).toString();\n}\n\nexport { abs, add, Decimal, div, mul, neg, pow, sub, toDecimal, toNum };\n","import { Decimal, toDecimal } from \"./core\";\nimport type { DecimalInput } from \"./types\";\n\nfunction compare(a: DecimalInput, b: DecimalInput): -1 | 0 | 1 {\n const r = toDecimal(a).comparedTo(toDecimal(b));\n if (r < 0) return -1;\n if (r > 0) return 1;\n return 0;\n}\n\nfunction eq(a: DecimalInput, b: DecimalInput): boolean {\n return toDecimal(a).equals(toDecimal(b));\n}\n\nfunction gt(a: DecimalInput, b: DecimalInput): boolean {\n return toDecimal(a).greaterThan(toDecimal(b));\n}\n\nfunction gte(a: DecimalInput, b: DecimalInput): boolean {\n return toDecimal(a).greaterThanOrEqualTo(toDecimal(b));\n}\n\nfunction lt(a: DecimalInput, b: DecimalInput): boolean {\n return toDecimal(a).lessThan(toDecimal(b));\n}\n\nfunction lte(a: DecimalInput, b: DecimalInput): boolean {\n return toDecimal(a).lessThanOrEqualTo(toDecimal(b));\n}\n\nfunction isZero(value: DecimalInput): boolean {\n return toDecimal(value).isZero();\n}\n\nfunction isNeg(value: DecimalInput): boolean {\n return toDecimal(value).isNegative();\n}\n\nfunction isPos(value: DecimalInput): boolean {\n const d = toDecimal(value);\n return d.isPositive() && !d.isZero();\n}\n\nfunction min(...values: DecimalInput[]): string {\n if (values.length === 0) throw new Error(\"min requires at least one argument\");\n return Decimal.min(...values.map(toDecimal)).toString();\n}\n\nfunction max(...values: DecimalInput[]): string {\n if (values.length === 0) throw new Error(\"max requires at least one argument\");\n return Decimal.max(...values.map(toDecimal)).toString();\n}\n\nexport { compare, eq, gt, gte, lt, lte, isZero, isNeg, isPos, min, max };\n","import { Decimal, toDecimal } from \"./core\";\nimport type { DecimalInput } from \"./types\";\n\nfunction clamp(\n value: DecimalInput,\n lo: DecimalInput,\n hi: DecimalInput,\n): string {\n const dLo = toDecimal(lo);\n const dHi = toDecimal(hi);\n if (dLo.gt(dHi))\n throw new RangeError(`clamp: lo (${dLo}) must be <= hi (${dHi})`);\n return Decimal.max(dLo, Decimal.min(dHi, toDecimal(value))).toString();\n}\n\nfunction roundToStep(value: DecimalInput, step: DecimalInput): string {\n const s = toDecimal(step);\n if (s.isZero()) return toDecimal(value).toString();\n return toDecimal(value).dividedBy(s).round().times(s).toString();\n}\n\nfunction floorToStep(value: DecimalInput, step: DecimalInput): string {\n const s = toDecimal(step);\n if (s.isZero()) return toDecimal(value).toString();\n return toDecimal(value).dividedBy(s).floor().times(s).toString();\n}\n\nfunction ceilToStep(value: DecimalInput, step: DecimalInput): string {\n const s = toDecimal(step);\n if (s.isZero()) return toDecimal(value).toString();\n return toDecimal(value).dividedBy(s).ceil().times(s).toString();\n}\n\nfunction floor(value: DecimalInput, dp: number): string {\n if (!Number.isInteger(dp) || dp < 0) {\n throw new RangeError(`floor: dp must be a non-negative integer, got ${dp}`);\n }\n return toDecimal(value).toFixed(dp, Decimal.ROUND_DOWN);\n}\n\nexport { clamp, roundToStep, floorToStep, ceilToStep, floor };\n","import { Decimal, toDecimal } from \"../primitives/core\";\nimport type { DecimalInput, FormatUsdOpts, FormatBalanceOpts } from \"../primitives/types\";\n\nconst ONE_K = new Decimal(1_000);\nconst ONE_M = new Decimal(1_000_000);\nconst ONE_B = new Decimal(1_000_000_000);\n\nfunction addCommas(int: string): string {\n return int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\nfunction withCommas(raw: string): string {\n const neg = raw.startsWith(\"-\");\n const abs = neg ? raw.slice(1) : raw;\n const [int, dec] = abs.split(\".\");\n const formatted = addCommas(int!) + (dec !== undefined ? `.${dec}` : \"\");\n return neg ? `-${formatted}` : formatted;\n}\n\nfunction fixed(value: DecimalInput, dp: number): string {\n return toDecimal(value).toFixed(dp);\n}\n\nfunction formatUsd(value: DecimalInput, opts?: FormatUsdOpts): string {\n const d = toDecimal(value);\n const dp = opts?.dp ?? 2;\n const compact = opts?.compact ?? false;\n const truncate = opts?.truncate ?? false;\n const sign = opts?.sign ?? false;\n const rounding = truncate ? Decimal.ROUND_DOWN : Decimal.ROUND_HALF_UP;\n\n const a = d.abs();\n let formatted: string;\n\n if (compact && a.gte(ONE_B)) {\n formatted = a.dividedBy(ONE_B).toFixed(dp, rounding) + \"B\";\n } else if (compact && a.gte(ONE_M)) {\n formatted = a.dividedBy(ONE_M).toFixed(dp, rounding) + \"M\";\n } else if (compact && a.gte(ONE_K)) {\n formatted = a.dividedBy(ONE_K).toFixed(dp, rounding) + \"K\";\n } else {\n const raw = a.toFixed(dp, rounding);\n formatted = withCommas(raw);\n }\n\n const prefix = d.isNeg()\n ? \"-$\"\n : sign && d.isPos() && !d.isZero()\n ? \"+$\"\n : \"$\";\n\n return prefix + formatted;\n}\n\nfunction formatCents(cents: DecimalInput): string {\n return toDecimal(cents).round().toString() + \"\\u00A2\";\n}\n\nfunction formatPct(value: DecimalInput, dp = 2): string {\n const d = toDecimal(value);\n const raw = d.toFixed(dp);\n const prefix = d.isPos() && !d.isZero() ? \"+\" : \"\";\n return prefix + raw + \"%\";\n}\n\nfunction formatCompact(value: DecimalInput, dp = 1): string {\n const d = toDecimal(value);\n const a = d.abs();\n const neg = d.isNeg();\n\n let body: string;\n if (a.gte(ONE_B)) {\n body = a.dividedBy(ONE_B).toFixed(dp) + \"B\";\n } else if (a.gte(ONE_M)) {\n body = a.dividedBy(ONE_M).toFixed(dp) + \"M\";\n } else if (a.gte(ONE_K)) {\n body = a.dividedBy(ONE_K).toFixed(dp) + \"K\";\n } else {\n body = a.toFixed(dp);\n }\n\n return neg ? `-${body}` : body;\n}\n\nfunction formatNumber(value: DecimalInput, dp?: number): string {\n const d = toDecimal(value);\n const raw = dp !== undefined ? d.toFixed(dp) : d.toString();\n return withCommas(raw);\n}\n\nfunction formatBalance(value: DecimalInput, opts?: FormatBalanceOpts): string {\n const d = toDecimal(value);\n const maxDp = opts?.maxDp ?? 6;\n const minDp = opts?.minDp ?? 2;\n const compact = opts?.compact ?? true;\n const a = d.abs();\n\n if (compact && a.gte(ONE_M)) {\n return formatCompact(d);\n }\n\n let dp: number;\n if (a.gte(ONE_K)) {\n dp = minDp;\n } else if (a.gte(1)) {\n dp = Math.max(minDp, Math.min(4, maxDp));\n } else if (a.gt(0)) {\n dp = maxDp;\n } else {\n return minDp === 0 ? \"0\" : \"0.\" + \"0\".repeat(minDp);\n }\n\n const raw = d.toFixed(dp);\n\n const [int, dec] = raw.split(\".\");\n if (dec === undefined) return withCommas(raw);\n\n const minKeep = dec.slice(0, minDp);\n const rest = dec.slice(minDp).replace(/0+$/, \"\");\n const trimmed = minKeep + rest;\n\n if (trimmed === \"\") return withCommas(int!);\n const result = int + \".\" + trimmed;\n return withCommas(result);\n}\n\nfunction formatSigFig(value: DecimalInput, sigFigs = 5): string {\n const d = toDecimal(value);\n if (d.isZero()) return \"0\";\n\n const a = d.abs();\n const rounded = a.toSignificantDigits(sigFigs);\n const magnitude = rounded.floorLog10().toNumber();\n const dp = Math.max(0, sigFigs - 1 - magnitude);\n const raw = rounded.toFixed(dp);\n\n const result = d.isNeg() ? `-${withCommas(raw)}` : withCommas(raw);\n return result;\n}\n\nconst displayUsd = formatUsd;\nconst displayPct = formatPct;\nconst displayCents = formatCents;\nconst displayBalance = formatBalance;\nconst displayCompact = formatCompact;\n\nexport {\n fixed,\n formatUsd,\n formatCents,\n formatPct,\n formatCompact,\n formatNumber,\n formatBalance,\n formatSigFig,\n displayUsd,\n displayPct,\n displayCents,\n displayBalance,\n displayCompact,\n};\n","// ---------------------------------------------------------------------------\n// Hyperliquid HIP-4 HTTP Client\n//\n// Wraps the HL info + exchange REST API. Outcome markets use the same\n// endpoints as perps but with @<id> (outcome-level) and #<id><side>\n// (per-side probability) coin prefixes.\n// ---------------------------------------------------------------------------\n\nimport type {\n HLAllMids,\n HLBatchModifyAction,\n HLCancelAction,\n HLCancelResponse,\n HLCandle,\n HLClearinghouseState,\n HLExchangeResponse,\n HLExtraAgent,\n HLFill,\n HLFrontendOrder,\n HLL2Book,\n HLModifyAction,\n HLModifyResponse,\n HLOrderAction,\n HLOutcomeMeta,\n HLReferralState,\n HLSettledOutcome,\n HLSignature,\n HLSpotClearinghouseState,\n HLTrade,\n HLUserAbstraction,\n HLUserFees,\n HLUserRoleResponse,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Typed API error - carries HTTP status for retry decisions\n// ---------------------------------------------------------------------------\n\nexport class HLApiError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n ) {\n super(message);\n this.name = \"HLApiError\";\n }\n}\n\nconst MAINNET_INFO_URL = \"https://api.hyperliquid.xyz/info\";\nconst MAINNET_EXCHANGE_URL = \"https://api.hyperliquid.xyz/exchange\";\nconst TESTNET_INFO_URL = \"https://api-ui.hyperliquid-testnet.xyz/info\";\nconst TESTNET_EXCHANGE_URL = \"https://api-ui.hyperliquid-testnet.xyz/exchange\";\n\nconst TESTNET_WS_URL = \"wss://api-ui.hyperliquid-testnet.xyz/ws\";\nconst MAINNET_WS_URL = \"wss://api.hyperliquid.xyz/ws\";\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface HIP4ClientConfig {\n testnet?: boolean;\n infoUrl?: string;\n exchangeUrl?: string;\n /** Optional logger. Default: no-op. */\n logger?: (\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n msg: string,\n data?: unknown,\n ) => void;\n}\n\n/**\n * Canonical value for info queries that should span every perp dex.\n * Replaces reliance on DEX abstraction, which Hyperliquid is deprecating.\n */\nexport const ALL_DEXS = \"ALL_DEXS\";\n\n/**\n * Predicate: does this abstraction mode require a `usdClassTransfer`\n * step to move USDC between spot and perps silos?\n *\n * - `disabled` (Standard): spot/perp split, transfer required.\n * - `dexAbstraction`: unifies multiple perp DEXes only - spot/perp\n * split is preserved, transfer still required. Verified empirically:\n * addresses on `dexAbstraction` carry independent spot-USDC and\n * perp-`withdrawable` balances.\n * - `unifiedAccount` / `portfolioMargin`: spot↔perp merged into a\n * single balance - `usdClassTransfer` is rejected with `\"Action\n * disabled when unified account is active\"`.\n */\nexport function isUsdClassTransferRequired(\n abstraction: HLUserAbstraction,\n): boolean {\n return (\n abstraction === \"default\" ||\n abstraction === \"disabled\" ||\n abstraction === \"dexAbstraction\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// Coin-name helpers\n// ---------------------------------------------------------------------------\n\n/** Outcome-level coin name (AMM instrument) */\nexport function outcomeCoin(outcomeId: number): string {\n return `@${outcomeId}`;\n}\n\n/** Per-side probability coin name */\nexport function sideCoin(outcomeId: number, sideIndex: number): string {\n return `#${outcomeId}${sideIndex}`;\n}\n\n/** Asset ID for order placement: 100_000_000 + outcomeId * 10 + sideIndex */\nexport function sideAssetId(outcomeId: number, sideIndex: number): number {\n return 100_000_000 + outcomeId * 10 + sideIndex;\n}\n\n/** Parse a side coin like \"#5160\" or \"+5160\" into {outcomeId, sideIndex} */\nexport function parseSideCoin(coin: string): {\n outcomeId: number;\n sideIndex: number;\n} | null {\n // HIP-4 uses # prefix, testnet may use + as an alternative\n if (!coin.startsWith(\"#\") && !coin.startsWith(\"+\")) return null;\n const num = coin.slice(1);\n if (num.length < 2) return null;\n const sideIndex = parseInt(num.slice(-1), 10);\n const outcomeId = parseInt(num.slice(0, -1), 10);\n if (isNaN(sideIndex) || isNaN(outcomeId)) return null;\n if (sideIndex > 1) return null;\n return { outcomeId, sideIndex };\n}\n\n/** Parse an outcome-level coin like \"@1338\" into {outcomeId} */\nexport function parseOutcomeCoin(coin: string): { outcomeId: number } | null {\n if (!coin.startsWith(\"@\")) return null;\n const outcomeId = parseInt(coin.slice(1), 10);\n if (isNaN(outcomeId)) return null;\n return { outcomeId };\n}\n\n/** Extract the outcome ID from either @, #, or + coin format */\nexport function coinOutcomeId(coin: string): number | null {\n if (coin.startsWith(\"#\") || coin.startsWith(\"+\")) {\n const parsed = parseSideCoin(coin);\n return parsed ? parsed.outcomeId : null;\n }\n if (coin.startsWith(\"@\")) {\n const parsed = parseOutcomeCoin(coin);\n return parsed ? parsed.outcomeId : null;\n }\n return null;\n}\n\n/** Check if a coin is an outcome-level or side-level instrument */\nexport function isOutcomeCoin(coin: string): boolean {\n return coin.startsWith(\"@\") || coin.startsWith(\"#\") || coin.startsWith(\"+\");\n}\n\n// ---------------------------------------------------------------------------\n// HIP4Client\n// ---------------------------------------------------------------------------\n\nexport class HIP4Client {\n readonly infoUrl: string;\n readonly exchangeUrl: string;\n readonly wsUrl: string;\n readonly testnet: boolean;\n readonly log: (\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n msg: string,\n data?: unknown,\n ) => void;\n\n constructor(config: HIP4ClientConfig = {}) {\n this.testnet = config.testnet ?? true;\n this.infoUrl =\n config.infoUrl ?? (this.testnet ? TESTNET_INFO_URL : MAINNET_INFO_URL);\n this.exchangeUrl =\n config.exchangeUrl ??\n (this.testnet ? TESTNET_EXCHANGE_URL : MAINNET_EXCHANGE_URL);\n this.wsUrl = this.testnet ? TESTNET_WS_URL : MAINNET_WS_URL;\n this.log = config.logger ?? (() => {});\n }\n\n // -- Info endpoints -------------------------------------------------------\n\n async fetchOutcomeMeta(): Promise<HLOutcomeMeta> {\n return this.infoPost<HLOutcomeMeta>({ type: \"outcomeMeta\" });\n }\n\n async fetchSettledOutcome(outcome: number): Promise<HLSettledOutcome | null> {\n return this.infoPost<HLSettledOutcome | null>({\n type: \"settledOutcome\",\n outcome,\n });\n }\n\n async fetchL2Book(coin: string): Promise<HLL2Book> {\n return this.infoPost<HLL2Book>({ type: \"l2Book\", coin });\n }\n\n async fetchRecentTrades(coin: string): Promise<HLTrade[]> {\n return this.infoPost<HLTrade[]>({ type: \"recentTrades\", coin });\n }\n\n async fetchAllMids(): Promise<HLAllMids> {\n return this.infoPost<HLAllMids>({ type: \"allMids\" });\n }\n\n async fetchCandleSnapshot(\n coin: string,\n interval: string,\n startTime: number,\n endTime: number,\n ): Promise<HLCandle[]> {\n return this.infoPost<HLCandle[]>({\n type: \"candleSnapshot\",\n req: { coin, interval, startTime, endTime },\n });\n }\n\n async fetchClearinghouseState(user: string): Promise<HLClearinghouseState> {\n return this.infoPost<HLClearinghouseState>({\n type: \"clearinghouseState\",\n user,\n });\n }\n\n async fetchUserFills(user: string): Promise<HLFill[]> {\n return this.infoPost<HLFill[]>({ type: \"userFills\", user });\n }\n\n /** Spot meta + asset contexts (includes markPx / oracle price for each spot asset) */\n async fetchSpotAssetCtx(\n spotIndex: number,\n ): Promise<{ markPx: string; midPx: string } | null> {\n const data = await this.infoPost<\n [unknown, Array<{ markPx?: string; midPx?: string; coin?: string }>]\n >({\n type: \"spotMetaAndAssetCtxs\",\n });\n const ctx = data[1]?.[spotIndex];\n if (!ctx?.markPx) return null;\n return { markPx: ctx.markPx, midPx: ctx.midPx ?? \"0\" };\n }\n\n /** Spot balances - HIP-4 prediction market positions live here (USDH, outcome tokens) */\n async fetchSpotClearinghouseState(\n user: string,\n ): Promise<HLSpotClearinghouseState> {\n return this.infoPost<HLSpotClearinghouseState>({\n type: \"spotClearinghouseState\",\n user,\n });\n }\n\n /** Trade fills with time range filtering */\n async fetchUserFillsByTime(\n user: string,\n startTime: number,\n endTime: number,\n ): Promise<HLFill[]> {\n return this.infoPost<HLFill[]>({\n type: \"userFillsByTime\",\n user,\n startTime,\n endTime,\n aggregateByTime: true,\n reversed: true,\n dex: ALL_DEXS,\n });\n }\n\n /** Approved extra agents for a user */\n async fetchExtraAgents(user: string): Promise<HLExtraAgent[]> {\n return this.infoPost<HLExtraAgent[]>({ type: \"extraAgents\", user });\n }\n\n /**\n * Check the maximum builder fee a user has approved for a given builder.\n * Returns the approved fee in tenths of a basis point (e.g. 100 = 0.1%).\n * Returns 0 if no approval exists.\n */\n async fetchMaxBuilderFee(user: string, builder: string): Promise<number> {\n const result = await this.infoPost<string | number>({\n type: \"maxBuilderFee\",\n user,\n builder: builder.toLowerCase(),\n });\n return result ? Number(result) : 0;\n }\n\n /**\n * Fetch all approved builder addresses for a user.\n * Hyperliquid limits each address to a maximum of 3 approved builders.\n */\n async fetchApprovedBuilders(user: string): Promise<string[]> {\n return this.infoPost<string[]>({ type: \"approvedBuilders\", user });\n }\n\n /**\n * Fetch a user's referral state from Hyperliquid.\n * Returns the referral state object, or null if no referrer is set.\n */\n async fetchReferralState(user: string): Promise<HLReferralState> {\n return this.infoPost<HLReferralState>({ type: \"referral\", user });\n }\n\n /**\n * Fetch the role assigned to a user by Hyperliquid.\n * `role === \"missing\"` indicates the wallet has never interacted with HL.\n */\n async fetchUserRole(user: string): Promise<HLUserRoleResponse> {\n return this.infoPost<HLUserRoleResponse>({ type: \"userRole\", user });\n }\n\n /**\n * Fetch the user's effective fee schedule (post-discount).\n * Spot rates (`userSpotCrossRate` / `userSpotAddRate`) are what apply to\n * HIP-4 outcome closes; opens are 0-fee.\n */\n async fetchUserFees(user: string): Promise<HLUserFees> {\n return this.infoPost<HLUserFees>({ type: \"userFees\", user });\n }\n\n /**\n * Fetch the user's account abstraction mode.\n *\n * Returns one of `\"default\" | \"disabled\" | \"dexAbstraction\" |\n * \"unifiedAccount\" | \"portfolioMargin\"`. Standard accounts return\n * `\"default\"` (or `\"disabled\"`); both keep spot and perp as separate\n * silos and require a `usdClassTransfer` before `withdraw3`. Only\n * `\"unifiedAccount\"` / `\"portfolioMargin\"` merge the balances and reject\n * `usdClassTransfer`. Use {@link isUsdClassTransferRequired} to gate the\n * spot↔perp transfer step in deposit/withdraw flows.\n *\n * Endpoint: `POST /info` body `{ type: \"userAbstraction\", user }`.\n */\n async fetchUserAbstraction(user: string): Promise<HLUserAbstraction> {\n return this.infoPost<HLUserAbstraction>({ type: \"userAbstraction\", user });\n }\n\n /** Frontend-formatted open orders */\n async fetchFrontendOpenOrders(user: string): Promise<HLFrontendOrder[]> {\n return this.infoPost<HLFrontendOrder[]>({\n type: \"frontendOpenOrders\",\n user,\n dex: ALL_DEXS,\n });\n }\n\n // -- Exchange endpoints ---------------------------------------------------\n\n async placeOrder(\n action: HLOrderAction,\n nonce: number,\n signature: HLSignature,\n vaultAddress: string | null = null,\n ): Promise<HLExchangeResponse> {\n return this.exchangePost({\n action,\n nonce,\n signature,\n vaultAddress,\n });\n }\n\n async cancelOrder(\n action: HLCancelAction,\n nonce: number,\n signature: HLSignature,\n vaultAddress: string | null = null,\n ): Promise<HLCancelResponse> {\n return this.exchangePost({\n action,\n nonce,\n signature,\n vaultAddress,\n });\n }\n\n async modifyOrder(\n action: HLModifyAction,\n nonce: number,\n signature: HLSignature,\n vaultAddress: string | null = null,\n ): Promise<HLModifyResponse> {\n return this.exchangePost({\n action,\n nonce,\n signature,\n vaultAddress,\n });\n }\n\n async batchModifyOrders(\n action: HLBatchModifyAction,\n nonce: number,\n signature: HLSignature,\n vaultAddress: string | null = null,\n ): Promise<HLModifyResponse> {\n return this.exchangePost({\n action,\n nonce,\n signature,\n vaultAddress,\n });\n }\n\n /** Submit a user-signed action (withdraw, usdClassTransfer, etc.) */\n async submitUserSignedAction(\n action: Record<string, unknown>,\n nonce: number,\n signature: HLSignature,\n ): Promise<{ status: string; response?: unknown }> {\n return this.exchangePost({\n action,\n nonce,\n signature,\n });\n }\n\n // -- WebSocket subscriptions -----------------------------------------------\n\n private ws: WebSocket | null = null;\n private wsPendingMessages: string[] = [];\n /** Callbacks keyed by response channel (for message routing). */\n private wsCallbacks: Map<string, Set<(data: unknown) => void>> = new Map();\n /** Active subscribe messages as JSON strings (for reconnection). */\n private wsActiveSubs: Set<string> = new Set();\n\n /**\n * Subscribe to a Hyperliquid WebSocket channel.\n * Returns an unsubscribe function.\n *\n * @param options.responseChannel Channel name HL uses in response messages\n * when it differs from `subscription.type` (e.g. subscribe as\n * \"activeAssetCtx\" but receive on \"activeSpotAssetCtx\").\n */\n subscribe(\n subscription: { type: string; [key: string]: unknown },\n onData: (data: unknown) => void,\n options?: { responseChannel?: string },\n ): () => void {\n const responseChannel = options?.responseChannel ?? subscription.type;\n this.ensureWs();\n\n // Send subscribe to HL\n const subMsg = JSON.stringify({ method: \"subscribe\", subscription });\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(subMsg);\n } else {\n this.wsPendingMessages.push(subMsg);\n }\n this.wsActiveSubs.add(subMsg);\n\n // Register callback for message routing\n if (!this.wsCallbacks.has(responseChannel)) {\n this.wsCallbacks.set(responseChannel, new Set());\n }\n this.wsCallbacks.get(responseChannel)?.add(onData);\n\n return () => {\n // Send unsubscribe to HL\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ method: \"unsubscribe\", subscription }));\n }\n this.wsActiveSubs.delete(subMsg);\n\n // Remove callback\n const cbs = this.wsCallbacks.get(responseChannel);\n if (cbs) {\n cbs.delete(onData);\n if (cbs.size === 0) this.wsCallbacks.delete(responseChannel);\n }\n\n // Close WS if nothing left\n if (this.wsCallbacks.size === 0 && this.ws) {\n this.ws.close();\n this.ws = null;\n }\n };\n }\n\n /** Tear down WebSocket and clear all subscriptions. */\n closeWs(): void {\n if (this.wsReconnectTimer) {\n clearTimeout(this.wsReconnectTimer);\n this.wsReconnectTimer = null;\n }\n this.wsReconnectAttempts = 0;\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.wsCallbacks.clear();\n this.wsActiveSubs.clear();\n this.wsPendingMessages = [];\n }\n\n private ensureWs(): void {\n if (this.ws) return;\n const ws = new WebSocket(this.wsUrl);\n this.ws = ws;\n ws.onopen = () => {\n this.wsReconnectAttempts = 0;\n for (const msg of this.wsPendingMessages) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(msg);\n }\n }\n this.wsPendingMessages = [];\n };\n ws.onmessage = (event: MessageEvent) => {\n try {\n const parsed = JSON.parse(event.data as string) as {\n channel?: string;\n data?: unknown;\n };\n if (!parsed.channel) return;\n const cbs = this.wsCallbacks.get(parsed.channel);\n if (cbs) {\n for (const cb of cbs) cb(parsed.data);\n }\n } catch {\n // Ignore unparseable frames\n }\n };\n ws.onclose = () => {\n if (this.ws === ws) {\n this.ws = null;\n if (this.wsActiveSubs.size > 0) {\n this.scheduleReconnect();\n }\n }\n };\n }\n\n private wsReconnectAttempts = 0;\n private wsReconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private wsDestroyed = false;\n\n private scheduleReconnect(): void {\n if (this.wsDestroyed) return;\n if (this.wsReconnectAttempts >= 10) {\n this.log(\"warn\", \"WS max reconnect attempts reached\");\n return;\n }\n const delay = Math.min(1000 * 2 ** this.wsReconnectAttempts, 30_000);\n this.wsReconnectAttempts++;\n this.wsReconnectTimer = setTimeout(() => {\n if (this.wsDestroyed || this.wsActiveSubs.size === 0) return;\n this.ensureWs();\n for (const msg of this.wsActiveSubs) {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(msg);\n } else {\n this.wsPendingMessages.push(msg);\n }\n }\n }, delay);\n }\n\n // -- Internal -------------------------------------------------------------\n\n private async infoPost<T>(body: Record<string, unknown>): Promise<T> {\n try {\n return await this.doInfoPost<T>(body);\n } catch (err) {\n // Only retry on 5xx or network errors, not 4xx\n if (err instanceof HLApiError && err.status >= 400 && err.status < 500)\n throw err;\n this.log(\"warn\", \"Info request failed, retrying once\", {\n type: body.type,\n error: err instanceof Error ? err.message : String(err),\n });\n await new Promise((r) => setTimeout(r, 1000));\n return this.doInfoPost<T>(body);\n }\n }\n\n private async doInfoPost<T>(body: Record<string, unknown>): Promise<T> {\n const res = await fetch(this.infoUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n throw new HLApiError(\n res.status,\n `HL info API responded with ${res.status}: ${res.statusText}`,\n );\n }\n try {\n return (await res.json()) as T;\n } catch {\n throw new HLApiError(res.status, \"Exchange returned non-JSON response\");\n }\n }\n\n private async exchangePost<T>(body: Record<string, unknown>): Promise<T> {\n const res = await fetch(this.exchangeUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n throw new HLApiError(\n res.status,\n `HL exchange API responded with ${res.status}: ${res.statusText}`,\n );\n }\n try {\n return (await res.json()) as T;\n } catch {\n throw new HLApiError(res.status, \"Exchange returned non-JSON response\");\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Account Adapter\n//\n// Positions: from spotClearinghouseState, filtered to outcome coins (@ / #)\n// Activity: from userFillsByTime (30-day range), filtered to outcome coins\n// ---------------------------------------------------------------------------\n\nimport { toDecimal, sub, mul, div, isZero } from \"../../lib/precision/primitives\";\nimport { fixed } from \"../../lib/precision/io\";\nimport type {\n PredictionActivity,\n PredictionPosition,\n} from \"../../types/account\";\nimport type { PredictionEvent } from \"../../types/event\";\nimport type { PredictionAccountAdapter, Unsubscribe } from \"../types\";\nimport type { HIP4Client } from \"./client\";\nimport { coinOutcomeId, isOutcomeCoin, parseSideCoin } from \"./client\";\nimport type { SideNameResolver } from \"./events\";\nimport type { HLFill } from \"./types\";\n\ninterface EventDataSource {\n fetchEvents(params?: { limit?: number }): Promise<PredictionEvent[]>;\n ensureSideNames?(): Promise<void>;\n}\n\nconst POLL_INTERVAL_MS = 10_000;\n\ninterface SpotBalance {\n coin: string;\n total: string;\n entryNtl: string;\n}\n\nfunction mapSpotBalance(\n bal: SpotBalance,\n allMids: Record<string, string>,\n nameMap: Map<string, { eventTitle: string; marketQuestion: string }>,\n resolveSideNames?: SideNameResolver,\n): PredictionPosition | null {\n const coin = bal.coin;\n if (!isOutcomeCoin(coin)) return null;\n\n const total = toDecimal(bal.total);\n if (total.isZero()) return null;\n\n const outcomeId = coinOutcomeId(coin);\n const marketId = outcomeId !== null ? String(outcomeId) : coin;\n const outcome = coin;\n\n const parsed = parseSideCoin(coin);\n let outcomeName: string;\n if (parsed && resolveSideNames) {\n const names = resolveSideNames(parsed.outcomeId);\n outcomeName = names ? names[parsed.sideIndex] : `Side ${parsed.sideIndex}`;\n } else {\n outcomeName = parsed ? `Side ${parsed.sideIndex}` : coin;\n }\n\n const entryNtl = toDecimal(bal.entryNtl);\n const avgCost = isZero(bal.total) ? \"0\" : div(bal.entryNtl, bal.total);\n\n const mid = allMids[coin];\n const currentPrice = mid ?? \"0\";\n const unrealizedPnl = mul(sub(currentPrice, avgCost), bal.total);\n const potentialPayout = bal.total;\n\n const names = nameMap.get(marketId);\n return {\n marketId,\n eventTitle: names?.eventTitle ?? \"\",\n marketQuestion: names?.marketQuestion ?? \"\",\n outcome,\n outcomeName,\n shares: fixed(bal.total, 6),\n avgCost: fixed(avgCost, 6),\n currentPrice,\n unrealizedPnl: fixed(unrealizedPnl, 6),\n potentialPayout: fixed(potentialPayout, 6),\n eventStatus: \"active\",\n };\n}\n\nfunction mapFill(raw: HLFill): PredictionActivity | null {\n if (!isOutcomeCoin(raw.coin)) return null;\n\n const outcomeId = coinOutcomeId(raw.coin);\n const marketId = outcomeId !== null ? String(outcomeId) : raw.coin;\n\n return {\n id: String(raw.tid),\n type: \"trade\",\n marketId,\n outcome: raw.coin,\n side: raw.side === \"B\" ? \"buy\" : \"sell\",\n price: raw.px,\n size: raw.sz,\n timestamp: raw.time,\n };\n}\n\nexport class HIP4AccountAdapter implements PredictionAccountAdapter {\n private readonly resolveSideNames?: SideNameResolver;\n\n constructor(\n private readonly client: HIP4Client,\n private readonly events?: EventDataSource,\n resolveSideNames?: SideNameResolver,\n ) {\n this.resolveSideNames = resolveSideNames;\n }\n\n async fetchPositions(address: string): Promise<PredictionPosition[]> {\n if (this.events?.ensureSideNames) {\n await this.events.ensureSideNames();\n }\n\n const [state, allMids, eventList] = await Promise.all([\n this.client.fetchSpotClearinghouseState(address),\n this.client.fetchAllMids(),\n this.events?.fetchEvents({ limit: 200 }).catch(() => [] as PredictionEvent[]) ??\n Promise.resolve([] as PredictionEvent[]),\n ]);\n\n const nameMap = new Map<string, { eventTitle: string; marketQuestion: string }>();\n for (const event of eventList) {\n for (const market of event.markets) {\n nameMap.set(market.id, { eventTitle: event.title, marketQuestion: market.question });\n }\n }\n\n const positions: PredictionPosition[] = [];\n for (const bal of state.balances) {\n if (!isOutcomeCoin(bal.coin)) continue;\n if (isZero(bal.total)) continue;\n\n const mapped = mapSpotBalance(bal, allMids, nameMap, this.resolveSideNames);\n if (mapped) positions.push(mapped);\n }\n\n return positions;\n }\n\n async fetchActivity(address: string): Promise<PredictionActivity[]> {\n const now = Date.now();\n const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;\n const startTime = now - thirtyDaysMs;\n\n const fills = await this.client.fetchUserFillsByTime(\n address,\n startTime,\n now,\n );\n const activities: PredictionActivity[] = [];\n for (const fill of fills) {\n const mapped = mapFill(fill);\n if (mapped) activities.push(mapped);\n }\n return activities;\n }\n\n async fetchBalance(\n address: string,\n ): Promise<Array<{ coin: string; total: string; hold: string }>> {\n const state = await this.client.fetchSpotClearinghouseState(address);\n return state.balances.map((b) => ({\n coin: b.coin,\n total: b.total,\n hold: b.hold,\n }));\n }\n\n async fetchOpenOrders(address: string): Promise<\n Array<{\n coin: string;\n side: \"B\" | \"A\";\n limitPx: string;\n sz: string;\n oid: number;\n timestamp: number;\n }>\n > {\n const orders = await this.client.fetchFrontendOpenOrders(address);\n return orders.map((o) => ({\n coin: o.coin,\n side: o.side,\n limitPx: o.limitPx,\n sz: o.sz,\n oid: o.oid,\n timestamp: o.timestamp,\n }));\n }\n\n subscribePositions(\n address: string,\n onData: (positions: PredictionPosition[]) => void,\n ): Unsubscribe {\n let active = true;\n\n const poll = async () => {\n while (active) {\n try {\n const positions = await this.fetchPositions(address);\n if (active) onData(positions);\n } catch {\n // Silently continue polling\n }\n if (active) {\n await sleep(POLL_INTERVAL_MS);\n }\n }\n };\n\n void poll();\n\n return () => {\n active = false;\n };\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Auth Adapter\n//\n// Stores a wallet address and signer for EIP-712 order signing.\n// The signer must implement HIP4Signer (getAddress + signTypedData).\n// ---------------------------------------------------------------------------\n\nimport type { PredictionAuthState } from \"../../types/account\";\nimport type { PredictionAuthAdapter } from \"../types\";\nimport type { HIP4Signer } from \"./types\";\n\n/** Ethers-style: has getAddress() + signTypedData() */\nfunction isEthersSigner(val: Record<string, unknown>): boolean {\n return (\n typeof val.getAddress === \"function\" &&\n typeof val.signTypedData === \"function\"\n );\n}\n\n/** Viem-style: has .address (string) + signTypedData() */\nfunction isViemAccount(val: Record<string, unknown>): boolean {\n return (\n typeof val.address === \"string\" && typeof val.signTypedData === \"function\"\n );\n}\n\n/** Wrap a viem PrivateKeyAccount as HIP4Signer */\nfunction wrapViemAccount(account: Record<string, unknown>): HIP4Signer {\n return {\n getAddress: () => account.address as string,\n signTypedData: (domain, types, value) =>\n (account.signTypedData as (...args: unknown[]) => Promise<string>)({\n domain,\n types: { ...types },\n primaryType: Object.keys(types)[0],\n message: value,\n }),\n };\n}\n\nexport class HIP4Auth implements PredictionAuthAdapter {\n private state: PredictionAuthState = { status: \"disconnected\" };\n private signer: HIP4Signer | null = null;\n\n async initAuth(\n walletAddress: string,\n signer: unknown,\n ): Promise<PredictionAuthState> {\n if (typeof signer !== \"object\" || signer === null) {\n this.state = { status: \"disconnected\" };\n throw new Error(\n \"HIP-4 auth requires a signer. Pass a viem PrivateKeyAccount, ethers Wallet, or compatible signer.\",\n );\n }\n\n const obj = signer as Record<string, unknown>;\n let resolved: HIP4Signer;\n\n if (isEthersSigner(obj)) {\n // Ethers Wallet / Signer - already matches HIP4Signer interface\n resolved = signer as HIP4Signer;\n } else if (isViemAccount(obj)) {\n // Viem PrivateKeyAccount - wrap to match HIP4Signer interface\n resolved = wrapViemAccount(obj);\n } else {\n this.state = { status: \"disconnected\" };\n throw new Error(\n \"HIP-4 auth requires a signer with signTypedData(). \" +\n \"Pass a viem PrivateKeyAccount, ethers Wallet, or compatible signer.\",\n );\n }\n\n this.state = { status: \"pending_approval\", address: walletAddress };\n this.signer = resolved;\n\n // Note: We intentionally do NOT compare signer.getAddress() to walletAddress.\n // With agent wallets (e.g. HL API wallets), the signer address differs from\n // the user's wallet address by design - the agent signs on behalf of the user.\n\n this.state = {\n status: \"ready\",\n address: walletAddress,\n };\n\n return this.state;\n }\n\n getAuthStatus(): PredictionAuthState {\n return this.state;\n }\n\n clearAuth(): void {\n this.signer = null;\n this.state = { status: \"disconnected\" };\n }\n\n /** Internal - used by the trading adapter to get the active signer */\n getSigner(): HIP4Signer | null {\n return this.signer;\n }\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Price Binary Market Discovery\n//\n// Parses outcomeMeta descriptions and discovers active priceBinary markets.\n// Returns typed PriceBinaryMarket objects with pre-computed asset IDs.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MarketType = \"priceBinary\" | \"priceBucket\";\n\nexport interface ParsedDescription {\n class: \"priceBinary\";\n underlying: string;\n expiry: Date;\n targetPrice: number;\n period: string;\n}\n\nexport interface ParsedPriceBucketDescription {\n class: \"priceBucket\";\n underlying: string;\n expiry: Date;\n /** Sorted ascending price thresholds. N thresholds → N+1 buckets. */\n priceThresholds: number[];\n period: string;\n}\n\n/**\n * A single active HIP-4 recurring price binary market.\n *\n * Coin naming conventions:\n * #<coinNum> - API coin used in allMids, l2Book, candle, recentTrades\n * @<pairNum> - Token pair (EMPTY orderbook - not traded directly)\n * +<coinNum> - Token balance key in spotClearinghouseState\n * a = 100000000 + coinNum - order asset field\n */\nexport interface PriceBinaryMarket {\n outcomeId: number;\n underlying: string;\n targetPrice: number;\n expiry: Date;\n period: string;\n yesCoinNum: number;\n noCoinNum: number;\n yesCoin: string;\n noCoin: string;\n yesAsset: number;\n noAsset: number;\n}\n\nconst PREDICTION_ASSET_OFFSET = 100_000_000;\n\n// ---------------------------------------------------------------------------\n// Description parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a pipe-delimited outcome description string.\n *\n * Format: \"class:priceBinary|underlying:BTC|expiry:20260310-0300|targetPrice:66200|period:15m\"\n *\n * Returns null if not a valid priceBinary description.\n */\nexport function parseDescription(desc: string): ParsedDescription | null {\n if (!desc || !desc.includes(\"|\")) return null;\n\n const fields: Record<string, string> = {};\n for (const pair of desc.split(\"|\")) {\n const idx = pair.indexOf(\":\");\n if (idx > 0) {\n fields[pair.slice(0, idx)] = pair.slice(idx + 1);\n }\n }\n\n if (fields.class !== \"priceBinary\") return null;\n if (!fields.underlying || !fields.expiry || !fields.targetPrice || !fields.period) {\n return null;\n }\n\n return {\n class: \"priceBinary\",\n underlying: fields.underlying,\n expiry: parseExpiry(fields.expiry),\n targetPrice: parseFloat(fields.targetPrice),\n period: fields.period,\n };\n}\n\n/**\n * Parse a pipe-delimited priceBucket description string.\n *\n * Format: \"class:priceBucket|underlying:BTC|expiry:20260505-1700|priceThresholds:81015.3,81258.7|period:15m\"\n *\n * Returns null if not a valid priceBucket description.\n */\nexport function parsePriceBucketDescription(\n desc: string,\n): ParsedPriceBucketDescription | null {\n if (!desc || !desc.includes(\"|\")) return null;\n\n const fields: Record<string, string> = {};\n for (const pair of desc.split(\"|\")) {\n const idx = pair.indexOf(\":\");\n if (idx > 0) {\n fields[pair.slice(0, idx)] = pair.slice(idx + 1);\n }\n }\n\n if (fields.class !== \"priceBucket\") return null;\n if (!fields.underlying || !fields.expiry || !fields.priceThresholds || !fields.period) {\n return null;\n }\n\n const priceThresholds = fields.priceThresholds\n .split(\",\")\n .map((s) => parseFloat(s.trim()))\n .filter((n) => Number.isFinite(n))\n .sort((a, b) => a - b);\n if (priceThresholds.length === 0) return null;\n\n return {\n class: \"priceBucket\",\n underlying: fields.underlying,\n expiry: parseExpiry(fields.expiry),\n priceThresholds,\n period: fields.period,\n };\n}\n\nfunction parseExpiry(s: string): Date {\n const year = parseInt(s.slice(0, 4));\n const month = parseInt(s.slice(4, 6)) - 1;\n const day = parseInt(s.slice(6, 8));\n const hour = parseInt(s.slice(9, 11));\n const min = parseInt(s.slice(11, 13));\n return new Date(Date.UTC(year, month, day, hour, min));\n}\n\n// ---------------------------------------------------------------------------\n// Market discovery\n// ---------------------------------------------------------------------------\n\ninterface OutcomeMeta {\n outcomes: Array<{\n outcome: number;\n name: string;\n description: string;\n sideSpecs: Array<{ name: string }>;\n }>;\n questions: unknown[];\n}\n\n/**\n * Discover all active priceBinary markets from outcomeMeta + allMids.\n *\n * A market is included when:\n * 1. Its description parses as class:priceBinary\n * 2. Expiry is in the future\n * 3. A live price exists in mids for the underlying\n */\nexport function discoverPriceBinaryMarkets(\n meta: OutcomeMeta,\n mids: Record<string, string>,\n): PriceBinaryMarket[] {\n const markets: PriceBinaryMarket[] = [];\n\n for (const outcome of meta.outcomes) {\n const parsed = parseDescription(outcome.description);\n if (!parsed) continue;\n if (!mids[parsed.underlying]) continue;\n if (parsed.expiry.getTime() <= Date.now()) continue;\n\n const yesCoinNum = outcome.outcome * 10;\n const noCoinNum = outcome.outcome * 10 + 1;\n\n markets.push({\n outcomeId: outcome.outcome,\n underlying: parsed.underlying,\n targetPrice: parsed.targetPrice,\n expiry: parsed.expiry,\n period: parsed.period,\n yesCoinNum,\n noCoinNum,\n yesCoin: `#${yesCoinNum}`,\n noCoin: `#${noCoinNum}`,\n yesAsset: PREDICTION_ASSET_OFFSET + yesCoinNum,\n noAsset: PREDICTION_ASSET_OFFSET + noCoinNum,\n });\n }\n\n return markets;\n}\n\n// ---------------------------------------------------------------------------\n// Time utilities\n// ---------------------------------------------------------------------------\n\n/** Minutes until market expires. Negative means already expired. */\nexport function timeToExpiry(market: PriceBinaryMarket): number {\n return (market.expiry.getTime() - Date.now()) / 60_000;\n}\n\n/**\n * Parse a period string to minutes.\n * \"1m\"→1, \"5m\"→5, \"15m\"→15, \"1h\"→60, \"4h\"→240, \"1d\"→1440\n */\nexport function periodMinutes(period: string): number {\n const match = period.match(/^(\\d+)(m|h|d)$/);\n if (!match) return 15;\n\n const value = parseInt(match[1]);\n switch (match[2]) {\n case \"m\": return value;\n case \"h\": return value * 60;\n case \"d\": return value * 1440;\n default: return 15;\n }\n}\n\n/** Human-readable label: \"BTC-1d\", \"HYPE-15m\" */\nexport function formatMarketLabel(market: PriceBinaryMarket): string {\n return `${market.underlying}-${market.period}`;\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Market Classification\n//\n// Classifies raw HLOutcome objects into typed HIP4Market variants:\n// defaultBinary - description parses as class:priceBinary (recurring)\n// priceBucket - parent question parses as class:priceBucket (recurring)\n// multiOutcome - outcome belongs to a non-priceBucket question group\n// labelledBinary - everything else (standalone, any side labels)\n//\n// Detection priority:\n// 1. priceBinary description parse → defaultBinary\n// 2. Parent question is priceBucket → priceBucket\n// 3. In a question's namedOutcomes or fallbackOutcome → multiOutcome\n// 4. Fallthrough → labelledBinary\n// ---------------------------------------------------------------------------\n\nimport type {\n DefaultBinaryMarket,\n HIP4Market,\n LabelledBinaryMarket,\n MarketSide,\n MultiOutcomeMarket,\n PriceBucketMarket,\n} from \"../../types/hip4-market\";\nimport type { ParsedPriceBucketDescription } from \"./market-discovery\";\nimport {\n parseDescription,\n parsePriceBucketDescription,\n} from \"./market-discovery\";\nimport type { HLOutcome, HLQuestion } from \"./types\";\n\nconst PREDICTION_ASSET_OFFSET = 100_000_000;\n\n// ---------------------------------------------------------------------------\n// Side builder\n// ---------------------------------------------------------------------------\n\nfunction buildSides(outcome: HLOutcome): [MarketSide, MarketSide] {\n return [\n {\n name: outcome.sideSpecs[0]?.name ?? \"Side 0\",\n coinNum: outcome.outcome * 10,\n coin: `#${outcome.outcome * 10}`,\n asset: PREDICTION_ASSET_OFFSET + outcome.outcome * 10,\n },\n {\n name: outcome.sideSpecs[1]?.name ?? \"Side 1\",\n coinNum: outcome.outcome * 10 + 1,\n coin: `#${outcome.outcome * 10 + 1}`,\n asset: PREDICTION_ASSET_OFFSET + outcome.outcome * 10 + 1,\n },\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Question lookup index\n// ---------------------------------------------------------------------------\n\ninterface QuestionEntry {\n question: HLQuestion;\n isFallback: boolean;\n /** Index in question.namedOutcomes; -1 for fallback */\n bucketIndex: number;\n /** Pre-parsed priceBucket spec on the question, if any */\n bucket: ParsedPriceBucketDescription | null;\n}\n\n/**\n * Pre-computed lookup from outcomeId → parent question metadata.\n * Reuse across multiple `classifyOutcome` calls to avoid O(N) rebuilds per\n * call (see {@link buildQuestionIndex}).\n */\nexport interface QuestionIndex {\n /** outcomeId → entry */\n byOutcome: Map<number, QuestionEntry>;\n}\n\n/**\n * Build the question index once and reuse it when classifying many outcomes\n * via `classifyOutcome`. `classifyAllOutcomes` builds its own index\n * internally - this helper exists for callers that need per-outcome\n * classification in a loop.\n */\nexport function buildQuestionIndex(questions: HLQuestion[]): QuestionIndex {\n const byOutcome = new Map<number, QuestionEntry>();\n\n for (const q of questions) {\n const bucket = parsePriceBucketDescription(q.description);\n q.namedOutcomes.forEach((id, bucketIndex) => {\n byOutcome.set(id, {\n question: q,\n isFallback: false,\n bucketIndex,\n bucket,\n });\n });\n byOutcome.set(q.fallbackOutcome, {\n question: q,\n isFallback: true,\n bucketIndex: -1,\n bucket,\n });\n }\n\n return { byOutcome };\n}\n\n/**\n * Resolve the [lowerBound, upperBound) for a bucket within a priceBucket\n * question, given the question's `priceThresholds`. Bounds are half-open:\n * `lowerBound` is inclusive, `upperBound` is exclusive.\n *\n * bucketIndex < 0 → both null (fallback bucket)\n * bucketIndex === 0 → lowerBound is null (unbounded below)\n * bucketIndex >= len → upperBound is null (unbounded above)\n *\n * @param thresholds Sorted list of bucket boundaries from the question.\n * @param bucketIndex Position in the question's namedOutcomes array.\n */\nexport function getPriceBucketBounds(\n thresholds: readonly number[],\n bucketIndex: number,\n): { lowerBound: number | null; upperBound: number | null } {\n if (bucketIndex < 0) return { lowerBound: null, upperBound: null };\n const lowerBound =\n bucketIndex === 0 ? null : (thresholds[bucketIndex - 1] ?? null);\n const upperBound =\n bucketIndex >= thresholds.length ? null : (thresholds[bucketIndex] ?? null);\n return { lowerBound, upperBound };\n}\n\nfunction buildPriceBucketMarket(\n outcome: HLOutcome,\n sides: [MarketSide, MarketSide],\n entry: QuestionEntry,\n bucket: ParsedPriceBucketDescription,\n): PriceBucketMarket {\n const { lowerBound, upperBound } = getPriceBucketBounds(\n bucket.priceThresholds,\n entry.bucketIndex,\n );\n return {\n type: \"priceBucket\",\n outcomeId: outcome.outcome,\n name: outcome.name,\n description: outcome.description,\n sides,\n raw: outcome,\n underlying: bucket.underlying,\n expiry: bucket.expiry,\n priceThresholds: bucket.priceThresholds,\n period: bucket.period,\n questionId: entry.question.question,\n questionName: entry.question.name,\n questionDescription: entry.question.description,\n isFallback: entry.isFallback,\n bucketIndex: entry.bucketIndex,\n lowerBound,\n upperBound,\n rawQuestion: entry.question,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Classification\n// ---------------------------------------------------------------------------\n\n/**\n * Classify a single HLOutcome into a typed HIP4Market.\n *\n * Detection priority:\n * 1. Description parses as class:priceBinary → defaultBinary\n * 2. Outcome is in a question → multiOutcome (or priceBucket)\n * 3. Everything else → labelledBinary\n *\n * For batch classification, prefer `classifyAllOutcomes` (builds the index\n * once). When calling `classifyOutcome` repeatedly, pass a pre-built\n * `precomputedIndex` to avoid rebuilding it on every call:\n *\n * const index = buildQuestionIndex(questions);\n * for (const o of outcomes) classifyOutcome(o, questions, index);\n */\nexport function classifyOutcome(\n outcome: HLOutcome,\n questions: HLQuestion[],\n precomputedIndex?: QuestionIndex,\n): HIP4Market {\n const sides = buildSides(outcome);\n const index = precomputedIndex ?? buildQuestionIndex(questions);\n\n // 1. Try priceBinary\n const parsed = parseDescription(outcome.description);\n if (parsed) {\n const market: DefaultBinaryMarket = {\n type: \"defaultBinary\",\n outcomeId: outcome.outcome,\n name: `${parsed.underlying} > $${parsed.targetPrice} (${parsed.period})`,\n description: `Will ${parsed.underlying} be above $${parsed.targetPrice} by expiry?`,\n sides,\n raw: outcome,\n underlying: parsed.underlying,\n targetPrice: parsed.targetPrice,\n expiry: parsed.expiry,\n period: parsed.period,\n };\n return market;\n }\n\n // 2. Check if in a question\n const questionEntry = index.byOutcome.get(outcome.outcome);\n if (questionEntry) {\n if (questionEntry.bucket) {\n return buildPriceBucketMarket(\n outcome,\n sides,\n questionEntry,\n questionEntry.bucket,\n );\n }\n const market: MultiOutcomeMarket = {\n type: \"multiOutcome\",\n outcomeId: outcome.outcome,\n name: outcome.name,\n description: outcome.description,\n sides,\n raw: outcome,\n questionId: questionEntry.question.question,\n questionName: questionEntry.question.name,\n questionDescription: questionEntry.question.description,\n isFallback: questionEntry.isFallback,\n rawQuestion: questionEntry.question,\n };\n return market;\n }\n\n // 3. Fallthrough - labelledBinary\n const market: LabelledBinaryMarket = {\n type: \"labelledBinary\",\n outcomeId: outcome.outcome,\n name: outcome.name,\n description: outcome.description,\n sides,\n raw: outcome,\n };\n return market;\n}\n\n/**\n * Classify all outcomes in one pass.\n * Builds the question index once and reuses it.\n */\nexport function classifyAllOutcomes(\n outcomes: HLOutcome[],\n questions: HLQuestion[],\n): HIP4Market[] {\n const index = buildQuestionIndex(questions);\n return outcomes.map((outcome) => {\n const sides = buildSides(outcome);\n const parsed = parseDescription(outcome.description);\n\n if (parsed) {\n return {\n type: \"defaultBinary\",\n outcomeId: outcome.outcome,\n name: `${parsed.underlying} > $${parsed.targetPrice} (${parsed.period})`,\n description: `Will ${parsed.underlying} be above $${parsed.targetPrice} by expiry?`,\n sides,\n raw: outcome,\n underlying: parsed.underlying,\n targetPrice: parsed.targetPrice,\n expiry: parsed.expiry,\n period: parsed.period,\n } satisfies DefaultBinaryMarket;\n }\n\n const questionEntry = index.byOutcome.get(outcome.outcome);\n if (questionEntry) {\n if (questionEntry.bucket) {\n return buildPriceBucketMarket(\n outcome,\n sides,\n questionEntry,\n questionEntry.bucket,\n );\n }\n return {\n type: \"multiOutcome\",\n outcomeId: outcome.outcome,\n name: outcome.name,\n description: outcome.description,\n sides,\n raw: outcome,\n questionId: questionEntry.question.question,\n questionName: questionEntry.question.name,\n questionDescription: questionEntry.question.description,\n isFallback: questionEntry.isFallback,\n rawQuestion: questionEntry.question,\n } satisfies MultiOutcomeMarket;\n }\n\n return {\n type: \"labelledBinary\",\n outcomeId: outcome.outcome,\n name: outcome.name,\n description: outcome.description,\n sides,\n raw: outcome,\n } satisfies LabelledBinaryMarket;\n });\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Event Adapter - maps outcomeMeta to PredictionEvent / PredictionCategory\n//\n// Mapping:\n// HL Question → PredictionEvent (groups multiple outcomes)\n// HL Outcome → PredictionMarket (has 2 sides as outcomes)\n// HL SideSpec → PredictionOutcome\n// Standalone outcomes (not in a question) become their own event.\n// ---------------------------------------------------------------------------\n\nimport type {\n PredictionCategory,\n PredictionEvent,\n PredictionMarket,\n PredictionOutcome,\n} from \"../../types/event\";\nimport type {\n FetchMarketsParams,\n HIP4Market,\n MarketsByQuestion,\n MarketsByType,\n MultiOutcomeMarket,\n} from \"../../types/hip4-market\";\nimport type { PredictionEventAdapter, Unsubscribe } from \"../types\";\nimport type { HIP4Client } from \"./client\";\nimport { sideCoin } from \"./client\";\nimport { classifyAllOutcomes } from \"./market-classification\";\nimport type {\n HLOutcome,\n HLOutcomeMeta,\n HLQuestion,\n HLWsOutcomeMetaUpdate,\n HLWsOutcomeMetaUpdates,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Categories\n// ---------------------------------------------------------------------------\n\nconst CATEGORIES: PredictionCategory[] = [\n { id: \"custom\", name: \"Custom\", slug: \"custom\" },\n { id: \"recurring\", name: \"Recurring\", slug: \"recurring\" },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isRecurring(outcome: HLOutcome): boolean {\n return outcome.name === \"Recurring\";\n}\n\n/** Parse \"class:priceBinary|underlying:BTC|expiry:20260311-0300|targetPrice:69070|period:1d\" */\nfunction parseRecurringDescription(\n desc: string,\n): Record<string, string> | null {\n if (!desc.includes(\"|\")) return null;\n const result: Record<string, string> = {};\n for (const segment of desc.split(\"|\")) {\n const [key, ...rest] = segment.split(\":\");\n if (key && rest.length > 0) {\n result[key] = rest.join(\":\");\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction recurringTitle(outcome: HLOutcome): string {\n const parsed = parseRecurringDescription(outcome.description);\n if (!parsed) return `Outcome #${outcome.outcome}`;\n\n const underlying = parsed.underlying ?? \"???\";\n const target = parsed.targetPrice ?? \"???\";\n const period = parsed.period ?? \"\";\n\n if (parsed.class === \"priceBinary\") {\n return `${underlying} > $${target} (${period})`;\n }\n return `${underlying} ${parsed.class ?? \"outcome\"} (${period})`;\n}\n\nfunction recurringDescription(outcome: HLOutcome): string {\n const parsed = parseRecurringDescription(outcome.description);\n if (!parsed) return outcome.description;\n\n const expiry = parsed.expiry ?? \"unknown\";\n return `Will ${parsed.underlying ?? \"asset\"} be above $${parsed.targetPrice ?? \"?\"} by ${expiry}?`;\n}\n\nfunction mapOutcomeToMarket(\n outcome: HLOutcome,\n eventId: string,\n): PredictionMarket {\n const outcomes: PredictionOutcome[] = outcome.sideSpecs.map(\n (spec, sideIndex) => ({\n name: spec.name,\n tokenId: sideCoin(outcome.outcome, sideIndex),\n price: \"0\",\n }),\n );\n\n return {\n id: String(outcome.outcome),\n eventId,\n question: isRecurring(outcome)\n ? recurringDescription(outcome)\n : outcome.name,\n outcomes,\n volume: \"0\",\n liquidity: \"0\",\n };\n}\n\nfunction mapQuestionToEvent(\n question: HLQuestion,\n outcomeMap: Map<number, HLOutcome>,\n): PredictionEvent {\n const eventId = `q${question.question}`;\n const allOutcomeIds = [\n ...question.namedOutcomes,\n question.fallbackOutcome,\n ].filter((id) => outcomeMap.has(id));\n\n const markets = allOutcomeIds\n .map((id) => outcomeMap.get(id)!)\n .map((o) => mapOutcomeToMarket(o, eventId));\n\n const settled = new Set(question.settledNamedOutcomes);\n const hasUnsettled = question.namedOutcomes.some((id) => !settled.has(id));\n\n return {\n id: eventId,\n title: question.name,\n description: question.description,\n category: \"custom\",\n markets,\n totalVolume: \"0\",\n endDate: \"\",\n status: hasUnsettled ? \"active\" : \"resolved\",\n };\n}\n\nfunction mapStandaloneOutcomeToEvent(outcome: HLOutcome): PredictionEvent {\n const eventId = `o${outcome.outcome}`;\n const recurring = isRecurring(outcome);\n\n return {\n id: eventId,\n title: recurring ? recurringTitle(outcome) : outcome.name,\n description: recurring\n ? recurringDescription(outcome)\n : outcome.description,\n category: recurring ? \"recurring\" : \"custom\",\n markets: [mapOutcomeToMarket(outcome, eventId)],\n totalVolume: \"0\",\n endDate: recurring\n ? (parseRecurringDescription(outcome.description)?.expiry ?? \"\")\n : \"\",\n status: \"active\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// HIP4EventAdapter\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve side names for an outcome by ID.\n * Returns [side0Name, side1Name] (e.g. [\"Yes\", \"No\"] or [\"Hypurr\", \"Usain Bolt\"]).\n * Returns null if the outcome ID is unknown.\n */\nexport type SideNameResolver = (outcomeId: number) => [string, string] | null;\n\nexport class HIP4EventAdapter implements PredictionEventAdapter {\n private cache: { events: PredictionEvent[]; timestamp: number } | null = null;\n private metaCache: {\n meta: HLOutcomeMeta;\n mids: Record<string, string>;\n markets: HIP4Market[];\n timestamp: number;\n } | null = null;\n private static readonly CACHE_TTL_MS = 30_000;\n\n /** Side names from outcomeMeta. Populated once, never cleared (sideSpecs don't change). */\n private sideNames: Map<number, [string, string]> | null = null;\n\n constructor(private readonly client: HIP4Client) {}\n\n /** Returns a resolver function that looks up side names by outcome ID. */\n getSideNameResolver(): SideNameResolver {\n return (outcomeId: number) => this.sideNames?.get(outcomeId) ?? null;\n }\n\n /** Ensure sideNames are loaded. Call before using the resolver if data may not be cached yet. */\n async ensureSideNames(): Promise<void> {\n if (this.sideNames) return;\n const meta = await this.client.fetchOutcomeMeta();\n this.populateSideNames(meta);\n }\n\n /**\n * Subscribe to live outcome-meta updates (HIP-4 catalog changes).\n *\n * Each frame is an array of one or more updates. The handler is invoked\n * once per update with the discriminated payload. Internally we also:\n * - extend `sideNames` for newly created outcomes (so `getSideNameResolver`\n * returns real names instead of falling back to \"Side 0/1\")\n * - invalidate the events + markets caches so the next read refetches\n * and reflects the change\n *\n * Returns an unsubscribe callback.\n */\n subscribeOutcomeMetaUpdates(\n onData: (update: HLWsOutcomeMetaUpdate) => void,\n ): Unsubscribe {\n return this.client.subscribe(\n { type: \"outcomeMetaUpdates\" },\n (raw: unknown) => {\n if (!Array.isArray(raw)) return;\n const updates = raw as HLWsOutcomeMetaUpdates;\n for (const update of updates) {\n this.applyMetaUpdate(update);\n onData(update);\n }\n },\n );\n }\n\n private applyMetaUpdate(update: HLWsOutcomeMetaUpdate): void {\n if (\"outcomeCreated\" in update) {\n const spec = update.outcomeCreated;\n // Grow sideNames in place so callers using getSideNameResolver pick\n // up the new outcome immediately. populateSideNames is gated on\n // `!sideNames` and won't overwrite existing entries.\n if (this.sideNames && spec.sideSpecs.length >= 2) {\n this.sideNames.set(spec.outcome, [\n spec.sideSpecs[0].name,\n spec.sideSpecs[1].name,\n ]);\n }\n }\n // All four variants change the catalog - drop the time-based caches so\n // the next loadEvents/loadMarkets call refetches.\n this.cache = null;\n this.metaCache = null;\n }\n\n private populateSideNames(meta: HLOutcomeMeta): void {\n if (this.sideNames) return;\n this.sideNames = new Map();\n for (const o of meta.outcomes) {\n if (o.sideSpecs.length >= 2) {\n this.sideNames.set(o.outcome, [\n o.sideSpecs[0].name,\n o.sideSpecs[1].name,\n ]);\n }\n }\n }\n\n async fetchEvents(\n params: {\n category?: string;\n active?: boolean;\n limit?: number;\n offset?: number;\n query?: string;\n } = {},\n ): Promise<PredictionEvent[]> {\n let events = await this.loadEvents();\n\n if (params.category && params.category !== \"all\") {\n events = events.filter((e) => e.category === params.category);\n }\n\n if (params.active) {\n events = events.filter((e) => e.status === \"active\");\n }\n\n if (params.query) {\n const q = params.query.toLowerCase();\n events = events.filter(\n (e) =>\n e.title.toLowerCase().includes(q) ||\n e.description.toLowerCase().includes(q),\n );\n }\n\n const offset = params.offset ?? 0;\n const limit = params.limit ?? 50;\n return events.slice(offset, offset + limit);\n }\n\n async fetchEvent(eventId: string): Promise<PredictionEvent> {\n const events = await this.loadEvents();\n const event = events.find((e) => e.id === eventId);\n if (!event) {\n throw new Error(`HIP-4 event not found: ${eventId}`);\n }\n return event;\n }\n\n async fetchCategories(): Promise<PredictionCategory[]> {\n return CATEGORIES;\n }\n\n // -------------------------------------------------------------------------\n // fetchMarkets - typed HIP4Market discovery\n // -------------------------------------------------------------------------\n\n /**\n * Fetch and classify all HIP-4 markets.\n *\n * Supports optional type filtering, groupBy, limit, and offset.\n * Results are cached for CACHE_TTL_MS alongside the events cache.\n */\n async fetchMarkets(\n params?: FetchMarketsParams,\n ): Promise<HIP4Market[] | MarketsByType | MarketsByQuestion>;\n async fetchMarkets(\n params: FetchMarketsParams = {},\n ): Promise<HIP4Market[] | MarketsByType | MarketsByQuestion> {\n const allMarkets = await this.loadMarkets();\n\n // Filter by type\n let filtered = params.type\n ? allMarkets.filter((m) => m.type === params.type)\n : allMarkets;\n\n // groupBy\n if (params.groupBy === \"type\") {\n const grouped: MarketsByType = {};\n for (const m of filtered) {\n (grouped[m.type] ??= []).push(m);\n }\n return grouped;\n }\n\n if (params.groupBy === \"question\") {\n const grouped: MarketsByQuestion = {};\n for (const m of filtered) {\n const key =\n m.type === \"multiOutcome\"\n ? String((m as MultiOutcomeMarket).questionId)\n : \"standalone\";\n (grouped[key] ??= []).push(m);\n }\n return grouped;\n }\n\n // Pagination\n const offset = params.offset ?? 0;\n const limit = params.limit ?? filtered.length;\n return filtered.slice(offset, offset + limit);\n }\n\n private async loadMarkets(): Promise<HIP4Market[]> {\n const now = Date.now();\n if (\n this.metaCache &&\n now - this.metaCache.timestamp < HIP4EventAdapter.CACHE_TTL_MS\n ) {\n return this.metaCache.markets;\n }\n\n const [meta, mids] = await Promise.all([\n this.client.fetchOutcomeMeta(),\n this.client.fetchAllMids().catch(() => ({}) as Record<string, string>),\n ]);\n\n this.populateSideNames(meta);\n\n const markets = classifyAllOutcomes(meta.outcomes, meta.questions);\n\n this.metaCache = { meta, mids, markets, timestamp: now };\n return markets;\n }\n\n // -------------------------------------------------------------------------\n // loadEvents - legacy PredictionEvent API\n // -------------------------------------------------------------------------\n\n private async loadEvents(): Promise<PredictionEvent[]> {\n const now = Date.now();\n if (\n this.cache &&\n now - this.cache.timestamp < HIP4EventAdapter.CACHE_TTL_MS\n ) {\n return this.cache.events;\n }\n\n const [meta, mids] = await Promise.all([\n this.client.fetchOutcomeMeta(),\n this.client.fetchAllMids().catch(() => ({}) as Record<string, string>),\n ]);\n\n this.populateSideNames(meta);\n\n const events = buildEventsFromMeta(meta);\n\n for (const event of events) {\n for (const market of event.markets) {\n for (const outcome of market.outcomes) {\n const mid = mids[outcome.tokenId];\n if (mid) {\n outcome.price = mid;\n }\n }\n }\n }\n\n this.cache = { events, timestamp: now };\n return events;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build event list from outcomeMeta\n// ---------------------------------------------------------------------------\n\nfunction buildEventsFromMeta(meta: HLOutcomeMeta): PredictionEvent[] {\n const outcomeMap = new Map<number, HLOutcome>();\n for (const o of meta.outcomes) {\n outcomeMap.set(o.outcome, o);\n }\n\n const claimedOutcomes = new Set<number>();\n const events: PredictionEvent[] = [];\n\n for (const q of meta.questions) {\n for (const id of q.namedOutcomes) claimedOutcomes.add(id);\n claimedOutcomes.add(q.fallbackOutcome);\n events.push(mapQuestionToEvent(q, outcomeMap));\n }\n\n for (const o of meta.outcomes) {\n if (!claimedOutcomes.has(o.outcome)) {\n events.push(mapStandaloneOutcomeToEvent(o));\n }\n }\n\n return events;\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Market Data Adapter\n//\n// marketId = outcome ID as string (e.g. \"10\")\n// Order book fetched for side 0 (first side / \"Yes\").\n// Prices fetched for both sides via allMids.\n// ---------------------------------------------------------------------------\n\nimport type {\n PredictionOrderBook,\n PredictionPrice,\n PredictionTrade,\n} from \"../../types/market\";\nimport type { PredictionMarketDataAdapter, Unsubscribe } from \"../types\";\nimport type { HIP4Client } from \"./client\";\nimport { sideCoin } from \"./client\";\nimport type { SideNameResolver } from \"./events\";\nimport type {\n HLL2Book,\n HLTrade,\n HLWsActivePerpAssetCtxData,\n HLWsActiveSpotAssetCtxData,\n HLWsAllMidsData,\n HLWsL2BookData,\n HLWsSpotAssetCtxsData,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction mapBook(raw: HLL2Book, marketId: string): PredictionOrderBook {\n const [bids, asks] = raw.levels;\n return {\n marketId,\n bids: bids.map((l) => ({ price: l.px, size: l.sz })),\n asks: asks.map((l) => ({ price: l.px, size: l.sz })),\n timestamp: raw.time,\n };\n}\n\nfunction mapWsBook(raw: HLWsL2BookData, marketId: string): PredictionOrderBook {\n const [bids, asks] = raw.levels;\n return {\n marketId,\n bids: bids.map((l) => ({ price: l.px, size: l.sz })),\n asks: asks.map((l) => ({ price: l.px, size: l.sz })),\n timestamp: raw.time,\n };\n}\n\nfunction mapTrade(raw: HLTrade, marketId: string): PredictionTrade {\n return {\n id: String(raw.tid),\n marketId,\n outcome: raw.coin,\n side: raw.side === \"B\" ? \"buy\" : \"sell\",\n price: raw.px,\n size: raw.sz,\n timestamp: raw.time,\n };\n}\n\n// ---------------------------------------------------------------------------\n// HIP4MarketDataAdapter\n// ---------------------------------------------------------------------------\n\nexport class HIP4MarketDataAdapter implements PredictionMarketDataAdapter {\n private midsCache: { data: Record<string, string>; time: number } | null =\n null;\n private static readonly MIDS_CACHE_TTL = 5_000;\n\n private readonly resolveSideNames: SideNameResolver;\n private readonly ensureSideNames?: () => Promise<void>;\n\n constructor(\n private readonly client: HIP4Client,\n resolveSideNames?: SideNameResolver,\n ensureSideNames?: () => Promise<void>,\n ) {\n this.resolveSideNames = resolveSideNames ?? (() => null);\n this.ensureSideNames = ensureSideNames;\n }\n\n async fetchOrderBook(\n marketId: string,\n sideIndex: number = 0,\n ): Promise<PredictionOrderBook> {\n const outcomeId = parseInt(marketId, 10);\n const coin = sideCoin(outcomeId, sideIndex);\n const raw = await this.client.fetchL2Book(coin);\n return mapBook(raw, marketId);\n }\n\n private sideNamesFor(marketId: string): [string, string] {\n const outcomeId = parseInt(marketId, 10);\n return this.resolveSideNames(outcomeId) ?? [\"Side 0\", \"Side 1\"];\n }\n\n async fetchPrice(marketId: string): Promise<PredictionPrice> {\n await this.ensureSideNames?.();\n const outcomeId = parseInt(marketId, 10);\n const mids = await this.getMids();\n const [name0, name1] = this.sideNamesFor(marketId);\n\n const side0Coin = sideCoin(outcomeId, 0);\n const side1Coin = sideCoin(outcomeId, 1);\n\n const side0Mid = mids[side0Coin] ?? \"0\";\n const side1Mid = mids[side1Coin] ?? \"0\";\n\n return {\n marketId,\n outcomes: [\n { name: name0, price: side0Mid, midpoint: side0Mid },\n { name: name1, price: side1Mid, midpoint: side1Mid },\n ],\n timestamp: Date.now(),\n };\n }\n\n async fetchTrades(\n marketId: string,\n limit = 50,\n sideIndex: number = 0,\n ): Promise<PredictionTrade[]> {\n const outcomeId = parseInt(marketId, 10);\n const coin = sideCoin(outcomeId, sideIndex);\n const raw = await this.client.fetchRecentTrades(coin);\n return raw.slice(0, limit).map((t) => mapTrade(t, marketId));\n }\n\n async fetchCandles(\n marketId: string,\n interval = \"1h\",\n startTime?: number,\n endTime?: number,\n ): Promise<\n Array<{\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n }>\n > {\n const outcomeId = parseInt(marketId, 10);\n const coin = sideCoin(outcomeId, 0);\n const now = Date.now();\n const start = startTime ?? now - 14 * 24 * 60 * 60 * 1000;\n const end = endTime ?? now;\n const raw = await this.client.fetchCandleSnapshot(\n coin,\n interval,\n start,\n end,\n );\n return raw.map((c) => ({\n time: c.t / 1000,\n open: parseFloat(c.o),\n high: parseFloat(c.h),\n low: parseFloat(c.l),\n close: parseFloat(c.c),\n volume: parseFloat(c.v),\n }));\n }\n\n // -- WebSocket subscriptions --------------------------------------------\n\n subscribeOrderBook(\n marketId: string,\n onData: (book: PredictionOrderBook) => void,\n ): Unsubscribe {\n const outcomeId = parseInt(marketId, 10);\n const coin = sideCoin(outcomeId, 0);\n return this.subscribeWs(\"l2Book\", coin, (data) => {\n if (isL2BookData(data) && data.coin === coin) {\n onData(mapWsBook(data, marketId));\n }\n });\n }\n\n subscribePrice(\n marketId: string,\n onData: (price: PredictionPrice) => void,\n ): Unsubscribe {\n const outcomeId = parseInt(marketId, 10);\n const coin0 = sideCoin(outcomeId, 0);\n const coin1 = sideCoin(outcomeId, 1);\n\n return this.subscribeWs(\"allMids\", \"*\", (data) => {\n if (!isAllMidsData(data)) return;\n const mids = data.mids as Record<string, string>;\n const side0Mid = mids[coin0];\n const side1Mid = mids[coin1];\n if (side0Mid === undefined && side1Mid === undefined) return;\n\n // Resolve names on each callback so we pick up sideSpec names\n // once they're loaded (may be \"Side 0\"/\"Side 1\" on first tick)\n const [n0, n1] = this.sideNamesFor(marketId);\n\n onData({\n marketId,\n outcomes: [\n {\n name: n0,\n price: side0Mid ?? \"0\",\n midpoint: side0Mid ?? \"0\",\n },\n {\n name: n1,\n price: side1Mid ?? \"0\",\n midpoint: side1Mid ?? \"0\",\n },\n ],\n timestamp: Date.now(),\n });\n });\n }\n\n subscribeTrades(\n marketId: string,\n onData: (trade: PredictionTrade) => void,\n ): Unsubscribe {\n const outcomeId = parseInt(marketId, 10);\n const coin = sideCoin(outcomeId, 0);\n return this.subscribeWs(\"trades\", coin, (data) => {\n if (!isTradesData(data)) return;\n for (const t of data) {\n const trade = t as HLTrade;\n if (trade.coin === coin) {\n onData(mapTrade(trade, marketId));\n }\n }\n });\n }\n\n subscribeAllMids(onData: (data: HLWsAllMidsData) => void): Unsubscribe {\n return this.subscribeWs(\"allMids\", \"*\", (data) => {\n if (isAllMidsData(data)) {\n onData(data);\n }\n });\n }\n\n /**\n * Subscribe to real-time asset context (volume, mark price, OI) for a spot coin.\n *\n * HL subscription type is \"activeAssetCtx\" but the response channel for spot\n * assets is \"activeSpotAssetCtx\" (perps use \"activeAssetCtx\" instead).\n * We only handle spot here since HIP-4 prediction tokens are spot assets.\n * If perps support is added, a separate method or channel-aware routing is needed.\n */\n subscribeActiveAssetCtx(\n coin: string,\n onData: (data: HLWsActiveSpotAssetCtxData) => void,\n ): Unsubscribe {\n return this.subscribeWs(\n \"activeSpotAssetCtx\",\n coin,\n (data) => {\n if (isActiveAssetCtxData(data) && data.coin === coin) {\n onData(data);\n }\n },\n \"activeAssetCtx\",\n );\n }\n\n /**\n * Subscribe to bulk spot asset context updates for ALL spot coins.\n * Undocumented HL subscription type \"spotAssetCtxs\" - streams an array\n * of SpotAssetCtx entries on each update.\n */\n subscribeSpotAssetCtxs(\n onData: (data: HLWsSpotAssetCtxsData) => void,\n ): Unsubscribe {\n return this.subscribeWs(\"spotAssetCtxs\", \"*\", (data) => {\n if (isSpotAssetCtxsData(data)) {\n onData(data);\n }\n });\n }\n\n /**\n * Subscribe to real-time perp asset context (mark price, oracle, funding).\n * For perps, both subscription type and response channel are \"activeAssetCtx\".\n */\n subscribePerpAssetCtx(\n coin: string,\n onData: (data: HLWsActivePerpAssetCtxData) => void,\n ): Unsubscribe {\n return this.subscribeWs(\"activeAssetCtx\", coin, (data) => {\n if (isActivePerpAssetCtxData(data) && data.coin === coin) {\n onData(data);\n }\n });\n }\n\n /** No-op - WebSocket lifecycle is managed by the shared HIP4Client. */\n destroy(): void {\n // Individual subscriptions are cleaned up by their unsubscribe functions.\n }\n\n // -- Internal helpers ---------------------------------------------------\n\n private async getMids(): Promise<Record<string, string>> {\n const now = Date.now();\n if (\n this.midsCache &&\n now - this.midsCache.time < HIP4MarketDataAdapter.MIDS_CACHE_TTL\n ) {\n return this.midsCache.data;\n }\n const data = await this.client.fetchAllMids();\n this.midsCache = { data, time: now };\n return data;\n }\n\n /**\n * Subscribe to a WebSocket channel via the shared HIP4Client.\n *\n * @param channel Response channel name used for message routing (e.g. \"l2Book\").\n * @param coin Coin filter (\"*\" for channel-only subscriptions).\n * @param onData Callback fired on each matching message.\n * @param subscriptionType Wire type sent in the subscribe message. Defaults\n * to `channel`. Needed when HL uses a different name in the subscribe\n * request vs the response channel (e.g. send \"activeAssetCtx\" but receive\n * on \"activeSpotAssetCtx\" for spot assets).\n */\n private subscribeWs(\n channel: string,\n coin: string,\n onData: (data: unknown) => void,\n subscriptionType?: string,\n ): Unsubscribe {\n const wireType = subscriptionType ?? channel;\n const subscription: Record<string, unknown> = { type: wireType };\n if (coin !== \"*\") {\n subscription.coin = coin;\n }\n\n return this.client.subscribe(\n subscription as { type: string },\n onData,\n wireType !== channel ? { responseChannel: channel } : undefined,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nfunction isL2BookData(data: unknown): data is HLWsL2BookData {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"coin\" in data &&\n \"levels\" in data\n );\n}\n\nfunction isAllMidsData(data: unknown): data is HLWsAllMidsData {\n return typeof data === \"object\" && data !== null && \"mids\" in data;\n}\n\nfunction isTradesData(data: unknown): data is HLTrade[] {\n return Array.isArray(data);\n}\n\nfunction isActiveAssetCtxData(\n data: unknown,\n): data is HLWsActiveSpotAssetCtxData {\n return (\n typeof data === \"object\" && data !== null && \"coin\" in data && \"ctx\" in data\n );\n}\n\nfunction isActivePerpAssetCtxData(\n data: unknown,\n): data is HLWsActivePerpAssetCtxData {\n return (\n typeof data === \"object\" && data !== null && \"coin\" in data && \"ctx\" in data\n );\n}\n\nfunction isSpotAssetCtxsData(data: unknown): data is HLWsSpotAssetCtxsData {\n return (\n Array.isArray(data) &&\n data.length > 0 &&\n typeof data[0] === \"object\" &&\n data[0] !== null &&\n \"coin\" in data[0] &&\n \"markPx\" in data[0]\n );\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Pricing Utilities\n//\n// Tick size computation (5 significant figures), price formatting with\n// trailing-zero stripping, and minimum order size calculation.\n//\n// The exchange strips trailing zeros before msgpack hashing.\n// Sending \"0.650\" when the server hashes \"0.65\" produces a different hash,\n// causing wrong signer recovery. Always use formatPrice() or stripZeros()\n// for any value in a signed payload.\n// ---------------------------------------------------------------------------\n\nimport { toDecimal, toNum, div, mul, pow, abs } from \"../../lib/precision/primitives\";\nimport { clamp, ceilToStep } from \"../../lib/precision/primitives\";\nimport { formatSigFig, fixed } from \"../../lib/precision/io\";\n\nexport const MIN_NOTIONAL = 10;\n\n// ---------------------------------------------------------------------------\n// Tick size\n// ---------------------------------------------------------------------------\n\nexport function computeTickSize(price: number): number {\n if (price <= 0) return 0.00001;\n const d = toDecimal(price);\n const magnitude = d.floorLog10();\n return toNum(pow(\"10\", magnitude.minus(4).toString()));\n}\n\nexport function roundToTick(price: number): number {\n const tick = computeTickSize(price);\n const d = toDecimal(price);\n const t = toDecimal(tick);\n return toNum(d.dividedBy(t).round().times(t).toString());\n}\n\n// ---------------------------------------------------------------------------\n// Price formatting\n// ---------------------------------------------------------------------------\n\nexport function formatPrice(price: number): string {\n if (price <= 0) return \"0\";\n const rounded = roundToTick(price);\n const tick = computeTickSize(rounded);\n const decimals = Math.max(0, -toNum(toDecimal(tick).floorLog10().toString()));\n let s = fixed(rounded, decimals);\n if (s.includes(\".\")) {\n s = s.replace(/\\.?0+$/, \"\");\n }\n return s;\n}\n\nexport function stripZeros(s: string): string {\n if (!s.includes(\".\")) return s;\n return s.replace(/\\.?0+$/, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Minimum order size\n// ---------------------------------------------------------------------------\n\nexport function getMinShares(markPx: number): number {\n const effective = toNum(clamp(\n toDecimal(Math.min(markPx, 1 - markPx)).toString(),\n \"0.01\",\n \"1\",\n ));\n return Math.ceil(MIN_NOTIONAL / effective);\n}\n","// ---------------------------------------------------------------------------\n// Raw Hyperliquid HIP-4 API response types - reverse-engineered from testnet\n// ---------------------------------------------------------------------------\n\n// -- outcomeMeta --------------------------------------------------------------\n\nexport interface HLOutcomeMeta {\n outcomes: HLOutcome[];\n questions: HLQuestion[];\n}\n\nexport interface HLOutcome {\n outcome: number;\n name: string;\n description: string;\n sideSpecs: HLSideSpec[];\n}\n\nexport interface HLSideSpec {\n name: string;\n token?: number;\n}\n\nexport interface HLQuestion {\n question: number;\n name: string;\n description: string;\n fallbackOutcome: number;\n namedOutcomes: number[];\n settledNamedOutcomes: number[];\n}\n\nexport interface HLSettledOutcome {\n spec: HLOutcome;\n settleFraction: string;\n details: string;\n /**\n * Parent question, returned by HL for outcomes that belong to a question\n * group (priceBucket, multiOutcome). Omitted for standalone priceBinary\n * outcomes. The `description` here is the parent question's description\n * (e.g. `class:priceBucket|underlying:BTC|...`), which is what consumers\n * need to recover bucket bounds after the question itself has been\n * removed from `outcomeMeta`.\n */\n question?: {\n /** Inner shape mirrors HL's API: `{ settled: <questionId> }`. */\n question: { settled: number };\n name: string;\n description: string;\n };\n}\n\n// -- L2 book (standard HL format) -------------------------------------------\n\nexport interface HLL2Book {\n coin: string;\n time: number;\n levels: [HLL2Level[], HLL2Level[]]; // [bids, asks]\n}\n\nexport interface HLL2Level {\n px: string;\n sz: string;\n n: number;\n}\n\n// -- Recent trades (standard HL format) -------------------------------------\n\nexport interface HLTrade {\n coin: string;\n side: \"B\" | \"A\"; // B = buy, A = sell (ask)\n px: string;\n sz: string;\n time: number;\n hash: string;\n tid: number;\n users: [string, string];\n}\n\n// -- Candle snapshot (standard HL format) -----------------------------------\n\nexport interface HLCandle {\n t: number; // open time\n T: number; // close time\n s: string; // symbol\n i: string; // interval\n o: string; // open\n c: string; // close\n h: string; // high\n l: string; // low\n v: string; // volume\n n: number; // trade count\n}\n\n// -- allMids ----------------------------------------------------------------\n\nexport type HLAllMids = Record<string, string>;\n\n// -- clearinghouseState (positions) -----------------------------------------\n\nexport interface HLClearinghouseState {\n marginSummary: {\n accountValue: string;\n totalNtlPos: string;\n totalRawUsd: string;\n totalMarginUsed: string;\n };\n crossMarginSummary: {\n accountValue: string;\n totalNtlPos: string;\n totalRawUsd: string;\n totalMarginUsed: string;\n };\n crossMaintenanceMarginUsed: string;\n withdrawable: string;\n assetPositions: HLAssetPosition[];\n time: number;\n}\n\nexport interface HLAssetPosition {\n type: string;\n position: {\n coin: string;\n szi: string;\n entryPx: string;\n positionValue: string;\n unrealizedPnl: string;\n returnOnEquity: string;\n liquidationPx: string | null;\n marginUsed: string;\n maxLeverage: number;\n leverage: {\n type: string;\n value: number;\n rawUsd?: string;\n };\n cumFunding: {\n allTime: string;\n sinceOpen: string;\n sinceChange: string;\n };\n };\n}\n\n// -- spotClearinghouseState -------------------------------------------------\n\n/** Spot clearinghouse state - HIP-4 prediction balances live here */\nexport interface HLSpotClearinghouseState {\n balances: Array<{\n coin: string;\n token: number;\n hold: string;\n total: string;\n entryNtl: string;\n }>;\n}\n\n// -- frontendOpenOrders ----------------------------------------------------\n\n/** Frontend-formatted open order */\nexport interface HLFrontendOrder {\n coin: string;\n side: \"B\" | \"A\";\n limitPx: string;\n sz: string;\n oid: number;\n timestamp: number;\n origSz: string;\n reduceOnly: boolean;\n orderType: string;\n tif: string | null;\n cloid: string | null;\n triggerCondition?: string;\n isTrigger?: boolean;\n triggerPx?: string;\n children?: unknown[];\n isPositionTpsl?: boolean;\n}\n\n// -- userFills --------------------------------------------------------------\n\nexport interface HLFill {\n coin: string;\n px: string;\n sz: string;\n side: \"B\" | \"A\";\n time: number;\n startPosition: string;\n dir: string;\n closedPnl: string;\n hash: string;\n oid: number;\n crossed: boolean;\n fee: string;\n tid: number;\n feeToken: string;\n}\n\nexport interface HLWsUserFillsEvent {\n readonly isSnapshot: boolean;\n readonly user: string;\n readonly fills: HLFill[];\n}\n\n// -- Exchange API (order placement) -----------------------------------------\n\nexport interface HLOrderAction {\n type: \"order\";\n orders: HLOrderWire[];\n grouping: \"na\";\n}\n\nexport interface HLOrderWire {\n a: number; // asset index\n b: boolean; // true = buy\n p: string; // price\n s: string; // size\n r: boolean; // reduce only\n t: HLOrderType;\n /** Client order ID (hex string). Optional. */\n c?: string;\n}\n\nexport type HLOrderType =\n | { limit: { tif: \"Gtc\" | \"Ioc\" | \"Alo\" | \"FrontendMarket\" } }\n | { trigger: { triggerPx: string; isMarket: boolean; tpsl: \"tp\" | \"sl\" } };\n\nexport interface HLExchangeRequest {\n action: HLOrderAction;\n nonce: number;\n signature: HLSignature;\n vaultAddress: string | null;\n}\n\nexport interface HLSignature {\n r: string;\n s: string;\n v: number;\n}\n\nexport interface HLExchangeResponse {\n status: \"ok\" | \"err\";\n response?: {\n type: \"order\";\n data: {\n statuses: HLOrderStatus[];\n };\n };\n}\n\nexport type HLOrderStatus =\n | {\n filled: {\n totalSz: string;\n avgPx: string;\n oid: number;\n };\n }\n | {\n resting: {\n oid: number;\n };\n }\n | {\n error: string;\n };\n\n// -- userOutcome actions ----------------------------------------------------\n//\n// HIP-4 share-conversion primitives. All four variants are wrapped under the\n// same `type: \"userOutcome\"` envelope, with a single sub-action key naming\n// the operation. Signed via L1 agent signing (same path as `order` / `cancel`).\n//\n// Ref: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\n// - splitOutcome: X quote → X Yes shares + X No shares of one outcome\n// - mergeOutcome: X Yes + X No shares of one outcome → X quote (null = max)\n// - mergeQuestion: X Yes shares from every outcome of a question → X quote\n// - negateQuestion: X No shares of one outcome → X Yes shares of every other\n// outcome in the same question\n\nexport interface HLSplitOutcomeAction {\n type: \"userOutcome\";\n splitOutcome: { outcome: number; amount: string };\n}\n\nexport interface HLMergeOutcomeAction {\n type: \"userOutcome\";\n mergeOutcome: { outcome: number; amount: string | null };\n}\n\nexport interface HLMergeQuestionAction {\n type: \"userOutcome\";\n mergeQuestion: { question: number; amount: string | null };\n}\n\n/**\n * The on-wire sub-key is `negateOutcome` (matching the page heading), NOT\n * `negateQuestion` as the docs body's example renders it. Confirmed by\n * inspecting Hyperliquid's own testnet \"Convert Outcomes\" UI on 2026-05-07\n * - its `/exchange` POST sends `{ negateOutcome: { question, outcome,\n * amount } }`. The docs body is a typo; the heading is correct.\n */\nexport interface HLNegateOutcomeAction {\n type: \"userOutcome\";\n negateOutcome: { question: number; outcome: number; amount: string };\n}\n\nexport type HLUserOutcomeAction =\n | HLSplitOutcomeAction\n | HLMergeOutcomeAction\n | HLMergeQuestionAction\n | HLNegateOutcomeAction;\n\n// -- scheduleCancel action --------------------------------------------------\n//\n// HL \"dead-man's switch\": registers a future timestamp at which every\n// open order belonging to the signing agent will be cancelled. Per-agent,\n// not per-order - submitting a new schedule replaces the previous one.\n// Passing `time: null` clears the schedule.\n//\n// Used to prevent resting limit orders from sitting through a market's\n// settlement auction: arm 1h before expiry, never get picked off by a\n// stale quote.\n\nexport interface HLScheduleCancelAction {\n type: \"scheduleCancel\";\n /** Unix milliseconds at which HL cancels every open order from this agent. `null` clears. */\n time: number | null;\n}\n\n// -- Cancel action ----------------------------------------------------------\n\nexport interface HLCancelAction {\n type: \"cancel\";\n cancels: Array<{ a: number; o: number }>;\n}\n\nexport interface HLCancelRequest {\n action: HLCancelAction;\n nonce: number;\n signature: HLSignature;\n vaultAddress: string | null;\n}\n\nexport type HLCancelStatus = \"success\" | { error: string };\n\nexport interface HLCancelResponse {\n status: \"ok\" | \"err\";\n response?: {\n type: \"cancel\";\n data: {\n statuses: HLCancelStatus[];\n };\n };\n}\n\n// -- Modify action ----------------------------------------------------------\n\n/**\n * Modify an existing order. HL preserves queue priority for size-only\n * changes; price changes move the order to the back of the queue at the\n * new level. See https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\n */\nexport interface HLModifyAction {\n type: \"modify\";\n oid: number;\n order: HLOrderWire;\n}\n\nexport interface HLBatchModifyAction {\n type: \"batchModify\";\n modifies: Array<{\n oid: number;\n order: HLOrderWire;\n }>;\n}\n\n/**\n * HL's modify response. On success, `response` is the structured object\n * with per-order statuses. On failure (`status: \"err\"`), HL returns the\n * error reason as a plain string in `response` - surface it instead of\n * discarding the payload.\n */\nexport interface HLModifyResponse {\n status: \"ok\" | \"err\";\n response?:\n | {\n type: \"modify\" | \"batchModify\";\n data: {\n statuses: HLOrderStatus[];\n };\n }\n | string;\n}\n\n// -- WebSocket messages -----------------------------------------------------\n\nexport interface HLWsMessage {\n channel: string;\n data: unknown;\n}\n\nexport interface HLWsL2BookData {\n coin: string;\n time: number;\n levels: [\n Array<{ px: string; sz: string; n: number }>,\n Array<{ px: string; sz: string; n: number }>,\n ];\n spread?: string;\n}\n\n/** BBO (Best Bid and Offer) WebSocket data - sent when the top-of-book changes. */\nexport interface HLWsBboData {\n coin: string;\n time: number;\n bbo: [HLWsBboLevel | null, HLWsBboLevel | null]; // [bestBid, bestAsk]\n}\n\nexport interface HLWsBboLevel {\n px: string;\n sz: string;\n n: number;\n}\n\nexport interface HLWsTradeData {\n coin: string;\n side: \"B\" | \"A\";\n px: string;\n sz: string;\n time: number;\n hash: string;\n tid: number;\n}\n\n// -- allMids (WebSocket) ----------------------------------------------------\n\nexport interface HLWsAllMidsData {\n mids: Record<string, string>;\n}\n\n// -- activeAssetCtx (WebSocket) ---------------------------------------------\n//\n// HL subscription type is \"activeAssetCtx\", but the response channel differs\n// based on asset class:\n// - Spot assets (HIP-4 prediction tokens): channel = \"activeSpotAssetCtx\"\n// - Perp assets: channel = \"activeAssetCtx\"\n//\n// We currently only handle spot (prediction markets). If perps support is\n// added, a second subscription or a channel-aware router will be needed.\n\nexport interface HLWsActiveSpotAssetCtxData {\n coin: string;\n ctx: {\n dayNtlVlm: string;\n markPx: string;\n midPx: string | null;\n prevDayPx: string;\n circulatingSupply: string;\n coin: string;\n totalSupply: string;\n dayBaseVlm: string;\n };\n}\n\n/** Single item from the bulk spotAssetCtxs WS subscription (flat, no ctx wrapper). */\nexport interface HLWsSpotAssetCtxItem {\n coin: string;\n dayNtlVlm: string;\n markPx: string;\n midPx: string | null;\n prevDayPx: string;\n circulatingSupply: string;\n totalSupply: string;\n dayBaseVlm: string;\n}\n\n/** Bulk spot asset context WS response - flat array from spotAssetCtxs subscription. */\nexport type HLWsSpotAssetCtxsData = HLWsSpotAssetCtxItem[];\n\nexport interface HLWsActivePerpAssetCtxData {\n coin: string;\n ctx: {\n markPx: string;\n oraclePx: string;\n funding: string;\n openInterest: string;\n dayNtlVlm: string;\n premium: string;\n prevDayPx: string;\n };\n}\n\n// -- Trades WS event (array of trades) --------------------------------------\n\nexport type HLWsTradesEvent = HLTrade[];\n\n// -- outcomeMetaUpdates (WebSocket) -----------------------------------------\n//\n// Streams every change to the HIP-4 outcome catalog: new outcomes/questions\n// created, outcomes/questions settled, question metadata updated. Lets a\n// client keep its outcomeMeta cache fresh without polling.\n//\n// Subscription: { \"type\": \"outcomeMetaUpdates\" }\n// Response chan: \"outcomeMetaUpdates\"\n//\n// HL's docs type `WsOutcomeMetaUpdates` as a 1-element tuple, but the wire\n// frame is a JSON array - modeled here as a plain array so callers don't\n// have to special-case multi-update batches if HL emits them.\n\nexport interface HLWsOutcomeMetaSideSpec {\n name: string;\n}\n\nexport interface HLWsOutcomeSpec {\n outcome: number;\n name: string;\n description: string;\n sideSpecs: [HLWsOutcomeMetaSideSpec, HLWsOutcomeMetaSideSpec];\n}\n\nexport interface HLWsQuestionSpec {\n question: number;\n name: string;\n description: string;\n fallbackOutcome: number;\n namedOutcomes: number[];\n settledNamedOutcomes: number[];\n}\n\nexport type HLWsOutcomeMetaUpdate =\n | { outcomeCreated: HLWsOutcomeSpec }\n | { outcomeSettled: number }\n | { questionUpdated: HLWsQuestionSpec }\n | { questionSettled: number };\n\nexport type HLWsOutcomeMetaUpdates = HLWsOutcomeMetaUpdate[];\n\n// -- User WS event wrappers -------------------------------------------------\n\nexport interface HLWsSpotStateEvent {\n user: `0x${string}`;\n spotState: HLSpotClearinghouseState;\n}\n\nexport interface HLWsOpenOrdersEvent {\n dex: string;\n user: `0x${string}`;\n orders: HLFrontendOrder[];\n}\n\nexport interface HLWsClearinghouseStateEvent {\n dex: string;\n user: `0x${string}`;\n clearinghouseState: HLClearinghouseState;\n}\n\n// -- extraAgents ------------------------------------------------------------\n\nexport interface HLExtraAgent {\n address: `0x${string}`;\n name: string;\n validUntil: number;\n}\n\n// -- User role -------------------------------------------------------------\n\nexport interface HLUserRoleResponse {\n /** Role assigned to the address by Hyperliquid (e.g. \"user\", \"subAccount\", \"missing\"). */\n role?: string;\n}\n\n// -- Account abstraction mode -----------------------------------------------\n\n/**\n * Account abstraction mode reported by the `userAbstraction` info endpoint.\n *\n * - `default` - standard mode returned by HL for regular accounts. Spot\n * and per-perp-DEX wallets are separate. `usdClassTransfer` required.\n * - `disabled` - legacy name for the same classic Standard mode; treated\n * identically to `\"default\"`. Kept for backwards compatibility.\n * - `dexAbstraction` - unifies multiple perp DEXes into one balance, but\n * the spot/perp split is preserved. `usdClassTransfer` is still\n * required and still allowed.\n * - `unifiedAccount` - spot ↔ perps balances merged into a single balance.\n * `usdClassTransfer` is rejected.\n * - `portfolioMargin` - unified account plus cross-asset portfolio margin.\n * `usdClassTransfer` is rejected.\n *\n * Only `unifiedAccount` and `portfolioMargin` trigger the API rejection\n * `\"Action disabled when unified account is active\"`.\n */\nexport type HLUserAbstraction =\n | \"default\"\n | \"disabled\"\n | \"dexAbstraction\"\n | \"unifiedAccount\"\n | \"portfolioMargin\";\n\n// -- User fees --------------------------------------------------------------\n\n/**\n * Response shape of Hyperliquid's `userFees` info request.\n * Rates are decimal strings (e.g. \"0.000538\" = 0.0538%).\n *\n * For HIP-4 outcome markets (spot-style), use `userSpotCrossRate`\n * (taker) and `userSpotAddRate` (maker) - these already include\n * tier, referral, staking, and aligned-quote-asset discounts.\n */\nexport interface HLUserFees {\n userCrossRate: string;\n userAddRate: string;\n userSpotCrossRate: string;\n userSpotAddRate: string;\n activeReferralDiscount?: string;\n activeStakingDiscount?: {\n discount: string;\n bpsOfMaxSupply: string;\n } | null;\n}\n\n// -- Referral state ---------------------------------------------------------\n\nexport interface HLReferralState {\n /** The referrer's address, if set */\n referredBy?: {\n code: string;\n referrer: string;\n } | null;\n /** Cumulative referral rewards info */\n cumVlm?: string;\n unclaimedRewards?: string;\n claimedRewards?: string;\n}\n\n// -- Signer interface -------------------------------------------------------\n// Consumers provide a signer that can produce EIP-712 signatures for HL actions.\n// Supports both native HLSignature ({r, s, v}) and hex strings (viem output).\n\nexport interface HIP4Signer {\n getAddress(): string | Promise<string>;\n\n /**\n * Sign a typed-data payload (EIP-712).\n * Can return either:\n * - HLSignature ({r, s, v}) directly\n * - A hex string \"0x...\" which will be split into {r, s, v}\n */\n signTypedData(\n domain: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n value: Record<string, unknown>,\n ): Promise<HLSignature | string>;\n}\n\n/**\n * Convert a viem hex signature (0x + 32 bytes r + 32 bytes s + 1 byte v)\n * into the {r, s, v} format HL expects.\n */\nexport function splitHexSignature(hex: string): HLSignature {\n const raw = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n return {\n r: \"0x\" + raw.slice(0, 64),\n s: \"0x\" + raw.slice(64, 128),\n v: parseInt(raw.slice(128, 130), 16),\n };\n}\n\n/**\n * Normalize a signature that may be hex or already split.\n */\nexport function normalizeSignature(sig: HLSignature | string): HLSignature {\n if (typeof sig === \"string\") {\n return splitHexSignature(sig);\n }\n return sig;\n}\n","// ---------------------------------------------------------------------------\n// Hyperliquid L1 Action Signing\n//\n// Implements the correct signing flow for Hyperliquid exchange actions:\n// 1. Sort action keys in canonical order\n// 2. MessagePack-encode the action\n// 3. Append nonce (big-endian uint64) + vault marker\n// 4. Keccak-256 hash\n// 5. EIP-712 sign with Agent type (chainId=1337, source=\"a\"/\"b\")\n//\n// Zero runtime dependencies - msgpack encoder and keccak-256 are implemented\n// inline using the public specifications.\n// ---------------------------------------------------------------------------\n\nimport type {\n HIP4Signer,\n HLBatchModifyAction,\n HLCancelAction,\n HLModifyAction,\n HLOrderAction,\n HLOrderWire,\n HLScheduleCancelAction,\n HLSignature,\n HLUserOutcomeAction,\n} from \"./types\";\nimport { normalizeSignature } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// MessagePack Encoder (minimal subset)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal MessagePack encoder supporting: maps, arrays, strings, integers,\n * booleans, and null. Floats are not needed (prices are strings in wire format).\n *\n * Spec: https://github.com/msgpack/msgpack/blob/master/spec.md\n */\nexport function encodeMsgpack(value: unknown): Uint8Array {\n const parts: Uint8Array[] = [];\n encodeValue(value, parts);\n // Concatenate all parts\n let totalLen = 0;\n for (const p of parts) totalLen += p.length;\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const p of parts) {\n result.set(p, offset);\n offset += p.length;\n }\n return result;\n}\n\nfunction encodeValue(value: unknown, parts: Uint8Array[]): void {\n if (value === null || value === undefined) {\n parts.push(new Uint8Array([0xc0]));\n return;\n }\n\n if (typeof value === \"boolean\") {\n parts.push(new Uint8Array([value ? 0xc3 : 0xc2]));\n return;\n }\n\n if (typeof value === \"number\") {\n encodeNumber(value, parts);\n return;\n }\n\n if (typeof value === \"string\") {\n encodeString(value, parts);\n return;\n }\n\n if (Array.isArray(value)) {\n encodeArray(value, parts);\n return;\n }\n\n if (typeof value === \"object\") {\n encodeMap(value as Record<string, unknown>, parts);\n return;\n }\n\n throw new Error(`msgpack: unsupported type ${typeof value}`);\n}\n\nfunction encodeNumber(n: number, parts: Uint8Array[]): void {\n if (!Number.isInteger(n)) {\n // Encode as float64 (0xcb)\n const buf = new ArrayBuffer(9);\n const view = new DataView(buf);\n view.setUint8(0, 0xcb);\n view.setFloat64(1, n);\n parts.push(new Uint8Array(buf));\n return;\n }\n\n if (n >= 0) {\n if (n <= 0x7f) {\n // positive fixint\n parts.push(new Uint8Array([n]));\n } else if (n <= 0xff) {\n parts.push(new Uint8Array([0xcc, n]));\n } else if (n <= 0xffff) {\n const buf = new Uint8Array(3);\n buf[0] = 0xcd;\n buf[1] = (n >> 8) & 0xff;\n buf[2] = n & 0xff;\n parts.push(buf);\n } else if (n <= 0xffffffff) {\n const buf = new Uint8Array(5);\n buf[0] = 0xce;\n buf[1] = (n >> 24) & 0xff;\n buf[2] = (n >> 16) & 0xff;\n buf[3] = (n >> 8) & 0xff;\n buf[4] = n & 0xff;\n parts.push(buf);\n } else {\n // uint64\n const buf = new Uint8Array(9);\n buf[0] = 0xcf;\n const big = BigInt(n);\n const view = new DataView(buf.buffer);\n view.setBigUint64(1, big);\n parts.push(buf);\n }\n } else {\n // negative\n if (n >= -32) {\n // negative fixint: 0xe0 | (n & 0x1f)\n parts.push(new Uint8Array([(0x100 + n) & 0xff]));\n } else if (n >= -128) {\n const buf = new Uint8Array(2);\n buf[0] = 0xd0;\n buf[1] = (0x100 + n) & 0xff;\n parts.push(buf);\n } else if (n >= -32768) {\n const buf = new Uint8Array(3);\n buf[0] = 0xd1;\n const view = new DataView(buf.buffer);\n view.setInt16(1, n);\n parts.push(buf);\n } else if (n >= -2147483648) {\n const buf = new Uint8Array(5);\n buf[0] = 0xd2;\n const view = new DataView(buf.buffer);\n view.setInt32(1, n);\n parts.push(buf);\n } else {\n const buf = new Uint8Array(9);\n buf[0] = 0xd3;\n const view = new DataView(buf.buffer);\n view.setBigInt64(1, BigInt(n));\n parts.push(buf);\n }\n }\n}\n\nfunction encodeString(s: string, parts: Uint8Array[]): void {\n const encoded = new TextEncoder().encode(s);\n const len = encoded.length;\n\n if (len <= 31) {\n parts.push(new Uint8Array([0xa0 | len]));\n } else if (len <= 0xff) {\n parts.push(new Uint8Array([0xd9, len]));\n } else if (len <= 0xffff) {\n parts.push(new Uint8Array([0xda, (len >> 8) & 0xff, len & 0xff]));\n } else {\n parts.push(\n new Uint8Array([\n 0xdb,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ]),\n );\n }\n parts.push(encoded);\n}\n\nfunction encodeArray(arr: unknown[], parts: Uint8Array[]): void {\n const len = arr.length;\n if (len <= 15) {\n parts.push(new Uint8Array([0x90 | len]));\n } else if (len <= 0xffff) {\n parts.push(new Uint8Array([0xdc, (len >> 8) & 0xff, len & 0xff]));\n } else {\n parts.push(\n new Uint8Array([\n 0xdd,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ]),\n );\n }\n for (const item of arr) {\n encodeValue(item, parts);\n }\n}\n\nfunction encodeMap(obj: Record<string, unknown>, parts: Uint8Array[]): void {\n const keys = Object.keys(obj);\n const len = keys.length;\n if (len <= 15) {\n parts.push(new Uint8Array([0x80 | len]));\n } else if (len <= 0xffff) {\n parts.push(new Uint8Array([0xde, (len >> 8) & 0xff, len & 0xff]));\n } else {\n parts.push(\n new Uint8Array([\n 0xdf,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ]),\n );\n }\n for (const key of keys) {\n encodeString(key, parts);\n encodeValue(obj[key], parts);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Keccak-256\n// ---------------------------------------------------------------------------\n\nconst KECCAK_ROUND_CONSTANTS: bigint[] = [\n 0x0000000000000001n,\n 0x0000000000008082n,\n 0x800000000000808an,\n 0x8000000080008000n,\n 0x000000000000808bn,\n 0x0000000080000001n,\n 0x8000000080008081n,\n 0x8000000000008009n,\n 0x000000000000008an,\n 0x0000000000000088n,\n 0x0000000080008009n,\n 0x000000008000000an,\n 0x000000008000808bn,\n 0x800000000000008bn,\n 0x8000000000008089n,\n 0x8000000000008003n,\n 0x8000000000008002n,\n 0x8000000000000080n,\n 0x000000000000800an,\n 0x800000008000000an,\n 0x8000000080008081n,\n 0x8000000000008080n,\n 0x0000000080000001n,\n 0x8000000080008008n,\n];\n\nconst ROTATION_OFFSETS = [\n 0, 1, 62, 28, 27, 36, 44, 6, 55, 20, 3, 10, 43, 25, 39, 41, 45, 15, 21, 8, 18,\n 2, 61, 56, 14,\n];\n\n// Pi permutation: for linear index i = x + 5*y, new index = y + 5*(2*x + 3*y) % 5\n// Precompute the mapping\nconst PI_PERMUTATION: number[] = new Array(25);\nfor (let x = 0; x < 5; x++) {\n for (let y = 0; y < 5; y++) {\n const fromIdx = x + 5 * y;\n const newX = y;\n const newY = (2 * x + 3 * y) % 5;\n PI_PERMUTATION[fromIdx] = newX + 5 * newY;\n }\n}\n\nconst MASK64 = 0xffffffffffffffffn;\n\nfunction rotl64(x: bigint, n: number): bigint {\n if (n === 0) return x;\n return ((x << BigInt(n)) | (x >> BigInt(64 - n))) & MASK64;\n}\n\nfunction keccakF1600(state: bigint[]): void {\n for (let round = 0; round < 24; round++) {\n // Theta\n const c = new Array<bigint>(5);\n for (let x = 0; x < 5; x++) {\n c[x] =\n state[x] ^ state[x + 5] ^ state[x + 10] ^ state[x + 15] ^ state[x + 20];\n }\n for (let x = 0; x < 5; x++) {\n const d = c[(x + 4) % 5] ^ rotl64(c[(x + 1) % 5], 1);\n for (let y = 0; y < 5; y++) {\n state[x + 5 * y] = (state[x + 5 * y] ^ d) & MASK64;\n }\n }\n\n // Rho + Pi (combined)\n const temp = new Array<bigint>(25);\n for (let i = 0; i < 25; i++) {\n temp[PI_PERMUTATION[i]] = rotl64(state[i], ROTATION_OFFSETS[i]);\n }\n\n // Chi\n for (let y = 0; y < 5; y++) {\n const base = 5 * y;\n const t0 = temp[base];\n const t1 = temp[base + 1];\n const t2 = temp[base + 2];\n const t3 = temp[base + 3];\n const t4 = temp[base + 4];\n state[base] = (t0 ^ (~t1 & MASK64 & t2)) & MASK64;\n state[base + 1] = (t1 ^ (~t2 & MASK64 & t3)) & MASK64;\n state[base + 2] = (t2 ^ (~t3 & MASK64 & t4)) & MASK64;\n state[base + 3] = (t3 ^ (~t4 & MASK64 & t0)) & MASK64;\n state[base + 4] = (t4 ^ (~t0 & MASK64 & t1)) & MASK64;\n }\n\n // Iota\n state[0] = (state[0] ^ KECCAK_ROUND_CONSTANTS[round]) & MASK64;\n }\n}\n\n/**\n * Keccak-256 hash (Ethereum variant).\n *\n * Parameters: rate=1088 bits (136 bytes), capacity=512 bits, output=256 bits.\n * Padding: Keccak (suffix 0x01), NOT SHA-3 (suffix 0x06).\n */\nexport function keccak256(data: Uint8Array): Uint8Array {\n const rate = 136; // bytes\n const state = new Array<bigint>(25).fill(0n);\n\n // Absorb\n let offset = 0;\n while (offset + rate <= data.length) {\n xorBlock(state, data, offset, rate);\n keccakF1600(state);\n offset += rate;\n }\n\n // Pad last block\n const remaining = data.length - offset;\n const lastBlock = new Uint8Array(rate);\n lastBlock.set(data.subarray(offset, offset + remaining));\n // Keccak padding: 0x01 after message, 0x80 at end of block\n lastBlock[remaining] = 0x01;\n lastBlock[rate - 1] |= 0x80;\n xorBlock(state, lastBlock, 0, rate);\n keccakF1600(state);\n\n // Squeeze (only need 32 bytes = 256 bits, which is < rate)\n const output = new Uint8Array(32);\n for (let i = 0; i < 4; i++) {\n const word = state[i];\n for (let b = 0; b < 8; b++) {\n output[i * 8 + b] = Number((word >> BigInt(b * 8)) & 0xffn);\n }\n }\n return output;\n}\n\nfunction xorBlock(\n state: bigint[],\n data: Uint8Array,\n offset: number,\n len: number,\n): void {\n const words = len / 8;\n for (let i = 0; i < words; i++) {\n let word = 0n;\n const base = offset + i * 8;\n for (let b = 0; b < 8; b++) {\n word |= BigInt(data[base + b]) << BigInt(b * 8);\n }\n state[i] = (state[i] ^ word) & MASK64;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hex helpers\n// ---------------------------------------------------------------------------\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let hex = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const raw = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const bytes = new Uint8Array(raw.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(raw.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n// ---------------------------------------------------------------------------\n// Action Key Sorting\n// ---------------------------------------------------------------------------\n\n/**\n * Strip trailing zeros from a decimal string.\n * \"0.5000\" → \"0.5\", \"10.00\" → \"10\", \"3\" → \"3\" (no-op if no decimal point).\n * Matches @nktkas/hyperliquid formatDecimal behavior.\n */\nfunction formatDecimal(numStr: string): string {\n // Handle scientific notation (e.g. \"1e-5\" → \"0.00001\")\n if (numStr.includes(\"e\") || numStr.includes(\"E\")) {\n numStr = Number(numStr).toFixed(20);\n }\n if (!numStr.includes(\".\")) return numStr;\n const [intPart, fracPart] = numStr.split(\".\");\n const trimmed = fracPart.replace(/0+$/, \"\");\n return trimmed ? `${intPart}.${trimmed}` : intPart;\n}\n\n/**\n * Sort an order action into canonical key order for MessagePack encoding.\n * Key order: type, orders, grouping, builder?\n * Order wire key order: a, b, p, s, r, t, c?\n * Trigger type key order: isMarket, triggerPx, tpsl\n */\nexport function sortOrderAction(\n action: HLOrderAction & { builder?: { b: string; f: number } },\n): HLOrderAction {\n const sortedOrders = action.orders.map((o) => {\n // Sort the 't' field if it's a trigger type\n let t = o.t;\n if (\"trigger\" in t) {\n t = {\n trigger: {\n isMarket: t.trigger.isMarket,\n triggerPx: formatDecimal(t.trigger.triggerPx),\n tpsl: t.trigger.tpsl,\n },\n };\n }\n\n const wire: Record<string, unknown> = {\n a: o.a,\n b: o.b,\n p: formatDecimal(o.p),\n s: formatDecimal(o.s),\n r: o.r,\n t: t,\n };\n // Only include 'c' if it exists and is defined\n if (o.c !== undefined) {\n wire.c = o.c;\n }\n return wire;\n });\n\n // Canonical order: type, orders, grouping, builder?\n const sorted: Record<string, unknown> = {\n type: action.type,\n orders: sortedOrders,\n grouping: action.grouping,\n };\n\n // Include builder only if present, with canonical key order and lowercased address\n if (action.builder !== undefined) {\n sorted.builder = {\n b: action.builder.b.toLowerCase(),\n f: action.builder.f,\n };\n }\n\n return sorted as unknown as HLOrderAction;\n}\n\n/**\n * Sort a cancel action into canonical key order.\n * Key order: type, cancels\n * Cancel wire key order: a, o\n */\nexport function sortCancelAction(action: HLCancelAction): HLCancelAction {\n const sortedCancels = action.cancels.map((c) => ({\n a: c.a,\n o: c.o,\n }));\n\n return {\n type: action.type,\n cancels: sortedCancels,\n };\n}\n\n/**\n * Apply the same canonical ordering to an order wire that sortOrderAction\n * does (a, b, p, s, r, t, c?) - shared between place-order and modify paths.\n */\nfunction sortOrderWire(o: HLOrderWire): HLOrderWire {\n let t = o.t;\n if (\"trigger\" in t) {\n t = {\n trigger: {\n isMarket: t.trigger.isMarket,\n triggerPx: formatDecimal(t.trigger.triggerPx),\n tpsl: t.trigger.tpsl,\n },\n };\n }\n const wire: Record<string, unknown> = {\n a: o.a,\n b: o.b,\n p: formatDecimal(o.p),\n s: formatDecimal(o.s),\n r: o.r,\n t: t,\n };\n if (o.c !== undefined) {\n wire.c = o.c;\n }\n return wire as unknown as HLOrderWire;\n}\n\n/**\n * Sort a modify action into canonical key order.\n * Key order: type, oid, order\n * Inner order wire uses the same canonical order as place-order.\n */\nexport function sortModifyAction(action: HLModifyAction): HLModifyAction {\n return {\n type: action.type,\n oid: action.oid,\n order: sortOrderWire(action.order),\n };\n}\n\n/**\n * Sort a batchModify action into canonical key order.\n * Key order: type, modifies. Each modify entry uses key order: oid, order.\n */\nexport function sortBatchModifyAction(\n action: HLBatchModifyAction,\n): HLBatchModifyAction {\n return {\n type: action.type,\n modifies: action.modifies.map((m) => ({\n oid: m.oid,\n order: sortOrderWire(m.order),\n })),\n };\n}\n\n/**\n * Sort a userOutcome action into canonical key order for MessagePack.\n * Outer key order: type, <variant-key>. Inner key orders match HL's docs:\n * splitOutcome: outcome, amount\n * mergeOutcome: outcome, amount\n * mergeQuestion: question, amount\n * negateQuestion: question, outcome, amount\n *\n * `amount` is run through formatDecimal so trailing zeros do not desync the\n * client signature from HL's server-side hash. `null` is preserved (encodes\n * as msgpack 0xc0 / \"max amount\").\n */\nexport function sortUserOutcomeAction(\n action: HLUserOutcomeAction,\n): HLUserOutcomeAction {\n if (\"splitOutcome\" in action) {\n const { outcome, amount } = action.splitOutcome;\n return {\n type: \"userOutcome\",\n splitOutcome: { outcome, amount: formatDecimal(amount) },\n };\n }\n if (\"mergeOutcome\" in action) {\n const { outcome, amount } = action.mergeOutcome;\n return {\n type: \"userOutcome\",\n mergeOutcome: {\n outcome,\n amount: amount === null ? null : formatDecimal(amount),\n },\n };\n }\n if (\"mergeQuestion\" in action) {\n const { question, amount } = action.mergeQuestion;\n return {\n type: \"userOutcome\",\n mergeQuestion: {\n question,\n amount: amount === null ? null : formatDecimal(amount),\n },\n };\n }\n const { question, outcome, amount } = action.negateOutcome;\n return {\n type: \"userOutcome\",\n negateOutcome: { question, outcome, amount: formatDecimal(amount) },\n };\n}\n\n/**\n * Sort a scheduleCancel action into canonical key order. Outer keys:\n * `type, time`. Time may be `null` to clear an existing schedule.\n */\nexport function sortScheduleCancelAction(\n action: HLScheduleCancelAction,\n): HLScheduleCancelAction {\n return { type: action.type, time: action.time };\n}\n\n// ---------------------------------------------------------------------------\n// L1 Action Hash\n// ---------------------------------------------------------------------------\n\n/**\n * Create the Keccak-256 hash of an L1 action for signing.\n *\n * Hash input = msgpack(action) + nonce_be64 + vault_marker\n * vault_marker = 0x00 (no vault) | 0x01 + 20-byte address\n */\nexport function createL1ActionHash(params: {\n action:\n | Record<string, unknown>\n | HLOrderAction\n | HLCancelAction\n | HLModifyAction\n | HLBatchModifyAction\n | HLUserOutcomeAction\n | HLScheduleCancelAction;\n nonce: number;\n vaultAddress?: string | null;\n}): Uint8Array {\n const { action, nonce, vaultAddress } = params;\n\n // Step 1: MessagePack encode the action\n const msgpackBytes = encodeMsgpack(action);\n\n // Step 2: Nonce as big-endian uint64\n const nonceBytes = new Uint8Array(8);\n const nonceView = new DataView(nonceBytes.buffer);\n nonceView.setBigUint64(0, BigInt(nonce));\n\n // Step 3: Vault marker\n let vaultBytes: Uint8Array;\n if (vaultAddress) {\n const addrBytes = hexToBytes(vaultAddress);\n vaultBytes = new Uint8Array(1 + 20);\n vaultBytes[0] = 0x01;\n vaultBytes.set(addrBytes.slice(0, 20), 1);\n } else {\n vaultBytes = new Uint8Array([0x00]);\n }\n\n // Concatenate\n const totalLen = msgpackBytes.length + nonceBytes.length + vaultBytes.length;\n const combined = new Uint8Array(totalLen);\n combined.set(msgpackBytes, 0);\n combined.set(nonceBytes, msgpackBytes.length);\n combined.set(vaultBytes, msgpackBytes.length + nonceBytes.length);\n\n // Step 4: Keccak-256\n return keccak256(combined);\n}\n\n// ---------------------------------------------------------------------------\n// EIP-712 Agent Signing\n// ---------------------------------------------------------------------------\n\nconst AGENT_DOMAIN = {\n name: \"Exchange\",\n version: \"1\",\n chainId: 1337,\n verifyingContract: \"0x0000000000000000000000000000000000000000\",\n};\n\nconst AGENT_TYPES = {\n Agent: [\n { name: \"source\", type: \"string\" },\n { name: \"connectionId\", type: \"bytes32\" },\n ],\n};\n\n/**\n * Sign a Hyperliquid L1 action.\n *\n * 1. Compute actionHash = keccak256(msgpack(action) + nonce_be64 + vault_marker)\n * 2. EIP-712 sign with Agent type: { source: \"a\"/\"b\", connectionId: actionHash }\n */\nexport async function signL1Action(params: {\n signer: HIP4Signer;\n action:\n | Record<string, unknown>\n | HLOrderAction\n | HLCancelAction\n | HLModifyAction\n | HLBatchModifyAction\n | HLUserOutcomeAction\n | HLScheduleCancelAction;\n nonce: number;\n isTestnet: boolean;\n vaultAddress?: string | null;\n}): Promise<HLSignature> {\n const { signer, action, nonce, isTestnet, vaultAddress } = params;\n\n const actionHash = createL1ActionHash({ action, nonce, vaultAddress });\n const connectionId = bytesToHex(actionHash);\n\n const message = {\n source: isTestnet ? \"b\" : \"a\",\n connectionId,\n };\n\n const rawSig = await signer.signTypedData(\n AGENT_DOMAIN as unknown as Record<string, unknown>,\n AGENT_TYPES,\n message,\n );\n\n return normalizeSignature(rawSig);\n}\n\n// ---------------------------------------------------------------------------\n// User-Signed EIP-712 (HyperliquidSignTransaction domain)\n//\n// Used for wallet-level operations: withdraw, usdClassTransfer, usdSend,\n// approveAgent, approveBuilderFee, etc. NOT used for orders/cancels (those\n// always use L1 agent signing above).\n//\n// Reference: @nktkas/hyperliquid signing/mod.ts - signUserSignedAction\n// ---------------------------------------------------------------------------\n\n/** EIP-712 types for withdraw3. */\nexport const WITHDRAW_TYPES = {\n \"HyperliquidTransaction:Withdraw\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"destination\", type: \"string\" },\n { name: \"amount\", type: \"string\" },\n { name: \"time\", type: \"uint64\" },\n ],\n};\n\n/** EIP-712 types for usdClassTransfer (spot ↔ perp). */\nexport const USD_CLASS_TRANSFER_TYPES = {\n \"HyperliquidTransaction:UsdClassTransfer\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"amount\", type: \"string\" },\n { name: \"toPerp\", type: \"bool\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n};\n\n/** EIP-712 types for usdSend. */\nexport const USD_SEND_TYPES = {\n \"HyperliquidTransaction:UsdSend\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"destination\", type: \"string\" },\n { name: \"amount\", type: \"string\" },\n { name: \"time\", type: \"uint64\" },\n ],\n};\n\n/** EIP-712 types for spotSend (transfer any spot token to another user). */\nexport const SPOT_SEND_TYPES = {\n \"HyperliquidTransaction:SpotSend\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"destination\", type: \"string\" },\n { name: \"token\", type: \"string\" },\n { name: \"amount\", type: \"string\" },\n { name: \"time\", type: \"uint64\" },\n ],\n};\n\n/**\n * EIP-712 types for sendAsset - the unified-account-compatible transfer\n * primitive. Supersedes spotSend / usdSend / subAccountSpotTransfer /\n * usdClassTransfer when an account is in `unifiedAccount` or\n * `portfolioMargin` mode (where silo-specific actions are rejected with\n * \"Action disabled when unified account is active\").\n *\n * `sourceDex` / `destinationDex`: `\"\"` for perp USDC, `\"spot\"` for spot.\n * Core→EVM transfers use `destination` = the token's system address and\n * leave `destinationDex` as `\"\"`.\n *\n * Ref: @nktkas/hyperliquid src/api/exchange/_methods/sendAsset.ts\n */\nexport const SEND_ASSET_TYPES = {\n \"HyperliquidTransaction:SendAsset\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"destination\", type: \"string\" },\n { name: \"sourceDex\", type: \"string\" },\n { name: \"destinationDex\", type: \"string\" },\n { name: \"token\", type: \"string\" },\n { name: \"amount\", type: \"string\" },\n { name: \"fromSubAccount\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n};\n\n/**\n * EIP-712 types for sendToEvmWithData (Core → EVM transfer invoking the\n * linked contract's `coreReceiveWithData` hook). Field order matches the\n * canonical Hyperliquid spec; deviations break signature verification.\n *\n * Ref: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\n */\nexport const SEND_TO_EVM_WITH_DATA_TYPES = {\n \"HyperliquidTransaction:SendToEvmWithData\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"token\", type: \"string\" },\n { name: \"amount\", type: \"string\" },\n { name: \"sourceDex\", type: \"string\" },\n { name: \"destinationRecipient\", type: \"string\" },\n { name: \"addressEncoding\", type: \"string\" },\n { name: \"destinationChainId\", type: \"uint32\" },\n { name: \"gasLimit\", type: \"uint64\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n};\n\n/**\n * Sign a user-signed action (EIP-712 on HyperliquidSignTransaction domain).\n *\n * The action must include `signatureChainId` (hex chain ID for the EIP-712\n * domain). The message is filtered to only include keys defined in `types`.\n *\n * Reference: @nktkas/hyperliquid signing/mod.ts\n */\nexport async function signUserSignedAction(params: {\n signer: HIP4Signer;\n action: Record<string, unknown> & { signatureChainId: string };\n types: Record<string, Array<{ name: string; type: string }>>;\n}): Promise<HLSignature> {\n const { signer, action, types } = params;\n\n const primaryType = Object.keys(types)[0];\n if (!primaryType || !types[primaryType]) {\n throw new Error(\"EIP-712 types object is empty\");\n }\n\n // Filter action to only include keys defined in types (wallet compat)\n const knownKeys = new Set(types[primaryType].map((f) => f.name));\n const message: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(action)) {\n if (knownKeys.has(k)) message[k] = v;\n }\n\n const chainId = parseInt(action.signatureChainId, 16);\n if (isNaN(chainId)) {\n throw new Error(`Invalid signatureChainId: \"${action.signatureChainId}\"`);\n }\n\n const domain = {\n name: \"HyperliquidSignTransaction\",\n version: \"1\",\n chainId,\n verifyingContract: \"0x0000000000000000000000000000000000000000\",\n };\n\n const rawSig = await signer.signTypedData(\n domain as unknown as Record<string, unknown>,\n types,\n message,\n );\n\n return normalizeSignature(rawSig);\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Trading Adapter\n//\n// Places/cancels orders via the HL exchange endpoint. Orders target\n// per-side coins (#<outcomeId><sideIndex>) using standard HL order format.\n//\n// Asset ID mapping: 100_000_000 + outcomeId * 10 + sideIndex\n// ---------------------------------------------------------------------------\n\nimport { fixed } from \"../../lib/precision/io\";\nimport {\n clamp,\n lt,\n min,\n mul,\n sub,\n toDecimal,\n toNum,\n} from \"../../lib/precision/primitives\";\nimport type {\n PredictionBatchOrderResult,\n PredictionCancelParams,\n PredictionModifyParams,\n PredictionOrderParams,\n PredictionOrderResult,\n} from \"../../types/trading\";\nimport type { PredictionTradingAdapter, WalletActionResult } from \"../types\";\nimport type { HIP4Auth } from \"./auth\";\nimport type { HIP4Client } from \"./client\";\nimport { sideAssetId } from \"./client\";\nimport { formatPrice, getMinShares, MIN_NOTIONAL, stripZeros } from \"./pricing\";\nimport {\n signL1Action,\n sortCancelAction,\n sortModifyAction,\n sortOrderAction,\n sortScheduleCancelAction,\n sortUserOutcomeAction,\n} from \"./signing\";\nimport {\n type HLCancelAction,\n type HLCancelResponse,\n type HLModifyAction,\n type HLOrderAction,\n type HLOrderStatus,\n type HLOrderWire,\n type HLScheduleCancelAction,\n type HLUserOutcomeAction,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// userOutcome action params\n// ---------------------------------------------------------------------------\n\nexport interface SplitOutcomeParams {\n /** Outcome ID (numeric, matches HL's `outcomeMeta.outcomes[].outcome`). */\n outcome: number;\n /** Amount of quote tokens to split. Decimal string (e.g. \"12.5\"). */\n amount: string;\n}\n\nexport interface MergeOutcomeParams {\n outcome: number;\n /** Amount of paired Yes+No shares to merge. `null` means max available. */\n amount: string | null;\n}\n\nexport interface MergeQuestionParams {\n /** Question ID (numeric, matches HL's `outcomeMeta.questions[].question`). */\n question: number;\n /** Yes-share count to redeem from each member outcome. `null` = max. */\n amount: string | null;\n}\n\nexport interface NegateOutcomeParams {\n question: number;\n /** Source outcome whose No shares are being converted. */\n outcome: number;\n /** No-share count to convert. */\n amount: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated Use {@link formatPrice} from pricing.ts instead.\n */\nexport function formatPredictionPrice(price: number): string {\n if (price <= 0) return \"0\";\n let formatted: string;\n if (price >= 1000) {\n formatted = Math.round(price).toString();\n } else if (price >= 10) {\n formatted = price.toFixed(1);\n } else if (price >= 1) {\n formatted = price.toFixed(2);\n } else {\n formatted = price.toFixed(4);\n }\n return formatted.replace(/\\.?0+$/, \"\");\n}\n\nfunction mapTif(\n type: PredictionOrderParams[\"type\"],\n tif?: PredictionOrderParams[\"timeInForce\"],\n): HLOrderWire[\"t\"] {\n if (type === \"market\") {\n return { limit: { tif: \"FrontendMarket\" } };\n }\n switch (tif) {\n case \"FOK\":\n throw new Error(\n \"FOK (Fill-or-Kill) is not supported by Hyperliquid. Use FAK (Fill-and-Kill / IoC) for immediate partial fills, or GTC for resting orders.\",\n );\n case \"FAK\":\n return { limit: { tif: \"Ioc\" } };\n case \"ALO\":\n return { limit: { tif: \"Alo\" } };\n case \"GTD\":\n throw new Error(\n \"GTD (Good-til-Date) is not supported for prediction markets on Hyperliquid. Use GTC for resting orders.\",\n );\n case \"GTC\":\n case undefined:\n default:\n return { limit: { tif: \"Gtc\" } };\n }\n}\n\nfunction resolveAssetId(marketId: string, outcome: string): number {\n const outcomeId = parseInt(marketId, 10);\n\n if (outcome.startsWith(\"#\") || outcome.startsWith(\"+\")) {\n const num = outcome.slice(1);\n const sideIndex = parseInt(num.slice(-1), 10);\n if (sideIndex !== 0 && sideIndex !== 1) {\n throw new Error(\n `Invalid sideIndex ${sideIndex} in outcome \"${outcome}\". Must be 0 or 1.`,\n );\n }\n return sideAssetId(outcomeId, sideIndex);\n }\n\n const sideMatch = /(\\d)$/.exec(outcome);\n if (sideMatch?.[1]) {\n const sideIndex = parseInt(sideMatch[1], 10);\n if (sideIndex > 1) {\n return sideAssetId(outcomeId, 0);\n }\n return sideAssetId(outcomeId, sideIndex);\n }\n\n return sideAssetId(outcomeId, 0);\n}\n\nfunction interpretStatus(\n status: HLOrderStatus,\n): Pick<PredictionOrderResult, \"orderId\" | \"status\" | \"shares\" | \"error\"> {\n if (\"filled\" in status) {\n return {\n orderId: String(status.filled.oid),\n status: \"filled\",\n shares: status.filled.totalSz,\n };\n }\n if (\"resting\" in status) {\n return {\n orderId: String(status.resting.oid),\n status: \"resting\",\n };\n }\n if (\"error\" in status) {\n return {\n error: status.error,\n status: \"error\",\n };\n }\n return { status: \"unknown\" };\n}\n\n// ---------------------------------------------------------------------------\n// HIP4TradingAdapter\n// ---------------------------------------------------------------------------\n\nexport interface TradingAdapterConfig {\n builderAddress?: string;\n builderFee?: number;\n}\n\nexport class HIP4TradingAdapter implements PredictionTradingAdapter {\n private readonly builderAddress?: string;\n private readonly builderFee?: number;\n\n constructor(\n private readonly client: HIP4Client,\n private readonly auth: HIP4Auth,\n config?: TradingAdapterConfig,\n ) {\n this.builderAddress = config?.builderAddress;\n this.builderFee = config?.builderFee;\n }\n\n private buildOrderWire(\n params: PredictionOrderParams,\n ): { wire: HLOrderWire } | { error: string } {\n const assetId = resolveAssetId(params.marketId, params.outcome);\n const isBuy = params.side === \"buy\";\n const amount = stripZeros(params.amount);\n\n let price: string;\n if (params.type === \"market\") {\n price = isBuy ? \"0.99999\" : \"0.00001\";\n\n this.client.log(\n \"debug\",\n `Market order: side=${isBuy ? \"buy\" : \"sell\"}, price=${price} (FrontendMarket best-execution)`,\n );\n } else {\n const rawPrice = toNum(toDecimal(params.price ?? \"0\"));\n price = formatPrice(rawPrice);\n this.client.log(\"debug\", `Limit order: price=${price}`);\n\n const numericSize = toDecimal(amount);\n\n if (params.markPx !== undefined && !params.skipMinNotionalCheck) {\n const minShares = getMinShares(params.markPx);\n if (numericSize.lt(minShares)) {\n return {\n error: `Size ${numericSize} below minimum ${minShares} shares (markPx=${params.markPx})`,\n };\n }\n }\n\n const effectiveNotional =\n params.markPx !== undefined\n ? mul(\n amount,\n clamp(\n min(String(params.markPx), sub(\"1\", String(params.markPx))),\n \"0.01\",\n \"1\",\n ),\n )\n : mul(price, amount);\n\n if (\n !params.skipMinNotionalCheck &&\n lt(effectiveNotional, String(MIN_NOTIONAL))\n ) {\n return {\n error: `Notional $${fixed(effectiveNotional, 2)} below minimum $${MIN_NOTIONAL}`,\n };\n }\n }\n\n return {\n wire: {\n a: assetId,\n b: isBuy,\n p: price,\n s: amount,\n r: false,\n t: mapTif(params.type, params.timeInForce),\n },\n };\n }\n\n async placeOrder(\n params: PredictionOrderParams,\n ): Promise<PredictionOrderResult> {\n const signer = this.auth.getSigner();\n if (!signer) {\n return {\n success: false,\n error: \"Not authenticated. Call auth.initAuth() first.\",\n };\n }\n\n const wireResult = this.buildOrderWire(params);\n if (\"error\" in wireResult) {\n return { success: false, error: wireResult.error };\n }\n\n const action: HLOrderAction & { builder?: { b: string; f: number } } = {\n type: \"order\",\n orders: [wireResult.wire],\n grouping: \"na\",\n };\n\n // Use per-order builder params if provided, otherwise fall back to adapter-level config\n const effectiveBuilderAddress =\n params.builderAddress ?? this.builderAddress;\n const effectiveBuilderFee = params.builderFee ?? this.builderFee;\n\n if (effectiveBuilderAddress) {\n action.builder = {\n b: effectiveBuilderAddress.toLowerCase(),\n f: effectiveBuilderFee ?? 0,\n };\n }\n\n const sortedAction = sortOrderAction(action);\n\n this.client.log(\"debug\", \"Order wire\", wireResult.wire);\n\n try {\n const nonce = Date.now();\n const signature = await signL1Action({\n signer,\n action: sortedAction,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n const res = await this.client.placeOrder(\n sortedAction,\n nonce,\n signature,\n null,\n );\n\n if (res.status !== \"ok\" || !res.response) {\n return { success: false, error: \"Exchange returned non-ok status\" };\n }\n\n const firstStatus = res.response.data.statuses[0];\n if (!firstStatus) {\n return { success: false, error: \"No order status returned\" };\n }\n\n const result = interpretStatus(firstStatus);\n return {\n success: !result.error,\n ...result,\n };\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : \"Unknown order error\";\n return { success: false, error: message };\n }\n }\n\n async placeOrders(\n params: PredictionOrderParams[],\n ): Promise<PredictionBatchOrderResult> {\n if (params.length === 0) {\n return { success: true, results: [] };\n }\n\n const signer = this.auth.getSigner();\n if (!signer) {\n return {\n success: false,\n results: params.map(() => ({\n success: false,\n error: \"Not authenticated. Call auth.initAuth() first.\",\n })),\n };\n }\n\n // Build wires, tracking which input indices have pre-validation errors\n const results: PredictionOrderResult[] = new Array(params.length);\n const validWires: HLOrderWire[] = [];\n const wireToInputIndex: number[] = [];\n\n for (let i = 0; i < params.length; i++) {\n const wireResult = this.buildOrderWire(params[i]);\n if (\"error\" in wireResult) {\n results[i] = { success: false, error: wireResult.error };\n } else {\n wireToInputIndex.push(i);\n validWires.push(wireResult.wire);\n }\n }\n\n if (validWires.length === 0) {\n return { success: false, results };\n }\n\n const action: HLOrderAction & { builder?: { b: string; f: number } } = {\n type: \"order\",\n orders: validWires,\n grouping: \"na\",\n };\n\n if (this.builderAddress) {\n action.builder = {\n b: this.builderAddress.toLowerCase(),\n f: this.builderFee ?? 0,\n };\n }\n\n const sortedAction = sortOrderAction(action);\n\n this.client.log(\"debug\", `Batch order: ${validWires.length} wires`);\n\n try {\n const nonce = Date.now();\n const signature = await signL1Action({\n signer,\n action: sortedAction,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n const res = await this.client.placeOrder(\n sortedAction,\n nonce,\n signature,\n null,\n );\n\n if (res.status !== \"ok\" || !res.response) {\n for (const idx of wireToInputIndex) {\n results[idx] = {\n success: false,\n error: \"Exchange returned non-ok status\",\n };\n }\n return { success: false, results };\n }\n\n const statuses = res.response.data.statuses;\n for (let j = 0; j < wireToInputIndex.length; j++) {\n const inputIdx = wireToInputIndex[j];\n const status = statuses[j];\n if (!status) {\n results[inputIdx] = {\n success: false,\n error: \"No order status returned\",\n };\n } else {\n const interpreted = interpretStatus(status);\n results[inputIdx] = { success: !interpreted.error, ...interpreted };\n }\n }\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : \"Unknown order error\";\n for (const idx of wireToInputIndex) {\n results[idx] = { success: false, error: message };\n }\n }\n\n const allSuccess = results.every((r) => r.success);\n return { success: allSuccess, results };\n }\n\n async cancelOrder(\n params: PredictionCancelParams[],\n ): Promise<HLCancelResponse> {\n const signer = this.auth.getSigner();\n if (!signer) {\n throw new Error(\"Not authenticated. Call auth.initAuth() first.\");\n }\n\n if (params.length === 0) {\n throw new Error(\"cancelOrder requires at least one order to cancel.\");\n }\n\n const cancels = params.map((p) => {\n const assetId = p.outcome\n ? resolveAssetId(p.marketId, p.outcome)\n : sideAssetId(parseInt(p.marketId, 10), 0);\n return { a: assetId, o: parseInt(p.orderId, 10) };\n });\n\n const action: HLCancelAction = {\n type: \"cancel\",\n cancels,\n };\n\n const sortedAction = sortCancelAction(action);\n\n const nonce = Date.now();\n const signature = await signL1Action({\n signer,\n action: sortedAction,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n return this.client.cancelOrder(sortedAction, nonce, signature, null);\n }\n\n async modifyOrder(\n params: PredictionModifyParams,\n ): Promise<PredictionOrderResult> {\n const signer = this.auth.getSigner();\n if (!signer) {\n return {\n success: false,\n error: \"Not authenticated. Call auth.initAuth() first.\",\n };\n }\n\n // Reuse buildOrderWire so modify shares the same price/size/notional\n // validation as placeOrder - the wire format is identical.\n const wireResult = this.buildOrderWire({\n marketId: params.marketId,\n outcome: params.outcome,\n side: params.side,\n type: params.type,\n price: params.price,\n amount: params.amount,\n timeInForce: params.timeInForce,\n markPx: params.markPx,\n });\n if (\"error\" in wireResult) {\n return { success: false, error: wireResult.error };\n }\n\n const oid = parseInt(params.orderId, 10);\n if (!Number.isFinite(oid)) {\n return { success: false, error: `Invalid orderId \"${params.orderId}\"` };\n }\n\n const action: HLModifyAction = {\n type: \"modify\",\n oid,\n order: wireResult.wire,\n };\n const sortedAction = sortModifyAction(action);\n\n this.client.log(\"debug\", \"Modify wire\", {\n oid,\n order: wireResult.wire,\n });\n\n try {\n const nonce = Date.now();\n const signature = await signL1Action({\n signer,\n action: sortedAction,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n const res = await this.client.modifyOrder(\n sortedAction,\n nonce,\n signature,\n null,\n );\n\n if (res.status !== \"ok\") {\n // HL returns the rejection reason as a plain string in `response`\n // on top-level errors (e.g. \"Price would cross book\"). Surface it\n // so users see something actionable instead of a generic string.\n const errorMsg =\n typeof res.response === \"string\"\n ? res.response\n : \"Exchange returned non-ok status\";\n return { success: false, error: errorMsg };\n }\n\n // Modify's success response shape is looser than placeOrder: HL\n // sometimes omits `response.data.statuses` (just returns\n // `{status: \"ok\"}`). Treat that as \"order still resting at the same\n // oid\" rather than crashing the UI. Structured responses only -\n // string responses on success are not a thing HL sends.\n const structured =\n res.response && typeof res.response !== \"string\" ? res.response : null;\n const firstStatus = structured?.data?.statuses?.[0];\n if (!firstStatus) {\n return {\n success: true,\n orderId: String(oid),\n status: \"resting\",\n };\n }\n\n const result = interpretStatus(firstStatus);\n return {\n success: !result.error,\n ...result,\n };\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : \"Unknown modify error\";\n return { success: false, error: message };\n }\n }\n\n // -------------------------------------------------------------------------\n // userOutcome share-conversion actions\n //\n // All four variants share the same envelope (`type: \"userOutcome\"`) and use\n // L1 agent signing - same authority as orders, so an active agent is\n // required. They affect the user's spot balances directly (no order book).\n // -------------------------------------------------------------------------\n\n /** Split X quote tokens into X Yes + X No shares of one outcome. */\n async splitOutcome(params: SplitOutcomeParams): Promise<WalletActionResult> {\n return this.submitUserOutcomeAction({\n type: \"userOutcome\",\n splitOutcome: { outcome: params.outcome, amount: params.amount },\n });\n }\n\n /** Merge X Yes + X No shares of one outcome back into X quote tokens. */\n async mergeOutcome(params: MergeOutcomeParams): Promise<WalletActionResult> {\n return this.submitUserOutcomeAction({\n type: \"userOutcome\",\n mergeOutcome: { outcome: params.outcome, amount: params.amount },\n });\n }\n\n /** Merge X Yes shares from every outcome of a question into X quote tokens. */\n async mergeQuestion(\n params: MergeQuestionParams,\n ): Promise<WalletActionResult> {\n return this.submitUserOutcomeAction({\n type: \"userOutcome\",\n mergeQuestion: { question: params.question, amount: params.amount },\n });\n }\n\n /**\n * Convert X No shares of one outcome into X Yes shares of every *other*\n * outcome belonging to the same question (including the fallback). The\n * wire sub-key is `negateOutcome` - confirmed against HL's own testnet\n * \"Convert Outcomes\" UI; their docs body's `negateQuestion` is a typo.\n */\n async negateOutcome(\n params: NegateOutcomeParams,\n ): Promise<WalletActionResult> {\n return this.submitUserOutcomeAction({\n type: \"userOutcome\",\n negateOutcome: {\n question: params.question,\n outcome: params.outcome,\n amount: params.amount,\n },\n });\n }\n\n private async submitUserOutcomeAction(\n action: HLUserOutcomeAction,\n ): Promise<WalletActionResult> {\n const signer = this.auth.getSigner();\n if (!signer) {\n return {\n success: false,\n error: \"Not authenticated. Call auth.initAuth() first.\",\n };\n }\n\n try {\n const sorted = sortUserOutcomeAction(action);\n const nonce = Date.now();\n this.client.log(\"debug\", \"userOutcome action wire\", sorted);\n const signature = await signL1Action({\n signer,\n action: sorted,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n const res = await this.client.submitUserSignedAction(\n sorted as unknown as Record<string, unknown>,\n nonce,\n signature,\n );\n\n if (res.status === \"ok\") return { success: true };\n\n let errorMsg = \"User outcome action failed\";\n if (typeof res.response === \"string\") {\n errorMsg = res.response;\n } else if (\n res.response &&\n typeof res.response === \"object\" &&\n !Array.isArray(res.response)\n ) {\n const obj = res.response as Record<string, unknown>;\n if (typeof obj.error === \"string\") errorMsg = obj.error;\n }\n return { success: false, error: errorMsg };\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : \"Unknown user outcome error\";\n return { success: false, error: message };\n }\n }\n\n // -------------------------------------------------------------------------\n // scheduleCancel - HL \"dead-man's switch\"\n //\n // Registers a future timestamp at which HL cancels every open order from\n // this agent. Per-agent, not per-order: a new schedule replaces the\n // previous one. Pass `null` to clear an existing schedule.\n //\n // Use case: arm 1h before a HIP-4 market's settlement so resting limits\n // never sit through the auction unprotected.\n // -------------------------------------------------------------------------\n\n async scheduleCancel(time: number | null): Promise<WalletActionResult> {\n const signer = this.auth.getSigner();\n if (!signer) {\n return {\n success: false,\n error: \"Not authenticated. Call auth.initAuth() first.\",\n };\n }\n\n try {\n const action: HLScheduleCancelAction = {\n type: \"scheduleCancel\",\n time,\n };\n const sorted = sortScheduleCancelAction(action);\n const nonce = Date.now();\n this.client.log(\"debug\", \"scheduleCancel action wire\", sorted);\n const signature = await signL1Action({\n signer,\n action: sorted,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n const res = await this.client.submitUserSignedAction(\n sorted as unknown as Record<string, unknown>,\n nonce,\n signature,\n );\n\n if (res.status === \"ok\") return { success: true };\n\n let errorMsg = \"scheduleCancel failed\";\n if (typeof res.response === \"string\") {\n errorMsg = res.response;\n } else if (\n res.response &&\n typeof res.response === \"object\" &&\n !Array.isArray(res.response)\n ) {\n const obj = res.response as Record<string, unknown>;\n if (typeof obj.error === \"string\") errorMsg = obj.error;\n }\n return { success: false, error: errorMsg };\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : \"Unknown scheduleCancel error\";\n return { success: false, error: message };\n }\n }\n}\n","import { toDecimal, Decimal } from \"../primitives/core\";\nimport type { DecimalInput } from \"../primitives/types\";\n\nfunction midToCents(midPriceStr: DecimalInput): string {\n return toDecimal(midPriceStr).times(100).round().toString();\n}\n\nfunction centsToDecimalStr(cents: number): string {\n return toDecimal(cents).dividedBy(100).toFixed(2);\n}\n\nfunction applySlippage(\n mid: DecimalInput,\n ratio: DecimalInput,\n side: \"buy\" | \"sell\",\n): string {\n const m = toDecimal(mid);\n const r = toDecimal(ratio);\n return side === \"buy\"\n ? m.times(Decimal.sum(1, r)).toString()\n : m.times(new Decimal(1).minus(r)).toString();\n}\n\nfunction noPrice(yesCents: DecimalInput): string {\n const y = toDecimal(yesCents);\n if (y.lt(0) || y.gt(100)) {\n throw new RangeError(`noPrice: yesCents must be in [0, 100], got ${y}`);\n }\n return new Decimal(100).minus(y).toString();\n}\n\nexport { midToCents, centsToDecimalStr, applySlippage, noPrice };\n","// ---------------------------------------------------------------------------\n// Core → HyperEVM System Address Derivation\n//\n// Every Hyperliquid spot token has a \"system address\" on HyperCore that acts\n// as the sink for Core → HyperEVM transfers via `spotSend`. The address is\n// `0x20` + 19 bytes big-endian token index. HYPE is the one documented\n// exception at `0x2222…2222`.\n//\n// Reference: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/hyperevm/hypercore-less-than-greater-than-hyperevm-transfers\n//\n// Callers should never hand-roll this address. Spot-pair/market indices\n// (e.g. `USDH_SPOT_INDEX_MAINNET = 230`) are NOT token indices and must not\n// be passed here.\n// ---------------------------------------------------------------------------\n\n/** HYPE is the one documented exception to the 0x20-prefix rule. */\nexport const HYPE_CORE_EVM_SYSTEM_ADDRESS =\n \"0x2222222222222222222222222222222222222222\" as const;\n\n/**\n * Upper bound on derivable token indices. 19-byte big-endian can hold values\n * up to 2^152 - 1, which overflows JS numbers. We clamp to MAX_SAFE_INTEGER\n * so the derivation math stays exact; every real Hyperliquid token index is\n * orders of magnitude below this.\n */\nexport const MAX_CORE_EVM_TOKEN_INDEX = Number.MAX_SAFE_INTEGER;\n\n/**\n * Derive the HyperCore system address for a given spot token index.\n *\n * IMPORTANT: `tokenIndex` is the value from `info: spotMeta → tokens[].index`,\n * not the spot-pair/market index from `universe[]`. Passing the wrong one\n * sends funds to an unrelated token's system address.\n *\n * For HYPE, import `HYPE_CORE_EVM_SYSTEM_ADDRESS` directly - there is no\n * derivable address.\n */\nexport function deriveCoreEvmSystemAddress(tokenIndex: number): string {\n if (!Number.isInteger(tokenIndex)) {\n throw new Error(\n `Token index must be an integer, got ${String(tokenIndex)}`,\n );\n }\n if (tokenIndex < 0) {\n throw new Error(`Token index must be non-negative, got ${tokenIndex}`);\n }\n if (tokenIndex > MAX_CORE_EVM_TOKEN_INDEX) {\n throw new Error(\n `Token index ${tokenIndex} exceeds safe-integer ceiling ${MAX_CORE_EVM_TOKEN_INDEX}`,\n );\n }\n\n // 19 bytes = 38 hex chars after the 0x20 prefix byte. BigInt formatting\n // keeps us exact across all safe integers.\n const hex = BigInt(tokenIndex).toString(16).padStart(38, \"0\");\n return `0x20${hex}`;\n}\n","// ---------------------------------------------------------------------------\n// HIP-4 Wallet Operations\n//\n// Fund management: transfers between spot/perp, withdrawals, USD sends,\n// and USDH spot buy/sell.\n//\n// Signing:\n// - Transfers, withdrawals, sends: EIP-712 user signing (wallet signer)\n// - USDH buy/sell: L1 agent signing (agent key via auth)\n//\n// Reference: @nktkas/hyperliquid -- withdraw3, usdClassTransfer, usdSend\n// ---------------------------------------------------------------------------\n\nimport { applySlippage } from \"../../lib/precision/financial\";\nimport { toDecimal } from \"../../lib/precision/primitives\";\nimport type { HIP4Auth } from \"./auth\";\nimport type { HIP4Client } from \"./client\";\nimport {\n deriveCoreEvmSystemAddress,\n HYPE_CORE_EVM_SYSTEM_ADDRESS,\n} from \"./core-evm-system-address\";\nimport { formatPrice } from \"./pricing\";\nimport {\n SEND_ASSET_TYPES,\n SEND_TO_EVM_WITH_DATA_TYPES,\n signL1Action,\n signUserSignedAction,\n sortOrderAction,\n SPOT_SEND_TYPES,\n USD_CLASS_TRANSFER_TYPES,\n USD_SEND_TYPES,\n WITHDRAW_TYPES,\n} from \"./signing\";\nimport type { HIP4Signer, HLOrderAction } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsdClassTransferParams {\n amount: string;\n toPerp: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// USDH constants\n//\n// Hyperliquid exposes TWO independent indices for any spot token. Do not\n// conflate them:\n//\n// - TOKEN index: from `info: spotMeta → tokens[].index`. Used to derive the\n// Core→EVM system address and to identify the token on the API. USDH is\n// 360 on mainnet, 1452 on testnet.\n//\n// - SPOT PAIR / MARKET index: from `info: spotMeta → universe[].index`.\n// Used in the `@N` spot-pair notation and `assetId = 10000 + pairIndex`\n// for CLOB orders. USDH/USDC pair is 230 on mainnet, 1338 on testnet.\n//\n// Passing a pair index to `deriveCoreEvmSystemAddress` sends funds to the\n// wrong token. Verified live against the HL API on 2026-04-23.\n// ---------------------------------------------------------------------------\n\n// Spot-pair / market index - CLOB trading only\nexport const USDH_SPOT_INDEX_TESTNET = 1338;\nexport const USDH_SPOT_INDEX_MAINNET = 230;\nexport const USDH_ASSET_ID_TESTNET = 10000 + USDH_SPOT_INDEX_TESTNET;\nexport const USDH_ASSET_ID_MAINNET = 10000 + USDH_SPOT_INDEX_MAINNET;\nexport const USDH_SPOT_PAIR_TESTNET = \"@1338\";\nexport const USDH_SPOT_PAIR_MAINNET = \"@230\";\n\n// Token index - Core→EVM system-address derivation + token-id string\nexport const USDH_TOKEN_INDEX_MAINNET = 360;\nexport const USDH_TOKEN_INDEX_TESTNET = 1452;\nexport const USDH_TOKEN_HASH_MAINNET = \"0x54e00a5988577cb0b0c9ab0cb6ef7f4b\";\nexport const USDH_TOKEN_HASH_TESTNET = \"0x471fd4480bb9943a1fe080ab0d4ff36c\";\nexport const USDH_HL_TOKEN_MAINNET = `USDH:${USDH_TOKEN_HASH_MAINNET}`;\nexport const USDH_HL_TOKEN_TESTNET = `USDH:${USDH_TOKEN_HASH_TESTNET}`;\n\n// USDH ERC-20 on HyperEVM (the linked contract behind the system address).\n// Funds moved via spotSend to the system address are credited here.\nexport const USDH_EVM_ADDRESS_MAINNET =\n \"0x111111a1a0667d36bD57c0A9f569b98057111111\";\nexport const USDH_EVM_ADDRESS_TESTNET =\n \"0x22222245c52c817F95b74664Ae8546B490222222\";\n\n// Decimals are asymmetric across the Core↔EVM boundary. Core uses 8\n// (weiDecimals), HyperEVM ERC-20 uses 6 (weiDecimals + evm_extra_wei_decimals,\n// i.e. 8 + -2). Relevant for any downstream ERC-20 math (approve, balanceOf,\n// Across quoting).\nexport const USDH_CORE_DECIMALS = 8;\nexport const USDH_EVM_DECIMALS = 6;\n\n/** HL spot USDC token identifier. Mainnet index 0, testnet index 0.\n * Format: `\"NAME:0xHEX\"` per sendToEvmWithData / spotSend spec. */\nexport const USDC_HL_TOKEN_MAINNET = \"USDC:0x6d1e7cde53ba9467b783cb7c530ce054\";\nexport const USDC_HL_TOKEN_TESTNET = \"USDC:0xeb62eee3685fc4c43992febcd9e75443\";\n\n/** @deprecated Use network-specific variants (TESTNET/MAINNET) instead */\nexport const USDH_SPOT_INDEX = USDH_SPOT_INDEX_TESTNET;\n/** @deprecated Use network-specific variants (TESTNET/MAINNET) instead */\nexport const USDH_ASSET_ID = USDH_ASSET_ID_TESTNET;\n/** @deprecated Use network-specific variants (TESTNET/MAINNET) instead */\nexport const USDH_SPOT_PAIR = USDH_SPOT_PAIR_TESTNET;\n\nexport interface WithdrawParams {\n destination: string;\n amount: string;\n}\n\nexport interface UsdSendParams {\n destination: string;\n amount: string;\n}\n\nexport interface SpotSendParams {\n destination: string;\n /** Token identifier in Hyperliquid format \"NAME:0xHEX\" (e.g. \"USDH:0x471fd4480bb9943a1fe080ab0d4ff36c\"). */\n token: string;\n amount: string;\n}\n\nexport interface SendAssetParams {\n destination: string;\n /** Token identifier \"NAME:0xHEX\". */\n token: string;\n amount: string;\n /** Source silo: `\"\"` = perp USDC, `\"spot\"` = spot, or a perp DEX name. Defaults to `\"spot\"`. */\n sourceDex?: string;\n /** Destination silo: `\"\"` = perp USDC / EVM system address, `\"spot\"` = spot, or a perp DEX name. Defaults to `\"\"`. */\n destinationDex?: string;\n /** Sub-account to debit. Empty string = main account. */\n fromSubAccount?: string;\n}\n\nexport interface SendSpotTokenToEvmParams {\n /** Token index from `info: spotMeta → tokens[].index`. NOT the spot-pair\n * market index. Passing a pair index routes funds to the wrong token. */\n tokenIndex: number;\n /** Token identifier `\"SYMBOL:0x<32-hex>\"` from the same spotMeta entry. */\n tokenId: string;\n /** Decimal amount in the token's display decimals, as a string. */\n amount: string;\n /** HYPE bypasses index-derived address at `0x2222…2222`. */\n isHype?: boolean;\n}\n\n/** Validates `\"SYMBOL:0x<32-hex>\"` - the token-id format the HL API expects\n * for spotSend / sendToEvmWithData. Empty symbol or wrong hex length both\n * fail loudly here rather than landing a rejected signature on the wire. */\nconst SPOT_TOKEN_ID_PATTERN = /^[A-Z0-9]+:0x[0-9a-f]{32}$/;\n\nexport interface SendToEvmWithDataParams {\n /** Token identifier \"NAME:0xHEX\". */\n token: string;\n /** Decimal amount as a string, in the token's display decimals. */\n amount: string;\n /** Recipient on the destination chain (hex for EVM, base58 for Solana). */\n destinationRecipient: string;\n /** CCTP domain ID of the destination chain (0=Eth, 3=Arb, 6=Base, ...). */\n destinationChainId: number;\n /** Gas budget for the `coreReceiveWithData` call on HyperEVM. Empirical\n * ceiling of the Circle `CoreDepositWallet` path is ~289k; 350k is a\n * safe default. Under-provisioning reverts and funds land badly. */\n gasLimit: number;\n /** Hook data passed to the linked contract. \"0x\" = default Circle forwarder\n * on Arbitrum. Non-magic bytes disable forwarding (user self-attests on\n * destination, not recommended for UX). */\n data?: string;\n /** Hyperliquid perp dex name or \"spot\". Defaults to \"spot\". */\n sourceDex?: string;\n /** Recipient address encoding. Defaults to \"hex\". */\n addressEncoding?: \"hex\" | \"base58\";\n}\n\nexport interface WalletActionResult {\n success: boolean;\n error?: string;\n filledSz?: string;\n avgPx?: string;\n /**\n * Order id of the resulting fill (set only on `success: true` for actions\n * that produce a fill - `buyUsdh`, `sellUsdh`, etc). Callers use this to\n * look up the realized fee in `userFills` / `userFillsByTime`, since the\n * synchronous order ack does not carry fee.\n */\n oid?: number;\n}\n\n// ---------------------------------------------------------------------------\n// HIP4WalletAdapter\n// ---------------------------------------------------------------------------\n\nexport class HIP4WalletAdapter {\n private signer: HIP4Signer | null = null;\n\n constructor(\n private readonly client: HIP4Client,\n private readonly auth: HIP4Auth,\n ) {}\n\n setSigner(\n signer:\n | HIP4Signer\n | {\n address: string;\n signTypedData: (...args: unknown[]) => Promise<string>;\n },\n ): void {\n const obj = signer as Record<string, unknown>;\n\n if (\n typeof obj.getAddress === \"function\" &&\n typeof obj.signTypedData === \"function\"\n ) {\n this.signer = signer as HIP4Signer;\n return;\n }\n\n if (\n typeof obj.address === \"string\" &&\n typeof obj.signTypedData === \"function\"\n ) {\n const addr = obj.address as string;\n const sign = obj.signTypedData as (...args: unknown[]) => Promise<string>;\n this.signer = {\n getAddress: () => addr,\n signTypedData: (domain, types, value) => {\n const primaryType = Object.keys(types)[0];\n if (!primaryType) throw new Error(\"EIP-712 types object is empty\");\n return sign({\n domain,\n types: { ...types },\n primaryType,\n message: value,\n });\n },\n };\n return;\n }\n\n throw new Error(\n \"Invalid signer: must have getAddress()+signTypedData() or address+signTypedData()\",\n );\n }\n\n async buyUsdh(amount: string): Promise<WalletActionResult> {\n return this.executeSpotOrder(true, amount);\n }\n\n async sellUsdh(amount: string): Promise<WalletActionResult> {\n return this.executeSpotOrder(false, amount);\n }\n\n async transferToSpot(amount: string): Promise<WalletActionResult> {\n return this.usdClassTransfer({ amount, toPerp: false });\n }\n\n async transferToPerps(amount: string): Promise<WalletActionResult> {\n return this.usdClassTransfer({ amount, toPerp: true });\n }\n\n async usdClassTransfer(\n params: UsdClassTransferParams,\n ): Promise<WalletActionResult> {\n return this.executeUserSigned(\n \"usdClassTransfer\",\n { amount: params.amount, toPerp: params.toPerp },\n USD_CLASS_TRANSFER_TYPES,\n \"nonce\",\n );\n }\n\n async withdraw(params: WithdrawParams): Promise<WalletActionResult> {\n return this.executeUserSigned(\n \"withdraw3\",\n { destination: params.destination, amount: params.amount },\n WITHDRAW_TYPES,\n \"time\",\n );\n }\n\n async usdSend(params: UsdSendParams): Promise<WalletActionResult> {\n return this.executeUserSigned(\n \"usdSend\",\n { destination: params.destination, amount: params.amount },\n USD_SEND_TYPES,\n \"time\",\n );\n }\n\n async spotSend(params: SpotSendParams): Promise<WalletActionResult> {\n return this.executeUserSigned(\n \"spotSend\",\n {\n destination: params.destination,\n token: params.token,\n amount: params.amount,\n },\n SPOT_SEND_TYPES,\n \"time\",\n );\n }\n\n /**\n * Unified-account-compatible transfer primitive. Supersedes `spotSend`,\n * `usdSend`, `usdClassTransfer`, and `subAccountSpotTransfer` when the\n * account is in `unifiedAccount` or `portfolioMargin` abstraction mode\n * (where silo-specific actions return \"Action disabled when unified\n * account is active\").\n *\n * Use cases:\n * - User → user spot transfer: `sourceDex: \"spot\", destinationDex: \"spot\"`\n * - Core → HyperEVM bridge: `destination = systemAddress`, both dex = `\"\"`\n * - Spot → perp silo move: `sourceDex: \"spot\", destinationDex: \"\"`\n */\n async sendAsset(params: SendAssetParams): Promise<WalletActionResult> {\n return this.executeUserSigned(\n \"sendAsset\",\n {\n destination: params.destination,\n sourceDex: params.sourceDex ?? \"spot\",\n destinationDex: params.destinationDex ?? \"\",\n token: params.token,\n amount: params.amount,\n fromSubAccount: params.fromSubAccount ?? \"\",\n },\n SEND_ASSET_TYPES,\n \"nonce\",\n );\n }\n\n /**\n * Move a spot token from HyperCore to HyperEVM.\n *\n * Mechanism: `sendAsset` to the token's system address, with\n * `sourceDex = \"spot\"` and `destinationDex = \"\"`. HL credits the sender's\n * HyperEVM address by calling `transfer(sender, amount)` on the token's\n * linked ERC-20 contract. No hook data, no CCTP - the token stays as the\n * same token on HyperEVM.\n *\n * Why `sendAsset` and not `spotSend`: `spotSend` is rejected under\n * `unifiedAccount` / `portfolioMargin` abstraction modes with \"Action\n * disabled when unified account is active\". Unified is the app default\n * for new accounts, so `sendAsset` is the only flow that works for both\n * modes.\n *\n * Use this for USDH (and any non-USDC spot token). For USDC destinations\n * on other EVM chains, use `sendUsdcToEvm` instead (CCTP is strictly\n * cheaper + faster than sendAsset-to-HyperEVM + bridge).\n *\n * HYPE is the documented exception: callers must set `isHype: true` so\n * the destination resolves to the hardcoded `0x2222…2222` slot rather\n * than the index-derived address.\n */\n async sendSpotTokenToEvm(\n params: SendSpotTokenToEvmParams,\n ): Promise<WalletActionResult> {\n if (!SPOT_TOKEN_ID_PATTERN.test(params.tokenId)) {\n return {\n success: false,\n error: `Invalid token id ${params.tokenId}: expected \"SYMBOL:0x<32-hex>\"`,\n };\n }\n let destination: string;\n try {\n destination = params.isHype\n ? HYPE_CORE_EVM_SYSTEM_ADDRESS\n : deriveCoreEvmSystemAddress(params.tokenIndex);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : \"Invalid token index\",\n };\n }\n // Core→EVM system-address transfers normalize to sourceDex=\"spot\" +\n // destinationDex=\"spot\" on HL's side (confirmed via ledger inspection\n // on testnet). destinationDex=\"\" routes to the perp USDC silo instead,\n // which rejects with \"Invalid token\" because that silo doesn't hold\n // USDH / arbitrary spot tokens.\n return this.sendAsset({\n destination,\n token: params.tokenId,\n amount: params.amount,\n sourceDex: \"spot\",\n destinationDex: \"spot\",\n });\n }\n\n /**\n * Transfer a spot token from HyperCore to the EVM side, invoking the\n * linked contract's `coreReceiveWithData` hook with user-provided data.\n *\n * For Circle-managed tokens (USDC), this bridges via CCTP directly to\n * `destinationChainId` - `destinationRecipient` receives USDC there. No\n * secondary `withdraw3` or Across hop needed to land on Arbitrum.\n *\n * Fee model: HyperEVM gas (`gasLimit × baseFee × HYPE/USDC_oracle`,\n * deducted from L1 USDC) + Circle forwarder fee on destination (0.2 USDC\n * flat, subtracted from amount). CCTP protocol fee is 0.\n */\n async sendToEvmWithData(\n params: SendToEvmWithDataParams,\n ): Promise<WalletActionResult> {\n return this.executeUserSigned(\n \"sendToEvmWithData\",\n {\n token: params.token,\n amount: params.amount,\n sourceDex: params.sourceDex ?? \"spot\",\n destinationRecipient: params.destinationRecipient,\n addressEncoding: params.addressEncoding ?? \"hex\",\n destinationChainId: params.destinationChainId,\n gasLimit: params.gasLimit,\n data: params.data ?? \"0x\",\n },\n SEND_TO_EVM_WITH_DATA_TYPES,\n \"nonce\",\n );\n }\n\n /**\n * Convenience wrapper: `sendToEvmWithData` with the USDC token string\n * for the current network auto-filled. Circle's CoreDepositWallet picks\n * up the call and CCTPs USDC to `destinationChainId`.\n */\n async sendUsdcToEvm(\n params: Omit<SendToEvmWithDataParams, \"token\">,\n ): Promise<WalletActionResult> {\n const token = this.client.testnet\n ? USDC_HL_TOKEN_TESTNET\n : USDC_HL_TOKEN_MAINNET;\n return this.sendToEvmWithData({ ...params, token });\n }\n\n // -------------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------------\n\n private async executeSpotOrder(\n isBuy: boolean,\n amount: string,\n ): Promise<WalletActionResult> {\n const agentSigner = this.auth.getSigner();\n if (!agentSigner) {\n return {\n success: false,\n error: \"Not authenticated. Call auth.initAuth() first.\",\n };\n }\n\n try {\n const spotIndex = this.client.testnet\n ? USDH_SPOT_INDEX_TESTNET\n : USDH_SPOT_INDEX_MAINNET;\n const assetId = 10000 + spotIndex;\n\n const ctx = await this.client.fetchSpotAssetCtx(spotIndex);\n const oracle = ctx ? toDecimal(ctx.markPx) : null;\n if (!oracle || oracle.lte(0)) {\n return { success: false, error: \"Could not fetch USDH oracle price\" };\n }\n\n // HL strips trailing zeros before msgpack hashing - sending \"1.10000\"\n // when the server hashes \"1.1\" produces a signer mismatch that surfaces\n // as \"Price must be divisible by tick size\". formatPrice rounds to the\n // pair's tick AND strips trailing zeros, matching the path used for\n // outcome trading orders. Do NOT use raw `fixed(..., 5)` here.\n const slipped = applySlippage(ctx!.markPx, \"0.1\", isBuy ? \"buy\" : \"sell\");\n const price = formatPrice(Number(slipped));\n\n const action: HLOrderAction = {\n type: \"order\",\n orders: [\n {\n a: assetId,\n b: isBuy,\n p: price,\n s: amount,\n r: false,\n t: { limit: { tif: \"Ioc\" } },\n },\n ],\n grouping: \"na\",\n };\n\n const sortedAction = sortOrderAction(action);\n const nonce = Date.now();\n const signature = await signL1Action({\n signer: agentSigner,\n action: sortedAction,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n const res = await this.client.placeOrder(\n sortedAction,\n nonce,\n signature,\n null,\n );\n if (res.status !== \"ok\" || !res.response) {\n return { success: false, error: \"Exchange returned non-ok status\" };\n }\n\n const firstStatus = res.response.data.statuses[0];\n if (!firstStatus) {\n return { success: false, error: \"No order status returned\" };\n }\n if (\"error\" in firstStatus) {\n return { success: false, error: firstStatus.error };\n }\n\n const filled =\n \"filled\" in firstStatus\n ? (\n firstStatus as {\n filled: { totalSz: string; avgPx: string; oid: number };\n }\n ).filled\n : undefined;\n return {\n success: true,\n filledSz: filled?.totalSz,\n avgPx: filled?.avgPx,\n oid: filled?.oid,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n return { success: false, error: message };\n }\n }\n\n /**\n * Set a referral code on Hyperliquid.\n * Uses L1 agent signing (requires auth to be initialized).\n */\n async setReferrer(code: string): Promise<WalletActionResult> {\n const signer = this.auth.getSigner();\n if (!signer) {\n return {\n success: false,\n error: \"Not authenticated. Call auth.initAuth() first.\",\n };\n }\n\n try {\n const nonce = Date.now();\n const action = { type: \"setReferrer\" as const, code };\n\n const signature = await signL1Action({\n signer,\n action,\n nonce,\n isTestnet: this.client.testnet,\n });\n\n const res = await this.client.submitUserSignedAction(\n action as unknown as Record<string, unknown>,\n nonce,\n signature,\n );\n\n if (res.status === \"ok\") {\n return { success: true };\n }\n\n let errorMsg = \"Failed to set referrer\";\n if (typeof res.response === \"string\") {\n errorMsg = res.response;\n } else if (\n res.response &&\n typeof res.response === \"object\" &&\n !Array.isArray(res.response)\n ) {\n const obj = res.response as Record<string, unknown>;\n if (typeof obj.error === \"string\") errorMsg = obj.error;\n }\n return { success: false, error: errorMsg };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n return { success: false, error: message };\n }\n }\n\n private async executeUserSigned(\n type: string,\n fields: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n nonceFieldName: \"nonce\" | \"time\",\n ): Promise<WalletActionResult> {\n if (!this.signer) {\n return {\n success: false,\n error: \"No wallet signer set. Call wallet.setSigner() first.\",\n };\n }\n\n try {\n const nonce = Date.now();\n\n const action: Record<string, unknown> & { signatureChainId: string } = {\n type,\n signatureChainId: this.client.testnet ? \"0x66eee\" : \"0xa4b1\",\n hyperliquidChain: this.client.testnet ? \"Testnet\" : \"Mainnet\",\n ...fields,\n [nonceFieldName]: nonce,\n };\n\n const signature = await signUserSignedAction({\n signer: this.signer,\n action,\n types,\n });\n\n const res = await this.client.submitUserSignedAction(\n action,\n nonce,\n signature,\n );\n\n if (res.status === \"ok\") {\n return { success: true };\n }\n\n let errorMsg = \"Action failed\";\n if (typeof res.response === \"string\") {\n errorMsg = res.response;\n } else if (\n res.response &&\n typeof res.response === \"object\" &&\n !Array.isArray(res.response)\n ) {\n const obj = res.response as Record<string, unknown>;\n if (typeof obj.error === \"string\") errorMsg = obj.error;\n }\n return { success: false, error: errorMsg };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n return { success: false, error: message };\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Hyperliquid HIP-4 Adapter - composes sub-adapters around a shared client\n//\n// HIP-4 prediction markets reuse the standard HL REST/WS API with:\n// @<outcomeId> - outcome-level instrument (AMM-managed)\n// #<outcomeId><sideIndex> - per-side probability market (0-1 range)\n// ---------------------------------------------------------------------------\n\nimport type { CreateHIP4AdapterConfig } from \"../factory\";\nimport type { PredictionsAdapter } from \"../types\";\nimport { HIP4AccountAdapter } from \"./account\";\nimport { HIP4Auth } from \"./auth\";\nimport { HIP4Client } from \"./client\";\nimport { HIP4EventAdapter } from \"./events\";\nimport { HIP4MarketDataAdapter } from \"./market-data\";\nimport { HIP4TradingAdapter } from \"./trading\";\nimport { HIP4WalletAdapter } from \"./wallet\";\n\nexport class HyperliquidHip4Adapter implements PredictionsAdapter {\n readonly id = \"hyperliquid\";\n readonly name: string;\n readonly events: HIP4EventAdapter;\n readonly marketData: PredictionsAdapter[\"marketData\"];\n readonly account: PredictionsAdapter[\"account\"];\n readonly trading: HIP4TradingAdapter;\n readonly auth: PredictionsAdapter[\"auth\"];\n readonly wallet: HIP4WalletAdapter;\n\n readonly client: HIP4Client;\n private readonly _marketData: HIP4MarketDataAdapter;\n\n constructor(config: CreateHIP4AdapterConfig = {}) {\n const testnet = config.testnet ?? true;\n this.name = testnet ? \"Hyperliquid HIP-4 (Testnet)\" : \"Hyperliquid HIP-4\";\n\n this.client = new HIP4Client({\n testnet,\n infoUrl: config.infoUrl,\n exchangeUrl: config.exchangeUrl,\n logger: config.logger,\n });\n\n const auth = new HIP4Auth();\n const eventAdapter = new HIP4EventAdapter(this.client);\n this.events = eventAdapter;\n const sideNameResolver = eventAdapter.getSideNameResolver();\n const ensureSideNames = () => eventAdapter.ensureSideNames();\n this._marketData = new HIP4MarketDataAdapter(this.client, sideNameResolver, ensureSideNames);\n this.marketData = this._marketData;\n this.account = new HIP4AccountAdapter(this.client, eventAdapter, sideNameResolver);\n this.trading = new HIP4TradingAdapter(this.client, auth, {\n builderAddress: config.builderAddress,\n builderFee: config.builderFee,\n });\n this.auth = auth;\n this.wallet = new HIP4WalletAdapter(this.client, auth);\n }\n\n\n async initialize(): Promise<void> {\n // Populate the side names cache from outcomeMeta so sideSpec names are\n // available before any market data or account queries.\n await this.events.ensureSideNames();\n }\n\n destroy(): void {\n this.client.closeWs();\n this.auth.clearAuth();\n }\n}\n","import { HyperliquidHip4Adapter } from \"./hyperliquid\";\n\n/** Configuration for creating a HIP-4 prediction market adapter. */\nexport interface CreateHIP4AdapterConfig {\n\ttestnet?: boolean;\n\tinfoUrl?: string;\n\texchangeUrl?: string;\n\t/**\n\t * Builder address for fee collection.\n\t * When set, all orders will include this builder address.\n\t */\n\tbuilderAddress?: string;\n\t/**\n\t * Builder fee in tenths of a basis point (0-1000).\n\t * 0 = no fee. 100 = 0.1%. 1000 = 1.0% (maximum).\n\t */\n\tbuilderFee?: number;\n\t/** Optional logger. Default: no-op. */\n\tlogger?: (\n\t\tlevel: \"debug\" | \"info\" | \"warn\" | \"error\",\n\t\tmsg: string,\n\t\tdata?: unknown,\n\t) => void;\n}\n\n/** Create a PredictionsAdapter backed by Hyperliquid HIP-4 spot markets. */\nexport function createHIP4Adapter(\n\tconfig: CreateHIP4AdapterConfig = {},\n): HyperliquidHip4Adapter {\n\treturn new HyperliquidHip4Adapter(config);\n}\n","import { splitHexSignature, type HLSignature } from \"./types\";\n\nconst HL_MAINNET_CHAIN_ID = 42161;\nconst HL_TESTNET_CHAIN_ID = 421614;\n\nfunction getEIP712Domain(isMainnet: boolean) {\n return {\n name: \"HyperliquidSignTransaction\",\n version: \"1\",\n chainId: isMainnet ? HL_MAINNET_CHAIN_ID : HL_TESTNET_CHAIN_ID,\n verifyingContract:\n \"0x0000000000000000000000000000000000000000\" as `0x${string}`,\n } as const;\n}\n\nconst HL_MAINNET_API = \"https://api.hyperliquid.xyz\";\nconst HL_TESTNET_API = \"https://api.hyperliquid-testnet.xyz\";\n\n/** Build EIP-712 typed data for an agent-wallet approval signature. */\nexport function getAgentApprovalTypedData(\n agentAddress: `0x${string}`,\n agentName: string,\n nonce: number,\n isMainnet = true,\n) {\n return {\n domain: getEIP712Domain(isMainnet),\n types: {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n },\n primaryType: \"HyperliquidTransaction:ApproveAgent\" as const,\n message: {\n hyperliquidChain: isMainnet ? \"Mainnet\" : \"Testnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName,\n nonce: BigInt(nonce),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Builder fee approval\n// ---------------------------------------------------------------------------\n\n/** EIP-712 types for builder fee approval. */\nexport const APPROVE_BUILDER_FEE_TYPES: Record<\n string,\n Array<{ name: string; type: string }>\n> = {\n \"HyperliquidTransaction:ApproveBuilderFee\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"maxFeeRate\", type: \"string\" },\n { name: \"builder\", type: \"address\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n};\n\n/** Build EIP-712 typed data for a builder-fee approval signature. */\nexport function getBuilderFeeApprovalTypedData(\n builderAddress: `0x${string}`,\n maxFeeRate: string,\n nonce: number,\n isMainnet = true,\n) {\n return {\n domain: getEIP712Domain(isMainnet),\n types: APPROVE_BUILDER_FEE_TYPES,\n primaryType: \"HyperliquidTransaction:ApproveBuilderFee\",\n message: {\n hyperliquidChain: isMainnet ? \"Mainnet\" : \"Testnet\",\n maxFeeRate,\n builder: builderAddress.toLowerCase() as `0x${string}`,\n nonce: BigInt(nonce),\n },\n };\n}\n\n/** Submit a signed builder-fee approval to the Hyperliquid exchange API. */\nexport async function submitBuilderFeeApproval(\n signature: `0x${string}`,\n builderAddress: `0x${string}`,\n maxFeeRate: string,\n nonce: number,\n isMainnet = true,\n exchangeUrl?: string,\n): Promise<{ success: boolean; error?: string }> {\n const parsedSig: HLSignature = splitHexSignature(signature);\n\n const action = {\n type: \"approveBuilderFee\",\n signatureChainId: isMainnet ? \"0xa4b1\" : \"0x66eee\",\n hyperliquidChain: isMainnet ? \"Mainnet\" : \"Testnet\",\n maxFeeRate,\n builder: builderAddress.toLowerCase(),\n nonce,\n };\n\n try {\n const url =\n exchangeUrl ?? `${isMainnet ? HL_MAINNET_API : HL_TESTNET_API}/exchange`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n action,\n nonce,\n signature: parsedSig,\n }),\n });\n\n const result = (await response.json()) as {\n status?: string;\n response?: { error?: string } | string;\n };\n\n if (result.status === \"ok\") {\n return { success: true };\n }\n\n const errorMsg =\n typeof result.response === \"string\"\n ? result.response\n : result.response?.error ?? \"Failed to approve builder fee\";\n return { success: false, error: errorMsg };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Network error\",\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Set referrer\n// ---------------------------------------------------------------------------\n// Agent approval\n// ---------------------------------------------------------------------------\n\n/** Submit a signed agent-approval transaction to the Hyperliquid exchange API. */\nexport async function submitAgentApproval(\n signature: `0x${string}`,\n agentAddress: `0x${string}`,\n agentName: string,\n nonce: number,\n isMainnet = true,\n exchangeUrl?: string,\n): Promise<{ success: boolean; error?: string }> {\n const parsedSig: HLSignature = splitHexSignature(signature);\n\n const action = {\n type: \"approveAgent\",\n signatureChainId: isMainnet ? \"0xa4b1\" : \"0x66eee\",\n hyperliquidChain: isMainnet ? \"Mainnet\" : \"Testnet\",\n agentAddress: agentAddress.toLowerCase(),\n agentName,\n nonce,\n };\n\n try {\n const url =\n exchangeUrl ?? `${isMainnet ? HL_MAINNET_API : HL_TESTNET_API}/exchange`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n action,\n nonce,\n signature: parsedSig,\n }),\n });\n\n const result = (await response.json()) as {\n status?: string;\n response?: string | { error?: string };\n };\n\n if (result.status === \"ok\") {\n return { success: true };\n }\n\n const error =\n typeof result.response === \"string\"\n ? result.response\n : (result.response?.error ?? \"Failed to approve agent\");\n return { success: false, error };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Network error\",\n };\n }\n}\n","// ---------------------------------------------------------------------------\n// Core → HyperEVM transfer fee estimator\n//\n// HL docs (verbatim): \"A transfer from HyperCore to HyperEVM costs 200k gas\n// at the base gas price of the next HyperEVM block.\"\n//\n// Empirically confirmed byte-for-byte on testnet via `sendAsset`:\n// fee_usd = CORE_TO_EVM_GAS_LIMIT × baseFeeWei × hypeSpotMarkPx_usd / 1e18\n//\n// Debit currency hierarchy (confirmed empirically):\n// 1. Core spot HYPE if balance ≥ fee_hype → debited in HYPE directly\n// (formula collapses to `gasLimit × baseFeeWei / 1e18`, no price needed)\n// 2. Otherwise → debited in the source token at fee_usd / sourceTokenPrice\n//\n// The helper is pure. RPC plumbing (feeHistory + spot markPx fetch) is the\n// caller's job - inject the values once resolved. This keeps the core\n// formula hermetic and unit-testable without network.\n// ---------------------------------------------------------------------------\n\n/** HL-canonical gas budget for Core→HyperEVM system-tx credit. Fixed, from\n * the docs. Over/under-provisioning at the action level is not applicable\n * - the protocol uses exactly this value. */\nexport const CORE_TO_EVM_GAS_LIMIT = 200_000n;\n\nexport interface CoreToEvmFeeInputs {\n /** HyperEVM block baseFee in wei. Prefer a median-over-history sample\n * (`medianBaseFeeWei`) to stay robust against single-block MEV spikes. */\n readonly baseFeeWei: bigint;\n /** User's HYPE balance on HL Core spot, as a decimal number. */\n readonly hypeCoreSpotBalance: number;\n /** HYPE/USDC spot `markPx` in USD. Source: HL info endpoint,\n * `{\"type\":\"spotMetaAndAssetCtxs\"}`, pair `@107` mainnet / `@1035` testnet.\n * Using midPx or perp mark diverges from HL's actual debit. */\n readonly hypeSpotMarkPxUsd: number;\n /** USD price of the token being sent (USDH ≈ 1.0). Used only in the\n * source-token fallback path - ignored when the user has HYPE. */\n readonly sourceTokenPriceUsd: number;\n}\n\nexport interface CoreToEvmFeeBreakdown {\n /** Which balance HL will actually debit. */\n readonly currency: \"HYPE\" | \"source\";\n /** Fee amount if debited in HYPE. Zero in the source-token path. */\n readonly amountHype: number;\n /** Fee amount if debited in the source token. Zero in the HYPE path. */\n readonly amountSourceToken: number;\n /** USD-equivalent of the fee. Identical between both paths. */\n readonly usd: number;\n /** Echoed back for UI tooltips / audit. */\n readonly gasLimit: bigint;\n readonly baseFeeWei: bigint;\n}\n\n/**\n * Estimate the Core→HyperEVM transfer fee and which balance will be debited.\n *\n * Pure, synchronous. Call once per quote with freshly-fetched inputs.\n */\nexport function estimateCoreToEvmFee(\n inputs: CoreToEvmFeeInputs,\n): CoreToEvmFeeBreakdown {\n if (inputs.hypeCoreSpotBalance < 0) {\n throw new Error(\n `hypeCoreSpotBalance must be non-negative, got ${inputs.hypeCoreSpotBalance}`,\n );\n }\n if (inputs.sourceTokenPriceUsd <= 0) {\n throw new Error(\n `sourceTokenPriceUsd must be positive, got ${inputs.sourceTokenPriceUsd}`,\n );\n }\n if (inputs.hypeSpotMarkPxUsd <= 0) {\n throw new Error(\n `hypeSpotMarkPxUsd must be positive, got ${inputs.hypeSpotMarkPxUsd}`,\n );\n }\n\n const zeroBase: CoreToEvmFeeBreakdown = {\n currency: \"source\",\n amountHype: 0,\n amountSourceToken: 0,\n usd: 0,\n gasLimit: CORE_TO_EVM_GAS_LIMIT,\n baseFeeWei: inputs.baseFeeWei,\n };\n if (inputs.baseFeeWei <= 0n) return zeroBase;\n\n // Stay in the bigint domain as long as possible to avoid precision loss on\n // gas × baseFee. Realistic product is ~10^13 wei - safe JS integer range\n // after dividing to gwei (/ 1e9).\n const gasWei = CORE_TO_EVM_GAS_LIMIT * inputs.baseFeeWei;\n const gasGwei = Number(gasWei / 1_000_000_000n);\n const feeHype = gasGwei / 1e9;\n const feeUsd = feeHype * inputs.hypeSpotMarkPxUsd;\n\n if (inputs.hypeCoreSpotBalance >= feeHype) {\n return {\n currency: \"HYPE\",\n amountHype: feeHype,\n amountSourceToken: 0,\n usd: feeUsd,\n gasLimit: CORE_TO_EVM_GAS_LIMIT,\n baseFeeWei: inputs.baseFeeWei,\n };\n }\n\n return {\n currency: \"source\",\n amountHype: 0,\n amountSourceToken: feeUsd / inputs.sourceTokenPriceUsd,\n usd: feeUsd,\n gasLimit: CORE_TO_EVM_GAS_LIMIT,\n baseFeeWei: inputs.baseFeeWei,\n };\n}\n\n/**\n * Median over an `eth_feeHistory` baseFee sample.\n *\n * Why median, not max: a single MEV-saturated block can spike baseFee briefly\n * before mean-reverting under EIP-1559's 12.5%-per-block decay. `max` lets\n * one outlier dominate the UI quote; `median` is robust in both directions\n * while still tracking genuine trends over a few blocks' lag.\n *\n * Why not a safety multiplier on top: the fee we display is the fee the\n * user pays. Padding the display hides the true accounting - users compare\n * UI fee vs ledger debit and notice. Accuracy over pessimism.\n */\nexport function medianBaseFeeWei(samples: readonly bigint[]): bigint {\n if (samples.length === 0) {\n throw new Error(\"medianBaseFeeWei: empty sample array\");\n }\n for (const s of samples) {\n if (s < 0n) {\n throw new Error(\n `medianBaseFeeWei: non-negative values required, got ${s}`,\n );\n }\n }\n const sorted = [...samples].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const mid = sorted.length >> 1;\n if (sorted.length % 2 === 1) {\n return sorted[mid] as bigint;\n }\n const a = sorted[mid - 1] as bigint;\n const b = sorted[mid] as bigint;\n return (a + b) / 2n;\n}\n","// ---------------------------------------------------------------------------\n// HYPE/USDC spot markPx selector\n//\n// Pure selector over the bulk `spotAssetCtxs` WS subscription the app\n// already maintains. No new WS subscription - the app pipes live spotAssetCtxs\n// into its store, and consumers that need HYPE markPx just read through this\n// selector. This is the authoritative price HL uses to debit Core→EVM gas\n// when the sender has no HYPE on Core spot.\n//\n// Live-confirmed pair coins (2026-04-23):\n// - Mainnet: \"@107\"\n// - Testnet: \"@1035\"\n// ---------------------------------------------------------------------------\n\nimport type { HLWsSpotAssetCtxItem } from \"./types\";\n\nexport const HYPE_USDC_SPOT_PAIR_MAINNET = \"@107\" as const;\nexport const HYPE_USDC_SPOT_PAIR_TESTNET = \"@1035\" as const;\n\nexport interface SelectHypeSpotMarkPxOptions {\n readonly testnet?: boolean;\n}\n\n/**\n * Pull the HYPE/USDC `markPx` (USD) from a bulk spotAssetCtxs store map.\n *\n * Returns `null` when the pair entry is missing or its markPx is not a\n * positive finite number. Callers should treat `null` as \"price not yet\n * available\" (pre-WS-hydration) rather than zero.\n *\n * Deliberately does NOT fall back to midPx when markPx is absent - midPx\n * diverges from markPx during volatile periods and using it would misprice\n * the fee relative to HL's actual debit.\n */\nexport function selectHypeSpotMarkPx(\n ctxs: Record<string, HLWsSpotAssetCtxItem | undefined>,\n options: SelectHypeSpotMarkPxOptions = {},\n): number | null {\n const coin = options.testnet\n ? HYPE_USDC_SPOT_PAIR_TESTNET\n : HYPE_USDC_SPOT_PAIR_MAINNET;\n const ctx = ctxs[coin];\n if (!ctx) return null;\n const raw = ctx.markPx;\n if (!raw) return null;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) return null;\n return parsed;\n}\n\nexport interface SpotMetaShape {\n readonly tokens: ReadonlyArray<{ name: string; index: number }>;\n readonly universe: ReadonlyArray<{\n index: number;\n tokens: readonly [number, number];\n }>;\n}\n\n/**\n * Discover the HYPE/USDC pair coin string (`@N`) dynamically from spotMeta.\n *\n * Belt-and-suspenders against HL renumbering. The hardcoded constants above\n * are the steady-state truth; this helper lets a caller recover gracefully\n * if HL ever reindexes a pair. USDC is always token index 0.\n */\nexport function findHypeUsdcSpotPairCoin(meta: SpotMetaShape): string | null {\n const hype = meta.tokens.find((t) => t.name === \"HYPE\");\n if (!hype) return null;\n const pair = meta.universe.find(\n (p) => p.tokens[0] === hype.index && p.tokens[1] === 0,\n );\n if (!pair) return null;\n return `@${pair.index}`;\n}\n","// ---------------------------------------------------------------------------\n// Shared candle utilities for price feed streams\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface PriceFeedCandle {\n /** Unix timestamp in **seconds** (matches fetchCandles convention). */\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\n// ---------------------------------------------------------------------------\n// Interval helpers\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_REGEX = /^(\\d+)([mhd])$/;\n\n/** Convert an interval string like `\"1h\"` to milliseconds. Falls back to 1 h. */\nexport function intervalToMs(interval: string): number {\n const match = interval.match(INTERVAL_REGEX);\n if (!match) return 3_600_000;\n const n = Number(match[1]);\n switch (match[2]) {\n case \"m\":\n return n * 60_000;\n case \"h\":\n return n * 3_600_000;\n case \"d\":\n return n * 86_400_000;\n default:\n return 3_600_000;\n }\n}\n\n/** Floor a millisecond timestamp to its candle boundary (in ms). */\nexport function candleBoundaryMs(\n timestampMs: number,\n intervalMs: number,\n): number {\n return Math.floor(timestampMs / intervalMs) * intervalMs;\n}\n\n// ---------------------------------------------------------------------------\n// Candle accumulation\n// ---------------------------------------------------------------------------\n\n/**\n * Process a price tick against a mutable candle array.\n * Either updates the last candle's OHLC or appends a new one.\n * Returns `true` if the tick was applied (not stale).\n *\n * Internal mutable accumulator - callers own the array and snapshot via\n * `candles.map(c => ({ ...c }))` before emitting to consumers.\n */\nexport function processTick(\n candles: PriceFeedCandle[],\n price: number,\n timestampMs: number,\n intervalMs: number,\n): boolean {\n if (candles.length === 0) {\n const boundary = candleBoundaryMs(timestampMs, intervalMs);\n candles.push({\n time: boundary / 1000,\n open: price,\n high: price,\n low: price,\n close: price,\n volume: 0,\n });\n return true;\n }\n\n const last = candles[candles.length - 1];\n const lastBoundaryMs = last.time * 1000;\n const tickBoundaryMs = candleBoundaryMs(timestampMs, intervalMs);\n\n if (tickBoundaryMs === lastBoundaryMs) {\n last.close = price;\n last.high = Math.max(last.high, price);\n last.low = Math.min(last.low, price);\n return true;\n }\n\n if (tickBoundaryMs > lastBoundaryMs) {\n candles.push({\n time: tickBoundaryMs / 1000,\n open: price,\n high: price,\n low: price,\n close: price,\n volume: 0,\n });\n return true;\n }\n\n // Tick older than the last candle - silently dropped\n return false;\n}\n","// ---------------------------------------------------------------------------\n// Perp Price Feed Stream\n// ---------------------------------------------------------------------------\n// Merges historical OHLCV candles with real-time candle WebSocket updates\n// for a perpetual market coin (e.g. \"BTC\", \"ETH\", \"HYPE\").\n//\n// Uses two WebSocket channels:\n// - `candle` subscription for authoritative OHLCV candle updates\n// - `allMids` subscription for live mid-price (currentMid only)\n//\n// Usage:\n// const unsub = createPerpPriceFeed(hip4Client, \"BTC\", (snap) => {\n// renderChart(snap.candles);\n// });\n// ---------------------------------------------------------------------------\n\nimport type { HIP4Client } from \"../adapter/hyperliquid/client\";\nimport { type PriceFeedCandle, intervalToMs } from \"./candle-utils\";\n\n// Re-export candle type for consumers\nexport { type PriceFeedCandle } from \"./candle-utils\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface PerpPriceFeedOptions {\n /** Candle interval string accepted by Hyperliquid (e.g. \"1m\", \"5m\", \"1h\", \"1d\"). Default: `\"1h\"`. */\n interval?: string;\n /** How far back to fetch historical candles, in milliseconds. Default: 14 days. */\n lookbackMs?: number;\n}\n\nexport interface PerpPriceFeedSnapshot {\n coin: string;\n /** Full candle array (historical + live). */\n candles: PriceFeedCandle[];\n /** Latest mid-price received (may be newer than the last candle close). */\n currentMid: number | null;\n /** `false` until the initial candle fetch resolves. */\n ready: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface RawWsCandle {\n t: number;\n o: string;\n c: string;\n h: string;\n l: string;\n v: string;\n s?: string;\n i?: string;\n}\n\nfunction parseWsCandle(raw: RawWsCandle): PriceFeedCandle {\n return {\n time: raw.t / 1000,\n open: parseFloat(raw.o),\n high: parseFloat(raw.h),\n low: parseFloat(raw.l),\n close: parseFloat(raw.c),\n volume: parseFloat(raw.v),\n };\n}\n\nfunction mergeCandle(\n candles: PriceFeedCandle[],\n incoming: PriceFeedCandle,\n): void {\n if (candles.length === 0) {\n candles.push(incoming);\n return;\n }\n\n const last = candles[candles.length - 1];\n\n if (incoming.time === last.time) {\n last.open = incoming.open;\n last.high = incoming.high;\n last.low = incoming.low;\n last.close = incoming.close;\n last.volume = incoming.volume;\n } else if (incoming.time > last.time) {\n candles.push(incoming);\n }\n // Older candles are silently dropped\n}\n\n/**\n * If the last candle is older than the chart window, bridge the gap by\n * inserting a flat candle one interval before now. The first live tick\n * then creates a sharp step rather than a long diagonal.\n */\nfunction bridgeToNow(candles: PriceFeedCandle[], intervalMs: number): void {\n if (candles.length === 0) return;\n\n const last = candles[candles.length - 1];\n const nowMs = Date.now();\n const lastMs = last.time * 1000;\n\n if (nowMs - lastMs <= intervalMs * 2) return;\n\n const boundary = Math.floor(nowMs / intervalMs) * intervalMs - intervalMs;\n if (boundary <= lastMs) return;\n\n candles.push({\n time: boundary / 1000,\n open: last.close,\n high: last.close,\n low: last.close,\n close: last.close,\n volume: 0,\n });\n}\n\n/** Trim candles to the display window, keeping one anchor before the start. */\nfunction trimToWindow(\n candles: PriceFeedCandle[],\n lookbackMs: number,\n): PriceFeedCandle[] {\n if (candles.length === 0) return candles;\n const windowStartSec = (Date.now() - lookbackMs) / 1000;\n const firstInWindow = candles.findIndex((c) => c.time >= windowStartSec);\n if (firstInWindow === 0) return candles;\n if (firstInWindow === -1) return candles.slice(-1);\n return candles.slice(firstInWindow - 1);\n}\n\n// ---------------------------------------------------------------------------\n// Core\n// ---------------------------------------------------------------------------\n\n/**\n * Create a live price feed for a perpetual market coin.\n *\n * 1. Subscribes to `allMids` for live mid-price updates (currentMid).\n * 2. Subscribes to `candle` WS for authoritative OHLCV candle updates.\n * 3. Fetches historical candles for the lookback window.\n * 4. After historical fetch, replays buffered data and emits snapshots\n * on every candle WS update or allMids tick.\n *\n * Returns an **unsubscribe** function - call it to stop the feed.\n */\nexport function createPerpPriceFeed(\n client: HIP4Client,\n coin: string,\n onSnapshot: (snapshot: PerpPriceFeedSnapshot) => void,\n options?: PerpPriceFeedOptions,\n): () => void {\n const interval = options?.interval ?? \"1h\";\n const lookbackMs = options?.lookbackMs ?? 14 * 24 * 60 * 60 * 1000;\n const intervalMs = intervalToMs(interval);\n\n let destroyed = false;\n let candles: PriceFeedCandle[] = [];\n let currentMid: number | null = null;\n let ready = false;\n let receivedCandleWs = false;\n let bufferedCandles: RawWsCandle[] = [];\n\n // -- helpers ---------------------------------------------------------------\n\n function emit() {\n if (destroyed) return;\n const trimmed = trimToWindow(candles, lookbackMs);\n onSnapshot({\n coin,\n candles: trimmed.map((c) => ({ ...c })),\n currentMid,\n ready,\n });\n }\n\n // -- subscribe to allMids for initial currentMid fallback only --------------\n // Mark price (from activeAssetCtx) is the authoritative currentMid.\n // allMids only provides the initial fallback before mark price arrives.\n // It does NOT build candles - candle data comes only from candleSnapshot\n // and candle WS.\n\n const unsubMids = client.subscribe({ type: \"allMids\" }, (data: unknown) => {\n if (destroyed) return;\n\n const mids = (data as { mids?: Record<string, string> })?.mids;\n if (!mids) return;\n\n const raw = mids[coin];\n if (raw === undefined) return;\n\n const mid = Number.parseFloat(raw);\n if (Number.isNaN(mid)) return;\n\n if (currentMid === null) {\n currentMid = mid;\n if (ready) emit();\n }\n });\n\n // -- subscribe to candle WS for authoritative OHLCV updates ----------------\n\n const unsubCandle = client.subscribe(\n { type: \"candle\", coin, interval },\n (data: unknown) => {\n if (destroyed) return;\n\n const raw = data as RawWsCandle;\n if (!raw?.t || !raw?.o) return;\n if (raw.s !== undefined && raw.s !== coin) return;\n if (raw.i !== undefined && raw.i !== interval) return;\n\n receivedCandleWs = true;\n\n if (!ready) {\n bufferedCandles.push(raw);\n return;\n }\n\n mergeCandle(candles, parseWsCandle(raw));\n emit();\n },\n );\n\n // -- subscribe to activeAssetCtx for mark price ----------------------------\n\n const unsubMarkPrice = client.subscribe(\n { type: \"activeAssetCtx\", coin },\n (data: unknown) => {\n if (destroyed) return;\n\n const msg = data as { coin?: string; ctx?: { markPx?: string } };\n if (!msg?.ctx?.markPx) return;\n if (msg.coin !== coin) return;\n\n const mark = Number.parseFloat(msg.ctx.markPx);\n if (Number.isNaN(mark)) return;\n\n currentMid = mark;\n if (ready) emit();\n },\n );\n\n // -- fetch historical candles ----------------------------------------------\n\n // Fetch with at least 7 days of lookback to find the last available candle,\n // even if the chart display window is shorter (e.g., 1 hour).\n // bridgeToNow() will connect old candles to the present time.\n const MIN_FETCH_LOOKBACK = 7 * 24 * 60 * 60 * 1000;\n const fetchLookback = Math.max(lookbackMs, MIN_FETCH_LOOKBACK);\n const now = Date.now();\n client\n .fetchCandleSnapshot(coin, interval, now - fetchLookback, now)\n .then((historical) => {\n if (destroyed) return;\n\n candles = historical.map((c) => ({\n time: c.t / 1000,\n open: parseFloat(c.o),\n high: parseFloat(c.h),\n low: parseFloat(c.l),\n close: parseFloat(c.c),\n volume: parseFloat(c.v),\n }));\n\n // Replay buffered candle WS updates first (authoritative)\n for (const raw of bufferedCandles) {\n mergeCandle(candles, parseWsCandle(raw));\n }\n bufferedCandles = [];\n\n bridgeToNow(candles, intervalMs);\n ready = true;\n emit();\n })\n .catch((err: unknown) => {\n console.warn(\"[perp-price-feed] candle fetch failed:\", err);\n if (destroyed) return;\n\n // Replay buffered candle WS updates\n for (const raw of bufferedCandles) {\n mergeCandle(candles, parseWsCandle(raw));\n }\n bufferedCandles = [];\n\n bridgeToNow(candles, intervalMs);\n ready = true;\n emit();\n });\n\n // -- teardown --------------------------------------------------------------\n\n return () => {\n destroyed = true;\n unsubMids();\n unsubCandle();\n unsubMarkPrice();\n };\n}\n","// ---------------------------------------------------------------------------\n// Price Feed Stream\n// ---------------------------------------------------------------------------\n// Merges historical candles with real-time mid-price ticks into a single\n// continuously-updating candle array. Designed to power live charts.\n//\n// Usage:\n// const unsub = createPriceFeed(adapter.marketData, \"516\", (snap) => {\n// renderChart(snap.candles);\n// });\n// ---------------------------------------------------------------------------\n\nimport type {\n PredictionMarketDataAdapter,\n Unsubscribe,\n} from \"../adapter/types\";\nimport {\n type PriceFeedCandle,\n intervalToMs,\n processTick as processTickUtil,\n} from \"./candle-utils\";\n\n// Re-export so existing consumers are not broken\nexport { intervalToMs, type PriceFeedCandle };\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface PriceFeedOptions {\n /** Candle interval string accepted by Hyperliquid (e.g. \"1m\", \"5m\", \"1h\", \"1d\"). Default: `\"1h\"`. */\n interval?: string;\n /** How far back to fetch historical candles, in milliseconds. Default: 14 days. */\n lookbackMs?: number;\n /** Which side to track - 0 for Yes, 1 for No. Default: `0`. */\n sideIndex?: number;\n}\n\nexport interface PriceFeedSnapshot {\n marketId: string;\n /** Full candle array (historical + live). */\n candles: PriceFeedCandle[];\n /** Latest mid-price received (may be newer than the last candle close). */\n currentMid: number | null;\n /** `false` until the initial candle fetch resolves. */\n ready: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Core\n// ---------------------------------------------------------------------------\n\n/**\n * Create a live price feed for a single prediction market.\n *\n * 1. Immediately subscribes to real-time mid-price updates (ticks are buffered\n * until the historical fetch completes).\n * 2. Fetches historical candles for the lookback window.\n * 3. Merges buffered ticks into the candle array.\n * 4. On every subsequent tick, updates the latest candle or appends a new one,\n * then emits a {@link PriceFeedSnapshot}.\n *\n * Returns an **unsubscribe** function - call it to stop the feed.\n */\nexport function createPriceFeed(\n marketData: PredictionMarketDataAdapter,\n marketId: string,\n onSnapshot: (snapshot: PriceFeedSnapshot) => void,\n options?: PriceFeedOptions,\n): Unsubscribe {\n const interval = options?.interval ?? \"1h\";\n const lookbackMs = options?.lookbackMs ?? 14 * 24 * 60 * 60 * 1000;\n const sideIndex = options?.sideIndex ?? 0;\n const intervalMs = intervalToMs(interval);\n\n let destroyed = false;\n let candles: PriceFeedCandle[] = [];\n let currentMid: number | null = null;\n let ready = false;\n let bufferedTicks: Array<{ price: number; timestamp: number }> = [];\n\n // -- helpers ---------------------------------------------------------------\n\n function emit() {\n if (destroyed) return;\n onSnapshot({\n marketId,\n candles: candles.map((c) => ({ ...c })),\n currentMid,\n ready,\n });\n }\n\n function processTick(price: number, timestampMs: number) {\n currentMid = price;\n processTickUtil(candles, price, timestampMs, intervalMs);\n }\n\n // -- subscribe immediately (buffer until candles arrive) -------------------\n\n const unsubPrice = marketData.subscribePrice(marketId, (priceData) => {\n if (destroyed) return;\n\n const outcome = priceData.outcomes[sideIndex];\n if (!outcome) return;\n\n const mid = parseFloat(outcome.midpoint);\n if (Number.isNaN(mid)) return;\n\n if (!ready) {\n bufferedTicks.push({ price: mid, timestamp: priceData.timestamp });\n return;\n }\n\n processTick(mid, priceData.timestamp);\n emit();\n });\n\n // -- fetch historical candles ----------------------------------------------\n\n const now = Date.now();\n marketData\n .fetchCandles(marketId, interval, now - lookbackMs, now)\n .then((historical) => {\n if (destroyed) return;\n\n candles = historical.map((c) => ({\n time: c.time,\n open: c.open,\n high: c.high,\n low: c.low,\n close: c.close,\n volume: c.volume,\n }));\n\n // Replay any ticks that arrived while we were fetching\n for (const tick of bufferedTicks) {\n processTick(tick.price, tick.timestamp);\n }\n bufferedTicks = [];\n\n ready = true;\n emit();\n })\n .catch(() => {\n if (destroyed) return;\n // If candle fetch fails, go live-only\n for (const tick of bufferedTicks) {\n processTick(tick.price, tick.timestamp);\n }\n bufferedTicks = [];\n ready = true;\n emit();\n });\n\n // -- teardown --------------------------------------------------------------\n\n return () => {\n destroyed = true;\n unsubPrice();\n };\n}\n","import {\n toDecimal,\n toNum,\n} from \"../lib/precision/primitives\";\n\nexport interface TradeCostResult {\n readonly estimatedCost: number;\n readonly potentialReturn: number;\n readonly displayShares: number;\n}\n\nexport function computeEstimatedCost(\n tokenAmount: number,\n orderType: \"market\" | \"limit\",\n limitPriceCents: number | null,\n marketPriceCents?: number,\n): number {\n if (tokenAmount <= 0) return 0;\n if (orderType === \"market\") {\n if (marketPriceCents !== undefined && marketPriceCents > 0) {\n return toNum(\n toDecimal(tokenAmount)\n .times(toDecimal(marketPriceCents))\n .dividedBy(100)\n .toString(),\n );\n }\n return tokenAmount;\n }\n if (!limitPriceCents || limitPriceCents <= 0) return 0;\n return toNum(\n toDecimal(tokenAmount)\n .times(toDecimal(limitPriceCents))\n .dividedBy(100)\n .toString(),\n );\n}\n\nexport function computeTradeCost(params: {\n tokenAmount: number;\n orderType: \"market\" | \"limit\";\n limitPriceCents: number | null;\n marketPriceCents?: number;\n}): TradeCostResult {\n const { tokenAmount, orderType, limitPriceCents, marketPriceCents } = params;\n\n const estimatedCost =\n orderType === \"limit\"\n ? computeEstimatedCost(tokenAmount, \"limit\", limitPriceCents)\n : computeEstimatedCost(tokenAmount, \"market\", null, marketPriceCents);\n\n const potentialReturn = computePotentialReturn(tokenAmount);\n\n return {\n estimatedCost,\n potentialReturn,\n displayShares: tokenAmount,\n };\n}\n\nexport function computePotentialReturn(tokenAmount: number): number {\n return Math.max(0, tokenAmount);\n}\n"]}