@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
package/src/context.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { PerpsError, type PerpsSDKClient } from '@lifi/perps-sdk'
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Runtime context the Hyperliquid read services resolve their deps from: the
|
|
6
|
+
* bound {@link PerpsSDKClient} (config / fetch / retry / market lookups) and
|
|
7
|
+
* the resolved REST base URL. Captured once in the provider factory's closure
|
|
8
|
+
* via {@link HyperliquidContextRef.bind}; the read methods read it at call
|
|
9
|
+
* time. This is the late-bind the SDK's `bindProvider` sets up — the factory
|
|
10
|
+
* is constructed before the client exists.
|
|
11
|
+
*/
|
|
12
|
+
export interface HyperliquidContext {
|
|
13
|
+
client: PerpsSDKClient
|
|
14
|
+
apiUrl: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Mutable, single-assignment holder for the {@link HyperliquidContext}. The
|
|
19
|
+
* provider factory creates one per instance and exposes `bind`; the read
|
|
20
|
+
* services call {@link HyperliquidContextRef.require} at call time.
|
|
21
|
+
*/
|
|
22
|
+
export class HyperliquidContextRef {
|
|
23
|
+
private context: HyperliquidContext | undefined
|
|
24
|
+
|
|
25
|
+
constructor(private readonly apiUrl: string) {}
|
|
26
|
+
|
|
27
|
+
bind(client: PerpsSDKClient): void {
|
|
28
|
+
this.context = { client, apiUrl: this.apiUrl }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
require(): HyperliquidContext {
|
|
32
|
+
if (this.context === undefined) {
|
|
33
|
+
throw new PerpsError(
|
|
34
|
+
PerpsErrorCode.SDKError,
|
|
35
|
+
'hyperliquidProvider used before binding. Register it via ' +
|
|
36
|
+
'createPerpsClient({ providers: [hyperliquidProvider()] }).'
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
return this.context
|
|
40
|
+
}
|
|
41
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// biome-ignore-all lint/performance/noBarrelFile: package public entry point.
|
|
2
|
+
// biome-ignore-all lint/performance/noReExportAll: package public entry point.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hyperliquid provider plugin for `@lifi/perps-sdk`. Reads account-specific
|
|
6
|
+
* state directly from `${apiUrl}/info`; enriched asset metadata and
|
|
7
|
+
* public/shared data come from the LI.FI backend. Register the
|
|
8
|
+
* `hyperliquidProvider()` factory with `createPerpsClient`.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export { projectHyperliquidConfigSettings } from './accountConfig.js'
|
|
15
|
+
export { getAccountSummary } from './accountSummary.js'
|
|
16
|
+
export {
|
|
17
|
+
DEFAULT_HYPERLIQUID_API_URL,
|
|
18
|
+
HYPERLIQUID_FEE_TIER_FALLBACK,
|
|
19
|
+
PROVIDER_KEY as HYPERLIQUID_PROVIDER_KEY,
|
|
20
|
+
} from './constants.js'
|
|
21
|
+
export {
|
|
22
|
+
type HyperliquidPerpsProvider,
|
|
23
|
+
type HyperliquidProviderOptions,
|
|
24
|
+
hyperliquidProvider,
|
|
25
|
+
} from './HyperliquidProvider.js'
|
|
26
|
+
export type { GetAccountParams } from './services/getAccount.js'
|
|
27
|
+
export { getAccount } from './services/getAccount.js'
|
|
28
|
+
export type { GetActivityParams } from './services/getActivity.js'
|
|
29
|
+
export { getActivity } from './services/getActivity.js'
|
|
30
|
+
export type { GetFillsParams } from './services/getFills.js'
|
|
31
|
+
export { getFills } from './services/getFills.js'
|
|
32
|
+
export type { GetOrderParams } from './services/getOrder.js'
|
|
33
|
+
export { getOrder } from './services/getOrder.js'
|
|
34
|
+
export type { GetOrdersParams } from './services/getOrders.js'
|
|
35
|
+
export { getOrders } from './services/getOrders.js'
|
|
36
|
+
export type { GetPositionsParams } from './services/getPositions.js'
|
|
37
|
+
export { getPositions } from './services/getPositions.js'
|
|
38
|
+
export type { HyperliquidAgent } from './signers/HyperliquidAgentStore.js'
|
|
39
|
+
export { HyperliquidAgentStore } from './signers/HyperliquidAgentStore.js'
|
|
40
|
+
export * from './types/index.js'
|
|
41
|
+
export * from './utils/index.js'
|
|
42
|
+
export {
|
|
43
|
+
HyperliquidWsProvider,
|
|
44
|
+
hyperliquidWsProvider,
|
|
45
|
+
} from './websocket/HyperliquidWsProvider.js'
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMarketRegistry,
|
|
3
|
+
getPrices,
|
|
4
|
+
type ProviderGetAccountParams,
|
|
5
|
+
type SDKRequestOptions,
|
|
6
|
+
stringToFloat,
|
|
7
|
+
} from '@lifi/perps-sdk'
|
|
8
|
+
import type {
|
|
9
|
+
AccountResponse,
|
|
10
|
+
Asset,
|
|
11
|
+
Balance,
|
|
12
|
+
HyperliquidAccountConfig,
|
|
13
|
+
Position,
|
|
14
|
+
} from '@lifi/perps-types'
|
|
15
|
+
import { PROVIDER_KEY } from '../constants.js'
|
|
16
|
+
import type { HyperliquidContext } from '../context.js'
|
|
17
|
+
import {
|
|
18
|
+
HlAbstractionMode,
|
|
19
|
+
type HlClearinghouseState,
|
|
20
|
+
type HlExtraAgents,
|
|
21
|
+
type HlSpotClearinghouseState,
|
|
22
|
+
type HlUserFees,
|
|
23
|
+
} from '../types/index.js'
|
|
24
|
+
import {
|
|
25
|
+
perpsDexNames,
|
|
26
|
+
spotAssetFromToken,
|
|
27
|
+
spotBalance,
|
|
28
|
+
spotPriceById,
|
|
29
|
+
} from '../utils/index.js'
|
|
30
|
+
import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
|
|
31
|
+
import { mapPosition } from '../utils/mapPosition.js'
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Parameters for {@link getAccount}.
|
|
35
|
+
*
|
|
36
|
+
* @public
|
|
37
|
+
*/
|
|
38
|
+
export type GetAccountParams = ProviderGetAccountParams
|
|
39
|
+
|
|
40
|
+
const getAccountValue = (state: HlClearinghouseState): number =>
|
|
41
|
+
Number.parseFloat(
|
|
42
|
+
state.crossMarginSummary.accountValue || state.marginSummary.accountValue
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
const getTotalMarginUsed = (state: HlClearinghouseState): number =>
|
|
46
|
+
Number.parseFloat(
|
|
47
|
+
state.crossMarginSummary.totalMarginUsed ||
|
|
48
|
+
state.marginSummary.totalMarginUsed
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
const getMarginUsed = (
|
|
52
|
+
abstraction: HlAbstractionMode | null,
|
|
53
|
+
positions: Position[],
|
|
54
|
+
stateByDex: Map<string, HlClearinghouseState>
|
|
55
|
+
): string => {
|
|
56
|
+
if (
|
|
57
|
+
abstraction === HlAbstractionMode.UNIFIED_ACCOUNT ||
|
|
58
|
+
abstraction === HlAbstractionMode.PORTFOLIO_MARGIN
|
|
59
|
+
) {
|
|
60
|
+
// Per HL docs, individual per-dex states are not meaningful for these
|
|
61
|
+
// modes; derive total margin from the already-mapped positions.
|
|
62
|
+
const total = positions.reduce(
|
|
63
|
+
(sum, p) => sum + Number.parseFloat(p.marginUsed),
|
|
64
|
+
0
|
|
65
|
+
)
|
|
66
|
+
return total.toString()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (abstraction === HlAbstractionMode.DEX_ABSTRACTION) {
|
|
70
|
+
let total = 0
|
|
71
|
+
for (const [, state] of stateByDex) {
|
|
72
|
+
total += getTotalMarginUsed(state)
|
|
73
|
+
}
|
|
74
|
+
return total.toString()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const mainState = stateByDex.get('')
|
|
78
|
+
if (!mainState) {
|
|
79
|
+
return '0'
|
|
80
|
+
}
|
|
81
|
+
return getTotalMarginUsed(mainState).toString()
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const isUnifiedMode = (abstraction: HlAbstractionMode | null): boolean =>
|
|
85
|
+
abstraction === HlAbstractionMode.UNIFIED_ACCOUNT ||
|
|
86
|
+
abstraction === HlAbstractionMode.PORTFOLIO_MARGIN
|
|
87
|
+
|
|
88
|
+
interface BalancePartition {
|
|
89
|
+
balances: Balance[]
|
|
90
|
+
collateralBalances: Balance[]
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const buildBalances = (
|
|
94
|
+
abstraction: HlAbstractionMode | null,
|
|
95
|
+
spotState: HlSpotClearinghouseState,
|
|
96
|
+
stateByDex: Map<string, HlClearinghouseState>,
|
|
97
|
+
quoteAssetIds: ReadonlySet<string>,
|
|
98
|
+
priceById: Map<string, number>,
|
|
99
|
+
quoteAssetByCategory: Map<string, Asset>
|
|
100
|
+
): BalancePartition => {
|
|
101
|
+
const balances: Balance[] = []
|
|
102
|
+
const collateralBalances: Balance[] = []
|
|
103
|
+
|
|
104
|
+
// Spot balances: collateral iff the token is a category quote asset.
|
|
105
|
+
for (const b of spotState.balances) {
|
|
106
|
+
const balance = spotBalance(spotAssetFromToken(b), b.total, priceById)
|
|
107
|
+
if (quoteAssetIds.has(balance.asset.id)) {
|
|
108
|
+
collateralBalances.push(balance)
|
|
109
|
+
} else {
|
|
110
|
+
balances.push(balance)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Unified/portfolio modes hold everything in spot — per-dex equity would
|
|
115
|
+
// double-count. Only disabled/dexAbstraction carry separate venue collateral.
|
|
116
|
+
// `accountValue` is reported net of locked margin, i.e. the free collateral;
|
|
117
|
+
// the locked portion is carried by the positions' `marginUsed`.
|
|
118
|
+
if (!isUnifiedMode(abstraction)) {
|
|
119
|
+
for (const [dex, state] of stateByDex) {
|
|
120
|
+
const categoryId = dex || PROVIDER_KEY
|
|
121
|
+
const value = getAccountValue(state)
|
|
122
|
+
collateralBalances.push({
|
|
123
|
+
categoryId,
|
|
124
|
+
// Always present: every dex in `stateByDex` derives from `markets`,
|
|
125
|
+
// which is what populates `quoteAssetByCategory`.
|
|
126
|
+
asset: quoteAssetByCategory.get(categoryId)!,
|
|
127
|
+
units: value.toString(),
|
|
128
|
+
valueUsd: value.toString(),
|
|
129
|
+
})
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return { balances, collateralBalances }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Fetch the Hyperliquid account snapshot for `address`: balances per
|
|
138
|
+
* sub-dex (and spot), aggregate margin used, unrealised PnL, fee tier, and
|
|
139
|
+
* the typed `HyperliquidAccountConfig`.
|
|
140
|
+
*
|
|
141
|
+
* Issues `userFees`, `userAbstraction`, `extraAgents`,
|
|
142
|
+
* `spotClearinghouseState` and one `clearinghouseState` per supported perps
|
|
143
|
+
* sub-dex, all concurrently.
|
|
144
|
+
*
|
|
145
|
+
* `config.builderFeeApproval` is intentionally omitted — that field
|
|
146
|
+
* compares the venue's `maxBuilderFee` against the integrator-specific
|
|
147
|
+
* builder address LI.FI publishes, which is not data the venue itself
|
|
148
|
+
* owns. Surfacing it belongs at a higher layer (the LI.FI backend or a
|
|
149
|
+
* thin client-side helper that has the integrator's builder config).
|
|
150
|
+
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
151
|
+
* @public
|
|
152
|
+
*/
|
|
153
|
+
export const getAccount = async (
|
|
154
|
+
{ client, apiUrl }: HyperliquidContext,
|
|
155
|
+
params: GetAccountParams,
|
|
156
|
+
options?: SDKRequestOptions
|
|
157
|
+
): Promise<AccountResponse> => {
|
|
158
|
+
const registry = getMarketRegistry(client, PROVIDER_KEY)
|
|
159
|
+
const markets = await registry.sync()
|
|
160
|
+
const dexNames = perpsDexNames(markets)
|
|
161
|
+
const quoteAssetIds = new Set(markets.map((m) => m.quoteAsset.id))
|
|
162
|
+
const quoteAssetByCategory = new Map(
|
|
163
|
+
markets.map((m) => [m.categoryId, m.quoteAsset])
|
|
164
|
+
)
|
|
165
|
+
const infoOpts = hlInfoOptions(client, options)
|
|
166
|
+
|
|
167
|
+
const [
|
|
168
|
+
feesResult,
|
|
169
|
+
abstractionResult,
|
|
170
|
+
agentsResult,
|
|
171
|
+
spotState,
|
|
172
|
+
stateResults,
|
|
173
|
+
{ prices },
|
|
174
|
+
] = await Promise.all([
|
|
175
|
+
infoRequest<HlUserFees>(
|
|
176
|
+
apiUrl,
|
|
177
|
+
{ type: 'userFees', user: params.address },
|
|
178
|
+
infoOpts
|
|
179
|
+
),
|
|
180
|
+
// "Never set abstraction" is a successful 200 `null` body, not an error —
|
|
181
|
+
// so a fetch failure must propagate, never be coerced to `null` (which
|
|
182
|
+
// would silently route margin/balance down the wrong, non-unified branch).
|
|
183
|
+
infoRequest<HlAbstractionMode | null>(
|
|
184
|
+
apiUrl,
|
|
185
|
+
{ type: 'userAbstraction', user: params.address },
|
|
186
|
+
infoOpts
|
|
187
|
+
),
|
|
188
|
+
infoRequest<HlExtraAgents>(
|
|
189
|
+
apiUrl,
|
|
190
|
+
{ type: 'extraAgents', user: params.address },
|
|
191
|
+
infoOpts
|
|
192
|
+
),
|
|
193
|
+
infoRequest<HlSpotClearinghouseState>(
|
|
194
|
+
apiUrl,
|
|
195
|
+
{ type: 'spotClearinghouseState', user: params.address },
|
|
196
|
+
infoOpts
|
|
197
|
+
),
|
|
198
|
+
Promise.all(
|
|
199
|
+
dexNames.map((name) =>
|
|
200
|
+
infoRequest<HlClearinghouseState>(
|
|
201
|
+
apiUrl,
|
|
202
|
+
{
|
|
203
|
+
type: 'clearinghouseState',
|
|
204
|
+
user: params.address,
|
|
205
|
+
...(name ? { dex: name } : {}),
|
|
206
|
+
},
|
|
207
|
+
infoOpts
|
|
208
|
+
)
|
|
209
|
+
)
|
|
210
|
+
),
|
|
211
|
+
getPrices(client, { provider: PROVIDER_KEY }, options),
|
|
212
|
+
])
|
|
213
|
+
|
|
214
|
+
const priceById = spotPriceById(
|
|
215
|
+
markets,
|
|
216
|
+
new Map(prices.map((p) => [p.marketId, stringToFloat(p.markPrice)]))
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
const positions: Position[] = stateResults.flatMap((state) =>
|
|
220
|
+
state.assetPositions
|
|
221
|
+
.filter((ap) => Number.parseFloat(ap.position.szi) !== 0)
|
|
222
|
+
.map((ap) => mapPosition(ap, registry.require(ap.position.coin)))
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
const stateByDex = new Map<string, HlClearinghouseState>()
|
|
226
|
+
stateResults.forEach((state, i) => {
|
|
227
|
+
stateByDex.set(dexNames[i], state)
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
const totalUnrealizedPnl = positions.reduce(
|
|
231
|
+
(sum, p) => sum + Number.parseFloat(p.unrealizedPnl),
|
|
232
|
+
0
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
const config: HyperliquidAccountConfig = {
|
|
236
|
+
provider: PROVIDER_KEY,
|
|
237
|
+
abstractionMode: abstractionResult,
|
|
238
|
+
agents: agentsResult,
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const { balances, collateralBalances } = buildBalances(
|
|
242
|
+
abstractionResult,
|
|
243
|
+
spotState,
|
|
244
|
+
stateByDex,
|
|
245
|
+
quoteAssetIds,
|
|
246
|
+
priceById,
|
|
247
|
+
quoteAssetByCategory
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
provider: PROVIDER_KEY,
|
|
252
|
+
address: params.address,
|
|
253
|
+
balances,
|
|
254
|
+
collateralBalances,
|
|
255
|
+
marginUsed: getMarginUsed(abstractionResult, positions, stateByDex),
|
|
256
|
+
unrealizedPnl: totalUnrealizedPnl.toString(),
|
|
257
|
+
feeTier: {
|
|
258
|
+
maker: feesResult.userAddRate ?? '0',
|
|
259
|
+
taker: feesResult.userCrossRate ?? '0',
|
|
260
|
+
},
|
|
261
|
+
config,
|
|
262
|
+
}
|
|
263
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { getMarketRegistry, type SDKRequestOptions } from '@lifi/perps-sdk'
|
|
2
|
+
import type {
|
|
3
|
+
ActivitiesResponse,
|
|
4
|
+
ActivityItem,
|
|
5
|
+
MarketDisplay,
|
|
6
|
+
} from '@lifi/perps-types'
|
|
7
|
+
import { ActivityType } from '@lifi/perps-types'
|
|
8
|
+
import type { Address } from 'viem'
|
|
9
|
+
import {
|
|
10
|
+
DEFAULT_HISTORY_LIMIT,
|
|
11
|
+
MAX_HISTORY_LIMIT,
|
|
12
|
+
NINETY_DAYS_MS,
|
|
13
|
+
PROVIDER_KEY,
|
|
14
|
+
} from '../constants.js'
|
|
15
|
+
import type { HyperliquidContext } from '../context.js'
|
|
16
|
+
import type {
|
|
17
|
+
HlUserFunding,
|
|
18
|
+
HlUserNonFundingLedgerUpdates,
|
|
19
|
+
} from '../types/index.js'
|
|
20
|
+
import { mapFundingActivity, mapLedgerEntry } from '../utils/index.js'
|
|
21
|
+
import {
|
|
22
|
+
hlInfoOptions,
|
|
23
|
+
type InfoRequestOptions,
|
|
24
|
+
infoRequest,
|
|
25
|
+
} from '../utils/infoClient.js'
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Parameters for {@link getActivity}.
|
|
29
|
+
*
|
|
30
|
+
* @public
|
|
31
|
+
*/
|
|
32
|
+
export interface GetActivityParams {
|
|
33
|
+
address: Address
|
|
34
|
+
limit?: number
|
|
35
|
+
/** `cursor` is a ms-since-epoch upper bound — items with `timestamp < cursor` are returned. */
|
|
36
|
+
cursor?: string
|
|
37
|
+
startTime?: number
|
|
38
|
+
endTime?: number
|
|
39
|
+
type?: ActivityType[]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const fetchActivityData = async (
|
|
43
|
+
apiUrl: string,
|
|
44
|
+
typeFilter: ActivityType[] | undefined,
|
|
45
|
+
timeParams: { user: Address; startTime: number; endTime?: number },
|
|
46
|
+
resolveMarket: (coin: string) => MarketDisplay,
|
|
47
|
+
options?: InfoRequestOptions
|
|
48
|
+
): Promise<ActivityItem[]> => {
|
|
49
|
+
const needLedger =
|
|
50
|
+
!typeFilter || typeFilter.some((t) => t !== ActivityType.FUNDING)
|
|
51
|
+
const needFunding = !typeFilter || typeFilter.includes(ActivityType.FUNDING)
|
|
52
|
+
|
|
53
|
+
const [ledgerUpdates, fundingUpdates] = await Promise.all([
|
|
54
|
+
needLedger
|
|
55
|
+
? infoRequest<HlUserNonFundingLedgerUpdates>(
|
|
56
|
+
apiUrl,
|
|
57
|
+
{ type: 'userNonFundingLedgerUpdates', ...timeParams },
|
|
58
|
+
options
|
|
59
|
+
)
|
|
60
|
+
: Promise.resolve([] as HlUserNonFundingLedgerUpdates),
|
|
61
|
+
needFunding
|
|
62
|
+
? infoRequest<HlUserFunding>(
|
|
63
|
+
apiUrl,
|
|
64
|
+
{ type: 'userFunding', ...timeParams },
|
|
65
|
+
options
|
|
66
|
+
)
|
|
67
|
+
: Promise.resolve([] as HlUserFunding),
|
|
68
|
+
])
|
|
69
|
+
|
|
70
|
+
const ledgerItems: ActivityItem[] = ledgerUpdates
|
|
71
|
+
.map((entry) =>
|
|
72
|
+
mapLedgerEntry(entry, PROVIDER_KEY, timeParams.user, resolveMarket)
|
|
73
|
+
)
|
|
74
|
+
.filter((item): item is ActivityItem => item !== null)
|
|
75
|
+
|
|
76
|
+
const fundingItems: ActivityItem[] = fundingUpdates.map((entry) =>
|
|
77
|
+
mapFundingActivity(entry, PROVIDER_KEY, resolveMarket)
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
const merged = [...ledgerItems, ...fundingItems].sort(
|
|
81
|
+
(a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
if (!typeFilter) {
|
|
85
|
+
return merged
|
|
86
|
+
}
|
|
87
|
+
const typeSet = new Set(typeFilter)
|
|
88
|
+
return merged.filter((item) => typeSet.has(item.type))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Fetch a chronological activity feed (deposits, withdrawals, transfers,
|
|
93
|
+
* liquidations, funding) for `address`. Combines results from Hyperliquid's
|
|
94
|
+
* `userNonFundingLedgerUpdates` and `userFunding` endpoints, sorted
|
|
95
|
+
* newest-first.
|
|
96
|
+
*
|
|
97
|
+
* Cursor-based pagination uses the ms-since-epoch timestamp of the last
|
|
98
|
+
* item on the current page. `startTime` defaults to 90 days ago to keep
|
|
99
|
+
* unbounded queries cheap.
|
|
100
|
+
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
101
|
+
* @public
|
|
102
|
+
*/
|
|
103
|
+
export const getActivity = async (
|
|
104
|
+
{ client, apiUrl }: HyperliquidContext,
|
|
105
|
+
params: GetActivityParams,
|
|
106
|
+
options?: SDKRequestOptions
|
|
107
|
+
): Promise<ActivitiesResponse> => {
|
|
108
|
+
const registry = getMarketRegistry(client, PROVIDER_KEY)
|
|
109
|
+
await registry.sync()
|
|
110
|
+
const infoOpts = hlInfoOptions(client, options)
|
|
111
|
+
|
|
112
|
+
const limit = Math.min(
|
|
113
|
+
params.limit ?? DEFAULT_HISTORY_LIMIT,
|
|
114
|
+
MAX_HISTORY_LIMIT
|
|
115
|
+
)
|
|
116
|
+
const startTime = params.startTime ?? Date.now() - NINETY_DAYS_MS
|
|
117
|
+
const endTime =
|
|
118
|
+
params.cursor === undefined
|
|
119
|
+
? params.endTime
|
|
120
|
+
: Number.parseInt(params.cursor, 10)
|
|
121
|
+
|
|
122
|
+
const timeParams = {
|
|
123
|
+
user: params.address,
|
|
124
|
+
startTime,
|
|
125
|
+
...(endTime === undefined ? {} : { endTime }),
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const merged = await fetchActivityData(
|
|
129
|
+
apiUrl,
|
|
130
|
+
params.type,
|
|
131
|
+
timeParams,
|
|
132
|
+
(coin) => registry.require(coin),
|
|
133
|
+
infoOpts
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
// Hyperliquid's endTime is inclusive — drop boundary items so we don't
|
|
137
|
+
// return the cursor row twice on the next page.
|
|
138
|
+
const filtered =
|
|
139
|
+
params.cursor === undefined
|
|
140
|
+
? merged
|
|
141
|
+
: merged.filter(
|
|
142
|
+
(item) =>
|
|
143
|
+
new Date(item.timestamp).getTime() <
|
|
144
|
+
Number.parseInt(params.cursor!, 10)
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
const hasMore = filtered.length > limit
|
|
148
|
+
const items = filtered.slice(0, limit)
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
provider: PROVIDER_KEY,
|
|
152
|
+
items,
|
|
153
|
+
pagination: {
|
|
154
|
+
limit,
|
|
155
|
+
hasMore,
|
|
156
|
+
cursor:
|
|
157
|
+
items.length > 0
|
|
158
|
+
? String(new Date(items[items.length - 1].timestamp).getTime())
|
|
159
|
+
: undefined,
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { getMarketRegistry, type SDKRequestOptions } from '@lifi/perps-sdk'
|
|
2
|
+
import type { FillsResponse } from '@lifi/perps-types'
|
|
3
|
+
import type { Address } from 'viem'
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_HISTORY_LIMIT,
|
|
6
|
+
MAX_HISTORY_LIMIT,
|
|
7
|
+
PROVIDER_KEY,
|
|
8
|
+
} from '../constants.js'
|
|
9
|
+
import type { HyperliquidContext } from '../context.js'
|
|
10
|
+
import type { HlUserFills, HlUserFillsByTime } from '../types/index.js'
|
|
11
|
+
import { mapFill } from '../utils/index.js'
|
|
12
|
+
import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Parameters for {@link getFills}.
|
|
16
|
+
*
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
export interface GetFillsParams {
|
|
20
|
+
address: Address
|
|
21
|
+
limit?: number
|
|
22
|
+
/** `tid` of the oldest fill to return (returned items have `tid < cursor`). */
|
|
23
|
+
cursor?: string
|
|
24
|
+
/** Inclusive lower bound in ms-since-epoch — switches to the `userFillsByTime` endpoint. */
|
|
25
|
+
startTime?: number
|
|
26
|
+
/** Inclusive upper bound in ms-since-epoch — switches to the `userFillsByTime` endpoint. */
|
|
27
|
+
endTime?: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Fetch the user's fills history. When `startTime` or `endTime` is provided,
|
|
32
|
+
* Hyperliquid's `userFillsByTime` endpoint is used; otherwise the unbounded
|
|
33
|
+
* `userFills` endpoint returns the full history. The backend's enriched asset
|
|
34
|
+
* list supplies the display fields; only the fills endpoint is read direct
|
|
35
|
+
* from HL.
|
|
36
|
+
*
|
|
37
|
+
* Pagination is cursor-based on the fill's `tid`: results with
|
|
38
|
+
* `tid < cursor` are kept and the last-page's tail `id` is returned as the
|
|
39
|
+
* next cursor.
|
|
40
|
+
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
41
|
+
* @public
|
|
42
|
+
*/
|
|
43
|
+
export const getFills = async (
|
|
44
|
+
{ client, apiUrl }: HyperliquidContext,
|
|
45
|
+
params: GetFillsParams,
|
|
46
|
+
options?: SDKRequestOptions
|
|
47
|
+
): Promise<FillsResponse> => {
|
|
48
|
+
const registry = getMarketRegistry(client, PROVIDER_KEY)
|
|
49
|
+
await registry.sync()
|
|
50
|
+
const infoOpts = hlInfoOptions(client, options)
|
|
51
|
+
|
|
52
|
+
const limit = Math.min(
|
|
53
|
+
params.limit ?? DEFAULT_HISTORY_LIMIT,
|
|
54
|
+
MAX_HISTORY_LIMIT
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
const useByTime =
|
|
58
|
+
params.startTime !== undefined || params.endTime !== undefined
|
|
59
|
+
|
|
60
|
+
const allFills = useByTime
|
|
61
|
+
? await infoRequest<HlUserFillsByTime>(
|
|
62
|
+
apiUrl,
|
|
63
|
+
{
|
|
64
|
+
type: 'userFillsByTime',
|
|
65
|
+
user: params.address,
|
|
66
|
+
startTime: params.startTime ?? 0,
|
|
67
|
+
...(params.endTime !== undefined ? { endTime: params.endTime } : {}),
|
|
68
|
+
},
|
|
69
|
+
infoOpts
|
|
70
|
+
)
|
|
71
|
+
: await infoRequest<HlUserFills>(
|
|
72
|
+
apiUrl,
|
|
73
|
+
{ type: 'userFills', user: params.address },
|
|
74
|
+
infoOpts
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
const filtered =
|
|
78
|
+
params.cursor === undefined
|
|
79
|
+
? allFills
|
|
80
|
+
: allFills.filter((f) => f.tid < Number.parseInt(params.cursor!, 10))
|
|
81
|
+
|
|
82
|
+
const hasMore = filtered.length > limit
|
|
83
|
+
const items = filtered
|
|
84
|
+
.slice(0, limit)
|
|
85
|
+
.map((f) => mapFill(f, registry.require(f.coin)))
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
provider: PROVIDER_KEY,
|
|
89
|
+
items,
|
|
90
|
+
pagination: {
|
|
91
|
+
limit,
|
|
92
|
+
hasMore,
|
|
93
|
+
cursor: items.length > 0 ? items[items.length - 1].id : undefined,
|
|
94
|
+
},
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMarketRegistry,
|
|
3
|
+
PerpsError,
|
|
4
|
+
type ProviderGetOrderParams,
|
|
5
|
+
type SDKRequestOptions,
|
|
6
|
+
} from '@lifi/perps-sdk'
|
|
7
|
+
import type { Order } from '@lifi/perps-types'
|
|
8
|
+
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
9
|
+
import { PROVIDER_KEY } from '../constants.js'
|
|
10
|
+
import type { HyperliquidContext } from '../context.js'
|
|
11
|
+
import type { HlOrderStatusResponse } from '../types/index.js'
|
|
12
|
+
import { mapOrder } from '../utils/index.js'
|
|
13
|
+
import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Parameters for {@link getOrder}.
|
|
17
|
+
*
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export type GetOrderParams = ProviderGetOrderParams
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Read getOrder direct from the Hyperliquid REST API.
|
|
24
|
+
*
|
|
25
|
+
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
export const getOrder = async (
|
|
29
|
+
{ client, apiUrl }: HyperliquidContext,
|
|
30
|
+
params: GetOrderParams,
|
|
31
|
+
options?: SDKRequestOptions
|
|
32
|
+
): Promise<Order> => {
|
|
33
|
+
const oid = Number.parseInt(params.id, 10)
|
|
34
|
+
if (Number.isNaN(oid)) {
|
|
35
|
+
const err = new PerpsError(
|
|
36
|
+
PerpsErrorCode.ValidationError,
|
|
37
|
+
`Invalid order ID: ${params.id}. Must be a numeric oid.`
|
|
38
|
+
)
|
|
39
|
+
err.tool = PROVIDER_KEY
|
|
40
|
+
throw err
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const status = await infoRequest<HlOrderStatusResponse>(
|
|
44
|
+
apiUrl,
|
|
45
|
+
{ type: 'orderStatus', user: params.address, oid },
|
|
46
|
+
hlInfoOptions(client, options)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
if (status.status !== 'order') {
|
|
50
|
+
const err = new PerpsError(
|
|
51
|
+
PerpsErrorCode.OrderNotFound,
|
|
52
|
+
`Order not found: ${params.id}`
|
|
53
|
+
)
|
|
54
|
+
err.tool = PROVIDER_KEY
|
|
55
|
+
throw err
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const registry = getMarketRegistry(client, PROVIDER_KEY)
|
|
59
|
+
await registry.sync()
|
|
60
|
+
return mapOrder(status.order, registry.require(status.order.order.coin))
|
|
61
|
+
}
|