@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.
Files changed (226) hide show
  1. package/dist/cjs/LighterProvider.d.ts.map +1 -1
  2. package/dist/cjs/LighterProvider.js +101 -58
  3. package/dist/cjs/LighterProvider.js.map +1 -1
  4. package/dist/cjs/accountSummary.d.ts +1 -2
  5. package/dist/cjs/accountSummary.d.ts.map +1 -1
  6. package/dist/cjs/accountSummary.js +9 -16
  7. package/dist/cjs/accountSummary.js.map +1 -1
  8. package/dist/cjs/availableToTrade.d.ts +1 -2
  9. package/dist/cjs/availableToTrade.d.ts.map +1 -1
  10. package/dist/cjs/availableToTrade.js +8 -12
  11. package/dist/cjs/availableToTrade.js.map +1 -1
  12. package/dist/cjs/signers/LighterSigner.d.ts.map +1 -1
  13. package/dist/cjs/signers/LighterSigner.js +2 -6
  14. package/dist/cjs/signers/LighterSigner.js.map +1 -1
  15. package/dist/cjs/types/submit.d.ts +5 -0
  16. package/dist/cjs/types/submit.d.ts.map +1 -1
  17. package/dist/cjs/utils/index.d.ts +3 -3
  18. package/dist/cjs/utils/index.d.ts.map +1 -1
  19. package/dist/cjs/utils/index.js +5 -6
  20. package/dist/cjs/utils/index.js.map +1 -1
  21. package/dist/cjs/utils/mapFill.d.ts +1 -1
  22. package/dist/cjs/utils/mapFill.d.ts.map +1 -1
  23. package/dist/cjs/utils/mapFill.js +44 -31
  24. package/dist/cjs/utils/mapFill.js.map +1 -1
  25. package/dist/cjs/utils/mapOpenPositions.d.ts +3 -1
  26. package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -1
  27. package/dist/cjs/utils/mapOpenPositions.js +20 -4
  28. package/dist/cjs/utils/mapOpenPositions.js.map +1 -1
  29. package/dist/cjs/utils/mapOrder.d.ts +1 -1
  30. package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
  31. package/dist/cjs/utils/mapOrder.js +64 -26
  32. package/dist/cjs/utils/mapOrder.js.map +1 -1
  33. package/dist/cjs/utils/mapPortfolioHistory.d.ts +1 -2
  34. package/dist/cjs/utils/mapPortfolioHistory.d.ts.map +1 -1
  35. package/dist/cjs/utils/mapPortfolioHistory.js +29 -21
  36. package/dist/cjs/utils/mapPortfolioHistory.js.map +1 -1
  37. package/dist/cjs/utils/mapPosition.d.ts +3 -3
  38. package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
  39. package/dist/cjs/utils/mapPosition.js +35 -38
  40. package/dist/cjs/utils/mapPosition.js.map +1 -1
  41. package/dist/cjs/utils/rowTimestamp.d.ts +2 -0
  42. package/dist/cjs/utils/rowTimestamp.d.ts.map +1 -0
  43. package/dist/cjs/utils/rowTimestamp.js +14 -0
  44. package/dist/cjs/utils/rowTimestamp.js.map +1 -0
  45. package/dist/cjs/utils/settlementPool.d.ts +2 -3
  46. package/dist/cjs/utils/settlementPool.d.ts.map +1 -1
  47. package/dist/cjs/utils/settlementPool.js +8 -7
  48. package/dist/cjs/utils/settlementPool.js.map +1 -1
  49. package/dist/cjs/utils/spotPrice.d.ts +3 -4
  50. package/dist/cjs/utils/spotPrice.d.ts.map +1 -1
  51. package/dist/cjs/utils/spotPrice.js +6 -11
  52. package/dist/cjs/utils/spotPrice.js.map +1 -1
  53. package/dist/cjs/utils/time.d.ts.map +1 -1
  54. package/dist/cjs/utils/time.js +3 -2
  55. package/dist/cjs/utils/time.js.map +1 -1
  56. package/dist/cjs/utils/transferMargin.d.ts.map +1 -1
  57. package/dist/cjs/utils/transferMargin.js +8 -11
  58. package/dist/cjs/utils/transferMargin.js.map +1 -1
  59. package/dist/cjs/utils/withdrawableBalances.d.ts +1 -1
  60. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
  61. package/dist/cjs/utils/withdrawableBalances.js +12 -17
  62. package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
  63. package/dist/cjs/utils/withdrawalTypes.d.ts +17 -0
  64. package/dist/cjs/utils/withdrawalTypes.d.ts.map +1 -0
  65. package/dist/cjs/utils/withdrawalTypes.js +58 -0
  66. package/dist/cjs/utils/withdrawalTypes.js.map +1 -0
  67. package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -1
  68. package/dist/cjs/websocket/LighterWsProvider.js +46 -58
  69. package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
  70. package/dist/cjs/websocket/orderBookSide.d.ts +19 -0
  71. package/dist/cjs/websocket/orderBookSide.d.ts.map +1 -0
  72. package/dist/cjs/websocket/orderBookSide.js +71 -0
  73. package/dist/cjs/websocket/orderBookSide.js.map +1 -0
  74. package/dist/esm/LighterProvider.d.ts.map +1 -1
  75. package/dist/esm/LighterProvider.js +116 -62
  76. package/dist/esm/LighterProvider.js.map +1 -1
  77. package/dist/esm/accountSummary.d.ts +1 -2
  78. package/dist/esm/accountSummary.d.ts.map +1 -1
  79. package/dist/esm/accountSummary.js +10 -14
  80. package/dist/esm/accountSummary.js.map +1 -1
  81. package/dist/esm/availableToTrade.d.ts +1 -2
  82. package/dist/esm/availableToTrade.d.ts.map +1 -1
  83. package/dist/esm/availableToTrade.js +9 -10
  84. package/dist/esm/availableToTrade.js.map +1 -1
  85. package/dist/esm/signers/LighterSigner.d.ts.map +1 -1
  86. package/dist/esm/signers/LighterSigner.js +3 -4
  87. package/dist/esm/signers/LighterSigner.js.map +1 -1
  88. package/dist/esm/types/submit.d.ts +14 -0
  89. package/dist/esm/types/submit.d.ts.map +1 -1
  90. package/dist/esm/utils/index.d.ts +3 -3
  91. package/dist/esm/utils/index.d.ts.map +1 -1
  92. package/dist/esm/utils/index.js +2 -3
  93. package/dist/esm/utils/index.js.map +1 -1
  94. package/dist/esm/utils/mapFill.d.ts +1 -1
  95. package/dist/esm/utils/mapFill.d.ts.map +1 -1
  96. package/dist/esm/utils/mapFill.js +51 -35
  97. package/dist/esm/utils/mapFill.js.map +1 -1
  98. package/dist/esm/utils/mapOpenPositions.d.ts +17 -3
  99. package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -1
  100. package/dist/esm/utils/mapOpenPositions.js +31 -5
  101. package/dist/esm/utils/mapOpenPositions.js.map +1 -1
  102. package/dist/esm/utils/mapOrder.d.ts +6 -2
  103. package/dist/esm/utils/mapOrder.d.ts.map +1 -1
  104. package/dist/esm/utils/mapOrder.js +70 -25
  105. package/dist/esm/utils/mapOrder.js.map +1 -1
  106. package/dist/esm/utils/mapPortfolioHistory.d.ts +6 -3
  107. package/dist/esm/utils/mapPortfolioHistory.d.ts.map +1 -1
  108. package/dist/esm/utils/mapPortfolioHistory.js +34 -19
  109. package/dist/esm/utils/mapPortfolioHistory.js.map +1 -1
  110. package/dist/esm/utils/mapPosition.d.ts +12 -9
  111. package/dist/esm/utils/mapPosition.d.ts.map +1 -1
  112. package/dist/esm/utils/mapPosition.js +45 -42
  113. package/dist/esm/utils/mapPosition.js.map +1 -1
  114. package/dist/esm/utils/rowTimestamp.d.ts +6 -0
  115. package/dist/esm/utils/rowTimestamp.d.ts.map +1 -0
  116. package/dist/esm/utils/rowTimestamp.js +14 -0
  117. package/dist/esm/utils/rowTimestamp.js.map +1 -0
  118. package/dist/esm/utils/settlementPool.d.ts +2 -3
  119. package/dist/esm/utils/settlementPool.d.ts.map +1 -1
  120. package/dist/esm/utils/settlementPool.js +8 -7
  121. package/dist/esm/utils/settlementPool.js.map +1 -1
  122. package/dist/esm/utils/spotPrice.d.ts +3 -4
  123. package/dist/esm/utils/spotPrice.d.ts.map +1 -1
  124. package/dist/esm/utils/spotPrice.js +6 -8
  125. package/dist/esm/utils/spotPrice.js.map +1 -1
  126. package/dist/esm/utils/time.d.ts +10 -2
  127. package/dist/esm/utils/time.d.ts.map +1 -1
  128. package/dist/esm/utils/time.js +13 -4
  129. package/dist/esm/utils/time.js.map +1 -1
  130. package/dist/esm/utils/transferMargin.d.ts.map +1 -1
  131. package/dist/esm/utils/transferMargin.js +9 -9
  132. package/dist/esm/utils/transferMargin.js.map +1 -1
  133. package/dist/esm/utils/withdrawableBalances.d.ts +5 -3
  134. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
  135. package/dist/esm/utils/withdrawableBalances.js +17 -17
  136. package/dist/esm/utils/withdrawableBalances.js.map +1 -1
  137. package/dist/esm/utils/withdrawalTypes.d.ts +45 -0
  138. package/dist/esm/utils/withdrawalTypes.d.ts.map +1 -0
  139. package/dist/esm/utils/withdrawalTypes.js +68 -0
  140. package/dist/esm/utils/withdrawalTypes.js.map +1 -0
  141. package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -1
  142. package/dist/esm/websocket/LighterWsProvider.js +48 -57
  143. package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
  144. package/dist/esm/websocket/orderBookSide.d.ts +33 -0
  145. package/dist/esm/websocket/orderBookSide.d.ts.map +1 -0
  146. package/dist/esm/websocket/orderBookSide.js +76 -0
  147. package/dist/esm/websocket/orderBookSide.js.map +1 -0
  148. package/dist/types/LighterProvider.d.ts.map +1 -1
  149. package/dist/types/accountSummary.d.ts +1 -2
  150. package/dist/types/accountSummary.d.ts.map +1 -1
  151. package/dist/types/availableToTrade.d.ts +1 -2
  152. package/dist/types/availableToTrade.d.ts.map +1 -1
  153. package/dist/types/signers/LighterSigner.d.ts.map +1 -1
  154. package/dist/types/types/submit.d.ts +14 -0
  155. package/dist/types/types/submit.d.ts.map +1 -1
  156. package/dist/types/utils/index.d.ts +3 -3
  157. package/dist/types/utils/index.d.ts.map +1 -1
  158. package/dist/types/utils/mapFill.d.ts +1 -1
  159. package/dist/types/utils/mapFill.d.ts.map +1 -1
  160. package/dist/types/utils/mapOpenPositions.d.ts +17 -3
  161. package/dist/types/utils/mapOpenPositions.d.ts.map +1 -1
  162. package/dist/types/utils/mapOrder.d.ts +6 -2
  163. package/dist/types/utils/mapOrder.d.ts.map +1 -1
  164. package/dist/types/utils/mapPortfolioHistory.d.ts +6 -3
  165. package/dist/types/utils/mapPortfolioHistory.d.ts.map +1 -1
  166. package/dist/types/utils/mapPosition.d.ts +12 -9
  167. package/dist/types/utils/mapPosition.d.ts.map +1 -1
  168. package/dist/types/utils/rowTimestamp.d.ts +6 -0
  169. package/dist/types/utils/rowTimestamp.d.ts.map +1 -0
  170. package/dist/types/utils/settlementPool.d.ts +2 -3
  171. package/dist/types/utils/settlementPool.d.ts.map +1 -1
  172. package/dist/types/utils/spotPrice.d.ts +3 -4
  173. package/dist/types/utils/spotPrice.d.ts.map +1 -1
  174. package/dist/types/utils/time.d.ts +10 -2
  175. package/dist/types/utils/time.d.ts.map +1 -1
  176. package/dist/types/utils/transferMargin.d.ts.map +1 -1
  177. package/dist/types/utils/withdrawableBalances.d.ts +5 -3
  178. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
  179. package/dist/types/utils/withdrawalTypes.d.ts +45 -0
  180. package/dist/types/utils/withdrawalTypes.d.ts.map +1 -0
  181. package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -1
  182. package/dist/types/websocket/orderBookSide.d.ts +33 -0
  183. package/dist/types/websocket/orderBookSide.d.ts.map +1 -0
  184. package/package.json +3 -3
  185. package/src/LighterProvider.ts +236 -100
  186. package/src/accountSummary.ts +41 -22
  187. package/src/availableToTrade.ts +38 -15
  188. package/src/signers/LighterSigner.ts +11 -4
  189. package/src/types/submit.ts +15 -0
  190. package/src/utils/index.ts +9 -3
  191. package/src/utils/mapFill.ts +82 -43
  192. package/src/utils/mapOpenPositions.ts +45 -6
  193. package/src/utils/mapOrder.ts +99 -28
  194. package/src/utils/mapPortfolioHistory.ts +78 -24
  195. package/src/utils/mapPosition.ts +63 -47
  196. package/src/utils/rowTimestamp.ts +15 -0
  197. package/src/utils/settlementPool.ts +36 -12
  198. package/src/utils/spotPrice.ts +18 -12
  199. package/src/utils/time.ts +14 -4
  200. package/src/utils/transferMargin.ts +32 -15
  201. package/src/utils/withdrawableBalances.ts +34 -20
  202. package/src/utils/withdrawalTypes.ts +125 -0
  203. package/src/websocket/LighterWsProvider.ts +75 -92
  204. package/src/websocket/orderBookSide.ts +106 -0
  205. package/dist/cjs/utils/decimal.d.ts +0 -5
  206. package/dist/cjs/utils/decimal.d.ts.map +0 -1
  207. package/dist/cjs/utils/decimal.js +0 -38
  208. package/dist/cjs/utils/decimal.js.map +0 -1
  209. package/dist/cjs/utils/liquidation.d.ts +0 -4
  210. package/dist/cjs/utils/liquidation.d.ts.map +0 -1
  211. package/dist/cjs/utils/liquidation.js +0 -16
  212. package/dist/cjs/utils/liquidation.js.map +0 -1
  213. package/dist/esm/utils/decimal.d.ts +0 -15
  214. package/dist/esm/utils/decimal.d.ts.map +0 -1
  215. package/dist/esm/utils/decimal.js +0 -39
  216. package/dist/esm/utils/decimal.js.map +0 -1
  217. package/dist/esm/utils/liquidation.d.ts +0 -22
  218. package/dist/esm/utils/liquidation.d.ts.map +0 -1
  219. package/dist/esm/utils/liquidation.js +0 -31
  220. package/dist/esm/utils/liquidation.js.map +0 -1
  221. package/dist/types/utils/decimal.d.ts +0 -15
  222. package/dist/types/utils/decimal.d.ts.map +0 -1
  223. package/dist/types/utils/liquidation.d.ts +0 -22
  224. package/dist/types/utils/liquidation.d.ts.map +0 -1
  225. package/src/utils/decimal.ts +0 -52
  226. 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 Big from 'big.js';
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) => new Big(notional)
19
- .times(new Big(ownTick).plus(integratorTick ?? 0))
20
- .div(LIGHTER_FEE_TICK_SCALE)
21
- .toFixed();
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 closed portion realizes
32
- * exactly zero — mirroring the Hyperliquid mapper's `null`-for-zero convention.
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
- const start = new Big(startPosition);
39
- if (start.eq(0)) {
49
+ if (isDecimalStringZero(startPosition)) {
40
50
  return undefined;
41
51
  }
42
- const isLong = start.gt(0);
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 = start.abs();
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 = fill.gt(absStart) ? absStart : fill;
52
- const avgEntry = new Big(entryQuoteBefore).abs().div(absStart);
53
- const price = new Big(fillPrice);
54
- const pnl = isLong
55
- ? price.minus(avgEntry).times(closedSize)
56
- : avgEntry.minus(price).times(closedSize);
57
- return pnl.eq(0) ? null : pnl.toFixed();
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: trade.size,
91
- price: trade.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: feeTick === undefined
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, trade.size, trade.price, isBuyer),
119
+ realizedPnl: deriveRealizedPnl(startPosition, entryQuoteBefore, size, price, isBuyer),
102
120
  startPosition,
103
- // `classifyFillFromPosition` takes an HL-encoded side: `'B'` for buy,
104
- // anything else for sell.
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":"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"}
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 { PerpsMarketDisplay, Position } from '@lifi/perps-types';
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 carrying the full position set —
6
- * dropping zeros from a partial frame would make closes unobservable.
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":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG1D;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,iBAAiB,EAAE,EAC9B,eAAe,CAAC,QAAQ,EAAE,MAAM,KAAK,kBAAkB,KACtD,QAAQ,EAGgD,CAAA"}
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 carrying the full position set —
5
- * dropping zeros from a partial frame would make closes unobservable.
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
- .filter((p) => Number.parseFloat(p.position) !== 0)
11
- .map((p) => mapPosition(p, resolveMarket(p.market_id)));
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":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,SAA8B,EAC9B,aAAuD,EAC3C,EAAE,CACd,SAAS;KACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA"}
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
- /** Map a Lighter order with its venue identity, lifecycle, and execution fields. */
4
- export declare const mapOrder: (order: LtOrder, market: MarketDisplay) => Order;
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":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAa,MAAM,mBAAmB,CAAA;AASxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAqFhD,oFAAoF;AACpF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,EAAE,QAAQ,aAAa,KAAG,KA8DhE,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
+ {"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 Big from 'big.js';
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 mapOrderStatus = (order, filledSize = new Big(order.filled_base_amount)) => {
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 filledSize.gt(0) ? OrderStatus.PARTIALLY_FILLED : OrderStatus.OPEN;
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
- /** Map a Lighter order with its venue identity, lifecycle, and execution fields. */
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 filledSize = new Big(order.filled_base_amount);
76
- const status = mapOrderStatus(order, filledSize);
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: order.initial_base_amount,
87
- remainingSize: order.remaining_base_amount,
88
- filledSize: order.filled_base_amount,
89
- ...(filledSize.gt(0)
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: new Date(order.created_at * 1000).toISOString(),
99
- updatedAt: new Date(order.updated_at * 1000).toISOString(),
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
- ...(order.order_expiry > 0
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":"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"}
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: Big) => PortfolioHistoryResponse;
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":"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
+ {"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 Big from 'big.js';
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 new Big(snapshot.trade_pnl).plus(snapshot.trade_spot_pnl);
22
+ return addDecimalString(snapshotDecimal(snapshot, 'trade_pnl'), snapshotDecimal(snapshot, 'trade_spot_pnl'));
4
23
  }
5
24
  function getCumulativeNetFlow(snapshot) {
6
- return new Big(snapshot.inflow)
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 = [...snapshots].sort((a, b) => a.timestamp - b.timestamp);
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
- .plus(pnl)
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: new Big(latestSnapshot.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":"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"}
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` before
6
- * conversion to `number`, so the value a client reads is the value it saved.
7
- * Provider risk calculations consume the original decimal IMF instead.
8
- * `undefined` for a non-positive or unparsable IMF.
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) => number | undefined;
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 unparsable IMF. Lighter declares the
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) => number | undefined;
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