@lifi/perps-types 0.1.1-alpha.8 → 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 +88 -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 +128 -0
  18. package/src/_cjs/providers/hyperliquid/mappers/activity.js.map +1 -0
  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 +12 -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 +97 -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 +138 -0
  64. package/src/_esm/providers/hyperliquid/mappers/activity.js.map +1 -0
  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 +4 -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 +211 -18
  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 +81 -5
  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 +13 -0
  112. package/src/_types/providers/hyperliquid/mappers/activity.d.ts.map +1 -0
  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 +4 -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 +112 -0
  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 +244 -18
  148. package/src/action.ts +324 -0
  149. package/src/asset.ts +88 -0
  150. package/src/enums.ts +92 -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 +169 -0
  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 +10 -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 +158 -0
  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
@@ -4,32 +4,76 @@ import {
4
4
  OrderType,
5
5
  TimeInForce,
6
6
  } from '../../../enums.js'
7
- import type { OpenOrder } from '../../../account.js'
8
- import type { Order } from '../../../trading.js'
7
+ import type { OpenOrder, TriggerOrder } from '../../../account.js'
8
+ import type { Order } from '../../../action.js'
9
9
  import type { HlFrontendOpenOrder, HlOrderDetail } from '../types.js'
10
+ import { deriveMarket } from './_market.js'
10
11
 
11
- import { resolveAssetIdFromLookup } from './shared.js'
12
+ /** Map a Hyperliquid orderType string to the OrderType enum. */
13
+ export const mapOrderType = (orderType: string): OrderType => {
14
+ switch (orderType) {
15
+ case 'Take Profit Market':
16
+ return OrderType.TAKE_PROFIT_MARKET
17
+ case 'Take Profit Limit':
18
+ return OrderType.TAKE_PROFIT_LIMIT
19
+ case 'Stop Market':
20
+ return OrderType.STOP_MARKET
21
+ case 'Stop Limit':
22
+ return OrderType.STOP_LIMIT
23
+ case 'Market':
24
+ return OrderType.MARKET
25
+ default:
26
+ return OrderType.LIMIT
27
+ }
28
+ }
29
+
30
+ export const isTriggerType = (type: OrderType): boolean =>
31
+ type === OrderType.TAKE_PROFIT_MARKET ||
32
+ type === OrderType.TAKE_PROFIT_LIMIT ||
33
+ type === OrderType.STOP_MARKET ||
34
+ type === OrderType.STOP_LIMIT
12
35
 
13
- export const mapOpenOrder = (
14
- o: HlFrontendOpenOrder,
15
- dexKey: string,
16
- assetIdLookup: Map<string, number>
17
- ): OpenOrder => ({
36
+ export const mapOpenOrder = (o: HlFrontendOpenOrder): OpenOrder => ({
18
37
  id: String(o.oid),
19
- symbol: o.coin,
20
- assetId: resolveAssetIdFromLookup(assetIdLookup, o.coin),
21
- dex: dexKey,
38
+ asset: {
39
+ assetId: o.coin,
40
+ market: deriveMarket(o.coin),
41
+ displaySymbol: o.coin,
42
+ displayQuote: null,
43
+ },
22
44
  side: o.side === 'B' ? OrderSide.BUY : OrderSide.SELL,
23
- type: o.orderType === 'Limit' ? OrderType.LIMIT : OrderType.MARKET,
45
+ type: mapOrderType(o.orderType),
24
46
  size: o.sz,
25
47
  price: o.limitPx,
26
48
  filledSize: o.origSz
27
49
  ? (parseFloat(o.origSz) - parseFloat(o.sz)).toString()
28
50
  : '0',
29
51
  reduceOnly: o.reduceOnly ?? false,
52
+ label: o.isTrigger ? o.triggerCondition : undefined,
30
53
  createdAt: new Date(o.timestamp).toISOString(),
31
54
  })
32
55
 
56
+ export const mapTriggerOrder = (o: HlFrontendOpenOrder): TriggerOrder => {
57
+ const type = mapOrderType(o.orderType)
58
+ const isLimit =
59
+ type === OrderType.TAKE_PROFIT_LIMIT || type === OrderType.STOP_LIMIT
60
+ return {
61
+ id: String(o.oid),
62
+ asset: {
63
+ assetId: o.coin,
64
+ market: deriveMarket(o.coin),
65
+ displaySymbol: o.coin,
66
+ displayQuote: null,
67
+ },
68
+ type,
69
+ size: o.sz,
70
+ triggerPrice: o.triggerPx,
71
+ ...(isLimit ? { limitPrice: o.limitPx } : {}),
72
+ label: o.triggerCondition,
73
+ createdAt: new Date(o.timestamp).toISOString(),
74
+ }
75
+ }
76
+
33
77
  const mapOrderStatus = (status: string): OrderStatus => {
34
78
  switch (status) {
35
79
  case 'open':
@@ -51,6 +95,37 @@ const mapOrderStatus = (status: string): OrderStatus => {
51
95
  }
52
96
  }
53
97
 
98
+ /**
99
+ * Map a raw Hyperliquid order status to a short English sentence
100
+ * describing *why* the order ended in a terminal non-FILLED state. Bare
101
+ * `canceled`/`cancelled`/`rejected` carry no actionable detail and
102
+ * return `undefined`; so do non-terminal and unknown values.
103
+ */
104
+ export const mapStatusReason = (status: string): string | undefined => {
105
+ switch (status) {
106
+ case 'iocCanceled':
107
+ return 'Order cancelled: not enough liquidity to fill immediately.'
108
+ case 'reduceOnlyCanceled':
109
+ return 'Order cancelled: would not reduce your position.'
110
+ case 'marginCanceled':
111
+ return 'Order cancelled: insufficient margin.'
112
+ case 'liquidatedCanceled':
113
+ return 'Order cancelled: account was liquidated.'
114
+ case 'siblingFilledCanceled':
115
+ return 'Order cancelled: sibling OCO order filled first.'
116
+ case 'selfTradeCanceled':
117
+ return 'Order cancelled: would self-trade against your own resting order.'
118
+ case 'tickRejected':
119
+ return 'Order rejected: price did not match the tick size.'
120
+ case 'minTradeNtlRejected':
121
+ return 'Order rejected: notional value below the minimum trade size.'
122
+ case 'delistedRejected':
123
+ return 'Order rejected: market has been delisted.'
124
+ default:
125
+ return undefined
126
+ }
127
+ }
128
+
54
129
  const mapTimeInForce = (tif: string | undefined): TimeInForce | undefined => {
55
130
  switch (tif) {
56
131
  case 'Gtc':
@@ -70,9 +145,14 @@ export const mapOrder = (detail: HlOrderDetail): Order => {
70
145
 
71
146
  return {
72
147
  orderId: String(o.oid),
73
- symbol: o.coin,
148
+ asset: {
149
+ assetId: o.coin,
150
+ market: deriveMarket(o.coin),
151
+ displaySymbol: o.coin,
152
+ displayQuote: null,
153
+ },
74
154
  side: o.side === 'B' ? OrderSide.BUY : OrderSide.SELL,
75
- type: o.orderType === 'Limit' ? OrderType.LIMIT : OrderType.MARKET,
155
+ type: mapOrderType(o.orderType),
76
156
  price: o.limitPx,
77
157
  originalSize: o.origSz,
78
158
  remainingSize: o.sz,
@@ -82,6 +162,7 @@ export const mapOrder = (detail: HlOrderDetail): Order => {
82
162
  isTrigger: o.triggerCondition !== undefined && o.triggerCondition !== 'N/A',
83
163
  triggerPrice: o.triggerPx ?? undefined,
84
164
  status: mapOrderStatus(detail.status),
165
+ statusReason: mapStatusReason(detail.status),
85
166
  createdAt: new Date(o.timestamp).toISOString(),
86
167
  updatedAt: new Date(detail.statusTimestamp).toISOString(),
87
168
  }
@@ -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[]
@@ -180,6 +193,124 @@ export type HlOrderStatusResponse =
180
193
  | HlOrderStatusFound
181
194
  | { status: 'unknownOid' }
182
195
 
196
+ // -- userNonFundingLedgerUpdates --------------------------------------------
197
+
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
214
+ }
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
+
272
+ export type HlLedgerUpdate = {
273
+ time: number
274
+ hash: string
275
+ delta: HlLedgerDelta
276
+ }
277
+
278
+ export type HlUserNonFundingLedgerUpdates = HlLedgerUpdate[]
279
+
280
+ // -- userFunding ------------------------------------------------------------
281
+
282
+ export type HlFundingDelta = {
283
+ type: 'funding'
284
+ coin: string
285
+ usdc: string
286
+ szi: string
287
+ fundingRate: string
288
+ }
289
+
290
+ export type HlFundingUpdate = {
291
+ time: number
292
+ hash: string
293
+ delta: HlFundingDelta
294
+ }
295
+
296
+ export type HlUserFunding = HlFundingUpdate[]
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
+
183
314
  // -- perpDexs ---------------------------------------------------------------
184
315
 
185
316
  export type HlPerpDexs = (null | { name: string })[]
@@ -219,3 +350,30 @@ export type HlExchangeResponse = {
219
350
  }
220
351
  }
221
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'