@lifi/perps-sdk 0.0.0-preview-c9a1971 → 0.0.0-preview-34f3bb2
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/registry/referenceDataRegistry.d.ts +0 -3
- package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/cjs/registry/referenceDataRegistry.js +9 -24
- package/dist/cjs/registry/referenceDataRegistry.js.map +1 -1
- package/dist/cjs/utils/calculations.d.ts +1 -1
- package/dist/cjs/utils/calculations.d.ts.map +1 -1
- package/dist/cjs/utils/calculations.js +7 -1
- package/dist/cjs/utils/calculations.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/registry/referenceDataRegistry.d.ts +4 -14
- package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/esm/registry/referenceDataRegistry.js +14 -42
- package/dist/esm/registry/referenceDataRegistry.js.map +1 -1
- package/dist/esm/utils/calculations.d.ts +5 -1
- package/dist/esm/utils/calculations.d.ts.map +1 -1
- package/dist/esm/utils/calculations.js +11 -1
- package/dist/esm/utils/calculations.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/types/registry/referenceDataRegistry.d.ts +4 -14
- package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/types/utils/calculations.d.ts +5 -1
- package/dist/types/utils/calculations.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/registry/referenceDataRegistry.ts +18 -46
- package/src/utils/calculations.ts +22 -9
- package/src/version.ts +1 -1
|
@@ -7,9 +7,6 @@ export declare abstract class ReferenceDataRegistry<T> {
|
|
|
7
7
|
private current;
|
|
8
8
|
private inflight;
|
|
9
9
|
private warnedIds;
|
|
10
|
-
private refetchedIds;
|
|
11
|
-
private generation;
|
|
12
|
-
private refreshInflight;
|
|
13
10
|
private refreshAfter;
|
|
14
11
|
protected constructor(client: PerpsSDKClient, provider: string, kind: string);
|
|
15
12
|
protected abstract fetchItems(bypassHttpCache: boolean): Promise<T[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referenceDataRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"referenceDataRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAiB1D,8BAAsB,qBAAqB,CAAC,CAAC;IAQzC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAI;IAExB,SAAS,aACY,MAAM,EAAE,cAAc,EAChC,QAAQ,EAAE,MAAM,EACR,IAAI,EAAE,MAAM;IAI/B,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAGrE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM;IAOzC,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IAU7B,SAAS,KAAK,KAAK,IAAI,SAAS,CAAC,EAAE,CAElC;IAMD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;YAahB,IAAI;IAQlB,OAAO,CAAC,eAAe;CAcxB"}
|
|
@@ -10,9 +10,6 @@ class ReferenceDataRegistry {
|
|
|
10
10
|
current = [];
|
|
11
11
|
inflight;
|
|
12
12
|
warnedIds = new Set();
|
|
13
|
-
refetchedIds = new Set();
|
|
14
|
-
generation = 0;
|
|
15
|
-
refreshInflight = false;
|
|
16
13
|
refreshAfter = 0;
|
|
17
14
|
constructor(client, provider, kind) {
|
|
18
15
|
this.client = client;
|
|
@@ -39,35 +36,23 @@ class ReferenceDataRegistry {
|
|
|
39
36
|
this.warnedIds.add(id);
|
|
40
37
|
console.warn(`[${this.provider}] unknown ${this.kind} id '${id}'`);
|
|
41
38
|
}
|
|
42
|
-
this.scheduleRefresh(
|
|
39
|
+
this.scheduleRefresh();
|
|
43
40
|
return undefined;
|
|
44
41
|
}
|
|
45
42
|
async load(bypassHttpCache) {
|
|
46
|
-
const generation = ++this.generation;
|
|
47
43
|
const items = await this.fetchItems(bypassHttpCache);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.warnedIds.clear();
|
|
52
|
-
}
|
|
44
|
+
this.index = new Map(items.map((item) => [this.keyOf(item), item]));
|
|
45
|
+
this.current = items;
|
|
46
|
+
this.warnedIds.clear();
|
|
53
47
|
return items;
|
|
54
48
|
}
|
|
55
|
-
scheduleRefresh(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
if (this.refetchedIds.has(id) && Date.now() < this.refreshAfter) {
|
|
49
|
+
scheduleRefresh() {
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
if (now < this.refreshAfter) {
|
|
61
52
|
return;
|
|
62
53
|
}
|
|
63
|
-
this.
|
|
64
|
-
this.
|
|
65
|
-
this.load(true)
|
|
66
|
-
.catch((error) => console.error(`[${this.provider}] ${this.kind} registry refresh failed`, error))
|
|
67
|
-
.finally(() => {
|
|
68
|
-
this.refreshInflight = false;
|
|
69
|
-
this.refreshAfter = Date.now() + REFRESH_COOLDOWN_MS;
|
|
70
|
-
});
|
|
54
|
+
this.refreshAfter = now + REFRESH_COOLDOWN_MS;
|
|
55
|
+
this.load(true).catch((error) => console.error(`[${this.provider}] ${this.kind} registry refresh failed`, error));
|
|
71
56
|
}
|
|
72
57
|
}
|
|
73
58
|
exports.ReferenceDataRegistry = ReferenceDataRegistry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referenceDataRegistry.js","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":";;;AAGA,MAAM,mBAAmB,GAAG,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"referenceDataRegistry.js","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":";;;AAGA,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAclC,MAAsB,qBAAqB;IAQpB;IACV;IACQ;IATX,KAAK,GAAG,IAAI,GAAG,EAAa,CAAA;IAC5B,OAAO,GAAiB,EAAE,CAAA;IAC1B,QAAQ,CAAmC;IAC3C,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,YAAY,GAAG,CAAC,CAAA;IAExB,YACqB,MAAsB,EAChC,QAAgB,EACR,IAAY;QAFV,WAAM,GAAN,MAAM,CAAgB;QAChC,aAAQ,GAAR,QAAQ,CAAQ;QACR,SAAI,GAAJ,IAAI,CAAQ;IAC5B,CAAC;IAaJ,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC5C,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;YAC3B,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAGD,IAAc,KAAK;QACjB,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAMD,GAAG,CAAC,EAAU;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACtB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,aAAa,IAAI,CAAC,IAAI,QAAQ,EAAE,GAAG,CAAC,CAAA;QACpE,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,eAAwB;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,eAAe;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,OAAM;QACR,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,mBAAmB,CAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9B,OAAO,CAAC,KAAK,CACX,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,0BAA0B,EACzD,KAAK,CACN,CACF,CAAA;IACH,CAAC;CACF;AA7ED,sDA6EC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type FeeTier, type Market, type MarketContext, type OrderbookLevel, type Quote, type QuoteSide, type TradeType } from '@lifi/perps-types';
|
|
2
2
|
export declare function calculatePositionSize(marginUsd: number, leverage: number, price: number): number;
|
|
3
3
|
export declare function calculateNotionalValue(size: number, price: number): number;
|
|
4
4
|
export declare function calculateUnrealizedPnl(entryPrice: number, currentPrice: number, size: number): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ exports.percentFromPrice = percentFromPrice;
|
|
|
16
16
|
exports.calculateRealizedPnlPercent = calculateRealizedPnlPercent;
|
|
17
17
|
exports.walkOrderbook = walkOrderbook;
|
|
18
18
|
exports.buildQuote = buildQuote;
|
|
19
|
+
const perps_types_1 = require("@lifi/perps-types");
|
|
20
|
+
const PerpsError_js_1 = require("../errors/PerpsError.js");
|
|
19
21
|
function calculatePositionSize(marginUsd, leverage, price) {
|
|
20
22
|
return (marginUsd * leverage) / price;
|
|
21
23
|
}
|
|
@@ -104,7 +106,11 @@ function walkOrderbook(levels, sizeUsd) {
|
|
|
104
106
|
break;
|
|
105
107
|
}
|
|
106
108
|
const price = Number.parseFloat(level.price);
|
|
107
|
-
const
|
|
109
|
+
const size = Number.parseFloat(level.size);
|
|
110
|
+
if (!Number.isFinite(price) || !Number.isFinite(size)) {
|
|
111
|
+
throw new PerpsError_js_1.PerpsError(perps_types_1.PerpsErrorCode.ValidationError, `Malformed orderbook level: price='${level.price}', size='${level.size}'`);
|
|
112
|
+
}
|
|
113
|
+
const levelNotional = size * price;
|
|
108
114
|
const take = Math.min(remaining, levelNotional);
|
|
109
115
|
filledNotional += take;
|
|
110
116
|
baseSize += take / price;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculations.js","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"calculations.js","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/version.d.ts
CHANGED
package/dist/cjs/version.js
CHANGED
|
@@ -6,15 +6,8 @@ import type { PerpsSDKClient } from '../types/provider.js';
|
|
|
6
6
|
* NOT a cache: it holds no freshness policy of its own. Every {@link sync}
|
|
7
7
|
* refetches through the HTTP layer, whose `cache-control` headers decide
|
|
8
8
|
* whether the response comes from disk or the network. A lookup miss
|
|
9
|
-
* schedules a background refetch that bypasses the HTTP
|
|
10
|
-
* have listed after the cached snapshot.
|
|
11
|
-
*
|
|
12
|
-
* Refetch policy: an id not yet refetched-for triggers one immediate bypass
|
|
13
|
-
* refetch so a just-listed id resolves promptly; repeated misses for an
|
|
14
|
-
* already-refetched id are gated by {@link REFRESH_COOLDOWN_MS} (measured from
|
|
15
|
-
* the previous refetch's completion), and only one bypass refetch runs at a
|
|
16
|
-
* time. Concurrent loads install in generation order — a slower fetch that
|
|
17
|
-
* started earlier can never overwrite the index a later fetch already installed.
|
|
9
|
+
* schedules a cooldown-gated background refetch that bypasses the HTTP
|
|
10
|
+
* cache — the id may have listed after the cached snapshot.
|
|
18
11
|
*
|
|
19
12
|
* @internal
|
|
20
13
|
*/
|
|
@@ -26,9 +19,6 @@ export declare abstract class ReferenceDataRegistry<T> {
|
|
|
26
19
|
private current;
|
|
27
20
|
private inflight;
|
|
28
21
|
private warnedIds;
|
|
29
|
-
private refetchedIds;
|
|
30
|
-
private generation;
|
|
31
|
-
private refreshInflight;
|
|
32
22
|
private refreshAfter;
|
|
33
23
|
protected constructor(client: PerpsSDKClient, provider: string, kind: string);
|
|
34
24
|
/** Fetch the provider's full list, bypassing the HTTP cache when asked. */
|
|
@@ -44,8 +34,8 @@ export declare abstract class ReferenceDataRegistry<T> {
|
|
|
44
34
|
/** The most recently synced list. Empty before the first {@link sync}. */
|
|
45
35
|
protected get items(): readonly T[];
|
|
46
36
|
/**
|
|
47
|
-
* O(1) lookup by primary key. A miss warns once per id and schedules
|
|
48
|
-
* cache-bypassing background refetch
|
|
37
|
+
* O(1) lookup by primary key. A miss warns once per id and schedules the
|
|
38
|
+
* cooldown-gated, cache-bypassing background refetch.
|
|
49
39
|
*/
|
|
50
40
|
get(id: string): T | undefined;
|
|
51
41
|
private load;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referenceDataRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAK1D
|
|
1
|
+
{"version":3,"file":"referenceDataRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAK1D;;;;;;;;;;;GAWG;AACH,8BAAsB,qBAAqB,CAAC,CAAC;IAQzC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAI;IAExB,SAAS,aACY,MAAM,EAAE,cAAc,EAChC,QAAQ,EAAE,MAAM,EACR,IAAI,EAAE,MAAM;IAG/B,2EAA2E;IAC3E,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAErE,6DAA6D;IAC7D,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM;IAEzC;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IAS7B,0EAA0E;IAC1E,SAAS,KAAK,KAAK,IAAI,SAAS,CAAC,EAAE,CAElC;IAED;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;YAahB,IAAI;IAQlB,OAAO,CAAC,eAAe;CAcxB"}
|
|
@@ -7,15 +7,8 @@ const REFRESH_COOLDOWN_MS = 60_000;
|
|
|
7
7
|
* NOT a cache: it holds no freshness policy of its own. Every {@link sync}
|
|
8
8
|
* refetches through the HTTP layer, whose `cache-control` headers decide
|
|
9
9
|
* whether the response comes from disk or the network. A lookup miss
|
|
10
|
-
* schedules a background refetch that bypasses the HTTP
|
|
11
|
-
* have listed after the cached snapshot.
|
|
12
|
-
*
|
|
13
|
-
* Refetch policy: an id not yet refetched-for triggers one immediate bypass
|
|
14
|
-
* refetch so a just-listed id resolves promptly; repeated misses for an
|
|
15
|
-
* already-refetched id are gated by {@link REFRESH_COOLDOWN_MS} (measured from
|
|
16
|
-
* the previous refetch's completion), and only one bypass refetch runs at a
|
|
17
|
-
* time. Concurrent loads install in generation order — a slower fetch that
|
|
18
|
-
* started earlier can never overwrite the index a later fetch already installed.
|
|
10
|
+
* schedules a cooldown-gated background refetch that bypasses the HTTP
|
|
11
|
+
* cache — the id may have listed after the cached snapshot.
|
|
19
12
|
*
|
|
20
13
|
* @internal
|
|
21
14
|
*/
|
|
@@ -27,9 +20,6 @@ export class ReferenceDataRegistry {
|
|
|
27
20
|
current = [];
|
|
28
21
|
inflight;
|
|
29
22
|
warnedIds = new Set();
|
|
30
|
-
refetchedIds = new Set();
|
|
31
|
-
generation = 0;
|
|
32
|
-
refreshInflight = false;
|
|
33
23
|
refreshAfter = 0;
|
|
34
24
|
constructor(client, provider, kind) {
|
|
35
25
|
this.client = client;
|
|
@@ -54,8 +44,8 @@ export class ReferenceDataRegistry {
|
|
|
54
44
|
return this.current;
|
|
55
45
|
}
|
|
56
46
|
/**
|
|
57
|
-
* O(1) lookup by primary key. A miss warns once per id and schedules
|
|
58
|
-
* cache-bypassing background refetch
|
|
47
|
+
* O(1) lookup by primary key. A miss warns once per id and schedules the
|
|
48
|
+
* cooldown-gated, cache-bypassing background refetch.
|
|
59
49
|
*/
|
|
60
50
|
get(id) {
|
|
61
51
|
const item = this.index.get(id);
|
|
@@ -66,42 +56,24 @@ export class ReferenceDataRegistry {
|
|
|
66
56
|
this.warnedIds.add(id);
|
|
67
57
|
console.warn(`[${this.provider}] unknown ${this.kind} id '${id}'`);
|
|
68
58
|
}
|
|
69
|
-
this.scheduleRefresh(
|
|
59
|
+
this.scheduleRefresh();
|
|
70
60
|
return undefined;
|
|
71
61
|
}
|
|
72
62
|
async load(bypassHttpCache) {
|
|
73
|
-
const generation = ++this.generation;
|
|
74
63
|
const items = await this.fetchItems(bypassHttpCache);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
this.index = new Map(items.map((item) => [this.keyOf(item), item]));
|
|
79
|
-
this.current = items;
|
|
80
|
-
this.warnedIds.clear();
|
|
81
|
-
}
|
|
64
|
+
this.index = new Map(items.map((item) => [this.keyOf(item), item]));
|
|
65
|
+
this.current = items;
|
|
66
|
+
this.warnedIds.clear();
|
|
82
67
|
return items;
|
|
83
68
|
}
|
|
84
|
-
scheduleRefresh(
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (this.refreshInflight) {
|
|
88
|
-
this.refetchedIds.add(id);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
// A not-yet-refetched id gets one immediate refetch even inside the
|
|
92
|
-
// cooldown, so a just-listed id isn't withheld by an unrelated miss;
|
|
93
|
-
// repeated misses for the same id stay cooldown-gated.
|
|
94
|
-
if (this.refetchedIds.has(id) && Date.now() < this.refreshAfter) {
|
|
69
|
+
scheduleRefresh() {
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
if (now < this.refreshAfter) {
|
|
95
72
|
return;
|
|
96
73
|
}
|
|
97
|
-
|
|
98
|
-
this.
|
|
99
|
-
this.load(true)
|
|
100
|
-
.catch((error) => console.error(`[${this.provider}] ${this.kind} registry refresh failed`, error))
|
|
101
|
-
.finally(() => {
|
|
102
|
-
this.refreshInflight = false;
|
|
103
|
-
this.refreshAfter = Date.now() + REFRESH_COOLDOWN_MS;
|
|
104
|
-
});
|
|
74
|
+
// Set before any await so concurrent misses cannot trigger a refetch storm.
|
|
75
|
+
this.refreshAfter = now + REFRESH_COOLDOWN_MS;
|
|
76
|
+
this.load(true).catch((error) => console.error(`[${this.provider}] ${this.kind} registry refresh failed`, error));
|
|
105
77
|
}
|
|
106
78
|
}
|
|
107
79
|
//# sourceMappingURL=referenceDataRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referenceDataRegistry.js","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAElC
|
|
1
|
+
{"version":3,"file":"referenceDataRegistry.js","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAElC;;;;;;;;;;;GAWG;AACH,MAAM,OAAgB,qBAAqB;IAQpB;IACV;IACQ;IATX,KAAK,GAAG,IAAI,GAAG,EAAa,CAAA;IAC5B,OAAO,GAAiB,EAAE,CAAA;IAC1B,QAAQ,CAAmC;IAC3C,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,YAAY,GAAG,CAAC,CAAA;IAExB,YACqB,MAAsB,EAChC,QAAgB,EACR,IAAY;QAFV,WAAM,GAAN,MAAM,CAAgB;QAChC,aAAQ,GAAR,QAAQ,CAAQ;QACR,SAAI,GAAJ,IAAI,CAAQ;IAC5B,CAAC;IAQJ;;;;OAIG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC5C,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;YAC3B,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,0EAA0E;IAC1E,IAAc,KAAK;QACjB,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,EAAU;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACtB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,aAAa,IAAI,CAAC,IAAI,QAAQ,EAAE,GAAG,CAAC,CAAA;QACpE,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,eAAwB;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,eAAe;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,OAAM;QACR,CAAC;QACD,4EAA4E;QAC5E,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,mBAAmB,CAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9B,OAAO,CAAC,KAAK,CACX,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,0BAA0B,EACzD,KAAK,CACN,CACF,CAAA;IACH,CAAC;CACF"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* of the perps SDK would need. All parameters are required — no default
|
|
6
6
|
* values for critical financial parameters.
|
|
7
7
|
*/
|
|
8
|
-
import type
|
|
8
|
+
import { type FeeTier, type Market, type MarketContext, type OrderbookLevel, type Quote, type QuoteSide, type TradeType } from '@lifi/perps-types';
|
|
9
9
|
/**
|
|
10
10
|
* Calculate position size in asset units from margin.
|
|
11
11
|
*
|
|
@@ -193,6 +193,8 @@ interface BookWalk {
|
|
|
193
193
|
* notional, the walk stops at the last level and flags `insufficientLiquidity`,
|
|
194
194
|
* returning the best obtainable fill.
|
|
195
195
|
*
|
|
196
|
+
* @throws {PerpsError} `ValidationError` when a level's `price` or `size`
|
|
197
|
+
* does not parse to a finite number.
|
|
196
198
|
* @public
|
|
197
199
|
*/
|
|
198
200
|
export declare function walkOrderbook(levels: OrderbookLevel[], sizeUsd: number): BookWalk;
|
|
@@ -218,6 +220,8 @@ interface BuildQuoteInput {
|
|
|
218
220
|
* versus mark, applies the base taker fee on the filled notional, and carries
|
|
219
221
|
* the market's `funding` (`null` for spot, which has none).
|
|
220
222
|
*
|
|
223
|
+
* @throws {PerpsError} `ValidationError` when a book level does not parse to
|
|
224
|
+
* a finite number — see {@link walkOrderbook}.
|
|
221
225
|
* @public
|
|
222
226
|
*/
|
|
223
227
|
export declare function buildQuote(input: BuildQuoteInput): Quote;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* of the perps SDK would need. All parameters are required — no default
|
|
6
6
|
* values for critical financial parameters.
|
|
7
7
|
*/
|
|
8
|
+
import { PerpsErrorCode, } from '@lifi/perps-types';
|
|
9
|
+
import { PerpsError } from '../errors/PerpsError.js';
|
|
8
10
|
/**
|
|
9
11
|
* Calculate position size in asset units from margin.
|
|
10
12
|
*
|
|
@@ -227,6 +229,8 @@ export function calculateRealizedPnlPercent(realizedPnl, size, price) {
|
|
|
227
229
|
* notional, the walk stops at the last level and flags `insufficientLiquidity`,
|
|
228
230
|
* returning the best obtainable fill.
|
|
229
231
|
*
|
|
232
|
+
* @throws {PerpsError} `ValidationError` when a level's `price` or `size`
|
|
233
|
+
* does not parse to a finite number.
|
|
230
234
|
* @public
|
|
231
235
|
*/
|
|
232
236
|
export function walkOrderbook(levels, sizeUsd) {
|
|
@@ -238,7 +242,11 @@ export function walkOrderbook(levels, sizeUsd) {
|
|
|
238
242
|
break;
|
|
239
243
|
}
|
|
240
244
|
const price = Number.parseFloat(level.price);
|
|
241
|
-
const
|
|
245
|
+
const size = Number.parseFloat(level.size);
|
|
246
|
+
if (!Number.isFinite(price) || !Number.isFinite(size)) {
|
|
247
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, `Malformed orderbook level: price='${level.price}', size='${level.size}'`);
|
|
248
|
+
}
|
|
249
|
+
const levelNotional = size * price;
|
|
242
250
|
const take = Math.min(remaining, levelNotional);
|
|
243
251
|
filledNotional += take;
|
|
244
252
|
baseSize += take / price;
|
|
@@ -258,6 +266,8 @@ export function walkOrderbook(levels, sizeUsd) {
|
|
|
258
266
|
* versus mark, applies the base taker fee on the filled notional, and carries
|
|
259
267
|
* the market's `funding` (`null` for spot, which has none).
|
|
260
268
|
*
|
|
269
|
+
* @throws {PerpsError} `ValidationError` when a book level does not parse to
|
|
270
|
+
* a finite number — see {@link walkOrderbook}.
|
|
261
271
|
* @public
|
|
262
272
|
*/
|
|
263
273
|
export function buildQuote(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculations.js","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"calculations.js","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAKL,cAAc,GAIf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,QAAgB,EAChB,KAAa;IAEb,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAA;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,KAAa;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;AAC/B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,YAAoB,EACpB,IAAY;IAEZ,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,IAAI,CAAA;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAc;IACtD,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAA;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,aAAqB,EACrB,QAAgB;IAEhB,OAAO,aAAa,GAAG,QAAQ,CAAA;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAe;IAC3D,OAAO,OAAO,GAAG,OAAO,CAAA;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,eAAuB,EACvB,KAAc;IAEd,MAAM,UAAU,GAAG,CAAC,GAAG,eAAe,GAAG,GAAG,CAAA;IAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAA;AACxD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAG1C;IACC,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IACjD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAA;AACzE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAGjC;IACC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAC9C,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,gBAAgB,GAAG,SAAS,CAAA;AACrC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,MAI/B;IACC,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,MAAM,CAAA;IAC5D,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,UAAU,CAAA;IACnB,CAAC;IACD,MAAM,SAAS,GAAG,uBAAuB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;IACxE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAA;AAC5C,CAAC;AAYD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,UAAkB,EAClB,QAAgB,EAChB,MAAe,EACf,MAAc;IAEd,IAAI,CAAC,YAAY,IAAI,UAAU,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,YAAY,GAAG,UAAU;QAC3B,CAAC,CAAC,UAAU,GAAG,YAAY,CAAA;IAC7B,MAAM,OAAO,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAA;IACzD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,CAAA;IACvC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,UAAkB,EAClB,QAAgB,EAChB,MAAe;IAEf,IAAI,UAAU,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAA;IAC1D,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,UAAU,CAAA;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,UAAkB,EAClB,QAAgB,EAChB,MAAe;IAEf,IAAI,UAAU,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAA;IAClE,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAA;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,WAAmB,EACnB,IAAY,EACZ,KAAa;IAEb,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAC5C,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,GAAG,CAAA;AAC5C,CAAC;AAcD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAwB,EACxB,OAAe;IAEf,IAAI,SAAS,GAAG,OAAO,CAAA;IACvB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAK;QACP,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,qCAAqC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,GAAG,CAC1E,CAAA;QACH,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,GAAG,KAAK,CAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QAC/C,cAAc,IAAI,IAAI,CAAA;QACtB,QAAQ,IAAI,IAAI,GAAG,KAAK,CAAA;QACxB,SAAS,IAAI,IAAI,CAAA;IACnB,CAAC;IACD,OAAO;QACL,QAAQ;QACR,cAAc;QACd,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,QAAQ;QACpD,qBAAqB,EAAE,SAAS,GAAG,CAAC;KACrC,CAAA;AACH,CAAC;AAkBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;IACvD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,MAAM,cAAc,GAClB,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,MAAM,CAAA;IAC5D,MAAM,MAAM,GAAG,YAAY,CACzB,IAAI,CAAC,cAAc,EACnB,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CACjC,CAAA;IACD,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QACvC,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE;QACzC,OAAO;QACP,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;QACzB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAA;AACH,CAAC"}
|
package/dist/esm/version.d.ts
CHANGED
package/dist/esm/version.js
CHANGED
|
@@ -6,15 +6,8 @@ import type { PerpsSDKClient } from '../types/provider.js';
|
|
|
6
6
|
* NOT a cache: it holds no freshness policy of its own. Every {@link sync}
|
|
7
7
|
* refetches through the HTTP layer, whose `cache-control` headers decide
|
|
8
8
|
* whether the response comes from disk or the network. A lookup miss
|
|
9
|
-
* schedules a background refetch that bypasses the HTTP
|
|
10
|
-
* have listed after the cached snapshot.
|
|
11
|
-
*
|
|
12
|
-
* Refetch policy: an id not yet refetched-for triggers one immediate bypass
|
|
13
|
-
* refetch so a just-listed id resolves promptly; repeated misses for an
|
|
14
|
-
* already-refetched id are gated by {@link REFRESH_COOLDOWN_MS} (measured from
|
|
15
|
-
* the previous refetch's completion), and only one bypass refetch runs at a
|
|
16
|
-
* time. Concurrent loads install in generation order — a slower fetch that
|
|
17
|
-
* started earlier can never overwrite the index a later fetch already installed.
|
|
9
|
+
* schedules a cooldown-gated background refetch that bypasses the HTTP
|
|
10
|
+
* cache — the id may have listed after the cached snapshot.
|
|
18
11
|
*
|
|
19
12
|
* @internal
|
|
20
13
|
*/
|
|
@@ -26,9 +19,6 @@ export declare abstract class ReferenceDataRegistry<T> {
|
|
|
26
19
|
private current;
|
|
27
20
|
private inflight;
|
|
28
21
|
private warnedIds;
|
|
29
|
-
private refetchedIds;
|
|
30
|
-
private generation;
|
|
31
|
-
private refreshInflight;
|
|
32
22
|
private refreshAfter;
|
|
33
23
|
protected constructor(client: PerpsSDKClient, provider: string, kind: string);
|
|
34
24
|
/** Fetch the provider's full list, bypassing the HTTP cache when asked. */
|
|
@@ -44,8 +34,8 @@ export declare abstract class ReferenceDataRegistry<T> {
|
|
|
44
34
|
/** The most recently synced list. Empty before the first {@link sync}. */
|
|
45
35
|
protected get items(): readonly T[];
|
|
46
36
|
/**
|
|
47
|
-
* O(1) lookup by primary key. A miss warns once per id and schedules
|
|
48
|
-
* cache-bypassing background refetch
|
|
37
|
+
* O(1) lookup by primary key. A miss warns once per id and schedules the
|
|
38
|
+
* cooldown-gated, cache-bypassing background refetch.
|
|
49
39
|
*/
|
|
50
40
|
get(id: string): T | undefined;
|
|
51
41
|
private load;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referenceDataRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAK1D
|
|
1
|
+
{"version":3,"file":"referenceDataRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/referenceDataRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAK1D;;;;;;;;;;;GAWG;AACH,8BAAsB,qBAAqB,CAAC,CAAC;IAQzC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAI;IAExB,SAAS,aACY,MAAM,EAAE,cAAc,EAChC,QAAQ,EAAE,MAAM,EACR,IAAI,EAAE,MAAM;IAG/B,2EAA2E;IAC3E,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAErE,6DAA6D;IAC7D,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM;IAEzC;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IAS7B,0EAA0E;IAC1E,SAAS,KAAK,KAAK,IAAI,SAAS,CAAC,EAAE,CAElC;IAED;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;YAahB,IAAI;IAQlB,OAAO,CAAC,eAAe;CAcxB"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* of the perps SDK would need. All parameters are required — no default
|
|
6
6
|
* values for critical financial parameters.
|
|
7
7
|
*/
|
|
8
|
-
import type
|
|
8
|
+
import { type FeeTier, type Market, type MarketContext, type OrderbookLevel, type Quote, type QuoteSide, type TradeType } from '@lifi/perps-types';
|
|
9
9
|
/**
|
|
10
10
|
* Calculate position size in asset units from margin.
|
|
11
11
|
*
|
|
@@ -193,6 +193,8 @@ interface BookWalk {
|
|
|
193
193
|
* notional, the walk stops at the last level and flags `insufficientLiquidity`,
|
|
194
194
|
* returning the best obtainable fill.
|
|
195
195
|
*
|
|
196
|
+
* @throws {PerpsError} `ValidationError` when a level's `price` or `size`
|
|
197
|
+
* does not parse to a finite number.
|
|
196
198
|
* @public
|
|
197
199
|
*/
|
|
198
200
|
export declare function walkOrderbook(levels: OrderbookLevel[], sizeUsd: number): BookWalk;
|
|
@@ -218,6 +220,8 @@ interface BuildQuoteInput {
|
|
|
218
220
|
* versus mark, applies the base taker fee on the filled notional, and carries
|
|
219
221
|
* the market's `funding` (`null` for spot, which has none).
|
|
220
222
|
*
|
|
223
|
+
* @throws {PerpsError} `ValidationError` when a book level does not parse to
|
|
224
|
+
* a finite number — see {@link walkOrderbook}.
|
|
221
225
|
* @public
|
|
222
226
|
*/
|
|
223
227
|
export declare function buildQuote(input: BuildQuoteInput): Quote;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../../../src/utils/calculations.ts"],"names":[],"mappings":"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"}
|
package/dist/types/version.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -10,15 +10,8 @@ const REFRESH_COOLDOWN_MS = 60_000
|
|
|
10
10
|
* NOT a cache: it holds no freshness policy of its own. Every {@link sync}
|
|
11
11
|
* refetches through the HTTP layer, whose `cache-control` headers decide
|
|
12
12
|
* whether the response comes from disk or the network. A lookup miss
|
|
13
|
-
* schedules a background refetch that bypasses the HTTP
|
|
14
|
-
* have listed after the cached snapshot.
|
|
15
|
-
*
|
|
16
|
-
* Refetch policy: an id not yet refetched-for triggers one immediate bypass
|
|
17
|
-
* refetch so a just-listed id resolves promptly; repeated misses for an
|
|
18
|
-
* already-refetched id are gated by {@link REFRESH_COOLDOWN_MS} (measured from
|
|
19
|
-
* the previous refetch's completion), and only one bypass refetch runs at a
|
|
20
|
-
* time. Concurrent loads install in generation order — a slower fetch that
|
|
21
|
-
* started earlier can never overwrite the index a later fetch already installed.
|
|
13
|
+
* schedules a cooldown-gated background refetch that bypasses the HTTP
|
|
14
|
+
* cache — the id may have listed after the cached snapshot.
|
|
22
15
|
*
|
|
23
16
|
* @internal
|
|
24
17
|
*/
|
|
@@ -27,9 +20,6 @@ export abstract class ReferenceDataRegistry<T> {
|
|
|
27
20
|
private current: readonly T[] = []
|
|
28
21
|
private inflight: Promise<readonly T[]> | undefined
|
|
29
22
|
private warnedIds = new Set<string>()
|
|
30
|
-
private refetchedIds = new Set<string>()
|
|
31
|
-
private generation = 0
|
|
32
|
-
private refreshInflight = false
|
|
33
23
|
private refreshAfter = 0
|
|
34
24
|
|
|
35
25
|
protected constructor(
|
|
@@ -64,8 +54,8 @@ export abstract class ReferenceDataRegistry<T> {
|
|
|
64
54
|
}
|
|
65
55
|
|
|
66
56
|
/**
|
|
67
|
-
* O(1) lookup by primary key. A miss warns once per id and schedules
|
|
68
|
-
* cache-bypassing background refetch
|
|
57
|
+
* O(1) lookup by primary key. A miss warns once per id and schedules the
|
|
58
|
+
* cooldown-gated, cache-bypassing background refetch.
|
|
69
59
|
*/
|
|
70
60
|
get(id: string): T | undefined {
|
|
71
61
|
const item = this.index.get(id)
|
|
@@ -76,48 +66,30 @@ export abstract class ReferenceDataRegistry<T> {
|
|
|
76
66
|
this.warnedIds.add(id)
|
|
77
67
|
console.warn(`[${this.provider}] unknown ${this.kind} id '${id}'`)
|
|
78
68
|
}
|
|
79
|
-
this.scheduleRefresh(
|
|
69
|
+
this.scheduleRefresh()
|
|
80
70
|
return undefined
|
|
81
71
|
}
|
|
82
72
|
|
|
83
73
|
private async load(bypassHttpCache: boolean): Promise<readonly T[]> {
|
|
84
|
-
const generation = ++this.generation
|
|
85
74
|
const items = await this.fetchItems(bypassHttpCache)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.index = new Map(items.map((item) => [this.keyOf(item), item]))
|
|
90
|
-
this.current = items
|
|
91
|
-
this.warnedIds.clear()
|
|
92
|
-
}
|
|
75
|
+
this.index = new Map(items.map((item) => [this.keyOf(item), item]))
|
|
76
|
+
this.current = items
|
|
77
|
+
this.warnedIds.clear()
|
|
93
78
|
return items
|
|
94
79
|
}
|
|
95
80
|
|
|
96
|
-
private scheduleRefresh(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (this.refreshInflight) {
|
|
100
|
-
this.refetchedIds.add(id)
|
|
81
|
+
private scheduleRefresh(): void {
|
|
82
|
+
const now = Date.now()
|
|
83
|
+
if (now < this.refreshAfter) {
|
|
101
84
|
return
|
|
102
85
|
}
|
|
103
|
-
//
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
this.refreshInflight = true
|
|
110
|
-
this.refetchedIds.add(id)
|
|
111
|
-
this.load(true)
|
|
112
|
-
.catch((error) =>
|
|
113
|
-
console.error(
|
|
114
|
-
`[${this.provider}] ${this.kind} registry refresh failed`,
|
|
115
|
-
error
|
|
116
|
-
)
|
|
86
|
+
// Set before any await so concurrent misses cannot trigger a refetch storm.
|
|
87
|
+
this.refreshAfter = now + REFRESH_COOLDOWN_MS
|
|
88
|
+
this.load(true).catch((error) =>
|
|
89
|
+
console.error(
|
|
90
|
+
`[${this.provider}] ${this.kind} registry refresh failed`,
|
|
91
|
+
error
|
|
117
92
|
)
|
|
118
|
-
|
|
119
|
-
this.refreshInflight = false
|
|
120
|
-
this.refreshAfter = Date.now() + REFRESH_COOLDOWN_MS
|
|
121
|
-
})
|
|
93
|
+
)
|
|
122
94
|
}
|
|
123
95
|
}
|
|
@@ -6,15 +6,17 @@
|
|
|
6
6
|
* values for critical financial parameters.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import
|
|
10
|
-
FeeTier,
|
|
11
|
-
Market,
|
|
12
|
-
MarketContext,
|
|
13
|
-
OrderbookLevel,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
import {
|
|
10
|
+
type FeeTier,
|
|
11
|
+
type Market,
|
|
12
|
+
type MarketContext,
|
|
13
|
+
type OrderbookLevel,
|
|
14
|
+
PerpsErrorCode,
|
|
15
|
+
type Quote,
|
|
16
|
+
type QuoteSide,
|
|
17
|
+
type TradeType,
|
|
17
18
|
} from '@lifi/perps-types'
|
|
19
|
+
import { PerpsError } from '../errors/PerpsError.js'
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
22
|
* Calculate position size in asset units from margin.
|
|
@@ -319,6 +321,8 @@ interface BookWalk {
|
|
|
319
321
|
* notional, the walk stops at the last level and flags `insufficientLiquidity`,
|
|
320
322
|
* returning the best obtainable fill.
|
|
321
323
|
*
|
|
324
|
+
* @throws {PerpsError} `ValidationError` when a level's `price` or `size`
|
|
325
|
+
* does not parse to a finite number.
|
|
322
326
|
* @public
|
|
323
327
|
*/
|
|
324
328
|
export function walkOrderbook(
|
|
@@ -333,7 +337,14 @@ export function walkOrderbook(
|
|
|
333
337
|
break
|
|
334
338
|
}
|
|
335
339
|
const price = Number.parseFloat(level.price)
|
|
336
|
-
const
|
|
340
|
+
const size = Number.parseFloat(level.size)
|
|
341
|
+
if (!Number.isFinite(price) || !Number.isFinite(size)) {
|
|
342
|
+
throw new PerpsError(
|
|
343
|
+
PerpsErrorCode.ValidationError,
|
|
344
|
+
`Malformed orderbook level: price='${level.price}', size='${level.size}'`
|
|
345
|
+
)
|
|
346
|
+
}
|
|
347
|
+
const levelNotional = size * price
|
|
337
348
|
const take = Math.min(remaining, levelNotional)
|
|
338
349
|
filledNotional += take
|
|
339
350
|
baseSize += take / price
|
|
@@ -370,6 +381,8 @@ interface BuildQuoteInput {
|
|
|
370
381
|
* versus mark, applies the base taker fee on the filled notional, and carries
|
|
371
382
|
* the market's `funding` (`null` for spot, which has none).
|
|
372
383
|
*
|
|
384
|
+
* @throws {PerpsError} `ValidationError` when a book level does not parse to
|
|
385
|
+
* a finite number — see {@link walkOrderbook}.
|
|
373
386
|
* @public
|
|
374
387
|
*/
|
|
375
388
|
export function buildQuote(input: BuildQuoteInput): Quote {
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const name = '@lifi/perps-sdk'
|
|
2
|
-
export const version = '0.0.0-preview-
|
|
2
|
+
export const version = '0.0.0-preview-34f3bb2'
|