@yuants/vendor-hyperliquid 0.9.8 → 0.9.10

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 (59) hide show
  1. package/dist/api/client.js.map +1 -1
  2. package/dist/api/private-api.js.map +1 -1
  3. package/dist/api/sign.js.map +1 -1
  4. package/dist/api/types.js.map +1 -1
  5. package/dist/services/accounts/spot.js.map +1 -1
  6. package/dist/services/exchange.js.map +1 -1
  7. package/dist/services/markets/interest-rate.js +7 -6
  8. package/dist/services/markets/interest-rate.js.map +1 -1
  9. package/dist/services/markets/ohlc.js +7 -6
  10. package/dist/services/markets/ohlc.js.map +1 -1
  11. package/dist/services/markets/quote.js.map +1 -1
  12. package/dist/services/ohlc-service.js.map +1 -1
  13. package/dist/services/orders/cancelOrder.js.map +1 -1
  14. package/dist/services/orders/listOrders.js +2 -2
  15. package/dist/services/orders/listOrders.js.map +1 -1
  16. package/dist/services/orders/modifyOrder.js.map +1 -1
  17. package/dist/services/quotes.js.map +1 -1
  18. package/dist/services/utils.js.map +1 -1
  19. package/lib/api/client.d.ts +1 -1
  20. package/lib/api/client.d.ts.map +1 -1
  21. package/lib/api/client.js.map +1 -1
  22. package/lib/api/private-api.d.ts +2 -2
  23. package/lib/api/private-api.d.ts.map +1 -1
  24. package/lib/api/private-api.js.map +1 -1
  25. package/lib/api/public-api.d.ts +7 -10
  26. package/lib/api/public-api.d.ts.map +1 -1
  27. package/lib/api/sign.js +5 -6
  28. package/lib/api/sign.js.map +1 -1
  29. package/lib/api/types.d.ts.map +1 -1
  30. package/lib/api/types.js.map +1 -1
  31. package/lib/services/accounts/perp.d.ts.map +1 -1
  32. package/lib/services/accounts/spot.d.ts.map +1 -1
  33. package/lib/services/accounts/spot.js.map +1 -1
  34. package/lib/services/exchange.js.map +1 -1
  35. package/lib/services/markets/interest-rate.js +7 -6
  36. package/lib/services/markets/interest-rate.js.map +1 -1
  37. package/lib/services/markets/ohlc.js +7 -6
  38. package/lib/services/markets/ohlc.js.map +1 -1
  39. package/lib/services/markets/product.d.ts.map +1 -1
  40. package/lib/services/markets/quote.js.map +1 -1
  41. package/lib/services/ohlc-service.js.map +1 -1
  42. package/lib/services/orders/cancelOrder.d.ts.map +1 -1
  43. package/lib/services/orders/cancelOrder.js.map +1 -1
  44. package/lib/services/orders/listOrders.d.ts.map +1 -1
  45. package/lib/services/orders/listOrders.js +2 -2
  46. package/lib/services/orders/listOrders.js.map +1 -1
  47. package/lib/services/orders/modifyOrder.d.ts.map +1 -1
  48. package/lib/services/orders/modifyOrder.js.map +1 -1
  49. package/lib/services/orders/submitOrder.d.ts.map +1 -1
  50. package/lib/services/quotes.js.map +1 -1
  51. package/lib/services/utils.d.ts +2 -2
  52. package/lib/services/utils.d.ts.map +1 -1
  53. package/lib/services/utils.js.map +1 -1
  54. package/lib/tsdoc-metadata.json +1 -1
  55. package/package.json +48 -48
  56. package/temp/build/typescript/ts_HOjXkPSo.json +1 -0
  57. package/temp/package-deps.json +20 -20
  58. package/temp/test/jest/haste-map-1a3370ad4952cc1cbecf8fc42c6e9732-7b2990dcc44090c4eba2c52e971c544c-6a2a6e27ca3579da37751287ea19ab4c +0 -0
  59. package/temp/vendor-hyperliquid.api.json +18 -2
@@ -1 +1 @@
1
- {"version":3,"file":"listOrders.js","sourceRoot":"","sources":["../../../src/services/orders/listOrders.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { decodePath, encodePath, formatTime } from '@yuants/utils';\nimport { ICredential, getCredentialId } from '../../api/types';\nimport { getUserOpenOrders } from '../../api/public-api';\n\ntype OrderDirection = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT';\n\n/**\n * Map order direction based on side and reduce-only logic\n */\nconst mapOrderDirection = (side: string): OrderDirection => {\n const normalized = side.toUpperCase();\n if (normalized === 'BID' || normalized === 'BUY') {\n return 'OPEN_LONG';\n }\n if (normalized === 'ASK' || normalized === 'SELL') {\n return 'OPEN_SHORT';\n }\n return 'OPEN_LONG';\n};\n\n/**\n * Map Hyperliquid order to Yuan IOrder format\n */\nconst mapOrder = (order: any): IOrder => {\n const volume = Number(order.sz) || 0;\n const price = Number(order.limitPx) || 0;\n\n return {\n order_id: `${order.oid}`,\n account_id: '',\n product_id: encodePath('HYPERLIQUID', 'PERPETUAL', `${order.coin?.trim()}-USD`),\n order_type: 'LIMIT', // Hyperliquid primarily uses limit orders\n order_direction: mapOrderDirection(order.side),\n volume: Number.isFinite(volume) ? volume : 0,\n price: Number.isFinite(price) && price > 0 ? price : undefined,\n submit_at: Number(order.timestamp ?? Date.now()),\n order_status: 'open', // Since these are open orders\n // Additional fields that might be useful\n comment: order.coin ? JSON.stringify({ asset_id: order.coin }) : undefined,\n };\n};\n\n/**\n * List perpetual orders\n */\nexport const listPerpOrders = async (credential: ICredential): Promise<IOrder[]> => {\n console.info(`[${formatTime(Date.now())}] Listing perpetual orders for ${credential.address}`);\n\n try {\n const orders = await getUserOpenOrders({ user: credential.address });\n if (!orders || !Array.isArray(orders)) {\n return [];\n }\n return orders.map((order) => mapOrder(order));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${formatTime(Date.now())}] Failed to list perpetual orders: ${errorMessage}`);\n throw new Error(`Failed to list perpetual orders: ${errorMessage}`);\n }\n};\n\n/**\n * List orders by product_id\n */\nexport const listOrdersByProductId = async (\n credential: ICredential,\n product_id: string,\n): Promise<IOrder[]> => {\n const [exchange, instType] = decodePath(product_id);\n if (exchange !== 'HYPERLIQUID') {\n throw new Error(`Invalid product_id for Hyperliquid: ${product_id}`);\n }\n if (instType !== 'PERPETUAL') {\n return [];\n }\n const orders = await listPerpOrders(credential);\n return orders.filter((order) => order.product_id === product_id);\n};\n"]}
1
+ {"version":3,"file":"listOrders.js","sourceRoot":"","sources":["../../../src/services/orders/listOrders.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { decodePath, encodePath, formatTime } from '@yuants/utils';\nimport { ICredential, getCredentialId } from '../../api/types';\nimport { getUserOpenOrders } from '../../api/public-api';\n\ntype OrderDirection = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT';\n\n/**\n * Map order direction based on side and reduce-only logic\n */\nconst mapOrderDirection = (side: string): OrderDirection => {\n const normalized = side.toUpperCase();\n if (normalized === 'BID' || normalized === 'BUY') {\n return 'OPEN_LONG';\n }\n if (normalized === 'ASK' || normalized === 'SELL') {\n return 'OPEN_SHORT';\n }\n return 'OPEN_LONG';\n};\n\n/**\n * Map Hyperliquid order to Yuan IOrder format\n */\nconst mapOrder = (order: any): IOrder => {\n const volume = Number(order.sz) || 0;\n const price = Number(order.limitPx) || 0;\n\n return {\n order_id: `${order.oid}`,\n account_id: '',\n product_id: encodePath('HYPERLIQUID', 'PERPETUAL', `${order.coin?.trim()}-USD`),\n order_type: 'LIMIT', // Hyperliquid primarily uses limit orders\n order_direction: mapOrderDirection(order.side),\n volume: Number.isFinite(volume) ? volume : 0,\n price: Number.isFinite(price) && price > 0 ? price : undefined,\n submit_at: Number(order.timestamp ?? Date.now()),\n order_status: 'open', // Since these are open orders\n // Additional fields that might be useful\n comment: order.coin ? JSON.stringify({ asset_id: order.coin }) : undefined,\n };\n};\n\n/**\n * List perpetual orders\n */\nexport const listPerpOrders = async (credential: ICredential): Promise<IOrder[]> => {\n console.info(`[${formatTime(Date.now())}] Listing perpetual orders for ${credential.address}`);\n\n try {\n const orders = await getUserOpenOrders({ user: credential.address });\n if (!orders || !Array.isArray(orders)) {\n return [];\n }\n return orders.map((order) => mapOrder(order));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${formatTime(Date.now())}] Failed to list perpetual orders: ${errorMessage}`);\n throw new Error(`Failed to list perpetual orders: ${errorMessage}`);\n }\n};\n\n/**\n * List orders by product_id\n */\nexport const listOrdersByProductId = async (\n credential: ICredential,\n product_id: string,\n): Promise<IOrder[]> => {\n const [exchange, instType] = decodePath(product_id);\n if (exchange !== 'HYPERLIQUID') {\n throw new Error(`Invalid product_id for Hyperliquid: ${product_id}`);\n }\n if (instType !== 'PERPETUAL') {\n return [];\n }\n const orders = await listPerpOrders(credential);\n return orders.filter((order) => order.product_id === product_id);\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"modifyOrder.d.ts","sourceRoot":"","sources":["../../../src/services/orders/modifyOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,eAAsB,WAAW,SAAS,MAAM,KAAG,QAAQ,IAAI,CA0CtF,CAAC"}
1
+ {"version":3,"file":"modifyOrder.d.ts","sourceRoot":"","sources":["../../../src/services/orders/modifyOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,GAAU,YAAY,WAAW,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CA0CtF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"modifyOrder.js","sourceRoot":"","sources":["../../../src/services/orders/modifyOrder.ts"],"names":[],"mappings":";;;AACA,yCAA2C;AAE3C,uDAAsE;AACtE,oCAA6C;AAE7C;;;;;;;;;;GAUG;AACI,MAAM,WAAW,GAAG,KAAK,EAAE,UAAuB,EAAE,KAAa,EAAiB,EAAE;;IACzF,OAAO,CAAC,IAAI,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,qBAAqB,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAEtG,IAAI;QACF,oBAAoB;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;SACxD;QAED,sDAAsD;QACtD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,yBAAiB,EAAC,KAAK,CAAC,CAAC;QAEvD,OAAO,CAAC,IAAI,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,qBAAqB,KAAK,CAAC,QAAQ,mBAAmB,EAAE;YAC7F,KAAK,EAAE,WAAW,CAAC,CAAC;YACpB,KAAK,EAAE,WAAW,CAAC,CAAC;YACpB,KAAK,EAAE,WAAW,CAAC,CAAC;YACpB,IAAI,EAAE,WAAW,CAAC,CAAC;YACnB,UAAU,EAAE,WAAW,CAAC,CAAC;YACzB,GAAG,EAAE,MAAA,WAAW,CAAC,CAAC,CAAC,KAAK,0CAAE,GAAG;SAC9B,CAAC,CAAC;QAEH,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,UAAU,EAAE;YAC9C,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,MAAM,GAAG,MAAA,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,0CAAE,IAAI,0CAAE,QAAQ,0CAAG,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,MAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/F,IAAI,KAAK,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;SACrD;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,KAAK,CAAC,QAAQ,wBAAwB,CAAC,CAAC;KAC3F;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,4BAA4B,KAAK,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;KAC5D;AACH,CAAC,CAAC;AA1CW,QAAA,WAAW,eA0CtB","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { formatTime } from '@yuants/utils';\nimport { ICredential } from '../../api/types';\nimport { modifyOrder as modifyOrderApi } from '../../api/private-api';\nimport { buildOrderPayload } from '../utils';\n\n/**\n * 修改订单 - 使用 Hyperliquid 原生 modify order API\n *\n * Hyperliquid supports native order modification through the modify action:\n * https://hyperliquid.gitbook.io/hyperliquid-docs/for-develope../../api/exchange-endpoint#modify-an-order\n *\n * This is more efficient than cancel + place new as it:\n * 1. Maintains order priority in the order book\n * 2. Reduces API calls from 2 to 1\n * 3. Prevents race conditions where the cancelled order might be filled before new order is placed\n */\nexport const modifyOrder = async (credential: ICredential, order: IOrder): Promise<void> => {\n console.info(`[${formatTime(Date.now())}] Modifying order ${order.order_id} for ${order.product_id}`);\n\n try {\n // Validate order_id\n const orderId = Number(order.order_id);\n if (!Number.isFinite(orderId)) {\n throw new Error(`Invalid order_id: ${order.order_id}`);\n }\n\n // Build the new order payload with updated parameters\n const { orderParams } = await buildOrderPayload(order);\n\n console.info(`[${formatTime(Date.now())}] Modifying order ${order.order_id} with new params:`, {\n asset: orderParams.a,\n isBuy: orderParams.b,\n price: orderParams.p,\n size: orderParams.s,\n reduceOnly: orderParams.r,\n tif: orderParams.t.limit?.tif,\n });\n\n // Call Hyperliquid's native modify order API\n const result = await modifyOrderApi(credential, {\n oid: orderId,\n order: orderParams,\n });\n\n // Check if the modification was successful\n const status = result?.response?.data?.statuses?.[0];\n const error = result?.status !== 'ok' ? 'API ERROR' : status?.error ? status.error : undefined;\n\n if (error) {\n throw new Error(`Failed to modify order: ${error}`);\n }\n\n console.info(`[${formatTime(Date.now())}] Order ${order.order_id} modified successfully`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${formatTime(Date.now())}] Failed to modify order ${order.order_id}: ${errorMessage}`);\n throw new Error(`Failed to modify order: ${errorMessage}`);\n }\n};\n"]}
1
+ {"version":3,"file":"modifyOrder.js","sourceRoot":"","sources":["../../../src/services/orders/modifyOrder.ts"],"names":[],"mappings":";;;AACA,yCAA2C;AAE3C,uDAAsE;AACtE,oCAA6C;AAE7C;;;;;;;;;;GAUG;AACI,MAAM,WAAW,GAAG,KAAK,EAAE,UAAuB,EAAE,KAAa,EAAiB,EAAE;;IACzF,OAAO,CAAC,IAAI,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,qBAAqB,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAEtG,IAAI,CAAC;QACH,oBAAoB;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,sDAAsD;QACtD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,yBAAiB,EAAC,KAAK,CAAC,CAAC;QAEvD,OAAO,CAAC,IAAI,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,qBAAqB,KAAK,CAAC,QAAQ,mBAAmB,EAAE;YAC7F,KAAK,EAAE,WAAW,CAAC,CAAC;YACpB,KAAK,EAAE,WAAW,CAAC,CAAC;YACpB,KAAK,EAAE,WAAW,CAAC,CAAC;YACpB,IAAI,EAAE,WAAW,CAAC,CAAC;YACnB,UAAU,EAAE,WAAW,CAAC,CAAC;YACzB,GAAG,EAAE,MAAA,WAAW,CAAC,CAAC,CAAC,KAAK,0CAAE,GAAG;SAC9B,CAAC,CAAC;QAEH,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,UAAU,EAAE;YAC9C,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,MAAM,GAAG,MAAA,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,0CAAE,IAAI,0CAAE,QAAQ,0CAAG,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,MAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/F,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,KAAK,CAAC,QAAQ,wBAAwB,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,4BAA4B,KAAK,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC;AA1CW,QAAA,WAAW,eA0CtB","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { formatTime } from '@yuants/utils';\nimport { ICredential } from '../../api/types';\nimport { modifyOrder as modifyOrderApi } from '../../api/private-api';\nimport { buildOrderPayload } from '../utils';\n\n/**\n * 修改订单 - 使用 Hyperliquid 原生 modify order API\n *\n * Hyperliquid supports native order modification through the modify action:\n * https://hyperliquid.gitbook.io/hyperliquid-docs/for-develope../../api/exchange-endpoint#modify-an-order\n *\n * This is more efficient than cancel + place new as it:\n * 1. Maintains order priority in the order book\n * 2. Reduces API calls from 2 to 1\n * 3. Prevents race conditions where the cancelled order might be filled before new order is placed\n */\nexport const modifyOrder = async (credential: ICredential, order: IOrder): Promise<void> => {\n console.info(`[${formatTime(Date.now())}] Modifying order ${order.order_id} for ${order.product_id}`);\n\n try {\n // Validate order_id\n const orderId = Number(order.order_id);\n if (!Number.isFinite(orderId)) {\n throw new Error(`Invalid order_id: ${order.order_id}`);\n }\n\n // Build the new order payload with updated parameters\n const { orderParams } = await buildOrderPayload(order);\n\n console.info(`[${formatTime(Date.now())}] Modifying order ${order.order_id} with new params:`, {\n asset: orderParams.a,\n isBuy: orderParams.b,\n price: orderParams.p,\n size: orderParams.s,\n reduceOnly: orderParams.r,\n tif: orderParams.t.limit?.tif,\n });\n\n // Call Hyperliquid's native modify order API\n const result = await modifyOrderApi(credential, {\n oid: orderId,\n order: orderParams,\n });\n\n // Check if the modification was successful\n const status = result?.response?.data?.statuses?.[0];\n const error = result?.status !== 'ok' ? 'API ERROR' : status?.error ? status.error : undefined;\n\n if (error) {\n throw new Error(`Failed to modify order: ${error}`);\n }\n\n console.info(`[${formatTime(Date.now())}] Order ${order.order_id} modified successfully`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${formatTime(Date.now())}] Failed to modify order ${order.order_id}: ${errorMessage}`);\n throw new Error(`Failed to modify order: ${errorMessage}`);\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"submitOrder.d.ts","sourceRoot":"","sources":["../../../src/services/orders/submitOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,eAAO,MAAM,WAAW,eAAsB,WAAW,SAAS,MAAM,KAAG,QAAQ;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAWtG,CAAC"}
1
+ {"version":3,"file":"submitOrder.d.ts","sourceRoot":"","sources":["../../../src/services/orders/submitOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,eAAO,MAAM,WAAW,GAAU,YAAY,WAAW,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAWtG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"quotes.js","sourceRoot":"","sources":["../../src/services/quotes.ts"],"names":[],"mappings":";;AAAA,+CAAuD;AACvD,+CAA4C;AAC5C,yCAA2C;AAC3C,kDAAoE;AAEpE,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,IAAA,8BAAmB,EACjB,QAAQ,EACR;IACE,iBAAiB,EAAE,wBAAwB;IAC3C,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC;CACjD,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,IAAI,GAAG,MAAM,IAAA,uBAAU,GAAE,CAAC;IAEhC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACtD,OAAO;YACL,UAAU,EAAE,IAAA,kBAAU,EAAC,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,CAAC;YACjE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,UAAU,EAAE,GAAG,KAAK,EAAE;YACtB,SAAS,EAAE,GAAG,KAAK,EAAE;YACrB,SAAS,EAAE,GAAG,KAAK,EAAE;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEF,IAAA,8BAAmB,EACjB,QAAQ,EACR;IACE,iBAAiB,EAAE,wBAAwB;IAC3C,MAAM,EAAE,CAAC,eAAe,EAAE,oBAAoB,EAAE,qBAAqB,CAAC;CACvE,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;;IACZ,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,IAAA,gCAAmB,GAAE,CAAC;IAEtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsC,CAAC;IAChE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,0CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAG,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,KAAI,GAAG,EAAE;YACtB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SAChC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE;;QAAC,OAAA,CAAC;YAC3D,UAAU,EAAE,IAAA,kBAAU,EAAC,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,CAAC;YACjE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,MAAA,GAAG,CAAC,YAAY,mCAAI,GAAG;YACtC,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;YACjE,mBAAmB,EAAE,MAAA,GAAG,CAAC,OAAO,mCAAI,GAAG;SACxC,CAAC,CAAA;KAAA,CAAC,CAAC;AACN,CAAC,CACF,CAAC","sourcesContent":["import { provideQuoteService } from '@yuants/exchange';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { getAllMids, getMetaAndAssetCtxs } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nprovideQuoteService(\n terminal,\n {\n product_id_prefix: 'HYPERLIQUID/PERPETUAL/',\n fields: ['last_price', 'ask_price', 'bid_price'],\n },\n async (req) => {\n const mids = await getAllMids();\n\n return Object.entries(mids ?? {}).map(([coin, price]) => {\n return {\n product_id: encodePath('HYPERLIQUID', 'PERPETUAL', `${coin}-USD`),\n updated_at: Date.now(),\n last_price: `${price}`,\n bid_price: `${price}`,\n ask_price: `${price}`,\n };\n });\n },\n);\n\nprovideQuoteService(\n terminal,\n {\n product_id_prefix: 'HYPERLIQUID/PERPETUAL/',\n fields: ['open_interest', 'interest_rate_long', 'interest_rate_short'],\n },\n async (req) => {\n const [meta, assetCtxs] = await getMetaAndAssetCtxs();\n\n const coinToCtx = new Map<string, (typeof assetCtxs)[number]>();\n meta?.universe?.forEach((asset, index) => {\n const ctx = assetCtxs?.[index];\n if (asset?.name && ctx) {\n coinToCtx.set(asset.name, ctx);\n }\n });\n\n return Array.from(coinToCtx.entries()).map(([coin, ctx]) => ({\n product_id: encodePath('HYPERLIQUID', 'PERPETUAL', `${coin}-USD`),\n updated_at: Date.now(),\n open_interest: ctx.openInterest ?? '0',\n interest_rate_long: ctx.funding ? `${-Number(ctx.funding)}` : '0',\n interest_rate_short: ctx.funding ?? '0',\n }));\n },\n);\n"]}
1
+ {"version":3,"file":"quotes.js","sourceRoot":"","sources":["../../src/services/quotes.ts"],"names":[],"mappings":";;AAAA,+CAAuD;AACvD,+CAA4C;AAC5C,yCAA2C;AAC3C,kDAAoE;AAEpE,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,IAAA,8BAAmB,EACjB,QAAQ,EACR;IACE,iBAAiB,EAAE,wBAAwB;IAC3C,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC;CACjD,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,IAAI,GAAG,MAAM,IAAA,uBAAU,GAAE,CAAC;IAEhC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACtD,OAAO;YACL,UAAU,EAAE,IAAA,kBAAU,EAAC,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,CAAC;YACjE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,UAAU,EAAE,GAAG,KAAK,EAAE;YACtB,SAAS,EAAE,GAAG,KAAK,EAAE;YACrB,SAAS,EAAE,GAAG,KAAK,EAAE;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEF,IAAA,8BAAmB,EACjB,QAAQ,EACR;IACE,iBAAiB,EAAE,wBAAwB;IAC3C,MAAM,EAAE,CAAC,eAAe,EAAE,oBAAoB,EAAE,qBAAqB,CAAC;CACvE,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;;IACZ,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,IAAA,gCAAmB,GAAE,CAAC;IAEtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsC,CAAC;IAChE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,0CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAG,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,KAAI,GAAG,EAAE,CAAC;YACvB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE;;QAAC,OAAA,CAAC;YAC3D,UAAU,EAAE,IAAA,kBAAU,EAAC,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,CAAC;YACjE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,MAAA,GAAG,CAAC,YAAY,mCAAI,GAAG;YACtC,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;YACjE,mBAAmB,EAAE,MAAA,GAAG,CAAC,OAAO,mCAAI,GAAG;SACxC,CAAC,CAAA;KAAA,CAAC,CAAC;AACN,CAAC,CACF,CAAC","sourcesContent":["import { provideQuoteService } from '@yuants/exchange';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { getAllMids, getMetaAndAssetCtxs } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nprovideQuoteService(\n terminal,\n {\n product_id_prefix: 'HYPERLIQUID/PERPETUAL/',\n fields: ['last_price', 'ask_price', 'bid_price'],\n },\n async (req) => {\n const mids = await getAllMids();\n\n return Object.entries(mids ?? {}).map(([coin, price]) => {\n return {\n product_id: encodePath('HYPERLIQUID', 'PERPETUAL', `${coin}-USD`),\n updated_at: Date.now(),\n last_price: `${price}`,\n bid_price: `${price}`,\n ask_price: `${price}`,\n };\n });\n },\n);\n\nprovideQuoteService(\n terminal,\n {\n product_id_prefix: 'HYPERLIQUID/PERPETUAL/',\n fields: ['open_interest', 'interest_rate_long', 'interest_rate_short'],\n },\n async (req) => {\n const [meta, assetCtxs] = await getMetaAndAssetCtxs();\n\n const coinToCtx = new Map<string, (typeof assetCtxs)[number]>();\n meta?.universe?.forEach((asset, index) => {\n const ctx = assetCtxs?.[index];\n if (asset?.name && ctx) {\n coinToCtx.set(asset.name, ctx);\n }\n });\n\n return Array.from(coinToCtx.entries()).map(([coin, ctx]) => ({\n product_id: encodePath('HYPERLIQUID', 'PERPETUAL', `${coin}-USD`),\n updated_at: Date.now(),\n open_interest: ctx.openInterest ?? '0',\n interest_rate_long: ctx.funding ? `${-Number(ctx.funding)}` : '0',\n interest_rate_short: ctx.funding ?? '0',\n }));\n },\n);\n"]}
@@ -3,7 +3,7 @@ declare const enum InstrumentType {
3
3
  PERPETUAL = "PERPETUAL",
4
4
  SPOT = "SPOT"
5
5
  }
6
- declare type AssetInfo = {
6
+ type AssetInfo = {
7
7
  assetId: number;
8
8
  szDecimals: number;
9
9
  instType: InstrumentType;
@@ -14,7 +14,7 @@ export declare const parseProductPath: (product_id: string) => {
14
14
  baseCurrency: string;
15
15
  };
16
16
  export declare const resolveAssetInfo: (product_id: string) => Promise<AssetInfo>;
17
- export declare const roundPrice: (price: number, instType: 'PERPETUAL' | 'SPOT', szDecimals: number) => string;
17
+ export declare const roundPrice: (price: number, instType: "PERPETUAL" | "SPOT", szDecimals: number) => string;
18
18
  export declare const buildOrderPayload: (order: IOrder) => Promise<{
19
19
  assetInfo: AssetInfo;
20
20
  orderParams: {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,mBAAW,cAAc;IACvB,SAAS,cAAc;IACvB,IAAI,SAAS;CACd;AAED,aAAK,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzG,eAAO,MAAM,gBAAgB,eAAgB,MAAM;cAAe,cAAc;kBAAgB,MAAM;CAUrG,CAAC;AAgDF,eAAO,MAAM,gBAAgB,eAAsB,MAAM,KAAG,QAAQ,SAAS,CAa5E,CAAC;AAEF,eAAO,MAAM,UAAU,UAAW,MAAM,YAAY,WAAW,GAAG,MAAM,cAAc,MAAM,KAAG,MA+B9F,CAAC;AAqBF,eAAO,MAAM,iBAAiB,UAAiB,MAAM;;;;;;;;;;;;;;EAiBpD,CAAC;AAEF,eAAO,MAAM,uBAAuB,SAAgB,MAAM,SAAS,OAAO,oBAKzE,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,mBAAW,cAAc;IACvB,SAAS,cAAc;IACvB,IAAI,SAAS;CACd;AAED,KAAK,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzG,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,KAAG;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAUrG,CAAC;AAgDF,eAAO,MAAM,gBAAgB,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,SAAS,CAa5E,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,EAAE,UAAU,WAAW,GAAG,MAAM,EAAE,YAAY,MAAM,KAAG,MA+B9F,CAAC;AAqBF,eAAO,MAAM,iBAAiB,GAAU,OAAO,MAAM;;;;;;;;;;;;;;EAiBpD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,MAAM,EAAE,OAAO,OAAO,oBAKzE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IOrder } from '@yuants/data-order';\nimport { decodePath } from '@yuants/utils';\nimport { getAllMids, getPerpetualsMetaData, getSpotMetaData } from '../api/public-api';\n\nconst enum InstrumentType {\n PERPETUAL = 'PERPETUAL',\n SPOT = 'SPOT',\n}\n\ntype AssetInfo = { assetId: number; szDecimals: number; instType: InstrumentType; baseCurrency: string };\n\nexport const parseProductPath = (product_id: string): { instType: InstrumentType; baseCurrency: string } => {\n const [exchange, instType, symbol] = decodePath(product_id);\n if (exchange !== 'HYPERLIQUID' || !instType || !symbol) {\n throw new Error(`Invalid product_id: ${product_id}`);\n }\n if (instType !== InstrumentType.PERPETUAL && instType !== InstrumentType.SPOT) {\n throw new Error(`Unsupported instrument type: ${instType}`);\n }\n const baseCurrency = symbol.split('-')[0];\n return { instType, baseCurrency };\n};\n\nconst CACHE_TTL = 60_000;\nconst MID_TTL = 5_000;\n\n// Create caches using createCache utility\nconst perpMetaCache = createCache<Map<string, { assetId: number; szDecimals: number }>>(\n async () => {\n console.info(`[Hyperliquid] Refreshing perpetual metadata cache`);\n const meta = await getPerpetualsMetaData();\n const map = new Map<string, { assetId: number; szDecimals: number }>();\n meta.universe.forEach((token, index) =>\n map.set(token.name, { assetId: index, szDecimals: token.szDecimals }),\n );\n return map;\n },\n { expire: CACHE_TTL },\n);\n\nconst spotMetaCache = createCache<Map<string, { assetId: number; szDecimals: number }>>(\n async () => {\n console.info(`[Hyperliquid] Refreshing spot metadata cache`);\n const meta = await getSpotMetaData();\n const map = new Map<string, { assetId: number; szDecimals: number }>();\n meta.tokens.forEach((token) =>\n map.set(token.name, { assetId: token.index, szDecimals: token.szDecimals }),\n );\n return map;\n },\n { expire: CACHE_TTL },\n);\n\nconst midPriceCache = createCache<Map<string, number>>(\n async () => {\n console.info(`[Hyperliquid] Refreshing mid price cache`);\n const mids = await getAllMids();\n const map = new Map<string, number>();\n for (const [coin, price] of Object.entries(mids ?? {})) {\n const value = Number(price);\n if (Number.isFinite(value)) {\n map.set(coin, value);\n }\n }\n return map;\n },\n { expire: MID_TTL },\n);\n\nexport const resolveAssetInfo = async (product_id: string): Promise<AssetInfo> => {\n const { instType, baseCurrency } = parseProductPath(product_id);\n if (instType === InstrumentType.PERPETUAL) {\n const map = (await perpMetaCache.query('perp'))!;\n const info = map.get(baseCurrency)!;\n return { ...info, instType: InstrumentType.PERPETUAL, baseCurrency };\n }\n if (instType === InstrumentType.SPOT) {\n const map = (await spotMetaCache.query('spot'))!;\n const info = map.get(baseCurrency)!;\n return { ...info, instType: InstrumentType.SPOT, baseCurrency };\n }\n throw new Error(`Unsupported instrument type: ${instType}`);\n};\n\nexport const roundPrice = (price: number, instType: 'PERPETUAL' | 'SPOT', szDecimals: number): string => {\n const MAX_DECIMALS = instType === 'PERPETUAL' ? 6 : 8;\n const maxDecimalPlaces = Math.max(0, MAX_DECIMALS - szDecimals);\n if (!Number.isFinite(price)) {\n throw new Error(`Invalid price: ${price}`);\n }\n\n // Handle significant figures (max 5)\n const priceStr = price.toString();\n const significantFigures = priceStr.replace(/^0+\\.?0*/, '').replace(/\\./g, '').length;\n\n let roundedPrice = price;\n if (significantFigures > 5) {\n // Logic to round to 5 sig figs\n // This is complex to do perfectly with just numbers, but let's try to be safe\n const magnitude = Math.floor(Math.log10(Math.abs(price)));\n // We want 5 sig figs.\n // e.g. 123456 -> 123460 (mag 5, round to 10^(5-4)=10^1)\n // e.g. 0.00123456 -> 0.0012346 (mag -3, round to 10^(-3-4)=10^-7)\n const factor = Math.pow(10, magnitude - 4);\n roundedPrice = Math.round(price / factor) * factor;\n }\n\n // Now format to maxDecimalPlaces without scientific notation\n // Use toFixed which returns fixed point notation\n let s = roundedPrice.toFixed(maxDecimalPlaces);\n // Remove trailing zeros and decimal point if integer\n if (s.includes('.')) {\n s = s.replace(/\\.?0+$/, '');\n }\n return s;\n};\n\nconst resolvePrice = async (\n order: IOrder,\n instType: 'PERPETUAL' | 'SPOT',\n szDecimals: number,\n baseCurrency: string,\n) => {\n if (order.order_type === 'MARKET') {\n const mid = await getMidPriceWithSlippage(\n baseCurrency,\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT',\n );\n return roundPrice(mid, instType, szDecimals);\n }\n if (!order.price) {\n throw new Error('price is required for non-market orders');\n }\n return roundPrice(+order.price, instType, szDecimals);\n};\n\nexport const buildOrderPayload = async (order: IOrder) => {\n const assetInfo = await resolveAssetInfo(order.product_id);\n const isBuy = order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT';\n const reduceOnly = order.order_direction === 'CLOSE_LONG' || order.order_direction === 'CLOSE_SHORT';\n const price = await resolvePrice(order, assetInfo.instType, assetInfo.szDecimals, assetInfo.baseCurrency);\n const tif = order.order_type === 'MARKET' ? 'Ioc' : order.order_type === 'MAKER' ? 'Alo' : 'Gtc';\n return {\n assetInfo,\n orderParams: {\n a: assetInfo.assetId,\n b: isBuy,\n p: `${price}`,\n s: `${order.volume}`,\n r: reduceOnly,\n t: { limit: { tif } },\n },\n };\n};\n\nexport const getMidPriceWithSlippage = async (coin: string, isBuy: boolean) => {\n const mids = (await midPriceCache.query('mids'))!;\n const mid = mids.get(coin)!;\n const slippage = isBuy ? 1.05 : 0.95;\n return mid * slippage;\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IOrder } from '@yuants/data-order';\nimport { decodePath } from '@yuants/utils';\nimport { getAllMids, getPerpetualsMetaData, getSpotMetaData } from '../api/public-api';\n\nconst enum InstrumentType {\n PERPETUAL = 'PERPETUAL',\n SPOT = 'SPOT',\n}\n\ntype AssetInfo = { assetId: number; szDecimals: number; instType: InstrumentType; baseCurrency: string };\n\nexport const parseProductPath = (product_id: string): { instType: InstrumentType; baseCurrency: string } => {\n const [exchange, instType, symbol] = decodePath(product_id);\n if (exchange !== 'HYPERLIQUID' || !instType || !symbol) {\n throw new Error(`Invalid product_id: ${product_id}`);\n }\n if (instType !== InstrumentType.PERPETUAL && instType !== InstrumentType.SPOT) {\n throw new Error(`Unsupported instrument type: ${instType}`);\n }\n const baseCurrency = symbol.split('-')[0];\n return { instType, baseCurrency };\n};\n\nconst CACHE_TTL = 60_000;\nconst MID_TTL = 5_000;\n\n// Create caches using createCache utility\nconst perpMetaCache = createCache<Map<string, { assetId: number; szDecimals: number }>>(\n async () => {\n console.info(`[Hyperliquid] Refreshing perpetual metadata cache`);\n const meta = await getPerpetualsMetaData();\n const map = new Map<string, { assetId: number; szDecimals: number }>();\n meta.universe.forEach((token, index) =>\n map.set(token.name, { assetId: index, szDecimals: token.szDecimals }),\n );\n return map;\n },\n { expire: CACHE_TTL },\n);\n\nconst spotMetaCache = createCache<Map<string, { assetId: number; szDecimals: number }>>(\n async () => {\n console.info(`[Hyperliquid] Refreshing spot metadata cache`);\n const meta = await getSpotMetaData();\n const map = new Map<string, { assetId: number; szDecimals: number }>();\n meta.tokens.forEach((token) =>\n map.set(token.name, { assetId: token.index, szDecimals: token.szDecimals }),\n );\n return map;\n },\n { expire: CACHE_TTL },\n);\n\nconst midPriceCache = createCache<Map<string, number>>(\n async () => {\n console.info(`[Hyperliquid] Refreshing mid price cache`);\n const mids = await getAllMids();\n const map = new Map<string, number>();\n for (const [coin, price] of Object.entries(mids ?? {})) {\n const value = Number(price);\n if (Number.isFinite(value)) {\n map.set(coin, value);\n }\n }\n return map;\n },\n { expire: MID_TTL },\n);\n\nexport const resolveAssetInfo = async (product_id: string): Promise<AssetInfo> => {\n const { instType, baseCurrency } = parseProductPath(product_id);\n if (instType === InstrumentType.PERPETUAL) {\n const map = (await perpMetaCache.query('perp'))!;\n const info = map.get(baseCurrency)!;\n return { ...info, instType: InstrumentType.PERPETUAL, baseCurrency };\n }\n if (instType === InstrumentType.SPOT) {\n const map = (await spotMetaCache.query('spot'))!;\n const info = map.get(baseCurrency)!;\n return { ...info, instType: InstrumentType.SPOT, baseCurrency };\n }\n throw new Error(`Unsupported instrument type: ${instType}`);\n};\n\nexport const roundPrice = (price: number, instType: 'PERPETUAL' | 'SPOT', szDecimals: number): string => {\n const MAX_DECIMALS = instType === 'PERPETUAL' ? 6 : 8;\n const maxDecimalPlaces = Math.max(0, MAX_DECIMALS - szDecimals);\n if (!Number.isFinite(price)) {\n throw new Error(`Invalid price: ${price}`);\n }\n\n // Handle significant figures (max 5)\n const priceStr = price.toString();\n const significantFigures = priceStr.replace(/^0+\\.?0*/, '').replace(/\\./g, '').length;\n\n let roundedPrice = price;\n if (significantFigures > 5) {\n // Logic to round to 5 sig figs\n // This is complex to do perfectly with just numbers, but let's try to be safe\n const magnitude = Math.floor(Math.log10(Math.abs(price)));\n // We want 5 sig figs.\n // e.g. 123456 -> 123460 (mag 5, round to 10^(5-4)=10^1)\n // e.g. 0.00123456 -> 0.0012346 (mag -3, round to 10^(-3-4)=10^-7)\n const factor = Math.pow(10, magnitude - 4);\n roundedPrice = Math.round(price / factor) * factor;\n }\n\n // Now format to maxDecimalPlaces without scientific notation\n // Use toFixed which returns fixed point notation\n let s = roundedPrice.toFixed(maxDecimalPlaces);\n // Remove trailing zeros and decimal point if integer\n if (s.includes('.')) {\n s = s.replace(/\\.?0+$/, '');\n }\n return s;\n};\n\nconst resolvePrice = async (\n order: IOrder,\n instType: 'PERPETUAL' | 'SPOT',\n szDecimals: number,\n baseCurrency: string,\n) => {\n if (order.order_type === 'MARKET') {\n const mid = await getMidPriceWithSlippage(\n baseCurrency,\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT',\n );\n return roundPrice(mid, instType, szDecimals);\n }\n if (!order.price) {\n throw new Error('price is required for non-market orders');\n }\n return roundPrice(+order.price, instType, szDecimals);\n};\n\nexport const buildOrderPayload = async (order: IOrder) => {\n const assetInfo = await resolveAssetInfo(order.product_id);\n const isBuy = order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT';\n const reduceOnly = order.order_direction === 'CLOSE_LONG' || order.order_direction === 'CLOSE_SHORT';\n const price = await resolvePrice(order, assetInfo.instType, assetInfo.szDecimals, assetInfo.baseCurrency);\n const tif = order.order_type === 'MARKET' ? 'Ioc' : order.order_type === 'MAKER' ? 'Alo' : 'Gtc';\n return {\n assetInfo,\n orderParams: {\n a: assetInfo.assetId,\n b: isBuy,\n p: `${price}`,\n s: `${order.volume}`,\n r: reduceOnly,\n t: { limit: { tif } },\n },\n };\n};\n\nexport const getMidPriceWithSlippage = async (coin: string, isBuy: boolean) => {\n const mids = (await midPriceCache.query('mids'))!;\n const mid = mids.get(coin)!;\n const slippage = isBuy ? 1.05 : 0.95;\n return mid * slippage;\n};\n"]}
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.30.1"
8
+ "packageVersion": "7.55.2"
9
9
  }
10
10
  ]
11
11
  }
package/package.json CHANGED
@@ -1,49 +1,49 @@
1
1
  {
2
- "name": "@yuants/vendor-hyperliquid",
3
- "version": "0.9.8",
4
- "main": "lib/index.js",
5
- "files": [
6
- "dist",
7
- "lib",
8
- "temp"
9
- ],
10
- "dependencies": {
11
- "@yuants/cache": "0.3.11",
12
- "@yuants/protocol": "0.54.0",
13
- "@yuants/transfer": "0.2.47",
14
- "@yuants/data-account": "0.11.7",
15
- "@yuants/utils": "0.19.3",
16
- "@yuants/sql": "0.9.38",
17
- "@yuants/data-product": "0.5.8",
18
- "@yuants/data-interest-rate": "0.2.6",
19
- "@yuants/data-order": "0.7.8",
20
- "@yuants/data-series": "0.3.60",
21
- "@yuants/data-quote": "0.4.7",
22
- "@yuants/exchange": "0.8.9",
23
- "rxjs": "~7.5.6",
24
- "hyperliquid": "~1.6.2",
25
- "ethers": "~6.13.5",
26
- "@msgpack/msgpack": "~3.1.2",
27
- "@yuants/data-ohlc": "0.6.3"
28
- },
29
- "devDependencies": {
30
- "@microsoft/api-extractor": "~7.30.0",
31
- "@rushstack/heft": "~0.47.5",
32
- "@rushstack/heft-jest-plugin": "~0.16.8",
33
- "@rushstack/heft-node-rig": "~1.10.7",
34
- "@types/heft-jest": "1.0.3",
35
- "@types/node": "22",
36
- "@yuants/extension": "0.2.39",
37
- "@yuants/tool-kit": "0.2.1",
38
- "typescript": "~4.7.4",
39
- "ts-node": "~10.9.2"
40
- },
41
- "publishConfig": {
42
- "registry": "https://registry.npmjs.org",
43
- "access": "public"
44
- },
45
- "scripts": {
46
- "dev": "ts-node src/index.ts",
47
- "build": "heft test --clean && api-extractor run --local && yuan-toolkit post-build"
48
- }
49
- }
2
+ "name": "@yuants/vendor-hyperliquid",
3
+ "version": "0.9.10",
4
+ "main": "lib/index.js",
5
+ "files": [
6
+ "dist",
7
+ "lib",
8
+ "temp"
9
+ ],
10
+ "dependencies": {
11
+ "rxjs": "~7.5.6",
12
+ "hyperliquid": "~1.6.2",
13
+ "ethers": "~6.13.5",
14
+ "@msgpack/msgpack": "~3.1.2",
15
+ "@yuants/protocol": "0.54.1",
16
+ "@yuants/transfer": "0.2.48",
17
+ "@yuants/cache": "0.3.12",
18
+ "@yuants/data-account": "0.11.8",
19
+ "@yuants/utils": "0.19.4",
20
+ "@yuants/sql": "0.9.39",
21
+ "@yuants/data-product": "0.5.9",
22
+ "@yuants/data-interest-rate": "0.2.8",
23
+ "@yuants/data-order": "0.7.9",
24
+ "@yuants/data-quote": "0.4.8",
25
+ "@yuants/data-series": "0.3.61",
26
+ "@yuants/exchange": "0.8.11",
27
+ "@yuants/data-ohlc": "0.6.4"
28
+ },
29
+ "devDependencies": {
30
+ "@microsoft/api-extractor": "~7.55.2",
31
+ "@rushstack/heft": "~1.1.7",
32
+ "@rushstack/heft-jest-plugin": "~1.1.7",
33
+ "@rushstack/heft-node-rig": "~2.11.12",
34
+ "@types/heft-jest": "1.0.6",
35
+ "@types/node": "24",
36
+ "typescript": "~5.9.3",
37
+ "ts-node": "~10.9.2",
38
+ "@yuants/extension": "0.2.40",
39
+ "@yuants/tool-kit": "0.2.2"
40
+ },
41
+ "publishConfig": {
42
+ "registry": "https://registry.npmjs.org",
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "dev": "ts-node src/index.ts",
47
+ "build": "heft test --clean && api-extractor run --local --config ./config/api-extractor.json && yuan-toolkit post-build"
48
+ }
49
+ }