@lifi/perps-sdk-provider-lighter 35.0.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 (248) 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/constants.d.ts +1 -0
  13. package/dist/cjs/constants.d.ts.map +1 -1
  14. package/dist/cjs/constants.js +2 -1
  15. package/dist/cjs/constants.js.map +1 -1
  16. package/dist/cjs/index.d.ts +1 -1
  17. package/dist/cjs/index.d.ts.map +1 -1
  18. package/dist/cjs/index.js +2 -1
  19. package/dist/cjs/index.js.map +1 -1
  20. package/dist/cjs/signers/LighterSigner.d.ts.map +1 -1
  21. package/dist/cjs/signers/LighterSigner.js +2 -6
  22. package/dist/cjs/signers/LighterSigner.js.map +1 -1
  23. package/dist/cjs/types/submit.d.ts +5 -0
  24. package/dist/cjs/types/submit.d.ts.map +1 -1
  25. package/dist/cjs/utils/index.d.ts +3 -3
  26. package/dist/cjs/utils/index.d.ts.map +1 -1
  27. package/dist/cjs/utils/index.js +5 -6
  28. package/dist/cjs/utils/index.js.map +1 -1
  29. package/dist/cjs/utils/mapFill.d.ts +1 -1
  30. package/dist/cjs/utils/mapFill.d.ts.map +1 -1
  31. package/dist/cjs/utils/mapFill.js +44 -31
  32. package/dist/cjs/utils/mapFill.js.map +1 -1
  33. package/dist/cjs/utils/mapOpenPositions.d.ts +3 -1
  34. package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -1
  35. package/dist/cjs/utils/mapOpenPositions.js +20 -4
  36. package/dist/cjs/utils/mapOpenPositions.js.map +1 -1
  37. package/dist/cjs/utils/mapOrder.d.ts +1 -1
  38. package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
  39. package/dist/cjs/utils/mapOrder.js +64 -26
  40. package/dist/cjs/utils/mapOrder.js.map +1 -1
  41. package/dist/cjs/utils/mapPortfolioHistory.d.ts +1 -2
  42. package/dist/cjs/utils/mapPortfolioHistory.d.ts.map +1 -1
  43. package/dist/cjs/utils/mapPortfolioHistory.js +29 -21
  44. package/dist/cjs/utils/mapPortfolioHistory.js.map +1 -1
  45. package/dist/cjs/utils/mapPosition.d.ts +3 -3
  46. package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
  47. package/dist/cjs/utils/mapPosition.js +35 -35
  48. package/dist/cjs/utils/mapPosition.js.map +1 -1
  49. package/dist/cjs/utils/rowTimestamp.d.ts +2 -0
  50. package/dist/cjs/utils/rowTimestamp.d.ts.map +1 -0
  51. package/dist/cjs/utils/rowTimestamp.js +14 -0
  52. package/dist/cjs/utils/rowTimestamp.js.map +1 -0
  53. package/dist/cjs/utils/settlementPool.d.ts +2 -3
  54. package/dist/cjs/utils/settlementPool.d.ts.map +1 -1
  55. package/dist/cjs/utils/settlementPool.js +8 -7
  56. package/dist/cjs/utils/settlementPool.js.map +1 -1
  57. package/dist/cjs/utils/spotPrice.d.ts +3 -4
  58. package/dist/cjs/utils/spotPrice.d.ts.map +1 -1
  59. package/dist/cjs/utils/spotPrice.js +6 -11
  60. package/dist/cjs/utils/spotPrice.js.map +1 -1
  61. package/dist/cjs/utils/time.d.ts.map +1 -1
  62. package/dist/cjs/utils/time.js +3 -2
  63. package/dist/cjs/utils/time.js.map +1 -1
  64. package/dist/cjs/utils/transferMargin.d.ts.map +1 -1
  65. package/dist/cjs/utils/transferMargin.js +7 -15
  66. package/dist/cjs/utils/transferMargin.js.map +1 -1
  67. package/dist/cjs/utils/withdrawableBalances.d.ts +1 -1
  68. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
  69. package/dist/cjs/utils/withdrawableBalances.js +12 -17
  70. package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
  71. package/dist/cjs/utils/withdrawalTypes.d.ts +17 -0
  72. package/dist/cjs/utils/withdrawalTypes.d.ts.map +1 -0
  73. package/dist/cjs/utils/withdrawalTypes.js +58 -0
  74. package/dist/cjs/utils/withdrawalTypes.js.map +1 -0
  75. package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -1
  76. package/dist/cjs/websocket/LighterWsProvider.js +46 -58
  77. package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
  78. package/dist/cjs/websocket/orderBookSide.d.ts +19 -0
  79. package/dist/cjs/websocket/orderBookSide.d.ts.map +1 -0
  80. package/dist/cjs/websocket/orderBookSide.js +71 -0
  81. package/dist/cjs/websocket/orderBookSide.js.map +1 -0
  82. package/dist/esm/LighterProvider.d.ts.map +1 -1
  83. package/dist/esm/LighterProvider.js +116 -62
  84. package/dist/esm/LighterProvider.js.map +1 -1
  85. package/dist/esm/accountSummary.d.ts +1 -2
  86. package/dist/esm/accountSummary.d.ts.map +1 -1
  87. package/dist/esm/accountSummary.js +10 -14
  88. package/dist/esm/accountSummary.js.map +1 -1
  89. package/dist/esm/availableToTrade.d.ts +1 -2
  90. package/dist/esm/availableToTrade.d.ts.map +1 -1
  91. package/dist/esm/availableToTrade.js +9 -10
  92. package/dist/esm/availableToTrade.js.map +1 -1
  93. package/dist/esm/constants.d.ts +8 -0
  94. package/dist/esm/constants.d.ts.map +1 -1
  95. package/dist/esm/constants.js +8 -0
  96. package/dist/esm/constants.js.map +1 -1
  97. package/dist/esm/index.d.ts +1 -1
  98. package/dist/esm/index.d.ts.map +1 -1
  99. package/dist/esm/index.js +1 -1
  100. package/dist/esm/index.js.map +1 -1
  101. package/dist/esm/signers/LighterSigner.d.ts.map +1 -1
  102. package/dist/esm/signers/LighterSigner.js +3 -4
  103. package/dist/esm/signers/LighterSigner.js.map +1 -1
  104. package/dist/esm/types/submit.d.ts +14 -0
  105. package/dist/esm/types/submit.d.ts.map +1 -1
  106. package/dist/esm/utils/index.d.ts +3 -3
  107. package/dist/esm/utils/index.d.ts.map +1 -1
  108. package/dist/esm/utils/index.js +2 -3
  109. package/dist/esm/utils/index.js.map +1 -1
  110. package/dist/esm/utils/mapFill.d.ts +1 -1
  111. package/dist/esm/utils/mapFill.d.ts.map +1 -1
  112. package/dist/esm/utils/mapFill.js +51 -35
  113. package/dist/esm/utils/mapFill.js.map +1 -1
  114. package/dist/esm/utils/mapOpenPositions.d.ts +17 -3
  115. package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -1
  116. package/dist/esm/utils/mapOpenPositions.js +31 -5
  117. package/dist/esm/utils/mapOpenPositions.js.map +1 -1
  118. package/dist/esm/utils/mapOrder.d.ts +6 -2
  119. package/dist/esm/utils/mapOrder.d.ts.map +1 -1
  120. package/dist/esm/utils/mapOrder.js +70 -25
  121. package/dist/esm/utils/mapOrder.js.map +1 -1
  122. package/dist/esm/utils/mapPortfolioHistory.d.ts +6 -3
  123. package/dist/esm/utils/mapPortfolioHistory.d.ts.map +1 -1
  124. package/dist/esm/utils/mapPortfolioHistory.js +34 -19
  125. package/dist/esm/utils/mapPortfolioHistory.js.map +1 -1
  126. package/dist/esm/utils/mapPosition.d.ts +12 -8
  127. package/dist/esm/utils/mapPosition.d.ts.map +1 -1
  128. package/dist/esm/utils/mapPosition.js +45 -38
  129. package/dist/esm/utils/mapPosition.js.map +1 -1
  130. package/dist/esm/utils/rowTimestamp.d.ts +6 -0
  131. package/dist/esm/utils/rowTimestamp.d.ts.map +1 -0
  132. package/dist/esm/utils/rowTimestamp.js +14 -0
  133. package/dist/esm/utils/rowTimestamp.js.map +1 -0
  134. package/dist/esm/utils/settlementPool.d.ts +2 -3
  135. package/dist/esm/utils/settlementPool.d.ts.map +1 -1
  136. package/dist/esm/utils/settlementPool.js +8 -7
  137. package/dist/esm/utils/settlementPool.js.map +1 -1
  138. package/dist/esm/utils/spotPrice.d.ts +3 -4
  139. package/dist/esm/utils/spotPrice.d.ts.map +1 -1
  140. package/dist/esm/utils/spotPrice.js +6 -8
  141. package/dist/esm/utils/spotPrice.js.map +1 -1
  142. package/dist/esm/utils/time.d.ts +10 -2
  143. package/dist/esm/utils/time.d.ts.map +1 -1
  144. package/dist/esm/utils/time.js +13 -4
  145. package/dist/esm/utils/time.js.map +1 -1
  146. package/dist/esm/utils/transferMargin.d.ts.map +1 -1
  147. package/dist/esm/utils/transferMargin.js +8 -13
  148. package/dist/esm/utils/transferMargin.js.map +1 -1
  149. package/dist/esm/utils/withdrawableBalances.d.ts +5 -3
  150. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
  151. package/dist/esm/utils/withdrawableBalances.js +17 -17
  152. package/dist/esm/utils/withdrawableBalances.js.map +1 -1
  153. package/dist/esm/utils/withdrawalTypes.d.ts +45 -0
  154. package/dist/esm/utils/withdrawalTypes.d.ts.map +1 -0
  155. package/dist/esm/utils/withdrawalTypes.js +68 -0
  156. package/dist/esm/utils/withdrawalTypes.js.map +1 -0
  157. package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -1
  158. package/dist/esm/websocket/LighterWsProvider.js +48 -57
  159. package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
  160. package/dist/esm/websocket/orderBookSide.d.ts +33 -0
  161. package/dist/esm/websocket/orderBookSide.d.ts.map +1 -0
  162. package/dist/esm/websocket/orderBookSide.js +76 -0
  163. package/dist/esm/websocket/orderBookSide.js.map +1 -0
  164. package/dist/types/LighterProvider.d.ts.map +1 -1
  165. package/dist/types/accountSummary.d.ts +1 -2
  166. package/dist/types/accountSummary.d.ts.map +1 -1
  167. package/dist/types/availableToTrade.d.ts +1 -2
  168. package/dist/types/availableToTrade.d.ts.map +1 -1
  169. package/dist/types/constants.d.ts +8 -0
  170. package/dist/types/constants.d.ts.map +1 -1
  171. package/dist/types/index.d.ts +1 -1
  172. package/dist/types/index.d.ts.map +1 -1
  173. package/dist/types/signers/LighterSigner.d.ts.map +1 -1
  174. package/dist/types/types/submit.d.ts +14 -0
  175. package/dist/types/types/submit.d.ts.map +1 -1
  176. package/dist/types/utils/index.d.ts +3 -3
  177. package/dist/types/utils/index.d.ts.map +1 -1
  178. package/dist/types/utils/mapFill.d.ts +1 -1
  179. package/dist/types/utils/mapFill.d.ts.map +1 -1
  180. package/dist/types/utils/mapOpenPositions.d.ts +17 -3
  181. package/dist/types/utils/mapOpenPositions.d.ts.map +1 -1
  182. package/dist/types/utils/mapOrder.d.ts +6 -2
  183. package/dist/types/utils/mapOrder.d.ts.map +1 -1
  184. package/dist/types/utils/mapPortfolioHistory.d.ts +6 -3
  185. package/dist/types/utils/mapPortfolioHistory.d.ts.map +1 -1
  186. package/dist/types/utils/mapPosition.d.ts +12 -8
  187. package/dist/types/utils/mapPosition.d.ts.map +1 -1
  188. package/dist/types/utils/rowTimestamp.d.ts +6 -0
  189. package/dist/types/utils/rowTimestamp.d.ts.map +1 -0
  190. package/dist/types/utils/settlementPool.d.ts +2 -3
  191. package/dist/types/utils/settlementPool.d.ts.map +1 -1
  192. package/dist/types/utils/spotPrice.d.ts +3 -4
  193. package/dist/types/utils/spotPrice.d.ts.map +1 -1
  194. package/dist/types/utils/time.d.ts +10 -2
  195. package/dist/types/utils/time.d.ts.map +1 -1
  196. package/dist/types/utils/transferMargin.d.ts.map +1 -1
  197. package/dist/types/utils/withdrawableBalances.d.ts +5 -3
  198. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
  199. package/dist/types/utils/withdrawalTypes.d.ts +45 -0
  200. package/dist/types/utils/withdrawalTypes.d.ts.map +1 -0
  201. package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -1
  202. package/dist/types/websocket/orderBookSide.d.ts +33 -0
  203. package/dist/types/websocket/orderBookSide.d.ts.map +1 -0
  204. package/package.json +3 -3
  205. package/src/LighterProvider.ts +236 -100
  206. package/src/accountSummary.ts +41 -22
  207. package/src/availableToTrade.ts +38 -15
  208. package/src/constants.ts +9 -0
  209. package/src/index.ts +1 -0
  210. package/src/signers/LighterSigner.ts +11 -4
  211. package/src/types/submit.ts +15 -0
  212. package/src/utils/index.ts +9 -3
  213. package/src/utils/mapFill.ts +82 -43
  214. package/src/utils/mapOpenPositions.ts +45 -6
  215. package/src/utils/mapOrder.ts +99 -28
  216. package/src/utils/mapPortfolioHistory.ts +78 -24
  217. package/src/utils/mapPosition.ts +67 -44
  218. package/src/utils/rowTimestamp.ts +15 -0
  219. package/src/utils/settlementPool.ts +36 -12
  220. package/src/utils/spotPrice.ts +18 -12
  221. package/src/utils/time.ts +14 -4
  222. package/src/utils/transferMargin.ts +28 -17
  223. package/src/utils/withdrawableBalances.ts +34 -20
  224. package/src/utils/withdrawalTypes.ts +125 -0
  225. package/src/websocket/LighterWsProvider.ts +75 -92
  226. package/src/websocket/orderBookSide.ts +106 -0
  227. package/dist/cjs/utils/decimal.d.ts +0 -5
  228. package/dist/cjs/utils/decimal.d.ts.map +0 -1
  229. package/dist/cjs/utils/decimal.js +0 -38
  230. package/dist/cjs/utils/decimal.js.map +0 -1
  231. package/dist/cjs/utils/liquidation.d.ts +0 -4
  232. package/dist/cjs/utils/liquidation.d.ts.map +0 -1
  233. package/dist/cjs/utils/liquidation.js +0 -16
  234. package/dist/cjs/utils/liquidation.js.map +0 -1
  235. package/dist/esm/utils/decimal.d.ts +0 -15
  236. package/dist/esm/utils/decimal.d.ts.map +0 -1
  237. package/dist/esm/utils/decimal.js +0 -39
  238. package/dist/esm/utils/decimal.js.map +0 -1
  239. package/dist/esm/utils/liquidation.d.ts +0 -22
  240. package/dist/esm/utils/liquidation.d.ts.map +0 -1
  241. package/dist/esm/utils/liquidation.js +0 -31
  242. package/dist/esm/utils/liquidation.js.map +0 -1
  243. package/dist/types/utils/decimal.d.ts +0 -15
  244. package/dist/types/utils/decimal.d.ts.map +0 -1
  245. package/dist/types/utils/liquidation.d.ts +0 -22
  246. package/dist/types/utils/liquidation.d.ts.map +0 -1
  247. package/src/utils/decimal.ts +0 -52
  248. package/src/utils/liquidation.ts +0 -39
@@ -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,23 +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 before conversion to `number`. This value is for displaying the
6
- * venue setting; provider risk calculations consume the original decimal IMF
7
- * instead. `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.
8
9
  * @public
9
10
  */
10
- export declare const leverageFromImf: (imf: string) => number | undefined;
11
+ export declare const leverageFromImf: (imf: string) => string | undefined;
11
12
  /**
12
13
  * Display leverage from an integer IMF on `LIGHTER_IMF_PERCENT_SCALE`, the
13
14
  * 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
+ * `undefined` for a non-positive or non-finite IMF. Lighter declares the
15
16
  * fraction a `StrictInt`, so the scale division is exact.
16
17
  */
17
- export declare const leverageFromScaledImf: (imf: number) => number | undefined;
18
+ export declare const leverageFromScaledImf: (imf: number) => string | undefined;
18
19
  /**
19
- * 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.
20
24
  * @param market - Backend-resolved market identity for `pos.market_id`.
21
25
  * @public
22
26
  */
23
- export declare const mapPosition: (pos: LtAccountPosition, market: PerpsMarketDisplay) => Position;
27
+ export declare const mapPosition: (pos: LtAccountPosition, market: PerpsMarketDisplay) => Position | undefined;
24
28
  //# sourceMappingURL=mapPosition.d.ts.map
@@ -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;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
+ {"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAOrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG1D;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAQtD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAO5D,CAAA;AAOD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,QAAQ,kBAAkB,KACzB,QAAQ,GAAG,SAqCb,CAAA"}
@@ -1,72 +1,79 @@
1
+ import { absDecimalString, divideDecimalString, isDecimalString, isDecimalStringZero, multiplyDecimalString, safeDivideDecimalString, safeIsDecimalStringGreaterThan, safeNumberToDecimalString, safeRoundDecimalString, warnSkippedVenueRow, } from '@lifi/perps-sdk';
1
2
  import { MarginMode, PositionSide } from '@lifi/perps-types';
2
- import Big from 'big.js';
3
- import { LIGHTER_IMF_PERCENT_SCALE } from '../constants.js';
3
+ import { LIGHTER_IMF_PERCENT_SCALE, LIGHTER_LEVERAGE_PRECISION, LIGHTER_PROVIDER_KEY, } from '../constants.js';
4
4
  import { LT_MARGIN_MODE_ISOLATED } from '../types/index.js';
5
- import { toPositiveRequiredBig, toRequiredBig } from './decimal.js';
6
5
  /**
7
6
  * Display leverage from an IMF percent string: `100 / IMF` in exact decimal
8
- * arithmetic before conversion to `number`. This value is for displaying the
9
- * venue setting; provider risk calculations consume the original decimal IMF
10
- * instead. `undefined` for a non-positive or unparsable IMF.
7
+ * arithmetic, rounded half-up to `LIGHTER_LEVERAGE_PRECISION`, so the value a
8
+ * client reads is the value it saved. Provider risk calculations consume the
9
+ * original decimal IMF instead. `undefined` for a non-positive or unparsable
10
+ * IMF.
11
11
  * @public
12
12
  */
13
13
  export const leverageFromImf = (imf) => {
14
- let parsed;
15
- try {
16
- parsed = new Big(imf);
17
- }
18
- catch {
19
- return undefined;
20
- }
21
- if (parsed.lte(0)) {
14
+ if (safeIsDecimalStringGreaterThan(imf, '0') !== true) {
22
15
  return undefined;
23
16
  }
24
- return new Big(100).div(parsed).toNumber();
17
+ const leverage = safeDivideDecimalString('100', imf);
18
+ return leverage === undefined
19
+ ? undefined
20
+ : safeRoundDecimalString(leverage, LIGHTER_LEVERAGE_PRECISION, 'round');
25
21
  };
26
22
  /**
27
23
  * Display leverage from an integer IMF on `LIGHTER_IMF_PERCENT_SCALE`, the
28
24
  * 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
25
+ * `undefined` for a non-positive or non-finite IMF. Lighter declares the
30
26
  * fraction a `StrictInt`, so the scale division is exact.
31
27
  */
32
28
  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);
29
+ const scaled = safeNumberToDecimalString(imf);
30
+ const percent = scaled === undefined
31
+ ? undefined
32
+ : safeDivideDecimalString(scaled, String(LIGHTER_IMF_PERCENT_SCALE));
33
+ return percent === undefined ? undefined : leverageFromImf(percent);
34
+ };
35
+ const skipPosition = (field, value) => {
36
+ warnSkippedVenueRow(LIGHTER_PROVIDER_KEY, 'position', field, value);
37
+ return undefined;
41
38
  };
42
39
  /**
43
- * Map a raw Lighter account position to the generic Position type.
40
+ * Map a raw Lighter account position to the generic Position type. A row with
41
+ * an invalid size or value, or a non-positive initial margin fraction, gives
42
+ * `undefined`: the mapper derives the size, mark price, margin and leverage
43
+ * from them. Prices, PnL, funding and isolated margin pass through raw.
44
44
  * @param market - Backend-resolved market identity for `pos.market_id`.
45
45
  * @public
46
46
  */
47
47
  export const mapPosition = (pos, market) => {
48
- const size = toRequiredBig(pos.position, 'position');
48
+ if (!isDecimalString(pos.position)) {
49
+ return skipPosition('position', pos.position);
50
+ }
51
+ if (!isDecimalString(pos.position_value)) {
52
+ return skipPosition('position_value', pos.position_value);
53
+ }
54
+ const imf = pos.initial_margin_fraction;
55
+ const leverage = isDecimalString(imf) ? leverageFromImf(imf) : undefined;
56
+ if (leverage === undefined) {
57
+ return skipPosition('initial_margin_fraction', imf);
58
+ }
49
59
  const isIsolated = pos.margin_mode === LT_MARGIN_MODE_ISOLATED;
50
- const positionValue = toRequiredBig(pos.position_value, 'position_value').abs();
51
- const imf = toPositiveRequiredBig(pos.initial_margin_fraction, 'initial_margin_fraction');
52
- const initialMarginRequirement = positionValue.times(imf).div(100);
53
- const marginUsed = isIsolated
54
- ? pos.allocated_margin
55
- : initialMarginRequirement.toFixed();
60
+ const size = absDecimalString(pos.position);
61
+ const positionValue = absDecimalString(pos.position_value);
62
+ const initialMarginRequirement = divideDecimalString(multiplyDecimalString(positionValue, imf), '100');
56
63
  return {
57
64
  market,
58
65
  side: pos.sign >= 0 ? PositionSide.LONG : PositionSide.SHORT,
59
- size: size.abs().toFixed(),
66
+ size,
60
67
  entryPrice: pos.avg_entry_price,
61
- markPrice: positionValue.eq(0) || size.eq(0)
68
+ markPrice: isDecimalStringZero(positionValue) || isDecimalStringZero(size)
62
69
  ? '0'
63
- : positionValue.div(size.abs()).toFixed(),
70
+ : divideDecimalString(positionValue, size),
64
71
  liquidationPrice: pos.liquidation_price,
65
72
  unrealizedPnl: pos.unrealized_pnl,
66
73
  accruedFunding: pos.total_funding_paid_out ?? '0',
67
- leverage: leverageFromImf(pos.initial_margin_fraction) ?? 1,
68
- marginUsed,
69
- initialMarginRequirement: initialMarginRequirement.toFixed(),
74
+ leverage,
75
+ marginUsed: isIsolated ? pos.allocated_margin : initialMarginRequirement,
76
+ initialMarginRequirement,
70
77
  marginMode: isIsolated ? MarginMode.ISOLATED : MarginMode.CROSS,
71
78
  };
72
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Read a venue row time as an ISO-8601 string, or `undefined` when the time is
3
+ * not valid. The caller logs the row skip, so this logs nothing.
4
+ */
5
+ export declare const rowTimestampToIsoStringOrUndefined: (value: string | number) => string | undefined;
6
+ //# sourceMappingURL=rowTimestamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rowTimestamp.d.ts","sourceRoot":"","sources":["../../../src/utils/rowTimestamp.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,kCAAkC,GAC7C,OAAO,MAAM,GAAG,MAAM,KACrB,MAAM,GAAG,SAMX,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { timestampToIsoString } from '@lifi/perps-sdk';
2
+ /**
3
+ * Read a venue row time as an ISO-8601 string, or `undefined` when the time is
4
+ * not valid. The caller logs the row skip, so this logs nothing.
5
+ */
6
+ export const rowTimestampToIsoStringOrUndefined = (value) => {
7
+ try {
8
+ return timestampToIsoString(value);
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ };
14
+ //# sourceMappingURL=rowTimestamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rowTimestamp.js","sourceRoot":"","sources":["../../../src/utils/rowTimestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAChD,KAAsB,EACF,EAAE;IACtB,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA"}
@@ -1,14 +1,13 @@
1
- import type Big from 'big.js';
2
1
  import type { LtAccountAsset } from '../types/account.js';
3
2
  /** Both routes of a unified account's settlement asset, as one holding. */
4
- export declare const pooledSettlementUnits: (asset: LtAccountAsset) => Big;
3
+ export declare const pooledSettlementUnits: (asset: LtAccountAsset) => string;
5
4
  /**
6
5
  * Spot units a unified account can spend from its settlement pool: the free
7
6
  * spot route plus the margin route up to the account's `available_balance`.
8
7
  * This is `computeSpotAvailableToTradeMarket` in Lighter's `lighter-ts` for an
9
8
  * asset priced 1:1 with a `loan_to_value` of 1. The result can be negative.
10
9
  */
11
- export declare const pooledSettlementSpendable: (asset: LtAccountAsset, availableBalance: Big) => Big;
10
+ export declare const pooledSettlementSpendable: (asset: LtAccountAsset, availableBalance: string) => string;
12
11
  /** Spot-route `balance` of the collateral asset; `'0'` when the account holds none. */
13
12
  export declare const collateralSpotBalance: (assets: readonly LtAccountAsset[], settlementAssetIndex: number) => string;
14
13
  //# sourceMappingURL=settlementPool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settlementPool.d.ts","sourceRoot":"","sources":["../../../src/utils/settlementPool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,QAAQ,CAAA;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGzD,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,GAAI,OAAO,cAAc,KAAG,GAG3D,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GACpC,OAAO,cAAc,EACrB,kBAAkB,GAAG,KACpB,GAKF,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,SAAS,cAAc,EAAE,EACjC,sBAAsB,MAAM,KAC3B,MAKF,CAAA"}
1
+ {"version":3,"file":"settlementPool.d.ts","sourceRoot":"","sources":["../../../src/utils/settlementPool.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,GAAI,OAAO,cAAc,KAAG,MAQ3D,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GACpC,OAAO,cAAc,EACrB,kBAAkB,MAAM,KACvB,MAmBF,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,SAAS,cAAc,EAAE,EACjC,sBAAsB,MAAM,KAC3B,MAKF,CAAA"}
@@ -1,6 +1,7 @@
1
- import { toRequiredBig } from './decimal.js';
1
+ import { addDecimalString, isDecimalStringGreaterThan, subtractDecimalString, unknownToDecimalString, } from '@lifi/perps-sdk';
2
+ import { LIGHTER_PROVIDER_KEY } from '../constants.js';
2
3
  /** Both routes of a unified account's settlement asset, as one holding. */
3
- export const pooledSettlementUnits = (asset) => toRequiredBig(asset.balance, 'balance').plus(toRequiredBig(asset.margin_balance, 'margin_balance'));
4
+ export const pooledSettlementUnits = (asset) => addDecimalString(unknownToDecimalString(asset.balance, 'balance', LIGHTER_PROVIDER_KEY), unknownToDecimalString(asset.margin_balance, 'margin_balance', LIGHTER_PROVIDER_KEY));
4
5
  /**
5
6
  * Spot units a unified account can spend from its settlement pool: the free
6
7
  * spot route plus the margin route up to the account's `available_balance`.
@@ -8,16 +9,16 @@ export const pooledSettlementUnits = (asset) => toRequiredBig(asset.balance, 'ba
8
9
  * asset priced 1:1 with a `loan_to_value` of 1. The result can be negative.
9
10
  */
10
11
  export const pooledSettlementSpendable = (asset, availableBalance) => {
11
- const marginBalance = toRequiredBig(asset.margin_balance, 'margin_balance');
12
- return toRequiredBig(asset.balance, 'balance')
13
- .minus(toRequiredBig(asset.locked_balance, 'locked_balance'))
14
- .plus(marginBalance.lt(availableBalance) ? marginBalance : availableBalance);
12
+ const marginBalance = unknownToDecimalString(asset.margin_balance, 'margin_balance', LIGHTER_PROVIDER_KEY);
13
+ return addDecimalString(subtractDecimalString(unknownToDecimalString(asset.balance, 'balance', LIGHTER_PROVIDER_KEY), unknownToDecimalString(asset.locked_balance, 'locked_balance', LIGHTER_PROVIDER_KEY)), isDecimalStringGreaterThan(marginBalance, availableBalance)
14
+ ? availableBalance
15
+ : marginBalance);
15
16
  };
16
17
  /** Spot-route `balance` of the collateral asset; `'0'` when the account holds none. */
17
18
  export const collateralSpotBalance = (assets, settlementAssetIndex) => {
18
19
  const asset = assets.find((a) => a.asset_id === settlementAssetIndex);
19
20
  return asset === undefined
20
21
  ? '0'
21
- : toRequiredBig(asset.balance, 'balance').toFixed();
22
+ : unknownToDecimalString(asset.balance, 'balance', LIGHTER_PROVIDER_KEY);
22
23
  };
23
24
  //# sourceMappingURL=settlementPool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settlementPool.js","sourceRoot":"","sources":["../../../src/utils/settlementPool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAqB,EAAO,EAAE,CAClE,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAC1C,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CACtD,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,KAAqB,EACrB,gBAAqB,EAChB,EAAE;IACP,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;IAC3E,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC;SAC3C,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;SAC5D,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;AAChF,CAAC,CAAA;AAED,uFAAuF;AACvF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAAiC,EACjC,oBAA4B,EACpB,EAAE;IACV,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,oBAAoB,CAAC,CAAA;IACrE,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;AACvD,CAAC,CAAA"}
1
+ {"version":3,"file":"settlementPool.js","sourceRoot":"","sources":["../../../src/utils/settlementPool.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAGtD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAqB,EAAU,EAAE,CACrE,gBAAgB,CACd,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,oBAAoB,CAAC,EACtE,sBAAsB,CACpB,KAAK,CAAC,cAAc,EACpB,gBAAgB,EAChB,oBAAoB,CACrB,CACF,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,KAAqB,EACrB,gBAAwB,EAChB,EAAE;IACV,MAAM,aAAa,GAAG,sBAAsB,CAC1C,KAAK,CAAC,cAAc,EACpB,gBAAgB,EAChB,oBAAoB,CACrB,CAAA;IACD,OAAO,gBAAgB,CACrB,qBAAqB,CACnB,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,oBAAoB,CAAC,EACtE,sBAAsB,CACpB,KAAK,CAAC,cAAc,EACpB,gBAAgB,EAChB,oBAAoB,CACrB,CACF,EACD,0BAA0B,CAAC,aAAa,EAAE,gBAAgB,CAAC;QACzD,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,aAAa,CAClB,CAAA;AACH,CAAC,CAAA;AAED,uFAAuF;AACvF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAAiC,EACjC,oBAA4B,EACpB,EAAE;IACV,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,oBAAoB,CAAC,CAAA;IACrE,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAA;AAC5E,CAAC,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import type { Market, MarketContext } from '@lifi/perps-types';
2
- import Big from 'big.js';
3
2
  /**
4
3
  * Unit prices keyed by spot base `Asset.id` (the venue `asset_id`), read from
5
4
  * each spot market's `markPrice` for the base assets in `assetIds` only. A
@@ -10,14 +9,14 @@ import Big from 'big.js';
10
9
  * @throws {PerpsError} `SDKError` when a context row for a requested asset
11
10
  * carries a non-decimal mark.
12
11
  */
13
- export declare const spotPriceByAssetId: (markets: readonly Market[], spotCategoryId: string, contexts: readonly MarketContext[], assetIds: ReadonlySet<string>) => Map<string, Big>;
12
+ export declare const spotPriceByAssetId: (markets: readonly Market[], spotCategoryId: string, contexts: readonly MarketContext[], assetIds: ReadonlySet<string>) => Map<string, string>;
14
13
  /**
15
14
  * USD value of `units` of a Lighter asset, with the unit price it used: the
16
15
  * settlement asset at 1, any other at its `spotPrices` entry. An asset absent
17
16
  * from `spotPrices` values at 0 and carries no price.
18
17
  */
19
- export declare const spotValuation: (assetId: number, units: string, settlementAssetIndex: number, spotPrices: ReadonlyMap<string, Big>) => {
18
+ export declare const spotValuation: (assetId: number, units: string, settlementAssetIndex: number, spotPrices: ReadonlyMap<string, string>) => {
20
19
  valueUsd: string;
21
- price?: Big;
20
+ price?: string;
22
21
  };
23
22
  //# 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,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
+ {"version":3,"file":"spotPrice.d.ts","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAG9D;;;;;;;;;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,MAAM,CAuBpB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,MAAM,EACf,OAAO,MAAM,EACb,sBAAsB,MAAM,EAC5B,YAAY,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,KACtC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAMpC,CAAA"}
@@ -1,5 +1,5 @@
1
- import Big from 'big.js';
2
- import { toRequiredBig } from './decimal.js';
1
+ import { isDecimalStringGreaterThan, multiplyDecimalString, unknownToDecimalString, } from '@lifi/perps-sdk';
2
+ import { LIGHTER_PROVIDER_KEY } from '../constants.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
@@ -21,8 +21,8 @@ export const spotPriceByAssetId = (markets, spotCategoryId, contexts, assetIds)
21
21
  priceByAssetId.has(market.baseAsset.id)) {
22
22
  continue;
23
23
  }
24
- const price = toRequiredBig(mark, 'markPrice');
25
- if (price.gt(0)) {
24
+ const price = unknownToDecimalString(mark, 'markPrice', LIGHTER_PROVIDER_KEY);
25
+ if (isDecimalStringGreaterThan(price, '0')) {
26
26
  priceByAssetId.set(market.baseAsset.id, price);
27
27
  }
28
28
  }
@@ -34,11 +34,9 @@ export const spotPriceByAssetId = (markets, spotCategoryId, contexts, assetIds)
34
34
  * from `spotPrices` values at 0 and carries no price.
35
35
  */
36
36
  export const spotValuation = (assetId, units, settlementAssetIndex, spotPrices) => {
37
- const price = assetId === settlementAssetIndex
38
- ? new Big(1)
39
- : spotPrices.get(String(assetId));
37
+ const price = assetId === settlementAssetIndex ? '1' : spotPrices.get(String(assetId));
40
38
  return price === undefined
41
39
  ? { valueUsd: '0' }
42
- : { valueUsd: new Big(units).times(price).toFixed(), price };
40
+ : { valueUsd: multiplyDecimalString(units, price), price };
43
41
  };
44
42
  //# sourceMappingURL=spotPrice.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"spotPrice.js","sourceRoot":"","sources":["../../../src/utils/spotPrice.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAA0B,EAC1B,cAAsB,EACtB,QAAkC,EAClC,QAA6B,EACR,EAAE;IACvB,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,EAAkB,CAAA;IAChD,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,sBAAsB,CAClC,IAAI,EACJ,WAAW,EACX,oBAAoB,CACrB,CAAA;QACD,IAAI,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3C,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,UAAuC,EACD,EAAE;IACxC,MAAM,KAAK,GACT,OAAO,KAAK,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1E,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;QACnB,CAAC,CAAC,EAAE,QAAQ,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAA;AAC9D,CAAC,CAAA"}
@@ -1,5 +1,13 @@
1
- /** Convert seconds since unix epoch to ISO-8601. */
1
+ /**
2
+ * Convert seconds since unix epoch to ISO-8601.
3
+ *
4
+ * @throws {PerpsError} `ValidationError` when `seconds` is not a valid time.
5
+ */
2
6
  export declare const toIsoFromSeconds: (seconds: number) => string;
3
- /** Convert milliseconds since unix epoch to ISO-8601. */
7
+ /**
8
+ * Convert milliseconds since unix epoch to ISO-8601.
9
+ *
10
+ * @throws {PerpsError} `ValidationError` when `ms` is not a valid time.
11
+ */
4
12
  export declare const toIsoFromMs: (ms: number) => string;
5
13
  //# sourceMappingURL=time.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MACX,CAAA;AAExC,yDAAyD;AACzD,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,KAAG,MAAoC,CAAA"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MACb,CAAA;AAEtC;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,KAAG,MAAkC,CAAA"}
@@ -1,5 +1,14 @@
1
- /** Convert seconds since unix epoch to ISO-8601. */
2
- export const toIsoFromSeconds = (seconds) => new Date(seconds * 1000).toISOString();
3
- /** Convert milliseconds since unix epoch to ISO-8601. */
4
- export const toIsoFromMs = (ms) => new Date(ms).toISOString();
1
+ import { timestampToIsoString } from '@lifi/perps-sdk';
2
+ /**
3
+ * Convert seconds since unix epoch to ISO-8601.
4
+ *
5
+ * @throws {PerpsError} `ValidationError` when `seconds` is not a valid time.
6
+ */
7
+ export const toIsoFromSeconds = (seconds) => timestampToIsoString(seconds * 1000);
8
+ /**
9
+ * Convert milliseconds since unix epoch to ISO-8601.
10
+ *
11
+ * @throws {PerpsError} `ValidationError` when `ms` is not a valid time.
12
+ */
13
+ export const toIsoFromMs = (ms) => timestampToIsoString(ms);
5
14
  //# sourceMappingURL=time.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAU,EAAE,CAC1D,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;AAExC,yDAAyD;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAU,EAAE,CAC1D,oBAAoB,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;AAEtC;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"transferMargin.d.ts","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAA;AA2B1B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,GACjB,aAAa,GAAG,SAAS,CAmB3B"}
1
+ {"version":3,"file":"transferMargin.d.ts","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAA;AA+B1B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,GACjB,aAAa,GAAG,SAAS,CAqB3B"}
@@ -1,18 +1,15 @@
1
- import { PerpsError, positionSupportsMarginAdjustment, positionSupportsMarginRemoval, } from '@lifi/perps-sdk';
1
+ import { addDecimalString, isDecimalString, isDecimalStringGreaterThan, PerpsError, positionSupportsMarginAdjustment, positionSupportsMarginRemoval, roundDecimalString, subtractDecimalString, } from '@lifi/perps-sdk';
2
2
  import { PerpsErrorCode, } from '@lifi/perps-types';
3
- import Big from 'big.js';
4
3
  const AMOUNT_DECIMALS = 6;
5
4
  function positionAmount(value, field) {
6
- try {
7
- return new Big(value);
8
- }
9
- catch {
10
- throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid decimal string on Position.${field}: '${value}'`);
5
+ if (!isDecimalString(value)) {
6
+ throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid \`Position.${field}\`: '${value}' is not a decimal string.`);
11
7
  }
8
+ return value;
12
9
  }
13
10
  function positivePositionAmount(value, field) {
14
11
  const amount = positionAmount(value, field);
15
- if (amount.lte(0)) {
12
+ if (!isDecimalStringGreaterThan(amount, '0')) {
16
13
  throw new PerpsError(PerpsErrorCode.ValidationError, `Position.${field} must be greater than zero.`);
17
14
  }
18
15
  return amount;
@@ -38,12 +35,10 @@ export function positionRemovableMargin(position) {
38
35
  if (!positionSupportsMarginRemoval(position)) {
39
36
  return '0';
40
37
  }
41
- const removable = positivePositionAmount(position.marginUsed, 'marginUsed')
42
- .plus(positionAmount(position.unrealizedPnl, 'unrealizedPnl'))
43
- .minus(positivePositionAmount(position.initialMarginRequirement, 'initialMarginRequirement'));
44
- if (removable.lte(0)) {
38
+ const removable = subtractDecimalString(addDecimalString(positivePositionAmount(position.marginUsed, 'marginUsed'), positionAmount(position.unrealizedPnl, 'unrealizedPnl')), positivePositionAmount(position.initialMarginRequirement, 'initialMarginRequirement'));
39
+ if (!isDecimalStringGreaterThan(removable, '0')) {
45
40
  return '0';
46
41
  }
47
- return removable.round(AMOUNT_DECIMALS, Big.roundDown).toFixed();
42
+ return roundDecimalString(removable, AMOUNT_DECIMALS, 'truncate');
48
43
  }
49
44
  //# sourceMappingURL=transferMargin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transferMargin.js","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,gCAAgC,EAChC,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAEL,cAAc,GAEf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,sCAAsC,KAAK,MAAM,KAAK,GAAG,CAC1D,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa,EAAE,KAAa;IAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,YAAY,KAAK,6BAA6B,CAC/C,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAkB;IAElB,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;SACxE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;SAC7D,KAAK,CACJ,sBAAsB,CACpB,QAAQ,CAAC,wBAAwB,EACjC,0BAA0B,CAC3B,CACF,CAAA;IACH,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;AAClE,CAAC"}
1
+ {"version":3,"file":"transferMargin.js","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,0BAA0B,EAC1B,UAAU,EACV,gCAAgC,EAChC,6BAA6B,EAC7B,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAEL,cAAc,GAEf,MAAM,mBAAmB,CAAA;AAE1B,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,SAAS,cAAc,CACrB,KAAgC,EAChC,KAAa;IAEb,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,sBAAsB,KAAK,QAAQ,KAAK,4BAA4B,CACrE,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAgC,EAChC,KAAa;IAEb,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC3C,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,YAAY,KAAK,6BAA6B,CAC/C,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAkB;IAElB,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,MAAM,SAAS,GAAG,qBAAqB,CACrC,gBAAgB,CACd,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,EACzD,cAAc,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,CACxD,EACD,sBAAsB,CACpB,QAAQ,CAAC,wBAAwB,EACjC,0BAA0B,CAC3B,CACF,CAAA;IACD,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,kBAAkB,CAAC,SAAS,EAAE,eAAe,EAAE,UAAU,CAAC,CAAA;AACnE,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { type ProviderWithdrawableBalance } from '@lifi/perps-sdk';
2
2
  import type { LtAccount } from '../types/account.js';
3
3
  /**
4
- * Split each held asset into the two routes a Lighter withdrawal can name:
5
- * spot draws on `balance` net of `locked_balance`, perps draws on
4
+ * Split each held asset into the two categories a Lighter withdrawal can
5
+ * name: spot draws on `balance` net of `locked_balance`, perps draws on
6
6
  * `margin_balance`. The settlement asset's perps route is also capped by the
7
7
  * account `available_balance`, which excludes the margin open positions use.
8
8
  * Every other asset's perps route reports its full `margin_balance`, uncapped,
@@ -13,7 +13,9 @@ import type { LtAccount } from '../types/account.js';
13
13
  *
14
14
  * @param settlementAssetIndex - L2 asset index of the deployment's collateral
15
15
  * asset, the only asset that `available_balance` is denominated in.
16
+ * @param perpsCategoryId - The instance's perps category id, the
17
+ * `categoryId` its collateral `Balance` rows carry.
16
18
  * @public
17
19
  */
18
- export declare const lighterWithdrawableBalances: (account: Pick<LtAccount, "assets" | "available_balance">, settlementAssetIndex: number) => ProviderWithdrawableBalance[];
20
+ export declare const lighterWithdrawableBalances: (account: Pick<LtAccount, "assets" | "available_balance">, settlementAssetIndex: number, perpsCategoryId: string) => ProviderWithdrawableBalance[];
19
21
  //# sourceMappingURL=withdrawableBalances.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,iBAAiB,CAAA;AAExB,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,EAqC7B,CAAA"}
1
+ {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,2BAA2B,EAGjC,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,mBAAmB,CAAC,EACxD,sBAAsB,MAAM,EAC5B,iBAAiB,MAAM,KACtB,2BAA2B,EA8C7B,CAAA"}