openpondai/agents/my-openpond
OpenTool app
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);
}