@lifi/perps-sdk-provider-lighter 35.1.0 → 37.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 +99 -58
- package/dist/cjs/LighterProvider.js.map +1 -1
- package/dist/cjs/accountSummary.d.ts +1 -2
- package/dist/cjs/accountSummary.d.ts.map +1 -1
- package/dist/cjs/accountSummary.js +16 -16
- package/dist/cjs/accountSummary.js.map +1 -1
- package/dist/cjs/availableToTrade.d.ts +1 -2
- package/dist/cjs/availableToTrade.d.ts.map +1 -1
- package/dist/cjs/availableToTrade.js +8 -12
- package/dist/cjs/availableToTrade.js.map +1 -1
- package/dist/cjs/signers/LighterSigner.d.ts.map +1 -1
- package/dist/cjs/signers/LighterSigner.js +2 -6
- package/dist/cjs/signers/LighterSigner.js.map +1 -1
- package/dist/cjs/types/submit.d.ts +5 -0
- package/dist/cjs/types/submit.d.ts.map +1 -1
- package/dist/cjs/utils/index.d.ts +4 -4
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +5 -8
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/mapFill.d.ts +1 -1
- package/dist/cjs/utils/mapFill.d.ts.map +1 -1
- package/dist/cjs/utils/mapFill.js +44 -31
- package/dist/cjs/utils/mapFill.js.map +1 -1
- package/dist/cjs/utils/mapOpenPositions.d.ts +1 -0
- package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/cjs/utils/mapOpenPositions.js +8 -4
- package/dist/cjs/utils/mapOpenPositions.js.map +1 -1
- package/dist/cjs/utils/mapOrder.d.ts +1 -1
- package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
- package/dist/cjs/utils/mapOrder.js +44 -23
- package/dist/cjs/utils/mapOrder.js.map +1 -1
- package/dist/cjs/utils/mapPortfolioHistory.d.ts +1 -2
- package/dist/cjs/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/cjs/utils/mapPortfolioHistory.js +29 -21
- package/dist/cjs/utils/mapPortfolioHistory.js.map +1 -1
- package/dist/cjs/utils/mapPosition.d.ts +3 -3
- package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
- package/dist/cjs/utils/mapPosition.js +54 -39
- package/dist/cjs/utils/mapPosition.js.map +1 -1
- package/dist/cjs/utils/rowTimestamp.d.ts +2 -0
- package/dist/cjs/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/cjs/utils/rowTimestamp.js +14 -0
- package/dist/cjs/utils/rowTimestamp.js.map +1 -0
- package/dist/cjs/utils/settlementPool.d.ts +2 -3
- package/dist/cjs/utils/settlementPool.d.ts.map +1 -1
- package/dist/cjs/utils/settlementPool.js +8 -7
- package/dist/cjs/utils/settlementPool.js.map +1 -1
- package/dist/cjs/utils/spotPrice.d.ts +3 -4
- package/dist/cjs/utils/spotPrice.d.ts.map +1 -1
- package/dist/cjs/utils/spotPrice.js +6 -11
- package/dist/cjs/utils/spotPrice.js.map +1 -1
- package/dist/cjs/utils/time.d.ts.map +1 -1
- package/dist/cjs/utils/time.js +3 -2
- package/dist/cjs/utils/time.js.map +1 -1
- package/dist/cjs/utils/transferMargin.d.ts.map +1 -1
- package/dist/cjs/utils/transferMargin.js +8 -11
- package/dist/cjs/utils/transferMargin.js.map +1 -1
- package/dist/cjs/utils/wireEncoding.d.ts +0 -2
- package/dist/cjs/utils/wireEncoding.d.ts.map +1 -1
- package/dist/cjs/utils/wireEncoding.js +1 -15
- package/dist/cjs/utils/wireEncoding.js.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.js +12 -17
- package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
- package/dist/cjs/utils/withdrawalTypes.d.ts +17 -0
- package/dist/cjs/utils/withdrawalTypes.d.ts.map +1 -0
- package/dist/cjs/utils/withdrawalTypes.js +58 -0
- package/dist/cjs/utils/withdrawalTypes.js.map +1 -0
- package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/cjs/websocket/LighterWsProvider.js +74 -66
- package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
- package/dist/cjs/websocket/orderBookSide.d.ts +20 -0
- package/dist/cjs/websocket/orderBookSide.d.ts.map +1 -0
- package/dist/cjs/websocket/orderBookSide.js +73 -0
- package/dist/cjs/websocket/orderBookSide.js.map +1 -0
- package/dist/esm/LighterProvider.d.ts.map +1 -1
- package/dist/esm/LighterProvider.js +113 -62
- package/dist/esm/LighterProvider.js.map +1 -1
- package/dist/esm/accountSummary.d.ts +1 -2
- package/dist/esm/accountSummary.d.ts.map +1 -1
- package/dist/esm/accountSummary.js +17 -14
- package/dist/esm/accountSummary.js.map +1 -1
- package/dist/esm/availableToTrade.d.ts +1 -2
- package/dist/esm/availableToTrade.d.ts.map +1 -1
- package/dist/esm/availableToTrade.js +9 -10
- package/dist/esm/availableToTrade.js.map +1 -1
- package/dist/esm/signers/LighterSigner.d.ts.map +1 -1
- package/dist/esm/signers/LighterSigner.js +3 -4
- package/dist/esm/signers/LighterSigner.js.map +1 -1
- package/dist/esm/types/submit.d.ts +14 -0
- package/dist/esm/types/submit.d.ts.map +1 -1
- package/dist/esm/utils/index.d.ts +4 -4
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +3 -4
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/mapFill.d.ts +1 -1
- package/dist/esm/utils/mapFill.d.ts.map +1 -1
- package/dist/esm/utils/mapFill.js +51 -35
- package/dist/esm/utils/mapFill.js.map +1 -1
- package/dist/esm/utils/mapOpenPositions.d.ts +9 -2
- package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/esm/utils/mapOpenPositions.js +14 -5
- package/dist/esm/utils/mapOpenPositions.js.map +1 -1
- package/dist/esm/utils/mapOrder.d.ts +10 -3
- package/dist/esm/utils/mapOrder.d.ts.map +1 -1
- package/dist/esm/utils/mapOrder.js +54 -23
- package/dist/esm/utils/mapOrder.js.map +1 -1
- package/dist/esm/utils/mapPortfolioHistory.d.ts +6 -3
- package/dist/esm/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/esm/utils/mapPortfolioHistory.js +34 -19
- package/dist/esm/utils/mapPortfolioHistory.js.map +1 -1
- package/dist/esm/utils/mapPosition.d.ts +13 -9
- package/dist/esm/utils/mapPosition.d.ts.map +1 -1
- package/dist/esm/utils/mapPosition.js +65 -43
- package/dist/esm/utils/mapPosition.js.map +1 -1
- package/dist/esm/utils/rowTimestamp.d.ts +6 -0
- package/dist/esm/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/esm/utils/rowTimestamp.js +14 -0
- package/dist/esm/utils/rowTimestamp.js.map +1 -0
- package/dist/esm/utils/settlementPool.d.ts +2 -3
- package/dist/esm/utils/settlementPool.d.ts.map +1 -1
- package/dist/esm/utils/settlementPool.js +8 -7
- package/dist/esm/utils/settlementPool.js.map +1 -1
- package/dist/esm/utils/spotPrice.d.ts +3 -4
- package/dist/esm/utils/spotPrice.d.ts.map +1 -1
- package/dist/esm/utils/spotPrice.js +6 -8
- package/dist/esm/utils/spotPrice.js.map +1 -1
- package/dist/esm/utils/time.d.ts +10 -2
- package/dist/esm/utils/time.d.ts.map +1 -1
- package/dist/esm/utils/time.js +13 -4
- package/dist/esm/utils/time.js.map +1 -1
- package/dist/esm/utils/transferMargin.d.ts.map +1 -1
- package/dist/esm/utils/transferMargin.js +9 -9
- package/dist/esm/utils/transferMargin.js.map +1 -1
- package/dist/esm/utils/wireEncoding.d.ts +2 -28
- package/dist/esm/utils/wireEncoding.d.ts.map +1 -1
- package/dist/esm/utils/wireEncoding.js +2 -38
- package/dist/esm/utils/wireEncoding.js.map +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts +5 -3
- package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/esm/utils/withdrawableBalances.js +17 -17
- package/dist/esm/utils/withdrawableBalances.js.map +1 -1
- package/dist/esm/utils/withdrawalTypes.d.ts +45 -0
- package/dist/esm/utils/withdrawalTypes.d.ts.map +1 -0
- package/dist/esm/utils/withdrawalTypes.js +68 -0
- package/dist/esm/utils/withdrawalTypes.js.map +1 -0
- package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/LighterWsProvider.js +85 -65
- package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
- package/dist/esm/websocket/orderBookSide.d.ts +34 -0
- package/dist/esm/websocket/orderBookSide.d.ts.map +1 -0
- package/dist/esm/websocket/orderBookSide.js +78 -0
- package/dist/esm/websocket/orderBookSide.js.map +1 -0
- package/dist/types/LighterProvider.d.ts.map +1 -1
- package/dist/types/accountSummary.d.ts +1 -2
- package/dist/types/accountSummary.d.ts.map +1 -1
- package/dist/types/availableToTrade.d.ts +1 -2
- package/dist/types/availableToTrade.d.ts.map +1 -1
- package/dist/types/signers/LighterSigner.d.ts.map +1 -1
- package/dist/types/types/submit.d.ts +14 -0
- package/dist/types/types/submit.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +4 -4
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/mapFill.d.ts +1 -1
- package/dist/types/utils/mapFill.d.ts.map +1 -1
- package/dist/types/utils/mapOpenPositions.d.ts +9 -2
- package/dist/types/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/types/utils/mapOrder.d.ts +10 -3
- package/dist/types/utils/mapOrder.d.ts.map +1 -1
- package/dist/types/utils/mapPortfolioHistory.d.ts +6 -3
- package/dist/types/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/types/utils/mapPosition.d.ts +13 -9
- package/dist/types/utils/mapPosition.d.ts.map +1 -1
- package/dist/types/utils/rowTimestamp.d.ts +6 -0
- package/dist/types/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/types/utils/settlementPool.d.ts +2 -3
- package/dist/types/utils/settlementPool.d.ts.map +1 -1
- package/dist/types/utils/spotPrice.d.ts +3 -4
- package/dist/types/utils/spotPrice.d.ts.map +1 -1
- package/dist/types/utils/time.d.ts +10 -2
- package/dist/types/utils/time.d.ts.map +1 -1
- package/dist/types/utils/transferMargin.d.ts.map +1 -1
- package/dist/types/utils/wireEncoding.d.ts +2 -28
- package/dist/types/utils/wireEncoding.d.ts.map +1 -1
- package/dist/types/utils/withdrawableBalances.d.ts +5 -3
- package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/types/utils/withdrawalTypes.d.ts +45 -0
- package/dist/types/utils/withdrawalTypes.d.ts.map +1 -0
- package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/types/websocket/orderBookSide.d.ts +34 -0
- package/dist/types/websocket/orderBookSide.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/LighterProvider.ts +231 -97
- package/src/accountSummary.ts +62 -22
- package/src/availableToTrade.ts +38 -15
- package/src/signers/LighterSigner.ts +11 -4
- package/src/types/submit.ts +15 -0
- package/src/utils/index.ts +9 -5
- package/src/utils/mapFill.ts +82 -43
- package/src/utils/mapOpenPositions.ts +16 -5
- package/src/utils/mapOrder.ts +76 -26
- package/src/utils/mapPortfolioHistory.ts +78 -24
- package/src/utils/mapPosition.ts +93 -50
- package/src/utils/rowTimestamp.ts +15 -0
- package/src/utils/settlementPool.ts +36 -12
- package/src/utils/spotPrice.ts +18 -12
- package/src/utils/time.ts +14 -4
- package/src/utils/transferMargin.ts +32 -15
- package/src/utils/wireEncoding.ts +2 -43
- package/src/utils/withdrawableBalances.ts +34 -20
- package/src/utils/withdrawalTypes.ts +125 -0
- package/src/websocket/LighterWsProvider.ts +137 -114
- package/src/websocket/orderBookSide.ts +119 -0
- package/dist/cjs/utils/decimal.d.ts +0 -5
- package/dist/cjs/utils/decimal.d.ts.map +0 -1
- package/dist/cjs/utils/decimal.js +0 -38
- package/dist/cjs/utils/decimal.js.map +0 -1
- package/dist/cjs/utils/liquidation.d.ts +0 -4
- package/dist/cjs/utils/liquidation.d.ts.map +0 -1
- package/dist/cjs/utils/liquidation.js +0 -16
- package/dist/cjs/utils/liquidation.js.map +0 -1
- package/dist/esm/utils/decimal.d.ts +0 -15
- package/dist/esm/utils/decimal.d.ts.map +0 -1
- package/dist/esm/utils/decimal.js +0 -39
- package/dist/esm/utils/decimal.js.map +0 -1
- package/dist/esm/utils/liquidation.d.ts +0 -22
- package/dist/esm/utils/liquidation.d.ts.map +0 -1
- package/dist/esm/utils/liquidation.js +0 -31
- package/dist/esm/utils/liquidation.js.map +0 -1
- package/dist/types/utils/decimal.d.ts +0 -15
- package/dist/types/utils/decimal.d.ts.map +0 -1
- package/dist/types/utils/liquidation.d.ts +0 -22
- package/dist/types/utils/liquidation.d.ts.map +0 -1
- package/src/utils/decimal.ts +0 -52
- package/src/utils/liquidation.ts +0 -39
|
@@ -6,5 +6,5 @@ import type { LtTrade } from '../types/index.js';
|
|
|
6
6
|
* @param market - Backend-resolved market identity for `trade.market_id`.
|
|
7
7
|
* @public
|
|
8
8
|
*/
|
|
9
|
-
export declare const mapFill: (trade: LtTrade, accountIndex: number, market: MarketDisplay) => Fill;
|
|
9
|
+
export declare const mapFill: (trade: LtTrade, accountIndex: number, market: MarketDisplay) => Fill | undefined;
|
|
10
10
|
//# sourceMappingURL=mapFill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapFill.d.ts","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapFill.d.ts","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAG5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AA+FhD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAClB,OAAO,OAAO,EACd,cAAc,MAAM,EACpB,QAAQ,aAAa,KACpB,IAAI,GAAG,SAwET,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { classifyFillFromPosition, ExplorerChainId, explorerTxUrl, } from '@lifi/perps-sdk';
|
|
1
|
+
import { absDecimalString, calculateRealizedPnl, classifyFillFromPosition, divideDecimalString, ExplorerChainId, explorerTxUrl, isDecimalString, isDecimalStringGreaterThan, isDecimalStringZero, safeAddDecimalString, safeDivideDecimalString, safeMultiplyDecimalString, warnSkippedVenueRow, } from '@lifi/perps-sdk';
|
|
2
2
|
import { LiquidityRole, OrderSide, OrderType } from '@lifi/perps-types';
|
|
3
|
-
import
|
|
4
|
-
import { LIGHTER_FEE_TICK_SCALE } from '../constants.js';
|
|
3
|
+
import { LIGHTER_FEE_TICK_SCALE, LIGHTER_PROVIDER_KEY } from '../constants.js';
|
|
5
4
|
import { leverageFromScaledImf } from './mapPosition.js';
|
|
5
|
+
import { rowTimestampToIsoStringOrUndefined } from './rowTimestamp.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
|
|
@@ -13,12 +13,21 @@ import { isPlaceholderTxHash } from './txHash.js';
|
|
|
13
13
|
* The product keeps the sign of both inputs. A rebate tick therefore maps to a
|
|
14
14
|
* negative amount, which `Fee.amount` permits and the Ondo mapper already emits
|
|
15
15
|
* when a rebate exceeds the fee, so this helper never clamps the sign. A zero
|
|
16
|
-
* notional charges a zero fee at every tick.
|
|
16
|
+
* notional charges a zero fee at every tick. A malformed notional gives
|
|
17
|
+
* `undefined`.
|
|
17
18
|
*/
|
|
18
|
-
const tickToFeeAmount = (notional, ownTick, integratorTick) =>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
const tickToFeeAmount = (notional, ownTick, integratorTick) => {
|
|
20
|
+
if (!isDecimalString(notional)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const tickSum = safeAddDecimalString(String(ownTick), String(integratorTick ?? 0));
|
|
24
|
+
const scaledFee = tickSum === undefined
|
|
25
|
+
? undefined
|
|
26
|
+
: safeMultiplyDecimalString(notional, tickSum);
|
|
27
|
+
return scaledFee === undefined
|
|
28
|
+
? undefined
|
|
29
|
+
: safeDivideDecimalString(scaledFee, String(LIGHTER_FEE_TICK_SCALE));
|
|
30
|
+
};
|
|
22
31
|
/**
|
|
23
32
|
* Display leverage the viewer had set on the market when the trade executed,
|
|
24
33
|
* from the pre-trade initial margin fraction. Returns `undefined` when the
|
|
@@ -28,33 +37,36 @@ const leverageFromTradeImf = (imf) => imf === undefined ? undefined : leverageFr
|
|
|
28
37
|
/**
|
|
29
38
|
* Realized PnL on a position-reducing fill, derived from the pre-trade entry
|
|
30
39
|
* basis. Returns `undefined` for opens/increases (nothing closes) or when the
|
|
31
|
-
* entry-quote snapshot is absent, and `null` when the
|
|
32
|
-
* exactly zero — mirroring the Hyperliquid mapper's
|
|
40
|
+
* entry-quote snapshot is absent or an input is malformed, and `null` when the
|
|
41
|
+
* closed portion realizes exactly zero — mirroring the Hyperliquid mapper's
|
|
42
|
+
* `null`-for-zero convention.
|
|
33
43
|
*/
|
|
34
44
|
const deriveRealizedPnl = (startPosition, entryQuoteBefore, fillSize, fillPrice, isBuyer) => {
|
|
35
|
-
if (entryQuoteBefore === undefined
|
|
45
|
+
if (entryQuoteBefore === undefined ||
|
|
46
|
+
![startPosition, entryQuoteBefore, fillSize, fillPrice].every(isDecimalString)) {
|
|
36
47
|
return undefined;
|
|
37
48
|
}
|
|
38
|
-
|
|
39
|
-
if (start.eq(0)) {
|
|
49
|
+
if (isDecimalStringZero(startPosition)) {
|
|
40
50
|
return undefined;
|
|
41
51
|
}
|
|
42
|
-
const isLong =
|
|
52
|
+
const isLong = isDecimalStringGreaterThan(startPosition, '0');
|
|
43
53
|
const reducing = isLong ? !isBuyer : isBuyer;
|
|
44
54
|
if (!reducing) {
|
|
45
55
|
return undefined;
|
|
46
56
|
}
|
|
47
|
-
const absStart =
|
|
48
|
-
const fill = new Big(fillSize);
|
|
57
|
+
const absStart = absDecimalString(startPosition);
|
|
49
58
|
// A fill larger than the open size flips the position; only the portion that
|
|
50
59
|
// unwinds the existing position realizes PnL.
|
|
51
|
-
const closedSize =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const pnl =
|
|
55
|
-
|
|
56
|
-
:
|
|
57
|
-
|
|
60
|
+
const closedSize = isDecimalStringGreaterThan(fillSize, absStart)
|
|
61
|
+
? absStart
|
|
62
|
+
: fillSize;
|
|
63
|
+
const pnl = calculateRealizedPnl({
|
|
64
|
+
entryPrice: divideDecimalString(absDecimalString(entryQuoteBefore), absStart),
|
|
65
|
+
closePrice: fillPrice,
|
|
66
|
+
closeSize: closedSize,
|
|
67
|
+
isLong,
|
|
68
|
+
});
|
|
69
|
+
return isDecimalStringZero(pnl) ? null : pnl;
|
|
58
70
|
};
|
|
59
71
|
/**
|
|
60
72
|
* Map a raw Lighter trade to the generic Fill type.
|
|
@@ -63,6 +75,12 @@ const deriveRealizedPnl = (startPosition, entryQuoteBefore, fillSize, fillPrice,
|
|
|
63
75
|
* @public
|
|
64
76
|
*/
|
|
65
77
|
export const mapFill = (trade, accountIndex, market) => {
|
|
78
|
+
const { size, price } = trade;
|
|
79
|
+
const createdAt = rowTimestampToIsoStringOrUndefined(trade.timestamp);
|
|
80
|
+
if (createdAt === undefined) {
|
|
81
|
+
warnSkippedVenueRow(LIGHTER_PROVIDER_KEY, 'fill', 'timestamp', trade.timestamp, { marketId: market.id, expected: 'timestamp' });
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
66
84
|
const isBuyer = trade.bid_account_id === accountIndex;
|
|
67
85
|
const isMaker = (trade.is_maker_ask && !isBuyer) || (!trade.is_maker_ask && isBuyer);
|
|
68
86
|
// Lighter publishes both counterparties' position-before snapshots on every
|
|
@@ -81,29 +99,27 @@ export const mapFill = (trade, accountIndex, market) => {
|
|
|
81
99
|
const imfBefore = isMaker
|
|
82
100
|
? trade.maker_initial_margin_fraction_before
|
|
83
101
|
: trade.taker_initial_margin_fraction_before;
|
|
102
|
+
const feeAmount = feeTick === undefined
|
|
103
|
+
? undefined
|
|
104
|
+
: tickToFeeAmount(trade.usd_amount, feeTick, integratorFeeTick);
|
|
84
105
|
return {
|
|
85
106
|
id: trade.trade_id.toString(),
|
|
86
107
|
orderId: String(isBuyer ? trade.bid_id : trade.ask_id),
|
|
87
108
|
market,
|
|
88
109
|
side: isBuyer ? OrderSide.BUY : OrderSide.SELL,
|
|
89
110
|
type: OrderType.LIMIT,
|
|
90
|
-
size
|
|
91
|
-
price
|
|
111
|
+
size,
|
|
112
|
+
price,
|
|
92
113
|
liquidity: isMaker ? LiquidityRole.MAKER : LiquidityRole.TAKER,
|
|
93
114
|
// Lighter charges the fill fee in the market's quote asset.
|
|
94
|
-
fee:
|
|
115
|
+
fee: feeAmount === undefined
|
|
95
116
|
? undefined
|
|
96
|
-
: {
|
|
97
|
-
amount: tickToFeeAmount(trade.usd_amount, feeTick, integratorFeeTick),
|
|
98
|
-
asset: market.quoteAsset.displaySymbol,
|
|
99
|
-
},
|
|
117
|
+
: { amount: feeAmount, asset: market.quoteAsset.displaySymbol },
|
|
100
118
|
leverage: leverageFromTradeImf(imfBefore),
|
|
101
|
-
realizedPnl: deriveRealizedPnl(startPosition, entryQuoteBefore,
|
|
119
|
+
realizedPnl: deriveRealizedPnl(startPosition, entryQuoteBefore, size, price, isBuyer),
|
|
102
120
|
startPosition,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
classification: classifyFillFromPosition(startPosition, isBuyer ? 'B' : 'A', trade.size),
|
|
106
|
-
createdAt: new Date(trade.timestamp).toISOString(),
|
|
121
|
+
classification: classifyFillFromPosition(startPosition, isBuyer ? OrderSide.BUY : OrderSide.SELL, size),
|
|
122
|
+
createdAt,
|
|
107
123
|
explorerLink: isPlaceholderTxHash(trade.tx_hash)
|
|
108
124
|
? undefined
|
|
109
125
|
: explorerTxUrl(ExplorerChainId.LIGHTER, trade.tx_hash),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapFill.js","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,aAAa,
|
|
1
|
+
{"version":3,"file":"mapFill.js","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { PerpsMarketDisplay, Position } from '@lifi/perps-types';
|
|
2
2
|
import type { LtAccountPosition } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* True when the Lighter position row has a non-zero size. A malformed size
|
|
5
|
+
* keeps the row.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export declare const isOpenPosition: (p: LtAccountPosition) => boolean;
|
|
3
9
|
/**
|
|
4
10
|
* Map raw Lighter account positions to open {@link Position}s, dropping
|
|
5
|
-
* zero-size rows. Only valid for payloads
|
|
6
|
-
* dropping zeros from a partial frame would
|
|
11
|
+
* zero-size rows and rows that `mapPosition` skips. Only valid for payloads
|
|
12
|
+
* carrying the full position set — dropping zeros from a partial frame would
|
|
13
|
+
* make closes unobservable.
|
|
7
14
|
*
|
|
8
15
|
* @public
|
|
9
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapOpenPositions.d.ts","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapOpenPositions.d.ts","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG1D;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,GAAG,iBAAiB,KAAG,OACR,CAAA;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,iBAAiB,EAAE,EAC9B,eAAe,CAAC,QAAQ,EAAE,MAAM,KAAK,kBAAkB,KACtD,QAAQ,EAIP,CAAA"}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
|
+
import { safeIsDecimalStringZero } from '@lifi/perps-sdk';
|
|
1
2
|
import { mapPosition } from './mapPosition.js';
|
|
3
|
+
/**
|
|
4
|
+
* True when the Lighter position row has a non-zero size. A malformed size
|
|
5
|
+
* keeps the row.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export const isOpenPosition = (p) => safeIsDecimalStringZero(p.position) !== true;
|
|
2
9
|
/**
|
|
3
10
|
* Map raw Lighter account positions to open {@link Position}s, dropping
|
|
4
|
-
* zero-size rows. Only valid for payloads
|
|
5
|
-
* dropping zeros from a partial frame would
|
|
11
|
+
* zero-size rows and rows that `mapPosition` skips. Only valid for payloads
|
|
12
|
+
* carrying the full position set — dropping zeros from a partial frame would
|
|
13
|
+
* make closes unobservable.
|
|
6
14
|
*
|
|
7
15
|
* @public
|
|
8
16
|
*/
|
|
9
|
-
export const mapOpenPositions = (positions, resolveMarket) => positions
|
|
10
|
-
|
|
11
|
-
|
|
17
|
+
export const mapOpenPositions = (positions, resolveMarket) => positions.filter(isOpenPosition).flatMap((p) => {
|
|
18
|
+
const position = mapPosition(p, resolveMarket(p.market_id));
|
|
19
|
+
return position === undefined ? [] : [position];
|
|
20
|
+
});
|
|
12
21
|
//# sourceMappingURL=mapOpenPositions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapOpenPositions.js","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapOpenPositions.js","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAoB,EAAW,EAAE,CAC9D,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;AAE9C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,SAA8B,EAC9B,aAAuD,EAC3C,EAAE,CACd,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;IAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IAC3D,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AACjD,CAAC,CAAC,CAAA"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import type { MarketDisplay, Order } from '@lifi/perps-types';
|
|
2
2
|
import type { LtOrder } from '../types/index.js';
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Map a Lighter order with its venue identity, lifecycle, and execution fields.
|
|
5
|
+
* Venue sizes and prices pass verbatim. A row with an invalid time gives
|
|
6
|
+
* `undefined`. An average price that cannot be derived is omitted.
|
|
7
|
+
*/
|
|
8
|
+
export declare const mapOrder: (order: LtOrder, market: MarketDisplay) => Order | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Include terminal rows and their ids so consumers can update history and
|
|
11
|
+
* active caches. A row the mapper rejects is dropped and warns once.
|
|
12
|
+
*/
|
|
6
13
|
export declare const mapOrderUpdates: (rawOrders: LtOrder[], resolveMarket: (marketIndex: number) => MarketDisplay | undefined) => {
|
|
7
14
|
orders: Order[];
|
|
8
15
|
terminated: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapOrder.d.ts","sourceRoot":"","sources":["../../../src/utils/mapOrder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapOrder.d.ts","sourceRoot":"","sources":["../../../src/utils/mapOrder.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAa,MAAM,mBAAmB,CAAA;AASxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AA+FhD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GACnB,OAAO,OAAO,EACd,QAAQ,aAAa,KACpB,KAAK,GAAG,SAwEV,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,OAAO,EAAE,EACpB,eAAe,CAAC,WAAW,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,KAChE;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CA6BzC,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { isActiveOrderStatus, PerpsError, triggerConditionFor, } from '@lifi/perps-sdk';
|
|
1
|
+
import { isActiveOrderStatus, PerpsError, safeDivideDecimalString, safeIsDecimalStringGreaterThan, safeTimestampToIsoString, triggerConditionFor, warnSkippedVenueRow, wsLog, } from '@lifi/perps-sdk';
|
|
2
2
|
import { OrderSide, OrderStatus, OrderType, PerpsErrorCode, TimeInForce, } from '@lifi/perps-types';
|
|
3
|
-
import
|
|
3
|
+
import { LIGHTER_PROVIDER_KEY } from '../constants.js';
|
|
4
|
+
import { rowTimestampToIsoStringOrUndefined } from './rowTimestamp.js';
|
|
4
5
|
const mapOrderType = (type) => {
|
|
5
6
|
switch (type.replace(/-/g, '_')) {
|
|
6
7
|
case 'market':
|
|
@@ -35,7 +36,8 @@ const mapTimeInForce = (tif) => {
|
|
|
35
36
|
throw new PerpsError(PerpsErrorCode.SDKError, `Unknown Lighter time in force: ${tif}`);
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
|
-
const
|
|
39
|
+
const hasFill = (order) => safeIsDecimalStringGreaterThan(order.filled_base_amount, '0') === true;
|
|
40
|
+
const mapOrderStatus = (order) => {
|
|
39
41
|
switch (order.status) {
|
|
40
42
|
case 'in-progress':
|
|
41
43
|
return OrderStatus.ACCEPTED;
|
|
@@ -45,7 +47,7 @@ const mapOrderStatus = (order, filledSize = new Big(order.filled_base_amount)) =
|
|
|
45
47
|
if (order.trigger_status === 'parent-order') {
|
|
46
48
|
return OrderStatus.PENDING;
|
|
47
49
|
}
|
|
48
|
-
return
|
|
50
|
+
return hasFill(order) ? OrderStatus.PARTIALLY_FILLED : OrderStatus.OPEN;
|
|
49
51
|
case 'triggered':
|
|
50
52
|
return OrderStatus.TRIGGERED;
|
|
51
53
|
case 'filled':
|
|
@@ -69,11 +71,32 @@ const mapOrderStatus = (order, filledSize = new Big(order.filled_base_amount)) =
|
|
|
69
71
|
throw new PerpsError(PerpsErrorCode.SDKError, `Unknown Lighter order status: ${order.status}`);
|
|
70
72
|
}
|
|
71
73
|
};
|
|
72
|
-
|
|
74
|
+
const skipOrder = (marketId, field, value) => {
|
|
75
|
+
warnSkippedVenueRow(LIGHTER_PROVIDER_KEY, 'order', field, value, { marketId });
|
|
76
|
+
return undefined;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Map a Lighter order with its venue identity, lifecycle, and execution fields.
|
|
80
|
+
* Venue sizes and prices pass verbatim. A row with an invalid time gives
|
|
81
|
+
* `undefined`. An average price that cannot be derived is omitted.
|
|
82
|
+
*/
|
|
73
83
|
export const mapOrder = (order, market) => {
|
|
74
84
|
const type = mapOrderType(order.type);
|
|
75
|
-
const
|
|
76
|
-
|
|
85
|
+
const createdAt = rowTimestampToIsoStringOrUndefined(order.created_at * 1000);
|
|
86
|
+
if (createdAt === undefined) {
|
|
87
|
+
return skipOrder(market.id, 'created_at', order.created_at);
|
|
88
|
+
}
|
|
89
|
+
const updatedAt = rowTimestampToIsoStringOrUndefined(order.updated_at * 1000);
|
|
90
|
+
if (updatedAt === undefined) {
|
|
91
|
+
return skipOrder(market.id, 'updated_at', order.updated_at);
|
|
92
|
+
}
|
|
93
|
+
const averagePrice = hasFill(order)
|
|
94
|
+
? safeDivideDecimalString(order.filled_quote_amount, order.filled_base_amount)
|
|
95
|
+
: undefined;
|
|
96
|
+
const expiresAt = order.order_expiry > 0
|
|
97
|
+
? safeTimestampToIsoString(order.order_expiry)
|
|
98
|
+
: undefined;
|
|
99
|
+
const status = mapOrderStatus(order);
|
|
77
100
|
const base = {
|
|
78
101
|
orderId: String(order.order_index),
|
|
79
102
|
...(order.client_order_index === 0
|
|
@@ -86,17 +109,11 @@ export const mapOrder = (order, market) => {
|
|
|
86
109
|
originalSize: order.initial_base_amount,
|
|
87
110
|
remainingSize: order.remaining_base_amount,
|
|
88
111
|
filledSize: order.filled_base_amount,
|
|
89
|
-
...(
|
|
90
|
-
? {
|
|
91
|
-
averagePrice: new Big(order.filled_quote_amount)
|
|
92
|
-
.div(filledSize)
|
|
93
|
-
.toFixed(),
|
|
94
|
-
}
|
|
95
|
-
: {}),
|
|
112
|
+
...(averagePrice === undefined ? {} : { averagePrice }),
|
|
96
113
|
reduceOnly: order.reduce_only,
|
|
97
114
|
...(order.parent_order_id ? { parentOrderId: order.parent_order_id } : {}),
|
|
98
|
-
createdAt
|
|
99
|
-
updatedAt
|
|
115
|
+
createdAt,
|
|
116
|
+
updatedAt,
|
|
100
117
|
};
|
|
101
118
|
switch (type) {
|
|
102
119
|
case OrderType.TWAP:
|
|
@@ -109,7 +126,7 @@ export const mapOrder = (order, market) => {
|
|
|
109
126
|
case OrderType.STOP_MARKET:
|
|
110
127
|
case OrderType.STOP_LIMIT:
|
|
111
128
|
case OrderType.TAKE_PROFIT_MARKET:
|
|
112
|
-
case OrderType.TAKE_PROFIT_LIMIT:
|
|
129
|
+
case OrderType.TAKE_PROFIT_LIMIT: {
|
|
113
130
|
return {
|
|
114
131
|
...base,
|
|
115
132
|
type,
|
|
@@ -120,6 +137,7 @@ export const mapOrder = (order, market) => {
|
|
|
120
137
|
? { limitPrice: order.price }
|
|
121
138
|
: {}),
|
|
122
139
|
};
|
|
140
|
+
}
|
|
123
141
|
case OrderType.MARKET:
|
|
124
142
|
case OrderType.LIMIT:
|
|
125
143
|
return {
|
|
@@ -127,20 +145,33 @@ export const mapOrder = (order, market) => {
|
|
|
127
145
|
type,
|
|
128
146
|
price: order.price,
|
|
129
147
|
timeInForce: mapTimeInForce(order.time_in_force),
|
|
130
|
-
...(
|
|
131
|
-
? { expiresAt: new Date(order.order_expiry).toISOString() }
|
|
132
|
-
: {}),
|
|
148
|
+
...(expiresAt === undefined ? {} : { expiresAt }),
|
|
133
149
|
};
|
|
134
150
|
}
|
|
135
151
|
};
|
|
136
|
-
/**
|
|
152
|
+
/**
|
|
153
|
+
* Include terminal rows and their ids so consumers can update history and
|
|
154
|
+
* active caches. A row the mapper rejects is dropped and warns once.
|
|
155
|
+
*/
|
|
137
156
|
export const mapOrderUpdates = (rawOrders, resolveMarket) => {
|
|
138
157
|
const orders = [];
|
|
139
158
|
const terminated = [];
|
|
140
159
|
for (const raw of rawOrders) {
|
|
141
160
|
const market = resolveMarket(raw.market_index);
|
|
142
|
-
|
|
143
|
-
|
|
161
|
+
let order;
|
|
162
|
+
let status;
|
|
163
|
+
try {
|
|
164
|
+
order = market === undefined ? undefined : mapOrder(raw, market);
|
|
165
|
+
status = order?.status ?? mapOrderStatus(raw);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (!(error instanceof PerpsError)) {
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
wsLog.droppedRow(LIGHTER_PROVIDER_KEY, 'order', `${raw.order_index}: ${error.message}`);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (!isActiveOrderStatus(status)) {
|
|
144
175
|
terminated.push(String(raw.order_index));
|
|
145
176
|
}
|
|
146
177
|
if (order !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapOrder.js","sourceRoot":"","sources":["../../../src/utils/mapOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,mBAAmB,
|
|
1
|
+
{"version":3,"file":"mapOrder.js","sourceRoot":"","sources":["../../../src/utils/mapOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,GACN,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,cAAc,EACd,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAA;AAEtE,MAAM,YAAY,GAAG,CAAC,IAAY,EAAiB,EAAE;IACnD,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,QAAQ,CAAC;QACd,KAAK,aAAa;YAChB,OAAO,SAAS,CAAC,MAAM,CAAA;QACzB,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,SAAS,CAAC,KAAK,CAAA;QACxB,KAAK,WAAW;YACd,OAAO,SAAS,CAAC,WAAW,CAAA;QAC9B,KAAK,iBAAiB;YACpB,OAAO,SAAS,CAAC,UAAU,CAAA;QAC7B,KAAK,aAAa;YAChB,OAAO,SAAS,CAAC,kBAAkB,CAAA;QACrC,KAAK,mBAAmB;YACtB,OAAO,SAAS,CAAC,iBAAiB,CAAA;QACpC,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,CAAA;QACvB;YACE,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,QAAQ,EACvB,+BAA+B,IAAI,EAAE,CACtC,CAAA;IACL,CAAC;AACH,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,GAAW,EAAe,EAAE;IAClD,QAAQ,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,gBAAgB;YACnB,OAAO,WAAW,CAAC,GAAG,CAAA;QACxB,KAAK,qBAAqB;YACxB,OAAO,WAAW,CAAC,GAAG,CAAA;QACxB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,SAAS,CAAA;QAC9B;YACE,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,QAAQ,EACvB,kCAAkC,GAAG,EAAE,CACxC,CAAA;IACL,CAAC;AACH,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,KAAc,EAAW,EAAE,CAC1C,8BAA8B,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,KAAK,IAAI,CAAA;AAExE,MAAM,cAAc,GAAG,CAAC,KAAc,EAAe,EAAE;IACrD,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,aAAa;YAChB,OAAO,WAAW,CAAC,QAAQ,CAAA;QAC7B,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC,IAAI,CAAA;QACzB,KAAK,MAAM;YACT,IAAI,KAAK,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;gBAC5C,OAAO,WAAW,CAAC,OAAO,CAAA;YAC5B,CAAC;YACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAA;QACzE,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,SAAS,CAAA;QAC9B,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,MAAM,CAAA;QAC3B,KAAK,kBAAkB;YACrB,OAAO,WAAW,CAAC,OAAO,CAAA;QAC5B,KAAK,UAAU,CAAC;QAChB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,sBAAsB,CAAC;QAC5B,KAAK,+BAA+B,CAAC;QACrC,KAAK,6BAA6B,CAAC;QACnC,KAAK,4BAA4B,CAAC;QAClC,KAAK,+BAA+B,CAAC;QACrC,KAAK,qBAAqB,CAAC;QAC3B,KAAK,cAAc,CAAC;QACpB,KAAK,gBAAgB,CAAC;QACtB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,0BAA0B;YAC7B,OAAO,WAAW,CAAC,SAAS,CAAA;QAC9B;YACE,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,QAAQ,EACvB,iCAAiC,KAAK,CAAC,MAAM,EAAE,CAChD,CAAA;IACL,CAAC;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAChB,QAAgB,EAChB,KAAa,EACb,KAAc,EACH,EAAE;IACb,mBAAmB,CAAC,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9E,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,KAAc,EACd,MAAqB,EACF,EAAE;IACrB,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,kCAAkC,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC7E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,SAAS,GAAG,kCAAkC,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC7E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;QACjC,CAAC,CAAC,uBAAuB,CACrB,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,kBAAkB,CACzB;QACH,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,SAAS,GACb,KAAK,CAAC,YAAY,GAAG,CAAC;QACpB,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,YAAY,CAAC;QAC9C,CAAC,CAAC,SAAS,CAAA;IACf,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,IAAI,GAAc;QACtB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAClC,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC;YAChC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACxD,MAAM;QACN,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG;QACnD,MAAM;QACN,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,YAAY,EAAE,KAAK,CAAC,mBAAmB;QACvC,aAAa,EAAE,KAAK,CAAC,qBAAqB;QAC1C,UAAU,EAAE,KAAK,CAAC,kBAAkB;QACpC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,SAAS;QACT,SAAS;KACV,CAAA;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC,IAAI;YACjB,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI;gBACJ,eAAe,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,GAAG,KAAK,CAAC,UAAU;gBAC7D,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAA;QACH,KAAK,SAAS,CAAC,WAAW,CAAC;QAC3B,KAAK,SAAS,CAAC,UAAU,CAAC;QAC1B,KAAK,SAAS,CAAC,kBAAkB,CAAC;QAClC,KAAK,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACjC,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI;gBACJ,YAAY,EAAE,KAAK,CAAC,aAAa;gBACjC,gBAAgB,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;gBACtD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,UAAU;oBACjC,IAAI,KAAK,SAAS,CAAC,iBAAiB;oBAClC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE;oBAC7B,CAAC,CAAC,EAAE,CAAC;aACR,CAAA;QACH,CAAC;QACD,KAAK,SAAS,CAAC,MAAM,CAAC;QACtB,KAAK,SAAS,CAAC,KAAK;YAClB,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI;gBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC;gBAChD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;aAClD,CAAA;IACL,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,SAAoB,EACpB,aAAiE,EACtB,EAAE;IAC7C,MAAM,MAAM,GAAY,EAAE,CAAA;IAC1B,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAC9C,IAAI,KAAwB,CAAA;QAC5B,IAAI,MAAmB,CAAA;QACvB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAChE,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,CAAA;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAA;YACb,CAAC;YACD,KAAK,CAAC,UAAU,CACd,oBAAoB,EACpB,OAAO,EACP,GAAG,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,OAAO,EAAE,CACvC,CAAA;YACD,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;QAC1C,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;AAC/B,CAAC,CAAA"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { PortfolioHistoryRange, PortfolioHistoryResponse } from '@lifi/perps-types';
|
|
2
|
-
import Big from 'big.js';
|
|
3
2
|
import type { LtPnLEntry } from '../types/pnl.js';
|
|
4
3
|
/**
|
|
5
4
|
* Derive window-relative history from Lighter's cumulative PnL snapshots.
|
|
6
|
-
* Historical account values are anchored to the current account value.
|
|
5
|
+
* Historical account values are anchored to the current account value. A
|
|
6
|
+
* snapshot with a non-finite value is skipped.
|
|
7
|
+
*
|
|
8
|
+
* @throws {PerpsError} `ValidationError` when `currentValue` does not match the
|
|
9
|
+
* decimal pattern.
|
|
7
10
|
*/
|
|
8
|
-
export declare const mapPortfolioHistory: (range: PortfolioHistoryRange, snapshots: LtPnLEntry[], currentValue:
|
|
11
|
+
export declare const mapPortfolioHistory: (range: PortfolioHistoryRange, snapshots: LtPnLEntry[], currentValue: string) => PortfolioHistoryResponse;
|
|
9
12
|
//# sourceMappingURL=mapPortfolioHistory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPortfolioHistory.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapPortfolioHistory.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAuDjD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,qBAAqB,EAC5B,WAAW,UAAU,EAAE,EACvB,cAAc,MAAM,KACnB,wBA0CF,CAAA"}
|
|
@@ -1,19 +1,41 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { addDecimalString, numberToDecimalString, subtractDecimalString, warnSkippedVenueRow, } from '@lifi/perps-sdk';
|
|
2
|
+
import { LIGHTER_PROVIDER_KEY } from '../constants.js';
|
|
3
|
+
const SNAPSHOT_DECIMAL_FIELDS = [
|
|
4
|
+
'trade_pnl',
|
|
5
|
+
'trade_spot_pnl',
|
|
6
|
+
'inflow',
|
|
7
|
+
'outflow',
|
|
8
|
+
'spot_inflow',
|
|
9
|
+
'spot_outflow',
|
|
10
|
+
'volume',
|
|
11
|
+
];
|
|
12
|
+
const snapshotDecimal = (snapshot, field) => numberToDecimalString(snapshot[field]);
|
|
13
|
+
function isValidSnapshot(snapshot) {
|
|
14
|
+
const invalid = SNAPSHOT_DECIMAL_FIELDS.find((field) => !Number.isFinite(snapshot[field]));
|
|
15
|
+
if (invalid === undefined) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
warnSkippedVenueRow(LIGHTER_PROVIDER_KEY, 'portfolio history', invalid, snapshot[invalid]);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
2
21
|
function getCumulativePnl(snapshot) {
|
|
3
|
-
return
|
|
22
|
+
return addDecimalString(snapshotDecimal(snapshot, 'trade_pnl'), snapshotDecimal(snapshot, 'trade_spot_pnl'));
|
|
4
23
|
}
|
|
5
24
|
function getCumulativeNetFlow(snapshot) {
|
|
6
|
-
return
|
|
7
|
-
.minus(snapshot.outflow)
|
|
8
|
-
.plus(snapshot.spot_inflow)
|
|
9
|
-
.minus(snapshot.spot_outflow);
|
|
25
|
+
return subtractDecimalString(addDecimalString(subtractDecimalString(snapshotDecimal(snapshot, 'inflow'), snapshotDecimal(snapshot, 'outflow')), snapshotDecimal(snapshot, 'spot_inflow')), snapshotDecimal(snapshot, 'spot_outflow'));
|
|
10
26
|
}
|
|
11
27
|
/**
|
|
12
28
|
* Derive window-relative history from Lighter's cumulative PnL snapshots.
|
|
13
|
-
* Historical account values are anchored to the current account value.
|
|
29
|
+
* Historical account values are anchored to the current account value. A
|
|
30
|
+
* snapshot with a non-finite value is skipped.
|
|
31
|
+
*
|
|
32
|
+
* @throws {PerpsError} `ValidationError` when `currentValue` does not match the
|
|
33
|
+
* decimal pattern.
|
|
14
34
|
*/
|
|
15
35
|
export const mapPortfolioHistory = (range, snapshots, currentValue) => {
|
|
16
|
-
const orderedSnapshots =
|
|
36
|
+
const orderedSnapshots = snapshots
|
|
37
|
+
.filter(isValidSnapshot)
|
|
38
|
+
.sort((a, b) => a.timestamp - b.timestamp);
|
|
17
39
|
const firstSnapshot = orderedSnapshots[0];
|
|
18
40
|
const latestSnapshot = orderedSnapshots.at(-1);
|
|
19
41
|
if (!firstSnapshot || !latestSnapshot) {
|
|
@@ -26,26 +48,19 @@ export const mapPortfolioHistory = (range, snapshots, currentValue) => {
|
|
|
26
48
|
}
|
|
27
49
|
const firstPnl = getCumulativePnl(firstSnapshot);
|
|
28
50
|
const latestPnl = getCumulativePnl(latestSnapshot);
|
|
29
|
-
const accountValueOffset = currentValue
|
|
30
|
-
.minus(latestPnl)
|
|
31
|
-
.minus(getCumulativeNetFlow(latestSnapshot));
|
|
51
|
+
const accountValueOffset = subtractDecimalString(subtractDecimalString(currentValue, latestPnl), getCumulativeNetFlow(latestSnapshot));
|
|
32
52
|
const points = orderedSnapshots.map((snapshot) => {
|
|
33
53
|
const pnl = getCumulativePnl(snapshot);
|
|
34
54
|
return {
|
|
35
55
|
timestamp: snapshot.timestamp * 1_000,
|
|
36
|
-
accountValue: accountValueOffset
|
|
37
|
-
|
|
38
|
-
.plus(getCumulativeNetFlow(snapshot))
|
|
39
|
-
.toFixed(),
|
|
40
|
-
pnl: pnl.minus(firstPnl).toFixed(),
|
|
56
|
+
accountValue: addDecimalString(addDecimalString(accountValueOffset, pnl), getCumulativeNetFlow(snapshot)),
|
|
57
|
+
pnl: subtractDecimalString(pnl, firstPnl),
|
|
41
58
|
};
|
|
42
59
|
});
|
|
43
60
|
return {
|
|
44
61
|
range,
|
|
45
62
|
points,
|
|
46
|
-
volume:
|
|
47
|
-
.minus(firstSnapshot.volume)
|
|
48
|
-
.toFixed(),
|
|
63
|
+
volume: subtractDecimalString(snapshotDecimal(latestSnapshot, 'volume'), snapshotDecimal(firstSnapshot, 'volume')),
|
|
49
64
|
totalPnl: points.at(-1)?.pnl,
|
|
50
65
|
};
|
|
51
66
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPortfolioHistory.js","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapPortfolioHistory.js","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,24 +2,28 @@ import type { PerpsMarketDisplay, Position } from '@lifi/perps-types';
|
|
|
2
2
|
import type { LtAccountPosition } from '../types/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* Display leverage from an IMF percent string: `100 / IMF` in exact decimal
|
|
5
|
-
* arithmetic, rounded half-up to `LIGHTER_LEVERAGE_PRECISION
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* arithmetic, rounded half-up to `LIGHTER_LEVERAGE_PRECISION`, so the value a
|
|
6
|
+
* client reads is the value it saved. Provider risk calculations consume the
|
|
7
|
+
* original decimal IMF instead. `undefined` for a non-positive or unparsable
|
|
8
|
+
* IMF.
|
|
9
9
|
* @public
|
|
10
10
|
*/
|
|
11
|
-
export declare const leverageFromImf: (imf: string) =>
|
|
11
|
+
export declare const leverageFromImf: (imf: string) => string | undefined;
|
|
12
12
|
/**
|
|
13
13
|
* Display leverage from an integer IMF on `LIGHTER_IMF_PERCENT_SCALE`, the
|
|
14
14
|
* unit of trade rows and order-book details: `500` is 5.00%, so 20x.
|
|
15
|
-
* `undefined` for a non-positive or
|
|
15
|
+
* `undefined` for a non-positive or non-finite IMF. Lighter declares the
|
|
16
16
|
* fraction a `StrictInt`, so the scale division is exact.
|
|
17
17
|
*/
|
|
18
|
-
export declare const leverageFromScaledImf: (imf: number) =>
|
|
18
|
+
export declare const leverageFromScaledImf: (imf: number) => string | undefined;
|
|
19
19
|
/**
|
|
20
|
-
* Map a raw Lighter account position to the generic Position type.
|
|
20
|
+
* Map a raw Lighter account position to the generic Position type. A row with
|
|
21
|
+
* an invalid size gives `undefined`. An invalid position value or a
|
|
22
|
+
* non-positive initial margin fraction keeps the row, leaves `leverage` and
|
|
23
|
+
* `initialMarginRequirement` absent, sets a cross `marginUsed` to `'0'` and
|
|
24
|
+
* warns once. Prices, PnL, funding and isolated margin pass through raw.
|
|
21
25
|
* @param market - Backend-resolved market identity for `pos.market_id`.
|
|
22
26
|
* @public
|
|
23
27
|
*/
|
|
24
|
-
export declare const mapPosition: (pos: LtAccountPosition, market: PerpsMarketDisplay) => Position;
|
|
28
|
+
export declare const mapPosition: (pos: LtAccountPosition, market: PerpsMarketDisplay) => Position | undefined;
|
|
25
29
|
//# sourceMappingURL=mapPosition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"
|
|
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;AAOrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG1D;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAQtD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAO5D,CAAA;AAsBD;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,QAAQ,kBAAkB,KACzB,QAAQ,GAAG,SA+Cb,CAAA"}
|