@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.
Files changed (206) hide show
  1. package/package.json +18 -4
  2. package/providers/lighter/package.json +5 -0
  3. package/src/_cjs/{market.js → action.js} +1 -1
  4. package/src/_cjs/action.js.map +1 -0
  5. package/src/_cjs/{trading.js → asset.js} +1 -1
  6. package/src/_cjs/asset.js.map +1 -0
  7. package/src/_cjs/enums.js +81 -15
  8. package/src/_cjs/enums.js.map +1 -1
  9. package/src/_cjs/index.js +3 -4
  10. package/src/_cjs/index.js.map +1 -1
  11. package/src/_cjs/providers/_shared/fillClassification.js +37 -0
  12. package/src/_cjs/providers/_shared/fillClassification.js.map +1 -0
  13. package/src/_cjs/providers/hyperliquid/assetId.js +11 -9
  14. package/src/_cjs/providers/hyperliquid/assetId.js.map +1 -1
  15. package/src/_cjs/providers/hyperliquid/mappers/_market.js +15 -0
  16. package/src/_cjs/providers/hyperliquid/mappers/_market.js.map +1 -0
  17. package/src/_cjs/providers/hyperliquid/mappers/activity.js +80 -8
  18. package/src/_cjs/providers/hyperliquid/mappers/activity.js.map +1 -1
  19. package/src/_cjs/providers/hyperliquid/mappers/{market.js → asset.js} +10 -9
  20. package/src/_cjs/providers/hyperliquid/mappers/asset.js.map +1 -0
  21. package/src/_cjs/providers/hyperliquid/mappers/fill.js +36 -0
  22. package/src/_cjs/providers/hyperliquid/mappers/fill.js.map +1 -0
  23. package/src/_cjs/providers/hyperliquid/mappers/index.js +9 -7
  24. package/src/_cjs/providers/hyperliquid/mappers/index.js.map +1 -1
  25. package/src/_cjs/providers/hyperliquid/mappers/order.js +86 -9
  26. package/src/_cjs/providers/hyperliquid/mappers/order.js.map +1 -1
  27. package/src/_cjs/providers/hyperliquid/mappers/position.js +8 -5
  28. package/src/_cjs/providers/hyperliquid/mappers/position.js.map +1 -1
  29. package/src/_cjs/providers/hyperliquid/mappers/shared.js +0 -10
  30. package/src/_cjs/providers/hyperliquid/mappers/shared.js.map +1 -1
  31. package/src/_cjs/providers/hyperliquid/types.js +18 -0
  32. package/src/_cjs/providers/hyperliquid/types.js.map +1 -1
  33. package/src/_cjs/{authorization.js → providers/lighter/apiTypes.js} +1 -1
  34. package/src/_cjs/providers/lighter/apiTypes.js.map +1 -0
  35. package/src/_cjs/providers/lighter/index.js +20 -0
  36. package/src/_cjs/providers/lighter/index.js.map +1 -0
  37. package/src/_cjs/providers/lighter/mappers/fill.js +34 -0
  38. package/src/_cjs/providers/lighter/mappers/fill.js.map +1 -0
  39. package/src/_cjs/providers/lighter/mappers/index.js +13 -0
  40. package/src/_cjs/providers/lighter/mappers/index.js.map +1 -0
  41. package/src/_cjs/providers/lighter/mappers/order.js +142 -0
  42. package/src/_cjs/providers/lighter/mappers/order.js.map +1 -0
  43. package/src/_cjs/providers/lighter/mappers/position.js +35 -0
  44. package/src/_cjs/providers/lighter/mappers/position.js.map +1 -0
  45. package/src/_cjs/providers/lighter/types.js +23 -0
  46. package/src/_cjs/providers/lighter/types.js.map +1 -0
  47. package/src/_cjs/{withdrawal.js → providers.js} +1 -1
  48. package/src/_cjs/providers.js.map +1 -0
  49. package/src/_esm/action.js +2 -0
  50. package/src/_esm/action.js.map +1 -0
  51. package/src/_esm/asset.js +2 -0
  52. package/src/_esm/asset.js.map +1 -0
  53. package/src/_esm/enums.js +90 -14
  54. package/src/_esm/enums.js.map +1 -1
  55. package/src/_esm/index.js +3 -4
  56. package/src/_esm/index.js.map +1 -1
  57. package/src/_esm/providers/_shared/fillClassification.js +43 -0
  58. package/src/_esm/providers/_shared/fillClassification.js.map +1 -0
  59. package/src/_esm/providers/hyperliquid/assetId.js +13 -11
  60. package/src/_esm/providers/hyperliquid/assetId.js.map +1 -1
  61. package/src/_esm/providers/hyperliquid/mappers/_market.js +22 -0
  62. package/src/_esm/providers/hyperliquid/mappers/_market.js.map +1 -0
  63. package/src/_esm/providers/hyperliquid/mappers/activity.js +92 -13
  64. package/src/_esm/providers/hyperliquid/mappers/activity.js.map +1 -1
  65. package/src/_esm/providers/hyperliquid/mappers/{market.js → asset.js} +8 -7
  66. package/src/_esm/providers/hyperliquid/mappers/asset.js.map +1 -0
  67. package/src/_esm/providers/hyperliquid/mappers/fill.js +32 -0
  68. package/src/_esm/providers/hyperliquid/mappers/fill.js.map +1 -0
  69. package/src/_esm/providers/hyperliquid/mappers/index.js +3 -4
  70. package/src/_esm/providers/hyperliquid/mappers/index.js.map +1 -1
  71. package/src/_esm/providers/hyperliquid/mappers/order.js +88 -8
  72. package/src/_esm/providers/hyperliquid/mappers/order.js.map +1 -1
  73. package/src/_esm/providers/hyperliquid/mappers/position.js +8 -5
  74. package/src/_esm/providers/hyperliquid/mappers/position.js.map +1 -1
  75. package/src/_esm/providers/hyperliquid/mappers/shared.js +1 -12
  76. package/src/_esm/providers/hyperliquid/mappers/shared.js.map +1 -1
  77. package/src/_esm/providers/hyperliquid/types.js +32 -2
  78. package/src/_esm/providers/hyperliquid/types.js.map +1 -1
  79. package/src/_esm/providers/lighter/apiTypes.js +5 -0
  80. package/src/_esm/providers/lighter/apiTypes.js.map +1 -0
  81. package/src/_esm/providers/lighter/index.js +4 -0
  82. package/src/_esm/providers/lighter/index.js.map +1 -0
  83. package/src/_esm/providers/lighter/mappers/fill.js +39 -0
  84. package/src/_esm/providers/lighter/mappers/fill.js.map +1 -0
  85. package/src/_esm/providers/lighter/mappers/index.js +4 -0
  86. package/src/_esm/providers/lighter/mappers/index.js.map +1 -0
  87. package/src/_esm/providers/lighter/mappers/order.js +162 -0
  88. package/src/_esm/providers/lighter/mappers/order.js.map +1 -0
  89. package/src/_esm/providers/lighter/mappers/position.js +38 -0
  90. package/src/_esm/providers/lighter/mappers/position.js.map +1 -0
  91. package/src/_esm/providers/lighter/types.js +26 -0
  92. package/src/_esm/providers/lighter/types.js.map +1 -0
  93. package/src/_esm/providers.js +2 -0
  94. package/src/_esm/providers.js.map +1 -0
  95. package/src/_types/account.d.ts +178 -23
  96. package/src/_types/account.d.ts.map +1 -1
  97. package/src/_types/action.d.ts +261 -0
  98. package/src/_types/action.d.ts.map +1 -0
  99. package/src/_types/{market.d.ts → asset.d.ts} +23 -34
  100. package/src/_types/asset.d.ts.map +1 -0
  101. package/src/_types/enums.d.ts +76 -6
  102. package/src/_types/enums.d.ts.map +1 -1
  103. package/src/_types/index.d.ts +3 -4
  104. package/src/_types/index.d.ts.map +1 -1
  105. package/src/_types/providers/_shared/fillClassification.d.ts +12 -0
  106. package/src/_types/providers/_shared/fillClassification.d.ts.map +1 -0
  107. package/src/_types/providers/hyperliquid/assetId.d.ts +8 -6
  108. package/src/_types/providers/hyperliquid/assetId.d.ts.map +1 -1
  109. package/src/_types/providers/hyperliquid/mappers/_market.d.ts +13 -0
  110. package/src/_types/providers/hyperliquid/mappers/_market.d.ts.map +1 -0
  111. package/src/_types/providers/hyperliquid/mappers/activity.d.ts +7 -7
  112. package/src/_types/providers/hyperliquid/mappers/activity.d.ts.map +1 -1
  113. package/src/_types/providers/hyperliquid/mappers/asset.d.ts +4 -0
  114. package/src/_types/providers/hyperliquid/mappers/asset.d.ts.map +1 -0
  115. package/src/_types/providers/hyperliquid/mappers/fill.d.ts +6 -0
  116. package/src/_types/providers/hyperliquid/mappers/fill.d.ts.map +1 -0
  117. package/src/_types/providers/hyperliquid/mappers/index.d.ts +3 -4
  118. package/src/_types/providers/hyperliquid/mappers/index.d.ts.map +1 -1
  119. package/src/_types/providers/hyperliquid/mappers/order.d.ts +15 -3
  120. package/src/_types/providers/hyperliquid/mappers/order.d.ts.map +1 -1
  121. package/src/_types/providers/hyperliquid/mappers/position.d.ts +1 -1
  122. package/src/_types/providers/hyperliquid/mappers/position.d.ts.map +1 -1
  123. package/src/_types/providers/hyperliquid/mappers/shared.d.ts +0 -6
  124. package/src/_types/providers/hyperliquid/mappers/shared.d.ts.map +1 -1
  125. package/src/_types/providers/hyperliquid/types.d.ts +90 -2
  126. package/src/_types/providers/hyperliquid/types.d.ts.map +1 -1
  127. package/src/_types/providers/lighter/apiTypes.d.ts +76 -0
  128. package/src/_types/providers/lighter/apiTypes.d.ts.map +1 -0
  129. package/src/_types/providers/lighter/index.d.ts +4 -0
  130. package/src/_types/providers/lighter/index.d.ts.map +1 -0
  131. package/src/_types/providers/lighter/mappers/fill.d.ts +9 -0
  132. package/src/_types/providers/lighter/mappers/fill.d.ts.map +1 -0
  133. package/src/_types/providers/lighter/mappers/index.d.ts +4 -0
  134. package/src/_types/providers/lighter/mappers/index.d.ts.map +1 -0
  135. package/src/_types/providers/lighter/mappers/order.d.ts +35 -0
  136. package/src/_types/providers/lighter/mappers/order.d.ts.map +1 -0
  137. package/src/_types/providers/lighter/mappers/position.d.ts +8 -0
  138. package/src/_types/providers/lighter/mappers/position.d.ts.map +1 -0
  139. package/src/_types/providers/lighter/types.d.ts +90 -0
  140. package/src/_types/providers/lighter/types.d.ts.map +1 -0
  141. package/src/_types/providers.d.ts +145 -0
  142. package/src/_types/providers.d.ts.map +1 -0
  143. package/src/_types/subscriptions.d.ts +23 -18
  144. package/src/_types/subscriptions.d.ts.map +1 -1
  145. package/src/_types/typedData.d.ts +13 -5
  146. package/src/_types/typedData.d.ts.map +1 -1
  147. package/src/account.ts +193 -22
  148. package/src/action.ts +324 -0
  149. package/src/asset.ts +88 -0
  150. package/src/enums.ts +85 -3
  151. package/src/index.ts +3 -4
  152. package/src/providers/_shared/fillClassification.ts +50 -0
  153. package/src/providers/hyperliquid/assetId.ts +18 -12
  154. package/src/providers/hyperliquid/mappers/_market.ts +21 -0
  155. package/src/providers/hyperliquid/mappers/activity.ts +98 -13
  156. package/src/providers/hyperliquid/mappers/{market.ts → asset.ts} +10 -12
  157. package/src/providers/hyperliquid/mappers/fill.ts +41 -0
  158. package/src/providers/hyperliquid/mappers/index.ts +9 -4
  159. package/src/providers/hyperliquid/mappers/order.ts +95 -14
  160. package/src/providers/hyperliquid/mappers/position.ts +8 -10
  161. package/src/providers/hyperliquid/mappers/shared.ts +0 -15
  162. package/src/providers/hyperliquid/types.ts +128 -4
  163. package/src/providers/lighter/apiTypes.ts +87 -0
  164. package/src/providers/lighter/index.ts +3 -0
  165. package/src/providers/lighter/mappers/fill.ts +57 -0
  166. package/src/providers/lighter/mappers/index.ts +8 -0
  167. package/src/providers/lighter/mappers/order.ts +184 -0
  168. package/src/providers/lighter/mappers/position.ts +46 -0
  169. package/src/providers/lighter/types.ts +111 -0
  170. package/src/providers.ts +153 -0
  171. package/src/subscriptions.ts +21 -20
  172. package/src/typedData.ts +15 -5
  173. package/src/_cjs/authorization.js.map +0 -1
  174. package/src/_cjs/market.js.map +0 -1
  175. package/src/_cjs/providers/hyperliquid/mappers/history.js +0 -22
  176. package/src/_cjs/providers/hyperliquid/mappers/history.js.map +0 -1
  177. package/src/_cjs/providers/hyperliquid/mappers/market.js.map +0 -1
  178. package/src/_cjs/trading.js.map +0 -1
  179. package/src/_cjs/withdrawal.js.map +0 -1
  180. package/src/_esm/authorization.js +0 -2
  181. package/src/_esm/authorization.js.map +0 -1
  182. package/src/_esm/market.js +0 -2
  183. package/src/_esm/market.js.map +0 -1
  184. package/src/_esm/providers/hyperliquid/mappers/history.js +0 -18
  185. package/src/_esm/providers/hyperliquid/mappers/history.js.map +0 -1
  186. package/src/_esm/providers/hyperliquid/mappers/market.js.map +0 -1
  187. package/src/_esm/trading.js +0 -2
  188. package/src/_esm/trading.js.map +0 -1
  189. package/src/_esm/withdrawal.js +0 -2
  190. package/src/_esm/withdrawal.js.map +0 -1
  191. package/src/_types/authorization.d.ts +0 -39
  192. package/src/_types/authorization.d.ts.map +0 -1
  193. package/src/_types/market.d.ts.map +0 -1
  194. package/src/_types/providers/hyperliquid/mappers/history.d.ts +0 -4
  195. package/src/_types/providers/hyperliquid/mappers/history.d.ts.map +0 -1
  196. package/src/_types/providers/hyperliquid/mappers/market.d.ts +0 -4
  197. package/src/_types/providers/hyperliquid/mappers/market.d.ts.map +0 -1
  198. package/src/_types/trading.d.ts +0 -80
  199. package/src/_types/trading.d.ts.map +0 -1
  200. package/src/_types/withdrawal.d.ts +0 -37
  201. package/src/_types/withdrawal.d.ts.map +0 -1
  202. package/src/authorization.ts +0 -46
  203. package/src/market.ts +0 -97
  204. package/src/providers/hyperliquid/mappers/history.ts +0 -25
  205. package/src/trading.ts +0 -97
  206. 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
- import { resolveAssetIdFromLookup } from './shared.js'
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
- symbol: pos.coin,
17
- assetId: resolveAssetIdFromLookup(assetIdLookup, pos.coin),
18
- dex: dexKey,
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
- export type HlLedgerDelta = {
186
- type: string
187
- usdc: string
188
- [key: string]: unknown
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,3 @@
1
+ export * from './types.js'
2
+ export * from './apiTypes.js'
3
+ export * from './mappers/index.js'
@@ -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,8 @@
1
+ export { mapPosition } from './position.js'
2
+ export { mapFill } from './fill.js'
3
+ export {
4
+ isTriggerType,
5
+ mapOrder,
6
+ mapOrderDetail,
7
+ mapTriggerOrder,
8
+ } from './order.js'
@@ -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
+ }