@lifi/perps-sdk-provider-lighter 30.0.0 → 31.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/cjs/LighterProvider.d.ts.map +1 -1
  2. package/dist/cjs/LighterProvider.js +62 -54
  3. package/dist/cjs/LighterProvider.js.map +1 -1
  4. package/dist/cjs/accountSummary.d.ts +4 -1
  5. package/dist/cjs/accountSummary.d.ts.map +1 -1
  6. package/dist/cjs/accountSummary.js +8 -7
  7. package/dist/cjs/accountSummary.js.map +1 -1
  8. package/dist/cjs/availableToTrade.d.ts +2 -0
  9. package/dist/cjs/availableToTrade.d.ts.map +1 -1
  10. package/dist/cjs/availableToTrade.js +6 -7
  11. package/dist/cjs/availableToTrade.js.map +1 -1
  12. package/dist/cjs/types/pnl.d.ts.map +1 -1
  13. package/dist/cjs/types/ws.d.ts +5 -0
  14. package/dist/cjs/types/ws.d.ts.map +1 -1
  15. package/dist/cjs/utils/apiClient.d.ts +3 -2
  16. package/dist/cjs/utils/apiClient.d.ts.map +1 -1
  17. package/dist/cjs/utils/apiClient.js +5 -3
  18. package/dist/cjs/utils/apiClient.js.map +1 -1
  19. package/dist/cjs/utils/fetchDetailedAccount.d.ts +1 -1
  20. package/dist/cjs/utils/fetchDetailedAccount.d.ts.map +1 -1
  21. package/dist/cjs/utils/fetchDetailedAccount.js +2 -1
  22. package/dist/cjs/utils/fetchDetailedAccount.js.map +1 -1
  23. package/dist/cjs/utils/mapFill.d.ts.map +1 -1
  24. package/dist/cjs/utils/mapFill.js +1 -3
  25. package/dist/cjs/utils/mapFill.js.map +1 -1
  26. package/dist/cjs/utils/mapPortfolioHistory.d.ts +1 -1
  27. package/dist/cjs/utils/mapPortfolioHistory.d.ts.map +1 -1
  28. package/dist/cjs/utils/mapPortfolioHistory.js +36 -21
  29. package/dist/cjs/utils/mapPortfolioHistory.js.map +1 -1
  30. package/dist/cjs/utils/mapPosition.d.ts +1 -0
  31. package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
  32. package/dist/cjs/utils/mapPosition.js +13 -1
  33. package/dist/cjs/utils/mapPosition.js.map +1 -1
  34. package/dist/cjs/utils/ohlcvInterval.d.ts.map +1 -1
  35. package/dist/cjs/utils/ohlcvInterval.js.map +1 -1
  36. package/dist/cjs/utils/spotPrice.d.ts +5 -1
  37. package/dist/cjs/utils/spotPrice.d.ts.map +1 -1
  38. package/dist/cjs/utils/spotPrice.js +14 -1
  39. package/dist/cjs/utils/spotPrice.js.map +1 -1
  40. package/dist/cjs/utils/withdrawableBalances.d.ts +3 -3
  41. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
  42. package/dist/cjs/utils/withdrawableBalances.js +11 -3
  43. package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
  44. package/dist/cjs/websocket/LighterWsProvider.d.ts +6 -0
  45. package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -1
  46. package/dist/cjs/websocket/LighterWsProvider.js +120 -9
  47. package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
  48. package/dist/esm/LighterProvider.d.ts.map +1 -1
  49. package/dist/esm/LighterProvider.js +71 -61
  50. package/dist/esm/LighterProvider.js.map +1 -1
  51. package/dist/esm/accountSummary.d.ts +17 -3
  52. package/dist/esm/accountSummary.d.ts.map +1 -1
  53. package/dist/esm/accountSummary.js +18 -9
  54. package/dist/esm/accountSummary.js.map +1 -1
  55. package/dist/esm/availableToTrade.d.ts +2 -0
  56. package/dist/esm/availableToTrade.d.ts.map +1 -1
  57. package/dist/esm/availableToTrade.js +4 -6
  58. package/dist/esm/availableToTrade.js.map +1 -1
  59. package/dist/esm/types/pnl.d.ts +2 -3
  60. package/dist/esm/types/pnl.d.ts.map +1 -1
  61. package/dist/esm/types/ws.d.ts +13 -0
  62. package/dist/esm/types/ws.d.ts.map +1 -1
  63. package/dist/esm/types/ws.js +0 -11
  64. package/dist/esm/types/ws.js.map +1 -1
  65. package/dist/esm/utils/apiClient.d.ts +9 -2
  66. package/dist/esm/utils/apiClient.d.ts.map +1 -1
  67. package/dist/esm/utils/apiClient.js +9 -2
  68. package/dist/esm/utils/apiClient.js.map +1 -1
  69. package/dist/esm/utils/fetchDetailedAccount.d.ts +1 -1
  70. package/dist/esm/utils/fetchDetailedAccount.d.ts.map +1 -1
  71. package/dist/esm/utils/fetchDetailedAccount.js +2 -1
  72. package/dist/esm/utils/fetchDetailedAccount.js.map +1 -1
  73. package/dist/esm/utils/mapFill.d.ts.map +1 -1
  74. package/dist/esm/utils/mapFill.js +6 -10
  75. package/dist/esm/utils/mapFill.js.map +1 -1
  76. package/dist/esm/utils/mapPortfolioHistory.d.ts +3 -6
  77. package/dist/esm/utils/mapPortfolioHistory.d.ts.map +1 -1
  78. package/dist/esm/utils/mapPortfolioHistory.js +38 -26
  79. package/dist/esm/utils/mapPortfolioHistory.js.map +1 -1
  80. package/dist/esm/utils/mapPosition.d.ts +7 -0
  81. package/dist/esm/utils/mapPosition.d.ts.map +1 -1
  82. package/dist/esm/utils/mapPosition.js +17 -0
  83. package/dist/esm/utils/mapPosition.js.map +1 -1
  84. package/dist/esm/utils/ohlcvInterval.d.ts.map +1 -1
  85. package/dist/esm/utils/ohlcvInterval.js +5 -3
  86. package/dist/esm/utils/ohlcvInterval.js.map +1 -1
  87. package/dist/esm/utils/spotPrice.d.ts +10 -1
  88. package/dist/esm/utils/spotPrice.d.ts.map +1 -1
  89. package/dist/esm/utils/spotPrice.js +14 -0
  90. package/dist/esm/utils/spotPrice.js.map +1 -1
  91. package/dist/esm/utils/withdrawableBalances.d.ts +12 -5
  92. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
  93. package/dist/esm/utils/withdrawableBalances.js +17 -5
  94. package/dist/esm/utils/withdrawableBalances.js.map +1 -1
  95. package/dist/esm/websocket/LighterWsProvider.d.ts +24 -0
  96. package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -1
  97. package/dist/esm/websocket/LighterWsProvider.js +153 -15
  98. package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
  99. package/dist/types/LighterProvider.d.ts.map +1 -1
  100. package/dist/types/accountSummary.d.ts +17 -3
  101. package/dist/types/accountSummary.d.ts.map +1 -1
  102. package/dist/types/availableToTrade.d.ts +2 -0
  103. package/dist/types/availableToTrade.d.ts.map +1 -1
  104. package/dist/types/types/pnl.d.ts +2 -3
  105. package/dist/types/types/pnl.d.ts.map +1 -1
  106. package/dist/types/types/ws.d.ts +13 -0
  107. package/dist/types/types/ws.d.ts.map +1 -1
  108. package/dist/types/utils/apiClient.d.ts +9 -2
  109. package/dist/types/utils/apiClient.d.ts.map +1 -1
  110. package/dist/types/utils/fetchDetailedAccount.d.ts +1 -1
  111. package/dist/types/utils/fetchDetailedAccount.d.ts.map +1 -1
  112. package/dist/types/utils/mapFill.d.ts.map +1 -1
  113. package/dist/types/utils/mapPortfolioHistory.d.ts +3 -6
  114. package/dist/types/utils/mapPortfolioHistory.d.ts.map +1 -1
  115. package/dist/types/utils/mapPosition.d.ts +7 -0
  116. package/dist/types/utils/mapPosition.d.ts.map +1 -1
  117. package/dist/types/utils/ohlcvInterval.d.ts.map +1 -1
  118. package/dist/types/utils/spotPrice.d.ts +10 -1
  119. package/dist/types/utils/spotPrice.d.ts.map +1 -1
  120. package/dist/types/utils/withdrawableBalances.d.ts +12 -5
  121. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
  122. package/dist/types/websocket/LighterWsProvider.d.ts +24 -0
  123. package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -1
  124. package/package.json +3 -3
  125. package/src/LighterProvider.ts +119 -74
  126. package/src/accountSummary.ts +37 -14
  127. package/src/availableToTrade.ts +6 -10
  128. package/src/types/pnl.ts +2 -3
  129. package/src/types/ws.ts +23 -0
  130. package/src/utils/apiClient.ts +16 -7
  131. package/src/utils/fetchDetailedAccount.ts +2 -2
  132. package/src/utils/mapFill.ts +6 -13
  133. package/src/utils/mapPortfolioHistory.ts +42 -27
  134. package/src/utils/mapPosition.ts +17 -0
  135. package/src/utils/ohlcvInterval.ts +5 -3
  136. package/src/utils/spotPrice.ts +21 -1
  137. package/src/utils/withdrawableBalances.ts +26 -7
  138. package/src/websocket/LighterWsProvider.ts +222 -14
@@ -1,8 +1,8 @@
1
1
  import { classifyFillFromPosition, ExplorerChainId, explorerTxUrl, } from '@lifi/perps-sdk';
2
2
  import { LiquidityRole, OrderSide, OrderType } from '@lifi/perps-types';
3
3
  import Big from 'big.js';
4
- import { LIGHTER_FEE_TICK_SCALE, LIGHTER_IMF_PERCENT_SCALE, } from '../constants.js';
5
- import { leverageFromImf } from './mapPosition.js';
4
+ import { LIGHTER_FEE_TICK_SCALE } from '../constants.js';
5
+ import { leverageFromScaledImf } from './mapPosition.js';
6
6
  import { isPlaceholderTxHash } from './txHash.js';
7
7
  /**
8
8
  * Fee charged on a fill, in the market's quote asset. Lighter publishes the
@@ -20,15 +20,11 @@ const tickToFeeAmount = (notional, ownTick, integratorTick) => new Big(notional)
20
20
  .div(LIGHTER_FEE_TICK_SCALE)
21
21
  .toFixed();
22
22
  /**
23
- * Display leverage the viewer had set on the market when the trade executed.
24
- * Lighter reports it as the pre-trade initial margin fraction, an integer
25
- * percent on `LIGHTER_IMF_PERCENT_SCALE`: `500` is 5.00%, so 20x. Returns
26
- * `undefined` when the row omits the fraction. Lighter declares the fraction a
27
- * `StrictInt`, so the scale division is exact and `toFixed()` loses nothing.
23
+ * Display leverage the viewer had set on the market when the trade executed,
24
+ * from the pre-trade initial margin fraction. Returns `undefined` when the
25
+ * row omits the fraction.
28
26
  */
29
- const leverageFromTradeImf = (imf) => imf === undefined
30
- ? undefined
31
- : leverageFromImf(new Big(imf).div(LIGHTER_IMF_PERCENT_SCALE).toFixed());
27
+ const leverageFromTradeImf = (imf) => imf === undefined ? undefined : leverageFromScaledImf(imf);
32
28
  /**
33
29
  * Realized PnL on a position-reducing fill, derived from the pre-trade entry
34
30
  * basis. Returns `undefined` for opens/increases (nothing closes) or when the
@@ -1 +1 @@
1
- {"version":3,"file":"mapFill.js","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapFill.js","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,8 @@ import type { PortfolioHistoryRange, PortfolioHistoryResponse } from '@lifi/perp
2
2
  import Big from 'big.js';
3
3
  import type { LtPnLEntry } from '../types/pnl.js';
4
4
  /**
5
- * Build the portfolio series from Lighter PnL buckets and the account's
6
- * current value. Lighter reports no historical account value, so each
7
- * point's `accountValue` is `currentValue` with every later bucket's
8
- * `trade_pnl + trade_spot_pnl + inflow - outflow` removed. `pnl` is the
9
- * running `trade_pnl + trade_spot_pnl`, so both series unwind the same PnL.
5
+ * Derive window-relative history from Lighter's cumulative PnL snapshots.
6
+ * Historical account values are anchored to the current account value.
10
7
  */
11
- export declare const mapPortfolioHistory: (range: PortfolioHistoryRange, entries: LtPnLEntry[], currentValue: Big) => PortfolioHistoryResponse;
8
+ export declare const mapPortfolioHistory: (range: PortfolioHistoryRange, snapshots: LtPnLEntry[], currentValue: Big) => PortfolioHistoryResponse;
12
9
  //# sourceMappingURL=mapPortfolioHistory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapPortfolioHistory.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,qBAAqB,EAC5B,SAAS,UAAU,EAAE,EACrB,cAAc,GAAG,KAChB,wBAiCF,CAAA"}
1
+ {"version":3,"file":"mapPortfolioHistory.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAajD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,qBAAqB,EAC5B,WAAW,UAAU,EAAE,EACvB,cAAc,GAAG,KAChB,wBAwCF,CAAA"}
@@ -1,39 +1,51 @@
1
1
  import Big from 'big.js';
2
+ function getCumulativePnl(snapshot) {
3
+ return new Big(snapshot.trade_pnl).plus(snapshot.trade_spot_pnl);
4
+ }
5
+ function getCumulativeNetFlow(snapshot) {
6
+ return new Big(snapshot.inflow)
7
+ .minus(snapshot.outflow)
8
+ .plus(snapshot.spot_inflow)
9
+ .minus(snapshot.spot_outflow);
10
+ }
2
11
  /**
3
- * Build the portfolio series from Lighter PnL buckets and the account's
4
- * current value. Lighter reports no historical account value, so each
5
- * point's `accountValue` is `currentValue` with every later bucket's
6
- * `trade_pnl + trade_spot_pnl + inflow - outflow` removed. `pnl` is the
7
- * running `trade_pnl + trade_spot_pnl`, so both series unwind the same PnL.
12
+ * Derive window-relative history from Lighter's cumulative PnL snapshots.
13
+ * Historical account values are anchored to the current account value.
8
14
  */
9
- export const mapPortfolioHistory = (range, entries, currentValue) => {
10
- const ordered = [...entries].sort((a, b) => a.timestamp - b.timestamp);
11
- const accountValues = [];
12
- let value = currentValue;
13
- for (let i = ordered.length - 1; i >= 0; i -= 1) {
14
- accountValues[i] = value;
15
- const entry = ordered[i];
16
- value = value
17
- .minus(new Big(entry.trade_pnl))
18
- .minus(new Big(entry.trade_spot_pnl))
19
- .minus(new Big(entry.inflow))
20
- .plus(new Big(entry.outflow));
15
+ export const mapPortfolioHistory = (range, snapshots, currentValue) => {
16
+ const orderedSnapshots = [...snapshots].sort((a, b) => a.timestamp - b.timestamp);
17
+ const firstSnapshot = orderedSnapshots[0];
18
+ const latestSnapshot = orderedSnapshots.at(-1);
19
+ if (!firstSnapshot || !latestSnapshot) {
20
+ return {
21
+ range,
22
+ points: [],
23
+ volume: '0',
24
+ totalPnl: undefined,
25
+ };
21
26
  }
22
- let pnl = new Big(0);
23
- let volume = new Big(0);
24
- const points = ordered.map((entry, i) => {
25
- pnl = pnl.plus(new Big(entry.trade_pnl)).plus(new Big(entry.trade_spot_pnl));
26
- volume = volume.plus(new Big(entry.volume));
27
+ const firstPnl = getCumulativePnl(firstSnapshot);
28
+ const latestPnl = getCumulativePnl(latestSnapshot);
29
+ const accountValueOffset = currentValue
30
+ .minus(latestPnl)
31
+ .minus(getCumulativeNetFlow(latestSnapshot));
32
+ const points = orderedSnapshots.map((snapshot) => {
33
+ const pnl = getCumulativePnl(snapshot);
27
34
  return {
28
- timestamp: entry.timestamp,
29
- accountValue: accountValues[i].toFixed(),
30
- pnl: pnl.toFixed(),
35
+ timestamp: snapshot.timestamp * 1_000,
36
+ accountValue: accountValueOffset
37
+ .plus(pnl)
38
+ .plus(getCumulativeNetFlow(snapshot))
39
+ .toFixed(),
40
+ pnl: pnl.minus(firstPnl).toFixed(),
31
41
  };
32
42
  });
33
43
  return {
34
44
  range,
35
45
  points,
36
- volume: volume.toFixed(),
46
+ volume: new Big(latestSnapshot.volume)
47
+ .minus(firstSnapshot.volume)
48
+ .toFixed(),
37
49
  totalPnl: points.at(-1)?.pnl,
38
50
  };
39
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mapPortfolioHistory.js","sourceRoot":"","sources":["../../../src/utils/mapPortfolioHistory.ts"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,QAAQ,CAAA;AAGxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAA4B,EAC5B,OAAqB,EACrB,YAAiB,EACS,EAAE;IAC5B,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;IAEtE,MAAM,aAAa,GAAU,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAG,YAAY,CAAA;IACxB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;QACxB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACxB,KAAK,GAAG,KAAK;aACV,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;aAC/B,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;aACpC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;aAC5B,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IACpB,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACtC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAA;QAC5E,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3C,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;YACxC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE;SACnB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE;QACxB,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":"AAIA,OAAO,GAAG,MAAM,QAAQ,CAAA;AAGxB,SAAS,gBAAgB,CAAC,QAAoB;IAC5C,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;AAClE,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAoB;IAChD,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;SAC5B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;SACvB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;SAC1B,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAA4B,EAC5B,SAAuB,EACvB,YAAiB,EACS,EAAE;IAC5B,MAAM,gBAAgB,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CACpC,CAAA;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IACzC,MAAM,cAAc,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,OAAO;YACL,KAAK;YACL,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,SAAS;SACpB,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAA;IAClD,MAAM,kBAAkB,GAAG,YAAY;SACpC,KAAK,CAAC,SAAS,CAAC;SAChB,KAAK,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACtC,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAG,KAAK;YACrC,YAAY,EAAE,kBAAkB;iBAC7B,IAAI,CAAC,GAAG,CAAC;iBACT,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;iBACpC,OAAO,EAAE;YACZ,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;SACnC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,MAAM;QACN,MAAM,EAAE,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;aACnC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;aAC3B,OAAO,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG;KAC7B,CAAA;AACH,CAAC,CAAA"}
@@ -8,6 +8,13 @@ import type { LtAccountPosition } from '../types/index.js';
8
8
  * @public
9
9
  */
10
10
  export declare const leverageFromImf: (imf: string) => number | undefined;
11
+ /**
12
+ * Display leverage from an integer IMF on `LIGHTER_IMF_PERCENT_SCALE`, the
13
+ * unit of trade rows and order-book details: `500` is 5.00%, so 20x.
14
+ * `undefined` for a non-positive or unparsable IMF. Lighter declares the
15
+ * fraction a `StrictInt`, so the scale division is exact.
16
+ */
17
+ export declare const leverageFromScaledImf: (imf: number) => number | undefined;
11
18
  /**
12
19
  * Map a raw Lighter account position to the generic Position type.
13
20
  * @param market - Backend-resolved market identity for `pos.market_id`.
@@ -1 +1 @@
1
- {"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAI1D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAWtD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,QAAQ,kBAAkB,KACzB,QAiCF,CAAA"}
1
+ {"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAIrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAI1D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAWtD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAQ5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,QAAQ,kBAAkB,KACzB,QAiCF,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { MarginMode, PositionSide } from '@lifi/perps-types';
2
2
  import Big from 'big.js';
3
+ import { LIGHTER_IMF_PERCENT_SCALE } from '../constants.js';
3
4
  import { LT_MARGIN_MODE_ISOLATED } from '../types/index.js';
4
5
  import { toPositiveRequiredBig, toRequiredBig } from './decimal.js';
5
6
  /**
@@ -22,6 +23,22 @@ export const leverageFromImf = (imf) => {
22
23
  }
23
24
  return new Big(100).div(parsed).toNumber();
24
25
  };
26
+ /**
27
+ * Display leverage from an integer IMF on `LIGHTER_IMF_PERCENT_SCALE`, the
28
+ * unit of trade rows and order-book details: `500` is 5.00%, so 20x.
29
+ * `undefined` for a non-positive or unparsable IMF. Lighter declares the
30
+ * fraction a `StrictInt`, so the scale division is exact.
31
+ */
32
+ export const leverageFromScaledImf = (imf) => {
33
+ let percent;
34
+ try {
35
+ percent = new Big(imf).div(LIGHTER_IMF_PERCENT_SCALE).toFixed();
36
+ }
37
+ catch {
38
+ return undefined;
39
+ }
40
+ return leverageFromImf(percent);
41
+ };
25
42
  /**
26
43
  * Map a raw Lighter account position to the generic Position type.
27
44
  * @param market - Backend-resolved market identity for `pos.market_id`.
@@ -1 +1 @@
1
- {"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAsB,EAAE;IACjE,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC5C,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,GAAsB,EACtB,MAA0B,EAChB,EAAE;IACZ,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,KAAK,uBAAuB,CAAA;IAC9D,MAAM,aAAa,GAAG,aAAa,CACjC,GAAG,CAAC,cAAc,EAClB,gBAAgB,CACjB,CAAC,GAAG,EAAE,CAAA;IACP,MAAM,GAAG,GAAG,qBAAqB,CAC/B,GAAG,CAAC,uBAAuB,EAC3B,yBAAyB,CAC1B,CAAA;IACD,MAAM,wBAAwB,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAClE,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,GAAG,CAAC,gBAAgB;QACtB,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAA;IAEtC,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK;QAC5D,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;QAC1B,UAAU,EAAE,GAAG,CAAC,eAAe;QAC/B,SAAS,EACP,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;QAC7C,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;QACvC,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,cAAc,EAAE,GAAG,CAAC,sBAAsB,IAAI,GAAG;QACjD,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC;QAC3D,UAAU;QACV,wBAAwB,EAAE,wBAAwB,CAAC,OAAO,EAAE;QAC5D,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK;KAChE,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAE3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAsB,EAAE;IACjE,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC5C,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAsB,EAAE;IACvE,IAAI,OAAe,CAAA;IACnB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,OAAO,EAAE,CAAA;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,GAAsB,EACtB,MAA0B,EAChB,EAAE;IACZ,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,KAAK,uBAAuB,CAAA;IAC9D,MAAM,aAAa,GAAG,aAAa,CACjC,GAAG,CAAC,cAAc,EAClB,gBAAgB,CACjB,CAAC,GAAG,EAAE,CAAA;IACP,MAAM,GAAG,GAAG,qBAAqB,CAC/B,GAAG,CAAC,uBAAuB,EAC3B,yBAAyB,CAC1B,CAAA;IACD,MAAM,wBAAwB,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAClE,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,GAAG,CAAC,gBAAgB;QACtB,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAA;IAEtC,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK;QAC5D,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;QAC1B,UAAU,EAAE,GAAG,CAAC,eAAe;QAC/B,SAAS,EACP,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;QAC7C,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;QACvC,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,cAAc,EAAE,GAAG,CAAC,sBAAsB,IAAI,GAAG;QACjD,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC;QAC3D,UAAU;QACV,wBAAwB,EAAE,wBAAwB,CAAC,OAAO,EAAE;QAC5D,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK;KAChE,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ohlcvInterval.d.ts","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAqBtD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,UAAU,aAAa,KAAG,MAUrD,CAAA"}
1
+ {"version":3,"file":"ohlcvInterval.d.ts","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAuBtD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,UAAU,aAAa,KAAG,MAUrD,CAAA"}
@@ -3,9 +3,11 @@ import { PerpsErrorCode } from '@lifi/perps-types';
3
3
  /**
4
4
  * Map our `OhlcvInterval` literal to Lighter's `resolution` enum.
5
5
  *
6
- * Lighter exposes only the timeframes listed below. SDK intervals without a
7
- * direct match (3m, 2h, 8h, 3d, 1w, 1M) raise a validation error rather than
8
- * silently rounding — the caller picks a supported timeframe.
6
+ * The keys are exactly the `resolution` enum of Lighter's `GET /api/v1/candles`.
7
+ * Lighter has no weekly candle (its API answers `1w` with code 20001,
8
+ * `invalid param`), so `1w` stays out. SDK intervals without a direct match
9
+ * (3m, 2h, 8h, 3d, 1w, 1M) raise a validation error rather than silently
10
+ * rounding — the caller picks a supported timeframe.
9
11
  */
10
12
  const LIGHTER_SUPPORTED_INTERVALS = {
11
13
  '1m': '1m',
@@ -1 +1 @@
1
- {"version":3,"file":"ohlcvInterval.js","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,2BAA2B,GAA2C;IAC1E,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;CACX,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAuB,EAAU,EAAE;IAC7D,MAAM,UAAU,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,4CAA4C,QAAQ,KAAK;YACvD,cAAc,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvE,CAAA;IACH,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA"}
1
+ {"version":3,"file":"ohlcvInterval.js","sourceRoot":"","sources":["../../../src/utils/ohlcvInterval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;;;;;GAQG;AACH,MAAM,2BAA2B,GAA2C;IAC1E,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;CACX,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAuB,EAAU,EAAE;IAC7D,MAAM,UAAU,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,4CAA4C,QAAQ,KAAK;YACvD,cAAc,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvE,CAAA;IACH,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import type { Market, MarketContext } from '@lifi/perps-types';
2
- import type Big from 'big.js';
2
+ import Big from 'big.js';
3
3
  /**
4
4
  * Unit prices keyed by spot base `Asset.id` (the venue `asset_id`), read from
5
5
  * each spot market's `markPrice` for the base assets in `assetIds` only. A
@@ -11,4 +11,13 @@ import type Big from 'big.js';
11
11
  * carries a non-decimal mark.
12
12
  */
13
13
  export declare const spotPriceByAssetId: (markets: readonly Market[], spotCategoryId: string, contexts: readonly MarketContext[], assetIds: ReadonlySet<string>) => Map<string, Big>;
14
+ /**
15
+ * USD value of `units` of a Lighter asset, with the unit price it used: the
16
+ * settlement asset at 1, any other at its `spotPrices` entry. An asset absent
17
+ * from `spotPrices` values at 0 and carries no price.
18
+ */
19
+ export declare const spotValuation: (assetId: number, units: string, settlementAssetIndex: number, spotPrices: ReadonlyMap<string, Big>) => {
20
+ valueUsd: string;
21
+ price?: Big;
22
+ };
14
23
  //# sourceMappingURL=spotPrice.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spotPrice.d.ts","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,GAAG,MAAM,QAAQ,CAAA;AAG7B;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,SAAS,MAAM,EAAE,EAC1B,gBAAgB,MAAM,EACtB,UAAU,SAAS,aAAa,EAAE,EAClC,UAAU,WAAW,CAAC,MAAM,CAAC,KAC5B,GAAG,CAAC,MAAM,EAAE,GAAG,CAmBjB,CAAA"}
1
+ {"version":3,"file":"spotPrice.d.ts","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,GAAG,MAAM,QAAQ,CAAA;AAGxB;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,SAAS,MAAM,EAAE,EAC1B,gBAAgB,MAAM,EACtB,UAAU,SAAS,aAAa,EAAE,EAClC,UAAU,WAAW,CAAC,MAAM,CAAC,KAC5B,GAAG,CAAC,MAAM,EAAE,GAAG,CAmBjB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,MAAM,EACf,OAAO,MAAM,EACb,sBAAsB,MAAM,EAC5B,YAAY,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,KACnC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAQjC,CAAA"}
@@ -1,3 +1,4 @@
1
+ import Big from 'big.js';
1
2
  import { toRequiredBig } from './decimal.js';
2
3
  /**
3
4
  * Unit prices keyed by spot base `Asset.id` (the venue `asset_id`), read from
@@ -27,4 +28,17 @@ export const spotPriceByAssetId = (markets, spotCategoryId, contexts, assetIds)
27
28
  }
28
29
  return priceByAssetId;
29
30
  };
31
+ /**
32
+ * USD value of `units` of a Lighter asset, with the unit price it used: the
33
+ * settlement asset at 1, any other at its `spotPrices` entry. An asset absent
34
+ * from `spotPrices` values at 0 and carries no price.
35
+ */
36
+ export const spotValuation = (assetId, units, settlementAssetIndex, spotPrices) => {
37
+ const price = assetId === settlementAssetIndex
38
+ ? new Big(1)
39
+ : spotPrices.get(String(assetId));
40
+ return price === undefined
41
+ ? { valueUsd: '0' }
42
+ : { valueUsd: new Big(units).times(price).toFixed(), price };
43
+ };
30
44
  //# sourceMappingURL=spotPrice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spotPrice.js","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAA0B,EAC1B,cAAsB,EACtB,QAAkC,EAClC,QAA6B,EACX,EAAE;IACpB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAe,CAAA;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC1C,IACE,MAAM,CAAC,UAAU,KAAK,cAAc;YACpC,IAAI,KAAK,SAAS;YAClB,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EACvC,CAAC;YACD,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAC9C,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC,CAAA"}
1
+ {"version":3,"file":"spotPrice.js","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAA0B,EAC1B,cAAsB,EACtB,QAAkC,EAClC,QAA6B,EACX,EAAE;IACpB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAe,CAAA;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC1C,IACE,MAAM,CAAC,UAAU,KAAK,cAAc;YACpC,IAAI,KAAK,SAAS;YAClB,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EACvC,CAAC;YACD,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAC9C,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAe,EACf,KAAa,EACb,oBAA4B,EAC5B,UAAoC,EACD,EAAE;IACrC,MAAM,KAAK,GACT,OAAO,KAAK,oBAAoB;QAC9B,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IACrC,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;QACnB,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAA;AAChE,CAAC,CAAA"}
@@ -1,12 +1,19 @@
1
- import type { ProviderWithdrawableBalance } from '@lifi/perps-sdk';
2
- import type { LtAccountAsset } from '../types/account.js';
1
+ import { type ProviderWithdrawableBalance } from '@lifi/perps-sdk';
2
+ import type { LtAccount } from '../types/account.js';
3
3
  /**
4
4
  * Split each held asset into the two routes a Lighter withdrawal can name:
5
5
  * spot draws on `balance` net of `locked_balance`, perps draws on
6
- * `margin_balance`. Routes with nothing left to draw are dropped; the
7
- * per-asset venue minimum is applied by the caller holding the asset registry.
6
+ * `margin_balance`. The settlement asset's perps route is also capped by the
7
+ * account `available_balance`, which excludes the margin open positions use.
8
+ * Every other asset's perps route reports its full `margin_balance`, uncapped,
9
+ * although `getAccount` reports `transferable: '0'` for it: a category
10
+ * transfer moves only the settlement asset. Routes with nothing left to draw
11
+ * are dropped; the per-asset venue minimum is applied by the caller holding
12
+ * the asset registry.
8
13
  *
14
+ * @param settlementAssetIndex - L2 asset index of the deployment's collateral
15
+ * asset, the only asset that `available_balance` is denominated in.
9
16
  * @public
10
17
  */
11
- export declare const lighterWithdrawableBalances: (assets: LtAccountAsset[]) => ProviderWithdrawableBalance[];
18
+ export declare const lighterWithdrawableBalances: (account: Pick<LtAccount, "assets" | "available_balance">, settlementAssetIndex: number) => ProviderWithdrawableBalance[];
12
19
  //# sourceMappingURL=withdrawableBalances.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGzD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,GACtC,QAAQ,cAAc,EAAE,KACvB,2BAA2B,EAgB7B,CAAA"}
1
+ {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAEhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,mBAAmB,CAAC,EACxD,sBAAsB,MAAM,KAC3B,2BAA2B,EA0B7B,CAAA"}
@@ -1,21 +1,33 @@
1
+ import { maxOf, minOf } from '@lifi/perps-sdk';
2
+ import Big from 'big.js';
1
3
  import { toRequiredBig } from './decimal.js';
2
4
  /**
3
5
  * Split each held asset into the two routes a Lighter withdrawal can name:
4
6
  * spot draws on `balance` net of `locked_balance`, perps draws on
5
- * `margin_balance`. Routes with nothing left to draw are dropped; the
6
- * per-asset venue minimum is applied by the caller holding the asset registry.
7
+ * `margin_balance`. The settlement asset's perps route is also capped by the
8
+ * account `available_balance`, which excludes the margin open positions use.
9
+ * Every other asset's perps route reports its full `margin_balance`, uncapped,
10
+ * although `getAccount` reports `transferable: '0'` for it: a category
11
+ * transfer moves only the settlement asset. Routes with nothing left to draw
12
+ * are dropped; the per-asset venue minimum is applied by the caller holding
13
+ * the asset registry.
7
14
  *
15
+ * @param settlementAssetIndex - L2 asset index of the deployment's collateral
16
+ * asset, the only asset that `available_balance` is denominated in.
8
17
  * @public
9
18
  */
10
- export const lighterWithdrawableBalances = (assets) => {
19
+ export const lighterWithdrawableBalances = (account, settlementAssetIndex) => {
11
20
  const rows = [];
12
- for (const asset of assets) {
21
+ for (const asset of account.assets) {
13
22
  const assetId = String(asset.asset_id);
14
23
  const spot = toRequiredBig(asset.balance, 'balance').minus(toRequiredBig(asset.locked_balance, 'locked_balance'));
15
24
  if (spot.gt(0)) {
16
25
  rows.push({ assetId, route: 'spot', available: spot.toFixed() });
17
26
  }
18
- const perps = toRequiredBig(asset.margin_balance, 'margin_balance');
27
+ const marginBalance = toRequiredBig(asset.margin_balance, 'margin_balance');
28
+ const perps = asset.asset_id === settlementAssetIndex
29
+ ? minOf(maxOf(toRequiredBig(account.available_balance, 'available_balance'), new Big(0)), marginBalance)
30
+ : marginBalance;
19
31
  if (perps.gt(0)) {
20
32
  rows.push({ assetId, route: 'perps', available: perps.toFixed() });
21
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,MAAwB,EACO,EAAE;IACjC,MAAM,IAAI,GAAkC,EAAE,CAAA;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,CACxD,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CACtD,CAAA;QACD,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;QACnE,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
1
+ {"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAoC,MAAM,iBAAiB,CAAA;AAChF,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAwD,EACxD,oBAA4B,EACG,EAAE;IACjC,MAAM,IAAI,GAAkC,EAAE,CAAA;IAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,CACxD,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CACtD,CAAA;QACD,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;QAC3E,MAAM,KAAK,GACT,KAAK,CAAC,QAAQ,KAAK,oBAAoB;YACrC,CAAC,CAAC,KAAK,CACH,KAAK,CACH,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,EAC7D,IAAI,GAAG,CAAC,CAAC,CAAC,CACX,EACD,aAAa,CACd;YACH,CAAC,CAAC,aAAa,CAAA;QACnB,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -59,6 +59,7 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
59
59
  * is a full open-position snapshot per the `PositionsEvent` contract.
60
60
  */
61
61
  private readonly positionsByAddress;
62
+ private readonly accountSummaryInputs;
62
63
  private readonly registry;
63
64
  private readonly accountIndexCache;
64
65
  private readonly accountIndexPromises;
@@ -77,6 +78,12 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
77
78
  */
78
79
  subscribeQuote(params: ProviderGetQuoteParams, onQuote: QuoteListener): Promise<() => void>;
79
80
  protected openChannel(sub: Subscription): Promise<() => void>;
81
+ /**
82
+ * Hold a `marketsContext` subscription for the spot marks that price the
83
+ * account's spot balances. The ref-counted base shares the wire channels
84
+ * with any consumer `marketsContext` subscription.
85
+ */
86
+ private subscribeSpotMarks;
80
87
  protected onClose(): void;
81
88
  protected sendSubscribe({ channel, needsAuth, address, }: SubState): Promise<void>;
82
89
  /**
@@ -87,6 +94,8 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
87
94
  * code, as it does for the Ondo and Lighter REST auth failures.
88
95
  */
89
96
  private requireAuthToken;
97
+ /** Whether a token resolves for the address; a resolver that throws counts as no token. */
98
+ private canResolveAuthToken;
90
99
  protected toKey(sub: Subscription): string;
91
100
  private resolveChannel;
92
101
  private resolveAccountIndex;
@@ -95,6 +104,21 @@ export declare class LighterWsProvider extends WsProviderBase<SubState> {
95
104
  private dispatch;
96
105
  private handleAccountOrders;
97
106
  private handleUserStats;
107
+ /**
108
+ * Replace the spot balances on a `subscribed/` frame and upsert them on an
109
+ * `update/` frame. An update before the first snapshot is dropped, so the
110
+ * map never holds a partial set. Balances parse here, so a non-decimal
111
+ * balance rejects its frame and never reaches the emit path.
112
+ */
113
+ private handleAccountAll;
114
+ /**
115
+ * Emit the account summary once both the `user_stats` figures and the spot
116
+ * balances are in. `portfolioValue` values the spot balances as REST
117
+ * `getAccount` does. `onlyOnChange` skips an emit whose `portfolioValue`
118
+ * equals the last one, so a mark tick on an unrelated market emits nothing.
119
+ */
120
+ private emitAccountSummary;
121
+ private settlementAssetIndex;
98
122
  private handleAccountTrades;
99
123
  private handleAccountPositions;
100
124
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"LighterWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/LighterWsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAKlB,cAAc,EACd,KAAK,iBAAiB,EAGvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AA8EnC;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AAEhC,UAAU,QAAQ;IAChB,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAA;CACnB;AAkBD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,wBAAwB,CAAA;CAC5C;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAE5B;IACb,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IAEnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,cAAc,CAAoC;IAE1D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2C;IAE9E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqC;gBAGxE,KAAK,GAAE,MAA+B,EACtC,WAAW,GAAE,MAA6B,EAC1C,OAAO,GAAE,wBAA6B,EACtC,MAAM,CAAC,EAAE,cAAc;IAsBzB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;;OAKG;IACG,cAAc,CAClB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,IAAI,CAAC;cAkBN,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;cA6ChD,OAAO,IAAI,IAAI;cAMlB,aAAa,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3B;;;;;;OAMG;YACW,gBAAgB;IAsB9B,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;YAyB5B,cAAc;YAyFd,mBAAmB;YAqBnB,iBAAiB;IAK/B,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAqB1C,OAAO,CAAC,QAAQ;IAkFhB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,eAAe;IAuDvB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,sBAAsB;IAiC9B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,iBAAiB;IAuCzB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,mBAAmB;CAc5B;AAkID;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,wBAAwB,KACjC,iBAKA,CAAA"}
1
+ {"version":3,"file":"LighterWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/LighterWsProvider.ts"],"names":[],"mappings":"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"}