@lifi/perps-sdk-provider-hyperliquid 0.0.0-preview-c903f1e
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.
- package/LICENSE +201 -0
- package/README.md +29 -0
- package/dist/cjs/HyperliquidProvider.d.ts +15 -0
- package/dist/cjs/HyperliquidProvider.d.ts.map +1 -0
- package/dist/cjs/HyperliquidProvider.js +135 -0
- package/dist/cjs/HyperliquidProvider.js.map +1 -0
- package/dist/cjs/accountConfig.d.ts +3 -0
- package/dist/cjs/accountConfig.d.ts.map +1 -0
- package/dist/cjs/accountConfig.js +45 -0
- package/dist/cjs/accountConfig.js.map +1 -0
- package/dist/cjs/accountSummary.d.ts +3 -0
- package/dist/cjs/accountSummary.d.ts.map +1 -0
- package/dist/cjs/accountSummary.js +12 -0
- package/dist/cjs/accountSummary.js.map +1 -0
- package/dist/cjs/constants.d.ts +11 -0
- package/dist/cjs/constants.d.ts.map +1 -0
- package/dist/cjs/constants.js +16 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/context.d.ts +13 -0
- package/dist/cjs/context.d.ts.map +1 -0
- package/dist/cjs/context.js +24 -0
- package/dist/cjs/context.js.map +1 -0
- package/dist/cjs/index.d.ts +22 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +47 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/services/getAccount.d.ts +6 -0
- package/dist/cjs/services/getAccount.d.ts.map +1 -0
- package/dist/cjs/services/getAccount.js +109 -0
- package/dist/cjs/services/getAccount.js.map +1 -0
- package/dist/cjs/services/getActivity.d.ts +15 -0
- package/dist/cjs/services/getActivity.d.ts.map +1 -0
- package/dist/cjs/services/getActivity.js +65 -0
- package/dist/cjs/services/getActivity.js.map +1 -0
- package/dist/cjs/services/getFills.d.ts +13 -0
- package/dist/cjs/services/getFills.d.ts.map +1 -0
- package/dist/cjs/services/getFills.js +40 -0
- package/dist/cjs/services/getFills.js.map +1 -0
- package/dist/cjs/services/getOrder.d.ts +6 -0
- package/dist/cjs/services/getOrder.d.ts.map +1 -0
- package/dist/cjs/services/getOrder.js +27 -0
- package/dist/cjs/services/getOrder.js.map +1 -0
- package/dist/cjs/services/getOrders.d.ts +11 -0
- package/dist/cjs/services/getOrders.d.ts.map +1 -0
- package/dist/cjs/services/getOrders.js +51 -0
- package/dist/cjs/services/getOrders.js.map +1 -0
- package/dist/cjs/services/getPositions.d.ts +11 -0
- package/dist/cjs/services/getPositions.d.ts.map +1 -0
- package/dist/cjs/services/getPositions.js +33 -0
- package/dist/cjs/services/getPositions.js.map +1 -0
- package/dist/cjs/signers/HyperliquidAgentStore.d.ts +19 -0
- package/dist/cjs/signers/HyperliquidAgentStore.d.ts.map +1 -0
- package/dist/cjs/signers/HyperliquidAgentStore.js +110 -0
- package/dist/cjs/signers/HyperliquidAgentStore.js.map +1 -0
- package/dist/cjs/signers/index.d.ts +4 -0
- package/dist/cjs/signers/index.d.ts.map +1 -0
- package/dist/cjs/signers/index.js +8 -0
- package/dist/cjs/signers/index.js.map +1 -0
- package/dist/cjs/signers/signActions.d.ts +7 -0
- package/dist/cjs/signers/signActions.d.ts.map +1 -0
- package/dist/cjs/signers/signActions.js +33 -0
- package/dist/cjs/signers/signActions.js.map +1 -0
- package/dist/cjs/types/account.d.ts +51 -0
- package/dist/cjs/types/account.d.ts.map +1 -0
- package/dist/cjs/types/account.js +10 -0
- package/dist/cjs/types/account.js.map +1 -0
- package/dist/cjs/types/action.d.ts +51 -0
- package/dist/cjs/types/action.d.ts.map +1 -0
- package/dist/cjs/types/action.js +11 -0
- package/dist/cjs/types/action.js.map +1 -0
- package/dist/cjs/types/asset.d.ts +66 -0
- package/dist/cjs/types/asset.d.ts.map +1 -0
- package/dist/cjs/types/asset.js +3 -0
- package/dist/cjs/types/asset.js.map +1 -0
- package/dist/cjs/types/fill.d.ts +18 -0
- package/dist/cjs/types/fill.d.ts.map +1 -0
- package/dist/cjs/types/fill.js +3 -0
- package/dist/cjs/types/fill.js.map +1 -0
- package/dist/cjs/types/index.d.ts +8 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +24 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/ledger.d.ts +53 -0
- package/dist/cjs/types/ledger.d.ts.map +1 -0
- package/dist/cjs/types/ledger.js +8 -0
- package/dist/cjs/types/ledger.js.map +1 -0
- package/dist/cjs/types/order.d.ts +46 -0
- package/dist/cjs/types/order.d.ts.map +1 -0
- package/dist/cjs/types/order.js +3 -0
- package/dist/cjs/types/order.js.map +1 -0
- package/dist/cjs/types/ws.d.ts +36 -0
- package/dist/cjs/types/ws.d.ts.map +1 -0
- package/dist/cjs/types/ws.js +3 -0
- package/dist/cjs/types/ws.js.map +1 -0
- package/dist/cjs/utils/assetId.d.ts +4 -0
- package/dist/cjs/utils/assetId.d.ts.map +1 -0
- package/dist/cjs/utils/assetId.js +21 -0
- package/dist/cjs/utils/assetId.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +15 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +49 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/infoClient.d.ts +10 -0
- package/dist/cjs/utils/infoClient.d.ts.map +1 -0
- package/dist/cjs/utils/infoClient.js +58 -0
- package/dist/cjs/utils/infoClient.js.map +1 -0
- package/dist/cjs/utils/liquidation.d.ts +3 -0
- package/dist/cjs/utils/liquidation.d.ts.map +1 -0
- package/dist/cjs/utils/liquidation.js +24 -0
- package/dist/cjs/utils/liquidation.js.map +1 -0
- package/dist/cjs/utils/mapActivity.d.ts +5 -0
- package/dist/cjs/utils/mapActivity.d.ts.map +1 -0
- package/dist/cjs/utils/mapActivity.js +133 -0
- package/dist/cjs/utils/mapActivity.js.map +1 -0
- package/dist/cjs/utils/mapFill.d.ts +6 -0
- package/dist/cjs/utils/mapFill.d.ts.map +1 -0
- package/dist/cjs/utils/mapFill.js +33 -0
- package/dist/cjs/utils/mapFill.js.map +1 -0
- package/dist/cjs/utils/mapMarket.d.ts +4 -0
- package/dist/cjs/utils/mapMarket.d.ts.map +1 -0
- package/dist/cjs/utils/mapMarket.js +22 -0
- package/dist/cjs/utils/mapMarket.js.map +1 -0
- package/dist/cjs/utils/mapMarketPrice.d.ts +4 -0
- package/dist/cjs/utils/mapMarketPrice.d.ts.map +1 -0
- package/dist/cjs/utils/mapMarketPrice.js +22 -0
- package/dist/cjs/utils/mapMarketPrice.js.map +1 -0
- package/dist/cjs/utils/mapOrder.d.ts +12 -0
- package/dist/cjs/utils/mapOrder.d.ts.map +1 -0
- package/dist/cjs/utils/mapOrder.js +156 -0
- package/dist/cjs/utils/mapOrder.js.map +1 -0
- package/dist/cjs/utils/mapPosition.d.ts +5 -0
- package/dist/cjs/utils/mapPosition.d.ts.map +1 -0
- package/dist/cjs/utils/mapPosition.js +28 -0
- package/dist/cjs/utils/mapPosition.js.map +1 -0
- package/dist/cjs/utils/marketDisplay.d.ts +4 -0
- package/dist/cjs/utils/marketDisplay.d.ts.map +1 -0
- package/dist/cjs/utils/marketDisplay.js +23 -0
- package/dist/cjs/utils/marketDisplay.js.map +1 -0
- package/dist/cjs/utils/orderFormatting.d.ts +4 -0
- package/dist/cjs/utils/orderFormatting.d.ts.map +1 -0
- package/dist/cjs/utils/orderFormatting.js +30 -0
- package/dist/cjs/utils/orderFormatting.js.map +1 -0
- package/dist/cjs/utils/priceStepToAggregation.d.ts +5 -0
- package/dist/cjs/utils/priceStepToAggregation.d.ts.map +1 -0
- package/dist/cjs/utils/priceStepToAggregation.js +36 -0
- package/dist/cjs/utils/priceStepToAggregation.js.map +1 -0
- package/dist/cjs/utils/spotBalance.d.ts +6 -0
- package/dist/cjs/utils/spotBalance.d.ts.map +1 -0
- package/dist/cjs/utils/spotBalance.js +34 -0
- package/dist/cjs/utils/spotBalance.js.map +1 -0
- package/dist/cjs/websocket/HyperliquidWsProvider.d.ts +29 -0
- package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -0
- package/dist/cjs/websocket/HyperliquidWsProvider.js +359 -0
- package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -0
- package/dist/cjs/websocket/index.d.ts +2 -0
- package/dist/cjs/websocket/index.d.ts.map +1 -0
- package/dist/cjs/websocket/index.js +6 -0
- package/dist/cjs/websocket/index.js.map +1 -0
- package/dist/esm/HyperliquidProvider.d.ts +64 -0
- package/dist/esm/HyperliquidProvider.d.ts.map +1 -0
- package/dist/esm/HyperliquidProvider.js +162 -0
- package/dist/esm/HyperliquidProvider.js.map +1 -0
- package/dist/esm/accountConfig.d.ts +10 -0
- package/dist/esm/accountConfig.d.ts.map +1 -0
- package/dist/esm/accountConfig.js +65 -0
- package/dist/esm/accountConfig.js.map +1 -0
- package/dist/esm/accountSummary.d.ts +10 -0
- package/dist/esm/accountSummary.d.ts.map +1 -0
- package/dist/esm/accountSummary.js +22 -0
- package/dist/esm/accountSummary.js.map +1 -0
- package/dist/esm/constants.d.ts +40 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +42 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/context.d.ts +26 -0
- package/dist/esm/context.d.ts.map +1 -0
- package/dist/esm/context.js +25 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/index.d.ts +31 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/services/getAccount.d.ts +28 -0
- package/dist/esm/services/getAccount.d.ts.map +1 -0
- package/dist/esm/services/getAccount.js +134 -0
- package/dist/esm/services/getAccount.js.map +1 -0
- package/dist/esm/services/getActivity.d.ts +33 -0
- package/dist/esm/services/getActivity.d.ts.map +1 -0
- package/dist/esm/services/getActivity.js +75 -0
- package/dist/esm/services/getActivity.js.map +1 -0
- package/dist/esm/services/getFills.d.ts +34 -0
- package/dist/esm/services/getFills.d.ts.map +1 -0
- package/dist/esm/services/getFills.js +49 -0
- package/dist/esm/services/getFills.js.map +1 -0
- package/dist/esm/services/getOrder.d.ts +17 -0
- package/dist/esm/services/getOrder.d.ts.map +1 -0
- package/dist/esm/services/getOrder.js +29 -0
- package/dist/esm/services/getOrder.js.map +1 -0
- package/dist/esm/services/getOrders.d.ts +27 -0
- package/dist/esm/services/getOrders.d.ts.map +1 -0
- package/dist/esm/services/getOrders.js +57 -0
- package/dist/esm/services/getOrders.js.map +1 -0
- package/dist/esm/services/getPositions.d.ts +26 -0
- package/dist/esm/services/getPositions.d.ts.map +1 -0
- package/dist/esm/services/getPositions.js +37 -0
- package/dist/esm/services/getPositions.js.map +1 -0
- package/dist/esm/signers/HyperliquidAgentStore.d.ts +54 -0
- package/dist/esm/signers/HyperliquidAgentStore.d.ts.map +1 -0
- package/dist/esm/signers/HyperliquidAgentStore.js +134 -0
- package/dist/esm/signers/HyperliquidAgentStore.js.map +1 -0
- package/dist/esm/signers/index.d.ts +4 -0
- package/dist/esm/signers/index.d.ts.map +1 -0
- package/dist/esm/signers/index.js +4 -0
- package/dist/esm/signers/index.js.map +1 -0
- package/dist/esm/signers/signActions.d.ts +15 -0
- package/dist/esm/signers/signActions.d.ts.map +1 -0
- package/dist/esm/signers/signActions.js +38 -0
- package/dist/esm/signers/signActions.js.map +1 -0
- package/dist/esm/types/account.d.ts +64 -0
- package/dist/esm/types/account.d.ts.map +1 -0
- package/dist/esm/types/account.js +13 -0
- package/dist/esm/types/account.js.map +1 -0
- package/dist/esm/types/action.d.ts +61 -0
- package/dist/esm/types/action.d.ts.map +1 -0
- package/dist/esm/types/action.js +16 -0
- package/dist/esm/types/action.js.map +1 -0
- package/dist/esm/types/asset.d.ts +82 -0
- package/dist/esm/types/asset.d.ts.map +1 -0
- package/dist/esm/types/asset.js +3 -0
- package/dist/esm/types/asset.js.map +1 -0
- package/dist/esm/types/fill.d.ts +21 -0
- package/dist/esm/types/fill.d.ts.map +1 -0
- package/dist/esm/types/fill.js +3 -0
- package/dist/esm/types/fill.js.map +1 -0
- package/dist/esm/types/index.d.ts +8 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +11 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/ledger.d.ts +93 -0
- package/dist/esm/types/ledger.d.ts.map +1 -0
- package/dist/esm/types/ledger.js +16 -0
- package/dist/esm/types/ledger.js.map +1 -0
- package/dist/esm/types/order.d.ts +51 -0
- package/dist/esm/types/order.d.ts.map +1 -0
- package/dist/esm/types/order.js +3 -0
- package/dist/esm/types/order.js.map +1 -0
- package/dist/esm/types/ws.d.ts +43 -0
- package/dist/esm/types/ws.d.ts.map +1 -0
- package/dist/esm/types/ws.js +3 -0
- package/dist/esm/types/ws.js.map +1 -0
- package/dist/esm/utils/assetId.d.ts +20 -0
- package/dist/esm/utils/assetId.d.ts.map +1 -0
- package/dist/esm/utils/assetId.js +31 -0
- package/dist/esm/utils/assetId.js.map +1 -0
- package/dist/esm/utils/index.d.ts +15 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +17 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/infoClient.d.ts +28 -0
- package/dist/esm/utils/infoClient.d.ts.map +1 -0
- package/dist/esm/utils/infoClient.js +70 -0
- package/dist/esm/utils/infoClient.js.map +1 -0
- package/dist/esm/utils/liquidation.d.ts +48 -0
- package/dist/esm/utils/liquidation.d.ts.map +1 -0
- package/dist/esm/utils/liquidation.js +65 -0
- package/dist/esm/utils/liquidation.js.map +1 -0
- package/dist/esm/utils/mapActivity.d.ts +15 -0
- package/dist/esm/utils/mapActivity.d.ts.map +1 -0
- package/dist/esm/utils/mapActivity.js +148 -0
- package/dist/esm/utils/mapActivity.js.map +1 -0
- package/dist/esm/utils/mapFill.d.ts +11 -0
- package/dist/esm/utils/mapFill.d.ts.map +1 -0
- package/dist/esm/utils/mapFill.js +34 -0
- package/dist/esm/utils/mapFill.js.map +1 -0
- package/dist/esm/utils/mapMarket.d.ts +12 -0
- package/dist/esm/utils/mapMarket.d.ts.map +1 -0
- package/dist/esm/utils/mapMarket.js +27 -0
- package/dist/esm/utils/mapMarket.js.map +1 -0
- package/dist/esm/utils/mapMarketPrice.d.ts +10 -0
- package/dist/esm/utils/mapMarketPrice.d.ts.map +1 -0
- package/dist/esm/utils/mapMarketPrice.js +24 -0
- package/dist/esm/utils/mapMarketPrice.js.map +1 -0
- package/dist/esm/utils/mapOrder.d.ts +49 -0
- package/dist/esm/utils/mapOrder.d.ts.map +1 -0
- package/dist/esm/utils/mapOrder.js +182 -0
- package/dist/esm/utils/mapOrder.js.map +1 -0
- package/dist/esm/utils/mapPosition.d.ts +12 -0
- package/dist/esm/utils/mapPosition.d.ts.map +1 -0
- package/dist/esm/utils/mapPosition.js +30 -0
- package/dist/esm/utils/mapPosition.js.map +1 -0
- package/dist/esm/utils/marketDisplay.d.ts +17 -0
- package/dist/esm/utils/marketDisplay.d.ts.map +1 -0
- package/dist/esm/utils/marketDisplay.js +31 -0
- package/dist/esm/utils/marketDisplay.js.map +1 -0
- package/dist/esm/utils/orderFormatting.d.ts +50 -0
- package/dist/esm/utils/orderFormatting.d.ts.map +1 -0
- package/dist/esm/utils/orderFormatting.js +78 -0
- package/dist/esm/utils/orderFormatting.js.map +1 -0
- package/dist/esm/utils/priceStepToAggregation.d.ts +20 -0
- package/dist/esm/utils/priceStepToAggregation.d.ts.map +1 -0
- package/dist/esm/utils/priceStepToAggregation.js +51 -0
- package/dist/esm/utils/priceStepToAggregation.js.map +1 -0
- package/dist/esm/utils/spotBalance.d.ts +18 -0
- package/dist/esm/utils/spotBalance.d.ts.map +1 -0
- package/dist/esm/utils/spotBalance.js +40 -0
- package/dist/esm/utils/spotBalance.js.map +1 -0
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts +61 -0
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -0
- package/dist/esm/websocket/HyperliquidWsProvider.js +406 -0
- package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -0
- package/dist/esm/websocket/index.d.ts +2 -0
- package/dist/esm/websocket/index.d.ts.map +1 -0
- package/dist/esm/websocket/index.js +3 -0
- package/dist/esm/websocket/index.js.map +1 -0
- package/dist/types/HyperliquidProvider.d.ts +64 -0
- package/dist/types/HyperliquidProvider.d.ts.map +1 -0
- package/dist/types/accountConfig.d.ts +10 -0
- package/dist/types/accountConfig.d.ts.map +1 -0
- package/dist/types/accountSummary.d.ts +10 -0
- package/dist/types/accountSummary.d.ts.map +1 -0
- package/dist/types/constants.d.ts +40 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/context.d.ts +26 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/services/getAccount.d.ts +28 -0
- package/dist/types/services/getAccount.d.ts.map +1 -0
- package/dist/types/services/getActivity.d.ts +33 -0
- package/dist/types/services/getActivity.d.ts.map +1 -0
- package/dist/types/services/getFills.d.ts +34 -0
- package/dist/types/services/getFills.d.ts.map +1 -0
- package/dist/types/services/getOrder.d.ts +17 -0
- package/dist/types/services/getOrder.d.ts.map +1 -0
- package/dist/types/services/getOrders.d.ts +27 -0
- package/dist/types/services/getOrders.d.ts.map +1 -0
- package/dist/types/services/getPositions.d.ts +26 -0
- package/dist/types/services/getPositions.d.ts.map +1 -0
- package/dist/types/signers/HyperliquidAgentStore.d.ts +54 -0
- package/dist/types/signers/HyperliquidAgentStore.d.ts.map +1 -0
- package/dist/types/signers/index.d.ts +4 -0
- package/dist/types/signers/index.d.ts.map +1 -0
- package/dist/types/signers/signActions.d.ts +15 -0
- package/dist/types/signers/signActions.d.ts.map +1 -0
- package/dist/types/types/account.d.ts +64 -0
- package/dist/types/types/account.d.ts.map +1 -0
- package/dist/types/types/action.d.ts +61 -0
- package/dist/types/types/action.d.ts.map +1 -0
- package/dist/types/types/asset.d.ts +82 -0
- package/dist/types/types/asset.d.ts.map +1 -0
- package/dist/types/types/fill.d.ts +21 -0
- package/dist/types/types/fill.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +8 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/ledger.d.ts +93 -0
- package/dist/types/types/ledger.d.ts.map +1 -0
- package/dist/types/types/order.d.ts +51 -0
- package/dist/types/types/order.d.ts.map +1 -0
- package/dist/types/types/ws.d.ts +43 -0
- package/dist/types/types/ws.d.ts.map +1 -0
- package/dist/types/utils/assetId.d.ts +20 -0
- package/dist/types/utils/assetId.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +15 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/infoClient.d.ts +28 -0
- package/dist/types/utils/infoClient.d.ts.map +1 -0
- package/dist/types/utils/liquidation.d.ts +48 -0
- package/dist/types/utils/liquidation.d.ts.map +1 -0
- package/dist/types/utils/mapActivity.d.ts +15 -0
- package/dist/types/utils/mapActivity.d.ts.map +1 -0
- package/dist/types/utils/mapFill.d.ts +11 -0
- package/dist/types/utils/mapFill.d.ts.map +1 -0
- package/dist/types/utils/mapMarket.d.ts +12 -0
- package/dist/types/utils/mapMarket.d.ts.map +1 -0
- package/dist/types/utils/mapMarketPrice.d.ts +10 -0
- package/dist/types/utils/mapMarketPrice.d.ts.map +1 -0
- package/dist/types/utils/mapOrder.d.ts +49 -0
- package/dist/types/utils/mapOrder.d.ts.map +1 -0
- package/dist/types/utils/mapPosition.d.ts +12 -0
- package/dist/types/utils/mapPosition.d.ts.map +1 -0
- package/dist/types/utils/marketDisplay.d.ts +17 -0
- package/dist/types/utils/marketDisplay.d.ts.map +1 -0
- package/dist/types/utils/orderFormatting.d.ts +50 -0
- package/dist/types/utils/orderFormatting.d.ts.map +1 -0
- package/dist/types/utils/priceStepToAggregation.d.ts +20 -0
- package/dist/types/utils/priceStepToAggregation.d.ts.map +1 -0
- package/dist/types/utils/spotBalance.d.ts +18 -0
- package/dist/types/utils/spotBalance.d.ts.map +1 -0
- package/dist/types/websocket/HyperliquidWsProvider.d.ts +61 -0
- package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -0
- package/dist/types/websocket/index.d.ts +2 -0
- package/dist/types/websocket/index.d.ts.map +1 -0
- package/package.json +68 -0
- package/src/HyperliquidProvider.ts +381 -0
- package/src/accountConfig.ts +89 -0
- package/src/accountSummary.ts +32 -0
- package/src/constants.ts +47 -0
- package/src/context.ts +41 -0
- package/src/index.ts +45 -0
- package/src/services/getAccount.ts +263 -0
- package/src/services/getActivity.ts +162 -0
- package/src/services/getFills.ts +96 -0
- package/src/services/getOrder.ts +61 -0
- package/src/services/getOrders.ts +101 -0
- package/src/services/getPositions.ts +76 -0
- package/src/signers/HyperliquidAgentStore.ts +176 -0
- package/src/signers/index.ts +5 -0
- package/src/signers/signActions.ts +78 -0
- package/src/types/account.ts +74 -0
- package/src/types/action.ts +66 -0
- package/src/types/asset.ts +96 -0
- package/src/types/fill.ts +24 -0
- package/src/types/index.ts +11 -0
- package/src/types/ledger.ts +111 -0
- package/src/types/order.ts +56 -0
- package/src/types/ws.ts +47 -0
- package/src/utils/assetId.ts +38 -0
- package/src/utils/index.ts +38 -0
- package/src/utils/infoClient.ts +111 -0
- package/src/utils/liquidation.ts +74 -0
- package/src/utils/mapActivity.ts +182 -0
- package/src/utils/mapFill.ts +48 -0
- package/src/utils/mapMarket.ts +33 -0
- package/src/utils/mapMarketPrice.ts +33 -0
- package/src/utils/mapOrder.ts +218 -0
- package/src/utils/mapPosition.ts +40 -0
- package/src/utils/marketDisplay.ts +38 -0
- package/src/utils/orderFormatting.ts +93 -0
- package/src/utils/priceStepToAggregation.ts +58 -0
- package/src/utils/spotBalance.ts +51 -0
- package/src/websocket/HyperliquidWsProvider.ts +533 -0
- package/src/websocket/index.ts +3 -0
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMarketRegistry,
|
|
3
|
+
isActiveOrderStatus,
|
|
4
|
+
type MarketRegistry,
|
|
5
|
+
type PerpsSDKClient,
|
|
6
|
+
type ProviderGetQuoteParams,
|
|
7
|
+
type QuoteListener,
|
|
8
|
+
ReconnectingWebSocket,
|
|
9
|
+
resolveSubscribeQuote,
|
|
10
|
+
WsProviderBase,
|
|
11
|
+
type WsProviderFactory,
|
|
12
|
+
wsLog,
|
|
13
|
+
} from '@lifi/perps-sdk'
|
|
14
|
+
import {
|
|
15
|
+
type OpenOrder,
|
|
16
|
+
OrderSide,
|
|
17
|
+
OrderType,
|
|
18
|
+
type Subscription,
|
|
19
|
+
type TriggerOrder,
|
|
20
|
+
} from '@lifi/perps-types'
|
|
21
|
+
import { HYPERLIQUID_FEE_TIER_FALLBACK } from '../constants.js'
|
|
22
|
+
import type {
|
|
23
|
+
HlAssetPosition,
|
|
24
|
+
HlOrderDetail,
|
|
25
|
+
HlUserFill,
|
|
26
|
+
HlWsAllDexsClearinghouseStateData,
|
|
27
|
+
HlWsAllMidsData,
|
|
28
|
+
HlWsCandleData,
|
|
29
|
+
HlWsL2BookData,
|
|
30
|
+
HlWsMessage,
|
|
31
|
+
HlWsSpotStateData,
|
|
32
|
+
HlWsUserFillsData,
|
|
33
|
+
} from '../types/index.js'
|
|
34
|
+
import {
|
|
35
|
+
isOpenAssetPosition,
|
|
36
|
+
isTriggerOrder,
|
|
37
|
+
mapFill,
|
|
38
|
+
mapOrderStatus,
|
|
39
|
+
mapOrderType,
|
|
40
|
+
mapPosition,
|
|
41
|
+
priceStepToAggregation,
|
|
42
|
+
spotAssetFromToken,
|
|
43
|
+
spotBalance,
|
|
44
|
+
spotPriceById,
|
|
45
|
+
} from '../utils/index.js'
|
|
46
|
+
|
|
47
|
+
/** HL's `l2Book` returns at most this many levels per side (slow/default mode). */
|
|
48
|
+
const HL_L2_BOOK_MAX_LEVELS_PER_SIDE = 20
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* `WsProviderFactory` constructor for Hyperliquid — pass to
|
|
52
|
+
* `new PerpsWsClient(client, { wsProviders: { hyperliquid: hyperliquidWsProvider() } })`.
|
|
53
|
+
*
|
|
54
|
+
* Derives the active sub-DEX set from the `markets` list `PerpsWsClient`
|
|
55
|
+
* passes in (the provider's own key and `'spot'` are excluded — they
|
|
56
|
+
* aren't sub-DEX subscriptions on the HL wire). Higher-order shape mirrors
|
|
57
|
+
* `lighterWsProvider(options)` so the two factories register identically.
|
|
58
|
+
*
|
|
59
|
+
* @public
|
|
60
|
+
*/
|
|
61
|
+
export const hyperliquidWsProvider =
|
|
62
|
+
(): WsProviderFactory =>
|
|
63
|
+
({ provider, wsUrl, markets, client }) => {
|
|
64
|
+
const subDexes = markets.filter((m) => m !== provider && m !== 'spot')
|
|
65
|
+
return new HyperliquidWsProvider(wsUrl, provider, subDexes, client)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Hyperliquid realtime {@link WsProvider}: multiplexes prices, positions,
|
|
70
|
+
* orders, fills and spot balances over a single {@link ReconnectingWebSocket}.
|
|
71
|
+
* Construct via {@link hyperliquidWsProvider}.
|
|
72
|
+
*
|
|
73
|
+
* `orderUpdates` supports a single address per provider instance: HL delivers
|
|
74
|
+
* those frames without a user field, so frames from two concurrent address
|
|
75
|
+
* subscriptions on one socket cannot be attributed. Subscribing a second
|
|
76
|
+
* address rejects while the first still has listeners; once the first is
|
|
77
|
+
* released, an address switch reclaims the channel immediately.
|
|
78
|
+
*
|
|
79
|
+
* @public
|
|
80
|
+
*/
|
|
81
|
+
export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
82
|
+
private orderUpdatesKey: string | undefined
|
|
83
|
+
private readonly subDexes: string[]
|
|
84
|
+
private readonly client: PerpsSDKClient | undefined
|
|
85
|
+
private readonly registry: MarketRegistry | undefined
|
|
86
|
+
private midsBySubDex = new Map<string, Record<string, string>>()
|
|
87
|
+
|
|
88
|
+
constructor(
|
|
89
|
+
wsUrl: string,
|
|
90
|
+
providerKey: string,
|
|
91
|
+
subDexes: string[],
|
|
92
|
+
client?: PerpsSDKClient
|
|
93
|
+
) {
|
|
94
|
+
super(
|
|
95
|
+
new ReconnectingWebSocket(wsUrl, { pingPayload: '{"method":"ping"}' }),
|
|
96
|
+
providerKey
|
|
97
|
+
)
|
|
98
|
+
this.subDexes = subDexes
|
|
99
|
+
this.client = client
|
|
100
|
+
this.registry = client && getMarketRegistry(client, providerKey)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async subscribeQuote(
|
|
104
|
+
params: ProviderGetQuoteParams,
|
|
105
|
+
onQuote: QuoteListener
|
|
106
|
+
): Promise<() => void> {
|
|
107
|
+
const client = this.client
|
|
108
|
+
if (client === undefined) {
|
|
109
|
+
throw new Error(
|
|
110
|
+
'HyperliquidWsProvider: PerpsSDKClient not provided; cannot stream quotes. ' +
|
|
111
|
+
'Construct via `hyperliquidWsProvider()` and register with PerpsWsClient.'
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
return resolveSubscribeQuote(
|
|
115
|
+
client,
|
|
116
|
+
this.providerKey,
|
|
117
|
+
this,
|
|
118
|
+
params,
|
|
119
|
+
HYPERLIQUID_FEE_TIER_FALLBACK,
|
|
120
|
+
onQuote
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
protected async openChannel(sub: Subscription): Promise<() => void> {
|
|
125
|
+
// Must run synchronously, before any await, so two concurrent opens
|
|
126
|
+
// cannot both pass the exclusivity check.
|
|
127
|
+
if (sub.channel === 'orderUpdates') {
|
|
128
|
+
this.claimOrderUpdatesKey(this.toKey(sub))
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
await this.registry?.sync()
|
|
132
|
+
|
|
133
|
+
// Prices require multi-sub-dex allMids subscriptions under one logical key.
|
|
134
|
+
if (sub.channel === 'prices') {
|
|
135
|
+
const entries = this.getPriceSubEntries()
|
|
136
|
+
|
|
137
|
+
for (const { subKey, payload } of entries) {
|
|
138
|
+
await this.registerSub(subKey, payload)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
await this.rws.ready()
|
|
142
|
+
|
|
143
|
+
return () => {
|
|
144
|
+
for (const { subKey, payload } of entries) {
|
|
145
|
+
this.unregisterSub(subKey)
|
|
146
|
+
this.rws.send(
|
|
147
|
+
JSON.stringify({ method: 'unsubscribe', subscription: payload })
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
this.midsBySubDex.clear()
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// All other channels: single WS subscription per key
|
|
155
|
+
const key = this.toKey(sub)
|
|
156
|
+
const payload = this.toHlPayload(sub)
|
|
157
|
+
await this.registerSub(key, payload)
|
|
158
|
+
|
|
159
|
+
await this.rws.ready()
|
|
160
|
+
|
|
161
|
+
return () => {
|
|
162
|
+
this.unregisterSub(key)
|
|
163
|
+
if (this.orderUpdatesKey === key) {
|
|
164
|
+
this.orderUpdatesKey = undefined
|
|
165
|
+
}
|
|
166
|
+
this.rws.send(
|
|
167
|
+
JSON.stringify({ method: 'unsubscribe', subscription: payload })
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Enforce the single-address `orderUpdates` invariant (HL frames carry no
|
|
174
|
+
* user field, so concurrent address subscriptions are unattributable). A
|
|
175
|
+
* listener-free lingering channel for another address is torn down eagerly
|
|
176
|
+
* so a wallet switch needn't wait out the teardown linger; a live one throws.
|
|
177
|
+
*/
|
|
178
|
+
private claimOrderUpdatesKey(key: string): void {
|
|
179
|
+
const active = this.orderUpdatesKey
|
|
180
|
+
if (
|
|
181
|
+
active !== undefined &&
|
|
182
|
+
active !== key &&
|
|
183
|
+
!this.closeChannelIfIdle(active)
|
|
184
|
+
) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
`Hyperliquid supports one orderUpdates address per provider instance ` +
|
|
187
|
+
`(frames carry no user field). Unsubscribe ` +
|
|
188
|
+
`${active.slice('orderUpdates:'.length)} before subscribing ` +
|
|
189
|
+
`${key.slice('orderUpdates:'.length)}.`
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
this.orderUpdatesKey = key
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** Build sub-key + payload pairs for each sub-dex allMids subscription. */
|
|
196
|
+
private getPriceSubEntries(): Array<{ subKey: string; payload: object }> {
|
|
197
|
+
return [
|
|
198
|
+
{
|
|
199
|
+
subKey: 'allMids:default',
|
|
200
|
+
payload: { type: 'allMids' },
|
|
201
|
+
},
|
|
202
|
+
...this.subDexes.map((dex) => ({
|
|
203
|
+
subKey: `allMids:${dex}`,
|
|
204
|
+
payload: { type: 'allMids', dex },
|
|
205
|
+
})),
|
|
206
|
+
]
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
protected override onClose(): void {
|
|
210
|
+
this.midsBySubDex.clear()
|
|
211
|
+
this.orderUpdatesKey = undefined
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
protected sendSubscribe(payload: object): void {
|
|
215
|
+
this.rws.send(
|
|
216
|
+
JSON.stringify({ method: 'subscribe', subscription: payload })
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
protected toKey(sub: Subscription): string {
|
|
221
|
+
switch (sub.channel) {
|
|
222
|
+
case 'prices':
|
|
223
|
+
return 'allMids'
|
|
224
|
+
case 'orderbook':
|
|
225
|
+
return `l2Book:${sub.marketId}`
|
|
226
|
+
case 'candle':
|
|
227
|
+
return `candle:${sub.marketId}:${sub.interval}`
|
|
228
|
+
case 'orderUpdates':
|
|
229
|
+
return `orderUpdates:${sub.address.toLowerCase()}`
|
|
230
|
+
case 'fills':
|
|
231
|
+
return `userFills:${sub.address.toLowerCase()}`
|
|
232
|
+
case 'positions':
|
|
233
|
+
return `positions:${sub.address.toLowerCase()}`
|
|
234
|
+
case 'spotBalances':
|
|
235
|
+
return `spotState:${sub.address.toLowerCase()}`
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private toHlPayload(sub: Subscription): object {
|
|
240
|
+
switch (sub.channel) {
|
|
241
|
+
case 'prices':
|
|
242
|
+
// Prices are handled via getPriceSubEntries in subscribe()
|
|
243
|
+
// and never reach toHlPayload, but TS requires exhaustive cases.
|
|
244
|
+
return { type: 'allMids' }
|
|
245
|
+
case 'orderbook':
|
|
246
|
+
return {
|
|
247
|
+
type: 'l2Book',
|
|
248
|
+
coin: sub.marketId,
|
|
249
|
+
// HL's l2Book ignores any level-count field; it returns up to 20
|
|
250
|
+
// levels/side and controls granularity via nSigFigs (+ mantissa,
|
|
251
|
+
// valid only when nSigFigs === 5).
|
|
252
|
+
...(sub.priceStep !== undefined
|
|
253
|
+
? priceStepToAggregation(
|
|
254
|
+
sub.priceStep,
|
|
255
|
+
this.mergedMids().get(sub.marketId) ?? Number.NaN
|
|
256
|
+
)
|
|
257
|
+
: {}),
|
|
258
|
+
}
|
|
259
|
+
case 'candle':
|
|
260
|
+
return {
|
|
261
|
+
type: 'candle',
|
|
262
|
+
coin: sub.marketId,
|
|
263
|
+
interval: sub.interval,
|
|
264
|
+
}
|
|
265
|
+
case 'orderUpdates':
|
|
266
|
+
return { type: 'orderUpdates', user: sub.address }
|
|
267
|
+
case 'fills':
|
|
268
|
+
return { type: 'userFills', user: sub.address }
|
|
269
|
+
case 'positions':
|
|
270
|
+
return { type: 'allDexsClearinghouseState', user: sub.address }
|
|
271
|
+
case 'spotBalances':
|
|
272
|
+
return { type: 'spotState', user: sub.address }
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
protected handleMessage(raw: string) {
|
|
277
|
+
let msg: HlWsMessage
|
|
278
|
+
try {
|
|
279
|
+
msg = JSON.parse(raw)
|
|
280
|
+
} catch {
|
|
281
|
+
wsLog.parseFailure(this.providerKey, raw)
|
|
282
|
+
return
|
|
283
|
+
}
|
|
284
|
+
if (
|
|
285
|
+
!msg.channel ||
|
|
286
|
+
msg.channel === 'pong' ||
|
|
287
|
+
msg.channel === 'subscriptionResponse'
|
|
288
|
+
) {
|
|
289
|
+
return
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (msg.channel === 'error') {
|
|
293
|
+
wsLog.serverError(this.providerKey, String(msg.data))
|
|
294
|
+
return
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (!isValidHlFrame(msg.channel, msg.data)) {
|
|
298
|
+
wsLog.parseFailure(this.providerKey, raw)
|
|
299
|
+
return
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
try {
|
|
303
|
+
switch (msg.channel) {
|
|
304
|
+
case 'allMids':
|
|
305
|
+
this.handleAllMids(msg.data as HlWsAllMidsData)
|
|
306
|
+
break
|
|
307
|
+
case 'l2Book':
|
|
308
|
+
this.handleL2Book(msg.data as HlWsL2BookData)
|
|
309
|
+
break
|
|
310
|
+
case 'candle':
|
|
311
|
+
this.handleCandle(msg.data as HlWsCandleData)
|
|
312
|
+
break
|
|
313
|
+
case 'orderUpdates':
|
|
314
|
+
this.handleOrderUpdates(msg.data as HlOrderDetail[])
|
|
315
|
+
break
|
|
316
|
+
case 'userFills':
|
|
317
|
+
this.handleUserFills(msg.data as HlWsUserFillsData)
|
|
318
|
+
break
|
|
319
|
+
case 'allDexsClearinghouseState':
|
|
320
|
+
this.handleAllDexsClearinghouseState(
|
|
321
|
+
msg.data as HlWsAllDexsClearinghouseStateData
|
|
322
|
+
)
|
|
323
|
+
break
|
|
324
|
+
case 'spotState':
|
|
325
|
+
this.handleSpotState(msg.data as HlWsSpotStateData)
|
|
326
|
+
break
|
|
327
|
+
}
|
|
328
|
+
} catch (error) {
|
|
329
|
+
wsLog.handlerFailure(this.providerKey, error)
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
private handleAllMids(data: HlWsAllMidsData) {
|
|
334
|
+
const subDexKey = data.dex || 'default'
|
|
335
|
+
this.midsBySubDex.set(subDexKey, data.mids)
|
|
336
|
+
|
|
337
|
+
const merged: Record<string, string> = {}
|
|
338
|
+
for (const mids of this.midsBySubDex.values()) {
|
|
339
|
+
Object.assign(merged, mids)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
this.emit('allMids', { channel: 'prices', data: merged })
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/** Latest mid per `Market.id`, merged across sub-dex allMids frames. */
|
|
346
|
+
private mergedMids(): Map<string, number> {
|
|
347
|
+
const map = new Map<string, number>()
|
|
348
|
+
for (const mids of this.midsBySubDex.values()) {
|
|
349
|
+
for (const [id, mid] of Object.entries(mids)) {
|
|
350
|
+
map.set(id, Number(mid))
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return map
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
private handleL2Book(data: HlWsL2BookData) {
|
|
357
|
+
this.emit(`l2Book:${data.coin}`, {
|
|
358
|
+
channel: 'orderbook',
|
|
359
|
+
data: {
|
|
360
|
+
provider: this.providerKey,
|
|
361
|
+
marketId: data.coin,
|
|
362
|
+
bids: data.levels[0]
|
|
363
|
+
.slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE)
|
|
364
|
+
.map((l) => ({ price: l.px, size: l.sz })),
|
|
365
|
+
asks: data.levels[1]
|
|
366
|
+
.slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE)
|
|
367
|
+
.map((l) => ({ price: l.px, size: l.sz })),
|
|
368
|
+
timestamp: data.time,
|
|
369
|
+
},
|
|
370
|
+
})
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private handleCandle(data: HlWsCandleData) {
|
|
374
|
+
this.emit(`candle:${data.s}:${data.i}`, {
|
|
375
|
+
channel: 'candle',
|
|
376
|
+
data: {
|
|
377
|
+
t: data.t,
|
|
378
|
+
o: data.o,
|
|
379
|
+
h: data.h,
|
|
380
|
+
l: data.l,
|
|
381
|
+
c: data.c,
|
|
382
|
+
v: data.v,
|
|
383
|
+
},
|
|
384
|
+
})
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
private handleOrderUpdates(data: HlOrderDetail[]) {
|
|
388
|
+
// Untagged frame: attributable only via the single-address invariant.
|
|
389
|
+
const key = this.orderUpdatesKey
|
|
390
|
+
if (key === undefined) {
|
|
391
|
+
return
|
|
392
|
+
}
|
|
393
|
+
const openOrders: OpenOrder[] = []
|
|
394
|
+
const triggerOrders: TriggerOrder[] = []
|
|
395
|
+
const terminated: string[] = []
|
|
396
|
+
for (const detail of data) {
|
|
397
|
+
const o = detail.order
|
|
398
|
+
const orderId = String(o.oid)
|
|
399
|
+
if (!isActiveOrderStatus(mapOrderStatus(detail.status))) {
|
|
400
|
+
terminated.push(orderId)
|
|
401
|
+
continue
|
|
402
|
+
}
|
|
403
|
+
const type = mapOrderType(o.orderType)
|
|
404
|
+
// A miss warns once and schedules a cooldown-gated registry refetch
|
|
405
|
+
// (the id may have listed after the snapshot); skip just this item.
|
|
406
|
+
const market = this.registry?.get(o.coin)
|
|
407
|
+
if (!market) {
|
|
408
|
+
continue
|
|
409
|
+
}
|
|
410
|
+
const createdAt = new Date(o.timestamp).toISOString()
|
|
411
|
+
if (isTriggerOrder(o)) {
|
|
412
|
+
const isLimit =
|
|
413
|
+
type === OrderType.TAKE_PROFIT_LIMIT || type === OrderType.STOP_LIMIT
|
|
414
|
+
triggerOrders.push({
|
|
415
|
+
orderId,
|
|
416
|
+
market,
|
|
417
|
+
type,
|
|
418
|
+
size: o.sz,
|
|
419
|
+
triggerPrice: o.triggerPx ?? '0',
|
|
420
|
+
...(isLimit ? { limitPrice: o.limitPx } : {}),
|
|
421
|
+
label: o.triggerCondition,
|
|
422
|
+
createdAt,
|
|
423
|
+
})
|
|
424
|
+
} else {
|
|
425
|
+
const filled = parseFloat(o.origSz) - parseFloat(o.sz)
|
|
426
|
+
openOrders.push({
|
|
427
|
+
orderId,
|
|
428
|
+
market,
|
|
429
|
+
side: o.side === 'B' ? OrderSide.BUY : OrderSide.SELL,
|
|
430
|
+
type,
|
|
431
|
+
size: o.sz,
|
|
432
|
+
price: o.limitPx,
|
|
433
|
+
filledSize: filled.toString(),
|
|
434
|
+
reduceOnly: o.reduceOnly ?? false,
|
|
435
|
+
createdAt,
|
|
436
|
+
})
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
this.emit(key, {
|
|
440
|
+
channel: 'orderUpdates',
|
|
441
|
+
data: { openOrders, triggerOrders, terminated },
|
|
442
|
+
})
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
private handleUserFills(data: HlWsUserFillsData) {
|
|
446
|
+
const items = data.fills.flatMap((f) => {
|
|
447
|
+
const market = this.registry?.get(f.coin)
|
|
448
|
+
return market ? [mapFill(f as HlUserFill, market)] : []
|
|
449
|
+
})
|
|
450
|
+
this.emit(`userFills:${data.user.toLowerCase()}`, {
|
|
451
|
+
channel: 'fills',
|
|
452
|
+
data: items,
|
|
453
|
+
})
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
private handleAllDexsClearinghouseState(
|
|
457
|
+
data: HlWsAllDexsClearinghouseStateData
|
|
458
|
+
) {
|
|
459
|
+
const positions = data.clearinghouseStates.flatMap(([, state]) =>
|
|
460
|
+
state.assetPositions.flatMap((ap) => {
|
|
461
|
+
if (!isOpenAssetPosition(ap as HlAssetPosition)) {
|
|
462
|
+
return []
|
|
463
|
+
}
|
|
464
|
+
const market = this.registry?.get(ap.position.coin)
|
|
465
|
+
return market ? [mapPosition(ap as HlAssetPosition, market)] : []
|
|
466
|
+
})
|
|
467
|
+
)
|
|
468
|
+
this.emit(`positions:${data.user.toLowerCase()}`, {
|
|
469
|
+
channel: 'positions',
|
|
470
|
+
data: positions,
|
|
471
|
+
})
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
private handleSpotState(data: HlWsSpotStateData) {
|
|
475
|
+
const priceById = spotPriceById(
|
|
476
|
+
this.registry?.markets ?? [],
|
|
477
|
+
this.mergedMids()
|
|
478
|
+
)
|
|
479
|
+
this.emit(`spotState:${data.user.toLowerCase()}`, {
|
|
480
|
+
channel: 'spotBalances',
|
|
481
|
+
data: data.spotState.balances.map((b) => ({
|
|
482
|
+
...spotBalance(spotAssetFromToken(b), b.total, priceById),
|
|
483
|
+
locked: b.hold,
|
|
484
|
+
})),
|
|
485
|
+
})
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
const isObject = (v: unknown): v is Record<string, unknown> =>
|
|
490
|
+
typeof v === 'object' && v !== null
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Minimal presence/type check of the channel-discriminating and required
|
|
494
|
+
* fields the matching handler dereferences without its own guard. A frame
|
|
495
|
+
* that parses but fails this is a bad frame (log + skip), distinct from a
|
|
496
|
+
* handler that throws on otherwise-shaped data. Unknown channels pass through
|
|
497
|
+
* to the dispatch switch, which silently ignores them.
|
|
498
|
+
*/
|
|
499
|
+
function isValidHlFrame(channel: string, data: unknown): boolean {
|
|
500
|
+
if (!isObject(data)) {
|
|
501
|
+
return false
|
|
502
|
+
}
|
|
503
|
+
switch (channel) {
|
|
504
|
+
case 'allMids':
|
|
505
|
+
return isObject(data.mids)
|
|
506
|
+
case 'l2Book':
|
|
507
|
+
return (
|
|
508
|
+
typeof data.coin === 'string' &&
|
|
509
|
+
Array.isArray(data.levels) &&
|
|
510
|
+
Array.isArray(data.levels[0]) &&
|
|
511
|
+
Array.isArray(data.levels[1]) &&
|
|
512
|
+
typeof data.time === 'number'
|
|
513
|
+
)
|
|
514
|
+
case 'candle':
|
|
515
|
+
return typeof data.s === 'string' && typeof data.i === 'string'
|
|
516
|
+
case 'orderUpdates':
|
|
517
|
+
return Array.isArray(data)
|
|
518
|
+
case 'userFills':
|
|
519
|
+
return typeof data.user === 'string' && Array.isArray(data.fills)
|
|
520
|
+
case 'allDexsClearinghouseState':
|
|
521
|
+
return (
|
|
522
|
+
typeof data.user === 'string' && Array.isArray(data.clearinghouseStates)
|
|
523
|
+
)
|
|
524
|
+
case 'spotState':
|
|
525
|
+
return (
|
|
526
|
+
typeof data.user === 'string' &&
|
|
527
|
+
isObject(data.spotState) &&
|
|
528
|
+
Array.isArray(data.spotState.balances)
|
|
529
|
+
)
|
|
530
|
+
default:
|
|
531
|
+
return true
|
|
532
|
+
}
|
|
533
|
+
}
|