@lifi/perps-sdk-provider-lighter 30.0.0 → 31.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/dist/cjs/LighterProvider.d.ts.map +1 -1
- package/dist/cjs/LighterProvider.js +62 -54
- package/dist/cjs/LighterProvider.js.map +1 -1
- package/dist/cjs/accountSummary.d.ts +4 -1
- package/dist/cjs/accountSummary.d.ts.map +1 -1
- package/dist/cjs/accountSummary.js +8 -7
- package/dist/cjs/accountSummary.js.map +1 -1
- package/dist/cjs/availableToTrade.d.ts +2 -0
- package/dist/cjs/availableToTrade.d.ts.map +1 -1
- package/dist/cjs/availableToTrade.js +6 -7
- package/dist/cjs/availableToTrade.js.map +1 -1
- package/dist/cjs/types/pnl.d.ts.map +1 -1
- package/dist/cjs/types/ws.d.ts +5 -0
- package/dist/cjs/types/ws.d.ts.map +1 -1
- package/dist/cjs/utils/apiClient.d.ts +3 -2
- package/dist/cjs/utils/apiClient.d.ts.map +1 -1
- package/dist/cjs/utils/apiClient.js +5 -3
- package/dist/cjs/utils/apiClient.js.map +1 -1
- package/dist/cjs/utils/fetchDetailedAccount.d.ts +1 -1
- package/dist/cjs/utils/fetchDetailedAccount.d.ts.map +1 -1
- package/dist/cjs/utils/fetchDetailedAccount.js +2 -1
- package/dist/cjs/utils/fetchDetailedAccount.js.map +1 -1
- package/dist/cjs/utils/mapFill.d.ts.map +1 -1
- package/dist/cjs/utils/mapFill.js +1 -3
- package/dist/cjs/utils/mapFill.js.map +1 -1
- package/dist/cjs/utils/mapPortfolioHistory.d.ts +1 -1
- package/dist/cjs/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/cjs/utils/mapPortfolioHistory.js +36 -21
- package/dist/cjs/utils/mapPortfolioHistory.js.map +1 -1
- package/dist/cjs/utils/mapPosition.d.ts +1 -0
- package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
- package/dist/cjs/utils/mapPosition.js +13 -1
- package/dist/cjs/utils/mapPosition.js.map +1 -1
- package/dist/cjs/utils/ohlcvInterval.d.ts.map +1 -1
- package/dist/cjs/utils/ohlcvInterval.js.map +1 -1
- package/dist/cjs/utils/spotPrice.d.ts +5 -1
- package/dist/cjs/utils/spotPrice.d.ts.map +1 -1
- package/dist/cjs/utils/spotPrice.js +14 -1
- package/dist/cjs/utils/spotPrice.js.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts +3 -3
- package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.js +11 -3
- package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
- package/dist/cjs/websocket/LighterWsProvider.d.ts +6 -0
- package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/cjs/websocket/LighterWsProvider.js +120 -9
- package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
- package/dist/esm/LighterProvider.d.ts.map +1 -1
- package/dist/esm/LighterProvider.js +71 -61
- package/dist/esm/LighterProvider.js.map +1 -1
- package/dist/esm/accountSummary.d.ts +17 -3
- package/dist/esm/accountSummary.d.ts.map +1 -1
- package/dist/esm/accountSummary.js +18 -9
- package/dist/esm/accountSummary.js.map +1 -1
- package/dist/esm/availableToTrade.d.ts +2 -0
- package/dist/esm/availableToTrade.d.ts.map +1 -1
- package/dist/esm/availableToTrade.js +4 -6
- package/dist/esm/availableToTrade.js.map +1 -1
- package/dist/esm/types/pnl.d.ts +2 -3
- package/dist/esm/types/pnl.d.ts.map +1 -1
- package/dist/esm/types/ws.d.ts +13 -0
- package/dist/esm/types/ws.d.ts.map +1 -1
- package/dist/esm/types/ws.js +0 -11
- package/dist/esm/types/ws.js.map +1 -1
- package/dist/esm/utils/apiClient.d.ts +9 -2
- package/dist/esm/utils/apiClient.d.ts.map +1 -1
- package/dist/esm/utils/apiClient.js +9 -2
- package/dist/esm/utils/apiClient.js.map +1 -1
- package/dist/esm/utils/fetchDetailedAccount.d.ts +1 -1
- package/dist/esm/utils/fetchDetailedAccount.d.ts.map +1 -1
- package/dist/esm/utils/fetchDetailedAccount.js +2 -1
- package/dist/esm/utils/fetchDetailedAccount.js.map +1 -1
- package/dist/esm/utils/mapFill.d.ts.map +1 -1
- package/dist/esm/utils/mapFill.js +6 -10
- package/dist/esm/utils/mapFill.js.map +1 -1
- package/dist/esm/utils/mapPortfolioHistory.d.ts +3 -6
- package/dist/esm/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/esm/utils/mapPortfolioHistory.js +38 -26
- package/dist/esm/utils/mapPortfolioHistory.js.map +1 -1
- package/dist/esm/utils/mapPosition.d.ts +7 -0
- package/dist/esm/utils/mapPosition.d.ts.map +1 -1
- package/dist/esm/utils/mapPosition.js +17 -0
- package/dist/esm/utils/mapPosition.js.map +1 -1
- package/dist/esm/utils/ohlcvInterval.d.ts.map +1 -1
- package/dist/esm/utils/ohlcvInterval.js +5 -3
- package/dist/esm/utils/ohlcvInterval.js.map +1 -1
- package/dist/esm/utils/spotPrice.d.ts +10 -1
- package/dist/esm/utils/spotPrice.d.ts.map +1 -1
- package/dist/esm/utils/spotPrice.js +14 -0
- package/dist/esm/utils/spotPrice.js.map +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts +12 -5
- package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/esm/utils/withdrawableBalances.js +17 -5
- package/dist/esm/utils/withdrawableBalances.js.map +1 -1
- package/dist/esm/websocket/LighterWsProvider.d.ts +24 -0
- package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/LighterWsProvider.js +153 -15
- package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
- package/dist/types/LighterProvider.d.ts.map +1 -1
- package/dist/types/accountSummary.d.ts +17 -3
- package/dist/types/accountSummary.d.ts.map +1 -1
- package/dist/types/availableToTrade.d.ts +2 -0
- package/dist/types/availableToTrade.d.ts.map +1 -1
- package/dist/types/types/pnl.d.ts +2 -3
- package/dist/types/types/pnl.d.ts.map +1 -1
- package/dist/types/types/ws.d.ts +13 -0
- package/dist/types/types/ws.d.ts.map +1 -1
- package/dist/types/utils/apiClient.d.ts +9 -2
- package/dist/types/utils/apiClient.d.ts.map +1 -1
- package/dist/types/utils/fetchDetailedAccount.d.ts +1 -1
- package/dist/types/utils/fetchDetailedAccount.d.ts.map +1 -1
- package/dist/types/utils/mapFill.d.ts.map +1 -1
- package/dist/types/utils/mapPortfolioHistory.d.ts +3 -6
- package/dist/types/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/types/utils/mapPosition.d.ts +7 -0
- package/dist/types/utils/mapPosition.d.ts.map +1 -1
- package/dist/types/utils/ohlcvInterval.d.ts.map +1 -1
- package/dist/types/utils/spotPrice.d.ts +10 -1
- package/dist/types/utils/spotPrice.d.ts.map +1 -1
- package/dist/types/utils/withdrawableBalances.d.ts +12 -5
- package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/types/websocket/LighterWsProvider.d.ts +24 -0
- package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/LighterProvider.ts +119 -74
- package/src/accountSummary.ts +37 -14
- package/src/availableToTrade.ts +6 -10
- package/src/types/pnl.ts +2 -3
- package/src/types/ws.ts +23 -0
- package/src/utils/apiClient.ts +16 -7
- package/src/utils/fetchDetailedAccount.ts +2 -2
- package/src/utils/mapFill.ts +6 -13
- package/src/utils/mapPortfolioHistory.ts +42 -27
- package/src/utils/mapPosition.ts +17 -0
- package/src/utils/ohlcvInterval.ts +5 -3
- package/src/utils/spotPrice.ts +21 -1
- package/src/utils/withdrawableBalances.ts +26 -7
- package/src/websocket/LighterWsProvider.ts +222 -14
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { classifyFillFromPosition, ExplorerChainId, explorerTxUrl, } from '@lifi/perps-sdk';
|
|
2
2
|
import { LiquidityRole, OrderSide, OrderType } from '@lifi/perps-types';
|
|
3
3
|
import Big from 'big.js';
|
|
4
|
-
import { LIGHTER_FEE_TICK_SCALE
|
|
5
|
-
import {
|
|
4
|
+
import { LIGHTER_FEE_TICK_SCALE } from '../constants.js';
|
|
5
|
+
import { leverageFromScaledImf } from './mapPosition.js';
|
|
6
6
|
import { isPlaceholderTxHash } from './txHash.js';
|
|
7
7
|
/**
|
|
8
8
|
* Fee charged on a fill, in the market's quote asset. Lighter publishes the
|
|
@@ -20,15 +20,11 @@ const tickToFeeAmount = (notional, ownTick, integratorTick) => new Big(notional)
|
|
|
20
20
|
.div(LIGHTER_FEE_TICK_SCALE)
|
|
21
21
|
.toFixed();
|
|
22
22
|
/**
|
|
23
|
-
* Display leverage the viewer had set on the market when the trade executed
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* `undefined` when the row omits the fraction. Lighter declares the fraction a
|
|
27
|
-
* `StrictInt`, so the scale division is exact and `toFixed()` loses nothing.
|
|
23
|
+
* Display leverage the viewer had set on the market when the trade executed,
|
|
24
|
+
* from the pre-trade initial margin fraction. Returns `undefined` when the
|
|
25
|
+
* row omits the fraction.
|
|
28
26
|
*/
|
|
29
|
-
const leverageFromTradeImf = (imf) => imf === undefined
|
|
30
|
-
? undefined
|
|
31
|
-
: leverageFromImf(new Big(imf).div(LIGHTER_IMF_PERCENT_SCALE).toFixed());
|
|
27
|
+
const leverageFromTradeImf = (imf) => imf === undefined ? undefined : leverageFromScaledImf(imf);
|
|
32
28
|
/**
|
|
33
29
|
* Realized PnL on a position-reducing fill, derived from the pre-trade entry
|
|
34
30
|
* basis. Returns `undefined` for opens/increases (nothing closes) or when the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapFill.js","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,aAAa,GACd,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACvE,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"mapFill.js","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,8 @@ import type { PortfolioHistoryRange, PortfolioHistoryResponse } from '@lifi/perp
|
|
|
2
2
|
import Big from 'big.js';
|
|
3
3
|
import type { LtPnLEntry } from '../types/pnl.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* point's `accountValue` is `currentValue` with every later bucket's
|
|
8
|
-
* `trade_pnl + trade_spot_pnl + inflow - outflow` removed. `pnl` is the
|
|
9
|
-
* running `trade_pnl + trade_spot_pnl`, so both series unwind the same PnL.
|
|
5
|
+
* Derive window-relative history from Lighter's cumulative PnL snapshots.
|
|
6
|
+
* Historical account values are anchored to the current account value.
|
|
10
7
|
*/
|
|
11
|
-
export declare const mapPortfolioHistory: (range: PortfolioHistoryRange,
|
|
8
|
+
export declare const mapPortfolioHistory: (range: PortfolioHistoryRange, snapshots: LtPnLEntry[], currentValue: Big) => PortfolioHistoryResponse;
|
|
12
9
|
//# sourceMappingURL=mapPortfolioHistory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPortfolioHistory.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"mapPortfolioHistory.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAajD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,qBAAqB,EAC5B,WAAW,UAAU,EAAE,EACvB,cAAc,GAAG,KAChB,wBAwCF,CAAA"}
|
|
@@ -1,39 +1,51 @@
|
|
|
1
1
|
import Big from 'big.js';
|
|
2
|
+
function getCumulativePnl(snapshot) {
|
|
3
|
+
return new Big(snapshot.trade_pnl).plus(snapshot.trade_spot_pnl);
|
|
4
|
+
}
|
|
5
|
+
function getCumulativeNetFlow(snapshot) {
|
|
6
|
+
return new Big(snapshot.inflow)
|
|
7
|
+
.minus(snapshot.outflow)
|
|
8
|
+
.plus(snapshot.spot_inflow)
|
|
9
|
+
.minus(snapshot.spot_outflow);
|
|
10
|
+
}
|
|
2
11
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* point's `accountValue` is `currentValue` with every later bucket's
|
|
6
|
-
* `trade_pnl + trade_spot_pnl + inflow - outflow` removed. `pnl` is the
|
|
7
|
-
* running `trade_pnl + trade_spot_pnl`, so both series unwind the same PnL.
|
|
12
|
+
* Derive window-relative history from Lighter's cumulative PnL snapshots.
|
|
13
|
+
* Historical account values are anchored to the current account value.
|
|
8
14
|
*/
|
|
9
|
-
export const mapPortfolioHistory = (range,
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
.plus(new Big(entry.outflow));
|
|
15
|
+
export const mapPortfolioHistory = (range, snapshots, currentValue) => {
|
|
16
|
+
const orderedSnapshots = [...snapshots].sort((a, b) => a.timestamp - b.timestamp);
|
|
17
|
+
const firstSnapshot = orderedSnapshots[0];
|
|
18
|
+
const latestSnapshot = orderedSnapshots.at(-1);
|
|
19
|
+
if (!firstSnapshot || !latestSnapshot) {
|
|
20
|
+
return {
|
|
21
|
+
range,
|
|
22
|
+
points: [],
|
|
23
|
+
volume: '0',
|
|
24
|
+
totalPnl: undefined,
|
|
25
|
+
};
|
|
21
26
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
const firstPnl = getCumulativePnl(firstSnapshot);
|
|
28
|
+
const latestPnl = getCumulativePnl(latestSnapshot);
|
|
29
|
+
const accountValueOffset = currentValue
|
|
30
|
+
.minus(latestPnl)
|
|
31
|
+
.minus(getCumulativeNetFlow(latestSnapshot));
|
|
32
|
+
const points = orderedSnapshots.map((snapshot) => {
|
|
33
|
+
const pnl = getCumulativePnl(snapshot);
|
|
27
34
|
return {
|
|
28
|
-
timestamp:
|
|
29
|
-
accountValue:
|
|
30
|
-
|
|
35
|
+
timestamp: snapshot.timestamp * 1_000,
|
|
36
|
+
accountValue: accountValueOffset
|
|
37
|
+
.plus(pnl)
|
|
38
|
+
.plus(getCumulativeNetFlow(snapshot))
|
|
39
|
+
.toFixed(),
|
|
40
|
+
pnl: pnl.minus(firstPnl).toFixed(),
|
|
31
41
|
};
|
|
32
42
|
});
|
|
33
43
|
return {
|
|
34
44
|
range,
|
|
35
45
|
points,
|
|
36
|
-
volume: volume
|
|
46
|
+
volume: new Big(latestSnapshot.volume)
|
|
47
|
+
.minus(firstSnapshot.volume)
|
|
48
|
+
.toFixed(),
|
|
37
49
|
totalPnl: points.at(-1)?.pnl,
|
|
38
50
|
};
|
|
39
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPortfolioHistory.js","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,QAAQ,CAAA;AAGxB
|
|
1
|
+
{"version":3,"file":"mapPortfolioHistory.js","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,QAAQ,CAAA;AAGxB,SAAS,gBAAgB,CAAC,QAAoB;IAC5C,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;AAClE,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAoB;IAChD,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;SAC5B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;SACvB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;SAC1B,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAA4B,EAC5B,SAAuB,EACvB,YAAiB,EACS,EAAE;IAC5B,MAAM,gBAAgB,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CACpC,CAAA;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IACzC,MAAM,cAAc,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,OAAO;YACL,KAAK;YACL,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,SAAS;SACpB,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAA;IAClD,MAAM,kBAAkB,GAAG,YAAY;SACpC,KAAK,CAAC,SAAS,CAAC;SAChB,KAAK,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACtC,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAG,KAAK;YACrC,YAAY,EAAE,kBAAkB;iBAC7B,IAAI,CAAC,GAAG,CAAC;iBACT,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;iBACpC,OAAO,EAAE;YACZ,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;SACnC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,MAAM;QACN,MAAM,EAAE,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;aACnC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;aAC3B,OAAO,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG;KAC7B,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -8,6 +8,13 @@ import type { LtAccountPosition } from '../types/index.js';
|
|
|
8
8
|
* @public
|
|
9
9
|
*/
|
|
10
10
|
export declare const leverageFromImf: (imf: string) => number | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Display leverage from an integer IMF on `LIGHTER_IMF_PERCENT_SCALE`, the
|
|
13
|
+
* unit of trade rows and order-book details: `500` is 5.00%, so 20x.
|
|
14
|
+
* `undefined` for a non-positive or unparsable IMF. Lighter declares the
|
|
15
|
+
* fraction a `StrictInt`, so the scale division is exact.
|
|
16
|
+
*/
|
|
17
|
+
export declare const leverageFromScaledImf: (imf: number) => number | undefined;
|
|
11
18
|
/**
|
|
12
19
|
* Map a raw Lighter account position to the generic Position type.
|
|
13
20
|
* @param market - Backend-resolved market identity for `pos.market_id`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAIrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAI1D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAWtD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAQ5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,QAAQ,kBAAkB,KACzB,QAiCF,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { MarginMode, PositionSide } from '@lifi/perps-types';
|
|
2
2
|
import Big from 'big.js';
|
|
3
|
+
import { LIGHTER_IMF_PERCENT_SCALE } from '../constants.js';
|
|
3
4
|
import { LT_MARGIN_MODE_ISOLATED } from '../types/index.js';
|
|
4
5
|
import { toPositiveRequiredBig, toRequiredBig } from './decimal.js';
|
|
5
6
|
/**
|
|
@@ -22,6 +23,22 @@ export const leverageFromImf = (imf) => {
|
|
|
22
23
|
}
|
|
23
24
|
return new Big(100).div(parsed).toNumber();
|
|
24
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* Display leverage from an integer IMF on `LIGHTER_IMF_PERCENT_SCALE`, the
|
|
28
|
+
* unit of trade rows and order-book details: `500` is 5.00%, so 20x.
|
|
29
|
+
* `undefined` for a non-positive or unparsable IMF. Lighter declares the
|
|
30
|
+
* fraction a `StrictInt`, so the scale division is exact.
|
|
31
|
+
*/
|
|
32
|
+
export const leverageFromScaledImf = (imf) => {
|
|
33
|
+
let percent;
|
|
34
|
+
try {
|
|
35
|
+
percent = new Big(imf).div(LIGHTER_IMF_PERCENT_SCALE).toFixed();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return leverageFromImf(percent);
|
|
41
|
+
};
|
|
25
42
|
/**
|
|
26
43
|
* Map a raw Lighter account position to the generic Position type.
|
|
27
44
|
* @param market - Backend-resolved market identity for `pos.market_id`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,GAAG,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ohlcvInterval.d.ts","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"ohlcvInterval.d.ts","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAuBtD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,UAAU,aAAa,KAAG,MAUrD,CAAA"}
|
|
@@ -3,9 +3,11 @@ import { PerpsErrorCode } from '@lifi/perps-types';
|
|
|
3
3
|
/**
|
|
4
4
|
* Map our `OhlcvInterval` literal to Lighter's `resolution` enum.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* The keys are exactly the `resolution` enum of Lighter's `GET /api/v1/candles`.
|
|
7
|
+
* Lighter has no weekly candle (its API answers `1w` with code 20001,
|
|
8
|
+
* `invalid param`), so `1w` stays out. SDK intervals without a direct match
|
|
9
|
+
* (3m, 2h, 8h, 3d, 1w, 1M) raise a validation error rather than silently
|
|
10
|
+
* rounding — the caller picks a supported timeframe.
|
|
9
11
|
*/
|
|
10
12
|
const LIGHTER_SUPPORTED_INTERVALS = {
|
|
11
13
|
'1m': '1m',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ohlcvInterval.js","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD
|
|
1
|
+
{"version":3,"file":"ohlcvInterval.js","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;;;;;GAQG;AACH,MAAM,2BAA2B,GAA2C;IAC1E,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;CACX,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAuB,EAAU,EAAE;IAC7D,MAAM,UAAU,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,4CAA4C,QAAQ,KAAK;YACvD,cAAc,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvE,CAAA;IACH,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Market, MarketContext } from '@lifi/perps-types';
|
|
2
|
-
import
|
|
2
|
+
import Big from 'big.js';
|
|
3
3
|
/**
|
|
4
4
|
* Unit prices keyed by spot base `Asset.id` (the venue `asset_id`), read from
|
|
5
5
|
* each spot market's `markPrice` for the base assets in `assetIds` only. A
|
|
@@ -11,4 +11,13 @@ import type Big from 'big.js';
|
|
|
11
11
|
* carries a non-decimal mark.
|
|
12
12
|
*/
|
|
13
13
|
export declare const spotPriceByAssetId: (markets: readonly Market[], spotCategoryId: string, contexts: readonly MarketContext[], assetIds: ReadonlySet<string>) => Map<string, Big>;
|
|
14
|
+
/**
|
|
15
|
+
* USD value of `units` of a Lighter asset, with the unit price it used: the
|
|
16
|
+
* settlement asset at 1, any other at its `spotPrices` entry. An asset absent
|
|
17
|
+
* from `spotPrices` values at 0 and carries no price.
|
|
18
|
+
*/
|
|
19
|
+
export declare const spotValuation: (assetId: number, units: string, settlementAssetIndex: number, spotPrices: ReadonlyMap<string, Big>) => {
|
|
20
|
+
valueUsd: string;
|
|
21
|
+
price?: Big;
|
|
22
|
+
};
|
|
14
23
|
//# sourceMappingURL=spotPrice.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotPrice.d.ts","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"spotPrice.d.ts","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,GAAG,MAAM,QAAQ,CAAA;AAGxB;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,SAAS,MAAM,EAAE,EAC1B,gBAAgB,MAAM,EACtB,UAAU,SAAS,aAAa,EAAE,EAClC,UAAU,WAAW,CAAC,MAAM,CAAC,KAC5B,GAAG,CAAC,MAAM,EAAE,GAAG,CAmBjB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,MAAM,EACf,OAAO,MAAM,EACb,sBAAsB,MAAM,EAC5B,YAAY,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,KACnC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAQjC,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import Big from 'big.js';
|
|
1
2
|
import { toRequiredBig } from './decimal.js';
|
|
2
3
|
/**
|
|
3
4
|
* Unit prices keyed by spot base `Asset.id` (the venue `asset_id`), read from
|
|
@@ -27,4 +28,17 @@ export const spotPriceByAssetId = (markets, spotCategoryId, contexts, assetIds)
|
|
|
27
28
|
}
|
|
28
29
|
return priceByAssetId;
|
|
29
30
|
};
|
|
31
|
+
/**
|
|
32
|
+
* USD value of `units` of a Lighter asset, with the unit price it used: the
|
|
33
|
+
* settlement asset at 1, any other at its `spotPrices` entry. An asset absent
|
|
34
|
+
* from `spotPrices` values at 0 and carries no price.
|
|
35
|
+
*/
|
|
36
|
+
export const spotValuation = (assetId, units, settlementAssetIndex, spotPrices) => {
|
|
37
|
+
const price = assetId === settlementAssetIndex
|
|
38
|
+
? new Big(1)
|
|
39
|
+
: spotPrices.get(String(assetId));
|
|
40
|
+
return price === undefined
|
|
41
|
+
? { valueUsd: '0' }
|
|
42
|
+
: { valueUsd: new Big(units).times(price).toFixed(), price };
|
|
43
|
+
};
|
|
30
44
|
//# sourceMappingURL=spotPrice.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotPrice.js","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spotPrice.js","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAA0B,EAC1B,cAAsB,EACtB,QAAkC,EAClC,QAA6B,EACX,EAAE;IACpB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAe,CAAA;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC1C,IACE,MAAM,CAAC,UAAU,KAAK,cAAc;YACpC,IAAI,KAAK,SAAS;YAClB,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EACvC,CAAC;YACD,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAC9C,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAe,EACf,KAAa,EACb,oBAA4B,EAC5B,UAAoC,EACD,EAAE;IACrC,MAAM,KAAK,GACT,OAAO,KAAK,oBAAoB;QAC9B,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IACrC,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;QACnB,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAA;AAChE,CAAC,CAAA"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import type {
|
|
1
|
+
import { type ProviderWithdrawableBalance } from '@lifi/perps-sdk';
|
|
2
|
+
import type { LtAccount } from '../types/account.js';
|
|
3
3
|
/**
|
|
4
4
|
* Split each held asset into the two routes a Lighter withdrawal can name:
|
|
5
5
|
* spot draws on `balance` net of `locked_balance`, perps draws on
|
|
6
|
-
* `margin_balance`.
|
|
7
|
-
*
|
|
6
|
+
* `margin_balance`. The settlement asset's perps route is also capped by the
|
|
7
|
+
* account `available_balance`, which excludes the margin open positions use.
|
|
8
|
+
* Every other asset's perps route reports its full `margin_balance`, uncapped,
|
|
9
|
+
* although `getAccount` reports `transferable: '0'` for it: a category
|
|
10
|
+
* transfer moves only the settlement asset. Routes with nothing left to draw
|
|
11
|
+
* are dropped; the per-asset venue minimum is applied by the caller holding
|
|
12
|
+
* the asset registry.
|
|
8
13
|
*
|
|
14
|
+
* @param settlementAssetIndex - L2 asset index of the deployment's collateral
|
|
15
|
+
* asset, the only asset that `available_balance` is denominated in.
|
|
9
16
|
* @public
|
|
10
17
|
*/
|
|
11
|
-
export declare const lighterWithdrawableBalances: (assets:
|
|
18
|
+
export declare const lighterWithdrawableBalances: (account: Pick<LtAccount, "assets" | "available_balance">, settlementAssetIndex: number) => ProviderWithdrawableBalance[];
|
|
12
19
|
//# sourceMappingURL=withdrawableBalances.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAEhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,mBAAmB,CAAC,EACxD,sBAAsB,MAAM,KAC3B,2BAA2B,EA0B7B,CAAA"}
|
|
@@ -1,21 +1,33 @@
|
|
|
1
|
+
import { maxOf, minOf } from '@lifi/perps-sdk';
|
|
2
|
+
import Big from 'big.js';
|
|
1
3
|
import { toRequiredBig } from './decimal.js';
|
|
2
4
|
/**
|
|
3
5
|
* Split each held asset into the two routes a Lighter withdrawal can name:
|
|
4
6
|
* spot draws on `balance` net of `locked_balance`, perps draws on
|
|
5
|
-
* `margin_balance`.
|
|
6
|
-
*
|
|
7
|
+
* `margin_balance`. The settlement asset's perps route is also capped by the
|
|
8
|
+
* account `available_balance`, which excludes the margin open positions use.
|
|
9
|
+
* Every other asset's perps route reports its full `margin_balance`, uncapped,
|
|
10
|
+
* although `getAccount` reports `transferable: '0'` for it: a category
|
|
11
|
+
* transfer moves only the settlement asset. Routes with nothing left to draw
|
|
12
|
+
* are dropped; the per-asset venue minimum is applied by the caller holding
|
|
13
|
+
* the asset registry.
|
|
7
14
|
*
|
|
15
|
+
* @param settlementAssetIndex - L2 asset index of the deployment's collateral
|
|
16
|
+
* asset, the only asset that `available_balance` is denominated in.
|
|
8
17
|
* @public
|
|
9
18
|
*/
|
|
10
|
-
export const lighterWithdrawableBalances = (
|
|
19
|
+
export const lighterWithdrawableBalances = (account, settlementAssetIndex) => {
|
|
11
20
|
const rows = [];
|
|
12
|
-
for (const asset of assets) {
|
|
21
|
+
for (const asset of account.assets) {
|
|
13
22
|
const assetId = String(asset.asset_id);
|
|
14
23
|
const spot = toRequiredBig(asset.balance, 'balance').minus(toRequiredBig(asset.locked_balance, 'locked_balance'));
|
|
15
24
|
if (spot.gt(0)) {
|
|
16
25
|
rows.push({ assetId, route: 'spot', available: spot.toFixed() });
|
|
17
26
|
}
|
|
18
|
-
const
|
|
27
|
+
const marginBalance = toRequiredBig(asset.margin_balance, 'margin_balance');
|
|
28
|
+
const perps = asset.asset_id === settlementAssetIndex
|
|
29
|
+
? minOf(maxOf(toRequiredBig(account.available_balance, 'available_balance'), new Big(0)), marginBalance)
|
|
30
|
+
: marginBalance;
|
|
19
31
|
if (perps.gt(0)) {
|
|
20
32
|
rows.push({ assetId, route: 'perps', available: perps.toFixed() });
|
|
21
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAoC,MAAM,iBAAiB,CAAA;AAChF,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAwD,EACxD,oBAA4B,EACG,EAAE;IACjC,MAAM,IAAI,GAAkC,EAAE,CAAA;IAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,CACxD,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CACtD,CAAA;QACD,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;QAC3E,MAAM,KAAK,GACT,KAAK,CAAC,QAAQ,KAAK,oBAAoB;YACrC,CAAC,CAAC,KAAK,CACH,KAAK,CACH,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,EAC7D,IAAI,GAAG,CAAC,CAAC,CAAC,CACX,EACD,aAAa,CACd;YACH,CAAC,CAAC,aAAa,CAAA;QACnB,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -59,6 +59,7 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
|
|
|
59
59
|
* is a full open-position snapshot per the `PositionsEvent` contract.
|
|
60
60
|
*/
|
|
61
61
|
private readonly positionsByAddress;
|
|
62
|
+
private readonly accountSummaryInputs;
|
|
62
63
|
private readonly registry;
|
|
63
64
|
private readonly accountIndexCache;
|
|
64
65
|
private readonly accountIndexPromises;
|
|
@@ -77,6 +78,12 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
|
|
|
77
78
|
*/
|
|
78
79
|
subscribeQuote(params: ProviderGetQuoteParams, onQuote: QuoteListener): Promise<() => void>;
|
|
79
80
|
protected openChannel(sub: Subscription): Promise<() => void>;
|
|
81
|
+
/**
|
|
82
|
+
* Hold a `marketsContext` subscription for the spot marks that price the
|
|
83
|
+
* account's spot balances. The ref-counted base shares the wire channels
|
|
84
|
+
* with any consumer `marketsContext` subscription.
|
|
85
|
+
*/
|
|
86
|
+
private subscribeSpotMarks;
|
|
80
87
|
protected onClose(): void;
|
|
81
88
|
protected sendSubscribe({ channel, needsAuth, address, }: SubState): Promise<void>;
|
|
82
89
|
/**
|
|
@@ -87,6 +94,8 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
|
|
|
87
94
|
* code, as it does for the Ondo and Lighter REST auth failures.
|
|
88
95
|
*/
|
|
89
96
|
private requireAuthToken;
|
|
97
|
+
/** Whether a token resolves for the address; a resolver that throws counts as no token. */
|
|
98
|
+
private canResolveAuthToken;
|
|
90
99
|
protected toKey(sub: Subscription): string;
|
|
91
100
|
private resolveChannel;
|
|
92
101
|
private resolveAccountIndex;
|
|
@@ -95,6 +104,21 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
|
|
|
95
104
|
private dispatch;
|
|
96
105
|
private handleAccountOrders;
|
|
97
106
|
private handleUserStats;
|
|
107
|
+
/**
|
|
108
|
+
* Replace the spot balances on a `subscribed/` frame and upsert them on an
|
|
109
|
+
* `update/` frame. An update before the first snapshot is dropped, so the
|
|
110
|
+
* map never holds a partial set. Balances parse here, so a non-decimal
|
|
111
|
+
* balance rejects its frame and never reaches the emit path.
|
|
112
|
+
*/
|
|
113
|
+
private handleAccountAll;
|
|
114
|
+
/**
|
|
115
|
+
* Emit the account summary once both the `user_stats` figures and the spot
|
|
116
|
+
* balances are in. `portfolioValue` values the spot balances as REST
|
|
117
|
+
* `getAccount` does. `onlyOnChange` skips an emit whose `portfolioValue`
|
|
118
|
+
* equals the last one, so a mark tick on an unrelated market emits nothing.
|
|
119
|
+
*/
|
|
120
|
+
private emitAccountSummary;
|
|
121
|
+
private settlementAssetIndex;
|
|
98
122
|
private handleAccountTrades;
|
|
99
123
|
private handleAccountPositions;
|
|
100
124
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LighterWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/LighterWsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAKlB,cAAc,EACd,KAAK,iBAAiB,EAGvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"LighterWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/LighterWsProvider.ts"],"names":[],"mappings":"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"}
|