@lifi/perps-sdk-provider-lighter 35.1.0 → 36.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 +101 -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 +9 -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 +3 -3
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +5 -6
- 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 +3 -1
- package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/cjs/utils/mapOpenPositions.js +20 -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 +64 -26
- 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 +35 -38
- 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/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 +46 -58
- package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
- package/dist/cjs/websocket/orderBookSide.d.ts +19 -0
- package/dist/cjs/websocket/orderBookSide.d.ts.map +1 -0
- package/dist/cjs/websocket/orderBookSide.js +71 -0
- package/dist/cjs/websocket/orderBookSide.js.map +1 -0
- package/dist/esm/LighterProvider.d.ts.map +1 -1
- package/dist/esm/LighterProvider.js +116 -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 +10 -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 +3 -3
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +2 -3
- 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 +17 -3
- package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/esm/utils/mapOpenPositions.js +31 -5
- package/dist/esm/utils/mapOpenPositions.js.map +1 -1
- package/dist/esm/utils/mapOrder.d.ts +6 -2
- package/dist/esm/utils/mapOrder.d.ts.map +1 -1
- package/dist/esm/utils/mapOrder.js +70 -25
- 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 +12 -9
- package/dist/esm/utils/mapPosition.d.ts.map +1 -1
- package/dist/esm/utils/mapPosition.js +45 -42
- 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/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 +48 -57
- package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
- package/dist/esm/websocket/orderBookSide.d.ts +33 -0
- package/dist/esm/websocket/orderBookSide.d.ts.map +1 -0
- package/dist/esm/websocket/orderBookSide.js +76 -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 +3 -3
- 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 +17 -3
- package/dist/types/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/types/utils/mapOrder.d.ts +6 -2
- 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 +12 -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/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 +33 -0
- package/dist/types/websocket/orderBookSide.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/LighterProvider.ts +236 -100
- package/src/accountSummary.ts +41 -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 -3
- package/src/utils/mapFill.ts +82 -43
- package/src/utils/mapOpenPositions.ts +45 -6
- package/src/utils/mapOrder.ts +99 -28
- package/src/utils/mapPortfolioHistory.ts +78 -24
- package/src/utils/mapPosition.ts +63 -47
- 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/withdrawableBalances.ts +34 -20
- package/src/utils/withdrawalTypes.ts +125 -0
- package/src/websocket/LighterWsProvider.ts +75 -92
- package/src/websocket/orderBookSide.ts +106 -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
|
@@ -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, '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,11 +1,25 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type PerpsMarketDisplay, type 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
|
*/
|
|
10
17
|
export declare const mapOpenPositions: (positions: LtAccountPosition[], resolveMarket: (marketId: number) => PerpsMarketDisplay) => Position[];
|
|
18
|
+
/**
|
|
19
|
+
* Map every open Lighter position for account totals, which must not leave a
|
|
20
|
+
* position out.
|
|
21
|
+
*
|
|
22
|
+
* @throws {PerpsError} `SDKError` when `mapPosition` skips an open row.
|
|
23
|
+
*/
|
|
24
|
+
export declare const requireOpenPositions: (positions: LtAccountPosition[], resolveMarket: (marketId: number) => PerpsMarketDisplay) => Position[];
|
|
11
25
|
//# sourceMappingURL=mapOpenPositions.d.ts.map
|
|
@@ -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,EAEL,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAA;AAE1B,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;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,WAAW,iBAAiB,EAAE,EAC9B,eAAe,CAAC,QAAQ,EAAE,MAAM,KAAK,kBAAkB,KACtD,QAAQ,EAYP,CAAA"}
|
|
@@ -1,12 +1,38 @@
|
|
|
1
|
+
import { PerpsError, safeIsDecimalStringZero } from '@lifi/perps-sdk';
|
|
2
|
+
import { PerpsErrorCode, } from '@lifi/perps-types';
|
|
3
|
+
import { LIGHTER_PROVIDER_KEY } from '../constants.js';
|
|
1
4
|
import { mapPosition } from './mapPosition.js';
|
|
5
|
+
/**
|
|
6
|
+
* True when the Lighter position row has a non-zero size. A malformed size
|
|
7
|
+
* keeps the row.
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export const isOpenPosition = (p) => safeIsDecimalStringZero(p.position) !== true;
|
|
2
11
|
/**
|
|
3
12
|
* 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
|
|
13
|
+
* zero-size rows and rows that `mapPosition` skips. Only valid for payloads
|
|
14
|
+
* carrying the full position set — dropping zeros from a partial frame would
|
|
15
|
+
* make closes unobservable.
|
|
6
16
|
*
|
|
7
17
|
* @public
|
|
8
18
|
*/
|
|
9
|
-
export const mapOpenPositions = (positions, resolveMarket) => positions
|
|
10
|
-
|
|
11
|
-
|
|
19
|
+
export const mapOpenPositions = (positions, resolveMarket) => positions.filter(isOpenPosition).flatMap((p) => {
|
|
20
|
+
const position = mapPosition(p, resolveMarket(p.market_id));
|
|
21
|
+
return position === undefined ? [] : [position];
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Map every open Lighter position for account totals, which must not leave a
|
|
25
|
+
* position out.
|
|
26
|
+
*
|
|
27
|
+
* @throws {PerpsError} `SDKError` when `mapPosition` skips an open row.
|
|
28
|
+
*/
|
|
29
|
+
export const requireOpenPositions = (positions, resolveMarket) => positions.filter(isOpenPosition).map((p) => {
|
|
30
|
+
const position = mapPosition(p, resolveMarket(p.market_id));
|
|
31
|
+
if (position !== undefined) {
|
|
32
|
+
return position;
|
|
33
|
+
}
|
|
34
|
+
const error = new PerpsError(PerpsErrorCode.SDKError, `${LIGHTER_PROVIDER_KEY} position for market ${p.market_id} is not valid, so the account totals are unknown.`);
|
|
35
|
+
error.tool = LIGHTER_PROVIDER_KEY;
|
|
36
|
+
throw error;
|
|
37
|
+
});
|
|
12
38
|
//# 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,UAAU,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EACL,cAAc,GAGf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD,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;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,SAA8B,EAC9B,aAAuD,EAC3C,EAAE,CACd,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;IACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IAC3D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAC1B,cAAc,CAAC,QAAQ,EACvB,GAAG,oBAAoB,wBAAwB,CAAC,CAAC,SAAS,mDAAmD,CAC9G,CAAA;IACD,KAAK,CAAC,IAAI,GAAG,oBAAoB,CAAA;IACjC,MAAM,KAAK,CAAA;AACb,CAAC,CAAC,CAAA"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { MarketDisplay, Order } from '@lifi/perps-types';
|
|
2
2
|
import type { LtOrder } from '../types/index.js';
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Map a Lighter order with its venue identity, lifecycle, and execution fields.
|
|
5
|
+
* A row with an invalid size or time gives `undefined`. An invalid limit price or
|
|
6
|
+
* filled quote amount omits that field.
|
|
7
|
+
*/
|
|
8
|
+
export declare const mapOrder: (order: LtOrder, market: MarketDisplay) => Order | undefined;
|
|
5
9
|
/** Include terminal rows and their ids so consumers can update history and active caches. */
|
|
6
10
|
export declare const mapOrderUpdates: (rawOrders: LtOrder[], resolveMarket: (marketIndex: number) => MarketDisplay | undefined) => {
|
|
7
11
|
orders: Order[];
|
|
@@ -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;AA2GhD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GACnB,OAAO,OAAO,EACd,QAAQ,aAAa,KACpB,KAAK,GAAG,SAmGV,CAAA;AAED,6FAA6F;AAC7F,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;CAczC,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { isActiveOrderStatus, PerpsError, triggerConditionFor, } from '@lifi/perps-sdk';
|
|
1
|
+
import { isActiveOrderStatus, isDecimalStringGreaterThan, PerpsError, safeDivideDecimalString, safeTimestampToIsoString, triggerConditionFor, unknownToDecimalString, warnSkippedVenueRow, } 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,19 @@ const mapTimeInForce = (tif) => {
|
|
|
35
36
|
throw new PerpsError(PerpsErrorCode.SDKError, `Unknown Lighter time in force: ${tif}`);
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
|
-
const
|
|
39
|
+
const venueDecimal = (value, field) => {
|
|
40
|
+
try {
|
|
41
|
+
return unknownToDecimalString(value, field, LIGHTER_PROVIDER_KEY);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const hasFill = (order) => {
|
|
48
|
+
const filled = venueDecimal(order.filled_base_amount, 'filled_base_amount');
|
|
49
|
+
return filled !== undefined && isDecimalStringGreaterThan(filled, '0');
|
|
50
|
+
};
|
|
51
|
+
const mapOrderStatus = (order) => {
|
|
39
52
|
switch (order.status) {
|
|
40
53
|
case 'in-progress':
|
|
41
54
|
return OrderStatus.ACCEPTED;
|
|
@@ -45,7 +58,7 @@ const mapOrderStatus = (order, filledSize = new Big(order.filled_base_amount)) =
|
|
|
45
58
|
if (order.trigger_status === 'parent-order') {
|
|
46
59
|
return OrderStatus.PENDING;
|
|
47
60
|
}
|
|
48
|
-
return
|
|
61
|
+
return hasFill(order) ? OrderStatus.PARTIALLY_FILLED : OrderStatus.OPEN;
|
|
49
62
|
case 'triggered':
|
|
50
63
|
return OrderStatus.TRIGGERED;
|
|
51
64
|
case 'filled':
|
|
@@ -69,11 +82,49 @@ const mapOrderStatus = (order, filledSize = new Big(order.filled_base_amount)) =
|
|
|
69
82
|
throw new PerpsError(PerpsErrorCode.SDKError, `Unknown Lighter order status: ${order.status}`);
|
|
70
83
|
}
|
|
71
84
|
};
|
|
72
|
-
|
|
85
|
+
const skipOrder = (field, value) => {
|
|
86
|
+
warnSkippedVenueRow(LIGHTER_PROVIDER_KEY, 'order', field, value);
|
|
87
|
+
return undefined;
|
|
88
|
+
};
|
|
89
|
+
const orderSizeOrSkip = (field, value) => venueDecimal(value, field) === undefined ? skipOrder(field, value) : value;
|
|
90
|
+
/**
|
|
91
|
+
* Map a Lighter order with its venue identity, lifecycle, and execution fields.
|
|
92
|
+
* A row with an invalid size or time gives `undefined`. An invalid limit price or
|
|
93
|
+
* filled quote amount omits that field.
|
|
94
|
+
*/
|
|
73
95
|
export const mapOrder = (order, market) => {
|
|
74
96
|
const type = mapOrderType(order.type);
|
|
75
|
-
const
|
|
76
|
-
|
|
97
|
+
const originalSize = orderSizeOrSkip('initial_base_amount', order.initial_base_amount);
|
|
98
|
+
if (originalSize === undefined) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
const remainingSize = orderSizeOrSkip('remaining_base_amount', order.remaining_base_amount);
|
|
102
|
+
if (remainingSize === undefined) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const filledSize = orderSizeOrSkip('filled_base_amount', order.filled_base_amount);
|
|
106
|
+
if (filledSize === undefined) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const createdAt = rowTimestampToIsoStringOrUndefined(order.created_at * 1000);
|
|
110
|
+
if (createdAt === undefined) {
|
|
111
|
+
return skipOrder('created_at', order.created_at);
|
|
112
|
+
}
|
|
113
|
+
const updatedAt = rowTimestampToIsoStringOrUndefined(order.updated_at * 1000);
|
|
114
|
+
if (updatedAt === undefined) {
|
|
115
|
+
return skipOrder('updated_at', order.updated_at);
|
|
116
|
+
}
|
|
117
|
+
const filledQuote = venueDecimal(order.filled_quote_amount, 'filled_quote_amount');
|
|
118
|
+
const filledAmount = venueDecimal(filledSize, 'filled_base_amount');
|
|
119
|
+
const averagePrice = filledQuote !== undefined &&
|
|
120
|
+
filledAmount !== undefined &&
|
|
121
|
+
isDecimalStringGreaterThan(filledAmount, '0')
|
|
122
|
+
? safeDivideDecimalString(filledQuote, filledAmount)
|
|
123
|
+
: undefined;
|
|
124
|
+
const expiresAt = order.order_expiry > 0
|
|
125
|
+
? safeTimestampToIsoString(order.order_expiry)
|
|
126
|
+
: undefined;
|
|
127
|
+
const status = mapOrderStatus(order);
|
|
77
128
|
const base = {
|
|
78
129
|
orderId: String(order.order_index),
|
|
79
130
|
...(order.client_order_index === 0
|
|
@@ -83,20 +134,14 @@ export const mapOrder = (order, market) => {
|
|
|
83
134
|
side: order.is_ask ? OrderSide.SELL : OrderSide.BUY,
|
|
84
135
|
status,
|
|
85
136
|
...(status === OrderStatus.CANCELLED ? { statusReason: order.status } : {}),
|
|
86
|
-
originalSize
|
|
87
|
-
remainingSize
|
|
88
|
-
filledSize
|
|
89
|
-
...(
|
|
90
|
-
? {
|
|
91
|
-
averagePrice: new Big(order.filled_quote_amount)
|
|
92
|
-
.div(filledSize)
|
|
93
|
-
.toFixed(),
|
|
94
|
-
}
|
|
95
|
-
: {}),
|
|
137
|
+
originalSize,
|
|
138
|
+
remainingSize,
|
|
139
|
+
filledSize,
|
|
140
|
+
...(averagePrice === undefined ? {} : { averagePrice }),
|
|
96
141
|
reduceOnly: order.reduce_only,
|
|
97
142
|
...(order.parent_order_id ? { parentOrderId: order.parent_order_id } : {}),
|
|
98
|
-
createdAt
|
|
99
|
-
updatedAt
|
|
143
|
+
createdAt,
|
|
144
|
+
updatedAt,
|
|
100
145
|
};
|
|
101
146
|
switch (type) {
|
|
102
147
|
case OrderType.TWAP:
|
|
@@ -109,17 +154,19 @@ export const mapOrder = (order, market) => {
|
|
|
109
154
|
case OrderType.STOP_MARKET:
|
|
110
155
|
case OrderType.STOP_LIMIT:
|
|
111
156
|
case OrderType.TAKE_PROFIT_MARKET:
|
|
112
|
-
case OrderType.TAKE_PROFIT_LIMIT:
|
|
157
|
+
case OrderType.TAKE_PROFIT_LIMIT: {
|
|
113
158
|
return {
|
|
114
159
|
...base,
|
|
115
160
|
type,
|
|
116
161
|
triggerPrice: order.trigger_price,
|
|
117
162
|
triggerCondition: triggerConditionFor(type, base.side),
|
|
118
|
-
...(type === OrderType.STOP_LIMIT ||
|
|
119
|
-
type === OrderType.TAKE_PROFIT_LIMIT
|
|
163
|
+
...((type === OrderType.STOP_LIMIT ||
|
|
164
|
+
type === OrderType.TAKE_PROFIT_LIMIT) &&
|
|
165
|
+
venueDecimal(order.price, 'price') !== undefined
|
|
120
166
|
? { limitPrice: order.price }
|
|
121
167
|
: {}),
|
|
122
168
|
};
|
|
169
|
+
}
|
|
123
170
|
case OrderType.MARKET:
|
|
124
171
|
case OrderType.LIMIT:
|
|
125
172
|
return {
|
|
@@ -127,9 +174,7 @@ export const mapOrder = (order, market) => {
|
|
|
127
174
|
type,
|
|
128
175
|
price: order.price,
|
|
129
176
|
timeInForce: mapTimeInForce(order.time_in_force),
|
|
130
|
-
...(
|
|
131
|
-
? { expiresAt: new Date(order.order_expiry).toISOString() }
|
|
132
|
-
: {}),
|
|
177
|
+
...(expiresAt === undefined ? {} : { expiresAt }),
|
|
133
178
|
};
|
|
134
179
|
}
|
|
135
180
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapOrder.js","sourceRoot":"","sources":["../../../src/utils/mapOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,cAAc,EACd,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"mapOrder.js","sourceRoot":"","sources":["../../../src/utils/mapOrder.ts"],"names":[],"mappings":"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"}
|
|
@@ -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` is not a decimal
|
|
9
|
+
* string.
|
|
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` is not a decimal
|
|
33
|
+
* string.
|
|
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,27 @@ 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 or value, or a non-positive initial margin fraction, gives
|
|
22
|
+
* `undefined`: the mapper derives the size, mark price, margin and leverage
|
|
23
|
+
* from them. Prices, PnL, funding and isolated margin pass through raw.
|
|
21
24
|
* @param market - Backend-resolved market identity for `pos.market_id`.
|
|
22
25
|
* @public
|
|
23
26
|
*/
|
|
24
|
-
export declare const mapPosition: (pos: LtAccountPosition, market: PerpsMarketDisplay) => Position;
|
|
27
|
+
export declare const mapPosition: (pos: LtAccountPosition, market: PerpsMarketDisplay) => Position | undefined;
|
|
25
28
|
//# sourceMappingURL=mapPosition.d.ts.map
|