@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.
- package/README.md +18 -3
- package/dist/cjs/LighterProvider.d.ts.map +1 -1
- package/dist/cjs/LighterProvider.js +4 -0
- package/dist/cjs/LighterProvider.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +1 -1
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +2 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
- package/dist/cjs/utils/mapOrder.js +34 -17
- package/dist/cjs/utils/mapOrder.js.map +1 -1
- package/dist/cjs/utils/orderFormatting.d.ts +6 -0
- package/dist/cjs/utils/orderFormatting.d.ts.map +1 -1
- package/dist/cjs/utils/orderFormatting.js +7 -0
- package/dist/cjs/utils/orderFormatting.js.map +1 -1
- package/dist/esm/LighterProvider.d.ts.map +1 -1
- package/dist/esm/LighterProvider.js +6 -1
- package/dist/esm/LighterProvider.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/mapOrder.d.ts.map +1 -1
- package/dist/esm/utils/mapOrder.js +35 -17
- package/dist/esm/utils/mapOrder.js.map +1 -1
- package/dist/esm/utils/orderFormatting.d.ts +13 -0
- package/dist/esm/utils/orderFormatting.d.ts.map +1 -1
- package/dist/esm/utils/orderFormatting.js +13 -0
- package/dist/esm/utils/orderFormatting.js.map +1 -1
- package/dist/types/LighterProvider.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/mapOrder.d.ts.map +1 -1
- package/dist/types/utils/orderFormatting.d.ts +13 -0
- package/dist/types/utils/orderFormatting.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/LighterProvider.ts +7 -0
- package/src/utils/index.ts +5 -1
- package/src/utils/mapOrder.ts +45 -17
- package/src/utils/orderFormatting.ts +14 -0
package/src/utils/mapOrder.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 ??
|
|
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
|