@lifi/perps-sdk 13.0.0 → 15.0.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/README.md +7 -5
- package/dist/cjs/client/PerpsClient.d.ts +5 -1
- package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/PerpsClient.js +8 -0
- package/dist/cjs/client/PerpsClient.js.map +1 -1
- package/dist/cjs/index.d.ts +4 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +10 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/registry/assetRegistry.d.ts +2 -0
- package/dist/cjs/registry/assetRegistry.d.ts.map +1 -1
- package/dist/cjs/registry/assetRegistry.js +18 -1
- package/dist/cjs/registry/assetRegistry.js.map +1 -1
- package/dist/cjs/registry/referenceDataRegistry.d.ts +5 -2
- package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/cjs/registry/referenceDataRegistry.js +37 -7
- package/dist/cjs/registry/referenceDataRegistry.js.map +1 -1
- package/dist/cjs/services/getOrders.d.ts +2 -1
- package/dist/cjs/services/getOrders.d.ts.map +1 -1
- package/dist/cjs/services/getOrders.js +2 -0
- package/dist/cjs/services/getOrders.js.map +1 -1
- package/dist/cjs/transport/fetchWithRetry.d.ts.map +1 -1
- package/dist/cjs/transport/fetchWithRetry.js.map +1 -1
- package/dist/cjs/types/provider.d.ts +2 -6
- package/dist/cjs/types/provider.d.ts.map +1 -1
- package/dist/cjs/utils/explorer.d.ts +3 -0
- package/dist/cjs/utils/explorer.d.ts.map +1 -1
- package/dist/cjs/utils/explorer.js +6 -0
- package/dist/cjs/utils/explorer.js.map +1 -1
- package/dist/cjs/utils/orderClassification.d.ts +9 -5
- package/dist/cjs/utils/orderClassification.d.ts.map +1 -1
- package/dist/cjs/utils/orderClassification.js +20 -0
- package/dist/cjs/utils/orderClassification.js.map +1 -1
- package/dist/cjs/utils/orderMath.d.ts +2 -2
- package/dist/cjs/utils/orderMath.d.ts.map +1 -1
- package/dist/cjs/utils/orderMath.js +15 -4
- package/dist/cjs/utils/orderMath.js.map +1 -1
- package/dist/cjs/utils/warnOnce.d.ts +2 -0
- package/dist/cjs/utils/warnOnce.d.ts.map +1 -0
- package/dist/cjs/utils/warnOnce.js +22 -0
- package/dist/cjs/utils/warnOnce.js.map +1 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/PerpsClient.d.ts +7 -1
- package/dist/esm/client/PerpsClient.d.ts.map +1 -1
- package/dist/esm/client/PerpsClient.js +10 -0
- package/dist/esm/client/PerpsClient.js.map +1 -1
- package/dist/esm/index.d.ts +4 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/registry/assetRegistry.d.ts +5 -8
- package/dist/esm/registry/assetRegistry.d.ts.map +1 -1
- package/dist/esm/registry/assetRegistry.js +21 -9
- package/dist/esm/registry/assetRegistry.js.map +1 -1
- package/dist/esm/registry/referenceDataRegistry.d.ts +6 -14
- package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/esm/registry/referenceDataRegistry.js +38 -19
- package/dist/esm/registry/referenceDataRegistry.js.map +1 -1
- package/dist/esm/services/getOrders.d.ts +3 -17
- package/dist/esm/services/getOrders.d.ts.map +1 -1
- package/dist/esm/services/getOrders.js +3 -16
- package/dist/esm/services/getOrders.js.map +1 -1
- package/dist/esm/transport/fetchWithRetry.d.ts +3 -2
- package/dist/esm/transport/fetchWithRetry.d.ts.map +1 -1
- package/dist/esm/transport/fetchWithRetry.js +3 -2
- package/dist/esm/transport/fetchWithRetry.js.map +1 -1
- package/dist/esm/types/api.d.ts +2 -2
- package/dist/esm/types/provider.d.ts +2 -16
- package/dist/esm/types/provider.d.ts.map +1 -1
- package/dist/esm/utils/explorer.d.ts +3 -0
- package/dist/esm/utils/explorer.d.ts.map +1 -1
- package/dist/esm/utils/explorer.js +6 -0
- package/dist/esm/utils/explorer.js.map +1 -1
- package/dist/esm/utils/orderClassification.d.ts +14 -19
- package/dist/esm/utils/orderClassification.d.ts.map +1 -1
- package/dist/esm/utils/orderClassification.js +22 -15
- package/dist/esm/utils/orderClassification.js.map +1 -1
- package/dist/esm/utils/orderMath.d.ts +3 -13
- package/dist/esm/utils/orderMath.d.ts.map +1 -1
- package/dist/esm/utils/orderMath.js +17 -16
- package/dist/esm/utils/orderMath.js.map +1 -1
- package/dist/esm/utils/warnOnce.d.ts +9 -0
- package/dist/esm/utils/warnOnce.d.ts.map +1 -0
- package/dist/esm/utils/warnOnce.js +29 -0
- package/dist/esm/utils/warnOnce.js.map +1 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/types/client/PerpsClient.d.ts +7 -1
- package/dist/types/client/PerpsClient.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/registry/assetRegistry.d.ts +5 -8
- package/dist/types/registry/assetRegistry.d.ts.map +1 -1
- package/dist/types/registry/referenceDataRegistry.d.ts +6 -14
- package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/types/services/getOrders.d.ts +3 -17
- package/dist/types/services/getOrders.d.ts.map +1 -1
- package/dist/types/transport/fetchWithRetry.d.ts +3 -2
- package/dist/types/transport/fetchWithRetry.d.ts.map +1 -1
- package/dist/types/types/api.d.ts +2 -2
- package/dist/types/types/provider.d.ts +2 -16
- package/dist/types/types/provider.d.ts.map +1 -1
- package/dist/types/utils/explorer.d.ts +3 -0
- package/dist/types/utils/explorer.d.ts.map +1 -1
- package/dist/types/utils/orderClassification.d.ts +14 -19
- package/dist/types/utils/orderClassification.d.ts.map +1 -1
- package/dist/types/utils/orderMath.d.ts +3 -13
- package/dist/types/utils/orderMath.d.ts.map +1 -1
- package/dist/types/utils/warnOnce.d.ts +9 -0
- package/dist/types/utils/warnOnce.d.ts.map +1 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +2 -2
- package/src/client/PerpsClient.ts +26 -0
- package/src/index.ts +6 -2
- package/src/registry/assetRegistry.ts +29 -9
- package/src/registry/referenceDataRegistry.ts +46 -19
- package/src/services/getOrders.ts +5 -17
- package/src/transport/fetchWithRetry.ts +3 -2
- package/src/types/api.ts +2 -2
- package/src/types/provider.ts +2 -21
- package/src/utils/explorer.ts +6 -0
- package/src/utils/orderClassification.ts +38 -19
- package/src/utils/orderMath.ts +25 -17
- package/src/utils/warnOnce.ts +29 -0
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explorer.d.ts","sourceRoot":"","sources":["../../../src/utils/explorer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"explorer.d.ts","sourceRoot":"","sources":["../../../src/utils/explorer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;CAQlB,CAAA;AAEV;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACzB,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAA;AAYxD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,GAAG,SAAS,CAEpB"}
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Type guards and classifiers that operate on SDK types to determine
|
|
5
|
-
* order categories (TP/SL, open/close). These use the OrderType enum
|
|
6
|
-
* for classification — no string matching.
|
|
7
|
-
*/
|
|
8
|
-
import type { OpenOrder } from '@lifi/perps-types';
|
|
9
|
-
import { FillClassification, OrderSide, OrderStatus } from '@lifi/perps-types';
|
|
1
|
+
import type { Order, RegularOrder, TriggerOrder, TwapOrder } from '@lifi/perps-types';
|
|
2
|
+
import { FillClassification, OrderSide, OrderStatus, TriggerCondition } from '@lifi/perps-types';
|
|
10
3
|
/**
|
|
11
4
|
* Re-exported fill taxonomy used by {@link classifyFillFromPosition}.
|
|
12
5
|
*
|
|
@@ -17,24 +10,26 @@ export { FillClassification };
|
|
|
17
10
|
* Check if an open order is a Take Profit trigger order.
|
|
18
11
|
* @public
|
|
19
12
|
*/
|
|
20
|
-
export declare function isTakeProfitOrder(order: Pick<
|
|
13
|
+
export declare function isTakeProfitOrder(order: Pick<Order, 'type'>): boolean;
|
|
21
14
|
/**
|
|
22
15
|
* Check if an open order is a Stop Loss trigger order.
|
|
23
16
|
* @public
|
|
24
17
|
*/
|
|
25
|
-
export declare function isStopLossOrder(order: Pick<
|
|
18
|
+
export declare function isStopLossOrder(order: Pick<Order, 'type'>): boolean;
|
|
26
19
|
/**
|
|
27
20
|
* Check if an open order is a TP or SL trigger order.
|
|
28
21
|
* @public
|
|
29
22
|
*/
|
|
30
|
-
export declare function isTpSlOrder(order: Pick<
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
*/
|
|
23
|
+
export declare function isTpSlOrder(order: Pick<Order, 'type'>): boolean;
|
|
24
|
+
/** Narrow an order to a price-activated order. */
|
|
25
|
+
export declare function isTriggerOrder(order: Order): order is TriggerOrder;
|
|
26
|
+
/** Narrow an order to a market or limit order. */
|
|
27
|
+
export declare function isRegularOrder(order: Order): order is RegularOrder;
|
|
28
|
+
/** Narrow an order to a time-weighted execution parent. */
|
|
29
|
+
export declare function isTwapOrder(order: Order): order is TwapOrder;
|
|
30
|
+
/** Derive the trigger price relation from the trigger type and execution side. */
|
|
31
|
+
export declare function triggerConditionFor(type: TriggerOrder['type'], side: OrderSide): TriggerCondition;
|
|
32
|
+
/** Lifecycle statuses included in order reads by default. */
|
|
38
33
|
export declare const ACTIVE_ORDER_STATUSES: ReadonlySet<OrderStatus>;
|
|
39
34
|
/**
|
|
40
35
|
* Whether `status` is one of {@link ACTIVE_ORDER_STATUSES}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderClassification.d.ts","sourceRoot":"","sources":["../../../src/utils/orderClassification.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"orderClassification.d.ts","sourceRoot":"","sources":["../../../src/utils/orderClassification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACV,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,WAAW,EAEX,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAG1B;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAY7B;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAEnE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAE/D;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,YAAY,CAElE;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,YAAY,CAElE;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,SAAS,CAE5D;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAC1B,IAAI,EAAE,SAAS,GACd,gBAAgB,CAKlB;AAED,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,WAAW,CAMzD,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACrC,kBAAkB,CAUpB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Position, type RegularOrder, type TriggerOrder } from '@lifi/perps-types';
|
|
2
2
|
/**
|
|
3
3
|
* Pick the matching open position for an order's market, if any.
|
|
4
4
|
*
|
|
@@ -31,17 +31,7 @@ export declare function resolveCloseSize(orderSize: number, positionSize: number
|
|
|
31
31
|
* `null`.
|
|
32
32
|
* @public
|
|
33
33
|
*/
|
|
34
|
-
export declare function expectedRealizedPnlForOpenOrder(order:
|
|
35
|
-
/**
|
|
36
|
-
* Expected rPnL for a TP/SL trigger order against a matching position.
|
|
37
|
-
*
|
|
38
|
-
* A trigger order is by construction a closing leg — its direction is the
|
|
39
|
-
* opposite of the position's. With no matching position there is nothing to
|
|
40
|
-
* close, so rPnL is `null`. The trigger price (always present on the SDK
|
|
41
|
-
* `TriggerOrder` shape) is used as the rPnL price; the optional `limitPrice`
|
|
42
|
-
* for STOP_LIMIT / TAKE_PROFIT_LIMIT is the post-trigger limit, not the rPnL
|
|
43
|
-
* price.
|
|
44
|
-
* @public
|
|
45
|
-
*/
|
|
34
|
+
export declare function expectedRealizedPnlForOpenOrder(order: RegularOrder, position: Position | undefined): number | null;
|
|
35
|
+
/** Project the unfilled closing quantity of an active trigger at its trigger price. */
|
|
46
36
|
export declare function expectedRealizedPnlForTriggerOrder(order: TriggerOrder, position: Position | undefined): number | null;
|
|
47
37
|
//# sourceMappingURL=orderMath.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderMath.d.ts","sourceRoot":"","sources":["../../../src/utils/orderMath.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"orderMath.d.ts","sourceRoot":"","sources":["../../../src/utils/orderMath.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAA;AAI1B;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,QAAQ,EAAE,GAC7B,QAAQ,GAAG,SAAS,CAEtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAKR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,CAyCf;AAED,uFAAuF;AACvF,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,CA2Cf"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a warner that writes each distinct key once. The warner forgets the
|
|
3
|
+
* oldest key when its memory is full, so a key it saw long ago can warn a
|
|
4
|
+
* second time.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare const createWarnOnce: () => ((key: string, message: string) => void);
|
|
9
|
+
//# sourceMappingURL=warnOnce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warnOnce.d.ts","sourceRoot":"","sources":["../../../src/utils/warnOnce.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,QAAO,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAexE,CAAA"}
|
package/dist/types/version.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/perps-sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "15.0.0",
|
|
4
4
|
"description": "LI.FI Perps SDK for perpetuals trading",
|
|
5
5
|
"homepage": "https://github.com/lifinance/perps-sdk",
|
|
6
6
|
"bugs": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"big.js": "^7.0.1",
|
|
47
47
|
"partysocket": "^1.1.19",
|
|
48
48
|
"viem": "^2.55.18",
|
|
49
|
-
"@lifi/perps-types": "^
|
|
49
|
+
"@lifi/perps-types": "^14.0.0"
|
|
50
50
|
},
|
|
51
51
|
"publishConfig": {
|
|
52
52
|
"access": "public"
|
|
@@ -9,6 +9,8 @@ import type {
|
|
|
9
9
|
MarketRef,
|
|
10
10
|
MarketSettings,
|
|
11
11
|
MetaActionType,
|
|
12
|
+
Order,
|
|
13
|
+
OrdersResponse,
|
|
12
14
|
PortfolioHistoryResponse,
|
|
13
15
|
Position,
|
|
14
16
|
PositionMarginConstraints,
|
|
@@ -30,6 +32,14 @@ import { getAssetRegistry } from '../registry/assetRegistry.js'
|
|
|
30
32
|
import { createAction } from '../services/createAction.js'
|
|
31
33
|
import { executeAction } from '../services/executeAction.js'
|
|
32
34
|
import { getAccount as fetchAccount } from '../services/getAccount.js'
|
|
35
|
+
import {
|
|
36
|
+
getOrder as fetchOrder,
|
|
37
|
+
type GetOrderParams,
|
|
38
|
+
} from '../services/getOrder.js'
|
|
39
|
+
import {
|
|
40
|
+
getOrders as fetchOrders,
|
|
41
|
+
type GetOrdersParams,
|
|
42
|
+
} from '../services/getOrders.js'
|
|
33
43
|
import { getProviders } from '../services/getProviders.js'
|
|
34
44
|
import type {
|
|
35
45
|
BuildProviderSetupParams,
|
|
@@ -190,6 +200,22 @@ export class PerpsClient {
|
|
|
190
200
|
return resolveProvider(this.sdkClient, provider)
|
|
191
201
|
}
|
|
192
202
|
|
|
203
|
+
/** Read active or historical orders from the selected venue. */
|
|
204
|
+
async getOrders(
|
|
205
|
+
params: GetOrdersParams,
|
|
206
|
+
options?: SDKRequestOptions
|
|
207
|
+
): Promise<OrdersResponse> {
|
|
208
|
+
return fetchOrders(this.sdkClient, params, options)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Read one venue order through the provider's unified mapper. */
|
|
212
|
+
async getOrder(
|
|
213
|
+
params: GetOrderParams,
|
|
214
|
+
options?: SDKRequestOptions
|
|
215
|
+
): Promise<Order> {
|
|
216
|
+
return fetchOrder(this.sdkClient, params, options)
|
|
217
|
+
}
|
|
218
|
+
|
|
193
219
|
/**
|
|
194
220
|
* Ask the provider plugin for the signer-bearing wire fields of `action` —
|
|
195
221
|
* the on-wire `signerAddress` and any signer-derived params (e.g.
|
package/src/index.ts
CHANGED
|
@@ -87,7 +87,7 @@ export { createMemoryStorage } from './storage/storage.js'
|
|
|
87
87
|
export type { StorageAdapter } from './storage/types.js'
|
|
88
88
|
export { errorCodeFromStatus } from './transport/errorCodeFromStatus.js'
|
|
89
89
|
export type { FetchWithRetryOptions } from './transport/fetchWithRetry.js'
|
|
90
|
-
export { fetchWithRetry } from './transport/fetchWithRetry.js'
|
|
90
|
+
export { fetchWithRetry, isAbortError } from './transport/fetchWithRetry.js'
|
|
91
91
|
export type {
|
|
92
92
|
ProviderRetryConfig,
|
|
93
93
|
ResolvedRetryPolicy,
|
|
@@ -160,7 +160,6 @@ export type {
|
|
|
160
160
|
ProviderGetPortfolioHistoryParams,
|
|
161
161
|
ProviderGetPositionsParams,
|
|
162
162
|
ProviderGetQuoteParams,
|
|
163
|
-
ProviderGetRunningTwapsParams,
|
|
164
163
|
ProviderGetWithdrawableBalancesParams,
|
|
165
164
|
QuoteListener,
|
|
166
165
|
SignActionProgress,
|
|
@@ -222,9 +221,13 @@ export {
|
|
|
222
221
|
classifyFill,
|
|
223
222
|
FillClassification,
|
|
224
223
|
isActiveOrderStatus,
|
|
224
|
+
isRegularOrder,
|
|
225
225
|
isStopLossOrder,
|
|
226
226
|
isTakeProfitOrder,
|
|
227
227
|
isTpSlOrder,
|
|
228
|
+
isTriggerOrder,
|
|
229
|
+
isTwapOrder,
|
|
230
|
+
triggerConditionFor,
|
|
228
231
|
} from './utils/orderClassification.js'
|
|
229
232
|
export {
|
|
230
233
|
expectedRealizedPnlForOpenOrder,
|
|
@@ -252,6 +255,7 @@ export type { RemovableIsolatedMarginParams } from './utils/transferMargin.js'
|
|
|
252
255
|
export { removableIsolatedMargin } from './utils/transferMargin.js'
|
|
253
256
|
export { fromBaseUnits, fromBaseUnitsNumber } from './utils/units.js'
|
|
254
257
|
export { validateMargin } from './utils/validation.js'
|
|
258
|
+
export { createWarnOnce } from './utils/warnOnce.js'
|
|
255
259
|
// Version
|
|
256
260
|
export { name, version } from './version.js'
|
|
257
261
|
export { cachePromise } from './websocket/cachePromise.js'
|
|
@@ -1,19 +1,39 @@
|
|
|
1
1
|
import type { Asset, AssetsResponse } from '@lifi/perps-types'
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
3
|
+
import { PerpsError } from '../errors/PerpsError.js'
|
|
2
4
|
import { buildUrl, request } from '../transport/request.js'
|
|
3
5
|
import type { PerpsSDKClient } from '../types/provider.js'
|
|
4
6
|
import { ReferenceDataRegistry } from './referenceDataRegistry.js'
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* {@link getAssetRegistry}.
|
|
11
|
-
*
|
|
12
|
-
* @public
|
|
13
|
-
*/
|
|
8
|
+
const addressKey = (address: string): string =>
|
|
9
|
+
/^0x[0-9a-f]{40}$/i.test(address) ? address.toLowerCase() : address
|
|
10
|
+
|
|
11
|
+
/** Provider `/assets` index by native `id` and by L1 contract address. @public */
|
|
14
12
|
export class AssetRegistry extends ReferenceDataRegistry<Asset> {
|
|
15
13
|
constructor(client: PerpsSDKClient, provider: string) {
|
|
16
|
-
super(client, provider, 'asset'
|
|
14
|
+
super(client, provider, 'asset', {
|
|
15
|
+
l1Address: (asset) =>
|
|
16
|
+
asset.l1Address === undefined ? undefined : addressKey(asset.l1Address),
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Lookup by provider identity; hexadecimal L1 addresses are case-insensitive. */
|
|
21
|
+
override get(id: string, key: 'id' | 'l1Address' = 'id'): Asset | undefined {
|
|
22
|
+
return key === 'id' ? super.get(id) : this.getByIndex(addressKey(id), key)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Resolve registry membership or report a stale or mis-keyed asset registry. */
|
|
26
|
+
require(id: string, key: 'id' | 'l1Address' = 'id'): Asset {
|
|
27
|
+
const asset = this.get(id, key)
|
|
28
|
+
if (asset === undefined) {
|
|
29
|
+
const error = new PerpsError(
|
|
30
|
+
PerpsErrorCode.ValidationError,
|
|
31
|
+
`[${this.provider}] stale or mis-keyed asset registry: unknown ${key} '${id}'`
|
|
32
|
+
)
|
|
33
|
+
error.tool = this.provider
|
|
34
|
+
throw error
|
|
35
|
+
}
|
|
36
|
+
return asset
|
|
17
37
|
}
|
|
18
38
|
|
|
19
39
|
/**
|
|
@@ -1,27 +1,23 @@
|
|
|
1
|
+
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
2
|
+
import { PerpsError } from '../errors/PerpsError.js'
|
|
1
3
|
import type { PerpsSDKClient } from '../types/provider.js'
|
|
4
|
+
import { createWarnOnce } from '../utils/warnOnce.js'
|
|
2
5
|
|
|
3
|
-
/**
|
|
4
|
-
* Per-provider hash index over one of the provider's reference-data lists
|
|
5
|
-
* (`/markets`, `/assets`), keyed by the list's own primary key.
|
|
6
|
-
*
|
|
7
|
-
* NOT a cache: it holds no freshness policy of its own. Every {@link sync}
|
|
8
|
-
* refetches through the HTTP layer, whose `cache-control` headers decide
|
|
9
|
-
* whether the response comes from disk or the network. A lookup miss warns
|
|
10
|
-
* once per id and returns `undefined`; subsequent syncs reconcile the index
|
|
11
|
-
* without replaying the warning for an id that remains absent.
|
|
12
|
-
*
|
|
13
|
-
* @internal
|
|
14
|
-
*/
|
|
6
|
+
/** Atomic provider reference indexes; HTTP cache headers govern freshness. @internal */
|
|
15
7
|
export abstract class ReferenceDataRegistry<T> {
|
|
16
8
|
private index = new Map<string, T>()
|
|
9
|
+
private secondaryIndexes = new Map<string, Map<string, T>>()
|
|
17
10
|
private current: readonly T[] = []
|
|
18
11
|
private inflight: Promise<readonly T[]> | undefined
|
|
19
|
-
private
|
|
12
|
+
private readonly warnOnce = createWarnOnce()
|
|
20
13
|
|
|
21
14
|
protected constructor(
|
|
22
15
|
protected readonly client: PerpsSDKClient,
|
|
23
16
|
readonly provider: string,
|
|
24
|
-
private readonly kind: string
|
|
17
|
+
private readonly kind: string,
|
|
18
|
+
private readonly secondaryKeys: Readonly<
|
|
19
|
+
Record<string, (item: T) => string | undefined>
|
|
20
|
+
> = {}
|
|
25
21
|
) {}
|
|
26
22
|
|
|
27
23
|
/** Fetch the provider's full list through the HTTP layer. */
|
|
@@ -55,16 +51,47 @@ export abstract class ReferenceDataRegistry<T> {
|
|
|
55
51
|
if (item !== undefined) {
|
|
56
52
|
return item
|
|
57
53
|
}
|
|
58
|
-
|
|
59
|
-
this.warnedIds.add(id)
|
|
60
|
-
console.warn(`[${this.provider}] unknown ${this.kind} id '${id}'`)
|
|
61
|
-
}
|
|
54
|
+
this.warnOnce(id, `[${this.provider}] unknown ${this.kind} id '${id}'`)
|
|
62
55
|
return undefined
|
|
63
56
|
}
|
|
64
57
|
|
|
58
|
+
protected getByIndex(id: string, key: string): T | undefined {
|
|
59
|
+
return this.secondaryIndexes.get(key)?.get(id)
|
|
60
|
+
}
|
|
61
|
+
|
|
65
62
|
private async load(): Promise<readonly T[]> {
|
|
66
63
|
const items = await this.fetchItems()
|
|
67
|
-
|
|
64
|
+
const index = new Map<string, T>()
|
|
65
|
+
for (const item of items) {
|
|
66
|
+
const key = this.keyOf(item)
|
|
67
|
+
if (index.has(key)) {
|
|
68
|
+
throw new PerpsError(
|
|
69
|
+
PerpsErrorCode.ValidationError,
|
|
70
|
+
`[${this.provider}] stale or mis-keyed ${this.kind} registry: duplicate id '${key}'`
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
index.set(key, item)
|
|
74
|
+
}
|
|
75
|
+
const secondaryIndexes = new Map<string, Map<string, T>>()
|
|
76
|
+
for (const [name, keyOf] of Object.entries(this.secondaryKeys)) {
|
|
77
|
+
const secondary = new Map<string, T>()
|
|
78
|
+
for (const item of items) {
|
|
79
|
+
const key = keyOf(item)
|
|
80
|
+
if (key === undefined) {
|
|
81
|
+
continue
|
|
82
|
+
}
|
|
83
|
+
if (secondary.has(key)) {
|
|
84
|
+
throw new PerpsError(
|
|
85
|
+
PerpsErrorCode.ValidationError,
|
|
86
|
+
`[${this.provider}] stale or mis-keyed ${this.kind} registry: duplicate ${name} '${key}'`
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
secondary.set(key, item)
|
|
90
|
+
}
|
|
91
|
+
secondaryIndexes.set(name, secondary)
|
|
92
|
+
}
|
|
93
|
+
this.index = index
|
|
94
|
+
this.secondaryIndexes = secondaryIndexes
|
|
68
95
|
this.current = items
|
|
69
96
|
return items
|
|
70
97
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { OrdersResponse } from '@lifi/perps-types'
|
|
1
|
+
import type { OrderStatus, OrdersResponse } from '@lifi/perps-types'
|
|
2
2
|
import type { Address } from 'viem'
|
|
3
3
|
import { requireProvider } from '../client/requireProvider.js'
|
|
4
4
|
import type { SDKRequestOptions } from '../types/config.js'
|
|
5
5
|
import type { PerpsSDKClient } from '../types/provider.js'
|
|
6
|
+
import { ACTIVE_ORDER_STATUSES } from '../utils/orderClassification.js'
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Parameters for {@link getOrders}.
|
|
@@ -12,6 +13,7 @@ import type { PerpsSDKClient } from '../types/provider.js'
|
|
|
12
13
|
export interface GetOrdersParams {
|
|
13
14
|
provider: string
|
|
14
15
|
address: Address
|
|
16
|
+
statuses?: OrderStatus[]
|
|
15
17
|
/** Optional opaque `Market.id` filter, not a display symbol. */
|
|
16
18
|
marketId?: string
|
|
17
19
|
/** Maximum items returned; provider defaults and caps apply. */
|
|
@@ -20,22 +22,7 @@ export interface GetOrdersParams {
|
|
|
20
22
|
cursor?: string
|
|
21
23
|
}
|
|
22
24
|
|
|
23
|
-
/**
|
|
24
|
-
* Get open orders and trigger orders for an account. Delegates to the
|
|
25
|
-
* registered venue plugin (direct-to-venue); requires the provider plugin to be
|
|
26
|
-
* registered on the client.
|
|
27
|
-
*
|
|
28
|
-
* @throws {PerpsError} When the provider plugin is not registered, or on
|
|
29
|
-
* backend / network / parsing errors.
|
|
30
|
-
* @example
|
|
31
|
-
* ```ts
|
|
32
|
-
* const { openOrders, triggerOrders } = await getOrders(client, {
|
|
33
|
-
* provider: 'hyperliquid',
|
|
34
|
-
* address: '0x1234...',
|
|
35
|
-
* })
|
|
36
|
-
* ```
|
|
37
|
-
* @public
|
|
38
|
-
*/
|
|
25
|
+
/** Read account orders with active lifecycle statuses as the default filter. */
|
|
39
26
|
export async function getOrders(
|
|
40
27
|
client: PerpsSDKClient,
|
|
41
28
|
params: GetOrdersParams,
|
|
@@ -44,6 +31,7 @@ export async function getOrders(
|
|
|
44
31
|
return requireProvider(client, params.provider).getOrders(
|
|
45
32
|
{
|
|
46
33
|
address: params.address,
|
|
34
|
+
statuses: params.statuses ?? [...ACTIVE_ORDER_STATUSES],
|
|
47
35
|
marketId: params.marketId,
|
|
48
36
|
limit: params.limit,
|
|
49
37
|
cursor: params.cursor,
|
|
@@ -18,9 +18,10 @@ export interface FetchWithRetryOptions {
|
|
|
18
18
|
/**
|
|
19
19
|
* True when `error` is an `AbortSignal` cancellation (the native `fetch` abort
|
|
20
20
|
* rejection) rather than a genuine network failure. An abort is a deliberate
|
|
21
|
-
* caller action, so
|
|
21
|
+
* caller action, so every transport rethrows it untouched instead of retrying
|
|
22
|
+
* it or wrapping it in a provider error.
|
|
22
23
|
*
|
|
23
|
-
* @
|
|
24
|
+
* @public
|
|
24
25
|
*/
|
|
25
26
|
export function isAbortError(error: unknown): boolean {
|
|
26
27
|
return error instanceof Error && error.name === 'AbortError'
|
package/src/types/api.ts
CHANGED
|
@@ -176,8 +176,8 @@ export interface PlaceOrderParams {
|
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
179
|
+
* Sends `ActionType.PLACE_TRIGGER_ORDER` with
|
|
180
|
+
* `{ market, side, takeProfit?, stopLoss? }`.
|
|
181
181
|
*
|
|
182
182
|
* @public
|
|
183
183
|
*/
|
package/src/types/provider.ts
CHANGED
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
MarketRef,
|
|
14
14
|
MarketSettings,
|
|
15
15
|
Order,
|
|
16
|
+
OrderStatus,
|
|
16
17
|
OrdersResponse,
|
|
17
18
|
PerpsMarket,
|
|
18
19
|
PerpsSigner,
|
|
@@ -27,7 +28,6 @@ import type {
|
|
|
27
28
|
SignedActionStep,
|
|
28
29
|
SigningMethod,
|
|
29
30
|
TradeType,
|
|
30
|
-
TwapOrder,
|
|
31
31
|
} from '@lifi/perps-types'
|
|
32
32
|
import type { Address } from 'viem'
|
|
33
33
|
import type {
|
|
@@ -223,6 +223,7 @@ export interface ProviderGetMarketSettingsParams {
|
|
|
223
223
|
*/
|
|
224
224
|
export interface ProviderGetOrdersParams {
|
|
225
225
|
address: Address
|
|
226
|
+
statuses?: OrderStatus[]
|
|
226
227
|
/** Optional opaque `Market.id` filter (not a display symbol). */
|
|
227
228
|
marketId?: string
|
|
228
229
|
/** Maximum items returned; provider defaults and caps apply. */
|
|
@@ -231,17 +232,6 @@ export interface ProviderGetOrdersParams {
|
|
|
231
232
|
cursor?: string
|
|
232
233
|
}
|
|
233
234
|
|
|
234
|
-
/**
|
|
235
|
-
* Read params for {@link PerpsProvider.getRunningTwaps}.
|
|
236
|
-
*
|
|
237
|
-
* @public
|
|
238
|
-
*/
|
|
239
|
-
export interface ProviderGetRunningTwapsParams {
|
|
240
|
-
address: Address
|
|
241
|
-
/** Optional opaque `Market.id` filter (not a display symbol). */
|
|
242
|
-
marketId?: string
|
|
243
|
-
}
|
|
244
|
-
|
|
245
235
|
/**
|
|
246
236
|
* Read params for {@link PerpsProvider.getOrder}.
|
|
247
237
|
*
|
|
@@ -457,15 +447,6 @@ export interface PerpsProviderPlugin {
|
|
|
457
447
|
options?: SDKRequestOptions
|
|
458
448
|
): Promise<OrdersResponse>
|
|
459
449
|
|
|
460
|
-
/**
|
|
461
|
-
* Fetch the account's currently running TWAP parent orders directly from the
|
|
462
|
-
* venue. Child slice orders are excluded.
|
|
463
|
-
*/
|
|
464
|
-
getRunningTwaps?(
|
|
465
|
-
params: ProviderGetRunningTwapsParams,
|
|
466
|
-
options?: SDKRequestOptions
|
|
467
|
-
): Promise<TwapOrder[]>
|
|
468
|
-
|
|
469
450
|
getOrder(
|
|
470
451
|
params: ProviderGetOrderParams,
|
|
471
452
|
options?: SDKRequestOptions
|
package/src/utils/explorer.ts
CHANGED
|
@@ -15,7 +15,10 @@ export const ExplorerChainId = {
|
|
|
15
15
|
ETHEREUM: 1,
|
|
16
16
|
ARBITRUM_ONE: 42161,
|
|
17
17
|
LIGHTER: 304,
|
|
18
|
+
ROBINHOOD: 4663,
|
|
18
19
|
HYPERLIQUID: 999,
|
|
20
|
+
AVALANCHE_C_CHAIN: 43114,
|
|
21
|
+
BNB_SMART_CHAIN: 56,
|
|
19
22
|
} as const
|
|
20
23
|
|
|
21
24
|
/**
|
|
@@ -30,7 +33,10 @@ const TX_BASE_URL_BY_CHAIN: Record<ExplorerChainId, string> = {
|
|
|
30
33
|
[ExplorerChainId.ETHEREUM]: 'https://etherscan.io/tx/',
|
|
31
34
|
[ExplorerChainId.ARBITRUM_ONE]: 'https://arbiscan.io/tx/',
|
|
32
35
|
[ExplorerChainId.LIGHTER]: 'https://app.lighter.xyz/explorer/logs/',
|
|
36
|
+
[ExplorerChainId.ROBINHOOD]: 'https://robin.etherscan.io/tx/',
|
|
33
37
|
[ExplorerChainId.HYPERLIQUID]: 'https://app.hyperliquid.xyz/explorer/tx/',
|
|
38
|
+
[ExplorerChainId.AVALANCHE_C_CHAIN]: 'https://snowtrace.io/tx/',
|
|
39
|
+
[ExplorerChainId.BNB_SMART_CHAIN]: 'https://bscscan.com/tx/',
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
/**
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { OpenOrder } from '@lifi/perps-types'
|
|
1
|
+
import type {
|
|
2
|
+
Order,
|
|
3
|
+
RegularOrder,
|
|
4
|
+
TriggerOrder,
|
|
5
|
+
TwapOrder,
|
|
6
|
+
} from '@lifi/perps-types'
|
|
10
7
|
import {
|
|
11
8
|
FillClassification,
|
|
12
9
|
OrderSide,
|
|
13
10
|
OrderStatus,
|
|
14
11
|
OrderType,
|
|
12
|
+
TriggerCondition,
|
|
15
13
|
} from '@lifi/perps-types'
|
|
16
14
|
import { stringToFloat } from './parse.js'
|
|
17
15
|
|
|
@@ -36,7 +34,7 @@ const SL_TYPES = new Set<OrderType>([
|
|
|
36
34
|
* Check if an open order is a Take Profit trigger order.
|
|
37
35
|
* @public
|
|
38
36
|
*/
|
|
39
|
-
export function isTakeProfitOrder(order: Pick<
|
|
37
|
+
export function isTakeProfitOrder(order: Pick<Order, 'type'>): boolean {
|
|
40
38
|
return TP_TYPES.has(order.type)
|
|
41
39
|
}
|
|
42
40
|
|
|
@@ -44,7 +42,7 @@ export function isTakeProfitOrder(order: Pick<OpenOrder, 'type'>): boolean {
|
|
|
44
42
|
* Check if an open order is a Stop Loss trigger order.
|
|
45
43
|
* @public
|
|
46
44
|
*/
|
|
47
|
-
export function isStopLossOrder(order: Pick<
|
|
45
|
+
export function isStopLossOrder(order: Pick<Order, 'type'>): boolean {
|
|
48
46
|
return SL_TYPES.has(order.type)
|
|
49
47
|
}
|
|
50
48
|
|
|
@@ -52,20 +50,41 @@ export function isStopLossOrder(order: Pick<OpenOrder, 'type'>): boolean {
|
|
|
52
50
|
* Check if an open order is a TP or SL trigger order.
|
|
53
51
|
* @public
|
|
54
52
|
*/
|
|
55
|
-
export function isTpSlOrder(order: Pick<
|
|
53
|
+
export function isTpSlOrder(order: Pick<Order, 'type'>): boolean {
|
|
56
54
|
return TP_TYPES.has(order.type) || SL_TYPES.has(order.type)
|
|
57
55
|
}
|
|
58
56
|
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
57
|
+
/** Narrow an order to a price-activated order. */
|
|
58
|
+
export function isTriggerOrder(order: Order): order is TriggerOrder {
|
|
59
|
+
return isTpSlOrder(order)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Narrow an order to a market or limit order. */
|
|
63
|
+
export function isRegularOrder(order: Order): order is RegularOrder {
|
|
64
|
+
return order.type === OrderType.MARKET || order.type === OrderType.LIMIT
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Narrow an order to a time-weighted execution parent. */
|
|
68
|
+
export function isTwapOrder(order: Order): order is TwapOrder {
|
|
69
|
+
return order.type === OrderType.TWAP
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Derive the trigger price relation from the trigger type and execution side. */
|
|
73
|
+
export function triggerConditionFor(
|
|
74
|
+
type: TriggerOrder['type'],
|
|
75
|
+
side: OrderSide
|
|
76
|
+
): TriggerCondition {
|
|
77
|
+
const takeProfit = TP_TYPES.has(type)
|
|
78
|
+
return takeProfit === (side === OrderSide.SELL)
|
|
79
|
+
? TriggerCondition.ABOVE
|
|
80
|
+
: TriggerCondition.BELOW
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Lifecycle statuses included in order reads by default. */
|
|
66
84
|
export const ACTIVE_ORDER_STATUSES: ReadonlySet<OrderStatus> = new Set([
|
|
67
85
|
OrderStatus.OPEN,
|
|
68
86
|
OrderStatus.PENDING,
|
|
87
|
+
OrderStatus.ACCEPTED,
|
|
69
88
|
OrderStatus.PARTIALLY_FILLED,
|
|
70
89
|
OrderStatus.TRIGGERED,
|
|
71
90
|
])
|