@lifi/perps-sdk-provider-hyperliquid 27.0.0 → 28.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/README.md +2 -0
- package/dist/cjs/HyperliquidProvider.d.ts.map +1 -1
- package/dist/cjs/HyperliquidProvider.js +7 -2
- package/dist/cjs/HyperliquidProvider.js.map +1 -1
- package/dist/cjs/services/getAccount.d.ts.map +1 -1
- package/dist/cjs/services/getAccount.js +5 -3
- package/dist/cjs/services/getAccount.js.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.map +1 -1
- package/dist/cjs/utils/spotBalance.d.ts +1 -1
- package/dist/cjs/utils/spotBalance.d.ts.map +1 -1
- package/dist/cjs/utils/spotBalance.js +4 -1
- package/dist/cjs/utils/spotBalance.js.map +1 -1
- package/dist/cjs/utils/transferMargin.js +2 -2
- package/dist/cjs/utils/transferMargin.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 +4 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/esm/HyperliquidProvider.d.ts.map +1 -1
- package/dist/esm/HyperliquidProvider.js +10 -4
- package/dist/esm/HyperliquidProvider.js.map +1 -1
- package/dist/esm/services/getAccount.d.ts.map +1 -1
- package/dist/esm/services/getAccount.js +6 -4
- package/dist/esm/services/getAccount.js.map +1 -1
- package/dist/esm/utils/liquidation.d.ts +3 -1
- package/dist/esm/utils/liquidation.d.ts.map +1 -1
- package/dist/esm/utils/liquidation.js +2 -0
- package/dist/esm/utils/liquidation.js.map +1 -1
- package/dist/esm/utils/spotBalance.d.ts +2 -1
- package/dist/esm/utils/spotBalance.d.ts.map +1 -1
- package/dist/esm/utils/spotBalance.js +5 -1
- package/dist/esm/utils/spotBalance.js.map +1 -1
- package/dist/esm/utils/transferMargin.js +3 -3
- package/dist/esm/utils/transferMargin.js.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts +1 -0
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.js +5 -2
- package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/types/HyperliquidProvider.d.ts.map +1 -1
- package/dist/types/services/getAccount.d.ts.map +1 -1
- package/dist/types/utils/liquidation.d.ts +3 -1
- package/dist/types/utils/liquidation.d.ts.map +1 -1
- package/dist/types/utils/spotBalance.d.ts +2 -1
- package/dist/types/utils/spotBalance.d.ts.map +1 -1
- package/dist/types/websocket/HyperliquidWsProvider.d.ts +1 -0
- package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/HyperliquidProvider.ts +18 -6
- package/src/services/getAccount.ts +13 -3
- package/src/utils/liquidation.ts +3 -1
- package/src/utils/spotBalance.ts +8 -1
- package/src/utils/transferMargin.ts +4 -4
- package/src/websocket/HyperliquidWsProvider.ts +13 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liquidation.d.ts","sourceRoot":"","sources":["../../../src/utils/liquidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,mBAAmB,CAAA;AAEtE;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,GAClB,aAAa,CAQf;AAED,cAAc;AACd,eAAO,MAAM,kCAAkC,6CAG9C,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"liquidation.d.ts","sourceRoot":"","sources":["../../../src/utils/liquidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,mBAAmB,CAAA;AAEtE;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,GAClB,aAAa,CAQf;AAED,cAAc;AACd,eAAO,MAAM,kCAAkC,6CAG9C,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAOpB;AAED,cAAc;AACd,eAAO,MAAM,6BAA6B,oGAGzC,CAAA"}
|
|
@@ -11,9 +11,10 @@ export declare const spotPriceById: (markets: readonly Market[], priceByMarketId
|
|
|
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
|
|
13
13
|
* `_spot` URI rule rather than Unit-underlying lookup.
|
|
14
|
+
* @param registered - The registry `Asset` with the same `id`; only its `decimals` is copied.
|
|
14
15
|
* @public
|
|
15
16
|
*/
|
|
16
|
-
export declare const spotAssetFromToken: (b: HlSpotBalance) => Asset;
|
|
17
|
+
export declare const spotAssetFromToken: (b: HlSpotBalance, registered?: Asset) => Asset;
|
|
17
18
|
/** Assemble a typed spot {@link Balance}; `total` is native token units and its unit price and USD value use `priceById`. @public */
|
|
18
19
|
export declare const spotBalance: (asset: Asset, total: DecimalString, priceById: ReadonlyMap<string, DecimalString>) => Balance;
|
|
19
20
|
//# sourceMappingURL=spotBalance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,GAAG,aAAa,EAChB,aAAa,KAAK,KACjB,KAOD,CAAA;AAEF,qIAAqI;AACrI,eAAO,MAAM,WAAW,GACtB,OAAO,KAAK,EACZ,OAAO,aAAa,EACpB,WAAW,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,KAC5C,OAUF,CAAA"}
|
|
@@ -31,6 +31,7 @@ export declare class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
31
31
|
private readonly clearinghouseRefs;
|
|
32
32
|
private readonly client;
|
|
33
33
|
private readonly registry;
|
|
34
|
+
private readonly assetRegistry;
|
|
34
35
|
private readonly accountChecksByUser;
|
|
35
36
|
private readonly abstractionByUser;
|
|
36
37
|
private readonly summaryUsers;
|
|
@@ -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": "28.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": "^23.0.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"@lifi/perps-sdk": "^
|
|
55
|
+
"@lifi/perps-sdk": "^26.0.0"
|
|
56
56
|
},
|
|
57
57
|
"publishConfig": {
|
|
58
58
|
"access": "public"
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
resolveQuote,
|
|
24
24
|
type SDKRequestOptions,
|
|
25
25
|
type SignActionsContext,
|
|
26
|
+
type SignActionsResult,
|
|
26
27
|
type StorageAdapter,
|
|
27
28
|
} from '@lifi/perps-sdk'
|
|
28
29
|
import {
|
|
@@ -49,8 +50,8 @@ import {
|
|
|
49
50
|
type PositionsResponse,
|
|
50
51
|
type Quote,
|
|
51
52
|
type SetupAction,
|
|
52
|
-
type SignedActionStep,
|
|
53
53
|
type SigningMethod,
|
|
54
|
+
UserActionStatus,
|
|
54
55
|
} from '@lifi/perps-types'
|
|
55
56
|
import { type Address, type Hex, isAddress } from 'viem'
|
|
56
57
|
import { projectHyperliquidConfigSettings } from './accountConfig.js'
|
|
@@ -294,15 +295,24 @@ export function hyperliquidProvider(
|
|
|
294
295
|
return {}
|
|
295
296
|
},
|
|
296
297
|
|
|
297
|
-
signActions: (
|
|
298
|
+
signActions: async (
|
|
298
299
|
method: SigningMethod,
|
|
299
300
|
steps: ActionStep[],
|
|
300
301
|
address: Address,
|
|
301
302
|
ctx?: SignActionsContext
|
|
302
|
-
): Promise<
|
|
303
|
-
hyperliquidSignActions(
|
|
303
|
+
): Promise<SignActionsResult> => ({
|
|
304
|
+
signed: await hyperliquidSignActions(
|
|
305
|
+
agentStore,
|
|
306
|
+
method,
|
|
307
|
+
steps,
|
|
308
|
+
address,
|
|
309
|
+
ctx
|
|
310
|
+
),
|
|
311
|
+
executed: [],
|
|
312
|
+
}),
|
|
304
313
|
|
|
305
|
-
// A
|
|
314
|
+
// A session-agent revoke the venue acknowledged leaves the stored key
|
|
315
|
+
// unusable. An indeterminate or failed revoke keeps it.
|
|
306
316
|
onExecuteResults: async (
|
|
307
317
|
address: Address,
|
|
308
318
|
results: ActionResult[]
|
|
@@ -310,7 +320,9 @@ export function hyperliquidProvider(
|
|
|
310
320
|
if (
|
|
311
321
|
results.some(
|
|
312
322
|
(result) =>
|
|
313
|
-
result.
|
|
323
|
+
result.action === ActionType.REVOKE_SESSION_AGENT &&
|
|
324
|
+
(result.status === UserActionStatus.Submitted ||
|
|
325
|
+
result.status === UserActionStatus.Accepted)
|
|
314
326
|
)
|
|
315
327
|
) {
|
|
316
328
|
await agentStore.remove(address)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type AssetRegistry,
|
|
2
3
|
calculateTransferable,
|
|
4
|
+
getAssetRegistry,
|
|
3
5
|
getMarketRegistry,
|
|
4
6
|
getMarketsContext,
|
|
5
7
|
isDecimalStringGreaterThan,
|
|
@@ -68,7 +70,8 @@ const buildBalances = (
|
|
|
68
70
|
stateByDex: Map<string, HlClearinghouseState>,
|
|
69
71
|
quoteAssetIds: ReadonlySet<string>,
|
|
70
72
|
priceById: ReadonlyMap<string, DecimalString>,
|
|
71
|
-
quoteAssetByCategory: Map<string, Asset
|
|
73
|
+
quoteAssetByCategory: Map<string, Asset>,
|
|
74
|
+
assetRegistry: AssetRegistry
|
|
72
75
|
): BalancePartition => {
|
|
73
76
|
const { balances, collateralBalances } = partitionSpotBalances(
|
|
74
77
|
spotState.balances
|
|
@@ -85,7 +88,11 @@ const buildBalances = (
|
|
|
85
88
|
PROVIDER_KEY
|
|
86
89
|
)
|
|
87
90
|
return {
|
|
88
|
-
...spotBalance(
|
|
91
|
+
...spotBalance(
|
|
92
|
+
spotAssetFromToken(b, assetRegistry.get(String(b.token))),
|
|
93
|
+
total,
|
|
94
|
+
priceById
|
|
95
|
+
),
|
|
89
96
|
transferable: calculateTransferable(
|
|
90
97
|
subtractDecimalString(total, hold),
|
|
91
98
|
total
|
|
@@ -168,6 +175,7 @@ export const getAccount = async (
|
|
|
168
175
|
const quoteAssetByCategory = new Map(
|
|
169
176
|
markets.map((m) => [m.categoryId, m.quoteAsset])
|
|
170
177
|
)
|
|
178
|
+
const assetRegistry = getAssetRegistry(client, PROVIDER_KEY)
|
|
171
179
|
|
|
172
180
|
const [
|
|
173
181
|
feesResult,
|
|
@@ -214,6 +222,7 @@ export const getAccount = async (
|
|
|
214
222
|
)
|
|
215
223
|
),
|
|
216
224
|
getMarketsContext(client, { provider: PROVIDER_KEY }, options),
|
|
225
|
+
assetRegistry.sync(),
|
|
217
226
|
])
|
|
218
227
|
|
|
219
228
|
const priceById = spotPriceById(
|
|
@@ -271,7 +280,8 @@ export const getAccount = async (
|
|
|
271
280
|
stateByDex,
|
|
272
281
|
quoteAssetIds,
|
|
273
282
|
priceById,
|
|
274
|
-
quoteAssetByCategory
|
|
283
|
+
quoteAssetByCategory,
|
|
284
|
+
assetRegistry
|
|
275
285
|
)
|
|
276
286
|
|
|
277
287
|
const marginUsed = safeAddDecimalStrings(
|
package/src/utils/liquidation.ts
CHANGED
|
@@ -61,6 +61,8 @@ export const safeCalculateMaintenanceMarginRate = createSafeFunction(
|
|
|
61
61
|
* @param leverage - User-selected leverage (e.g., `'10'`)
|
|
62
62
|
* @param maxLeverage - Asset's maximum leverage (e.g., 50 for BTC). Sets
|
|
63
63
|
* mmr = 1 / (2 × maxLeverage).
|
|
64
|
+
* @returns The estimate, or `undefined` when `leverage` is at or above
|
|
65
|
+
* `2 × maxLeverage`, as {@link estimateLiquidationPrice} documents.
|
|
64
66
|
* @throws {PerpsError} `ValidationError` when `maxLeverage` is not a finite
|
|
65
67
|
* number above zero, or on an input that `estimateLiquidationPrice` rejects.
|
|
66
68
|
* @public
|
|
@@ -70,7 +72,7 @@ export function calculateLiquidationPrice(
|
|
|
70
72
|
leverage: string,
|
|
71
73
|
isLong: boolean,
|
|
72
74
|
maxLeverage: number
|
|
73
|
-
): string {
|
|
75
|
+
): string | undefined {
|
|
74
76
|
return estimateLiquidationPrice({
|
|
75
77
|
entryPrice,
|
|
76
78
|
leverage,
|
package/src/utils/spotBalance.ts
CHANGED
|
@@ -38,12 +38,19 @@ export const spotPriceById = (
|
|
|
38
38
|
* Convert a Hyperliquid spot balance's numeric token index into an SDK asset.
|
|
39
39
|
* The balance payload has no `fullName`, so logo resolution uses the base
|
|
40
40
|
* `_spot` URI rule rather than Unit-underlying lookup.
|
|
41
|
+
* @param registered - The registry `Asset` with the same `id`; only its `decimals` is copied.
|
|
41
42
|
* @public
|
|
42
43
|
*/
|
|
43
|
-
export const spotAssetFromToken = (
|
|
44
|
+
export const spotAssetFromToken = (
|
|
45
|
+
b: HlSpotBalance,
|
|
46
|
+
registered?: Asset
|
|
47
|
+
): Asset => ({
|
|
44
48
|
...coinAsset(b.coin),
|
|
45
49
|
id: String(b.token),
|
|
46
50
|
logoURI: spotLogoURI(b.coin),
|
|
51
|
+
...(registered?.decimals === undefined
|
|
52
|
+
? {}
|
|
53
|
+
: { decimals: registered.decimals }),
|
|
47
54
|
})
|
|
48
55
|
|
|
49
56
|
/** Assemble a typed spot {@link Balance}; `total` is native token units and its unit price and USD value use `priceById`. @public */
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isDecimalString,
|
|
3
3
|
isDecimalStringGreaterThan,
|
|
4
|
+
isPositionMarginAdjustable,
|
|
5
|
+
isPositionMarginRemovable,
|
|
4
6
|
multiplyDecimalString,
|
|
5
7
|
PerpsError,
|
|
6
|
-
positionSupportsMarginAdjustment,
|
|
7
|
-
positionSupportsMarginRemoval,
|
|
8
8
|
roundDecimalString,
|
|
9
9
|
subtractDecimalString,
|
|
10
10
|
} from '@lifi/perps-sdk'
|
|
@@ -65,10 +65,10 @@ function requirePositivePositionAmount(
|
|
|
65
65
|
export function positionRemovableMargin(
|
|
66
66
|
position: Position
|
|
67
67
|
): DecimalString | undefined {
|
|
68
|
-
if (!
|
|
68
|
+
if (!isPositionMarginAdjustable(position)) {
|
|
69
69
|
return undefined
|
|
70
70
|
}
|
|
71
|
-
if (!
|
|
71
|
+
if (!isPositionMarginRemovable(position)) {
|
|
72
72
|
return '0'
|
|
73
73
|
}
|
|
74
74
|
const marginUsed = requirePositionAmount(position.marginUsed, 'marginUsed')
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type AssetRegistry,
|
|
2
3
|
addDecimalString,
|
|
3
4
|
calculateTransferable,
|
|
4
5
|
compareDecimalStrings,
|
|
5
6
|
DecodeChain,
|
|
7
|
+
getAssetRegistry,
|
|
6
8
|
getMarketRegistry,
|
|
7
9
|
isActiveMarket,
|
|
8
10
|
isActiveOrderStatus,
|
|
@@ -154,6 +156,7 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
154
156
|
private readonly clearinghouseRefs = new Map<string, number>()
|
|
155
157
|
private readonly client: PerpsSDKClient | undefined
|
|
156
158
|
private readonly registry: MarketRegistry | undefined
|
|
159
|
+
private readonly assetRegistry: AssetRegistry | undefined
|
|
157
160
|
private readonly accountChecksByUser = new Map<string, Promise<void>>()
|
|
158
161
|
// Spot-funded modes need both spot valuation and clearinghouse margin state.
|
|
159
162
|
private readonly abstractionByUser = new Map<
|
|
@@ -242,6 +245,7 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
242
245
|
)
|
|
243
246
|
this.client = client
|
|
244
247
|
this.registry = client && getMarketRegistry(client, providerKey)
|
|
248
|
+
this.assetRegistry = client && getAssetRegistry(client, providerKey)
|
|
245
249
|
const orderApiUrl = new URL(wsUrl)
|
|
246
250
|
orderApiUrl.protocol = orderApiUrl.protocol === 'wss:' ? 'https:' : 'http:'
|
|
247
251
|
this.orderApiUrl = orderApiUrl.origin
|
|
@@ -1331,6 +1335,7 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
1331
1335
|
}
|
|
1332
1336
|
}
|
|
1333
1337
|
try {
|
|
1338
|
+
await this.assetRegistry?.sync()
|
|
1334
1339
|
if (count === 0) {
|
|
1335
1340
|
await this.registerSub(wireKey, payload)
|
|
1336
1341
|
}
|
|
@@ -1595,7 +1600,14 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
1595
1600
|
const rows = balances.map(({ balance, total }) => {
|
|
1596
1601
|
const free = safeSubtractDecimalString(total, balance.hold)
|
|
1597
1602
|
return {
|
|
1598
|
-
...spotBalance(
|
|
1603
|
+
...spotBalance(
|
|
1604
|
+
spotAssetFromToken(
|
|
1605
|
+
balance,
|
|
1606
|
+
this.assetRegistry?.get(String(balance.token))
|
|
1607
|
+
),
|
|
1608
|
+
total,
|
|
1609
|
+
priceById
|
|
1610
|
+
),
|
|
1599
1611
|
locked: balance.hold,
|
|
1600
1612
|
transferable:
|
|
1601
1613
|
free === undefined ? '0' : calculateTransferable(free, total),
|