@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.
- 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 +88 -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 +128 -0
- package/src/_cjs/providers/hyperliquid/mappers/activity.js.map +1 -0
- 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 +12 -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 +97 -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 +138 -0
- package/src/_esm/providers/hyperliquid/mappers/activity.js.map +1 -0
- 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 +4 -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 +211 -18
- 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 +81 -5
- 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 +13 -0
- package/src/_types/providers/hyperliquid/mappers/activity.d.ts.map +1 -0
- 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 +4 -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 +112 -0
- 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 +244 -18
- package/src/action.ts +324 -0
- package/src/asset.ts +88 -0
- package/src/enums.ts +92 -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 +169 -0
- 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 +10 -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 +158 -0
- 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
|
@@ -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 '../../../
|
|
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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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[]
|
|
@@ -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,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
|
+
}
|