2Branches0Tags
GL
glucryptoFix trade candle loading via gateway
typescript
import { gatewayRequest } from "./openpond"; type HyperliquidEnvironment = "mainnet" | "testnet"; type GatewayBarPayload = { time?: unknown; t?: unknown; close?: unknown; c?: unknown; }; function toNumber(value: unknown): number | null { if (typeof value === "number") { return Number.isFinite(value) ? value : null; } if (typeof value === "string" && value.trim().length > 0) { const parsed = Number.parseFloat(value); return Number.isFinite(parsed) ? parsed : null; } return null; } function normalizeCandleTime(rawTime: number): number { return rawTime > 1_000_000_000_000 ? rawTime : rawTime * 1000; } export async function fetchGatewayHyperliquidCloses(params: { symbol: string; environment: HyperliquidEnvironment; countBack: number; }) { const query = new URLSearchParams({ symbol: params.symbol, environment: params.environment, resolution: "60", countBack: String(Math.max(1, Math.trunc(params.countBack))), }); const response = await gatewayRequest(`/v1/hyperliquid/bars?${query.toString()}`, { method: "GET", headers: { Accept: "application/json" }, }); const payload = response.data && typeof response.data === "object" && !Array.isArray(response.data) ? (response.data as { bars?: unknown[] }) : null; if (!response.ok || !Array.isArray(payload?.bars)) { throw new Error(`Failed to load Hyperliquid candles for ${params.symbol} (${response.status}).`); } return payload.bars .map((bar) => { if (!bar || typeof bar !== "object" || Array.isArray(bar)) return null; const candle = bar as GatewayBarPayload; const rawTime = toNumber(candle.time ?? candle.t); const close = toNumber(candle.close ?? candle.c); if (rawTime == null || close == null || close <= 0) return null; return { time: normalizeCandleTime(rawTime), close, }; }) .filter((bar): bar is { time: number; close: number } => Boolean(bar)) .sort((left, right) => left.time - right.time) .slice(-params.countBack) .map((bar) => bar.close); }