@lifi/perps-sdk 0.0.0-preview-4fa39e6 → 0.0.0-preview-6eac2b9
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/dist/cjs/math/fills.d.ts.map +1 -1
- package/dist/cjs/math/fills.js +14 -15
- package/dist/cjs/math/fills.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/websocket/PerpsWsClient.d.ts +2 -0
- package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -1
- package/dist/cjs/websocket/PerpsWsClient.js +14 -1
- package/dist/cjs/websocket/PerpsWsClient.js.map +1 -1
- package/dist/esm/math/fills.d.ts +1 -5
- package/dist/esm/math/fills.d.ts.map +1 -1
- package/dist/esm/math/fills.js +15 -20
- package/dist/esm/math/fills.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/websocket/PerpsWsClient.d.ts +7 -0
- package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -1
- package/dist/esm/websocket/PerpsWsClient.js +20 -2
- package/dist/esm/websocket/PerpsWsClient.js.map +1 -1
- package/dist/types/math/fills.d.ts +1 -5
- package/dist/types/math/fills.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/websocket/PerpsWsClient.d.ts +7 -0
- package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/math/fills.ts +15 -24
- package/src/version.ts +1 -1
- package/src/websocket/PerpsWsClient.ts +25 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fills.d.ts","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,kBAAkB,EAClB,SAAS,EACV,MAAM,mBAAmB,CAAA;AAQ1B,OAAO,EAAE,kBAAkB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"fills.d.ts","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,kBAAkB,EAClB,SAAS,EACV,MAAM,mBAAmB,CAAA;AAQ1B,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAY7B,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,aAAa,GAChB,kBAAkB,CAkCpB;AAQD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GAC5C,kBAAkB,CAUpB"}
|
package/dist/cjs/math/fills.js
CHANGED
|
@@ -5,42 +5,41 @@ exports.classifyFillFromPosition = classifyFillFromPosition;
|
|
|
5
5
|
exports.classifyFill = classifyFill;
|
|
6
6
|
const perps_types_1 = require("@lifi/perps-types");
|
|
7
7
|
Object.defineProperty(exports, "FillClassification", { enumerable: true, get: function () { return perps_types_1.FillClassification; } });
|
|
8
|
-
const
|
|
8
|
+
const parse_js_1 = require("../decimal/parse.js");
|
|
9
9
|
function classifyFillFromPosition(startPosition, side, sz) {
|
|
10
|
-
const start = (
|
|
11
|
-
const
|
|
12
|
-
const end =
|
|
13
|
-
if (start
|
|
14
|
-
return end
|
|
10
|
+
const start = parseFloat(startPosition);
|
|
11
|
+
const delta = side === 'B' ? parseFloat(sz) : -parseFloat(sz);
|
|
12
|
+
const end = start + delta;
|
|
13
|
+
if (start === 0) {
|
|
14
|
+
return end > 0
|
|
15
15
|
? perps_types_1.FillClassification.OPENED_LONG
|
|
16
16
|
: perps_types_1.FillClassification.OPENED_SHORT;
|
|
17
17
|
}
|
|
18
|
-
if (start
|
|
19
|
-
if (end
|
|
18
|
+
if (start > 0) {
|
|
19
|
+
if (end === 0) {
|
|
20
20
|
return perps_types_1.FillClassification.CLOSED_LONG;
|
|
21
21
|
}
|
|
22
|
-
if (end
|
|
22
|
+
if (end < 0) {
|
|
23
23
|
return perps_types_1.FillClassification.SWITCHED_SHORT;
|
|
24
24
|
}
|
|
25
|
-
if (end
|
|
25
|
+
if (end > start) {
|
|
26
26
|
return perps_types_1.FillClassification.INCREASED_LONG;
|
|
27
27
|
}
|
|
28
28
|
return perps_types_1.FillClassification.REDUCED_LONG;
|
|
29
29
|
}
|
|
30
|
-
if (end
|
|
30
|
+
if (end === 0) {
|
|
31
31
|
return perps_types_1.FillClassification.CLOSED_SHORT;
|
|
32
32
|
}
|
|
33
|
-
if (end
|
|
33
|
+
if (end > 0) {
|
|
34
34
|
return perps_types_1.FillClassification.SWITCHED_LONG;
|
|
35
35
|
}
|
|
36
|
-
if (end
|
|
36
|
+
if (end < start) {
|
|
37
37
|
return perps_types_1.FillClassification.INCREASED_SHORT;
|
|
38
38
|
}
|
|
39
39
|
return perps_types_1.FillClassification.REDUCED_SHORT;
|
|
40
40
|
}
|
|
41
41
|
function classifyFill(side, realizedPnl) {
|
|
42
|
-
const isClose = realizedPnl != null &&
|
|
43
|
-
!(0, requireDecimal_js_1.requireDecimal)(realizedPnl, 'classifyFill(realizedPnl)').eq(0);
|
|
42
|
+
const isClose = realizedPnl != null && (0, parse_js_1.parseDecimal)(realizedPnl) !== 0;
|
|
44
43
|
if (side === perps_types_1.OrderSide.BUY) {
|
|
45
44
|
return isClose
|
|
46
45
|
? perps_types_1.FillClassification.CLOSED_SHORT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fills.js","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fills.js","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":";;;AAwBA,4DAsCC;AAQD,oCAaC;AAnFD,mDAI0B;AAQjB,mGAVP,gCAAkB,OAUO;AAP3B,kDAAkD;AAmBlD,SAAgB,wBAAwB,CACtC,aAA4B,EAC5B,IAAY,EACZ,EAAiB;IAEjB,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7D,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAA;IAEzB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,GAAG,CAAC;YACZ,CAAC,CAAC,gCAAkB,CAAC,WAAW;YAChC,CAAC,CAAC,gCAAkB,CAAC,YAAY,CAAA;IACrC,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACd,OAAO,gCAAkB,CAAC,WAAW,CAAA;QACvC,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,OAAO,gCAAkB,CAAC,cAAc,CAAA;QAC1C,CAAC;QACD,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAChB,OAAO,gCAAkB,CAAC,cAAc,CAAA;QAC1C,CAAC;QACD,OAAO,gCAAkB,CAAC,YAAY,CAAA;IACxC,CAAC;IAED,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,OAAO,gCAAkB,CAAC,YAAY,CAAA;IACxC,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,gCAAkB,CAAC,aAAa,CAAA;IACzC,CAAC;IACD,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAChB,OAAO,gCAAkB,CAAC,eAAe,CAAA;IAC3C,CAAC;IACD,OAAO,gCAAkB,CAAC,aAAa,CAAA;AACzC,CAAC;AAQD,SAAgB,YAAY,CAC1B,IAAe,EACf,WAA6C;IAE7C,MAAM,OAAO,GAAG,WAAW,IAAI,IAAI,IAAI,IAAA,uBAAY,EAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACtE,IAAI,IAAI,KAAK,uBAAS,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,OAAO;YACZ,CAAC,CAAC,gCAAkB,CAAC,YAAY;YACjC,CAAC,CAAC,gCAAkB,CAAC,WAAW,CAAA;IACpC,CAAC;IACD,OAAO,OAAO;QACZ,CAAC,CAAC,gCAAkB,CAAC,WAAW;QAChC,CAAC,CAAC,gCAAkB,CAAC,YAAY,CAAA;AACrC,CAAC"}
|
package/dist/cjs/version.d.ts
CHANGED
package/dist/cjs/version.js
CHANGED
|
@@ -20,6 +20,7 @@ export declare class PerpsWsClient {
|
|
|
20
20
|
private readonly options;
|
|
21
21
|
private providers;
|
|
22
22
|
private initPromises;
|
|
23
|
+
private discovery;
|
|
23
24
|
private closed;
|
|
24
25
|
constructor(client: PerpsSDKClient, options?: PerpsWsClientOptions);
|
|
25
26
|
streamsCandles(provider: string): boolean;
|
|
@@ -31,5 +32,6 @@ export declare class PerpsWsClient {
|
|
|
31
32
|
private assertOpen;
|
|
32
33
|
private getOrCreateProvider;
|
|
33
34
|
private initProvider;
|
|
35
|
+
private discoverProviders;
|
|
34
36
|
}
|
|
35
37
|
//# sourceMappingURL=PerpsWsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsWsClient.d.ts","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PerpsWsClient.d.ts","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,KAAK,EACV,oBAAoB,EAEpB,UAAU,EACV,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAOnB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAA;IAEhB,KAAK,EAAE,MAAM,CAAA;IAMb,MAAM,EAAE,cAAc,CAAA;CACvB;AAQD,MAAM,WAAW,iBAAiB;IAChC,CAAC,MAAM,EAAE,uBAAuB,GAAG,UAAU,CAAA;IAE7C,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAEhC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAA;CAC1C;AAOD,MAAM,WAAW,oBAAoB;IASnC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAChD;AAQD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,oBAAyB;IAatE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAWzC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAmB5C,SAAS,CAAC,CAAC,SAAS,YAAY,EACpC,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,EAClD,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,IAAI,CAAC;IAkBhB,cAAc,CAClB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,IAAI,CAAC;IAqBtB,KAAK;IAeL,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIjC,OAAO,CAAC,UAAU;YASJ,mBAAmB;YAqBnB,YAAY;IAgC1B,OAAO,CAAC,iBAAiB;CAY1B"}
|
|
@@ -10,6 +10,7 @@ class PerpsWsClient {
|
|
|
10
10
|
options;
|
|
11
11
|
providers = new Map();
|
|
12
12
|
initPromises = new Map();
|
|
13
|
+
discovery;
|
|
13
14
|
closed = false;
|
|
14
15
|
constructor(client, options = {}) {
|
|
15
16
|
this.client = client;
|
|
@@ -73,7 +74,7 @@ class PerpsWsClient {
|
|
|
73
74
|
throw new PerpsError_js_1.PerpsError(perps_types_1.PerpsErrorCode.SDKError, `No WS provider factory registered for '${provider}'. Pass one via ` +
|
|
74
75
|
'new PerpsWsClient(client, { wsProviders: { [key]: factory } }).');
|
|
75
76
|
}
|
|
76
|
-
const { providers } = await
|
|
77
|
+
const { providers } = await this.discoverProviders();
|
|
77
78
|
this.assertOpen();
|
|
78
79
|
const providerInfo = providers.find((d) => d.key === provider);
|
|
79
80
|
if (!providerInfo?.wsUrl) {
|
|
@@ -87,6 +88,18 @@ class PerpsWsClient {
|
|
|
87
88
|
this.providers.set(provider, wsProvider);
|
|
88
89
|
return wsProvider;
|
|
89
90
|
}
|
|
91
|
+
discoverProviders() {
|
|
92
|
+
if (this.discovery) {
|
|
93
|
+
return this.discovery;
|
|
94
|
+
}
|
|
95
|
+
const discovery = (0, getProviders_js_1.getProviders)(this.client).finally(() => {
|
|
96
|
+
if (this.discovery === discovery) {
|
|
97
|
+
this.discovery = undefined;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
this.discovery = discovery;
|
|
101
|
+
return discovery;
|
|
102
|
+
}
|
|
90
103
|
}
|
|
91
104
|
exports.PerpsWsClient = PerpsWsClient;
|
|
92
105
|
//# sourceMappingURL=PerpsWsClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsWsClient.js","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"PerpsWsClient.js","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/math/fills.d.ts
CHANGED
|
@@ -12,9 +12,7 @@ export { FillClassification };
|
|
|
12
12
|
* @param startPosition Signed position held BEFORE this fill (`> 0` long,
|
|
13
13
|
* `< 0` short, `0` flat).
|
|
14
14
|
* @param side Hyperliquid-style: `'B'` for buy, anything else for sell.
|
|
15
|
-
* @param sz Unsigned fill size
|
|
16
|
-
* @throws {PerpsError} `ValidationError` when `startPosition` or `sz` is not a
|
|
17
|
-
* decimal string.
|
|
15
|
+
* @param sz Unsigned fill size, parsed with `parseFloat`.
|
|
18
16
|
* @public
|
|
19
17
|
*/
|
|
20
18
|
export declare function classifyFillFromPosition(startPosition: DecimalString, side: string, sz: DecimalString): FillClassification;
|
|
@@ -22,8 +20,6 @@ export declare function classifyFillFromPosition(startPosition: DecimalString, s
|
|
|
22
20
|
* Classify a fill as open or close based on realizedPnl.
|
|
23
21
|
* @deprecated Use `Fill.classification` instead — it uses startPosition
|
|
24
22
|
* for accurate open/increase/reduce/close/reverse classification.
|
|
25
|
-
* @throws {PerpsError} `ValidationError` when `realizedPnl` is a string that
|
|
26
|
-
* is not a decimal string.
|
|
27
23
|
* @public
|
|
28
24
|
*/
|
|
29
25
|
export declare function classifyFill(side: OrderSide, realizedPnl: DecimalString | null | undefined): FillClassification;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fills.d.ts","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,kBAAkB,EAClB,SAAS,EACV,MAAM,mBAAmB,CAAA;AAG1B;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAE7B
|
|
1
|
+
{"version":3,"file":"fills.d.ts","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,kBAAkB,EAClB,SAAS,EACV,MAAM,mBAAmB,CAAA;AAG1B;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAE7B;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,aAAa,GAChB,kBAAkB,CAkCpB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GAC5C,kBAAkB,CAUpB"}
|
package/dist/esm/math/fills.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FillClassification, OrderSide, } from '@lifi/perps-types';
|
|
2
|
-
import {
|
|
2
|
+
import { parseDecimal } from '../decimal/parse.js';
|
|
3
3
|
/**
|
|
4
4
|
* Re-exported fill taxonomy used by {@link classifyFillFromPosition}.
|
|
5
5
|
*
|
|
@@ -13,39 +13,37 @@ export { FillClassification };
|
|
|
13
13
|
* @param startPosition Signed position held BEFORE this fill (`> 0` long,
|
|
14
14
|
* `< 0` short, `0` flat).
|
|
15
15
|
* @param side Hyperliquid-style: `'B'` for buy, anything else for sell.
|
|
16
|
-
* @param sz Unsigned fill size
|
|
17
|
-
* @throws {PerpsError} `ValidationError` when `startPosition` or `sz` is not a
|
|
18
|
-
* decimal string.
|
|
16
|
+
* @param sz Unsigned fill size, parsed with `parseFloat`.
|
|
19
17
|
* @public
|
|
20
18
|
*/
|
|
21
19
|
export function classifyFillFromPosition(startPosition, side, sz) {
|
|
22
|
-
const start =
|
|
23
|
-
const
|
|
24
|
-
const end =
|
|
25
|
-
if (start
|
|
26
|
-
return end
|
|
20
|
+
const start = parseFloat(startPosition);
|
|
21
|
+
const delta = side === 'B' ? parseFloat(sz) : -parseFloat(sz);
|
|
22
|
+
const end = start + delta;
|
|
23
|
+
if (start === 0) {
|
|
24
|
+
return end > 0
|
|
27
25
|
? FillClassification.OPENED_LONG
|
|
28
26
|
: FillClassification.OPENED_SHORT;
|
|
29
27
|
}
|
|
30
|
-
if (start
|
|
31
|
-
if (end
|
|
28
|
+
if (start > 0) {
|
|
29
|
+
if (end === 0) {
|
|
32
30
|
return FillClassification.CLOSED_LONG;
|
|
33
31
|
}
|
|
34
|
-
if (end
|
|
32
|
+
if (end < 0) {
|
|
35
33
|
return FillClassification.SWITCHED_SHORT;
|
|
36
34
|
}
|
|
37
|
-
if (end
|
|
35
|
+
if (end > start) {
|
|
38
36
|
return FillClassification.INCREASED_LONG;
|
|
39
37
|
}
|
|
40
38
|
return FillClassification.REDUCED_LONG;
|
|
41
39
|
}
|
|
42
|
-
if (end
|
|
40
|
+
if (end === 0) {
|
|
43
41
|
return FillClassification.CLOSED_SHORT;
|
|
44
42
|
}
|
|
45
|
-
if (end
|
|
43
|
+
if (end > 0) {
|
|
46
44
|
return FillClassification.SWITCHED_LONG;
|
|
47
45
|
}
|
|
48
|
-
if (end
|
|
46
|
+
if (end < start) {
|
|
49
47
|
return FillClassification.INCREASED_SHORT;
|
|
50
48
|
}
|
|
51
49
|
return FillClassification.REDUCED_SHORT;
|
|
@@ -54,13 +52,10 @@ export function classifyFillFromPosition(startPosition, side, sz) {
|
|
|
54
52
|
* Classify a fill as open or close based on realizedPnl.
|
|
55
53
|
* @deprecated Use `Fill.classification` instead — it uses startPosition
|
|
56
54
|
* for accurate open/increase/reduce/close/reverse classification.
|
|
57
|
-
* @throws {PerpsError} `ValidationError` when `realizedPnl` is a string that
|
|
58
|
-
* is not a decimal string.
|
|
59
55
|
* @public
|
|
60
56
|
*/
|
|
61
57
|
export function classifyFill(side, realizedPnl) {
|
|
62
|
-
const isClose = realizedPnl != null &&
|
|
63
|
-
!requireDecimal(realizedPnl, 'classifyFill(realizedPnl)').eq(0);
|
|
58
|
+
const isClose = realizedPnl != null && parseDecimal(realizedPnl) !== 0;
|
|
64
59
|
if (side === OrderSide.BUY) {
|
|
65
60
|
return isClose
|
|
66
61
|
? FillClassification.CLOSED_SHORT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fills.js","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,SAAS,GACV,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fills.js","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,SAAS,GACV,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAE7B;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,aAA4B,EAC5B,IAAY,EACZ,EAAiB;IAEjB,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7D,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAA;IAEzB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,GAAG,CAAC;YACZ,CAAC,CAAC,kBAAkB,CAAC,WAAW;YAChC,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAA;IACrC,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACd,OAAO,kBAAkB,CAAC,WAAW,CAAA;QACvC,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,OAAO,kBAAkB,CAAC,cAAc,CAAA;QAC1C,CAAC;QACD,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAChB,OAAO,kBAAkB,CAAC,cAAc,CAAA;QAC1C,CAAC;QACD,OAAO,kBAAkB,CAAC,YAAY,CAAA;IACxC,CAAC;IAED,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,OAAO,kBAAkB,CAAC,YAAY,CAAA;IACxC,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,kBAAkB,CAAC,aAAa,CAAA;IACzC,CAAC;IACD,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAChB,OAAO,kBAAkB,CAAC,eAAe,CAAA;IAC3C,CAAC;IACD,OAAO,kBAAkB,CAAC,aAAa,CAAA;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAe,EACf,WAA6C;IAE7C,MAAM,OAAO,GAAG,WAAW,IAAI,IAAI,IAAI,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACtE,IAAI,IAAI,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,OAAO;YACZ,CAAC,CAAC,kBAAkB,CAAC,YAAY;YACjC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAA;IACpC,CAAC;IACD,OAAO,OAAO;QACZ,CAAC,CAAC,kBAAkB,CAAC,WAAW;QAChC,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAA;AACrC,CAAC"}
|
package/dist/esm/version.d.ts
CHANGED
package/dist/esm/version.js
CHANGED
|
@@ -58,6 +58,7 @@ export declare class PerpsWsClient {
|
|
|
58
58
|
private readonly options;
|
|
59
59
|
private providers;
|
|
60
60
|
private initPromises;
|
|
61
|
+
private discovery;
|
|
61
62
|
private closed;
|
|
62
63
|
constructor(client: PerpsSDKClient, options?: PerpsWsClientOptions);
|
|
63
64
|
/**
|
|
@@ -122,5 +123,11 @@ export declare class PerpsWsClient {
|
|
|
122
123
|
private assertOpen;
|
|
123
124
|
private getOrCreateProvider;
|
|
124
125
|
private initProvider;
|
|
126
|
+
/**
|
|
127
|
+
* Shares one in-flight `/providers` request between concurrent venue
|
|
128
|
+
* inits. The slot clears on settlement, so a later init fetches fresh
|
|
129
|
+
* metadata and a rejection is never cached.
|
|
130
|
+
*/
|
|
131
|
+
private discoverProviders;
|
|
125
132
|
}
|
|
126
133
|
//# sourceMappingURL=PerpsWsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsWsClient.d.ts","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PerpsWsClient.d.ts","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,KAAK,EACV,oBAAoB,EAEpB,UAAU,EACV,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,MAAM,EAAE,cAAc,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,CAAC,MAAM,EAAE,uBAAuB,GAAG,UAAU,CAAA;IAC7C,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAA;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAChD;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,oBAAyB;IAKtE;;;;;;;OAOG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzC;;;;;;OAMG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMlD;;;;;;;;;;;;OAYG;IACG,SAAS,CAAC,CAAC,SAAS,YAAY,EACpC,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,EAClD,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,IAAI,CAAC;IAOtB;;;;;;;;;;OAUG;IACG,cAAc,CAClB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,IAAI,CAAC;IAatB;;;;;;;OAOG;IACH,KAAK;IASL;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIjC,OAAO,CAAC,UAAU;YASJ,mBAAmB;YAqBnB,YAAY;IA2B1B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAY1B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PerpsErrorCode } from '@lifi/perps-types';
|
|
1
|
+
import { PerpsErrorCode, } from '@lifi/perps-types';
|
|
2
2
|
import { PerpsError } from '../errors/PerpsError.js';
|
|
3
3
|
import { getProviders } from '../services/getProviders.js';
|
|
4
4
|
import { cachePromise } from './cachePromise.js';
|
|
@@ -13,6 +13,7 @@ export class PerpsWsClient {
|
|
|
13
13
|
options;
|
|
14
14
|
providers = new Map();
|
|
15
15
|
initPromises = new Map();
|
|
16
|
+
discovery;
|
|
16
17
|
closed = false;
|
|
17
18
|
constructor(client, options = {}) {
|
|
18
19
|
this.client = client;
|
|
@@ -129,7 +130,7 @@ export class PerpsWsClient {
|
|
|
129
130
|
throw new PerpsError(PerpsErrorCode.SDKError, `No WS provider factory registered for '${provider}'. Pass one via ` +
|
|
130
131
|
'new PerpsWsClient(client, { wsProviders: { [key]: factory } }).');
|
|
131
132
|
}
|
|
132
|
-
const { providers } = await
|
|
133
|
+
const { providers } = await this.discoverProviders();
|
|
133
134
|
this.assertOpen();
|
|
134
135
|
const providerInfo = providers.find((d) => d.key === provider);
|
|
135
136
|
if (!providerInfo?.wsUrl) {
|
|
@@ -143,5 +144,22 @@ export class PerpsWsClient {
|
|
|
143
144
|
this.providers.set(provider, wsProvider);
|
|
144
145
|
return wsProvider;
|
|
145
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Shares one in-flight `/providers` request between concurrent venue
|
|
149
|
+
* inits. The slot clears on settlement, so a later init fetches fresh
|
|
150
|
+
* metadata and a rejection is never cached.
|
|
151
|
+
*/
|
|
152
|
+
discoverProviders() {
|
|
153
|
+
if (this.discovery) {
|
|
154
|
+
return this.discovery;
|
|
155
|
+
}
|
|
156
|
+
const discovery = getProviders(this.client).finally(() => {
|
|
157
|
+
if (this.discovery === discovery) {
|
|
158
|
+
this.discovery = undefined;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
this.discovery = discovery;
|
|
162
|
+
return discovery;
|
|
163
|
+
}
|
|
146
164
|
}
|
|
147
165
|
//# sourceMappingURL=PerpsWsClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsWsClient.js","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PerpsWsClient.js","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,9 +12,7 @@ export { FillClassification };
|
|
|
12
12
|
* @param startPosition Signed position held BEFORE this fill (`> 0` long,
|
|
13
13
|
* `< 0` short, `0` flat).
|
|
14
14
|
* @param side Hyperliquid-style: `'B'` for buy, anything else for sell.
|
|
15
|
-
* @param sz Unsigned fill size
|
|
16
|
-
* @throws {PerpsError} `ValidationError` when `startPosition` or `sz` is not a
|
|
17
|
-
* decimal string.
|
|
15
|
+
* @param sz Unsigned fill size, parsed with `parseFloat`.
|
|
18
16
|
* @public
|
|
19
17
|
*/
|
|
20
18
|
export declare function classifyFillFromPosition(startPosition: DecimalString, side: string, sz: DecimalString): FillClassification;
|
|
@@ -22,8 +20,6 @@ export declare function classifyFillFromPosition(startPosition: DecimalString, s
|
|
|
22
20
|
* Classify a fill as open or close based on realizedPnl.
|
|
23
21
|
* @deprecated Use `Fill.classification` instead — it uses startPosition
|
|
24
22
|
* for accurate open/increase/reduce/close/reverse classification.
|
|
25
|
-
* @throws {PerpsError} `ValidationError` when `realizedPnl` is a string that
|
|
26
|
-
* is not a decimal string.
|
|
27
23
|
* @public
|
|
28
24
|
*/
|
|
29
25
|
export declare function classifyFill(side: OrderSide, realizedPnl: DecimalString | null | undefined): FillClassification;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fills.d.ts","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,kBAAkB,EAClB,SAAS,EACV,MAAM,mBAAmB,CAAA;AAG1B;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAE7B
|
|
1
|
+
{"version":3,"file":"fills.d.ts","sourceRoot":"","sources":["../../../src/math/fills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,kBAAkB,EAClB,SAAS,EACV,MAAM,mBAAmB,CAAA;AAG1B;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAE7B;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,aAAa,GAChB,kBAAkB,CAkCpB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GAC5C,kBAAkB,CAUpB"}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -58,6 +58,7 @@ export declare class PerpsWsClient {
|
|
|
58
58
|
private readonly options;
|
|
59
59
|
private providers;
|
|
60
60
|
private initPromises;
|
|
61
|
+
private discovery;
|
|
61
62
|
private closed;
|
|
62
63
|
constructor(client: PerpsSDKClient, options?: PerpsWsClientOptions);
|
|
63
64
|
/**
|
|
@@ -122,5 +123,11 @@ export declare class PerpsWsClient {
|
|
|
122
123
|
private assertOpen;
|
|
123
124
|
private getOrCreateProvider;
|
|
124
125
|
private initProvider;
|
|
126
|
+
/**
|
|
127
|
+
* Shares one in-flight `/providers` request between concurrent venue
|
|
128
|
+
* inits. The slot clears on settlement, so a later init fetches fresh
|
|
129
|
+
* metadata and a rejection is never cached.
|
|
130
|
+
*/
|
|
131
|
+
private discoverProviders;
|
|
125
132
|
}
|
|
126
133
|
//# sourceMappingURL=PerpsWsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsWsClient.d.ts","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PerpsWsClient.d.ts","sourceRoot":"","sources":["../../../src/websocket/PerpsWsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,KAAK,EACV,oBAAoB,EAEpB,UAAU,EACV,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,MAAM,EAAE,cAAc,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,CAAC,MAAM,EAAE,uBAAuB,GAAG,UAAU,CAAA;IAC7C,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAA;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAChD;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,oBAAyB;IAKtE;;;;;;;OAOG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzC;;;;;;OAMG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMlD;;;;;;;;;;;;OAYG;IACG,SAAS,CAAC,CAAC,SAAS,YAAY,EACpC,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,EAClD,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,IAAI,CAAC;IAOtB;;;;;;;;;;OAUG;IACG,cAAc,CAClB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,IAAI,CAAC;IAatB;;;;;;;OAOG;IACH,KAAK;IASL;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIjC,OAAO,CAAC,UAAU;YASJ,mBAAmB;YAqBnB,YAAY;IA2B1B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAY1B"}
|
package/package.json
CHANGED
package/src/math/fills.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
FillClassification,
|
|
4
4
|
OrderSide,
|
|
5
5
|
} from '@lifi/perps-types'
|
|
6
|
-
import {
|
|
6
|
+
import { parseDecimal } from '../decimal/parse.js'
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Re-exported fill taxonomy used by {@link classifyFillFromPosition}.
|
|
@@ -19,9 +19,7 @@ export { FillClassification }
|
|
|
19
19
|
* @param startPosition Signed position held BEFORE this fill (`> 0` long,
|
|
20
20
|
* `< 0` short, `0` flat).
|
|
21
21
|
* @param side Hyperliquid-style: `'B'` for buy, anything else for sell.
|
|
22
|
-
* @param sz Unsigned fill size
|
|
23
|
-
* @throws {PerpsError} `ValidationError` when `startPosition` or `sz` is not a
|
|
24
|
-
* decimal string.
|
|
22
|
+
* @param sz Unsigned fill size, parsed with `parseFloat`.
|
|
25
23
|
* @public
|
|
26
24
|
*/
|
|
27
25
|
export function classifyFillFromPosition(
|
|
@@ -29,39 +27,36 @@ export function classifyFillFromPosition(
|
|
|
29
27
|
side: string,
|
|
30
28
|
sz: DecimalString
|
|
31
29
|
): FillClassification {
|
|
32
|
-
const start =
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
)
|
|
36
|
-
const size = requireDecimal(sz, 'classifyFillFromPosition(sz)')
|
|
37
|
-
const end = side === 'B' ? start.plus(size) : start.minus(size)
|
|
30
|
+
const start = parseFloat(startPosition)
|
|
31
|
+
const delta = side === 'B' ? parseFloat(sz) : -parseFloat(sz)
|
|
32
|
+
const end = start + delta
|
|
38
33
|
|
|
39
|
-
if (start
|
|
40
|
-
return end
|
|
34
|
+
if (start === 0) {
|
|
35
|
+
return end > 0
|
|
41
36
|
? FillClassification.OPENED_LONG
|
|
42
37
|
: FillClassification.OPENED_SHORT
|
|
43
38
|
}
|
|
44
39
|
|
|
45
|
-
if (start
|
|
46
|
-
if (end
|
|
40
|
+
if (start > 0) {
|
|
41
|
+
if (end === 0) {
|
|
47
42
|
return FillClassification.CLOSED_LONG
|
|
48
43
|
}
|
|
49
|
-
if (end
|
|
44
|
+
if (end < 0) {
|
|
50
45
|
return FillClassification.SWITCHED_SHORT
|
|
51
46
|
}
|
|
52
|
-
if (end
|
|
47
|
+
if (end > start) {
|
|
53
48
|
return FillClassification.INCREASED_LONG
|
|
54
49
|
}
|
|
55
50
|
return FillClassification.REDUCED_LONG
|
|
56
51
|
}
|
|
57
52
|
|
|
58
|
-
if (end
|
|
53
|
+
if (end === 0) {
|
|
59
54
|
return FillClassification.CLOSED_SHORT
|
|
60
55
|
}
|
|
61
|
-
if (end
|
|
56
|
+
if (end > 0) {
|
|
62
57
|
return FillClassification.SWITCHED_LONG
|
|
63
58
|
}
|
|
64
|
-
if (end
|
|
59
|
+
if (end < start) {
|
|
65
60
|
return FillClassification.INCREASED_SHORT
|
|
66
61
|
}
|
|
67
62
|
return FillClassification.REDUCED_SHORT
|
|
@@ -71,17 +66,13 @@ export function classifyFillFromPosition(
|
|
|
71
66
|
* Classify a fill as open or close based on realizedPnl.
|
|
72
67
|
* @deprecated Use `Fill.classification` instead — it uses startPosition
|
|
73
68
|
* for accurate open/increase/reduce/close/reverse classification.
|
|
74
|
-
* @throws {PerpsError} `ValidationError` when `realizedPnl` is a string that
|
|
75
|
-
* is not a decimal string.
|
|
76
69
|
* @public
|
|
77
70
|
*/
|
|
78
71
|
export function classifyFill(
|
|
79
72
|
side: OrderSide,
|
|
80
73
|
realizedPnl: DecimalString | null | undefined
|
|
81
74
|
): FillClassification {
|
|
82
|
-
const isClose =
|
|
83
|
-
realizedPnl != null &&
|
|
84
|
-
!requireDecimal(realizedPnl, 'classifyFill(realizedPnl)').eq(0)
|
|
75
|
+
const isClose = realizedPnl != null && parseDecimal(realizedPnl) !== 0
|
|
85
76
|
if (side === OrderSide.BUY) {
|
|
86
77
|
return isClose
|
|
87
78
|
? FillClassification.CLOSED_SHORT
|
package/src/version.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
PerpsErrorCode,
|
|
3
|
+
type ProvidersResponse,
|
|
4
|
+
type Subscription,
|
|
5
|
+
} from '@lifi/perps-types'
|
|
2
6
|
import { PerpsError } from '../errors/PerpsError.js'
|
|
3
7
|
import { getProviders } from '../services/getProviders.js'
|
|
4
8
|
import type { GetQuoteParams } from '../services/getQuote.js'
|
|
@@ -70,6 +74,7 @@ export class PerpsWsClient {
|
|
|
70
74
|
private readonly options: PerpsWsClientOptions
|
|
71
75
|
private providers = new Map<string, WsProvider>()
|
|
72
76
|
private initPromises = new Map<string, Promise<WsProvider>>()
|
|
77
|
+
private discovery: Promise<ProvidersResponse> | undefined
|
|
73
78
|
private closed = false
|
|
74
79
|
|
|
75
80
|
constructor(client: PerpsSDKClient, options: PerpsWsClientOptions = {}) {
|
|
@@ -220,7 +225,7 @@ export class PerpsWsClient {
|
|
|
220
225
|
)
|
|
221
226
|
}
|
|
222
227
|
|
|
223
|
-
const { providers } = await
|
|
228
|
+
const { providers } = await this.discoverProviders()
|
|
224
229
|
this.assertOpen()
|
|
225
230
|
|
|
226
231
|
const providerInfo = providers.find((d) => d.key === provider)
|
|
@@ -236,4 +241,22 @@ export class PerpsWsClient {
|
|
|
236
241
|
this.providers.set(provider, wsProvider)
|
|
237
242
|
return wsProvider
|
|
238
243
|
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Shares one in-flight `/providers` request between concurrent venue
|
|
247
|
+
* inits. The slot clears on settlement, so a later init fetches fresh
|
|
248
|
+
* metadata and a rejection is never cached.
|
|
249
|
+
*/
|
|
250
|
+
private discoverProviders(): Promise<ProvidersResponse> {
|
|
251
|
+
if (this.discovery) {
|
|
252
|
+
return this.discovery
|
|
253
|
+
}
|
|
254
|
+
const discovery = getProviders(this.client).finally(() => {
|
|
255
|
+
if (this.discovery === discovery) {
|
|
256
|
+
this.discovery = undefined
|
|
257
|
+
}
|
|
258
|
+
})
|
|
259
|
+
this.discovery = discovery
|
|
260
|
+
return discovery
|
|
261
|
+
}
|
|
239
262
|
}
|