get_hip4_order_history
Fetch HIP-4 order lifecycle events for a coin symbol, including placements, fills, cancellations, and modifications. Filter by user, status, order type, and time range.
Instructions
Get HIP-4 order lifecycle events with user attribution (Pro+ tier) for a coin (e.g. '0'). Bare numeric coins are canonical; legacy '#0' / '%230' forms are also accepted.Returns placements, fills, cancellations, modifications.
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 | |
| user | No | User wallet address filter (e.g., '0x1234...') | |
| status | No | Filter orders by status | |
| order_type | No | Filter orders by type |
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:1789-1801 (handler)The async handler function that builds the history query, calls the HIP-4 REST API endpoint /orders/{coin}/history, and formats the cursor-paginated response.
async (params) => { const q = buildHistoryQuery(params.start, params.end, params.limit, params.cursor, { user: params.user, status: params.status, order_type: params.order_type, }); const result = await hip4Request( `/orders/${normalizeHip4Coin(params.coin)}/history`, q ); return formatCursorResponse(result); } ); - src/index.ts:1781-1787 (schema)Input schema defining the coin (Hip4CoinParam), history params (start/end/limit/cursor), and optional filters (user, status, order_type). Output schema is ListOutputSchema.
{ coin: Hip4CoinParam, ...HistoryParams, user: UserParam, status: OrderStatusParam, order_type: OrderTypeParam, }, - src/index.ts:1777-1801 (registration)Registration of the 'get_hip4_order_history' tool using the registerTool helper with name, description, input/output schemas, and handler.
// HIP-4 Order History registerTool( "get_hip4_order_history", "Get HIP-4 order lifecycle events with user attribution (Pro+ tier) for a coin (e.g. '0'). Bare numeric coins are canonical; legacy '#0' / '%230' forms are also accepted.Returns placements, fills, cancellations, modifications.", { coin: Hip4CoinParam, ...HistoryParams, user: UserParam, status: OrderStatusParam, order_type: OrderTypeParam, }, ListOutputSchema, async (params) => { const q = buildHistoryQuery(params.start, params.end, params.limit, params.cursor, { user: params.user, status: params.status, order_type: params.order_type, }); const result = await hip4Request( `/orders/${normalizeHip4Coin(params.coin)}/history`, q ); return formatCursorResponse(result); } ); - src/index.ts:1539-1559 (helper)buildHistoryQuery helper that resolves time range, limit, cursor, and extra params for history endpoints.
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 helper that makes authenticated GET requests to the HIP-4 REST API with timeout, error handling, and cursor extraction.
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); } }