@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotBalance.d.ts","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spotBalance.d.ts","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,SAAS,MAAM,EAAE,EAC1B,iBAAiB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,KAClD,GAAG,CAAC,MAAM,EAAE,aAAa,CAc3B,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,aAAa,KAAG,KAIpD,CAAA;AAEF,qIAAqI;AACrI,eAAO,MAAM,WAAW,GACtB,OAAO,KAAK,EACZ,OAAO,aAAa,EACpB,WAAW,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,KAC5C,OAUF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotCollateral.d.ts","sourceRoot":"","sources":["../../../src/utils/spotCollateral.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spotCollateral.d.ts","sourceRoot":"","sources":["../../../src/utils/spotCollateral.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAGhD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,OAAO,EAAE,CAAA;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,cAAc,SAAS,OAAO,EAAE,EAChC,eAAe,WAAW,CAAC,MAAM,CAAC,KACjC,aAuBF,CAAA"}
|
|
@@ -10,7 +10,8 @@ import { type DecimalString, type Position } from '@lifi/perps-types';
|
|
|
10
10
|
* margin adjustment; `'0'` for add-only strict-isolated markets and when
|
|
11
11
|
* nothing is removable.
|
|
12
12
|
* @throws {PerpsError} `ValidationError` when a required `Position` decimal
|
|
13
|
-
* is malformed, or when a size, price or requirement is not
|
|
13
|
+
* is absent or malformed, or when a size, price or requirement is not
|
|
14
|
+
* positive.
|
|
14
15
|
* @see https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margining
|
|
15
16
|
* @public
|
|
16
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferMargin.d.ts","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transferMargin.d.ts","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAA;AAkC1B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,GACjB,aAAa,GAAG,SAAS,CA4B3B"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { HyperliquidMarginSummary, Position } from '@lifi/perps-types';
|
|
2
|
-
import Big from 'big.js';
|
|
1
|
+
import type { DecimalString, HyperliquidMarginSummary, Position } from '@lifi/perps-types';
|
|
3
2
|
/**
|
|
4
3
|
* One perps sub-dex entry {@link perpsTotals} reads. The REST response always
|
|
5
4
|
* carries `marginSummary`; a WebSocket frame may omit it.
|
|
@@ -12,15 +11,17 @@ export interface DexMarginSummary {
|
|
|
12
11
|
* Sum the venue `marginSummary` totals over every perps sub-dex of an
|
|
13
12
|
* account. `accountValue` is total equity, so it already carries locked
|
|
14
13
|
* margin and unrealized PnL. An entry without a `marginSummary` adds nothing.
|
|
14
|
+
* @throws {PerpsError} `SDKError` when a venue figure is not a decimal.
|
|
15
15
|
* @public
|
|
16
16
|
*/
|
|
17
17
|
export declare const perpsTotals: (dexStates: readonly DexMarginSummary[]) => {
|
|
18
|
-
accountValue:
|
|
19
|
-
marginUsed:
|
|
18
|
+
accountValue: DecimalString;
|
|
19
|
+
marginUsed: DecimalString;
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
|
-
* Sum the unrealized PnL of every position, in quote-asset units.
|
|
22
|
+
* Sum the unrealized PnL of every position, in quote-asset units. A term that
|
|
23
|
+
* does not match the decimal pattern adds nothing and warns once.
|
|
23
24
|
* @public
|
|
24
25
|
*/
|
|
25
|
-
export declare const sumUnrealizedPnl: (positions: readonly Position[]) =>
|
|
26
|
+
export declare const sumUnrealizedPnl: (positions: readonly Position[]) => DecimalString;
|
|
26
27
|
//# sourceMappingURL=venueTotals.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"venueTotals.d.ts","sourceRoot":"","sources":["../../../src/utils/venueTotals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"venueTotals.d.ts","sourceRoot":"","sources":["../../../src/utils/venueTotals.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,aAAa,EACb,wBAAwB,EACxB,QAAQ,EACT,MAAM,mBAAmB,CAAA;AAG1B;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,wBAAwB,CAAA;CACzC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,SAAS,gBAAgB,EAAE,KACrC;IAAE,YAAY,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAyB1D,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,SAAS,QAAQ,EAAE,KAC7B,aAaF,CAAA"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { type ProviderWithdrawableBalance } from '@lifi/perps-sdk';
|
|
2
2
|
import type { HlAbstractionMode, HlClearinghouseState, HlSpotClearinghouseState } from '../types/index.js';
|
|
3
3
|
/**
|
|
4
|
-
* Split a Hyperliquid account's venue figures into the
|
|
5
|
-
* draws on. A unified or portfolio-margin account holds its collateral in spot,
|
|
4
|
+
* Split a Hyperliquid account's venue figures into the categories a
|
|
5
|
+
* withdrawal draws on. A unified or portfolio-margin account holds its collateral in spot,
|
|
6
6
|
* so each spot token adds the part of `total` that no order or margin holds. A
|
|
7
|
-
*
|
|
7
|
+
* category with nothing left to draw carries no row, and the caller applies the
|
|
8
8
|
* per-asset venue minimum.
|
|
9
9
|
*
|
|
10
|
-
* @param quoteAssetId - `Asset.id` the perps-
|
|
10
|
+
* @param quoteAssetId - `Asset.id` the perps-category row is keyed by.
|
|
11
11
|
* @param withdrawalFee - Flat venue fee in quote-asset units, set on every
|
|
12
12
|
* quote-asset row. Hyperliquid deducts it from the requested amount. Absent
|
|
13
13
|
* leaves every row without a fee.
|
|
14
|
+
* @throws {PerpsError} `SDKError` when the fee or a venue figure does not match the
|
|
15
|
+
* decimal pattern.
|
|
14
16
|
* @public
|
|
15
17
|
*/
|
|
16
18
|
export declare const hyperliquidWithdrawableBalances: (abstraction: HlAbstractionMode | null, state: HlClearinghouseState, spotState: HlSpotClearinghouseState, quoteAssetId: string, withdrawalFee?: string) => ProviderWithdrawableBalance[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,2BAA2B,EAGjC,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAI1B;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,+BAA+B,GAC1C,aAAa,iBAAiB,GAAG,IAAI,EACrC,OAAO,oBAAoB,EAC3B,WAAW,wBAAwB,EACnC,cAAc,MAAM,EACpB,gBAAgB,MAAM,KACrB,2BAA2B,EA2D7B,CAAA"}
|
|
@@ -114,6 +114,8 @@ export declare class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
114
114
|
private handleActiveAssetCtx;
|
|
115
115
|
private handleActiveSpotAssetCtx;
|
|
116
116
|
/** Latest mid per `Market.id` across asset-context and fast feeds. */
|
|
117
|
+
/** Latest mid per `Market.id` across asset-context and fast feeds; a mid
|
|
118
|
+
* that does not match the decimal pattern is left out. */
|
|
117
119
|
private mergedMids;
|
|
118
120
|
private orderbookReferencePrice;
|
|
119
121
|
private handleL2Book;
|
|
@@ -123,6 +125,7 @@ export declare class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
123
125
|
private handleCandle;
|
|
124
126
|
private handleTrades;
|
|
125
127
|
private handleOrderUpdates;
|
|
128
|
+
private readOrderDetail;
|
|
126
129
|
private handleUserFills;
|
|
127
130
|
private handleAllDexsClearinghouseState;
|
|
128
131
|
/** Whether the mode's collateral lives per-dex, making the perps-only
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HyperliquidWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/HyperliquidWsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"HyperliquidWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/HyperliquidWsProvider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/perps-sdk-provider-hyperliquid",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "27.0.0",
|
|
4
4
|
"description": "Hyperliquid provider plugin for @lifi/perps-sdk",
|
|
5
5
|
"homepage": "https://github.com/lifinance/perps-sdk",
|
|
6
6
|
"bugs": {
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"big.js": "^7.0.1",
|
|
51
51
|
"viem": "^2.55.18",
|
|
52
|
-
"@lifi/perps-types": "^
|
|
52
|
+
"@lifi/perps-types": "^22.0.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"@lifi/perps-sdk": "^
|
|
55
|
+
"@lifi/perps-sdk": "^25.0.0"
|
|
56
56
|
},
|
|
57
57
|
"publishConfig": {
|
|
58
58
|
"access": "public"
|
|
@@ -479,7 +479,7 @@ export function hyperliquidProvider(
|
|
|
479
479
|
estimateLiquidationPrice: (
|
|
480
480
|
market: PerpsMarket,
|
|
481
481
|
params: LiquidationEstimateParams
|
|
482
|
-
):
|
|
482
|
+
): string | undefined =>
|
|
483
483
|
calculateLiquidationPrice(
|
|
484
484
|
params.entryPrice,
|
|
485
485
|
params.leverage,
|
package/src/accountSummary.ts
CHANGED
|
@@ -1,21 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
addDecimalString,
|
|
3
|
+
PerpsError,
|
|
4
|
+
subtractDecimalString,
|
|
5
|
+
unknownToDecimalString,
|
|
6
|
+
} from '@lifi/perps-sdk'
|
|
2
7
|
import type {
|
|
3
8
|
AccountResponse,
|
|
4
9
|
AccountSummary,
|
|
5
10
|
Balance,
|
|
11
|
+
DecimalString,
|
|
6
12
|
HyperliquidAccountConfig,
|
|
7
13
|
Position,
|
|
8
14
|
} from '@lifi/perps-types'
|
|
9
15
|
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
10
|
-
import
|
|
16
|
+
import { PROVIDER_KEY } from './constants.js'
|
|
11
17
|
import { isUnifiedAbstraction } from './utils/abstractionMode.js'
|
|
12
|
-
import { toWireBig } from './utils/decimal.js'
|
|
13
18
|
import { perpsTotals, sumUnrealizedPnl } from './utils/venueTotals.js'
|
|
14
19
|
|
|
15
|
-
const sumValueUsd = (balances: readonly Balance[]):
|
|
20
|
+
const sumValueUsd = (balances: readonly Balance[]): DecimalString =>
|
|
16
21
|
balances.reduce(
|
|
17
|
-
(sum, balance) =>
|
|
18
|
-
|
|
22
|
+
(sum, balance) =>
|
|
23
|
+
addDecimalString(
|
|
24
|
+
sum,
|
|
25
|
+
unknownToDecimalString(
|
|
26
|
+
balance.valueUsd,
|
|
27
|
+
'balance.valueUsd',
|
|
28
|
+
PROVIDER_KEY
|
|
29
|
+
)
|
|
30
|
+
),
|
|
31
|
+
'0'
|
|
19
32
|
)
|
|
20
33
|
|
|
21
34
|
const hyperliquidConfig = (
|
|
@@ -32,11 +45,11 @@ const hyperliquidConfig = (
|
|
|
32
45
|
|
|
33
46
|
const getAvailableMargin = (
|
|
34
47
|
config: HyperliquidAccountConfig,
|
|
35
|
-
accountValue:
|
|
36
|
-
marginUsed:
|
|
37
|
-
):
|
|
48
|
+
accountValue: DecimalString,
|
|
49
|
+
marginUsed: DecimalString
|
|
50
|
+
): DecimalString => {
|
|
38
51
|
if (!isUnifiedAbstraction(config.abstractionMode)) {
|
|
39
|
-
return accountValue
|
|
52
|
+
return subtractDecimalString(accountValue, marginUsed)
|
|
40
53
|
}
|
|
41
54
|
if (config.availableAfterMaintenance === undefined) {
|
|
42
55
|
throw new PerpsError(
|
|
@@ -44,9 +57,10 @@ const getAvailableMargin = (
|
|
|
44
57
|
`Hyperliquid '${config.abstractionMode}' account carries no quote-asset entry in \`tokenToAvailableAfterMaintenance\``
|
|
45
58
|
)
|
|
46
59
|
}
|
|
47
|
-
return
|
|
60
|
+
return unknownToDecimalString(
|
|
48
61
|
config.availableAfterMaintenance,
|
|
49
|
-
'tokenToAvailableAfterMaintenance'
|
|
62
|
+
'tokenToAvailableAfterMaintenance',
|
|
63
|
+
PROVIDER_KEY
|
|
50
64
|
)
|
|
51
65
|
}
|
|
52
66
|
|
|
@@ -55,7 +69,8 @@ const getAvailableMargin = (
|
|
|
55
69
|
* {@link AccountSummary}, from the venue figures the response carries.
|
|
56
70
|
*
|
|
57
71
|
* @throws {PerpsError} `SDKError` when the account is not a Hyperliquid one,
|
|
58
|
-
*
|
|
72
|
+
* when a unified/portfolio-margin account carries no venue buying power, or
|
|
73
|
+
* when a summed venue figure is not a decimal.
|
|
59
74
|
* @public
|
|
60
75
|
*/
|
|
61
76
|
export function getAccountSummary(
|
|
@@ -66,15 +81,12 @@ export function getAccountSummary(
|
|
|
66
81
|
const { accountValue, marginUsed } = perpsTotals(config.dexStates)
|
|
67
82
|
|
|
68
83
|
return {
|
|
69
|
-
portfolioValue:
|
|
70
|
-
|
|
71
|
-
.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
).toFixed(),
|
|
77
|
-
marginUsed: marginUsed.toFixed(),
|
|
78
|
-
unrealizedPnl: sumUnrealizedPnl(positions).toFixed(),
|
|
84
|
+
portfolioValue: addDecimalString(
|
|
85
|
+
sumValueUsd(account.collateralBalances),
|
|
86
|
+
sumValueUsd(account.balances)
|
|
87
|
+
),
|
|
88
|
+
availableMargin: getAvailableMargin(config, accountValue, marginUsed),
|
|
89
|
+
marginUsed,
|
|
90
|
+
unrealizedPnl: sumUnrealizedPnl(positions),
|
|
79
91
|
}
|
|
80
92
|
}
|
|
@@ -2,20 +2,23 @@ import {
|
|
|
2
2
|
calculateTransferable,
|
|
3
3
|
getMarketRegistry,
|
|
4
4
|
getMarketsContext,
|
|
5
|
+
isDecimalStringGreaterThan,
|
|
5
6
|
type ProviderGetAccountParams,
|
|
6
|
-
parseDecimal,
|
|
7
7
|
type SDKRequestOptions,
|
|
8
|
+
safeAddDecimalStrings,
|
|
9
|
+
subtractDecimalString,
|
|
8
10
|
toPerpsMarketDisplay,
|
|
11
|
+
unknownToDecimalString,
|
|
9
12
|
} from '@lifi/perps-sdk'
|
|
10
13
|
import type {
|
|
11
14
|
AccountResponse,
|
|
12
15
|
Asset,
|
|
13
16
|
Balance,
|
|
17
|
+
DecimalString,
|
|
14
18
|
HyperliquidAccountConfig,
|
|
15
19
|
HyperliquidDexAccountState,
|
|
16
20
|
Position,
|
|
17
21
|
} from '@lifi/perps-types'
|
|
18
|
-
import type Big from 'big.js'
|
|
19
22
|
import { PROVIDER_KEY } from '../constants.js'
|
|
20
23
|
import type { HyperliquidContext } from '../context.js'
|
|
21
24
|
import type {
|
|
@@ -26,16 +29,13 @@ import type {
|
|
|
26
29
|
HlUserFees,
|
|
27
30
|
} from '../types/index.js'
|
|
28
31
|
import { isUnifiedAbstraction } from '../utils/abstractionMode.js'
|
|
29
|
-
import { toWireBig } from '../utils/decimal.js'
|
|
30
32
|
import {
|
|
31
33
|
assetIsOutcome,
|
|
32
34
|
partitionSpotBalances,
|
|
33
35
|
perpsDexNames,
|
|
34
|
-
perpsTotals,
|
|
35
36
|
spotAssetFromToken,
|
|
36
37
|
spotBalance,
|
|
37
38
|
spotPriceById,
|
|
38
|
-
sumUnrealizedPnl,
|
|
39
39
|
} from '../utils/index.js'
|
|
40
40
|
import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
|
|
41
41
|
import { isOpenAssetPosition, mapPosition } from '../utils/mapPosition.js'
|
|
@@ -48,12 +48,6 @@ import { requireAccountExists } from './getAccountExists.js'
|
|
|
48
48
|
*/
|
|
49
49
|
export type GetAccountParams = ProviderGetAccountParams
|
|
50
50
|
|
|
51
|
-
// `marginSummary` covers the whole account (cross AND isolated positions);
|
|
52
|
-
// `crossMarginSummary` is the cross-only subset and would drop isolated
|
|
53
|
-
// equity/margin.
|
|
54
|
-
const getAccountValue = (state: HlClearinghouseState): Big =>
|
|
55
|
-
toWireBig(state.marginSummary.accountValue, 'marginSummary.accountValue')
|
|
56
|
-
|
|
57
51
|
/** Venue buying power for the quote asset the perps dex settles in. */
|
|
58
52
|
const getAvailableAfterMaintenance = (
|
|
59
53
|
spotState: HlSpotClearinghouseState,
|
|
@@ -73,21 +67,28 @@ const buildBalances = (
|
|
|
73
67
|
spotState: HlSpotClearinghouseState,
|
|
74
68
|
stateByDex: Map<string, HlClearinghouseState>,
|
|
75
69
|
quoteAssetIds: ReadonlySet<string>,
|
|
76
|
-
priceById:
|
|
70
|
+
priceById: ReadonlyMap<string, DecimalString>,
|
|
77
71
|
quoteAssetByCategory: Map<string, Asset>
|
|
78
72
|
): BalancePartition => {
|
|
79
73
|
const { balances, collateralBalances } = partitionSpotBalances(
|
|
80
74
|
spotState.balances
|
|
81
75
|
.filter((b) => !assetIsOutcome(b.coin))
|
|
82
76
|
.map((b) => {
|
|
83
|
-
const total =
|
|
77
|
+
const total = unknownToDecimalString(
|
|
78
|
+
b.total,
|
|
79
|
+
'spotClearinghouseState.total',
|
|
80
|
+
PROVIDER_KEY
|
|
81
|
+
)
|
|
82
|
+
const hold = unknownToDecimalString(
|
|
83
|
+
b.hold,
|
|
84
|
+
'spotClearinghouseState.hold',
|
|
85
|
+
PROVIDER_KEY
|
|
86
|
+
)
|
|
84
87
|
return {
|
|
85
|
-
...spotBalance(spotAssetFromToken(b),
|
|
88
|
+
...spotBalance(spotAssetFromToken(b), total, priceById),
|
|
86
89
|
transferable: calculateTransferable(
|
|
90
|
+
subtractDecimalString(total, hold),
|
|
87
91
|
total
|
|
88
|
-
.minus(toWireBig(b.hold, 'spotClearinghouseState.hold'))
|
|
89
|
-
.toFixed(),
|
|
90
|
-
total.toFixed()
|
|
91
92
|
),
|
|
92
93
|
}
|
|
93
94
|
}),
|
|
@@ -101,8 +102,15 @@ const buildBalances = (
|
|
|
101
102
|
if (!isUnifiedAbstraction(abstraction)) {
|
|
102
103
|
for (const [dex, state] of stateByDex) {
|
|
103
104
|
const categoryId = dex || PROVIDER_KEY
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
// `marginSummary` covers the whole account (cross AND isolated positions);
|
|
106
|
+
// `crossMarginSummary` is the cross-only subset and would drop isolated
|
|
107
|
+
// equity/margin.
|
|
108
|
+
const value = unknownToDecimalString(
|
|
109
|
+
state.marginSummary.accountValue,
|
|
110
|
+
'marginSummary.accountValue',
|
|
111
|
+
PROVIDER_KEY
|
|
112
|
+
)
|
|
113
|
+
if (!isDecimalStringGreaterThan(value, '0')) {
|
|
106
114
|
continue
|
|
107
115
|
}
|
|
108
116
|
collateralBalances.push({
|
|
@@ -110,15 +118,16 @@ const buildBalances = (
|
|
|
110
118
|
// Always present: every dex in `stateByDex` derives from `markets`,
|
|
111
119
|
// which is what populates `quoteAssetByCategory`.
|
|
112
120
|
asset: quoteAssetByCategory.get(categoryId)!,
|
|
113
|
-
units: value
|
|
114
|
-
valueUsd: value
|
|
121
|
+
units: value,
|
|
122
|
+
valueUsd: value,
|
|
115
123
|
price: '1',
|
|
116
124
|
transferable: calculateTransferable(
|
|
117
|
-
|
|
125
|
+
unknownToDecimalString(
|
|
118
126
|
state.withdrawable,
|
|
119
|
-
'clearinghouseState.withdrawable'
|
|
120
|
-
|
|
121
|
-
|
|
127
|
+
'clearinghouseState.withdrawable',
|
|
128
|
+
PROVIDER_KEY
|
|
129
|
+
),
|
|
130
|
+
value
|
|
122
131
|
),
|
|
123
132
|
})
|
|
124
133
|
}
|
|
@@ -209,9 +218,7 @@ export const getAccount = async (
|
|
|
209
218
|
|
|
210
219
|
const priceById = spotPriceById(
|
|
211
220
|
markets,
|
|
212
|
-
new Map(
|
|
213
|
-
prices.map((p) => [p.marketId, parseDecimal(p.markPrice) ?? Number.NaN])
|
|
214
|
-
)
|
|
221
|
+
new Map(prices.map((p) => [p.marketId, p.markPrice]))
|
|
215
222
|
)
|
|
216
223
|
|
|
217
224
|
const positions: Position[] = stateResults.flatMap((state) =>
|
|
@@ -219,12 +226,13 @@ export const getAccount = async (
|
|
|
219
226
|
.filter(
|
|
220
227
|
(ap) => !assetIsOutcome(ap.position.coin) && isOpenAssetPosition(ap)
|
|
221
228
|
)
|
|
222
|
-
.
|
|
223
|
-
mapPosition(
|
|
229
|
+
.flatMap((ap) => {
|
|
230
|
+
const position = mapPosition(
|
|
224
231
|
ap,
|
|
225
232
|
toPerpsMarketDisplay(registry.require(ap.position.coin))
|
|
226
233
|
)
|
|
227
|
-
|
|
234
|
+
return position === undefined ? [] : [position]
|
|
235
|
+
})
|
|
228
236
|
)
|
|
229
237
|
|
|
230
238
|
const stateByDex = new Map<string, HlClearinghouseState>()
|
|
@@ -266,14 +274,23 @@ export const getAccount = async (
|
|
|
266
274
|
quoteAssetByCategory
|
|
267
275
|
)
|
|
268
276
|
|
|
277
|
+
const marginUsed = safeAddDecimalStrings(
|
|
278
|
+
dexStates.flatMap(({ marginSummary }) =>
|
|
279
|
+
marginSummary === undefined ? [] : [marginSummary.totalMarginUsed]
|
|
280
|
+
)
|
|
281
|
+
)
|
|
282
|
+
const unrealizedPnl = safeAddDecimalStrings(
|
|
283
|
+
positions.map((position) => position.unrealizedPnl)
|
|
284
|
+
)
|
|
285
|
+
|
|
269
286
|
return {
|
|
270
287
|
provider: PROVIDER_KEY,
|
|
271
288
|
address: params.address,
|
|
272
289
|
balances,
|
|
273
290
|
collateralBalances,
|
|
274
291
|
positions,
|
|
275
|
-
marginUsed:
|
|
276
|
-
unrealizedPnl:
|
|
292
|
+
...(marginUsed === undefined ? {} : { marginUsed }),
|
|
293
|
+
...(unrealizedPnl === undefined ? {} : { unrealizedPnl }),
|
|
277
294
|
feeTier: {
|
|
278
295
|
maker: feesResult.userAddRate ?? '0',
|
|
279
296
|
taker: feesResult.userCrossRate ?? '0',
|
package/src/services/getFills.ts
CHANGED
|
@@ -67,7 +67,8 @@ export const getFills = async (
|
|
|
67
67
|
return []
|
|
68
68
|
}
|
|
69
69
|
const market = registry.get(fill.coin)
|
|
70
|
-
|
|
70
|
+
const mapped = market && mapFill(fill, market)
|
|
71
|
+
return mapped ? [mapped] : []
|
|
71
72
|
})
|
|
72
73
|
return { items, saturated: false }
|
|
73
74
|
},
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
numberToDecimalString,
|
|
3
|
+
PerpsError,
|
|
4
|
+
type SDKRequestOptions,
|
|
5
|
+
} from '@lifi/perps-sdk'
|
|
2
6
|
import {
|
|
3
7
|
MarginMode,
|
|
4
8
|
type MarketRef,
|
|
@@ -66,6 +70,6 @@ export const getMarketSettings = async (
|
|
|
66
70
|
return {
|
|
67
71
|
marginMode:
|
|
68
72
|
leverage.type === 'isolated' ? MarginMode.ISOLATED : MarginMode.CROSS,
|
|
69
|
-
leverage: leverage.value,
|
|
73
|
+
leverage: numberToDecimalString(leverage.value),
|
|
70
74
|
}
|
|
71
75
|
}
|
package/src/services/getOrder.ts
CHANGED
|
@@ -24,6 +24,15 @@ import { requireAccountExists } from './getAccountExists.js'
|
|
|
24
24
|
*/
|
|
25
25
|
export type GetOrderParams = ProviderGetOrderParams
|
|
26
26
|
|
|
27
|
+
const orderNotFound = (id: string): PerpsError => {
|
|
28
|
+
const err = new PerpsError(
|
|
29
|
+
PerpsErrorCode.OrderNotFound,
|
|
30
|
+
`Order not found: ${id}`
|
|
31
|
+
)
|
|
32
|
+
err.tool = PROVIDER_KEY
|
|
33
|
+
return err
|
|
34
|
+
}
|
|
35
|
+
|
|
27
36
|
/**
|
|
28
37
|
* Read getOrder direct from the Hyperliquid REST API.
|
|
29
38
|
*
|
|
@@ -70,17 +79,16 @@ export const getOrder = async (
|
|
|
70
79
|
if (twap !== undefined) {
|
|
71
80
|
const registry = getMarketRegistry(client, PROVIDER_KEY)
|
|
72
81
|
await registry.sync()
|
|
73
|
-
|
|
82
|
+
const order = mapOrder(twap, registry.require(twap.state.coin))
|
|
83
|
+
if (order === undefined) {
|
|
84
|
+
throw orderNotFound(params.id)
|
|
85
|
+
}
|
|
86
|
+
return order
|
|
74
87
|
}
|
|
75
88
|
}
|
|
76
89
|
|
|
77
90
|
if (status.status !== 'order' || assetIsOutcome(status.order.order.coin)) {
|
|
78
|
-
|
|
79
|
-
PerpsErrorCode.OrderNotFound,
|
|
80
|
-
`Order not found: ${params.id}`
|
|
81
|
-
)
|
|
82
|
-
err.tool = PROVIDER_KEY
|
|
83
|
-
throw err
|
|
91
|
+
throw orderNotFound(params.id)
|
|
84
92
|
}
|
|
85
93
|
|
|
86
94
|
const registry = getMarketRegistry(client, PROVIDER_KEY)
|
|
@@ -89,6 +97,9 @@ export const getOrder = async (
|
|
|
89
97
|
status.order,
|
|
90
98
|
registry.require(status.order.order.coin)
|
|
91
99
|
)
|
|
100
|
+
if (order === undefined) {
|
|
101
|
+
throw orderNotFound(params.id)
|
|
102
|
+
}
|
|
92
103
|
const [linked] = await withExplorerLinks([order], params.address, infoOpts)
|
|
93
104
|
return linked
|
|
94
105
|
}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ACTIVE_ORDER_STATUSES,
|
|
3
|
-
createWarnOnce,
|
|
4
3
|
getMarketRegistry,
|
|
5
4
|
isActiveOrderStatus,
|
|
6
|
-
type MarketRegistry,
|
|
7
|
-
PerpsError,
|
|
8
5
|
type ProviderGetOrdersParams,
|
|
9
6
|
type SDKRequestOptions,
|
|
10
7
|
} from '@lifi/perps-sdk'
|
|
11
|
-
import type {
|
|
8
|
+
import type { Order, OrdersResponse } from '@lifi/perps-types'
|
|
12
9
|
import { PROVIDER_KEY } from '../constants.js'
|
|
13
10
|
import type { HyperliquidContext } from '../context.js'
|
|
14
11
|
import type {
|
|
@@ -17,48 +14,14 @@ import type {
|
|
|
17
14
|
HlTwapHistoryEntry,
|
|
18
15
|
} from '../types/index.js'
|
|
19
16
|
import { withExplorerLinks } from '../utils/explorer.js'
|
|
20
|
-
import {
|
|
17
|
+
import { mapOrder, perpsDexNames } from '../utils/index.js'
|
|
21
18
|
import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
|
|
19
|
+
import { mapOrderRow } from '../utils/mapOrder.js'
|
|
22
20
|
import { requireAccountExists } from './getAccountExists.js'
|
|
23
21
|
|
|
24
22
|
/** Parameters for a lifecycle-filtered Hyperliquid order read. */
|
|
25
23
|
export type GetOrdersParams = ProviderGetOrdersParams
|
|
26
24
|
|
|
27
|
-
const warn = createWarnOnce()
|
|
28
|
-
|
|
29
|
-
const warnOnce = (key: string): void => {
|
|
30
|
-
warn(key, `[${PROVIDER_KEY}] ${key}`)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Map one venue row, or drop it. An outcome market identity, a coin the backend
|
|
35
|
-
* market list does not hold, and a row the mapper rejects each drop only their
|
|
36
|
-
* own row instead of rejecting the whole page; each distinct mapper message
|
|
37
|
-
* warns once.
|
|
38
|
-
*/
|
|
39
|
-
const mapRow = (
|
|
40
|
-
coin: string,
|
|
41
|
-
registry: MarketRegistry,
|
|
42
|
-
map: (market: MarketDisplay) => Order
|
|
43
|
-
): Order | undefined => {
|
|
44
|
-
if (assetIsOutcome(coin)) {
|
|
45
|
-
return undefined
|
|
46
|
-
}
|
|
47
|
-
const market = registry.get(coin)
|
|
48
|
-
if (market === undefined) {
|
|
49
|
-
return undefined
|
|
50
|
-
}
|
|
51
|
-
try {
|
|
52
|
-
return map(market)
|
|
53
|
-
} catch (error) {
|
|
54
|
-
if (!(error instanceof PerpsError)) {
|
|
55
|
-
throw error
|
|
56
|
-
}
|
|
57
|
-
warnOnce(`dropped order row: ${error.message}`)
|
|
58
|
-
return undefined
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
25
|
/** Read regular, trigger, and TWAP orders from the requested lifecycle feeds. */
|
|
63
26
|
export const getOrders = async (
|
|
64
27
|
{ client, apiUrl }: HyperliquidContext,
|
|
@@ -114,17 +77,22 @@ export const getOrders = async (
|
|
|
114
77
|
rows.set(key, order)
|
|
115
78
|
}
|
|
116
79
|
}
|
|
80
|
+
const seenHistorical = new Set<string>()
|
|
117
81
|
for (const detail of historical) {
|
|
118
82
|
const key = String(detail.order.oid)
|
|
119
83
|
// The feed carries one row per lifecycle transition, newest first, and a
|
|
120
84
|
// terminal row shares its timestamp with the `open` row beneath it, so
|
|
121
|
-
// only the first row of an id states that order's current status
|
|
122
|
-
|
|
85
|
+
// only the first row of an id states that order's current status, even
|
|
86
|
+
// when the mapper skips that row.
|
|
87
|
+
if (seenHistorical.has(key)) {
|
|
123
88
|
continue
|
|
124
89
|
}
|
|
90
|
+
seenHistorical.add(key)
|
|
125
91
|
keep(
|
|
126
92
|
key,
|
|
127
|
-
|
|
93
|
+
mapOrderRow(detail.order.coin, registry, (market) =>
|
|
94
|
+
mapOrder(detail, market)
|
|
95
|
+
)
|
|
128
96
|
)
|
|
129
97
|
}
|
|
130
98
|
const raw = open.flat()
|
|
@@ -135,13 +103,13 @@ export const getOrders = async (
|
|
|
135
103
|
if (!childIds.has(order.oid)) {
|
|
136
104
|
keep(
|
|
137
105
|
String(order.oid),
|
|
138
|
-
|
|
106
|
+
mapOrderRow(order.coin, registry, (market) => mapOrder(order, market))
|
|
139
107
|
)
|
|
140
108
|
}
|
|
141
109
|
for (const child of order.children ?? []) {
|
|
142
110
|
keep(
|
|
143
111
|
String(child.oid),
|
|
144
|
-
|
|
112
|
+
mapOrderRow(child.coin, registry, (market) =>
|
|
145
113
|
mapOrder(child, market, String(order.oid))
|
|
146
114
|
)
|
|
147
115
|
)
|
|
@@ -151,7 +119,7 @@ export const getOrders = async (
|
|
|
151
119
|
for (const twap of twaps) {
|
|
152
120
|
keep(
|
|
153
121
|
`twap:${twap.twapId}`,
|
|
154
|
-
|
|
122
|
+
mapOrderRow(twap.state.coin, registry, (market) => mapOrder(twap, market))
|
|
155
123
|
)
|
|
156
124
|
}
|
|
157
125
|
const matching = [...rows.values()].filter(
|