@lifi/perps-types 0.1.1-alpha.9 → 0.2.0-alpha.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/package.json +18 -4
- package/providers/lighter/package.json +5 -0
- package/src/_cjs/{market.js → action.js} +1 -1
- package/src/_cjs/action.js.map +1 -0
- package/src/_cjs/{trading.js → asset.js} +1 -1
- package/src/_cjs/asset.js.map +1 -0
- package/src/_cjs/enums.js +81 -15
- package/src/_cjs/enums.js.map +1 -1
- package/src/_cjs/index.js +3 -4
- package/src/_cjs/index.js.map +1 -1
- package/src/_cjs/providers/_shared/fillClassification.js +37 -0
- package/src/_cjs/providers/_shared/fillClassification.js.map +1 -0
- package/src/_cjs/providers/hyperliquid/assetId.js +11 -9
- package/src/_cjs/providers/hyperliquid/assetId.js.map +1 -1
- package/src/_cjs/providers/hyperliquid/mappers/_market.js +15 -0
- package/src/_cjs/providers/hyperliquid/mappers/_market.js.map +1 -0
- package/src/_cjs/providers/hyperliquid/mappers/activity.js +80 -8
- package/src/_cjs/providers/hyperliquid/mappers/activity.js.map +1 -1
- package/src/_cjs/providers/hyperliquid/mappers/{market.js → asset.js} +10 -9
- package/src/_cjs/providers/hyperliquid/mappers/asset.js.map +1 -0
- package/src/_cjs/providers/hyperliquid/mappers/fill.js +36 -0
- package/src/_cjs/providers/hyperliquid/mappers/fill.js.map +1 -0
- package/src/_cjs/providers/hyperliquid/mappers/index.js +9 -7
- package/src/_cjs/providers/hyperliquid/mappers/index.js.map +1 -1
- package/src/_cjs/providers/hyperliquid/mappers/order.js +86 -9
- package/src/_cjs/providers/hyperliquid/mappers/order.js.map +1 -1
- package/src/_cjs/providers/hyperliquid/mappers/position.js +8 -5
- package/src/_cjs/providers/hyperliquid/mappers/position.js.map +1 -1
- package/src/_cjs/providers/hyperliquid/mappers/shared.js +0 -10
- package/src/_cjs/providers/hyperliquid/mappers/shared.js.map +1 -1
- package/src/_cjs/providers/hyperliquid/types.js +18 -0
- package/src/_cjs/providers/hyperliquid/types.js.map +1 -1
- package/src/_cjs/{authorization.js → providers/lighter/apiTypes.js} +1 -1
- package/src/_cjs/providers/lighter/apiTypes.js.map +1 -0
- package/src/_cjs/providers/lighter/index.js +20 -0
- package/src/_cjs/providers/lighter/index.js.map +1 -0
- package/src/_cjs/providers/lighter/mappers/fill.js +34 -0
- package/src/_cjs/providers/lighter/mappers/fill.js.map +1 -0
- package/src/_cjs/providers/lighter/mappers/index.js +13 -0
- package/src/_cjs/providers/lighter/mappers/index.js.map +1 -0
- package/src/_cjs/providers/lighter/mappers/order.js +142 -0
- package/src/_cjs/providers/lighter/mappers/order.js.map +1 -0
- package/src/_cjs/providers/lighter/mappers/position.js +35 -0
- package/src/_cjs/providers/lighter/mappers/position.js.map +1 -0
- package/src/_cjs/providers/lighter/types.js +23 -0
- package/src/_cjs/providers/lighter/types.js.map +1 -0
- package/src/_cjs/{withdrawal.js → providers.js} +1 -1
- package/src/_cjs/providers.js.map +1 -0
- package/src/_esm/action.js +2 -0
- package/src/_esm/action.js.map +1 -0
- package/src/_esm/asset.js +2 -0
- package/src/_esm/asset.js.map +1 -0
- package/src/_esm/enums.js +90 -14
- package/src/_esm/enums.js.map +1 -1
- package/src/_esm/index.js +3 -4
- package/src/_esm/index.js.map +1 -1
- package/src/_esm/providers/_shared/fillClassification.js +43 -0
- package/src/_esm/providers/_shared/fillClassification.js.map +1 -0
- package/src/_esm/providers/hyperliquid/assetId.js +13 -11
- package/src/_esm/providers/hyperliquid/assetId.js.map +1 -1
- package/src/_esm/providers/hyperliquid/mappers/_market.js +22 -0
- package/src/_esm/providers/hyperliquid/mappers/_market.js.map +1 -0
- package/src/_esm/providers/hyperliquid/mappers/activity.js +92 -13
- package/src/_esm/providers/hyperliquid/mappers/activity.js.map +1 -1
- package/src/_esm/providers/hyperliquid/mappers/{market.js → asset.js} +8 -7
- package/src/_esm/providers/hyperliquid/mappers/asset.js.map +1 -0
- package/src/_esm/providers/hyperliquid/mappers/fill.js +32 -0
- package/src/_esm/providers/hyperliquid/mappers/fill.js.map +1 -0
- package/src/_esm/providers/hyperliquid/mappers/index.js +3 -4
- package/src/_esm/providers/hyperliquid/mappers/index.js.map +1 -1
- package/src/_esm/providers/hyperliquid/mappers/order.js +88 -8
- package/src/_esm/providers/hyperliquid/mappers/order.js.map +1 -1
- package/src/_esm/providers/hyperliquid/mappers/position.js +8 -5
- package/src/_esm/providers/hyperliquid/mappers/position.js.map +1 -1
- package/src/_esm/providers/hyperliquid/mappers/shared.js +1 -12
- package/src/_esm/providers/hyperliquid/mappers/shared.js.map +1 -1
- package/src/_esm/providers/hyperliquid/types.js +32 -2
- package/src/_esm/providers/hyperliquid/types.js.map +1 -1
- package/src/_esm/providers/lighter/apiTypes.js +5 -0
- package/src/_esm/providers/lighter/apiTypes.js.map +1 -0
- package/src/_esm/providers/lighter/index.js +4 -0
- package/src/_esm/providers/lighter/index.js.map +1 -0
- package/src/_esm/providers/lighter/mappers/fill.js +39 -0
- package/src/_esm/providers/lighter/mappers/fill.js.map +1 -0
- package/src/_esm/providers/lighter/mappers/index.js +4 -0
- package/src/_esm/providers/lighter/mappers/index.js.map +1 -0
- package/src/_esm/providers/lighter/mappers/order.js +162 -0
- package/src/_esm/providers/lighter/mappers/order.js.map +1 -0
- package/src/_esm/providers/lighter/mappers/position.js +38 -0
- package/src/_esm/providers/lighter/mappers/position.js.map +1 -0
- package/src/_esm/providers/lighter/types.js +26 -0
- package/src/_esm/providers/lighter/types.js.map +1 -0
- package/src/_esm/providers.js +2 -0
- package/src/_esm/providers.js.map +1 -0
- package/src/_types/account.d.ts +178 -23
- package/src/_types/account.d.ts.map +1 -1
- package/src/_types/action.d.ts +261 -0
- package/src/_types/action.d.ts.map +1 -0
- package/src/_types/{market.d.ts → asset.d.ts} +23 -34
- package/src/_types/asset.d.ts.map +1 -0
- package/src/_types/enums.d.ts +76 -6
- package/src/_types/enums.d.ts.map +1 -1
- package/src/_types/index.d.ts +3 -4
- package/src/_types/index.d.ts.map +1 -1
- package/src/_types/providers/_shared/fillClassification.d.ts +12 -0
- package/src/_types/providers/_shared/fillClassification.d.ts.map +1 -0
- package/src/_types/providers/hyperliquid/assetId.d.ts +8 -6
- package/src/_types/providers/hyperliquid/assetId.d.ts.map +1 -1
- package/src/_types/providers/hyperliquid/mappers/_market.d.ts +13 -0
- package/src/_types/providers/hyperliquid/mappers/_market.d.ts.map +1 -0
- package/src/_types/providers/hyperliquid/mappers/activity.d.ts +7 -7
- package/src/_types/providers/hyperliquid/mappers/activity.d.ts.map +1 -1
- package/src/_types/providers/hyperliquid/mappers/asset.d.ts +4 -0
- package/src/_types/providers/hyperliquid/mappers/asset.d.ts.map +1 -0
- package/src/_types/providers/hyperliquid/mappers/fill.d.ts +6 -0
- package/src/_types/providers/hyperliquid/mappers/fill.d.ts.map +1 -0
- package/src/_types/providers/hyperliquid/mappers/index.d.ts +3 -4
- package/src/_types/providers/hyperliquid/mappers/index.d.ts.map +1 -1
- package/src/_types/providers/hyperliquid/mappers/order.d.ts +15 -3
- package/src/_types/providers/hyperliquid/mappers/order.d.ts.map +1 -1
- package/src/_types/providers/hyperliquid/mappers/position.d.ts +1 -1
- package/src/_types/providers/hyperliquid/mappers/position.d.ts.map +1 -1
- package/src/_types/providers/hyperliquid/mappers/shared.d.ts +0 -6
- package/src/_types/providers/hyperliquid/mappers/shared.d.ts.map +1 -1
- package/src/_types/providers/hyperliquid/types.d.ts +90 -2
- package/src/_types/providers/hyperliquid/types.d.ts.map +1 -1
- package/src/_types/providers/lighter/apiTypes.d.ts +76 -0
- package/src/_types/providers/lighter/apiTypes.d.ts.map +1 -0
- package/src/_types/providers/lighter/index.d.ts +4 -0
- package/src/_types/providers/lighter/index.d.ts.map +1 -0
- package/src/_types/providers/lighter/mappers/fill.d.ts +9 -0
- package/src/_types/providers/lighter/mappers/fill.d.ts.map +1 -0
- package/src/_types/providers/lighter/mappers/index.d.ts +4 -0
- package/src/_types/providers/lighter/mappers/index.d.ts.map +1 -0
- package/src/_types/providers/lighter/mappers/order.d.ts +35 -0
- package/src/_types/providers/lighter/mappers/order.d.ts.map +1 -0
- package/src/_types/providers/lighter/mappers/position.d.ts +8 -0
- package/src/_types/providers/lighter/mappers/position.d.ts.map +1 -0
- package/src/_types/providers/lighter/types.d.ts +90 -0
- package/src/_types/providers/lighter/types.d.ts.map +1 -0
- package/src/_types/providers.d.ts +145 -0
- package/src/_types/providers.d.ts.map +1 -0
- package/src/_types/subscriptions.d.ts +23 -18
- package/src/_types/subscriptions.d.ts.map +1 -1
- package/src/_types/typedData.d.ts +13 -5
- package/src/_types/typedData.d.ts.map +1 -1
- package/src/account.ts +193 -22
- package/src/action.ts +324 -0
- package/src/asset.ts +88 -0
- package/src/enums.ts +85 -3
- package/src/index.ts +3 -4
- package/src/providers/_shared/fillClassification.ts +50 -0
- package/src/providers/hyperliquid/assetId.ts +18 -12
- package/src/providers/hyperliquid/mappers/_market.ts +21 -0
- package/src/providers/hyperliquid/mappers/activity.ts +98 -13
- package/src/providers/hyperliquid/mappers/{market.ts → asset.ts} +10 -12
- package/src/providers/hyperliquid/mappers/fill.ts +41 -0
- package/src/providers/hyperliquid/mappers/index.ts +9 -4
- package/src/providers/hyperliquid/mappers/order.ts +95 -14
- package/src/providers/hyperliquid/mappers/position.ts +8 -10
- package/src/providers/hyperliquid/mappers/shared.ts +0 -15
- package/src/providers/hyperliquid/types.ts +128 -4
- package/src/providers/lighter/apiTypes.ts +87 -0
- package/src/providers/lighter/index.ts +3 -0
- package/src/providers/lighter/mappers/fill.ts +57 -0
- package/src/providers/lighter/mappers/index.ts +8 -0
- package/src/providers/lighter/mappers/order.ts +184 -0
- package/src/providers/lighter/mappers/position.ts +46 -0
- package/src/providers/lighter/types.ts +111 -0
- package/src/providers.ts +153 -0
- package/src/subscriptions.ts +21 -20
- package/src/typedData.ts +15 -5
- package/src/_cjs/authorization.js.map +0 -1
- package/src/_cjs/market.js.map +0 -1
- package/src/_cjs/providers/hyperliquid/mappers/history.js +0 -22
- package/src/_cjs/providers/hyperliquid/mappers/history.js.map +0 -1
- package/src/_cjs/providers/hyperliquid/mappers/market.js.map +0 -1
- package/src/_cjs/trading.js.map +0 -1
- package/src/_cjs/withdrawal.js.map +0 -1
- package/src/_esm/authorization.js +0 -2
- package/src/_esm/authorization.js.map +0 -1
- package/src/_esm/market.js +0 -2
- package/src/_esm/market.js.map +0 -1
- package/src/_esm/providers/hyperliquid/mappers/history.js +0 -18
- package/src/_esm/providers/hyperliquid/mappers/history.js.map +0 -1
- package/src/_esm/providers/hyperliquid/mappers/market.js.map +0 -1
- package/src/_esm/trading.js +0 -2
- package/src/_esm/trading.js.map +0 -1
- package/src/_esm/withdrawal.js +0 -2
- package/src/_esm/withdrawal.js.map +0 -1
- package/src/_types/authorization.d.ts +0 -39
- package/src/_types/authorization.d.ts.map +0 -1
- package/src/_types/market.d.ts.map +0 -1
- package/src/_types/providers/hyperliquid/mappers/history.d.ts +0 -4
- package/src/_types/providers/hyperliquid/mappers/history.d.ts.map +0 -1
- package/src/_types/providers/hyperliquid/mappers/market.d.ts +0 -4
- package/src/_types/providers/hyperliquid/mappers/market.d.ts.map +0 -1
- package/src/_types/trading.d.ts +0 -80
- package/src/_types/trading.d.ts.map +0 -1
- package/src/_types/withdrawal.d.ts +0 -37
- package/src/_types/withdrawal.d.ts.map +0 -1
- package/src/authorization.ts +0 -46
- package/src/market.ts +0 -97
- package/src/providers/hyperliquid/mappers/history.ts +0 -25
- package/src/trading.ts +0 -97
- package/src/withdrawal.ts +0 -44
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
import { MarginMode, PositionSide } from '../../../enums.js'
|
|
2
2
|
import type { Position } from '../../../account.js'
|
|
3
3
|
import type { HlAssetPosition } from '../types.js'
|
|
4
|
+
import { deriveMarket } from './_market.js'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export const mapPosition = (
|
|
8
|
-
ap: HlAssetPosition,
|
|
9
|
-
dexKey: string,
|
|
10
|
-
assetIdLookup: Map<string, number>
|
|
11
|
-
): Position => {
|
|
6
|
+
export const mapPosition = (ap: HlAssetPosition): Position => {
|
|
12
7
|
const pos = ap.position
|
|
13
8
|
const szi = parseFloat(pos.szi)
|
|
14
9
|
|
|
15
10
|
return {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
asset: {
|
|
12
|
+
assetId: pos.coin,
|
|
13
|
+
market: deriveMarket(pos.coin),
|
|
14
|
+
displaySymbol: pos.coin,
|
|
15
|
+
displayQuote: null,
|
|
16
|
+
},
|
|
19
17
|
side: szi >= 0 ? PositionSide.LONG : PositionSide.SHORT,
|
|
20
18
|
size: Math.abs(szi).toString(),
|
|
21
19
|
entryPrice: pos.entryPx ?? '0',
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Look up an asset ID by symbol, throwing if the symbol is unknown.
|
|
3
|
-
* Asset ID 0 is a valid Hyperliquid asset (BTC-PERP), so a fallback
|
|
4
|
-
* to 0 would silently corrupt data.
|
|
5
|
-
*/
|
|
6
|
-
export const resolveAssetIdFromLookup = (
|
|
7
|
-
lookup: Map<string, number>,
|
|
8
|
-
symbol: string
|
|
9
|
-
): number => {
|
|
10
|
-
const id = lookup.get(symbol)
|
|
11
|
-
if (id === undefined) {
|
|
12
|
-
throw new Error(`Unknown asset symbol: ${symbol}`)
|
|
13
|
-
}
|
|
14
|
-
return id
|
|
15
|
-
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Address } from 'viem'
|
|
2
|
+
|
|
1
3
|
// ---------------------------------------------------------------------------
|
|
2
4
|
// Hyperliquid /info response types
|
|
3
5
|
// ---------------------------------------------------------------------------
|
|
@@ -20,6 +22,7 @@ export type HlAssetCtx = {
|
|
|
20
22
|
funding: string
|
|
21
23
|
openInterest: string
|
|
22
24
|
dayNtlVlm: string
|
|
25
|
+
prevDayPx: string
|
|
23
26
|
markPx: string
|
|
24
27
|
}
|
|
25
28
|
|
|
@@ -123,6 +126,13 @@ export type HlFrontendOpenOrder = {
|
|
|
123
126
|
origSz: string
|
|
124
127
|
reduceOnly: boolean
|
|
125
128
|
timestamp: number
|
|
129
|
+
isTrigger: boolean
|
|
130
|
+
isPositionTpsl: boolean
|
|
131
|
+
triggerCondition: string
|
|
132
|
+
triggerPx: string
|
|
133
|
+
children: HlFrontendOpenOrder[]
|
|
134
|
+
tif: string | null
|
|
135
|
+
cloid: string | null
|
|
126
136
|
}
|
|
127
137
|
|
|
128
138
|
export type HlFrontendOpenOrders = HlFrontendOpenOrder[]
|
|
@@ -135,6 +145,7 @@ export type HlExtraAgents = Record<string, unknown>[]
|
|
|
135
145
|
|
|
136
146
|
export type HlUserFill = {
|
|
137
147
|
tid: number
|
|
148
|
+
oid: number
|
|
138
149
|
coin: string
|
|
139
150
|
side: string
|
|
140
151
|
sz: string
|
|
@@ -142,7 +153,9 @@ export type HlUserFill = {
|
|
|
142
153
|
dir: string
|
|
143
154
|
fee: string
|
|
144
155
|
closedPnl: string
|
|
156
|
+
crossed: boolean
|
|
145
157
|
time: number
|
|
158
|
+
startPosition: string
|
|
146
159
|
}
|
|
147
160
|
|
|
148
161
|
export type HlUserFills = HlUserFill[]
|
|
@@ -182,12 +195,80 @@ export type HlOrderStatusResponse =
|
|
|
182
195
|
|
|
183
196
|
// -- userNonFundingLedgerUpdates --------------------------------------------
|
|
184
197
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
198
|
+
/**
|
|
199
|
+
* Hyperliquid `spotTransfer` ledger delta. Emitted for transfers of spot
|
|
200
|
+
* tokens between Hyperliquid accounts. `user` is the sender, `destination`
|
|
201
|
+
* the recipient; direction is derived at the call site from the queried
|
|
202
|
+
* address.
|
|
203
|
+
*/
|
|
204
|
+
export type HlSpotTransferDelta = {
|
|
205
|
+
type: 'spotTransfer'
|
|
206
|
+
token: string
|
|
207
|
+
amount: string
|
|
208
|
+
usdcValue: string
|
|
209
|
+
user: Address
|
|
210
|
+
destination: Address
|
|
211
|
+
fee?: string
|
|
212
|
+
nativeTokenFee?: string
|
|
213
|
+
nonce?: number
|
|
189
214
|
}
|
|
190
215
|
|
|
216
|
+
/**
|
|
217
|
+
* Hyperliquid ledger delta emitted for the `sendAsset` exchange action. The
|
|
218
|
+
* wire `type` literal is `'send'` (NOT `'sendAsset'`); the TS name retains
|
|
219
|
+
* the `SendAsset` prefix to match `HL_PRIMARY_TYPE_SEND_ASSET`.
|
|
220
|
+
*
|
|
221
|
+
* - `user` is the sender, `destination` the recipient. For same-user dex
|
|
222
|
+
* moves both equal the queried address.
|
|
223
|
+
* - `sourceDex` / `destinationDex` use `""` for the main USDC perp DEX,
|
|
224
|
+
* `"spot"` for spot, or the perp DEX name otherwise.
|
|
225
|
+
* - `token` is a wire token identifier (e.g. `"USDC"` or `"TOKEN:0x..."`).
|
|
226
|
+
* - `nonce` is the wire nonce (ms timestamp); always present on `send`
|
|
227
|
+
* deltas, unlike `spotTransfer` where it may be null.
|
|
228
|
+
*/
|
|
229
|
+
export type HlSendAssetDelta = {
|
|
230
|
+
type: 'send'
|
|
231
|
+
user: Address
|
|
232
|
+
destination: Address
|
|
233
|
+
sourceDex: string
|
|
234
|
+
destinationDex: string
|
|
235
|
+
token: string
|
|
236
|
+
amount: string
|
|
237
|
+
usdcValue: string
|
|
238
|
+
fee: string
|
|
239
|
+
nativeTokenFee: string
|
|
240
|
+
nonce: number
|
|
241
|
+
feeToken: string
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export type HlLedgerDelta =
|
|
245
|
+
| HlSpotTransferDelta
|
|
246
|
+
| HlSendAssetDelta
|
|
247
|
+
| {
|
|
248
|
+
type: string
|
|
249
|
+
usdc?: string
|
|
250
|
+
[key: string]: unknown
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Type guard for `HlSpotTransferDelta` — TypeScript cannot narrow off the
|
|
255
|
+
* `type` discriminant alone because the catch-all arm of `HlLedgerDelta` has
|
|
256
|
+
* `type: string` (a supertype of the literal `'spotTransfer'`). Use this at
|
|
257
|
+
* call sites that need the strongly-typed shape.
|
|
258
|
+
*/
|
|
259
|
+
export const isSpotTransferDelta = (
|
|
260
|
+
delta: HlLedgerDelta
|
|
261
|
+
): delta is HlSpotTransferDelta => delta.type === 'spotTransfer'
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Type guard for `HlSendAssetDelta`. The wire `type` literal is `'send'`;
|
|
265
|
+
* see `HlSendAssetDelta` for the naming-vs-wire-format rationale. Same
|
|
266
|
+
* catch-all-arm caveat as `isSpotTransferDelta`.
|
|
267
|
+
*/
|
|
268
|
+
export const isSendAssetDelta = (
|
|
269
|
+
delta: HlLedgerDelta
|
|
270
|
+
): delta is HlSendAssetDelta => delta.type === 'send'
|
|
271
|
+
|
|
191
272
|
export type HlLedgerUpdate = {
|
|
192
273
|
time: number
|
|
193
274
|
hash: string
|
|
@@ -214,6 +295,22 @@ export type HlFundingUpdate = {
|
|
|
214
295
|
|
|
215
296
|
export type HlUserFunding = HlFundingUpdate[]
|
|
216
297
|
|
|
298
|
+
// -- abstraction mode -------------------------------------------------------
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Possible values returned by the `userAbstraction` info endpoint.
|
|
302
|
+
* `null` means abstraction has never been set (standard mode).
|
|
303
|
+
*/
|
|
304
|
+
export const HlAbstractionMode = {
|
|
305
|
+
DISABLED: 'disabled',
|
|
306
|
+
UNIFIED_ACCOUNT: 'unifiedAccount',
|
|
307
|
+
PORTFOLIO_MARGIN: 'portfolioMargin',
|
|
308
|
+
DEX_ABSTRACTION: 'dexAbstraction',
|
|
309
|
+
} as const
|
|
310
|
+
|
|
311
|
+
export type HlAbstractionMode =
|
|
312
|
+
(typeof HlAbstractionMode)[keyof typeof HlAbstractionMode]
|
|
313
|
+
|
|
217
314
|
// -- perpDexs ---------------------------------------------------------------
|
|
218
315
|
|
|
219
316
|
export type HlPerpDexs = (null | { name: string })[]
|
|
@@ -253,3 +350,30 @@ export type HlExchangeResponse = {
|
|
|
253
350
|
}
|
|
254
351
|
}
|
|
255
352
|
}
|
|
353
|
+
|
|
354
|
+
// ---------------------------------------------------------------------------
|
|
355
|
+
// Hyperliquid EIP-712 primary type constants
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
|
|
358
|
+
export const HL_PRIMARY_TYPE_APPROVE_AGENT =
|
|
359
|
+
'HyperliquidTransaction:ApproveAgent' as const
|
|
360
|
+
export const HL_PRIMARY_TYPE_APPROVE_BUILDER_FEE =
|
|
361
|
+
'HyperliquidTransaction:ApproveBuilderFee' as const
|
|
362
|
+
export const HL_PRIMARY_TYPE_USER_SET_ABSTRACTION =
|
|
363
|
+
'HyperliquidTransaction:UserSetAbstraction' as const
|
|
364
|
+
export const HL_PRIMARY_TYPE_AGENT_SET_ABSTRACTION =
|
|
365
|
+
'HyperliquidTransaction:AgentSetAbstraction' as const
|
|
366
|
+
export const HL_PRIMARY_TYPE_WITHDRAW =
|
|
367
|
+
'HyperliquidTransaction:Withdraw' as const
|
|
368
|
+
export const HL_PRIMARY_TYPE_SEND_ASSET =
|
|
369
|
+
'HyperliquidTransaction:SendAsset' as const
|
|
370
|
+
export const HL_PRIMARY_TYPE_AGENT = 'Agent' as const
|
|
371
|
+
|
|
372
|
+
export type HlPrimaryType =
|
|
373
|
+
| typeof HL_PRIMARY_TYPE_APPROVE_AGENT
|
|
374
|
+
| typeof HL_PRIMARY_TYPE_APPROVE_BUILDER_FEE
|
|
375
|
+
| typeof HL_PRIMARY_TYPE_USER_SET_ABSTRACTION
|
|
376
|
+
| typeof HL_PRIMARY_TYPE_AGENT_SET_ABSTRACTION
|
|
377
|
+
| typeof HL_PRIMARY_TYPE_WITHDRAW
|
|
378
|
+
| typeof HL_PRIMARY_TYPE_SEND_ASSET
|
|
379
|
+
| typeof HL_PRIMARY_TYPE_AGENT
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Lighter raw API response types — shared between backend (REST) and SDK (WS)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
export type LtAccountPosition = {
|
|
6
|
+
market_id: number
|
|
7
|
+
symbol: string
|
|
8
|
+
initial_margin_fraction: string
|
|
9
|
+
open_order_count: number
|
|
10
|
+
pending_order_count: number
|
|
11
|
+
position_tied_order_count: number
|
|
12
|
+
sign: number
|
|
13
|
+
position: string
|
|
14
|
+
avg_entry_price: string
|
|
15
|
+
position_value: string
|
|
16
|
+
unrealized_pnl: string
|
|
17
|
+
realized_pnl: string
|
|
18
|
+
liquidation_price: string
|
|
19
|
+
total_funding_paid_out: string
|
|
20
|
+
margin_mode: number
|
|
21
|
+
allocated_margin: string
|
|
22
|
+
total_discount: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type LtAccountAsset = {
|
|
26
|
+
symbol: string
|
|
27
|
+
asset_id: number
|
|
28
|
+
balance: string
|
|
29
|
+
locked_balance: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type LtTrade = {
|
|
33
|
+
trade_id: number
|
|
34
|
+
tx_hash: string
|
|
35
|
+
type: string
|
|
36
|
+
market_id: number
|
|
37
|
+
size: string
|
|
38
|
+
price: string
|
|
39
|
+
usd_amount: string
|
|
40
|
+
ask_id: number
|
|
41
|
+
bid_id: number
|
|
42
|
+
ask_account_id: number
|
|
43
|
+
bid_account_id: number
|
|
44
|
+
is_maker_ask: boolean
|
|
45
|
+
block_height: number
|
|
46
|
+
timestamp: number
|
|
47
|
+
// Lighter's OpenAPI spec marks these as required `StrictInt`, but the live
|
|
48
|
+
// /api/v1/trades endpoint omits them on some `type: "trade"` rows (observed
|
|
49
|
+
// on older trades) — keep optional and let the mapper emit `undefined`.
|
|
50
|
+
taker_fee?: number
|
|
51
|
+
maker_fee?: number
|
|
52
|
+
transaction_time: number
|
|
53
|
+
// Per-counterparty position snapshot BEFORE the trade is applied. Signed
|
|
54
|
+
// strings: positive = long, negative = short, "0" / "0.00000" = flat.
|
|
55
|
+
taker_position_size_before: string
|
|
56
|
+
maker_position_size_before: string
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export type LtOrder = {
|
|
60
|
+
order_index: number
|
|
61
|
+
client_order_index: number
|
|
62
|
+
order_id: string
|
|
63
|
+
client_order_id: string
|
|
64
|
+
market_index: number
|
|
65
|
+
owner_account_index: number
|
|
66
|
+
initial_base_amount: string
|
|
67
|
+
price: string
|
|
68
|
+
nonce: number
|
|
69
|
+
remaining_base_amount: string
|
|
70
|
+
is_ask: boolean
|
|
71
|
+
filled_base_amount: string
|
|
72
|
+
filled_quote_amount: string
|
|
73
|
+
side: string
|
|
74
|
+
type: string
|
|
75
|
+
time_in_force: string
|
|
76
|
+
reduce_only: boolean
|
|
77
|
+
trigger_price: string
|
|
78
|
+
order_expiry: number
|
|
79
|
+
status: string
|
|
80
|
+
trigger_status: string
|
|
81
|
+
trigger_time: number
|
|
82
|
+
block_height: number
|
|
83
|
+
timestamp: number
|
|
84
|
+
created_at: number
|
|
85
|
+
updated_at: number
|
|
86
|
+
transaction_time: number
|
|
87
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FillStatus,
|
|
3
|
+
LiquidityRole,
|
|
4
|
+
OrderSide,
|
|
5
|
+
OrderType,
|
|
6
|
+
} from '../../../enums.js'
|
|
7
|
+
import type { Fill } from '../../../account.js'
|
|
8
|
+
import type { LtTrade } from '../apiTypes.js'
|
|
9
|
+
import { classifyFillFromPosition } from '../../_shared/fillClassification.js'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Map a raw Lighter trade to the generic Fill type.
|
|
13
|
+
* @param accountIndex - The viewer's Lighter account index (selects buy/sell side and maker/taker role).
|
|
14
|
+
* @param symbol - Resolved symbol (market_id → symbol lookup).
|
|
15
|
+
*/
|
|
16
|
+
export const mapFill = (
|
|
17
|
+
trade: LtTrade,
|
|
18
|
+
accountIndex: number,
|
|
19
|
+
symbol: string
|
|
20
|
+
): Fill => {
|
|
21
|
+
const isBuyer = trade.bid_account_id === accountIndex
|
|
22
|
+
const isMaker =
|
|
23
|
+
(trade.is_maker_ask && !isBuyer) || (!trade.is_maker_ask && isBuyer)
|
|
24
|
+
|
|
25
|
+
// Lighter publishes both counterparties' position-before snapshots on every
|
|
26
|
+
// trade row; reading the wrong one mis-classifies when they differ.
|
|
27
|
+
const startPosition = isMaker
|
|
28
|
+
? trade.maker_position_size_before
|
|
29
|
+
: trade.taker_position_size_before
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
id: trade.trade_id.toString(),
|
|
33
|
+
orderId: String(isBuyer ? trade.bid_id : trade.ask_id),
|
|
34
|
+
asset: {
|
|
35
|
+
assetId: symbol,
|
|
36
|
+
market: 'lighter',
|
|
37
|
+
displaySymbol: symbol,
|
|
38
|
+
displayQuote: 'USDC',
|
|
39
|
+
},
|
|
40
|
+
side: isBuyer ? OrderSide.BUY : OrderSide.SELL,
|
|
41
|
+
type: OrderType.LIMIT,
|
|
42
|
+
size: trade.size,
|
|
43
|
+
price: trade.price,
|
|
44
|
+
status: FillStatus.FILLED,
|
|
45
|
+
liquidity: isMaker ? LiquidityRole.MAKER : LiquidityRole.TAKER,
|
|
46
|
+
fee: isMaker ? trade.maker_fee?.toString() : trade.taker_fee?.toString(),
|
|
47
|
+
startPosition,
|
|
48
|
+
// `classifyFillFromPosition` takes an HL-encoded side: `'B'` for buy,
|
|
49
|
+
// anything else for sell.
|
|
50
|
+
classification: classifyFillFromPosition(
|
|
51
|
+
startPosition,
|
|
52
|
+
isBuyer ? 'B' : 'A',
|
|
53
|
+
trade.size
|
|
54
|
+
),
|
|
55
|
+
createdAt: new Date(trade.timestamp).toISOString(),
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import {
|
|
2
|
+
OrderSide,
|
|
3
|
+
OrderStatus,
|
|
4
|
+
OrderType,
|
|
5
|
+
TimeInForce,
|
|
6
|
+
} from '../../../enums.js'
|
|
7
|
+
import type { OpenOrder, TriggerOrder } from '../../../account.js'
|
|
8
|
+
import type { Order } from '../../../action.js'
|
|
9
|
+
import type { LtOrder } from '../apiTypes.js'
|
|
10
|
+
|
|
11
|
+
// Lighter's `type` enum uses hyphens in the OpenAPI spec but earlier API
|
|
12
|
+
// versions emitted underscores. Tolerate both so we don't silently fall
|
|
13
|
+
// through to LIMIT for stop/take-profit orders.
|
|
14
|
+
const mapOrderType = (ltType: string): OrderType => {
|
|
15
|
+
const normalized = ltType.replace(/-/g, '_')
|
|
16
|
+
const map: Record<string, OrderType> = {
|
|
17
|
+
limit: OrderType.LIMIT,
|
|
18
|
+
market: OrderType.MARKET,
|
|
19
|
+
stop_loss: OrderType.STOP_MARKET,
|
|
20
|
+
stop_loss_limit: OrderType.STOP_LIMIT,
|
|
21
|
+
take_profit: OrderType.TAKE_PROFIT_MARKET,
|
|
22
|
+
take_profit_limit: OrderType.TAKE_PROFIT_LIMIT,
|
|
23
|
+
}
|
|
24
|
+
return map[normalized] ?? OrderType.LIMIT
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const mapTimeInForce = (tif: string): TimeInForce | undefined => {
|
|
28
|
+
switch (tif.replace(/-/g, '_')) {
|
|
29
|
+
case 'good_till_time':
|
|
30
|
+
return TimeInForce.GTT
|
|
31
|
+
case 'immediate_or_cancel':
|
|
32
|
+
return TimeInForce.IOC
|
|
33
|
+
case 'post_only':
|
|
34
|
+
return TimeInForce.POST_ONLY
|
|
35
|
+
default:
|
|
36
|
+
return undefined
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const mapOrderStatus = (status: string): OrderStatus => {
|
|
41
|
+
if (
|
|
42
|
+
status === 'open' ||
|
|
43
|
+
status === 'in-progress' ||
|
|
44
|
+
status === 'in_progress'
|
|
45
|
+
) {
|
|
46
|
+
return OrderStatus.OPEN
|
|
47
|
+
}
|
|
48
|
+
if (status === 'pending') {
|
|
49
|
+
return OrderStatus.PENDING
|
|
50
|
+
}
|
|
51
|
+
if (status === 'filled') {
|
|
52
|
+
return OrderStatus.FILLED
|
|
53
|
+
}
|
|
54
|
+
if (status.startsWith('canceled')) {
|
|
55
|
+
return OrderStatus.CANCELLED
|
|
56
|
+
}
|
|
57
|
+
return OrderStatus.OPEN
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Map a raw Lighter order status to a short English sentence describing
|
|
62
|
+
* *why* the order ended in a terminal non-FILLED state. Non-terminal
|
|
63
|
+
* statuses, plain `filled`, and unknown values return `undefined`.
|
|
64
|
+
*/
|
|
65
|
+
export const mapStatusReason = (status: string): string | undefined => {
|
|
66
|
+
switch (status) {
|
|
67
|
+
case 'canceled':
|
|
68
|
+
return 'Order cancelled.'
|
|
69
|
+
case 'canceled-post-only':
|
|
70
|
+
return 'Order cancelled: post-only order would have crossed the book.'
|
|
71
|
+
case 'canceled-reduce-only':
|
|
72
|
+
return 'Order cancelled: would not reduce your position.'
|
|
73
|
+
case 'canceled-position-not-allowed':
|
|
74
|
+
return 'Order cancelled: position not allowed.'
|
|
75
|
+
case 'canceled-margin-not-allowed':
|
|
76
|
+
return 'Order cancelled: insufficient margin.'
|
|
77
|
+
case 'canceled-too-much-slippage':
|
|
78
|
+
return 'Order cancelled: slippage exceeded tolerance.'
|
|
79
|
+
case 'canceled-not-enough-liquidity':
|
|
80
|
+
return 'Order cancelled: not enough liquidity to fill.'
|
|
81
|
+
case 'canceled-self-trade':
|
|
82
|
+
return 'Order cancelled: would self-trade against your own resting order.'
|
|
83
|
+
case 'canceled-expired':
|
|
84
|
+
return 'Order expired.'
|
|
85
|
+
case 'canceled-oco':
|
|
86
|
+
return 'Order cancelled: sibling OCO order filled or cancelled first.'
|
|
87
|
+
case 'canceled-child':
|
|
88
|
+
return 'Order cancelled: parent order was cancelled.'
|
|
89
|
+
case 'canceled-liquidation':
|
|
90
|
+
return 'Order cancelled: account was liquidated.'
|
|
91
|
+
case 'canceled-invalid-balance':
|
|
92
|
+
return 'Order cancelled: invalid balance.'
|
|
93
|
+
default:
|
|
94
|
+
return undefined
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* True for order types Lighter exposes as TP/SL legs. Mirrors the
|
|
100
|
+
* Hyperliquid helper of the same name so the backend can split a raw
|
|
101
|
+
* Lighter order list into the same `openOrders` / `triggerOrders`
|
|
102
|
+
* buckets the SDK declares on `OrdersResponse`.
|
|
103
|
+
*/
|
|
104
|
+
export const isTriggerType = (type: OrderType): boolean =>
|
|
105
|
+
type === OrderType.TAKE_PROFIT_MARKET ||
|
|
106
|
+
type === OrderType.TAKE_PROFIT_LIMIT ||
|
|
107
|
+
type === OrderType.STOP_MARKET ||
|
|
108
|
+
type === OrderType.STOP_LIMIT
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Map a raw Lighter trigger order (stop/take-profit, market or limit) to
|
|
112
|
+
* the generic `TriggerOrder` shape. For market variants the `limitPrice`
|
|
113
|
+
* field is omitted; for limit variants `order.price` is the limit and
|
|
114
|
+
* `order.trigger_price` is the activation level.
|
|
115
|
+
*/
|
|
116
|
+
export const mapTriggerOrder = (
|
|
117
|
+
order: LtOrder,
|
|
118
|
+
symbol: string
|
|
119
|
+
): TriggerOrder => {
|
|
120
|
+
const type = mapOrderType(order.type)
|
|
121
|
+
const isLimit =
|
|
122
|
+
type === OrderType.TAKE_PROFIT_LIMIT || type === OrderType.STOP_LIMIT
|
|
123
|
+
return {
|
|
124
|
+
id: order.order_id,
|
|
125
|
+
asset: {
|
|
126
|
+
assetId: symbol,
|
|
127
|
+
market: 'lighter',
|
|
128
|
+
displaySymbol: symbol,
|
|
129
|
+
displayQuote: 'USDC',
|
|
130
|
+
},
|
|
131
|
+
type,
|
|
132
|
+
size: order.initial_base_amount,
|
|
133
|
+
triggerPrice: order.trigger_price,
|
|
134
|
+
...(isLimit ? { limitPrice: order.price } : {}),
|
|
135
|
+
createdAt: new Date(order.created_at * 1000).toISOString(),
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Map a raw Lighter order to the generic OpenOrder type.
|
|
141
|
+
* @param symbol - Resolved symbol (market_index → symbol lookup)
|
|
142
|
+
*/
|
|
143
|
+
export const mapOrder = (order: LtOrder, symbol: string): OpenOrder => ({
|
|
144
|
+
id: order.order_id,
|
|
145
|
+
asset: {
|
|
146
|
+
assetId: symbol,
|
|
147
|
+
market: 'lighter',
|
|
148
|
+
displaySymbol: symbol,
|
|
149
|
+
displayQuote: 'USDC',
|
|
150
|
+
},
|
|
151
|
+
side: order.is_ask ? OrderSide.SELL : OrderSide.BUY,
|
|
152
|
+
type: mapOrderType(order.type),
|
|
153
|
+
size: order.initial_base_amount,
|
|
154
|
+
price: order.price,
|
|
155
|
+
filledSize: order.filled_base_amount,
|
|
156
|
+
reduceOnly: order.reduce_only,
|
|
157
|
+
createdAt: new Date(order.created_at * 1000).toISOString(),
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Map a raw Lighter order to the rich Order type — adds status, time-in-force
|
|
162
|
+
* and remaining/filled sizes on top of the OpenOrder fields.
|
|
163
|
+
*/
|
|
164
|
+
export const mapOrderDetail = (order: LtOrder, symbol: string): Order => ({
|
|
165
|
+
orderId: order.order_id,
|
|
166
|
+
asset: {
|
|
167
|
+
assetId: symbol,
|
|
168
|
+
market: 'lighter',
|
|
169
|
+
displaySymbol: symbol,
|
|
170
|
+
displayQuote: 'USDC',
|
|
171
|
+
},
|
|
172
|
+
side: order.is_ask ? OrderSide.SELL : OrderSide.BUY,
|
|
173
|
+
type: mapOrderType(order.type),
|
|
174
|
+
price: order.price,
|
|
175
|
+
originalSize: order.initial_base_amount,
|
|
176
|
+
remainingSize: order.remaining_base_amount,
|
|
177
|
+
filledSize: order.filled_base_amount,
|
|
178
|
+
timeInForce: mapTimeInForce(order.time_in_force),
|
|
179
|
+
reduceOnly: order.reduce_only,
|
|
180
|
+
status: mapOrderStatus(order.status),
|
|
181
|
+
statusReason: mapStatusReason(order.status),
|
|
182
|
+
createdAt: new Date(order.created_at * 1000).toISOString(),
|
|
183
|
+
updatedAt: new Date(order.updated_at * 1000).toISOString(),
|
|
184
|
+
})
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MarginMode, PositionSide } from '../../../enums.js'
|
|
2
|
+
import type { Position } from '../../../account.js'
|
|
3
|
+
import type { LtAccountPosition } from '../apiTypes.js'
|
|
4
|
+
import { LT_MARGIN_MODE_ISOLATED } from '../types.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Map a raw Lighter account position to the generic Position type.
|
|
8
|
+
* @param symbol Resolved symbol (market_id → symbol lookup, or `pos.symbol`).
|
|
9
|
+
*/
|
|
10
|
+
export const mapPosition = (
|
|
11
|
+
pos: LtAccountPosition,
|
|
12
|
+
symbol: string
|
|
13
|
+
): Position => {
|
|
14
|
+
const size = parseFloat(pos.position)
|
|
15
|
+
const isIsolated = pos.margin_mode === LT_MARGIN_MODE_ISOLATED
|
|
16
|
+
|
|
17
|
+
// `allocated_margin` is only populated for isolated positions (always "0"
|
|
18
|
+
// on cross accounts). For cross, derive margin as
|
|
19
|
+
// `position_value × initial_margin_fraction / 100` (IMF is in percent).
|
|
20
|
+
const positionValue = Math.abs(parseFloat(pos.position_value))
|
|
21
|
+
const imf = parseFloat(pos.initial_margin_fraction)
|
|
22
|
+
const marginUsed = isIsolated
|
|
23
|
+
? pos.allocated_margin
|
|
24
|
+
: ((positionValue * imf) / 100).toString()
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
asset: {
|
|
28
|
+
assetId: symbol,
|
|
29
|
+
market: 'lighter',
|
|
30
|
+
displaySymbol: symbol,
|
|
31
|
+
displayQuote: 'USDC',
|
|
32
|
+
},
|
|
33
|
+
side: pos.sign >= 0 ? PositionSide.LONG : PositionSide.SHORT,
|
|
34
|
+
size: Math.abs(size).toString(),
|
|
35
|
+
entryPrice: pos.avg_entry_price,
|
|
36
|
+
markPrice:
|
|
37
|
+
pos.position_value === '0' || size === 0
|
|
38
|
+
? '0'
|
|
39
|
+
: (parseFloat(pos.position_value) / Math.abs(size)).toString(),
|
|
40
|
+
liquidationPrice: pos.liquidation_price,
|
|
41
|
+
unrealizedPnl: pos.unrealized_pnl,
|
|
42
|
+
leverage: imf > 0 ? Math.round(100 / imf) : 1,
|
|
43
|
+
marginUsed,
|
|
44
|
+
marginMode: isIsolated ? MarginMode.ISOLATED : MarginMode.CROSS,
|
|
45
|
+
}
|
|
46
|
+
}
|