@yuants/vendor-hyperliquid 0.9.10 → 0.10.1

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.
Files changed (52) hide show
  1. package/dist/api/client.js +36 -2
  2. package/dist/api/client.js.map +1 -1
  3. package/dist/api/private-api.js +52 -41
  4. package/dist/api/private-api.js.map +1 -1
  5. package/dist/api/public-api.js +22 -11
  6. package/dist/api/public-api.js.map +1 -1
  7. package/dist/api/rate-limit.js +205 -0
  8. package/dist/api/rate-limit.js.map +1 -0
  9. package/dist/api/rate-limit.test.js +129 -0
  10. package/dist/api/rate-limit.test.js.map +1 -0
  11. package/dist/index.js +0 -2
  12. package/dist/index.js.map +1 -1
  13. package/lib/api/client.d.ts.map +1 -1
  14. package/lib/api/client.js +35 -1
  15. package/lib/api/client.js.map +1 -1
  16. package/lib/api/private-api.d.ts +65 -1
  17. package/lib/api/private-api.d.ts.map +1 -1
  18. package/lib/api/private-api.js +59 -43
  19. package/lib/api/private-api.js.map +1 -1
  20. package/lib/api/public-api.d.ts +54 -1
  21. package/lib/api/public-api.d.ts.map +1 -1
  22. package/lib/api/public-api.js +33 -12
  23. package/lib/api/public-api.js.map +1 -1
  24. package/lib/api/rate-limit.d.ts +21 -0
  25. package/lib/api/rate-limit.d.ts.map +1 -0
  26. package/lib/api/rate-limit.js +214 -0
  27. package/lib/api/rate-limit.js.map +1 -0
  28. package/lib/api/rate-limit.test.d.ts +2 -0
  29. package/lib/api/rate-limit.test.d.ts.map +1 -0
  30. package/lib/api/rate-limit.test.js +131 -0
  31. package/lib/api/rate-limit.test.js.map +1 -0
  32. package/lib/index.d.ts +0 -2
  33. package/lib/index.d.ts.map +1 -1
  34. package/lib/index.js +0 -2
  35. package/lib/index.js.map +1 -1
  36. package/package.json +6 -6
  37. package/temp/build/typescript/ts_HOjXkPSo.json +1 -1
  38. package/temp/package-deps.json +11 -11
  39. package/temp/test/jest/haste-map-1a3370ad4952cc1cbecf8fc42c6e9732-7b2990dcc44090c4eba2c52e971c544c-6a2a6e27ca3579da37751287ea19ab4c +0 -0
  40. package/temp/test/jest/perf-cache-1a3370ad4952cc1cbecf8fc42c6e9732-da39a3ee5e6b4b0d3255bfef95601890 +1 -0
  41. package/dist/services/markets/interest-rate.js +0 -61
  42. package/dist/services/markets/interest-rate.js.map +0 -1
  43. package/dist/services/markets/ohlc.js +0 -111
  44. package/dist/services/markets/ohlc.js.map +0 -1
  45. package/lib/services/markets/interest-rate.d.ts +0 -2
  46. package/lib/services/markets/interest-rate.d.ts.map +0 -1
  47. package/lib/services/markets/interest-rate.js +0 -63
  48. package/lib/services/markets/interest-rate.js.map +0 -1
  49. package/lib/services/markets/ohlc.d.ts +0 -2
  50. package/lib/services/markets/ohlc.d.ts.map +0 -1
  51. package/lib/services/markets/ohlc.js +0 -113
  52. package/lib/services/markets/ohlc.js.map +0 -1
@@ -1,6 +1,17 @@
1
- import { UUID, formatTime } from '@yuants/utils';
1
+ import { UUID, formatTime, newError } from '@yuants/utils';
2
2
  import { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';
3
+ import { afterRestResponse, beforeRestRequest, getRestRequestContext } from './rate-limit';
3
4
  const BASE_URL = 'https://api.hyperliquid.xyz';
5
+ const getRequestKey = (ctx) => {
6
+ var _a, _b;
7
+ if (ctx.kind === 'info')
8
+ return `info:${(_a = ctx.infoType) !== null && _a !== void 0 ? _a : 'unknown'}`;
9
+ if (ctx.kind === 'exchange')
10
+ return `exchange:${(_b = ctx.exchangeActionType) !== null && _b !== void 0 ? _b : 'unknown'}`;
11
+ if (ctx.kind === 'explorer')
12
+ return `explorer:${ctx.path}`;
13
+ return `other:${ctx.path}`;
14
+ };
4
15
  const buildUrl = (path, method, params) => {
5
16
  const url = new URL(BASE_URL);
6
17
  url.pathname = path;
@@ -17,17 +28,40 @@ const callApi = async (method, path, params) => {
17
28
  const body = method === 'GET' ? '' : JSON.stringify(params !== null && params !== void 0 ? params : {});
18
29
  const headers = { 'Content-Type': 'application/json' };
19
30
  console.info(formatTime(Date.now()), method, url.href, body);
31
+ const requestContext = getRestRequestContext(method, path, params);
32
+ const requestKey = getRequestKey(requestContext);
33
+ const { estimatedExtraWeight } = beforeRestRequest({ method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey }, requestContext);
20
34
  const res = await fetch(url.href, {
21
35
  method,
22
36
  headers,
23
37
  body: method === 'GET' ? undefined : body || undefined,
24
38
  });
25
39
  const retStr = await res.text();
40
+ if (res.status === 429) {
41
+ console.info(formatTime(Date.now()), 'HyperliquidResponse', method, url.href, `status=${res.status}`, retStr);
42
+ throw newError('HYPERLIQUID_HTTP_429', {
43
+ status: res.status,
44
+ requestKey,
45
+ method,
46
+ path,
47
+ url: url.href,
48
+ response: retStr,
49
+ });
50
+ }
26
51
  try {
27
52
  if (process.env.LOG_LEVEL === 'DEBUG') {
28
53
  console.debug(formatTime(Date.now()), 'HyperliquidResponse', path, JSON.stringify(params), retStr);
29
54
  }
30
- return JSON.parse(retStr);
55
+ const response = JSON.parse(retStr);
56
+ await afterRestResponse({
57
+ method,
58
+ url: url.href,
59
+ path,
60
+ kind: requestContext.kind,
61
+ infoType: requestContext.infoType,
62
+ requestKey,
63
+ }, requestContext, response, estimatedExtraWeight);
64
+ return response;
31
65
  }
32
66
  catch (err) {
33
67
  console.error(formatTime(Date.now()), 'HyperliquidRequestFailed', path, JSON.stringify(params), retStr, err);
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { UUID, formatTime } from '@yuants/utils';\nimport { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';\n\ntype HttpMethod = 'GET' | 'POST';\n\nconst BASE_URL = 'https://api.hyperliquid.xyz';\n\nconst buildUrl = (path: string, method: HttpMethod, params?: any) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n if (method === 'GET' && params) {\n const entries = Object.entries(params).sort(([a], [b]) => a.localeCompare(b));\n for (const [key, value] of entries) {\n url.searchParams.set(key, '' + value);\n }\n }\n return url;\n};\n\nconst callApi = async (method: HttpMethod, path: string, params?: any) => {\n const url = buildUrl(path, method, params);\n const body = method === 'GET' ? '' : JSON.stringify(params ?? {});\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n console.info(formatTime(Date.now()), method, url.href, body);\n const res = await fetch(url.href, {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n });\n const retStr = await res.text();\n try {\n if (process.env.LOG_LEVEL === 'DEBUG') {\n console.debug(formatTime(Date.now()), 'HyperliquidResponse', path, JSON.stringify(params), retStr);\n }\n return JSON.parse(retStr);\n } catch (err) {\n console.error(\n formatTime(Date.now()),\n 'HyperliquidRequestFailed',\n path,\n JSON.stringify(params),\n retStr,\n err,\n );\n throw err;\n }\n};\n\ntype FlowController = {\n requestQueue: Array<{ trace_id: string; method: HttpMethod; path: string; params?: any }>;\n responseChannel: Subject<{ trace_id: string; response?: any; error?: Error }>;\n};\n\nconst controllers = new Map<string, FlowController>();\n\nconst ensureController = (path: string, period: number, limit: number) => {\n if (controllers.has(path)) {\n return controllers.get(path)!;\n }\n const controller: FlowController = {\n requestQueue: [],\n responseChannel: new Subject(),\n };\n timer(0, period)\n .pipe(\n filter(() => controller.requestQueue.length > 0),\n mergeMap(() => controller.requestQueue.splice(0, limit)),\n mergeMap(async (request) => {\n try {\n const response = await callApi(request.method, request.path, request.params);\n return { trace_id: request.trace_id, response };\n } catch (error) {\n return { trace_id: request.trace_id, error: error as Error };\n }\n }),\n )\n .subscribe(controller.responseChannel);\n controllers.set(path, controller);\n return controller;\n};\n\nexport const request = <T = any>(method: HttpMethod, path: string, params?: any) =>\n callApi(method, path, params) as Promise<T>;\n\nexport const requestWithFlowControl = async <T = any>(\n method: HttpMethod,\n path: string,\n flowControl: { period: number; limit: number },\n params?: any,\n) => {\n const controller = ensureController(path, flowControl.period, flowControl.limit);\n const trace_id = UUID();\n const res$ = controller.responseChannel.pipe(\n filter((resp) => resp.trace_id === trace_id),\n mergeMap((resp) => (resp.error ? throwError(() => resp.error) : of(resp))),\n timeout(30_000),\n shareReplay(1),\n );\n controller.requestQueue.push({ trace_id, method, path, params });\n return ((await firstValueFrom(res$)).response ?? null) as T;\n};\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { UUID, formatTime, newError } from '@yuants/utils';\nimport { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';\nimport { afterRestResponse, beforeRestRequest, getRestRequestContext } from './rate-limit';\n\ntype HttpMethod = 'GET' | 'POST';\n\nconst BASE_URL = 'https://api.hyperliquid.xyz';\n\nconst getRequestKey = (ctx: ReturnType<typeof getRestRequestContext>) => {\n if (ctx.kind === 'info') return `info:${ctx.infoType ?? 'unknown'}`;\n if (ctx.kind === 'exchange') return `exchange:${ctx.exchangeActionType ?? 'unknown'}`;\n if (ctx.kind === 'explorer') return `explorer:${ctx.path}`;\n return `other:${ctx.path}`;\n};\n\nconst buildUrl = (path: string, method: HttpMethod, params?: any) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n if (method === 'GET' && params) {\n const entries = Object.entries(params).sort(([a], [b]) => a.localeCompare(b));\n for (const [key, value] of entries) {\n url.searchParams.set(key, '' + value);\n }\n }\n return url;\n};\n\nconst callApi = async (method: HttpMethod, path: string, params?: any) => {\n const url = buildUrl(path, method, params);\n const body = method === 'GET' ? '' : JSON.stringify(params ?? {});\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n console.info(formatTime(Date.now()), method, url.href, body);\n\n const requestContext = getRestRequestContext(method, path, params);\n const requestKey = getRequestKey(requestContext);\n\n const { estimatedExtraWeight } = beforeRestRequest(\n { method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey },\n requestContext,\n );\n\n const res = await fetch(url.href, {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n });\n const retStr = await res.text();\n if (res.status === 429) {\n console.info(\n formatTime(Date.now()),\n 'HyperliquidResponse',\n method,\n url.href,\n `status=${res.status}`,\n retStr,\n );\n throw newError('HYPERLIQUID_HTTP_429', {\n status: res.status,\n requestKey,\n method,\n path,\n url: url.href,\n response: retStr,\n });\n }\n try {\n if (process.env.LOG_LEVEL === 'DEBUG') {\n console.debug(formatTime(Date.now()), 'HyperliquidResponse', path, JSON.stringify(params), retStr);\n }\n const response = JSON.parse(retStr);\n await afterRestResponse(\n {\n method,\n url: url.href,\n path,\n kind: requestContext.kind,\n infoType: requestContext.infoType,\n requestKey,\n },\n requestContext,\n response,\n estimatedExtraWeight,\n );\n return response;\n } catch (err) {\n console.error(\n formatTime(Date.now()),\n 'HyperliquidRequestFailed',\n path,\n JSON.stringify(params),\n retStr,\n err,\n );\n throw err;\n }\n};\n\ntype FlowController = {\n requestQueue: Array<{ trace_id: string; method: HttpMethod; path: string; params?: any }>;\n responseChannel: Subject<{ trace_id: string; response?: any; error?: Error }>;\n};\n\nconst controllers = new Map<string, FlowController>();\n\nconst ensureController = (path: string, period: number, limit: number) => {\n if (controllers.has(path)) {\n return controllers.get(path)!;\n }\n const controller: FlowController = {\n requestQueue: [],\n responseChannel: new Subject(),\n };\n timer(0, period)\n .pipe(\n filter(() => controller.requestQueue.length > 0),\n mergeMap(() => controller.requestQueue.splice(0, limit)),\n mergeMap(async (request) => {\n try {\n const response = await callApi(request.method, request.path, request.params);\n return { trace_id: request.trace_id, response };\n } catch (error) {\n return { trace_id: request.trace_id, error: error as Error };\n }\n }),\n )\n .subscribe(controller.responseChannel);\n controllers.set(path, controller);\n return controller;\n};\n\nexport const request = <T = any>(method: HttpMethod, path: string, params?: any) =>\n callApi(method, path, params) as Promise<T>;\n\nexport const requestWithFlowControl = async <T = any>(\n method: HttpMethod,\n path: string,\n flowControl: { period: number; limit: number },\n params?: any,\n) => {\n const controller = ensureController(path, flowControl.period, flowControl.limit);\n const trace_id = UUID();\n const res$ = controller.responseChannel.pipe(\n filter((resp) => resp.trace_id === trace_id),\n mergeMap((resp) => (resp.error ? throwError(() => resp.error) : of(resp))),\n timeout(30_000),\n shareReplay(1),\n );\n controller.requestQueue.push({ trace_id, method, path, params });\n return ((await firstValueFrom(res$)).response ?? null) as T;\n};\n"]}
@@ -8,6 +8,27 @@ const getWallet = (credential) => {
8
8
  }
9
9
  return walletCache.get(credential.private_key);
10
10
  };
11
+ export const buildPlaceOrderAction = (params) => {
12
+ const action = { type: 'order', orders: params.orders, grouping: 'na' };
13
+ if (!params.builder)
14
+ return action;
15
+ return Object.assign(Object.assign({}, action), { builder: params.builder });
16
+ };
17
+ export const buildCancelOrderAction = (params) => ({
18
+ type: 'cancel',
19
+ cancels: params.cancels,
20
+ });
21
+ export const buildModifyOrderAction = (params) => ({
22
+ type: 'modify',
23
+ oid: params.oid,
24
+ order: params.order,
25
+ });
26
+ export const createSignedExchangeRequestBody = async (credential, action, options) => {
27
+ var _a, _b, _c, _d;
28
+ const nonce = (_a = options === null || options === void 0 ? void 0 : options.nonce) !== null && _a !== void 0 ? _a : Date.now();
29
+ const signature = await signL1Action(getWallet(credential), action, (_b = options === null || options === void 0 ? void 0 : options.vaultAddress) !== null && _b !== void 0 ? _b : null, nonce, (_c = options === null || options === void 0 ? void 0 : options.expiresAfter) !== null && _c !== void 0 ? _c : null, (_d = options === null || options === void 0 ? void 0 : options.isMainnet) !== null && _d !== void 0 ? _d : true);
30
+ return { action, nonce, signature };
31
+ };
11
32
  /**
12
33
  * Place orders on Hyperliquid exchange
13
34
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
@@ -17,18 +38,12 @@ const getWallet = (credential) => {
17
38
  * @returns Promise resolving to exchange response
18
39
  */
19
40
  export const placeOrder = async (credential, params) => {
20
- var _a, _b;
21
- const action = {
22
- type: 'order',
23
- orders: params.orders,
24
- grouping: 'na',
25
- };
26
- if (params.builder) {
27
- action['builder'] = params.builder;
28
- }
29
- const nonce = Date.now();
30
- const signature = await signL1Action(getWallet(credential), action, (_a = params.vaultAddress) !== null && _a !== void 0 ? _a : null, nonce, (_b = params.expiresAfter) !== null && _b !== void 0 ? _b : null, true);
31
- return request('POST', 'exchange', { action, nonce, signature });
41
+ const action = buildPlaceOrderAction(params);
42
+ const requestBody = await createSignedExchangeRequestBody(credential, action, {
43
+ vaultAddress: params.vaultAddress,
44
+ expiresAfter: params.expiresAfter,
45
+ });
46
+ return request('POST', 'exchange', requestBody);
32
47
  };
33
48
  /**
34
49
  * Cancel orders on Hyperliquid exchange
@@ -39,14 +54,12 @@ export const placeOrder = async (credential, params) => {
39
54
  * @returns Promise resolving to exchange response
40
55
  */
41
56
  export const cancelOrder = async (credential, params) => {
42
- var _a, _b;
43
- const action = {
44
- type: 'cancel',
45
- cancels: params.cancels,
46
- };
47
- const nonce = Date.now();
48
- const signature = await signL1Action(getWallet(credential), action, (_a = params.vaultAddress) !== null && _a !== void 0 ? _a : null, nonce, (_b = params.expiresAfter) !== null && _b !== void 0 ? _b : null, true);
49
- return request('POST', 'exchange', { action, nonce, signature });
57
+ const action = buildCancelOrderAction(params);
58
+ const requestBody = await createSignedExchangeRequestBody(credential, action, {
59
+ vaultAddress: params.vaultAddress,
60
+ expiresAfter: params.expiresAfter,
61
+ });
62
+ return request('POST', 'exchange', requestBody);
50
63
  };
51
64
  /**
52
65
  * Modify an existing order on Hyperliquid exchange
@@ -56,15 +69,25 @@ export const cancelOrder = async (credential, params) => {
56
69
  * @returns Promise resolving to exchange response
57
70
  */
58
71
  export const modifyOrder = async (credential, params) => {
59
- var _a, _b;
60
- const action = {
61
- type: 'modify',
62
- oid: params.oid,
63
- order: params.order,
72
+ const action = buildModifyOrderAction(params);
73
+ const requestBody = await createSignedExchangeRequestBody(credential, action, {
74
+ vaultAddress: params.vaultAddress,
75
+ expiresAfter: params.expiresAfter,
76
+ });
77
+ return request('POST', 'exchange', requestBody);
78
+ };
79
+ export const buildUserFillsRequestBody = (credential, params) => {
80
+ const requestBody = {
81
+ type: 'userFills',
82
+ user: credential.address,
64
83
  };
65
- const nonce = Date.now();
66
- const signature = await signL1Action(getWallet(credential), action, (_a = params.vaultAddress) !== null && _a !== void 0 ? _a : null, nonce, (_b = params.expiresAfter) !== null && _b !== void 0 ? _b : null, true);
67
- return request('POST', 'exchange', { action, nonce, signature });
84
+ if ((params === null || params === void 0 ? void 0 : params.startTime) != null) {
85
+ requestBody.startTime = params.startTime;
86
+ }
87
+ if ((params === null || params === void 0 ? void 0 : params.endTime) != null) {
88
+ requestBody.endTime = params.endTime;
89
+ }
90
+ return requestBody;
68
91
  };
69
92
  /**
70
93
  * Get user's fill history (trade history) from Hyperliquid
@@ -74,18 +97,6 @@ export const modifyOrder = async (credential, params) => {
74
97
  * @returns Promise resolving to user fill history with detailed trade information
75
98
  */
76
99
  export const getUserFills = async (credential, params) => {
77
- const wallet = getWallet(credential);
78
- const address = wallet.address;
79
- const requestBody = {
80
- type: 'userFills',
81
- user: address,
82
- };
83
- if (params === null || params === void 0 ? void 0 : params.startTime) {
84
- requestBody.startTime = params.startTime;
85
- }
86
- if (params === null || params === void 0 ? void 0 : params.endTime) {
87
- requestBody.endTime = params.endTime;
88
- }
89
- return request('POST', 'info', requestBody);
100
+ return request('POST', 'info', buildUserFillsRequestBody(credential, params));
90
101
  };
91
102
  //# sourceMappingURL=private-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAuDnC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE9C,MAAM,SAAS,GAAG,CAAC,UAAuB,EAAE,EAAE;IAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAE,CAAC;AAClD,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,UAAuB,EACvB,MAKC,EACD,EAAE;;IACF,MAAM,MAAM,GAAwB;QAClC,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACrC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,MAAM,YAAY,CAClC,SAAS,CAAC,UAAU,CAAC,EACrB,MAAM,EACN,MAAA,MAAM,CAAC,YAAY,mCAAI,IAAI,EAC3B,KAAK,EACL,MAAA,MAAM,CAAC,YAAY,mCAAI,IAAI,EAC3B,IAAI,CACL,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,UAAuB,EACvB,MAAkF,EAClF,EAAE;;IACF,MAAM,MAAM,GAAwB;QAClC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,MAAM,YAAY,CAClC,SAAS,CAAC,UAAU,CAAC,EACrB,MAAM,EACN,MAAA,MAAM,CAAC,YAAY,mCAAI,IAAI,EAC3B,KAAK,EACL,MAAA,MAAM,CAAC,YAAY,mCAAI,IAAI,EAC3B,IAAI,CACL,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,UAAuB,EACvB,MAKC,EACD,EAAE;;IACF,MAAM,MAAM,GAAwB;QAClC,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,MAAM,YAAY,CAClC,SAAS,CAAC,UAAU,CAAC,EACrB,MAAM,EACN,MAAA,MAAM,CAAC,YAAY,mCAAI,IAAI,EAC3B,KAAK,EACL,MAAA,MAAM,CAAC,YAAY,mCAAI,IAAI,EAC3B,IAAI,CACL,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,UAAuB,EACvB,MAAiD,EACjD,EAAE;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAE/B,MAAM,WAAW,GAAQ;QACvB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,OAAO;KACd,CAAC;IAEF,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,EAAE,CAAC;QACtB,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC3C,CAAC;IAED,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EAAE,CAAC;QACpB,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,OAAO,OAAO,CAuBX,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["import { Wallet } from 'ethers';\nimport { signL1Action } from './sign';\nimport { request } from './client';\nimport { ICredential } from './types';\n\n/**\n * Order payload for placing orders on Hyperliquid\n */\ntype OrderPayload = {\n /** Asset index (absolute) */\n a: number;\n /** Buy flag (true for buy, false for sell) */\n b: boolean;\n /** Limit price string */\n p: string;\n /** Size string */\n s: string;\n /** Reduce only flag */\n r: boolean;\n /** Order type configuration */\n t: {\n /** Time in force for limit orders: \"Alo\" (Post-Only), \"Ioc\" (Immediate or Cancel), \"Gtc\" (Good til Cancel) */\n limit?: { tif: string };\n /** Trigger order configuration */\n trigger?: {\n /** Is market trigger price */\n isMarket: boolean;\n /** Trigger price string */\n triggerPx: string;\n /** Take profit/stop loss indicator */\n tpsl: string;\n };\n };\n /** Order fee coefficient */\n c?: number;\n};\n\n/**\n * Cancel order payload\n */\ntype CancelPayload = {\n /** Asset index (absolute) */\n a: number;\n /** Order ID */\n o: number;\n};\n\n/**\n * Modify order payload\n */\ntype ModifyOrderPayload = {\n /** Order ID to modify */\n oid: number | string;\n /** New order parameters */\n order: OrderPayload;\n};\n\nconst walletCache = new Map<string, Wallet>();\n\nconst getWallet = (credential: ICredential) => {\n if (!walletCache.has(credential.private_key)) {\n walletCache.set(credential.private_key, new Wallet(credential.private_key));\n }\n return walletCache.get(credential.private_key)!;\n};\n\n/**\n * Place orders on Hyperliquid exchange\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order\n * API Endpoint: POST /exchange\n * @param credential - User credential containing private key for signing\n * @param params - Order placement parameters\n * @returns Promise resolving to exchange response\n */\nexport const placeOrder = async (\n credential: ICredential,\n params: {\n orders: OrderPayload[];\n builder?: { b: string; f: number };\n vaultAddress?: string;\n expiresAfter?: number;\n },\n) => {\n const action: Record<string, any> = {\n type: 'order',\n orders: params.orders,\n grouping: 'na',\n };\n if (params.builder) {\n action['builder'] = params.builder;\n }\n const nonce = Date.now();\n const signature = await signL1Action(\n getWallet(credential),\n action,\n params.vaultAddress ?? null,\n nonce,\n params.expiresAfter ?? null,\n true,\n );\n return request('POST', 'exchange', { action, nonce, signature });\n};\n\n/**\n * Cancel orders on Hyperliquid exchange\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s\n * API Endpoint: POST /exchange\n * @param credential - User credential containing private key for signing\n * @param params - Order cancellation parameters\n * @returns Promise resolving to exchange response\n */\nexport const cancelOrder = async (\n credential: ICredential,\n params: { cancels: CancelPayload[]; vaultAddress?: string; expiresAfter?: number },\n) => {\n const action: Record<string, any> = {\n type: 'cancel',\n cancels: params.cancels,\n };\n const nonce = Date.now();\n const signature = await signL1Action(\n getWallet(credential),\n action,\n params.vaultAddress ?? null,\n nonce,\n params.expiresAfter ?? null,\n true,\n );\n return request('POST', 'exchange', { action, nonce, signature });\n};\n\n/**\n * Modify an existing order on Hyperliquid exchange\n * API Endpoint: POST /exchange\n * @param credential - User credential containing private key for signing\n * @param params - Order modification parameters\n * @returns Promise resolving to exchange response\n */\nexport const modifyOrder = async (\n credential: ICredential,\n params: {\n oid: number | string;\n order: OrderPayload;\n vaultAddress?: string;\n expiresAfter?: number;\n },\n) => {\n const action: Record<string, any> = {\n type: 'modify',\n oid: params.oid,\n order: params.order,\n };\n const nonce = Date.now();\n const signature = await signL1Action(\n getWallet(credential),\n action,\n params.vaultAddress ?? null,\n nonce,\n params.expiresAfter ?? null,\n true,\n );\n return request('POST', 'exchange', { action, nonce, signature });\n};\n\n/**\n * Get user's fill history (trade history) from Hyperliquid\n * API Endpoint: POST /info (type: userFills)\n * @param credential - User credential containing private key for authentication\n * @param params - Optional time range parameters\n * @returns Promise resolving to user fill history with detailed trade information\n */\nexport const getUserFills = async (\n credential: ICredential,\n params?: { startTime?: number; endTime?: number },\n) => {\n const wallet = getWallet(credential);\n const address = wallet.address;\n\n const requestBody: any = {\n type: 'userFills',\n user: address,\n };\n\n if (params?.startTime) {\n requestBody.startTime = params.startTime;\n }\n\n if (params?.endTime) {\n requestBody.endTime = params.endTime;\n }\n\n return request<{\n fills: {\n time: number;\n feedId: string;\n hash: string;\n coin: string;\n side: string;\n px: string;\n sz: string;\n oid: number;\n startPos: string;\n fee: string;\n feeToken: string;\n closedSize: string;\n closedPnl: string;\n dir: string;\n source: string;\n type: string;\n positionAction: string;\n asset: number;\n tid: string;\n crossChain: any;\n }[];\n }>('POST', 'info', requestBody);\n};\n"]}
1
+ {"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { Wallet } from 'ethers';\nimport { signL1Action } from './sign';\nimport { request } from './client';\nimport { ICredential } from './types';\n\n/**\n * Order payload for placing orders on Hyperliquid\n */\ntype OrderPayload = {\n /** Asset index (absolute) */\n a: number;\n /** Buy flag (true for buy, false for sell) */\n b: boolean;\n /** Limit price string */\n p: string;\n /** Size string */\n s: string;\n /** Reduce only flag */\n r: boolean;\n /** Order type configuration */\n t: {\n /** Time in force for limit orders: \"Alo\" (Post-Only), \"Ioc\" (Immediate or Cancel), \"Gtc\" (Good til Cancel) */\n limit?: { tif: string };\n /** Trigger order configuration */\n trigger?: {\n /** Is market trigger price */\n isMarket: boolean;\n /** Trigger price string */\n triggerPx: string;\n /** Take profit/stop loss indicator */\n tpsl: string;\n };\n };\n /** Order fee coefficient */\n c?: number;\n};\n\n/**\n * Cancel order payload\n */\ntype CancelPayload = {\n /** Asset index (absolute) */\n a: number;\n /** Order ID */\n o: number;\n};\n\n/**\n * Modify order payload\n */\ntype ModifyOrderPayload = {\n /** Order ID to modify */\n oid: number | string;\n /** New order parameters */\n order: OrderPayload;\n};\n\ntype OrderAction = {\n type: 'order';\n orders: OrderPayload[];\n grouping: 'na';\n builder?: { b: string; f: number };\n};\n\ntype CancelAction = {\n type: 'cancel';\n cancels: CancelPayload[];\n};\n\ntype ModifyAction = {\n type: 'modify';\n oid: number | string;\n order: OrderPayload;\n};\n\ntype ExchangeAction = OrderAction | CancelAction | ModifyAction;\n\ntype L1Signature = { r: string; s: string; v: number };\n\nconst walletCache = new Map<string, Wallet>();\n\nconst getWallet = (credential: ICredential) => {\n if (!walletCache.has(credential.private_key)) {\n walletCache.set(credential.private_key, new Wallet(credential.private_key));\n }\n return walletCache.get(credential.private_key)!;\n};\n\nexport const buildPlaceOrderAction = (params: {\n orders: OrderPayload[];\n builder?: { b: string; f: number };\n}) => {\n const action: OrderAction = { type: 'order', orders: params.orders, grouping: 'na' };\n if (!params.builder) return action;\n return { ...action, builder: params.builder };\n};\n\nexport const buildCancelOrderAction = (params: { cancels: CancelPayload[] }) =>\n ({\n type: 'cancel',\n cancels: params.cancels,\n } satisfies CancelAction);\n\nexport const buildModifyOrderAction = (params: { oid: number | string; order: OrderPayload }) =>\n ({\n type: 'modify',\n oid: params.oid,\n order: params.order,\n } satisfies ModifyAction);\n\nexport const createSignedExchangeRequestBody = async (\n credential: ICredential,\n action: ExchangeAction,\n options?: { nonce?: number; vaultAddress?: string; expiresAfter?: number; isMainnet?: boolean },\n) => {\n const nonce = options?.nonce ?? Date.now();\n const signature: L1Signature = await signL1Action(\n getWallet(credential),\n action,\n options?.vaultAddress ?? null,\n nonce,\n options?.expiresAfter ?? null,\n options?.isMainnet ?? true,\n );\n return { action, nonce, signature };\n};\n\n/**\n * Place orders on Hyperliquid exchange\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order\n * API Endpoint: POST /exchange\n * @param credential - User credential containing private key for signing\n * @param params - Order placement parameters\n * @returns Promise resolving to exchange response\n */\nexport const placeOrder = async (\n credential: ICredential,\n params: {\n orders: OrderPayload[];\n builder?: { b: string; f: number };\n vaultAddress?: string;\n expiresAfter?: number;\n },\n) => {\n const action = buildPlaceOrderAction(params);\n const requestBody = await createSignedExchangeRequestBody(credential, action, {\n vaultAddress: params.vaultAddress,\n expiresAfter: params.expiresAfter,\n });\n return request('POST', 'exchange', requestBody);\n};\n\n/**\n * Cancel orders on Hyperliquid exchange\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s\n * API Endpoint: POST /exchange\n * @param credential - User credential containing private key for signing\n * @param params - Order cancellation parameters\n * @returns Promise resolving to exchange response\n */\nexport const cancelOrder = async (\n credential: ICredential,\n params: { cancels: CancelPayload[]; vaultAddress?: string; expiresAfter?: number },\n) => {\n const action = buildCancelOrderAction(params);\n const requestBody = await createSignedExchangeRequestBody(credential, action, {\n vaultAddress: params.vaultAddress,\n expiresAfter: params.expiresAfter,\n });\n return request('POST', 'exchange', requestBody);\n};\n\n/**\n * Modify an existing order on Hyperliquid exchange\n * API Endpoint: POST /exchange\n * @param credential - User credential containing private key for signing\n * @param params - Order modification parameters\n * @returns Promise resolving to exchange response\n */\nexport const modifyOrder = async (\n credential: ICredential,\n params: {\n oid: number | string;\n order: OrderPayload;\n vaultAddress?: string;\n expiresAfter?: number;\n },\n) => {\n const action = buildModifyOrderAction(params);\n const requestBody = await createSignedExchangeRequestBody(credential, action, {\n vaultAddress: params.vaultAddress,\n expiresAfter: params.expiresAfter,\n });\n return request('POST', 'exchange', requestBody);\n};\n\nexport const buildUserFillsRequestBody = (\n credential: ICredential,\n params?: { startTime?: number; endTime?: number },\n) => {\n const requestBody: { type: 'userFills'; user: string; startTime?: number; endTime?: number } = {\n type: 'userFills',\n user: credential.address,\n };\n\n if (params?.startTime != null) {\n requestBody.startTime = params.startTime;\n }\n\n if (params?.endTime != null) {\n requestBody.endTime = params.endTime;\n }\n\n return requestBody;\n};\n\n/**\n * Get user's fill history (trade history) from Hyperliquid\n * API Endpoint: POST /info (type: userFills)\n * @param credential - User credential containing private key for authentication\n * @param params - Optional time range parameters\n * @returns Promise resolving to user fill history with detailed trade information\n */\nexport const getUserFills = async (\n credential: ICredential,\n params?: { startTime?: number; endTime?: number },\n) => {\n return request<{\n fills: {\n time: number;\n feedId: string;\n hash: string;\n coin: string;\n side: string;\n px: string;\n sz: string;\n oid: number;\n startPos: string;\n fee: string;\n feeToken: string;\n closedSize: string;\n closedPnl: string;\n dir: string;\n source: string;\n type: string;\n positionAction: string;\n asset: number;\n tid: string;\n crossChain: unknown;\n }[];\n }>('POST', 'info', buildUserFillsRequestBody(credential, params));\n};\n"]}
@@ -1,4 +1,6 @@
1
1
  import { request } from './client';
2
+ const buildInfoRequestBody = (type, params) => (Object.assign(Object.assign({}, (params !== null && params !== void 0 ? params : {})), { type }));
3
+ export const buildUserPerpetualsAccountSummaryRequestBody = (params) => buildInfoRequestBody('clearinghouseState', params);
2
4
  /**
3
5
  * Get user's perpetual account summary including positions, margin, and portfolio information
4
6
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-users-perpetuals-account-summary
@@ -7,7 +9,8 @@ import { request } from './client';
7
9
  * @param params.user - User's wallet address
8
10
  * @returns Promise resolving to account summary with margin information, positions, and portfolio details
9
11
  */
10
- export const getUserPerpetualsAccountSummary = (params) => request('POST', 'info', Object.assign(Object.assign({}, params), { type: 'clearinghouseState' }));
12
+ export const getUserPerpetualsAccountSummary = (params) => request('POST', 'info', buildUserPerpetualsAccountSummaryRequestBody(params));
13
+ export const buildPerpetualsMetaDataRequestBody = (params) => buildInfoRequestBody('meta', params !== null && params !== void 0 ? params : {});
11
14
  /**
12
15
  * Get perpetual market metadata including available assets, their specifications, and margin tiers
13
16
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-metadata
@@ -16,14 +19,16 @@ export const getUserPerpetualsAccountSummary = (params) => request('POST', 'info
16
19
  * @param params.dex - Optional DEX identifier
17
20
  * @returns Promise resolving to universe of perpetual assets and margin configuration
18
21
  */
19
- export const getPerpetualsMetaData = (params) => request('POST', 'info', Object.assign(Object.assign({}, (params !== null && params !== void 0 ? params : {})), { type: 'meta' }));
22
+ export const getPerpetualsMetaData = (params) => request('POST', 'info', buildPerpetualsMetaDataRequestBody(params));
23
+ export const buildSpotMetaDataRequestBody = () => buildInfoRequestBody('spotMeta');
20
24
  /**
21
25
  * Get spot market metadata including available tokens and trading pairs
22
26
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-spot-metadata
23
27
  * API Endpoint: POST /info (type: spotMeta)
24
28
  * @returns Promise resolving to spot universe with token information and pair configurations
25
29
  */
26
- export const getSpotMetaData = () => request('POST', 'info', { type: 'spotMeta' });
30
+ export const getSpotMetaData = () => request('POST', 'info', buildSpotMetaDataRequestBody());
31
+ export const buildUserFundingHistoryRequestBody = (params) => buildInfoRequestBody('fundingHistory', params);
27
32
  /**
28
33
  * Get user's funding rate payment history for perpetual positions
29
34
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-a-users-funding-history-or-non-funding-ledger-updates
@@ -34,16 +39,18 @@ export const getSpotMetaData = () => request('POST', 'info', { type: 'spotMeta'
34
39
  * @param params.endTime - Optional end timestamp in milliseconds
35
40
  * @returns Promise resolving to array of funding payment records with amounts and rates
36
41
  */
37
- export const getUserFundingHistory = (params) => request('POST', 'info', Object.assign(Object.assign({}, params), { type: 'fundingHistory' }));
42
+ export const getUserFundingHistory = (params) => request('POST', 'info', buildUserFundingHistoryRequestBody(params));
43
+ export const buildUserTokenBalancesRequestBody = (params) => buildInfoRequestBody('spotClearinghouseState', params);
38
44
  /**
39
45
  * Get user's token balances for both spot and perpetual accounts
40
46
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances
41
- * API Endpoint: POST /info (type: tokenBalances)
47
+ * API Endpoint: POST /info (type: spotClearinghouseState)
42
48
  * @param params - Query parameters
43
49
  * @param params.user - User's wallet address
44
50
  * @returns Promise resolving to array of token balances with held and total amounts
45
51
  */
46
- export const getUserTokenBalances = (params) => request('POST', 'info', Object.assign(Object.assign({}, params), { type: 'spotClearinghouseState' }));
52
+ export const getUserTokenBalances = (params) => request('POST', 'info', buildUserTokenBalancesRequestBody(params));
53
+ export const buildUserOpenOrdersRequestBody = (params) => buildInfoRequestBody('openOrders', params);
47
54
  /**
48
55
  * Get user's currently open orders across all markets
49
56
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#open-orders
@@ -52,7 +59,8 @@ export const getUserTokenBalances = (params) => request('POST', 'info', Object.a
52
59
  * @param params.user - User's wallet address
53
60
  * @returns Promise resolving to array of open order details with prices, sizes, and timestamps
54
61
  */
55
- export const getUserOpenOrders = (params) => request('POST', 'info', Object.assign(Object.assign({}, params), { type: 'openOrders' }));
62
+ export const getUserOpenOrders = (params) => request('POST', 'info', buildUserOpenOrdersRequestBody(params));
63
+ export const buildHistoricalFundingRatesRequestBody = (params) => buildInfoRequestBody('fundingHistory', params);
56
64
  /**
57
65
  * Get historical funding rates for a specific perpetual asset
58
66
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-historical-funding-rates
@@ -63,21 +71,24 @@ export const getUserOpenOrders = (params) => request('POST', 'info', Object.assi
63
71
  * @param params.endTime - Optional end timestamp in milliseconds
64
72
  * @returns Promise resolving to array of historical funding rate records
65
73
  */
66
- export const getHistoricalFundingRates = (params) => request('POST', 'info', Object.assign(Object.assign({}, params), { type: 'fundingHistory' }));
74
+ export const getHistoricalFundingRates = (params) => request('POST', 'info', buildHistoricalFundingRatesRequestBody(params));
75
+ export const buildAllMidsRequestBody = () => buildInfoRequestBody('allMids');
67
76
  /**
68
77
  * Get current mid prices for all tradable assets
69
78
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-mids-for-all-coins
70
79
  * API Endpoint: POST /info (type: allMids)
71
80
  * @returns Promise resolving to record of asset symbols mapped to their mid prices
72
81
  */
73
- export const getAllMids = () => request('POST', 'info', { type: 'allMids' });
82
+ export const getAllMids = () => request('POST', 'info', buildAllMidsRequestBody());
83
+ export const buildMetaAndAssetCtxsRequestBody = () => buildInfoRequestBody('metaAndAssetCtxs');
74
84
  /**
75
85
  * Get metadata and asset contexts (prices, funding, OI) for all perpetuals
76
86
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc.
77
87
  * API Endpoint: POST /info (type: metaAndAssetCtxs)
78
88
  * @returns Promise resolving to metadata and current asset contexts
79
89
  */
80
- export const getMetaAndAssetCtxs = () => request('POST', 'info', { type: 'metaAndAssetCtxs' });
90
+ export const getMetaAndAssetCtxs = () => request('POST', 'info', buildMetaAndAssetCtxsRequestBody());
91
+ export const buildCandleSnapshotRequestBody = (params) => buildInfoRequestBody('candleSnapshot', params);
81
92
  /**
82
93
  * Get candle/K-line data for a specific asset and time range
83
94
  * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#candle-snapshot
@@ -90,5 +101,5 @@ export const getMetaAndAssetCtxs = () => request('POST', 'info', { type: 'metaAn
90
101
  * @param params.req.endTime - End timestamp in milliseconds
91
102
  * @returns Promise resolving to candle data with OHLCV information
92
103
  */
93
- export const getCandleSnapshot = (params) => request('POST', 'info', Object.assign({ type: 'candleSnapshot' }, params));
104
+ export const getCandleSnapshot = (params) => request('POST', 'info', buildCandleSnapshotRequestBody(params));
94
105
  //# sourceMappingURL=public-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,MAAwB,EAAE,EAAE,CAC1E,OAAO,CAoCJ,MAAM,EAAE,MAAM,kCAAO,MAAM,KAAE,IAAI,EAAE,oBAAoB,IAAG,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAyB,EAAE,EAAE,CACjE,OAAO,CAkBJ,MAAM,EAAE,MAAM,kCAAO,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,KAAE,IAAI,EAAE,MAAM,IAAG,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAClC,OAAO,CAiBJ,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAE3C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAA8D,EAAE,EAAE,CACtG,OAAO,CAML,MAAM,EAAE,MAAM,kCAAO,MAAM,KAAE,IAAI,EAAE,gBAAgB,IAAG,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAwB,EAAE,EAAE,CAC/D,OAAO,CACL,MAAM,EACN,MAAM,kCAED,MAAM,KACT,IAAI,EAAE,wBAAwB,IAEjC,CAAC;AAEJ;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAwB,EAAE,EAAE,CAC5D,OAAO,CACL,MAAM,EACN,MAAM,kCAED,MAAM,KACT,IAAI,EAAE,YAAY,IAErB,CAAC;AAEJ;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAA6D,EAAE,EAAE,CACzG,OAAO,CAAyE,MAAM,EAAE,MAAM,kCACzF,MAAM,KACT,IAAI,EAAE,gBAAgB,IACtB,CAAC;AAEL;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAyB,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAErG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE,CACtC,OAAO,CAuBL,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAElD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAEjC,EAAE,EAAE,CACH,OAAO,CAaL,MAAM,EAAE,MAAM,kBAAI,IAAI,EAAE,gBAAgB,IAAK,MAAM,EAAG,CAAC","sourcesContent":["import { request } from './client';\n\n/**\n * Get user's perpetual account summary including positions, margin, and portfolio information\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-users-perpetuals-account-summary\n * API Endpoint: POST /info (type: clearinghouseState)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @returns Promise resolving to account summary with margin information, positions, and portfolio details\n */\nexport const getUserPerpetualsAccountSummary = (params: { user: string }) =>\n request<{\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: {\n type: string;\n position: {\n coin: string;\n szi: string;\n leverage: { type: string; value: number };\n entryPx: string;\n positionValue: string;\n unrealizedPnl: string;\n returnOnEquity: string;\n liquidationPx: string;\n marginUsed: string;\n maxLeverage: number;\n cumFunding: {\n allTime: string;\n sinceOpen: string;\n sinceChange: string;\n };\n };\n }[];\n time: number;\n }>('POST', 'info', { ...params, type: 'clearinghouseState' });\n\n/**\n * Get perpetual market metadata including available assets, their specifications, and margin tiers\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-metadata\n * API Endpoint: POST /info (type: meta)\n * @param params - Optional query parameters\n * @param params.dex - Optional DEX identifier\n * @returns Promise resolving to universe of perpetual assets and margin configuration\n */\nexport const getPerpetualsMetaData = (params?: { dex?: string }) =>\n request<{\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n onlyIsolated?: boolean;\n isDelisted?: boolean;\n }[];\n marginTables: [\n number,\n {\n description: string;\n marginTiers: {\n lowerBound: string;\n maxLeverage: number;\n }[];\n },\n ][];\n }>('POST', 'info', { ...(params ?? {}), type: 'meta' });\n\n/**\n * Get spot market metadata including available tokens and trading pairs\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-spot-metadata\n * API Endpoint: POST /info (type: spotMeta)\n * @returns Promise resolving to spot universe with token information and pair configurations\n */\nexport const getSpotMetaData = () =>\n request<{\n tokens: {\n name: string;\n szDecimals: number;\n weiDecimals: number;\n index: number;\n tokenId: string;\n isCanonical: boolean;\n evmContract: null;\n fullName: null;\n }[];\n universe: {\n name: string;\n tokens: number[];\n index: number;\n isCanonical: boolean;\n }[];\n }>('POST', 'info', { type: 'spotMeta' });\n\n/**\n * Get user's funding rate payment history for perpetual positions\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-a-users-funding-history-or-non-funding-ledger-updates\n * API Endpoint: POST /info (type: fundingHistory)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @param params.startTime - Optional start timestamp in milliseconds\n * @param params.endTime - Optional end timestamp in milliseconds\n * @returns Promise resolving to array of funding payment records with amounts and rates\n */\nexport const getUserFundingHistory = (params: { user: string; startTime?: number; endTime?: number }) =>\n request<\n {\n time: number;\n hash: string;\n delta: { type: string; coin: string; usdc: string; szi: string; fundingRate: string };\n }[]\n >('POST', 'info', { ...params, type: 'fundingHistory' });\n\n/**\n * Get user's token balances for both spot and perpetual accounts\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances\n * API Endpoint: POST /info (type: tokenBalances)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @returns Promise resolving to array of token balances with held and total amounts\n */\nexport const getUserTokenBalances = (params: { user: string }) =>\n request<{ balances: { coin: string; token: number; hold: string; total: string; entryNtl: string }[] }>(\n 'POST',\n 'info',\n {\n ...params,\n type: 'spotClearinghouseState',\n },\n );\n\n/**\n * Get user's currently open orders across all markets\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#open-orders\n * API Endpoint: POST /info (type: openOrders)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @returns Promise resolving to array of open order details with prices, sizes, and timestamps\n */\nexport const getUserOpenOrders = (params: { user: string }) =>\n request<{ coin: string; limitPx: string; oid: number; side: string; sz: string; timestamp: number }[]>(\n 'POST',\n 'info',\n {\n ...params,\n type: 'openOrders',\n },\n );\n\n/**\n * Get historical funding rates for a specific perpetual asset\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-historical-funding-rates\n * API Endpoint: POST /info (type: fundingHistory)\n * @param params - Query parameters\n * @param params.coin - Asset symbol (e.g., \"BTC\", \"ETH\")\n * @param params.startTime - Start timestamp in milliseconds\n * @param params.endTime - Optional end timestamp in milliseconds\n * @returns Promise resolving to array of historical funding rate records\n */\nexport const getHistoricalFundingRates = (params: { coin: string; startTime: number; endTime?: number }) =>\n request<{ coin: string; fundingRate: string; premium: string; time: number }[]>('POST', 'info', {\n ...params,\n type: 'fundingHistory',\n });\n\n/**\n * Get current mid prices for all tradable assets\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-mids-for-all-coins\n * API Endpoint: POST /info (type: allMids)\n * @returns Promise resolving to record of asset symbols mapped to their mid prices\n */\nexport const getAllMids = () => request<Record<string, string>>('POST', 'info', { type: 'allMids' });\n\n/**\n * Get metadata and asset contexts (prices, funding, OI) for all perpetuals\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc.\n * API Endpoint: POST /info (type: metaAndAssetCtxs)\n * @returns Promise resolving to metadata and current asset contexts\n */\nexport const getMetaAndAssetCtxs = () =>\n request<\n [\n {\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n onlyIsolated?: boolean;\n isDelisted?: boolean;\n }[];\n },\n {\n dayNtlVlm: string;\n funding: string;\n impactPxs: [string, string];\n markPx: string;\n midPx: string;\n openInterest: string;\n oraclePx: string;\n premium: string;\n prevDayPx: string;\n }[],\n ]\n >('POST', 'info', { type: 'metaAndAssetCtxs' });\n\n/**\n * Get candle/K-line data for a specific asset and time range\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#candle-snapshot\n * API Endpoint: POST /info (type: candleSnapshot)\n * @param params - Query parameters\n * @param params.req - Request object with candle parameters\n * @param params.req.coin - Asset symbol\n * @param params.req.interval - Time interval (e.g., \"1m\", \"5m\", \"1h\", \"1d\")\n * @param params.req.startTime - Start timestamp in milliseconds\n * @param params.req.endTime - End timestamp in milliseconds\n * @returns Promise resolving to candle data with OHLCV information\n */\nexport const getCandleSnapshot = (params: {\n req: { coin: string; interval: string; startTime: number; endTime: number };\n}) =>\n request<\n {\n T: number;\n c: string;\n h: string;\n i: string;\n l: string;\n o: string;\n n: number;\n s: string;\n t: number;\n v: string;\n }[]\n >('POST', 'info', { type: 'candleSnapshot', ...params });\n"]}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { request } from './client';\n\nconst buildInfoRequestBody = <P extends Record<string, unknown>>(type: string, params?: P) => ({\n ...(params ?? {}),\n type,\n});\n\nexport const buildUserPerpetualsAccountSummaryRequestBody = (params: { user: string }) =>\n buildInfoRequestBody('clearinghouseState', params);\n\n/**\n * Get user's perpetual account summary including positions, margin, and portfolio information\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-users-perpetuals-account-summary\n * API Endpoint: POST /info (type: clearinghouseState)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @returns Promise resolving to account summary with margin information, positions, and portfolio details\n */\nexport const getUserPerpetualsAccountSummary = (params: { user: string }) =>\n request<{\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: {\n type: string;\n position: {\n coin: string;\n szi: string;\n leverage: { type: string; value: number };\n entryPx: string;\n positionValue: string;\n unrealizedPnl: string;\n returnOnEquity: string;\n liquidationPx: string;\n marginUsed: string;\n maxLeverage: number;\n cumFunding: {\n allTime: string;\n sinceOpen: string;\n sinceChange: string;\n };\n };\n }[];\n time: number;\n }>('POST', 'info', buildUserPerpetualsAccountSummaryRequestBody(params));\n\nexport const buildPerpetualsMetaDataRequestBody = (params?: { dex?: string }) =>\n buildInfoRequestBody('meta', params ?? {});\n\n/**\n * Get perpetual market metadata including available assets, their specifications, and margin tiers\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-metadata\n * API Endpoint: POST /info (type: meta)\n * @param params - Optional query parameters\n * @param params.dex - Optional DEX identifier\n * @returns Promise resolving to universe of perpetual assets and margin configuration\n */\nexport const getPerpetualsMetaData = (params?: { dex?: string }) =>\n request<{\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n onlyIsolated?: boolean;\n isDelisted?: boolean;\n }[];\n marginTables: [\n number,\n {\n description: string;\n marginTiers: {\n lowerBound: string;\n maxLeverage: number;\n }[];\n },\n ][];\n }>('POST', 'info', buildPerpetualsMetaDataRequestBody(params));\n\nexport const buildSpotMetaDataRequestBody = () => buildInfoRequestBody('spotMeta');\n\n/**\n * Get spot market metadata including available tokens and trading pairs\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-spot-metadata\n * API Endpoint: POST /info (type: spotMeta)\n * @returns Promise resolving to spot universe with token information and pair configurations\n */\nexport const getSpotMetaData = () =>\n request<{\n tokens: {\n name: string;\n szDecimals: number;\n weiDecimals: number;\n index: number;\n tokenId: string;\n isCanonical: boolean;\n evmContract: null;\n fullName: null;\n }[];\n universe: {\n name: string;\n tokens: number[];\n index: number;\n isCanonical: boolean;\n }[];\n }>('POST', 'info', buildSpotMetaDataRequestBody());\n\nexport const buildUserFundingHistoryRequestBody = (params: {\n user: string;\n startTime?: number;\n endTime?: number;\n}) => buildInfoRequestBody('fundingHistory', params);\n\n/**\n * Get user's funding rate payment history for perpetual positions\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-a-users-funding-history-or-non-funding-ledger-updates\n * API Endpoint: POST /info (type: fundingHistory)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @param params.startTime - Optional start timestamp in milliseconds\n * @param params.endTime - Optional end timestamp in milliseconds\n * @returns Promise resolving to array of funding payment records with amounts and rates\n */\nexport const getUserFundingHistory = (params: { user: string; startTime?: number; endTime?: number }) =>\n request<\n {\n time: number;\n hash: string;\n delta: { type: string; coin: string; usdc: string; szi: string; fundingRate: string };\n }[]\n >('POST', 'info', buildUserFundingHistoryRequestBody(params));\n\nexport const buildUserTokenBalancesRequestBody = (params: { user: string }) =>\n buildInfoRequestBody('spotClearinghouseState', params);\n\n/**\n * Get user's token balances for both spot and perpetual accounts\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances\n * API Endpoint: POST /info (type: spotClearinghouseState)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @returns Promise resolving to array of token balances with held and total amounts\n */\nexport const getUserTokenBalances = (params: { user: string }) =>\n request<{ balances: { coin: string; token: number; hold: string; total: string; entryNtl: string }[] }>(\n 'POST',\n 'info',\n buildUserTokenBalancesRequestBody(params),\n );\n\nexport const buildUserOpenOrdersRequestBody = (params: { user: string }) =>\n buildInfoRequestBody('openOrders', params);\n\n/**\n * Get user's currently open orders across all markets\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#open-orders\n * API Endpoint: POST /info (type: openOrders)\n * @param params - Query parameters\n * @param params.user - User's wallet address\n * @returns Promise resolving to array of open order details with prices, sizes, and timestamps\n */\nexport const getUserOpenOrders = (params: { user: string }) =>\n request<{ coin: string; limitPx: string; oid: number; side: string; sz: string; timestamp: number }[]>(\n 'POST',\n 'info',\n buildUserOpenOrdersRequestBody(params),\n );\n\nexport const buildHistoricalFundingRatesRequestBody = (params: {\n coin: string;\n startTime: number;\n endTime?: number;\n}) => buildInfoRequestBody('fundingHistory', params);\n\n/**\n * Get historical funding rates for a specific perpetual asset\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-historical-funding-rates\n * API Endpoint: POST /info (type: fundingHistory)\n * @param params - Query parameters\n * @param params.coin - Asset symbol (e.g., \"BTC\", \"ETH\")\n * @param params.startTime - Start timestamp in milliseconds\n * @param params.endTime - Optional end timestamp in milliseconds\n * @returns Promise resolving to array of historical funding rate records\n */\nexport const getHistoricalFundingRates = (params: { coin: string; startTime: number; endTime?: number }) =>\n request<{ coin: string; fundingRate: string; premium: string; time: number }[]>(\n 'POST',\n 'info',\n buildHistoricalFundingRatesRequestBody(params),\n );\n\nexport const buildAllMidsRequestBody = () => buildInfoRequestBody('allMids');\n\n/**\n * Get current mid prices for all tradable assets\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-mids-for-all-coins\n * API Endpoint: POST /info (type: allMids)\n * @returns Promise resolving to record of asset symbols mapped to their mid prices\n */\nexport const getAllMids = () => request<Record<string, string>>('POST', 'info', buildAllMidsRequestBody());\n\nexport const buildMetaAndAssetCtxsRequestBody = () => buildInfoRequestBody('metaAndAssetCtxs');\n\n/**\n * Get metadata and asset contexts (prices, funding, OI) for all perpetuals\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc.\n * API Endpoint: POST /info (type: metaAndAssetCtxs)\n * @returns Promise resolving to metadata and current asset contexts\n */\nexport const getMetaAndAssetCtxs = () =>\n request<\n [\n {\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n onlyIsolated?: boolean;\n isDelisted?: boolean;\n }[];\n },\n {\n dayNtlVlm: string;\n funding: string;\n impactPxs: [string, string];\n markPx: string;\n midPx: string;\n openInterest: string;\n oraclePx: string;\n premium: string;\n prevDayPx: string;\n }[],\n ]\n >('POST', 'info', buildMetaAndAssetCtxsRequestBody());\n\nexport const buildCandleSnapshotRequestBody = (params: {\n req: { coin: string; interval: string; startTime: number; endTime: number };\n}) => buildInfoRequestBody('candleSnapshot', params);\n\n/**\n * Get candle/K-line data for a specific asset and time range\n * API Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#candle-snapshot\n * API Endpoint: POST /info (type: candleSnapshot)\n * @param params - Query parameters\n * @param params.req - Request object with candle parameters\n * @param params.req.coin - Asset symbol\n * @param params.req.interval - Time interval (e.g., \"1m\", \"5m\", \"1h\", \"1d\")\n * @param params.req.startTime - Start timestamp in milliseconds\n * @param params.req.endTime - End timestamp in milliseconds\n * @returns Promise resolving to candle data with OHLCV information\n */\nexport const getCandleSnapshot = (params: {\n req: { coin: string; interval: string; startTime: number; endTime: number };\n}) =>\n request<\n {\n T: number;\n c: string;\n h: string;\n i: string;\n l: string;\n o: string;\n n: number;\n s: string;\n t: number;\n v: string;\n }[]\n >('POST', 'info', buildCandleSnapshotRequestBody(params));\n"]}