@lifi/perps-sdk-provider-hyperliquid 4.2.0 → 4.3.1
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/accountConfig.d.ts.map +1 -1
- package/dist/cjs/accountConfig.js +1 -0
- package/dist/cjs/accountConfig.js.map +1 -1
- package/dist/cjs/utils/assetLogo.d.ts +5 -0
- package/dist/cjs/utils/assetLogo.d.ts.map +1 -0
- package/dist/cjs/utils/assetLogo.js +47 -0
- package/dist/cjs/utils/assetLogo.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +5 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/infoClient.d.ts.map +1 -1
- package/dist/cjs/utils/infoClient.js +17 -1
- package/dist/cjs/utils/infoClient.js.map +1 -1
- package/dist/cjs/utils/mapMarket.d.ts.map +1 -1
- package/dist/cjs/utils/mapMarket.js +3 -0
- package/dist/cjs/utils/mapMarket.js.map +1 -1
- package/dist/cjs/utils/marketDisplay.d.ts.map +1 -1
- package/dist/cjs/utils/marketDisplay.js +5 -2
- package/dist/cjs/utils/marketDisplay.js.map +1 -1
- package/dist/cjs/utils/spotBalance.d.ts.map +1 -1
- package/dist/cjs/utils/spotBalance.js +2 -0
- package/dist/cjs/utils/spotBalance.js.map +1 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.js +22 -6
- package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/esm/accountConfig.d.ts.map +1 -1
- package/dist/esm/accountConfig.js +1 -0
- package/dist/esm/accountConfig.js.map +1 -1
- package/dist/esm/utils/assetLogo.d.ts +20 -0
- package/dist/esm/utils/assetLogo.d.ts.map +1 -0
- package/dist/esm/utils/assetLogo.js +74 -0
- package/dist/esm/utils/assetLogo.js.map +1 -0
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/infoClient.d.ts.map +1 -1
- package/dist/esm/utils/infoClient.js +17 -1
- package/dist/esm/utils/infoClient.js.map +1 -1
- package/dist/esm/utils/mapMarket.d.ts.map +1 -1
- package/dist/esm/utils/mapMarket.js +3 -0
- package/dist/esm/utils/mapMarket.js.map +1 -1
- package/dist/esm/utils/marketDisplay.d.ts +5 -4
- package/dist/esm/utils/marketDisplay.d.ts.map +1 -1
- package/dist/esm/utils/marketDisplay.js +10 -6
- package/dist/esm/utils/marketDisplay.js.map +1 -1
- package/dist/esm/utils/spotBalance.d.ts +3 -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/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.js +23 -7
- package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/types/accountConfig.d.ts.map +1 -1
- package/dist/types/utils/assetLogo.d.ts +20 -0
- package/dist/types/utils/assetLogo.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/infoClient.d.ts.map +1 -1
- package/dist/types/utils/mapMarket.d.ts.map +1 -1
- package/dist/types/utils/marketDisplay.d.ts +5 -4
- package/dist/types/utils/marketDisplay.d.ts.map +1 -1
- package/dist/types/utils/spotBalance.d.ts +3 -1
- package/dist/types/utils/spotBalance.d.ts.map +1 -1
- package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/accountConfig.ts +1 -0
- package/src/utils/assetLogo.ts +85 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/infoClient.ts +20 -1
- package/src/utils/mapMarket.ts +3 -0
- package/src/utils/marketDisplay.ts +15 -10
- package/src/utils/spotBalance.ts +5 -1
- package/src/websocket/HyperliquidWsProvider.ts +28 -6
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Asset } from '@lifi/perps-types';
|
|
2
|
+
/** Token `name`s of the Unit-bridged HL spot assets. */
|
|
3
|
+
export declare const UNIT_TOKEN_NAMES: ReadonlySet<string>;
|
|
4
|
+
/** Return `asset` with its `logoURI` replaced when a display-symbol override exists. */
|
|
5
|
+
export declare const applyLogoOverride: (asset: Asset) => Asset;
|
|
6
|
+
/**
|
|
7
|
+
* Override-aware logo URI for a Hyperliquid spot token. Base rule is
|
|
8
|
+
* `coins/${name}_spot.svg`; a Unit-bridged token (`fullName` starts with
|
|
9
|
+
* "Unit") resolves to its underlying's icon instead; the override table wins
|
|
10
|
+
* over both.
|
|
11
|
+
*
|
|
12
|
+
* When `fullName` is absent — spot *balances* (`HlSpotBalance`) carry no
|
|
13
|
+
* `fullName` and this issue deliberately does not fetch `spotMeta` on the
|
|
14
|
+
* account path — the derivation degrades to the symbol-keyed override + base
|
|
15
|
+
* `_spot` rule, so a Unit-bridged balance uses the base rule rather than its
|
|
16
|
+
* underlying's icon. The registry path (which has `fullName`) keeps full Unit
|
|
17
|
+
* resolution.
|
|
18
|
+
*/
|
|
19
|
+
export declare const spotLogoURI: (name: string, fullName?: string | null) => string;
|
|
20
|
+
//# sourceMappingURL=assetLogo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assetLogo.d.ts","sourceRoot":"","sources":["../../../src/utils/assetLogo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAiD9C,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAEhD,CAAA;AAQD,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,KAAG,KAGhD,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,WAAW,MAAM,GAAG,IAAI,KAAG,MAKpE,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { assetIsSpot, calculateAssetId, getProviderIndex } from './assetId.js';
|
|
2
|
+
export { applyLogoOverride, spotLogoURI, UNIT_TOKEN_NAMES, } from './assetLogo.js';
|
|
2
3
|
export { decodeCompressedJson, decodeFastAssetCtxs, } from './decodeFastAssetCtxs.js';
|
|
3
4
|
export type { InfoRequestOptions } from './infoClient.js';
|
|
4
5
|
export { hlInfoOptions, infoRequest } from './infoClient.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EACL,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EACL,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infoClient.d.ts","sourceRoot":"","sources":["../../../src/utils/infoClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAExB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"infoClient.d.ts","sourceRoot":"","sources":["../../../src/utils/infoClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAExB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAA;AAuBxB,gBAAgB;AAChB,eAAO,MAAM,0BAA0B,EAAE,mBAmBxC,CAAA;AAED,cAAc;AACd,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,cAAc,EACtB,UAAU,iBAAiB,KAC1B,kBAQD,CAAA;AAEF;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,CAAC,CAAC,CAqCZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapMarket.d.ts","sourceRoot":"","sources":["../../../src/utils/mapMarket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAQvD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,cAAc,EACxB,YAAY,MAAM,KACjB,
|
|
1
|
+
{"version":3,"file":"mapMarket.d.ts","sourceRoot":"","sources":["../../../src/utils/mapMarket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAQvD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,cAAc,EACxB,YAAY,MAAM,KACjB,WAcD,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { Asset, Market } from '@lifi/perps-types';
|
|
2
2
|
/**
|
|
3
|
-
* Synthesise the {@link Asset} for a Hyperliquid wire coin. `id`
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Synthesise the {@link Asset} for a Hyperliquid wire coin. `id` keeps the raw
|
|
4
|
+
* coin — the logo CDN is keyed by it, HIP-3 `dex:` prefix included.
|
|
5
|
+
* `displaySymbol` drops the prefix: the category is carried by `categoryId`,
|
|
6
|
+
* never by the display string. `logoURI` is the CDN URL corrected by the
|
|
7
|
+
* shared override table (see {@link applyLogoOverride}).
|
|
7
8
|
* @public
|
|
8
9
|
*/
|
|
9
10
|
export declare const coinAsset: (coin: string) => Asset;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketDisplay.d.ts","sourceRoot":"","sources":["../../../src/utils/marketDisplay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"marketDisplay.d.ts","sourceRoot":"","sources":["../../../src/utils/marketDisplay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAStD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,KAQrC,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,SAAS,MAAM,EAAE,KAAG,MAAM,EAShE,CAAA"}
|
|
@@ -10,7 +10,9 @@ export declare const spotPriceById: (markets: readonly Market[], priceByMarketId
|
|
|
10
10
|
/**
|
|
11
11
|
* The held spot {@link Asset} for an HL balance: the venue token index
|
|
12
12
|
* (`b.token`) as `Asset.id` — equal to that token's spot `Market.baseAsset.id`
|
|
13
|
-
* — with display fields derived from the coin.
|
|
13
|
+
* — with display fields derived from the coin and the override-aware spot logo.
|
|
14
|
+
* `HlSpotBalance` carries no `fullName`, so Unit-bridged balances take the base
|
|
15
|
+
* `_spot` rule (see {@link spotLogoURI}).
|
|
14
16
|
*/
|
|
15
17
|
export declare const spotAssetFromToken: (b: HlSpotBalance) => Asset;
|
|
16
18
|
/** Assemble a typed spot {@link Balance} from its resolved asset and raw size. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotBalance.d.ts","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"spotBalance.d.ts","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/D,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,MAAM,CAAC,KAC3C,GAAG,CAAC,MAAM,EAAE,MAAM,CAapB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,aAAa,KAAG,KAIpD,CAAA;AAEF,kFAAkF;AAClF,eAAO,MAAM,WAAW,GACtB,OAAO,KAAK,EACZ,OAAO,MAAM,EACb,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,OAKD,CAAA"}
|
|
@@ -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": "4.
|
|
3
|
+
"version": "4.3.1",
|
|
4
4
|
"description": "Hyperliquid provider plugin for @lifi/perps-sdk",
|
|
5
5
|
"homepage": "https://github.com/lifinance/perps-sdk",
|
|
6
6
|
"bugs": {
|
|
@@ -48,10 +48,10 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"big.js": "^7.0.1",
|
|
50
50
|
"viem": "^2.48.8",
|
|
51
|
-
"@lifi/perps-types": "^3.1
|
|
51
|
+
"@lifi/perps-types": "^3.3.1"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
|
-
"@lifi/perps-sdk": "^4.
|
|
54
|
+
"@lifi/perps-sdk": "^4.3.1"
|
|
55
55
|
},
|
|
56
56
|
"publishConfig": {
|
|
57
57
|
"access": "public"
|
package/src/accountConfig.ts
CHANGED
|
@@ -61,6 +61,7 @@ function projectHyperliquidDescriptor(
|
|
|
61
61
|
case ActionType.REGISTER_API_KEY:
|
|
62
62
|
case ActionType.APPROVE_READ_ONLY_TOKEN:
|
|
63
63
|
case ActionType.SIWE_LOGIN:
|
|
64
|
+
case ActionType.CREATE_DEPOSIT_ADDRESS:
|
|
64
65
|
case ActionType.ACCEPT_PROVIDER_TERMS:
|
|
65
66
|
case ActionType.DEPOSIT:
|
|
66
67
|
case ActionType.META_VOTE:
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Asset } from '@lifi/perps-types'
|
|
2
|
+
|
|
3
|
+
const HL_COIN_CDN = 'https://app.hyperliquid.xyz/coins'
|
|
4
|
+
|
|
5
|
+
const HYPE_LOGO_URI =
|
|
6
|
+
'https://static.debank.com/image/hyper_token/logo_url/hyper/0b3e288cfe418e9ce69eef4c96374583.png'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Per-symbol logo overrides applied on top of the derived HL CDN URL, keyed by
|
|
10
|
+
* `Asset.displaySymbol`. Each entry notes why the default URL is wrong.
|
|
11
|
+
*/
|
|
12
|
+
const BASE_ASSET_LOGO_OVERRIDES: Readonly<Record<string, string>> = {
|
|
13
|
+
// coins/HYPE.svg is low quality; the debank hyper_token PNG is the canonical icon.
|
|
14
|
+
HYPE: HYPE_LOGO_URI,
|
|
15
|
+
// coins/USDC_spot.svg doesn't exist — HL's app 200s with its SPA shell HTML
|
|
16
|
+
// instead of a 404, so the collateral asset needs the non-suffixed path.
|
|
17
|
+
USDC: `${HL_COIN_CDN}/USDC.svg`,
|
|
18
|
+
// Neither coins/USDT0.svg nor coins/USDT0_spot.svg serves an image (both 200
|
|
19
|
+
// with the SPA shell); USDT0 is HL's USDT deployment, so reuse USDT's icon.
|
|
20
|
+
USDT0: `${HL_COIN_CDN}/USDT.svg`,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Underlying spot symbol for each Unit-bridged token (`fullName` starts with
|
|
25
|
+
* "Unit"), keyed by the token `name`. Hand-verified that `coins/<symbol>.svg`
|
|
26
|
+
* serves a real image; the Unit-suffixed `NAME_spot.svg` path 200s with HTML
|
|
27
|
+
* instead. Unit tokens absent here have no working HL icon and intentionally
|
|
28
|
+
* resolve to '' (client letter avatar).
|
|
29
|
+
*/
|
|
30
|
+
const UNIT_UNDERLYING_SYMBOL: Readonly<Record<string, string>> = {
|
|
31
|
+
UBTC: 'BTC',
|
|
32
|
+
UETH: 'ETH',
|
|
33
|
+
USOL: 'SOL',
|
|
34
|
+
UFART: 'FARTCOIN',
|
|
35
|
+
UPUMP: 'PUMP',
|
|
36
|
+
UUUSPX: 'SPX',
|
|
37
|
+
UVIRT: 'VIRTUAL',
|
|
38
|
+
UBONK: 'BONK',
|
|
39
|
+
UDOGE: 'DOGE',
|
|
40
|
+
UZEC: 'ZEC',
|
|
41
|
+
UMON: 'MON',
|
|
42
|
+
UWLD: 'WLD',
|
|
43
|
+
UENA: 'ENA',
|
|
44
|
+
UXPL: 'XPL',
|
|
45
|
+
UAVAX: 'AVAX',
|
|
46
|
+
UMEGA: 'MEGA',
|
|
47
|
+
UANSEM: 'ANSEM',
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Token `name`s of the Unit-bridged HL spot assets. */
|
|
51
|
+
export const UNIT_TOKEN_NAMES: ReadonlySet<string> = new Set(
|
|
52
|
+
Object.keys(UNIT_UNDERLYING_SYMBOL)
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
/** Logo URI for a Unit-bridged spot token; '' when the underlying is unmapped. */
|
|
56
|
+
const unitSpotLogoURI = (name: string): string => {
|
|
57
|
+
const underlying = UNIT_UNDERLYING_SYMBOL[name]
|
|
58
|
+
return underlying === undefined ? '' : `${HL_COIN_CDN}/${underlying}.svg`
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Return `asset` with its `logoURI` replaced when a display-symbol override exists. */
|
|
62
|
+
export const applyLogoOverride = (asset: Asset): Asset => {
|
|
63
|
+
const override = BASE_ASSET_LOGO_OVERRIDES[asset.displaySymbol]
|
|
64
|
+
return override === undefined ? asset : { ...asset, logoURI: override }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Override-aware logo URI for a Hyperliquid spot token. Base rule is
|
|
69
|
+
* `coins/${name}_spot.svg`; a Unit-bridged token (`fullName` starts with
|
|
70
|
+
* "Unit") resolves to its underlying's icon instead; the override table wins
|
|
71
|
+
* over both.
|
|
72
|
+
*
|
|
73
|
+
* When `fullName` is absent — spot *balances* (`HlSpotBalance`) carry no
|
|
74
|
+
* `fullName` and this issue deliberately does not fetch `spotMeta` on the
|
|
75
|
+
* account path — the derivation degrades to the symbol-keyed override + base
|
|
76
|
+
* `_spot` rule, so a Unit-bridged balance uses the base rule rather than its
|
|
77
|
+
* underlying's icon. The registry path (which has `fullName`) keeps full Unit
|
|
78
|
+
* resolution.
|
|
79
|
+
*/
|
|
80
|
+
export const spotLogoURI = (name: string, fullName?: string | null): string => {
|
|
81
|
+
const base = fullName?.startsWith('Unit')
|
|
82
|
+
? unitSpotLogoURI(name)
|
|
83
|
+
: `${HL_COIN_CDN}/${name}_spot.svg`
|
|
84
|
+
return BASE_ASSET_LOGO_OVERRIDES[name] ?? base
|
|
85
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
// (e.g. `./assetId.js`, `./mapFill.js`) directly.
|
|
4
4
|
|
|
5
5
|
export { assetIsSpot, calculateAssetId, getProviderIndex } from './assetId.js'
|
|
6
|
+
export {
|
|
7
|
+
applyLogoOverride,
|
|
8
|
+
spotLogoURI,
|
|
9
|
+
UNIT_TOKEN_NAMES,
|
|
10
|
+
} from './assetLogo.js'
|
|
6
11
|
export {
|
|
7
12
|
decodeCompressedJson,
|
|
8
13
|
decodeFastAssetCtxs,
|
package/src/utils/infoClient.ts
CHANGED
|
@@ -7,8 +7,27 @@ import {
|
|
|
7
7
|
type SDKRequestOptions,
|
|
8
8
|
} from '@lifi/perps-sdk'
|
|
9
9
|
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
10
|
+
import { isAddress } from 'viem'
|
|
10
11
|
import { PROVIDER_KEY } from '../constants.js'
|
|
11
12
|
|
|
13
|
+
const normalizeInfoValue = (value: unknown): unknown => {
|
|
14
|
+
if (typeof value === 'string') {
|
|
15
|
+
return isAddress(value, { strict: false }) ? value.toLowerCase() : value
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
return value.map(normalizeInfoValue)
|
|
19
|
+
}
|
|
20
|
+
if (value !== null && typeof value === 'object') {
|
|
21
|
+
return Object.fromEntries(
|
|
22
|
+
Object.entries(value).map(([key, nestedValue]) => [
|
|
23
|
+
key,
|
|
24
|
+
normalizeInfoValue(nestedValue),
|
|
25
|
+
])
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
return value
|
|
29
|
+
}
|
|
30
|
+
|
|
12
31
|
/** @internal */
|
|
13
32
|
export const HYPERLIQUID_RETRY_DEFAULTS: ResolvedRetryPolicy = {
|
|
14
33
|
enabled: true,
|
|
@@ -81,7 +100,7 @@ export async function infoRequest<T>(
|
|
|
81
100
|
{
|
|
82
101
|
method: 'POST',
|
|
83
102
|
headers: { 'Content-Type': 'application/json' },
|
|
84
|
-
body: JSON.stringify(body),
|
|
103
|
+
body: JSON.stringify(normalizeInfoValue(body)),
|
|
85
104
|
},
|
|
86
105
|
{
|
|
87
106
|
policy,
|
package/src/utils/mapMarket.ts
CHANGED
|
@@ -22,6 +22,9 @@ export const mapMarket = (
|
|
|
22
22
|
): PerpsMarket => ({
|
|
23
23
|
providerId: PROVIDER_KEY,
|
|
24
24
|
id: universe.name,
|
|
25
|
+
...(universe.isDelisted === undefined
|
|
26
|
+
? {}
|
|
27
|
+
: { isDelisted: universe.isDelisted }),
|
|
25
28
|
categoryId,
|
|
26
29
|
baseAsset: coinAsset(universe.name),
|
|
27
30
|
quoteAsset: coinAsset(QUOTE_SYMBOL),
|
|
@@ -5,20 +5,25 @@ import {
|
|
|
5
5
|
PROVIDER_KEY,
|
|
6
6
|
SPOT_MARKET_ID,
|
|
7
7
|
} from '../constants.js'
|
|
8
|
+
import { applyLogoOverride } from './assetLogo.js'
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
|
-
* Synthesise the {@link Asset} for a Hyperliquid wire coin. `id`
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Synthesise the {@link Asset} for a Hyperliquid wire coin. `id` keeps the raw
|
|
12
|
+
* coin — the logo CDN is keyed by it, HIP-3 `dex:` prefix included.
|
|
13
|
+
* `displaySymbol` drops the prefix: the category is carried by `categoryId`,
|
|
14
|
+
* never by the display string. `logoURI` is the CDN URL corrected by the
|
|
15
|
+
* shared override table (see {@link applyLogoOverride}).
|
|
14
16
|
* @public
|
|
15
17
|
*/
|
|
16
|
-
export const coinAsset = (coin: string): Asset =>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
export const coinAsset = (coin: string): Asset =>
|
|
19
|
+
applyLogoOverride({
|
|
20
|
+
providerId: PROVIDER_KEY,
|
|
21
|
+
id: coin,
|
|
22
|
+
displaySymbol: coin.includes(':')
|
|
23
|
+
? coin.slice(coin.indexOf(':') + 1)
|
|
24
|
+
: coin,
|
|
25
|
+
logoURI: `https://app.hyperliquid.xyz/coins/${coin}.svg`,
|
|
26
|
+
})
|
|
22
27
|
|
|
23
28
|
/**
|
|
24
29
|
* Distinct wire `dex` names to fan `clearinghouseState` / `frontendOpenOrders`
|
package/src/utils/spotBalance.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { stringToFloat } from '@lifi/perps-sdk'
|
|
|
2
2
|
import type { Asset, Balance, Market } from '@lifi/perps-types'
|
|
3
3
|
import { SPOT_MARKET_ID } from '../constants.js'
|
|
4
4
|
import type { HlSpotBalance } from '../types/index.js'
|
|
5
|
+
import { spotLogoURI } from './assetLogo.js'
|
|
5
6
|
import { coinAsset } from './marketDisplay.js'
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -31,11 +32,14 @@ export const spotPriceById = (
|
|
|
31
32
|
/**
|
|
32
33
|
* The held spot {@link Asset} for an HL balance: the venue token index
|
|
33
34
|
* (`b.token`) as `Asset.id` — equal to that token's spot `Market.baseAsset.id`
|
|
34
|
-
* — with display fields derived from the coin.
|
|
35
|
+
* — with display fields derived from the coin and the override-aware spot logo.
|
|
36
|
+
* `HlSpotBalance` carries no `fullName`, so Unit-bridged balances take the base
|
|
37
|
+
* `_spot` rule (see {@link spotLogoURI}).
|
|
35
38
|
*/
|
|
36
39
|
export const spotAssetFromToken = (b: HlSpotBalance): Asset => ({
|
|
37
40
|
...coinAsset(b.coin),
|
|
38
41
|
id: String(b.token),
|
|
42
|
+
logoURI: spotLogoURI(b.coin),
|
|
39
43
|
})
|
|
40
44
|
|
|
41
45
|
/** Assemble a typed spot {@link Balance} from its resolved asset and raw size. */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getMarketRegistry,
|
|
3
|
+
isActiveMarket,
|
|
3
4
|
isActiveOrderStatus,
|
|
4
5
|
type MarketRegistry,
|
|
5
6
|
type PerpsSDKClient,
|
|
@@ -28,6 +29,7 @@ import {
|
|
|
28
29
|
type TriggerOrder,
|
|
29
30
|
} from '@lifi/perps-types'
|
|
30
31
|
import Big from 'big.js'
|
|
32
|
+
import { isAddress } from 'viem'
|
|
31
33
|
import {
|
|
32
34
|
DEFAULT_HYPERLIQUID_API_URL,
|
|
33
35
|
HYPERLIQUID_FEE_TIER_FALLBACK,
|
|
@@ -80,6 +82,9 @@ import { DecodeChain } from './decodeChain.js'
|
|
|
80
82
|
/** HL's compact `l2` snapshot carries 20 levels per side. */
|
|
81
83
|
const HL_L2_BOOK_MAX_LEVELS_PER_SIDE = 20
|
|
82
84
|
|
|
85
|
+
const normalizeHlAddress = (address: string): string =>
|
|
86
|
+
isAddress(address, { strict: false }) ? address.toLowerCase() : address
|
|
87
|
+
|
|
83
88
|
/**
|
|
84
89
|
* `WsProviderFactory` constructor for Hyperliquid — pass to
|
|
85
90
|
* `new PerpsWsClient(client, { wsProviders: { hyperliquid: hyperliquidWsProvider() } })`.
|
|
@@ -249,6 +254,16 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
249
254
|
|
|
250
255
|
await this.registry?.sync()
|
|
251
256
|
|
|
257
|
+
if (
|
|
258
|
+
this.registry !== undefined &&
|
|
259
|
+
(sub.channel === 'marketContext' ||
|
|
260
|
+
sub.channel === 'orderbook' ||
|
|
261
|
+
sub.channel === 'candle' ||
|
|
262
|
+
sub.channel === 'trades')
|
|
263
|
+
) {
|
|
264
|
+
this.registry.requireActive(sub.marketId)
|
|
265
|
+
}
|
|
266
|
+
|
|
252
267
|
// Markets context aggregates slower asset-context feeds with fast mid/mark
|
|
253
268
|
// ticks from `fastAssetCtxs`.
|
|
254
269
|
if (sub.channel === 'marketsContext') {
|
|
@@ -535,14 +550,17 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
535
550
|
coin: sub.marketId,
|
|
536
551
|
}
|
|
537
552
|
case 'orderUpdates':
|
|
538
|
-
return { type: 'orderUpdates', user: sub.address }
|
|
553
|
+
return { type: 'orderUpdates', user: normalizeHlAddress(sub.address) }
|
|
539
554
|
case 'fills':
|
|
540
|
-
return { type: 'userFills', user: sub.address }
|
|
555
|
+
return { type: 'userFills', user: normalizeHlAddress(sub.address) }
|
|
541
556
|
case 'positions':
|
|
542
557
|
case 'accountSummary':
|
|
543
|
-
return {
|
|
558
|
+
return {
|
|
559
|
+
type: 'allDexsClearinghouseState',
|
|
560
|
+
user: normalizeHlAddress(sub.address),
|
|
561
|
+
}
|
|
544
562
|
case 'spotBalances':
|
|
545
|
-
return { type: 'spotState', user: sub.address }
|
|
563
|
+
return { type: 'spotState', user: normalizeHlAddress(sub.address) }
|
|
546
564
|
}
|
|
547
565
|
}
|
|
548
566
|
|
|
@@ -688,7 +706,7 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
688
706
|
|
|
689
707
|
private spotMarketIdBySacKey(): Map<string, string> {
|
|
690
708
|
const map = new Map<string, string>()
|
|
691
|
-
for (const market of this.registry?.
|
|
709
|
+
for (const market of this.registry?.activeMarkets ?? []) {
|
|
692
710
|
if (market.categoryId !== SPOT_MARKET_ID) {
|
|
693
711
|
continue
|
|
694
712
|
}
|
|
@@ -751,6 +769,10 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
751
769
|
* other where it carries only one of mid/mark.
|
|
752
770
|
*/
|
|
753
771
|
private computeMarketContext(marketId: string): MarketContext | undefined {
|
|
772
|
+
const market = this.registry?.get(marketId)
|
|
773
|
+
if (market !== undefined && !isActiveMarket(market)) {
|
|
774
|
+
return undefined
|
|
775
|
+
}
|
|
754
776
|
const fast = this.fastCtxByMarketId[marketId]
|
|
755
777
|
const spotCtx = this.spotCtxByMarketId[marketId]
|
|
756
778
|
if (spotCtx !== undefined) {
|
|
@@ -1252,7 +1274,7 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
|
|
|
1252
1274
|
|
|
1253
1275
|
private handleSpotState(data: HlWsSpotStateData) {
|
|
1254
1276
|
const user = data.user.toLowerCase()
|
|
1255
|
-
const markets = this.registry?.
|
|
1277
|
+
const markets = this.registry?.activeMarkets ?? []
|
|
1256
1278
|
const priceById = spotPriceById(markets, this.mergedMids())
|
|
1257
1279
|
const rows = data.spotState.balances.map((b) => ({
|
|
1258
1280
|
balance: spotBalance(spotAssetFromToken(b), b.total, priceById),
|