get_hip4_trades
Retrieve HIP-4 trade history for a coin, including price, size, side, and timestamps. Supports time range filtering and cursor pagination.
Instructions
Get HIP-4 trade/fill history for a coin (e.g. '0'). Bare numeric coins are canonical; legacy '#0' / '%230' forms are also accepted.Returns price, size, side, and timestamps over a time range. Supports cursor pagination.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| coin | Yes | HIP-4 outcome-market coin symbol. Canonical form is the bare numeric '<10*outcome_id + side>' (e.g. '0' for outcome 0 Yes, '1' for outcome 0 No, '10' for outcome 1 Yes). The legacy '#0' and '%230' forms are also accepted. Use get_hip4_instruments to list all. | |
| start | No | Start timestamp (Unix ms or ISO). Defaults to 24h ago. | |
| end | No | End timestamp (Unix ms or ISO). Defaults to now. | |
| limit | No | Max records to return (default 100, max 1000) | |
| cursor | No | Pagination cursor from previous response's nextCursor |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes | Array of result records | |
| count | Yes | Total number of records in the full result set | |
| nextCursor | No | Cursor for next page, if more results available |
Implementation Reference
- src/index.ts:1659-1673 (registration)Tool 'get_hip4_trades' registration using registerTool. Defines input schema (coin with Hip4CoinParam + HistoryParams), output schema (ListOutputSchema), and the handler that calls hip4Request to GET /trades/{coin} with query params.
// HIP-4 Trades registerTool( "get_hip4_trades", "Get HIP-4 trade/fill history for a coin (e.g. '0'). Bare numeric coins are canonical; legacy '#0' / '%230' forms are also accepted.Returns price, size, side, and timestamps over a time range. Supports cursor pagination.", { coin: Hip4CoinParam, ...HistoryParams, }, ListOutputSchema, async (params) => { const q = buildHistoryQuery(params.start, params.end, params.limit, params.cursor); const result = await hip4Request(`/trades/${normalizeHip4Coin(params.coin)}`, q); return formatCursorResponse(result); } ); - src/index.ts:1668-1672 (handler)The handler function that executes the tool logic. It builds query params via buildHistoryQuery, normalizes the HIP-4 coin, calls hip4Request to GET /v1/hyperliquid/hip4/trades/{coin}, and returns formatted cursor response.
async (params) => { const q = buildHistoryQuery(params.start, params.end, params.limit, params.cursor); const result = await hip4Request(`/trades/${normalizeHip4Coin(params.coin)}`, q); return formatCursorResponse(result); } - src/index.ts:63-67 (schema)Hip4CoinParam - the Zod schema for the coin input parameter used by get_hip4_trades, describing HIP-4 outcome-market coin symbols in bare numeric form.
const Hip4CoinParam = z .string() .describe( "HIP-4 outcome-market coin symbol. Canonical form is the bare numeric '<10*outcome_id + side>' (e.g. '0' for outcome 0 Yes, '1' for outcome 0 No, '10' for outcome 1 Yes). The legacy '#0' and '%230' forms are also accepted. Use get_hip4_instruments to list all." ); - src/index.ts:1539-1559 (helper)buildHistoryQuery - helper function used by get_hip4_trades handler to construct query parameters (start, end, limit, cursor) from the tool's input params.
function buildHistoryQuery( start?: number | string, end?: number | string, limit?: number, cursor?: string, extra?: Record<string, unknown> ): Record<string, unknown> { const range = resolveTimeRange(start, end); const q: Record<string, unknown> = { start: range.start, end: range.end, limit: resolveLimit(limit), }; if (cursor) q.cursor = cursor; if (extra) { for (const [k, v] of Object.entries(extra)) { if (v !== undefined) q[k] = v; } } return q; } - src/index.ts:1487-1537 (helper)hip4Request - the HTTP helper that makes REST API calls to the HIP-4 endpoint (https://api.0xarchive.io/v1/hyperliquid/hip4). Used by get_hip4_trades handler to GET /trades/{coin}.
async function hip4Request( path: string, query?: Record<string, unknown> ): Promise<{ data: unknown; nextCursor?: string }> { const url = new URL(`${HIP4_BASE_PATH}${path}`, HIP4_BASE_URL); if (query) { for (const [k, v] of Object.entries(query)) { if (v === undefined || v === null) continue; url.searchParams.set(k, String(v)); } } const headers: Record<string, string> = { "Content-Type": "application/json", "User-Agent": "0xarchive-mcp/1.9.0", }; if (apiKey) headers["X-API-Key"] = apiKey; const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 60000); try { const response = await fetch(url.toString(), { method: "GET", headers, signal: controller.signal, }); const text = await response.text(); let body: any; try { body = text ? JSON.parse(text) : null; } catch { body = text; } if (!response.ok) { const requestId = response.headers.get("x-request-id") || body?.meta?.requestId; const message = (body && (body.error?.message || body.error || body.message)) || `HTTP ${response.status}`; throw new OxArchiveError(message, response.status, requestId ?? undefined); } if (body && typeof body === "object" && "data" in body) { return { data: body.data, nextCursor: body.meta?.nextCursor, }; } return { data: body }; } finally { clearTimeout(timeout); } }