@lifi/perps-sdk-provider-hyperliquid 24.0.0 → 26.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 +19 -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 +3 -1
- 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 +15 -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/liquidation.d.ts +1 -1
- package/dist/cjs/utils/liquidation.d.ts.map +1 -1
- package/dist/cjs/utils/liquidation.js +3 -4
- 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 +32 -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 +14 -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 +8 -12
- 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 +1 -1
- package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
- package/dist/cjs/utils/mapOrder.js +60 -18
- 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 +40 -14
- package/dist/cjs/utils/mapPosition.js.map +1 -1
- package/dist/cjs/utils/orderFormatting.d.ts.map +1 -1
- package/dist/cjs/utils/orderFormatting.js +4 -5
- package/dist/cjs/utils/orderFormatting.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 +15 -23
- package/dist/cjs/utils/transferMargin.js.map +1 -1
- package/dist/cjs/utils/venueTotals.d.ts +5 -5
- package/dist/cjs/utils/venueTotals.d.ts.map +1 -1
- package/dist/cjs/utils/venueTotals.js +10 -11
- 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.map +1 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.js +109 -89
- 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 +24 -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 +5 -2
- 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 +17 -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/liquidation.d.ts +1 -1
- package/dist/esm/utils/liquidation.d.ts.map +1 -1
- package/dist/esm/utils/liquidation.js +4 -5
- 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 +35 -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 +18 -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 +10 -11
- 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 +5 -2
- package/dist/esm/utils/mapOrder.d.ts.map +1 -1
- package/dist/esm/utils/mapOrder.js +65 -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 +43 -12
- package/dist/esm/utils/mapPosition.js.map +1 -1
- package/dist/esm/utils/orderFormatting.d.ts.map +1 -1
- package/dist/esm/utils/orderFormatting.js +6 -6
- package/dist/esm/utils/orderFormatting.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 +18 -22
- package/dist/esm/utils/transferMargin.js.map +1 -1
- package/dist/esm/utils/venueTotals.d.ts +10 -5
- package/dist/esm/utils/venueTotals.d.ts.map +1 -1
- package/dist/esm/utils/venueTotals.js +13 -7
- 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 +2 -0
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.js +119 -88
- 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/liquidation.d.ts +1 -1
- 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 +5 -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/orderFormatting.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 +10 -5
- 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 +2 -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 +6 -3
- package/src/services/getPortfolioHistory.ts +38 -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/liquidation.ts +14 -8
- package/src/utils/mapActivity.ts +42 -20
- package/src/utils/mapFill.ts +22 -9
- package/src/utils/mapMarket.ts +12 -10
- package/src/utils/mapMarketContext.ts +6 -8
- package/src/utils/mapOrder.ts +81 -20
- package/src/utils/mapPosition.ts +67 -13
- package/src/utils/orderFormatting.ts +9 -8
- 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 +36 -20
- package/src/utils/venueTotals.ts +54 -13
- package/src/utils/withdrawableBalances.ts +33 -15
- package/src/websocket/HyperliquidWsProvider.ts +169 -102
- 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,38 +1,69 @@
|
|
|
1
|
+
import { absDecimalString, createWarnOnce, isDecimalString, isDecimalStringGreaterThan, isDecimalStringZero, safeAbsDecimalString, safeDivideDecimalString, safeIsDecimalStringZero, safeNumberToDecimalString, safeSubtractDecimalString, warnSkippedVenueRow, } from '@lifi/perps-sdk';
|
|
1
2
|
import { MarginMode, PositionSide } from '@lifi/perps-types';
|
|
2
|
-
import
|
|
3
|
+
import { PROVIDER_KEY } from '../constants.js';
|
|
4
|
+
const warnNonPositiveLeverageOnce = createWarnOnce();
|
|
5
|
+
const skipPosition = (field, value) => {
|
|
6
|
+
warnSkippedVenueRow(PROVIDER_KEY, 'position', field, value);
|
|
7
|
+
return undefined;
|
|
8
|
+
};
|
|
3
9
|
/**
|
|
4
10
|
* True when the assetPosition has non-zero size. Hyperliquid keeps zero-size
|
|
5
11
|
* rows in clearinghouse states after a close; both the REST and WS positions
|
|
6
12
|
* paths drop them so a close surfaces as absence from the open set.
|
|
7
13
|
* @public
|
|
8
14
|
*/
|
|
9
|
-
export const isOpenAssetPosition = (ap) =>
|
|
15
|
+
export const isOpenAssetPosition = (ap) => safeIsDecimalStringZero(ap.position.szi) !== true;
|
|
10
16
|
/**
|
|
11
17
|
* Map a non-zero Hyperliquid position payload to the SDK's normalized
|
|
12
18
|
* position. Signed wire size determines side; decimal strings remain strings
|
|
13
19
|
* in the normalized response. `cumFunding.sinceOpen` is negated because
|
|
14
20
|
* Hyperliquid signs funding paid as positive and `accruedFunding` signs it as
|
|
15
|
-
* negative.
|
|
21
|
+
* negative. A row with an invalid size gives `undefined`; an invalid position
|
|
22
|
+
* value, a non-positive leverage or an invalid funding leaves the derived field
|
|
23
|
+
* absent.
|
|
16
24
|
* @public
|
|
17
25
|
*/
|
|
18
26
|
export const mapPosition = (ap, market) => {
|
|
19
27
|
const pos = ap.position;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
if (!isDecimalString(pos.szi)) {
|
|
29
|
+
return skipPosition('szi', pos.szi);
|
|
30
|
+
}
|
|
31
|
+
const size = absDecimalString(pos.szi);
|
|
32
|
+
const positionValue = safeAbsDecimalString(pos.positionValue);
|
|
33
|
+
const markPrice = positionValue === undefined
|
|
34
|
+
? undefined
|
|
35
|
+
: isDecimalStringZero(size)
|
|
36
|
+
? '0'
|
|
37
|
+
: safeDivideDecimalString(positionValue, size);
|
|
38
|
+
const accruedFunding = safeSubtractDecimalString('0', pos.cumFunding.sinceOpen);
|
|
39
|
+
const venueLeverage = safeNumberToDecimalString(pos.leverage.value);
|
|
40
|
+
const leverage = venueLeverage !== undefined &&
|
|
41
|
+
isDecimalStringGreaterThan(venueLeverage, '0')
|
|
42
|
+
? venueLeverage
|
|
43
|
+
: undefined;
|
|
44
|
+
if (venueLeverage !== undefined && leverage === undefined) {
|
|
45
|
+
warnNonPositiveLeverageOnce(venueLeverage, `[${PROVIDER_KEY}] position \`leverage.value\` is not positive: '${venueLeverage}'`);
|
|
46
|
+
}
|
|
47
|
+
const initialMarginRequirement = positionValue === undefined || leverage === undefined
|
|
48
|
+
? undefined
|
|
49
|
+
: safeDivideDecimalString(positionValue, leverage);
|
|
23
50
|
const marginMode = pos.leverage.type === 'cross' ? MarginMode.CROSS : MarginMode.ISOLATED;
|
|
24
51
|
return {
|
|
25
52
|
market,
|
|
26
|
-
side:
|
|
27
|
-
|
|
53
|
+
side: isDecimalStringGreaterThan('0', pos.szi)
|
|
54
|
+
? PositionSide.SHORT
|
|
55
|
+
: PositionSide.LONG,
|
|
56
|
+
size,
|
|
28
57
|
entryPrice: pos.entryPx ?? '0',
|
|
29
|
-
markPrice
|
|
58
|
+
...(markPrice === undefined ? {} : { markPrice }),
|
|
30
59
|
liquidationPrice: pos.liquidationPx ?? '0',
|
|
31
60
|
unrealizedPnl: pos.unrealizedPnl,
|
|
32
|
-
accruedFunding:
|
|
33
|
-
leverage:
|
|
61
|
+
...(accruedFunding === undefined ? {} : { accruedFunding }),
|
|
62
|
+
...(leverage === undefined ? {} : { leverage }),
|
|
34
63
|
marginUsed: pos.marginUsed,
|
|
35
|
-
initialMarginRequirement
|
|
64
|
+
...(initialMarginRequirement === undefined
|
|
65
|
+
? {}
|
|
66
|
+
: { initialMarginRequirement }),
|
|
36
67
|
marginMode,
|
|
37
68
|
};
|
|
38
69
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,2BAA2B,GAAG,cAAc,EAAE,CAAA;AAEpD,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,KAAc,EAAa,EAAE;IAChE,mBAAmB,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC3D,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAmB,EAAW,EAAE,CAClE,uBAAuB,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;AAEnD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,EAAmB,EACnB,MAA0B,EACJ,EAAE;IACxB,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAA;IACvB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC7D,MAAM,SAAS,GACb,aAAa,KAAK,SAAS;QACzB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,uBAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;IACpD,MAAM,cAAc,GAAG,yBAAyB,CAC9C,GAAG,EACH,GAAG,CAAC,UAAU,CAAC,SAAS,CACzB,CAAA;IACD,MAAM,aAAa,GAAG,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnE,MAAM,QAAQ,GACZ,aAAa,KAAK,SAAS;QAC3B,0BAA0B,CAAC,aAAa,EAAE,GAAG,CAAC;QAC5C,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,SAAS,CAAA;IACf,IAAI,aAAa,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC1D,2BAA2B,CACzB,aAAa,EACb,IAAI,YAAY,mDAAmD,aAAa,GAAG,CACpF,CAAA;IACH,CAAC;IACD,MAAM,wBAAwB,GAC5B,aAAa,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,uBAAuB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;IACtD,MAAM,UAAU,GACd,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAA;IAExE,OAAO;QACL,MAAM;QACN,IAAI,EAAE,0BAA0B,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,KAAK;YACpB,CAAC,CAAC,YAAY,CAAC,IAAI;QACrB,IAAI;QACJ,UAAU,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG;QAC9B,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,gBAAgB,EAAE,GAAG,CAAC,aAAa,IAAI,GAAG;QAC1C,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;QAC3D,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,GAAG,CAAC,wBAAwB,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC;QACjC,UAAU;KACX,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderFormatting.d.ts","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AActD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAER;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,GACjB,aAAa,CAMf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,
|
|
1
|
+
{"version":3,"file":"orderFormatting.d.ts","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AActD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAER;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,GACjB,aAAa,CAMf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAaf"}
|
|
@@ -66,12 +66,12 @@ export function snapOrderSize(size, szDecimals) {
|
|
|
66
66
|
* @public
|
|
67
67
|
*/
|
|
68
68
|
export function snapOrderPrice(price, szDecimals, market) {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
const value = new Big(price);
|
|
70
|
+
// Big's `e` is the base-10 exponent of the leading digit. Integer prices
|
|
71
|
+
// bypass the 5 sig-fig rule, so the sig-fig grid never goes coarser than 1.
|
|
72
|
+
const sigFigDecimals = Math.max(0, 4 - value.e);
|
|
73
|
+
const decimals = Math.min(sigFigDecimals, getMaxPriceDecimals(szDecimals, market));
|
|
74
|
+
const rounded = value.round(decimals, Big.roundHalfUp);
|
|
75
75
|
// toFixed() with no dp always emits plain notation; eq(0) guards '-0'
|
|
76
76
|
return rounded.eq(0) ? '0' : rounded.toFixed();
|
|
77
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderFormatting.js","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAC5B,MAAM,iBAAiB,GAAG,CAAC,CAAA;AAE3B,SAAS,cAAc,CAAC,MAAe;IACrC,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAA;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,MAAe;IAEf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAA;AACzD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAmB,EACnB,UAAkB;IAElB,wEAAwE;IACxE,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAChE,sEAAsE;IACtE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAoB,EACpB,UAAkB,EAClB,MAAe;IAEf,MAAM,
|
|
1
|
+
{"version":3,"file":"orderFormatting.js","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAC5B,MAAM,iBAAiB,GAAG,CAAC,CAAA;AAE3B,SAAS,cAAc,CAAC,MAAe;IACrC,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAA;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,MAAe;IAEf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAA;AACzD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAmB,EACnB,UAAkB;IAElB,wEAAwE;IACxE,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAChE,sEAAsE;IACtE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAoB,EACpB,UAAkB,EAClB,MAAe;IAEf,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IAC5B,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,cAAc,EACd,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CACxC,CAAA;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;IAEtD,sEAAsE;IACtE,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a venue row time as an ISO-8601 string, or `undefined` when the time is
|
|
3
|
+
* not valid. The caller logs the row skip, so this logs nothing.
|
|
4
|
+
*/
|
|
5
|
+
export declare const rowTimestampToIsoStringOrUndefined: (value: string | number) => string | undefined;
|
|
6
|
+
//# sourceMappingURL=rowTimestamp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowTimestamp.d.ts","sourceRoot":"","sources":["../../../src/utils/rowTimestamp.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,kCAAkC,GAC7C,OAAO,MAAM,GAAG,MAAM,KACrB,MAAM,GAAG,SAMX,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { timestampToIsoString } from '@lifi/perps-sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Read a venue row time as an ISO-8601 string, or `undefined` when the time is
|
|
4
|
+
* not valid. The caller logs the row skip, so this logs nothing.
|
|
5
|
+
*/
|
|
6
|
+
export const rowTimestampToIsoStringOrUndefined = (value) => {
|
|
7
|
+
try {
|
|
8
|
+
return timestampToIsoString(value);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=rowTimestamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowTimestamp.js","sourceRoot":"","sources":["../../../src/utils/rowTimestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAChD,KAAsB,EACF,EAAE;IACtB,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { Asset, Balance, Market } from '@lifi/perps-types';
|
|
1
|
+
import type { Asset, Balance, DecimalString, Market } from '@lifi/perps-types';
|
|
2
2
|
import type { HlSpotBalance } from '../types/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* Build USD prices keyed by spot token asset ID. Base tokens use the supplied
|
|
5
|
-
* market mark price; quote tokens default to exactly `$1`; missing
|
|
6
|
-
* default to `0`.
|
|
5
|
+
* market mark price; quote tokens default to exactly `$1`; missing or invalid
|
|
6
|
+
* base prices default to `0`.
|
|
7
7
|
* @public
|
|
8
8
|
*/
|
|
9
|
-
export declare const spotPriceById: (markets: readonly Market[], priceByMarketId: ReadonlyMap<string,
|
|
9
|
+
export declare const spotPriceById: (markets: readonly Market[], priceByMarketId: ReadonlyMap<string, DecimalString>) => Map<string, DecimalString>;
|
|
10
10
|
/**
|
|
11
11
|
* Convert a Hyperliquid spot balance's numeric token index into an SDK asset.
|
|
12
12
|
* The balance payload has no `fullName`, so logo resolution uses the base
|
|
@@ -15,5 +15,5 @@ export declare const spotPriceById: (markets: readonly Market[], priceByMarketId
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const spotAssetFromToken: (b: HlSpotBalance) => Asset;
|
|
17
17
|
/** Assemble a typed spot {@link Balance}; `total` is native token units and its unit price and USD value use `priceById`. @public */
|
|
18
|
-
export declare const spotBalance: (asset: Asset, total:
|
|
18
|
+
export declare const spotBalance: (asset: Asset, total: DecimalString, priceById: ReadonlyMap<string, DecimalString>) => Balance;
|
|
19
19
|
//# sourceMappingURL=spotBalance.d.ts.map
|
|
@@ -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,23 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isDecimalString, isDecimalStringGreaterThan, multiplyDecimalString, } from '@lifi/perps-sdk';
|
|
2
2
|
import { SPOT_MARKET_ID } from '../constants.js';
|
|
3
3
|
import { spotLogoURI } from './assetLogo.js';
|
|
4
4
|
import { coinAsset } from './marketDisplay.js';
|
|
5
5
|
/**
|
|
6
6
|
* Build USD prices keyed by spot token asset ID. Base tokens use the supplied
|
|
7
|
-
* market mark price; quote tokens default to exactly `$1`; missing
|
|
8
|
-
* default to `0`.
|
|
7
|
+
* market mark price; quote tokens default to exactly `$1`; missing or invalid
|
|
8
|
+
* base prices default to `0`.
|
|
9
9
|
* @public
|
|
10
10
|
*/
|
|
11
11
|
export const spotPriceById = (markets, priceByMarketId) => {
|
|
12
12
|
const map = new Map();
|
|
13
13
|
for (const m of markets) {
|
|
14
14
|
if (m.categoryId === SPOT_MARKET_ID) {
|
|
15
|
-
|
|
15
|
+
const price = priceByMarketId.get(m.id);
|
|
16
|
+
map.set(m.baseAsset.id, isDecimalString(price) ? price : '0');
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
for (const m of markets) {
|
|
19
20
|
if (!map.has(m.quoteAsset.id)) {
|
|
20
|
-
map.set(m.quoteAsset.id, 1);
|
|
21
|
+
map.set(m.quoteAsset.id, '1');
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
return map;
|
|
@@ -35,14 +36,14 @@ export const spotAssetFromToken = (b) => ({
|
|
|
35
36
|
});
|
|
36
37
|
/** Assemble a typed spot {@link Balance}; `total` is native token units and its unit price and USD value use `priceById`. @public */
|
|
37
38
|
export const spotBalance = (asset, total, priceById) => {
|
|
38
|
-
const price = priceById.get(asset.id) ?? 0;
|
|
39
|
+
const price = priceById.get(asset.id) ?? '0';
|
|
39
40
|
return {
|
|
40
41
|
categoryId: SPOT_MARKET_ID,
|
|
41
42
|
asset,
|
|
42
43
|
units: total,
|
|
43
|
-
valueUsd:
|
|
44
|
+
valueUsd: multiplyDecimalString(total, price),
|
|
44
45
|
// A zero entry means the map holds no mark for the asset, not a free asset.
|
|
45
|
-
...(price
|
|
46
|
+
...(isDecimalStringGreaterThan(price, '0') ? { price } : {}),
|
|
46
47
|
};
|
|
47
48
|
};
|
|
48
49
|
//# sourceMappingURL=spotBalance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotBalance.js","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"spotBalance.js","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA0B,EAC1B,eAAmD,EACvB,EAAE;IAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAyB,CAAA;IAC5C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,UAAU,KAAK,cAAc,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACvC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAgB,EAAS,EAAE,CAAC,CAAC;IAC9D,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;CAC7B,CAAC,CAAA;AAEF,qIAAqI;AACrI,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAY,EACZ,KAAoB,EACpB,SAA6C,EACpC,EAAE;IACX,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,CAAA;IAC5C,OAAO;QACL,UAAU,EAAE,cAAc;QAC1B,KAAK;QACL,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;QAC7C,4EAA4E;QAC5E,GAAG,CAAC,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAA;AACH,CAAC,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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isDecimalStringGreaterThan, unknownToDecimalString, } from '@lifi/perps-sdk';
|
|
2
|
+
import { PROVIDER_KEY } from '../constants.js';
|
|
2
3
|
/**
|
|
3
4
|
* Partition spot balances into collateral and ordinary holdings. Category
|
|
4
5
|
* quote assets are collateral; every other token is an ordinary holding.
|
|
@@ -9,7 +10,7 @@ export const partitionSpotBalances = (spotBalances, quoteAssetIds) => {
|
|
|
9
10
|
const collateralBalances = [];
|
|
10
11
|
const balances = [];
|
|
11
12
|
for (const balance of spotBalances) {
|
|
12
|
-
if (!
|
|
13
|
+
if (!isDecimalStringGreaterThan(unknownToDecimalString(balance.units, 'spotBalance.units', PROVIDER_KEY), '0')) {
|
|
13
14
|
continue;
|
|
14
15
|
}
|
|
15
16
|
if (quoteAssetIds.has(balance.asset.id)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotCollateral.js","sourceRoot":"","sources":["../../../src/utils/spotCollateral.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spotCollateral.js","sourceRoot":"","sources":["../../../src/utils/spotCollateral.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAY9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,YAAgC,EAChC,aAAkC,EACnB,EAAE;IACjB,MAAM,kBAAkB,GAAc,EAAE,CAAA;IACxC,MAAM,QAAQ,GAAc,EAAE,CAAA;IAC9B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IACE,CAAC,0BAA0B,CACzB,sBAAsB,CACpB,OAAO,CAAC,KAAK,EACb,mBAAmB,EACnB,YAAY,CACb,EACD,GAAG,CACJ,EACD,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAA;AACzC,CAAC,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,22 +1,19 @@
|
|
|
1
|
-
import { PerpsError, positionSupportsMarginAdjustment, positionSupportsMarginRemoval, } from '@lifi/perps-sdk';
|
|
1
|
+
import { isDecimalString, isDecimalStringGreaterThan, multiplyDecimalString, PerpsError, positionSupportsMarginAdjustment, positionSupportsMarginRemoval, roundDecimalString, subtractDecimalString, } from '@lifi/perps-sdk';
|
|
2
2
|
import { PerpsErrorCode, } from '@lifi/perps-types';
|
|
3
|
-
import Big from 'big.js';
|
|
4
3
|
const NOTIONAL_FLOOR_RATIO = '0.1';
|
|
5
4
|
const AMOUNT_DECIMALS = 6;
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
catch {
|
|
11
|
-
throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid decimal string on Position.${field}: '${value}'`);
|
|
5
|
+
function requirePositionAmount(value, field) {
|
|
6
|
+
if (!isDecimalString(value)) {
|
|
7
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid \`Position.${field}\`: '${value}' is not a decimal string.`);
|
|
12
8
|
}
|
|
9
|
+
return value;
|
|
13
10
|
}
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
function requirePositivePositionAmount(value, field) {
|
|
12
|
+
if (value === undefined ||
|
|
13
|
+
!isDecimalStringGreaterThan(requirePositionAmount(value, field), '0')) {
|
|
17
14
|
throw new PerpsError(PerpsErrorCode.ValidationError, `Position.${field} must be greater than zero.`);
|
|
18
15
|
}
|
|
19
|
-
return
|
|
16
|
+
return value;
|
|
20
17
|
}
|
|
21
18
|
/**
|
|
22
19
|
* Hyperliquid removable isolated margin:
|
|
@@ -29,7 +26,8 @@ function positivePositionAmount(value, field) {
|
|
|
29
26
|
* margin adjustment; `'0'` for add-only strict-isolated markets and when
|
|
30
27
|
* nothing is removable.
|
|
31
28
|
* @throws {PerpsError} `ValidationError` when a required `Position` decimal
|
|
32
|
-
* is malformed, or when a size, price or requirement is not
|
|
29
|
+
* is absent or malformed, or when a size, price or requirement is not
|
|
30
|
+
* positive.
|
|
33
31
|
* @see https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margining
|
|
34
32
|
* @public
|
|
35
33
|
*/
|
|
@@ -40,18 +38,16 @@ export function positionRemovableMargin(position) {
|
|
|
40
38
|
if (!positionSupportsMarginRemoval(position)) {
|
|
41
39
|
return '0';
|
|
42
40
|
}
|
|
43
|
-
const marginUsed =
|
|
44
|
-
const initialMargin =
|
|
45
|
-
const notionalFloor =
|
|
46
|
-
|
|
47
|
-
.times(NOTIONAL_FLOOR_RATIO);
|
|
48
|
-
const minimumMargin = initialMargin.gt(notionalFloor)
|
|
41
|
+
const marginUsed = requirePositionAmount(position.marginUsed, 'marginUsed');
|
|
42
|
+
const initialMargin = requirePositivePositionAmount(position.initialMarginRequirement, 'initialMarginRequirement');
|
|
43
|
+
const notionalFloor = multiplyDecimalString(multiplyDecimalString(requirePositivePositionAmount(position.size, 'size'), requirePositivePositionAmount(position.markPrice, 'markPrice')), NOTIONAL_FLOOR_RATIO);
|
|
44
|
+
const minimumMargin = isDecimalStringGreaterThan(initialMargin, notionalFloor)
|
|
49
45
|
? initialMargin
|
|
50
46
|
: notionalFloor;
|
|
51
|
-
const removable = marginUsed
|
|
52
|
-
if (removable
|
|
47
|
+
const removable = subtractDecimalString(marginUsed, minimumMargin);
|
|
48
|
+
if (!isDecimalStringGreaterThan(removable, '0')) {
|
|
53
49
|
return '0';
|
|
54
50
|
}
|
|
55
|
-
return removable
|
|
51
|
+
return roundDecimalString(removable, AMOUNT_DECIMALS, 'truncate');
|
|
56
52
|
}
|
|
57
53
|
//# sourceMappingURL=transferMargin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferMargin.js","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,gCAAgC,EAChC,6BAA6B,
|
|
1
|
+
{"version":3,"file":"transferMargin.js","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,qBAAqB,EACrB,UAAU,EACV,gCAAgC,EAChC,6BAA6B,EAC7B,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAEL,cAAc,GAEf,MAAM,mBAAmB,CAAA;AAE1B,MAAM,oBAAoB,GAAG,KAAK,CAAA;AAClC,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,SAAS,qBAAqB,CAC5B,KAAoB,EACpB,KAAa;IAEb,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,sBAAsB,KAAK,QAAQ,KAAK,4BAA4B,CACrE,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,6BAA6B,CACpC,KAAgC,EAChC,KAAa;IAEb,IACE,KAAK,KAAK,SAAS;QACnB,CAAC,0BAA0B,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EACrE,CAAC;QACD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,YAAY,KAAK,6BAA6B,CAC/C,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAkB;IAElB,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IAC3E,MAAM,aAAa,GAAG,6BAA6B,CACjD,QAAQ,CAAC,wBAAwB,EACjC,0BAA0B,CAC3B,CAAA;IACD,MAAM,aAAa,GAAG,qBAAqB,CACzC,qBAAqB,CACnB,6BAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EACpD,6BAA6B,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAC/D,EACD,oBAAoB,CACrB,CAAA;IACD,MAAM,aAAa,GAAG,0BAA0B,CAAC,aAAa,EAAE,aAAa,CAAC;QAC5E,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,aAAa,CAAA;IAEjB,MAAM,SAAS,GAAG,qBAAqB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAClE,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,kBAAkB,CAAC,SAAS,EAAE,eAAe,EAAE,UAAU,CAAC,CAAA;AACnE,CAAC"}
|
|
@@ -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,21 @@ 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
22
|
* Sum the unrealized PnL of every position, in quote-asset units.
|
|
23
23
|
* @public
|
|
24
24
|
*/
|
|
25
|
-
export declare const sumUnrealizedPnl: (positions: readonly Position[]) =>
|
|
25
|
+
export declare const sumUnrealizedPnl: (positions: readonly Position[]) => DecimalString;
|
|
26
|
+
/**
|
|
27
|
+
* Sum every term, or `undefined` with a warning when any term is not a
|
|
28
|
+
* decimal string. A bad term never gives a partial sum.
|
|
29
|
+
*/
|
|
30
|
+
export declare const safeSumDecimalStrings: (terms: readonly string[]) => DecimalString | undefined;
|
|
26
31
|
//# 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":"AAKA,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;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,SAAS,QAAQ,EAAE,KAC7B,aAYA,CAAA;AAEH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,SAAS,MAAM,EAAE,KACvB,aAAa,GAAG,SAKhB,CAAA"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { addDecimalString, safeAddDecimalString, unknownToDecimalString, } from '@lifi/perps-sdk';
|
|
2
|
+
import { PROVIDER_KEY } from '../constants.js';
|
|
3
3
|
/**
|
|
4
4
|
* Sum the venue `marginSummary` totals over every perps sub-dex of an
|
|
5
5
|
* account. `accountValue` is total equity, so it already carries locked
|
|
6
6
|
* margin and unrealized PnL. An entry without a `marginSummary` adds nothing.
|
|
7
|
+
* @throws {PerpsError} `SDKError` when a venue figure is not a decimal.
|
|
7
8
|
* @public
|
|
8
9
|
*/
|
|
9
10
|
export const perpsTotals = (dexStates) => {
|
|
10
|
-
let accountValue =
|
|
11
|
-
let marginUsed =
|
|
11
|
+
let accountValue = '0';
|
|
12
|
+
let marginUsed = '0';
|
|
12
13
|
for (const { marginSummary } of dexStates) {
|
|
13
14
|
if (marginSummary === undefined) {
|
|
14
15
|
continue;
|
|
15
16
|
}
|
|
16
|
-
accountValue = accountValue
|
|
17
|
-
marginUsed = marginUsed
|
|
17
|
+
accountValue = addDecimalString(accountValue, unknownToDecimalString(marginSummary.accountValue, 'marginSummary.accountValue', PROVIDER_KEY));
|
|
18
|
+
marginUsed = addDecimalString(marginUsed, unknownToDecimalString(marginSummary.totalMarginUsed, 'marginSummary.totalMarginUsed', PROVIDER_KEY));
|
|
18
19
|
}
|
|
19
20
|
return { accountValue, marginUsed };
|
|
20
21
|
};
|
|
@@ -22,5 +23,10 @@ export const perpsTotals = (dexStates) => {
|
|
|
22
23
|
* Sum the unrealized PnL of every position, in quote-asset units.
|
|
23
24
|
* @public
|
|
24
25
|
*/
|
|
25
|
-
export const sumUnrealizedPnl = (positions) => positions.reduce((sum, position) => sum
|
|
26
|
+
export const sumUnrealizedPnl = (positions) => positions.reduce((sum, position) => addDecimalString(sum, unknownToDecimalString(position.unrealizedPnl, 'position.unrealizedPnl', PROVIDER_KEY)), '0');
|
|
27
|
+
/**
|
|
28
|
+
* Sum every term, or `undefined` with a warning when any term is not a
|
|
29
|
+
* decimal string. A bad term never gives a partial sum.
|
|
30
|
+
*/
|
|
31
|
+
export const safeSumDecimalStrings = (terms) => terms.reduce((sum, term) => sum === undefined ? undefined : safeAddDecimalString(sum, term), '0');
|
|
26
32
|
//# sourceMappingURL=venueTotals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"venueTotals.js","sourceRoot":"","sources":["../../../src/utils/venueTotals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"venueTotals.js","sourceRoot":"","sources":["../../../src/utils/venueTotals.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AAMxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAW9C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,SAAsC,EACsB,EAAE;IAC9D,IAAI,YAAY,GAAG,GAAG,CAAA;IACtB,IAAI,UAAU,GAAG,GAAG,CAAA;IACpB,KAAK,MAAM,EAAE,aAAa,EAAE,IAAI,SAAS,EAAE,CAAC;QAC1C,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,SAAQ;QACV,CAAC;QACD,YAAY,GAAG,gBAAgB,CAC7B,YAAY,EACZ,sBAAsB,CACpB,aAAa,CAAC,YAAY,EAC1B,4BAA4B,EAC5B,YAAY,CACb,CACF,CAAA;QACD,UAAU,GAAG,gBAAgB,CAC3B,UAAU,EACV,sBAAsB,CACpB,aAAa,CAAC,eAAe,EAC7B,+BAA+B,EAC/B,YAAY,CACb,CACF,CAAA;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAA;AACrC,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,SAA8B,EACf,EAAE,CACjB,SAAS,CAAC,MAAM,CACd,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAChB,gBAAgB,CACd,GAAG,EACH,sBAAsB,CACpB,QAAQ,CAAC,aAAa,EACtB,wBAAwB,EACxB,YAAY,CACb,CACF,EACH,GAAG,CACJ,CAAA;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAwB,EACG,EAAE,CAC7B,KAAK,CAAC,MAAM,CACV,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACZ,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,EACjE,GAAG,CACJ,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 is not a
|
|
15
|
+
* decimal.
|
|
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"}
|
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
import { calculateWithdrawMax, } from '@lifi/perps-sdk';
|
|
1
|
+
import { calculateWithdrawMax, isDecimalStringGreaterThan, subtractDecimalString, unknownToDecimalString, } from '@lifi/perps-sdk';
|
|
2
|
+
import { PROVIDER_KEY, SPOT_MARKET_ID } from '../constants.js';
|
|
2
3
|
import { isUnifiedAbstraction } from './abstractionMode.js';
|
|
3
4
|
import { assetIsOutcome } from './assetId.js';
|
|
4
|
-
import { toWireBig } from './decimal.js';
|
|
5
5
|
/**
|
|
6
|
-
* Split a Hyperliquid account's venue figures into the
|
|
7
|
-
* draws on. A unified or portfolio-margin account holds its collateral in spot,
|
|
6
|
+
* Split a Hyperliquid account's venue figures into the categories a
|
|
7
|
+
* withdrawal draws on. A unified or portfolio-margin account holds its collateral in spot,
|
|
8
8
|
* so each spot token adds the part of `total` that no order or margin holds. A
|
|
9
|
-
*
|
|
9
|
+
* category with nothing left to draw carries no row, and the caller applies the
|
|
10
10
|
* per-asset venue minimum.
|
|
11
11
|
*
|
|
12
|
-
* @param quoteAssetId - `Asset.id` the perps-
|
|
12
|
+
* @param quoteAssetId - `Asset.id` the perps-category row is keyed by.
|
|
13
13
|
* @param withdrawalFee - Flat venue fee in quote-asset units, set on every
|
|
14
14
|
* quote-asset row. Hyperliquid deducts it from the requested amount. Absent
|
|
15
15
|
* leaves every row without a fee.
|
|
16
|
+
* @throws {PerpsError} `SDKError` when the fee or a venue figure is not a
|
|
17
|
+
* decimal.
|
|
16
18
|
* @public
|
|
17
19
|
*/
|
|
18
20
|
export const hyperliquidWithdrawableBalances = (abstraction, state, spotState, quoteAssetId, withdrawalFee) => {
|
|
19
21
|
const rows = [];
|
|
20
22
|
const fee = withdrawalFee === undefined
|
|
21
23
|
? undefined
|
|
22
|
-
:
|
|
24
|
+
: unknownToDecimalString(withdrawalFee, 'providers.withdrawalFeeUsd', PROVIDER_KEY);
|
|
23
25
|
const feeFor = (assetId) => fee === undefined || assetId !== quoteAssetId
|
|
24
26
|
? {}
|
|
25
27
|
: { withdrawalFee: fee, isFeeDeducted: true };
|
|
@@ -28,25 +30,25 @@ export const hyperliquidWithdrawableBalances = (abstraction, state, spotState, q
|
|
|
28
30
|
if (assetIsOutcome(balance.coin)) {
|
|
29
31
|
continue;
|
|
30
32
|
}
|
|
31
|
-
const spot =
|
|
32
|
-
if (spot
|
|
33
|
+
const spot = subtractDecimalString(unknownToDecimalString(balance.total, 'spotBalance.total', PROVIDER_KEY), unknownToDecimalString(balance.hold, 'spotBalance.hold', PROVIDER_KEY));
|
|
34
|
+
if (isDecimalStringGreaterThan(spot, '0')) {
|
|
33
35
|
const assetId = String(balance.token);
|
|
34
36
|
const row = {
|
|
35
37
|
assetId,
|
|
36
|
-
|
|
37
|
-
available: spot
|
|
38
|
+
categoryId: SPOT_MARKET_ID,
|
|
39
|
+
available: spot,
|
|
38
40
|
...feeFor(assetId),
|
|
39
41
|
};
|
|
40
42
|
rows.push({ ...row, max: calculateWithdrawMax(row) });
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
|
-
const perps =
|
|
45
|
-
if (perps
|
|
46
|
+
const perps = unknownToDecimalString(state.withdrawable, 'clearinghouseState.withdrawable', PROVIDER_KEY);
|
|
47
|
+
if (isDecimalStringGreaterThan(perps, '0')) {
|
|
46
48
|
const row = {
|
|
47
49
|
assetId: quoteAssetId,
|
|
48
|
-
|
|
49
|
-
available: perps
|
|
50
|
+
categoryId: PROVIDER_KEY,
|
|
51
|
+
available: perps,
|
|
50
52
|
...feeFor(quoteAssetId),
|
|
51
53
|
};
|
|
52
54
|
rows.push({ ...row, max: calculateWithdrawMax(row) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,
|
|
1
|
+
{"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAE1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAM9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,WAAqC,EACrC,KAA2B,EAC3B,SAAmC,EACnC,YAAoB,EACpB,aAAsB,EACS,EAAE;IACjC,MAAM,IAAI,GAAkC,EAAE,CAAA;IAC9C,MAAM,GAAG,GACP,aAAa,KAAK,SAAS;QACzB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,sBAAsB,CACpB,aAAa,EACb,4BAA4B,EAC5B,YAAY,CACb,CAAA;IACP,MAAM,MAAM,GAAG,CACb,OAAe,EACuD,EAAE,CACxE,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,YAAY;QAC3C,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA;IAEjD,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,SAAQ;YACV,CAAC;YACD,MAAM,IAAI,GAAG,qBAAqB,CAChC,sBAAsB,CACpB,OAAO,CAAC,KAAK,EACb,mBAAmB,EACnB,YAAY,CACb,EACD,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY,CAAC,CACvE,CAAA;YACD,IAAI,0BAA0B,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBACrC,MAAM,GAAG,GAAG;oBACV,OAAO;oBACP,UAAU,EAAE,cAAc;oBAC1B,SAAS,EAAE,IAAI;oBACf,GAAG,MAAM,CAAC,OAAO,CAAC;iBACnB,CAAA;gBACD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,sBAAsB,CAClC,KAAK,CAAC,YAAY,EAClB,iCAAiC,EACjC,YAAY,CACb,CAAA;IACD,IAAI,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG;YACV,OAAO,EAAE,YAAY;YACrB,UAAU,EAAE,YAAY;YACxB,SAAS,EAAE,KAAK;YAChB,GAAG,MAAM,CAAC,YAAY,CAAC;SACxB,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,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 is not a decimal string is left out. */
|
|
117
119
|
private mergedMids;
|
|
118
120
|
private orderbookReferencePrice;
|
|
119
121
|
private handleL2Book;
|