@lifi/perps-sdk-provider-lighter 40.2.0 → 41.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +18 -3
  2. package/dist/cjs/LighterProvider.d.ts.map +1 -1
  3. package/dist/cjs/LighterProvider.js +4 -0
  4. package/dist/cjs/LighterProvider.js.map +1 -1
  5. package/dist/cjs/utils/index.d.ts +1 -1
  6. package/dist/cjs/utils/index.d.ts.map +1 -1
  7. package/dist/cjs/utils/index.js +2 -1
  8. package/dist/cjs/utils/index.js.map +1 -1
  9. package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
  10. package/dist/cjs/utils/mapOrder.js +34 -17
  11. package/dist/cjs/utils/mapOrder.js.map +1 -1
  12. package/dist/cjs/utils/orderFormatting.d.ts +6 -0
  13. package/dist/cjs/utils/orderFormatting.d.ts.map +1 -1
  14. package/dist/cjs/utils/orderFormatting.js +7 -0
  15. package/dist/cjs/utils/orderFormatting.js.map +1 -1
  16. package/dist/esm/LighterProvider.d.ts.map +1 -1
  17. package/dist/esm/LighterProvider.js +6 -1
  18. package/dist/esm/LighterProvider.js.map +1 -1
  19. package/dist/esm/utils/index.d.ts +1 -1
  20. package/dist/esm/utils/index.d.ts.map +1 -1
  21. package/dist/esm/utils/index.js +1 -1
  22. package/dist/esm/utils/index.js.map +1 -1
  23. package/dist/esm/utils/mapOrder.d.ts.map +1 -1
  24. package/dist/esm/utils/mapOrder.js +35 -17
  25. package/dist/esm/utils/mapOrder.js.map +1 -1
  26. package/dist/esm/utils/orderFormatting.d.ts +13 -0
  27. package/dist/esm/utils/orderFormatting.d.ts.map +1 -1
  28. package/dist/esm/utils/orderFormatting.js +13 -0
  29. package/dist/esm/utils/orderFormatting.js.map +1 -1
  30. package/dist/types/LighterProvider.d.ts.map +1 -1
  31. package/dist/types/utils/index.d.ts +1 -1
  32. package/dist/types/utils/index.d.ts.map +1 -1
  33. package/dist/types/utils/mapOrder.d.ts.map +1 -1
  34. package/dist/types/utils/orderFormatting.d.ts +13 -0
  35. package/dist/types/utils/orderFormatting.d.ts.map +1 -1
  36. package/package.json +3 -3
  37. package/src/LighterProvider.ts +7 -0
  38. package/src/utils/index.ts +5 -1
  39. package/src/utils/mapOrder.ts +45 -17
  40. package/src/utils/orderFormatting.ts +14 -0
@@ -68,23 +68,51 @@ const mapTimeInForce = (tif: string): TimeInForce => {
68
68
  const hasFill = (order: LtOrder): boolean =>
69
69
  safeIsDecimalStringGreaterThan(order.filled_base_amount, '0') === true
70
70
 
71
- const mapOrderStatus = (order: LtOrder): OrderStatus => {
71
+ const CANCELLED_STATUS_REASONS = {
72
+ canceled: 'Cancelled.',
73
+ 'canceled-post-only':
74
+ 'Cancelled: the post-only order would have filled immediately.',
75
+ 'canceled-reduce-only':
76
+ 'Cancelled: the reduce-only order would have increased the position.',
77
+ 'canceled-position-not-allowed':
78
+ 'Cancelled: the venue does not allow this position.',
79
+ 'canceled-margin-not-allowed': 'Cancelled: not enough margin for this order.',
80
+ 'canceled-too-much-slippage':
81
+ 'Cancelled: the price moved more than the slippage limit.',
82
+ 'canceled-not-enough-liquidity':
83
+ 'Cancelled: not enough liquidity to fill the order.',
84
+ 'canceled-self-trade':
85
+ 'Cancelled: the order would have traded with your own order.',
86
+ 'canceled-oco': 'Cancelled: the other order in the pair executed.',
87
+ 'canceled-child': 'Cancelled: the parent order closed.',
88
+ 'canceled-liquidation': 'Cancelled: the account was liquidated.',
89
+ 'canceled-invalid-balance':
90
+ 'Cancelled: the account balance is not sufficient.',
91
+ } as const
92
+
93
+ const mapOrderLifecycle = (
94
+ order: LtOrder
95
+ ): Pick<OrderBase, 'status' | 'statusReason'> => {
72
96
  switch (order.status) {
73
97
  case 'in-progress':
74
- return OrderStatus.ACCEPTED
98
+ return { status: OrderStatus.ACCEPTED }
75
99
  case 'pending':
76
- return OrderStatus.OPEN
100
+ return { status: OrderStatus.OPEN }
77
101
  case 'open':
78
102
  if (order.trigger_status === 'parent-order') {
79
- return OrderStatus.PENDING
103
+ return { status: OrderStatus.PENDING }
104
+ }
105
+ return {
106
+ status: hasFill(order)
107
+ ? OrderStatus.PARTIALLY_FILLED
108
+ : OrderStatus.OPEN,
80
109
  }
81
- return hasFill(order) ? OrderStatus.PARTIALLY_FILLED : OrderStatus.OPEN
82
110
  case 'triggered':
83
- return OrderStatus.TRIGGERED
111
+ return { status: OrderStatus.TRIGGERED }
84
112
  case 'filled':
85
- return OrderStatus.FILLED
113
+ return { status: OrderStatus.FILLED }
86
114
  case 'canceled-expired':
87
- return OrderStatus.EXPIRED
115
+ return { status: OrderStatus.EXPIRED }
88
116
  case 'canceled':
89
117
  case 'canceled-post-only':
90
118
  case 'canceled-reduce-only':
@@ -97,7 +125,10 @@ const mapOrderStatus = (order: LtOrder): OrderStatus => {
97
125
  case 'canceled-child':
98
126
  case 'canceled-liquidation':
99
127
  case 'canceled-invalid-balance':
100
- return OrderStatus.CANCELLED
128
+ return {
129
+ status: OrderStatus.CANCELLED,
130
+ statusReason: CANCELLED_STATUS_REASONS[order.status],
131
+ }
101
132
  default:
102
133
  throw new PerpsError(
103
134
  PerpsErrorCode.SDKError,
@@ -143,7 +174,7 @@ export const mapOrder = (
143
174
  order.order_expiry > 0
144
175
  ? safeTimestampToIsoString(order.order_expiry)
145
176
  : undefined
146
- const status = mapOrderStatus(order)
177
+ const lifecycle = mapOrderLifecycle(order)
147
178
  const base: OrderBase = {
148
179
  orderId: order.order_id,
149
180
  ...(order.client_order_id === NO_CLIENT_ORDER_ID
@@ -151,8 +182,7 @@ export const mapOrder = (
151
182
  : { clientOrderId: order.client_order_id }),
152
183
  market,
153
184
  side: order.is_ask ? OrderSide.SELL : OrderSide.BUY,
154
- status,
155
- ...(status === OrderStatus.CANCELLED ? { statusReason: order.status } : {}),
185
+ ...lifecycle,
156
186
  originalSize: order.initial_base_amount,
157
187
  remainingSize: order.remaining_base_amount,
158
188
  filledSize: order.filled_base_amount,
@@ -174,15 +204,13 @@ export const mapOrder = (
174
204
  case OrderType.STOP_LIMIT:
175
205
  case OrderType.TAKE_PROFIT_MARKET:
176
206
  case OrderType.TAKE_PROFIT_LIMIT: {
207
+ // A market trigger's `price` is its slippage-adjusted limit price.
177
208
  return {
178
209
  ...base,
179
210
  type,
180
211
  triggerPrice: order.trigger_price,
181
212
  triggerCondition: triggerConditionFor(type, base.side),
182
- ...(type === OrderType.STOP_LIMIT ||
183
- type === OrderType.TAKE_PROFIT_LIMIT
184
- ? { limitPrice: order.price }
185
- : {}),
213
+ limitPrice: order.price,
186
214
  }
187
215
  }
188
216
  case OrderType.MARKET:
@@ -213,7 +241,7 @@ export const mapOrderUpdates = (
213
241
  let status: OrderStatus
214
242
  try {
215
243
  order = market === undefined ? undefined : mapOrder(raw, market)
216
- status = order?.status ?? mapOrderStatus(raw)
244
+ status = order?.status ?? mapOrderLifecycle(raw).status
217
245
  } catch (error) {
218
246
  if (!(error instanceof PerpsError)) {
219
247
  throw error
@@ -15,6 +15,20 @@ import {
15
15
  } from '@lifi/perps-types'
16
16
  import Big from 'big.js'
17
17
 
18
+ /**
19
+ * Range of the Lighter market TP/SL slippage input, as decimal string
20
+ * percents (`'1'` is 1%). The minimum is above Lighter's own `0`, because a
21
+ * 0% bound can leave the trigger order unfilled and the position unprotected.
22
+ *
23
+ * @public
24
+ */
25
+ export const LIGHTER_MARKET_SLIPPAGE_PERCENT = {
26
+ min: '1',
27
+ max: '10',
28
+ step: '0.01',
29
+ default: '1',
30
+ } as const
31
+
18
32
  /**
19
33
  * Snap a price onto a Lighter market's tick grid: rounded half-up to the
20
34
  * market's `priceDecimals` (Lighter's `supported_price_decimals`), trailing