@lifi/perps-sdk-provider-hyperliquid 25.0.0 → 27.0.0
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/dist/cjs/accountSummary.d.ts.map +1 -1
- package/dist/cjs/accountSummary.js +8 -14
- package/dist/cjs/accountSummary.js.map +1 -1
- package/dist/cjs/services/getAccount.d.ts.map +1 -1
- package/dist/cjs/services/getAccount.js +18 -16
- package/dist/cjs/services/getAccount.js.map +1 -1
- package/dist/cjs/services/getFills.d.ts.map +1 -1
- package/dist/cjs/services/getFills.js +2 -1
- package/dist/cjs/services/getFills.js.map +1 -1
- package/dist/cjs/services/getMarketSettings.d.ts.map +1 -1
- package/dist/cjs/services/getMarketSettings.js +1 -1
- package/dist/cjs/services/getMarketSettings.js.map +1 -1
- package/dist/cjs/services/getOrder.d.ts.map +1 -1
- package/dist/cjs/services/getOrder.js +14 -4
- package/dist/cjs/services/getOrder.js.map +1 -1
- package/dist/cjs/services/getOrders.d.ts.map +1 -1
- package/dist/cjs/services/getOrders.js +8 -28
- package/dist/cjs/services/getOrders.js.map +1 -1
- package/dist/cjs/services/getPortfolioHistory.d.ts.map +1 -1
- package/dist/cjs/services/getPortfolioHistory.js +17 -6
- package/dist/cjs/services/getPortfolioHistory.js.map +1 -1
- package/dist/cjs/services/getPositions.d.ts.map +1 -1
- package/dist/cjs/services/getPositions.js +4 -1
- package/dist/cjs/services/getPositions.js.map +1 -1
- package/dist/cjs/types/ws.d.ts +3 -2
- package/dist/cjs/types/ws.d.ts.map +1 -1
- package/dist/cjs/utils/index.d.ts +1 -1
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +3 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/liquidation.d.ts +5 -2
- package/dist/cjs/utils/liquidation.d.ts.map +1 -1
- package/dist/cjs/utils/liquidation.js +8 -8
- package/dist/cjs/utils/liquidation.js.map +1 -1
- package/dist/cjs/utils/mapActivity.d.ts.map +1 -1
- package/dist/cjs/utils/mapActivity.js +38 -23
- package/dist/cjs/utils/mapActivity.js.map +1 -1
- package/dist/cjs/utils/mapFill.d.ts +1 -1
- package/dist/cjs/utils/mapFill.d.ts.map +1 -1
- package/dist/cjs/utils/mapFill.js +17 -6
- package/dist/cjs/utils/mapFill.js.map +1 -1
- package/dist/cjs/utils/mapMarket.d.ts.map +1 -1
- package/dist/cjs/utils/mapMarket.js +9 -13
- package/dist/cjs/utils/mapMarket.js.map +1 -1
- package/dist/cjs/utils/mapMarketContext.d.ts.map +1 -1
- package/dist/cjs/utils/mapMarketContext.js +3 -12
- package/dist/cjs/utils/mapMarketContext.js.map +1 -1
- package/dist/cjs/utils/mapOrder.d.ts +3 -1
- package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
- package/dist/cjs/utils/mapOrder.js +73 -19
- package/dist/cjs/utils/mapOrder.js.map +1 -1
- package/dist/cjs/utils/mapPosition.d.ts +1 -1
- package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
- package/dist/cjs/utils/mapPosition.js +41 -15
- package/dist/cjs/utils/mapPosition.js.map +1 -1
- package/dist/cjs/utils/rowTimestamp.d.ts +2 -0
- package/dist/cjs/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/cjs/utils/rowTimestamp.js +14 -0
- package/dist/cjs/utils/rowTimestamp.js.map +1 -0
- package/dist/cjs/utils/spotBalance.d.ts +3 -3
- package/dist/cjs/utils/spotBalance.d.ts.map +1 -1
- package/dist/cjs/utils/spotBalance.js +6 -5
- package/dist/cjs/utils/spotBalance.js.map +1 -1
- package/dist/cjs/utils/spotCollateral.d.ts.map +1 -1
- package/dist/cjs/utils/spotCollateral.js +3 -2
- package/dist/cjs/utils/spotCollateral.js.map +1 -1
- package/dist/cjs/utils/transferMargin.d.ts.map +1 -1
- package/dist/cjs/utils/transferMargin.js +16 -19
- package/dist/cjs/utils/transferMargin.js.map +1 -1
- package/dist/cjs/utils/venueTotals.d.ts +4 -5
- package/dist/cjs/utils/venueTotals.d.ts.map +1 -1
- package/dist/cjs/utils/venueTotals.js +18 -10
- package/dist/cjs/utils/venueTotals.js.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.js +10 -10
- package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.d.ts +1 -0
- package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.js +144 -115
- package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/esm/accountSummary.d.ts +2 -1
- package/dist/esm/accountSummary.d.ts.map +1 -1
- package/dist/esm/accountSummary.js +11 -13
- package/dist/esm/accountSummary.js.map +1 -1
- package/dist/esm/services/getAccount.d.ts.map +1 -1
- package/dist/esm/services/getAccount.js +23 -21
- package/dist/esm/services/getAccount.js.map +1 -1
- package/dist/esm/services/getFills.d.ts.map +1 -1
- package/dist/esm/services/getFills.js +2 -1
- package/dist/esm/services/getFills.js.map +1 -1
- package/dist/esm/services/getMarketSettings.d.ts.map +1 -1
- package/dist/esm/services/getMarketSettings.js +2 -2
- package/dist/esm/services/getMarketSettings.js.map +1 -1
- package/dist/esm/services/getOrder.d.ts.map +1 -1
- package/dist/esm/services/getOrder.js +14 -4
- package/dist/esm/services/getOrder.js.map +1 -1
- package/dist/esm/services/getOrders.d.ts.map +1 -1
- package/dist/esm/services/getOrders.js +12 -37
- package/dist/esm/services/getOrders.js.map +1 -1
- package/dist/esm/services/getPortfolioHistory.d.ts.map +1 -1
- package/dist/esm/services/getPortfolioHistory.js +19 -7
- package/dist/esm/services/getPortfolioHistory.js.map +1 -1
- package/dist/esm/services/getPositions.d.ts.map +1 -1
- package/dist/esm/services/getPositions.js +4 -1
- package/dist/esm/services/getPositions.js.map +1 -1
- package/dist/esm/services/getWithdrawableBalances.d.ts +1 -1
- package/dist/esm/services/getWithdrawableBalances.js +1 -1
- package/dist/esm/types/ws.d.ts +3 -2
- package/dist/esm/types/ws.d.ts.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/liquidation.d.ts +23 -24
- package/dist/esm/utils/liquidation.d.ts.map +1 -1
- package/dist/esm/utils/liquidation.js +26 -31
- package/dist/esm/utils/liquidation.js.map +1 -1
- package/dist/esm/utils/mapActivity.d.ts +2 -1
- package/dist/esm/utils/mapActivity.d.ts.map +1 -1
- package/dist/esm/utils/mapActivity.js +41 -22
- package/dist/esm/utils/mapActivity.js.map +1 -1
- package/dist/esm/utils/mapFill.d.ts +3 -2
- package/dist/esm/utils/mapFill.d.ts.map +1 -1
- package/dist/esm/utils/mapFill.js +21 -9
- package/dist/esm/utils/mapFill.js.map +1 -1
- package/dist/esm/utils/mapMarket.d.ts +2 -2
- package/dist/esm/utils/mapMarket.d.ts.map +1 -1
- package/dist/esm/utils/mapMarket.js +12 -13
- package/dist/esm/utils/mapMarket.js.map +1 -1
- package/dist/esm/utils/mapMarketContext.d.ts.map +1 -1
- package/dist/esm/utils/mapMarketContext.js +3 -9
- package/dist/esm/utils/mapMarketContext.js.map +1 -1
- package/dist/esm/utils/mapOrder.d.ts +12 -2
- package/dist/esm/utils/mapOrder.d.ts.map +1 -1
- package/dist/esm/utils/mapOrder.js +81 -17
- package/dist/esm/utils/mapOrder.js.map +1 -1
- package/dist/esm/utils/mapPosition.d.ts +4 -2
- package/dist/esm/utils/mapPosition.d.ts.map +1 -1
- package/dist/esm/utils/mapPosition.js +44 -13
- package/dist/esm/utils/mapPosition.js.map +1 -1
- package/dist/esm/utils/rowTimestamp.d.ts +6 -0
- package/dist/esm/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/esm/utils/rowTimestamp.js +14 -0
- package/dist/esm/utils/rowTimestamp.js.map +1 -0
- package/dist/esm/utils/spotBalance.d.ts +5 -5
- package/dist/esm/utils/spotBalance.d.ts.map +1 -1
- package/dist/esm/utils/spotBalance.js +9 -8
- package/dist/esm/utils/spotBalance.js.map +1 -1
- package/dist/esm/utils/spotCollateral.d.ts.map +1 -1
- package/dist/esm/utils/spotCollateral.js +3 -2
- package/dist/esm/utils/spotCollateral.js.map +1 -1
- package/dist/esm/utils/transferMargin.d.ts +2 -1
- package/dist/esm/utils/transferMargin.d.ts.map +1 -1
- package/dist/esm/utils/transferMargin.js +19 -18
- package/dist/esm/utils/transferMargin.js.map +1 -1
- package/dist/esm/utils/venueTotals.d.ts +7 -6
- package/dist/esm/utils/venueTotals.d.ts.map +1 -1
- package/dist/esm/utils/venueTotals.js +21 -8
- package/dist/esm/utils/venueTotals.js.map +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts +6 -4
- package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/esm/utils/withdrawableBalances.js +17 -15
- package/dist/esm/utils/withdrawableBalances.js.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts +3 -0
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.js +155 -115
- package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/types/accountSummary.d.ts +2 -1
- package/dist/types/accountSummary.d.ts.map +1 -1
- package/dist/types/services/getAccount.d.ts.map +1 -1
- package/dist/types/services/getFills.d.ts.map +1 -1
- package/dist/types/services/getMarketSettings.d.ts.map +1 -1
- package/dist/types/services/getOrder.d.ts.map +1 -1
- package/dist/types/services/getOrders.d.ts.map +1 -1
- package/dist/types/services/getPortfolioHistory.d.ts.map +1 -1
- package/dist/types/services/getPositions.d.ts.map +1 -1
- package/dist/types/services/getWithdrawableBalances.d.ts +1 -1
- package/dist/types/types/ws.d.ts +3 -2
- package/dist/types/types/ws.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/liquidation.d.ts +23 -24
- package/dist/types/utils/liquidation.d.ts.map +1 -1
- package/dist/types/utils/mapActivity.d.ts +2 -1
- package/dist/types/utils/mapActivity.d.ts.map +1 -1
- package/dist/types/utils/mapFill.d.ts +3 -2
- package/dist/types/utils/mapFill.d.ts.map +1 -1
- package/dist/types/utils/mapMarket.d.ts +2 -2
- package/dist/types/utils/mapMarket.d.ts.map +1 -1
- package/dist/types/utils/mapMarketContext.d.ts.map +1 -1
- package/dist/types/utils/mapOrder.d.ts +12 -2
- package/dist/types/utils/mapOrder.d.ts.map +1 -1
- package/dist/types/utils/mapPosition.d.ts +4 -2
- package/dist/types/utils/mapPosition.d.ts.map +1 -1
- package/dist/types/utils/rowTimestamp.d.ts +6 -0
- package/dist/types/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/types/utils/spotBalance.d.ts +5 -5
- package/dist/types/utils/spotBalance.d.ts.map +1 -1
- package/dist/types/utils/spotCollateral.d.ts.map +1 -1
- package/dist/types/utils/transferMargin.d.ts +2 -1
- package/dist/types/utils/transferMargin.d.ts.map +1 -1
- package/dist/types/utils/venueTotals.d.ts +7 -6
- package/dist/types/utils/venueTotals.d.ts.map +1 -1
- package/dist/types/utils/withdrawableBalances.d.ts +6 -4
- package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/types/websocket/HyperliquidWsProvider.d.ts +3 -0
- package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/HyperliquidProvider.ts +1 -1
- package/src/accountSummary.ts +35 -23
- package/src/services/getAccount.ts +50 -33
- package/src/services/getFills.ts +2 -1
- package/src/services/getMarketSettings.ts +6 -2
- package/src/services/getOrder.ts +18 -7
- package/src/services/getOrders.ts +14 -46
- package/src/services/getPortfolioHistory.ts +34 -7
- package/src/services/getPositions.ts +4 -3
- package/src/services/getWithdrawableBalances.ts +1 -1
- package/src/types/ws.ts +3 -2
- package/src/utils/index.ts +2 -0
- package/src/utils/liquidation.ts +46 -34
- package/src/utils/mapActivity.ts +48 -20
- package/src/utils/mapFill.ts +25 -9
- package/src/utils/mapMarket.ts +16 -12
- package/src/utils/mapMarketContext.ts +6 -8
- package/src/utils/mapOrder.ts +107 -20
- package/src/utils/mapPosition.ts +72 -14
- package/src/utils/rowTimestamp.ts +15 -0
- package/src/utils/spotBalance.ts +19 -16
- package/src/utils/spotCollateral.ts +15 -2
- package/src/utils/transferMargin.ts +40 -18
- package/src/utils/venueTotals.ts +51 -17
- package/src/utils/withdrawableBalances.ts +33 -15
- package/src/websocket/HyperliquidWsProvider.ts +224 -133
- package/dist/cjs/utils/decimal.d.ts +0 -3
- package/dist/cjs/utils/decimal.d.ts.map +0 -1
- package/dist/cjs/utils/decimal.js +0 -19
- package/dist/cjs/utils/decimal.js.map +0 -1
- package/dist/esm/utils/decimal.d.ts +0 -10
- package/dist/esm/utils/decimal.d.ts.map +0 -1
- package/dist/esm/utils/decimal.js +0 -19
- package/dist/esm/utils/decimal.js.map +0 -1
- package/dist/types/utils/decimal.d.ts +0 -10
- package/dist/types/utils/decimal.d.ts.map +0 -1
- package/src/utils/decimal.ts +0 -21
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.HyperliquidWsProvider = exports.hyperliquidWsProvider = void 0;
|
|
7
4
|
const perps_sdk_1 = require("@lifi/perps-sdk");
|
|
8
5
|
const perps_types_1 = require("@lifi/perps-types");
|
|
9
|
-
const big_js_1 = __importDefault(require("big.js"));
|
|
10
6
|
const viem_1 = require("viem");
|
|
11
7
|
const constants_js_1 = require("../constants.js");
|
|
12
8
|
const getAccountExists_js_1 = require("../services/getAccountExists.js");
|
|
13
9
|
const index_js_1 = require("../types/index.js");
|
|
14
|
-
const decimal_js_1 = require("../utils/decimal.js");
|
|
15
10
|
const index_js_2 = require("../utils/index.js");
|
|
11
|
+
const mapOrder_js_1 = require("../utils/mapOrder.js");
|
|
16
12
|
const HL_L2_BOOK_MAX_LEVELS_PER_SIDE = 20;
|
|
17
13
|
const normalizeHlAddress = (address) => (0, viem_1.isAddress)(address, { strict: false }) ? address.toLowerCase() : address;
|
|
18
14
|
const availableAfterMaintenance = (spotState, quoteAssetId) => spotState.tokenToAvailableAfterMaintenance?.find(([token]) => String(token) === quoteAssetId)?.[1];
|
|
@@ -333,7 +329,14 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
333
329
|
if (priceStep === undefined) {
|
|
334
330
|
return {};
|
|
335
331
|
}
|
|
336
|
-
|
|
332
|
+
const referencePrice = this.orderbookReferencePrice(marketId);
|
|
333
|
+
const referencePriceNumber = referencePrice === undefined
|
|
334
|
+
? undefined
|
|
335
|
+
: (0, perps_sdk_1.safeDecimalStringToNumber)(referencePrice);
|
|
336
|
+
if (referencePriceNumber === undefined) {
|
|
337
|
+
return {};
|
|
338
|
+
}
|
|
339
|
+
return (0, index_js_2.priceStepToAggregation)(priceStep, referencePriceNumber);
|
|
337
340
|
}
|
|
338
341
|
orderbookAggregationKey(marketId, priceStep) {
|
|
339
342
|
const aggregation = this.orderbookAggregation(marketId, priceStep);
|
|
@@ -623,23 +626,22 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
623
626
|
}
|
|
624
627
|
mergedMids() {
|
|
625
628
|
const map = new Map();
|
|
629
|
+
const setMid = (id, mid) => {
|
|
630
|
+
const decimal = mid == null ? undefined : wsFigureToDecimalString(mid);
|
|
631
|
+
if ((0, perps_sdk_1.isDecimalString)(decimal)) {
|
|
632
|
+
map.set(id, decimal);
|
|
633
|
+
}
|
|
634
|
+
};
|
|
626
635
|
for (const byMarketId of this.perpCtxBySubDex.values()) {
|
|
627
636
|
for (const [id, ctx] of Object.entries(byMarketId)) {
|
|
628
|
-
|
|
629
|
-
map.set(id, Number(mid));
|
|
637
|
+
setMid(id, ctx.midPx ?? ctx.markPx);
|
|
630
638
|
}
|
|
631
639
|
}
|
|
632
640
|
for (const [id, ctx] of Object.entries(this.spotCtxByMarketId)) {
|
|
633
|
-
|
|
634
|
-
if (mid != null) {
|
|
635
|
-
map.set(id, Number(mid));
|
|
636
|
-
}
|
|
641
|
+
setMid(id, ctx.midPx ?? ctx.markPx);
|
|
637
642
|
}
|
|
638
643
|
for (const [id, fast] of Object.entries(this.fastCtxByMarketId)) {
|
|
639
|
-
|
|
640
|
-
if (mid != null) {
|
|
641
|
-
map.set(id, Number(mid));
|
|
642
|
-
}
|
|
644
|
+
setMid(id, fast.midPx ?? fast.markPx);
|
|
643
645
|
}
|
|
644
646
|
return map;
|
|
645
647
|
}
|
|
@@ -651,21 +653,22 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
651
653
|
const book = this.latestOrderbookByMarketId.get(marketId);
|
|
652
654
|
const bid = book?.bids[0]?.price;
|
|
653
655
|
const ask = book?.asks[0]?.price;
|
|
654
|
-
if (bid
|
|
655
|
-
return
|
|
656
|
+
if (bid === undefined || ask === undefined) {
|
|
657
|
+
return undefined;
|
|
656
658
|
}
|
|
657
|
-
|
|
659
|
+
const sum = (0, perps_sdk_1.safeAddDecimalString)(bid, ask);
|
|
660
|
+
return sum === undefined ? undefined : (0, perps_sdk_1.safeDivideDecimalString)(sum, '2');
|
|
658
661
|
}
|
|
659
662
|
handleL2Book(data) {
|
|
660
663
|
const book = {
|
|
661
664
|
provider: this.providerKey,
|
|
662
665
|
marketId: data.coin,
|
|
663
666
|
bids: data.levels[0]
|
|
664
|
-
.
|
|
665
|
-
.
|
|
667
|
+
.flatMap((l) => toOrderbookLevel(data.coin, l.px, l.sz))
|
|
668
|
+
.slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE),
|
|
666
669
|
asks: data.levels[1]
|
|
667
|
-
.
|
|
668
|
-
.
|
|
670
|
+
.flatMap((l) => toOrderbookLevel(data.coin, l.px, l.sz))
|
|
671
|
+
.slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE),
|
|
669
672
|
timestamp: data.time,
|
|
670
673
|
};
|
|
671
674
|
this.latestOrderbookByMarketId.set(data.coin, book);
|
|
@@ -697,8 +700,8 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
697
700
|
const book = {
|
|
698
701
|
provider: this.providerKey,
|
|
699
702
|
marketId: delta.c,
|
|
700
|
-
bids: applyCompressedL2Side(previous.bids, delta.l[0], delta.r?.[0] ?? [], 'bid'),
|
|
701
|
-
asks: applyCompressedL2Side(previous.asks, delta.l[1], delta.r?.[1] ?? [], 'ask'),
|
|
703
|
+
bids: applyCompressedL2Side(delta.c, previous.bids, delta.l[0], delta.r?.[0] ?? [], 'bid'),
|
|
704
|
+
asks: applyCompressedL2Side(delta.c, previous.asks, delta.l[1], delta.r?.[1] ?? [], 'ask'),
|
|
702
705
|
timestamp: delta.t,
|
|
703
706
|
};
|
|
704
707
|
this.latestOrderbookByMarketId.set(delta.c, book);
|
|
@@ -761,39 +764,25 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
761
764
|
if (epoch !== this.orderUpdatesEpoch || key !== this.orderUpdatesKey) {
|
|
762
765
|
return;
|
|
763
766
|
}
|
|
767
|
+
const user = key.slice('orderUpdates:'.length);
|
|
764
768
|
const mapped = await Promise.all(data.map(async (update) => {
|
|
765
769
|
const basic = update.order;
|
|
766
|
-
if ((0, index_js_2.assetIsOutcome)(basic.coin)
|
|
770
|
+
if ((0, index_js_2.assetIsOutcome)(basic.coin) ||
|
|
771
|
+
this.registry?.get(basic.coin) === undefined) {
|
|
767
772
|
return undefined;
|
|
768
773
|
}
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
774
|
+
let detail;
|
|
775
|
+
try {
|
|
776
|
+
detail = await this.readOrderDetail(user, client, update);
|
|
772
777
|
}
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
throw new perps_sdk_1.PerpsError(perps_types_1.PerpsErrorCode.OrderNotFound, `Hyperliquid order metadata not found: ${basic.oid}`);
|
|
778
|
+
catch (error) {
|
|
779
|
+
if (!(error instanceof perps_sdk_1.PerpsError)) {
|
|
780
|
+
throw error;
|
|
781
|
+
}
|
|
782
|
+
perps_sdk_1.wsLog.droppedRow(this.providerKey, 'order', `${basic.oid}: ${error.message}`);
|
|
783
|
+
return undefined;
|
|
780
784
|
}
|
|
781
|
-
|
|
782
|
-
status: update.status,
|
|
783
|
-
statusTimestamp: update.statusTimestamp,
|
|
784
|
-
order: {
|
|
785
|
-
...response.order.order,
|
|
786
|
-
coin: basic.coin,
|
|
787
|
-
side: basic.side,
|
|
788
|
-
limitPx: basic.limitPx,
|
|
789
|
-
sz: basic.sz,
|
|
790
|
-
oid: basic.oid,
|
|
791
|
-
timestamp: basic.timestamp,
|
|
792
|
-
origSz: basic.origSz,
|
|
793
|
-
cloid: basic.cloid ?? response.order.order.cloid,
|
|
794
|
-
},
|
|
795
|
-
};
|
|
796
|
-
return (0, index_js_2.mapOrder)(detail, market);
|
|
785
|
+
return (0, mapOrder_js_1.mapOrderRow)(basic.coin, this.registry, (resolved) => (0, index_js_2.mapOrder)(detail, resolved));
|
|
797
786
|
}));
|
|
798
787
|
if (epoch !== this.orderUpdatesEpoch || key !== this.orderUpdatesKey) {
|
|
799
788
|
return;
|
|
@@ -812,6 +801,28 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
812
801
|
this.emit(key, { channel: 'orderUpdates', data: { orders, terminated } });
|
|
813
802
|
});
|
|
814
803
|
}
|
|
804
|
+
async readOrderDetail(user, client, update) {
|
|
805
|
+
const basic = update.order;
|
|
806
|
+
const response = await (0, index_js_2.infoRequest)(this.orderApiUrl, { type: 'orderStatus', user, oid: basic.oid }, (0, index_js_2.hlInfoOptions)(client));
|
|
807
|
+
if (response.status !== 'order') {
|
|
808
|
+
throw new perps_sdk_1.PerpsError(perps_types_1.PerpsErrorCode.OrderNotFound, `Hyperliquid order metadata not found: ${basic.oid}`);
|
|
809
|
+
}
|
|
810
|
+
return {
|
|
811
|
+
status: update.status,
|
|
812
|
+
statusTimestamp: update.statusTimestamp,
|
|
813
|
+
order: {
|
|
814
|
+
...response.order.order,
|
|
815
|
+
coin: basic.coin,
|
|
816
|
+
side: basic.side,
|
|
817
|
+
limitPx: basic.limitPx,
|
|
818
|
+
sz: basic.sz,
|
|
819
|
+
oid: basic.oid,
|
|
820
|
+
timestamp: basic.timestamp,
|
|
821
|
+
origSz: basic.origSz,
|
|
822
|
+
cloid: basic.cloid ?? response.order.order.cloid,
|
|
823
|
+
},
|
|
824
|
+
};
|
|
825
|
+
}
|
|
815
826
|
handleUserFills(data) {
|
|
816
827
|
const items = data.isSnapshot
|
|
817
828
|
? []
|
|
@@ -820,7 +831,8 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
820
831
|
return [];
|
|
821
832
|
}
|
|
822
833
|
const market = this.registry?.get(f.coin);
|
|
823
|
-
|
|
834
|
+
const mapped = market && (0, index_js_2.mapFill)(f, market);
|
|
835
|
+
return mapped ? [mapped] : [];
|
|
824
836
|
});
|
|
825
837
|
this.emit(`userFills:${data.user.toLowerCase()}`, {
|
|
826
838
|
channel: 'fills',
|
|
@@ -834,9 +846,10 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
834
846
|
return [];
|
|
835
847
|
}
|
|
836
848
|
const market = this.registry?.get(ap.position.coin);
|
|
837
|
-
|
|
838
|
-
?
|
|
839
|
-
:
|
|
849
|
+
const position = market === undefined
|
|
850
|
+
? undefined
|
|
851
|
+
: (0, index_js_2.mapPosition)(ap, (0, perps_sdk_1.toPerpsMarketDisplay)(market));
|
|
852
|
+
return position === undefined ? [] : [position];
|
|
840
853
|
}));
|
|
841
854
|
this.emit(`positions:${data.user.toLowerCase()}`, {
|
|
842
855
|
channel: 'positions',
|
|
@@ -844,16 +857,13 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
844
857
|
});
|
|
845
858
|
const { accountValue, marginUsed } = (0, index_js_2.perpsTotals)(data.clearinghouseStates.map(([, state]) => state));
|
|
846
859
|
const key = data.user.toLowerCase();
|
|
847
|
-
this.latestPerpsByUser.set(key, {
|
|
848
|
-
positions,
|
|
849
|
-
marginUsed: marginUsed.toFixed(),
|
|
850
|
-
});
|
|
860
|
+
this.latestPerpsByUser.set(key, { positions, marginUsed });
|
|
851
861
|
this.emitUnifiedSummary(key);
|
|
852
862
|
this.emitSummaryIfModeAllows(data.user, {
|
|
853
|
-
portfolioValue: accountValue
|
|
854
|
-
availableMargin:
|
|
855
|
-
marginUsed
|
|
856
|
-
unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(positions)
|
|
863
|
+
portfolioValue: accountValue,
|
|
864
|
+
availableMargin: (0, perps_sdk_1.subtractDecimalString)(accountValue, marginUsed),
|
|
865
|
+
marginUsed,
|
|
866
|
+
unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(positions),
|
|
857
867
|
});
|
|
858
868
|
}
|
|
859
869
|
static summaryComputableFor(mode) {
|
|
@@ -937,14 +947,14 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
937
947
|
const portfolioValue = [
|
|
938
948
|
...pipeline.spot.collateralBalances,
|
|
939
949
|
...pipeline.spot.balances,
|
|
940
|
-
].reduce((sum, balance) =>
|
|
950
|
+
].reduce((sum, balance) => (0, perps_sdk_1.addDecimalString)(sum, (0, perps_sdk_1.unknownToDecimalString)(balance.valueUsd, 'spotBalance.valueUsd', this.providerKey)), '0');
|
|
941
951
|
this.emit(`accountSummary:${key}`, {
|
|
942
952
|
channel: 'accountSummary',
|
|
943
953
|
data: {
|
|
944
|
-
portfolioValue
|
|
954
|
+
portfolioValue,
|
|
945
955
|
availableMargin: pipeline.availableMargin,
|
|
946
956
|
marginUsed: perps.marginUsed,
|
|
947
|
-
unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(perps.positions)
|
|
957
|
+
unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(perps.positions),
|
|
948
958
|
},
|
|
949
959
|
});
|
|
950
960
|
}
|
|
@@ -1056,23 +1066,26 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
1056
1066
|
}
|
|
1057
1067
|
const markets = this.registry?.activeMarkets ?? [];
|
|
1058
1068
|
const priceById = (0, index_js_2.spotPriceById)(markets, this.mergedMids());
|
|
1059
|
-
const balances = data.spotState.balances
|
|
1060
|
-
(0,
|
|
1069
|
+
const balances = data.spotState.balances
|
|
1070
|
+
.filter((balance) => !(0, index_js_2.assetIsOutcome)(balance.coin))
|
|
1071
|
+
.filter((balance) => (0, perps_sdk_1.safeIsDecimalStringGreaterThan)(balance.total, '0') === true)
|
|
1072
|
+
.map((balance) => ({ balance, total: balance.total }));
|
|
1061
1073
|
const pipeline = this.unifiedSummaryByUser.get(user);
|
|
1062
|
-
if (balances.some((balance) =>
|
|
1074
|
+
if (balances.some(({ balance }) => {
|
|
1075
|
+
const price = priceById.get(String(balance.token));
|
|
1076
|
+
return price !== undefined && (0, perps_sdk_1.isDecimalStringZero)(price);
|
|
1077
|
+
})) {
|
|
1063
1078
|
if (pipeline !== undefined) {
|
|
1064
1079
|
pipeline.spot = undefined;
|
|
1065
1080
|
}
|
|
1066
1081
|
return;
|
|
1067
1082
|
}
|
|
1068
|
-
const rows = balances.map((balance) => {
|
|
1069
|
-
const
|
|
1083
|
+
const rows = balances.map(({ balance, total }) => {
|
|
1084
|
+
const free = (0, perps_sdk_1.safeSubtractDecimalString)(total, balance.hold);
|
|
1070
1085
|
return {
|
|
1071
|
-
...(0, index_js_2.spotBalance)((0, index_js_2.spotAssetFromToken)(balance),
|
|
1086
|
+
...(0, index_js_2.spotBalance)((0, index_js_2.spotAssetFromToken)(balance), total, priceById),
|
|
1072
1087
|
locked: balance.hold,
|
|
1073
|
-
transferable: (0, perps_sdk_1.calculateTransferable)(total
|
|
1074
|
-
.minus((0, decimal_js_1.toWireBig)(balance.hold, 'spotState.balances.hold'))
|
|
1075
|
-
.toFixed(), total.toFixed()),
|
|
1088
|
+
transferable: free === undefined ? '0' : (0, perps_sdk_1.calculateTransferable)(free, total),
|
|
1076
1089
|
};
|
|
1077
1090
|
});
|
|
1078
1091
|
this.emit(`spotState:${user}`, {
|
|
@@ -1112,29 +1125,20 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
|
|
|
1112
1125
|
}
|
|
1113
1126
|
exports.HyperliquidWsProvider = HyperliquidWsProvider;
|
|
1114
1127
|
const isObject = (v) => typeof v === 'object' && v !== null;
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
return
|
|
1120
|
-
}
|
|
1128
|
+
function wsFigureToDecimalString(value) {
|
|
1129
|
+
return typeof value === 'number' ? (0, perps_sdk_1.safeNumberToDecimalString)(value) : value;
|
|
1130
|
+
}
|
|
1131
|
+
function optionalWsFigureToDecimalString(value) {
|
|
1132
|
+
return value == null ? undefined : wsFigureToDecimalString(value);
|
|
1133
|
+
}
|
|
1121
1134
|
const toMarketCapString = (price, circulatingSupply) => {
|
|
1122
|
-
const
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
}
|
|
1127
|
-
try {
|
|
1128
|
-
const parsedPrice = new big_js_1.default(priceString);
|
|
1129
|
-
const parsedSupply = new big_js_1.default(supplyString);
|
|
1130
|
-
if (parsedPrice.lte(0) || parsedSupply.lte(0)) {
|
|
1131
|
-
return undefined;
|
|
1132
|
-
}
|
|
1133
|
-
return parsedPrice.times(parsedSupply).toFixed();
|
|
1134
|
-
}
|
|
1135
|
-
catch {
|
|
1135
|
+
const supply = optionalWsFigureToDecimalString(circulatingSupply);
|
|
1136
|
+
if (supply === undefined ||
|
|
1137
|
+
(0, perps_sdk_1.safeIsDecimalStringGreaterThan)(price, '0') !== true ||
|
|
1138
|
+
(0, perps_sdk_1.safeIsDecimalStringGreaterThan)(supply, '0') !== true) {
|
|
1136
1139
|
return undefined;
|
|
1137
1140
|
}
|
|
1141
|
+
return (0, perps_sdk_1.safeMultiplyDecimalString)(price, supply);
|
|
1138
1142
|
};
|
|
1139
1143
|
function mergePerpAssetCtx(previous, marketId, update) {
|
|
1140
1144
|
const funding = update.funding ?? previous?.funding;
|
|
@@ -1168,15 +1172,13 @@ function allDexsAssetCtxEntries(data) {
|
|
|
1168
1172
|
return data.assetCtxs ?? data.ctxs ?? [];
|
|
1169
1173
|
}
|
|
1170
1174
|
function activePerpAssetCtx(marketId, ctx) {
|
|
1171
|
-
const funding =
|
|
1172
|
-
const openInterest =
|
|
1173
|
-
const dayNtlVlm =
|
|
1174
|
-
const prevDayPx =
|
|
1175
|
-
const markPx =
|
|
1176
|
-
const midPx = ctx.midPx
|
|
1177
|
-
|
|
1178
|
-
: (toMarketContextString(ctx.midPx) ?? null);
|
|
1179
|
-
const oraclePx = toMarketContextString(ctx.oraclePx);
|
|
1175
|
+
const funding = optionalWsFigureToDecimalString(ctx.funding);
|
|
1176
|
+
const openInterest = optionalWsFigureToDecimalString(ctx.openInterest);
|
|
1177
|
+
const dayNtlVlm = optionalWsFigureToDecimalString(ctx.dayNtlVlm);
|
|
1178
|
+
const prevDayPx = optionalWsFigureToDecimalString(ctx.prevDayPx);
|
|
1179
|
+
const markPx = optionalWsFigureToDecimalString(ctx.markPx);
|
|
1180
|
+
const midPx = optionalWsFigureToDecimalString(ctx.midPx) ?? null;
|
|
1181
|
+
const oraclePx = optionalWsFigureToDecimalString(ctx.oraclePx);
|
|
1180
1182
|
if (funding === undefined ||
|
|
1181
1183
|
openInterest === undefined ||
|
|
1182
1184
|
dayNtlVlm === undefined ||
|
|
@@ -1197,8 +1199,8 @@ function activePerpAssetCtx(marketId, ctx) {
|
|
|
1197
1199
|
};
|
|
1198
1200
|
}
|
|
1199
1201
|
function mapSpotMarketContext(marketId, ctx, fast) {
|
|
1200
|
-
const midPrice =
|
|
1201
|
-
const markPrice =
|
|
1202
|
+
const midPrice = optionalWsFigureToDecimalString(ctx.midPx ?? ctx.markPx);
|
|
1203
|
+
const markPrice = optionalWsFigureToDecimalString(ctx.markPx);
|
|
1202
1204
|
if (midPrice === undefined || markPrice === undefined) {
|
|
1203
1205
|
return undefined;
|
|
1204
1206
|
}
|
|
@@ -1207,18 +1209,40 @@ function mapSpotMarketContext(marketId, ctx, fast) {
|
|
|
1207
1209
|
marketId,
|
|
1208
1210
|
midPrice: fast?.midPx != null ? fast.midPx : midPrice,
|
|
1209
1211
|
markPrice: emittedMarkPrice,
|
|
1210
|
-
prevDayPrice:
|
|
1211
|
-
volume24h:
|
|
1212
|
+
prevDayPrice: optionalWsFigureToDecimalString(ctx.prevDayPx),
|
|
1213
|
+
volume24h: optionalWsFigureToDecimalString(ctx.dayNtlVlm),
|
|
1212
1214
|
marketCap: toMarketCapString(emittedMarkPrice, ctx.circulatingSupply),
|
|
1213
1215
|
};
|
|
1214
1216
|
}
|
|
1217
|
+
const BOOK_LEVEL_ROW = 'order book level';
|
|
1218
|
+
function bookLevelPrice(marketId, price) {
|
|
1219
|
+
if (!(0, perps_sdk_1.isDecimalString)(price)) {
|
|
1220
|
+
perps_sdk_1.wsLog.skippedRow(constants_js_1.PROVIDER_KEY, BOOK_LEVEL_ROW, 'price', price, marketId);
|
|
1221
|
+
return undefined;
|
|
1222
|
+
}
|
|
1223
|
+
return price;
|
|
1224
|
+
}
|
|
1225
|
+
function bookLevelSize(marketId, size) {
|
|
1226
|
+
if (!(0, perps_sdk_1.isDecimalString)(size)) {
|
|
1227
|
+
perps_sdk_1.wsLog.skippedRow(constants_js_1.PROVIDER_KEY, BOOK_LEVEL_ROW, 'size', size, marketId);
|
|
1228
|
+
return undefined;
|
|
1229
|
+
}
|
|
1230
|
+
return size;
|
|
1231
|
+
}
|
|
1232
|
+
function toOrderbookLevel(marketId, price, size) {
|
|
1233
|
+
const levelPrice = bookLevelPrice(marketId, price);
|
|
1234
|
+
const levelSize = levelPrice === undefined ? undefined : bookLevelSize(marketId, size);
|
|
1235
|
+
return levelPrice === undefined || levelSize === undefined
|
|
1236
|
+
? []
|
|
1237
|
+
: [{ price: levelPrice, size: levelSize }];
|
|
1238
|
+
}
|
|
1215
1239
|
function compactRemovalPrice(levels, value) {
|
|
1216
1240
|
if (typeof value === 'number') {
|
|
1217
1241
|
return levels[value]?.price;
|
|
1218
1242
|
}
|
|
1219
1243
|
return typeof value === 'string' ? value : value.p;
|
|
1220
1244
|
}
|
|
1221
|
-
function applyCompressedL2Side(previous, updates, removals, side) {
|
|
1245
|
+
function applyCompressedL2Side(marketId, previous, updates, removals, side) {
|
|
1222
1246
|
const byPrice = new Map(previous.map((level) => [level.price, level.size]));
|
|
1223
1247
|
for (const removal of removals) {
|
|
1224
1248
|
const price = compactRemovalPrice(previous, removal);
|
|
@@ -1227,18 +1251,23 @@ function applyCompressedL2Side(previous, updates, removals, side) {
|
|
|
1227
1251
|
}
|
|
1228
1252
|
}
|
|
1229
1253
|
for (const update of updates) {
|
|
1230
|
-
|
|
1231
|
-
|
|
1254
|
+
const price = bookLevelPrice(marketId, update.p);
|
|
1255
|
+
if (price === undefined) {
|
|
1256
|
+
continue;
|
|
1257
|
+
}
|
|
1258
|
+
const size = bookLevelSize(marketId, update.s);
|
|
1259
|
+
if (size === undefined || (0, perps_sdk_1.safeIsDecimalStringZero)(size) !== false) {
|
|
1260
|
+
byPrice.delete(price);
|
|
1232
1261
|
}
|
|
1233
1262
|
else {
|
|
1234
|
-
byPrice.set(
|
|
1263
|
+
byPrice.set(price, size);
|
|
1235
1264
|
}
|
|
1236
1265
|
}
|
|
1237
1266
|
return [...byPrice.entries()]
|
|
1238
1267
|
.map(([price, size]) => ({ price, size }))
|
|
1239
1268
|
.sort((a, b) => side === 'bid'
|
|
1240
|
-
?
|
|
1241
|
-
:
|
|
1269
|
+
? (0, perps_sdk_1.compareDecimalStrings)(b.price, a.price)
|
|
1270
|
+
: (0, perps_sdk_1.compareDecimalStrings)(a.price, b.price))
|
|
1242
1271
|
.slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE);
|
|
1243
1272
|
}
|
|
1244
1273
|
function isValidHlFrame(channel, data) {
|