@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
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrderBookSide = exports.askOrder = exports.bidOrder = void 0;
4
+ const perps_sdk_1 = require("@lifi/perps-sdk");
5
+ const bidOrder = (a, b) => (0, perps_sdk_1.compareDecimalStrings)(b, a);
6
+ exports.bidOrder = bidOrder;
7
+ const askOrder = (a, b) => (0, perps_sdk_1.compareDecimalStrings)(a, b);
8
+ exports.askOrder = askOrder;
9
+ class OrderBookSide {
10
+ order;
11
+ providerKey;
12
+ byPrice = new Map();
13
+ levels = [];
14
+ constructor(order, providerKey) {
15
+ this.order = order;
16
+ this.providerKey = providerKey;
17
+ }
18
+ apply(updates) {
19
+ for (const { price, size } of updates) {
20
+ if (!(0, perps_sdk_1.isDecimalString)(price)) {
21
+ perps_sdk_1.wsLog.skippedRow(this.providerKey, 'order book level', 'price', price);
22
+ continue;
23
+ }
24
+ if (!(0, perps_sdk_1.isDecimalString)(size)) {
25
+ perps_sdk_1.wsLog.skippedRow(this.providerKey, 'order book level', 'size', size);
26
+ this.remove(price);
27
+ continue;
28
+ }
29
+ if ((0, perps_sdk_1.isDecimalStringZero)(size)) {
30
+ this.remove(price);
31
+ continue;
32
+ }
33
+ const existing = this.byPrice.get(price);
34
+ if (existing) {
35
+ existing.size = size;
36
+ }
37
+ else {
38
+ const level = { price, size };
39
+ this.byPrice.set(price, level);
40
+ this.levels.splice(this.bound(level.price, (c) => c > 0), 0, level);
41
+ }
42
+ }
43
+ }
44
+ toLevels() {
45
+ return this.levels.map(({ price, size }) => ({ price, size }));
46
+ }
47
+ remove(price) {
48
+ const existing = this.byPrice.get(price);
49
+ if (existing === undefined) {
50
+ return;
51
+ }
52
+ this.byPrice.delete(price);
53
+ this.levels.splice(this.levels.indexOf(existing, this.bound(existing.price, (c) => c >= 0)), 1);
54
+ }
55
+ bound(price, isPast) {
56
+ let lo = 0;
57
+ let hi = this.levels.length;
58
+ while (lo < hi) {
59
+ const mid = (lo + hi) >>> 1;
60
+ if (isPast(this.order(this.levels[mid].price, price))) {
61
+ hi = mid;
62
+ }
63
+ else {
64
+ lo = mid + 1;
65
+ }
66
+ }
67
+ return lo;
68
+ }
69
+ }
70
+ exports.OrderBookSide = OrderBookSide;
71
+ //# sourceMappingURL=orderBookSide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderBookSide.js","sourceRoot":"","sources":["../../../src/websocket/orderBookSide.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LighterProvider.d.ts","sourceRoot":"","sources":["../../src/LighterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAeL,KAAK,mBAAmB,EAqBxB,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAA;AAmCxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAQnC,OAAO,EAUL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AAiLvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,4FAA4F;IAC5F,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC;AAcD;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAChE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,YAAY,iBAAiB,EAC7B,UAAS,sBAA2B,KACnC,oBAwgDF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAS,sBAA2B,KACnC,oBACyD,CAAA;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAS,sBAA2B,KACnC,oBAA6E,CAAA;AAEhF;;;;GAIG;AACH,eAAO,MAAM,OAAO,aA7BT,sBAAsB,KAC9B,oBA4BmC,CAAA"}
1
+ {"version":3,"file":"LighterProvider.d.ts","sourceRoot":"","sources":["../../src/LighterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAgBL,KAAK,mBAAmB,EAsBxB,KAAK,cAAc,EAQpB,MAAM,iBAAiB,CAAA;AAkCxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAQnC,OAAO,EAUL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AA4LvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,4FAA4F;IAC5F,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC;AAcD;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAChE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,YAAY,iBAAiB,EAC7B,UAAS,sBAA2B,KACnC,oBA8nDF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAS,sBAA2B,KACnC,oBACyD,CAAA;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAS,sBAA2B,KACnC,oBAA6E,CAAA;AAEhF;;;;GAIG;AACH,eAAO,MAAM,OAAO,aA7BT,sBAAsB,KAC9B,oBA4BmC,CAAA"}
@@ -1,6 +1,5 @@
1
- import { ACTIVE_ORDER_STATUSES, calculateTransferable, explorerTxUrl, explorerTxUrlFromBase, getAssetRegistry, getMarketRegistry, getMarketsContext, getProviders, isActiveOrderStatus, isDecimalString, localStorageAdapter, numberToDecimalString, PerpsError, paginateActivity, resolveQuote, resolveRetryPolicy, toPerpsMarketDisplay, } from '@lifi/perps-sdk';
1
+ import { ACTIVE_ORDER_STATUSES, calculateTransferable, estimateLiquidationPriceAtMarketRate, explorerTxUrl, explorerTxUrlFromBase, getAssetRegistry, getMarketRegistry, getMarketsContext, getProviders, isActiveOrderStatus, isDecimalStringGreaterThan, localStorageAdapter, numberToDecimalString, PerpsError, paginateActivity, resolveQuote, resolveRetryPolicy, safeAbsDecimalString, safeAddDecimalString, safeMultiplyDecimalString, subtractDecimalString, toPerpsMarketDisplay, unknownToDecimalString, } from '@lifi/perps-sdk';
2
2
  import { ActionType, ActivityType, MarginMode, PerpsErrorCode, } from '@lifi/perps-types';
3
- import Big from 'big.js';
4
3
  import { boundAccountTiers, projectLighterConfigSettings, resolveAccountTier, } from './accountConfig.js';
5
4
  import { getAccountSummary, lighterConfig } from './accountSummary.js';
6
5
  import { lighterAvailableToTrade } from './availableToTrade.js';
@@ -15,13 +14,16 @@ import { LT_ACCOUNT_TRADING_MODE_SIMPLE, LT_ACCOUNT_TRADING_MODE_UNIFIED, LT_MAR
15
14
  import { decodeActivityCursor, encodeActivityCursor, } from './utils/activityCursor.js';
16
15
  import { LIGHTER_RETRY_DEFAULTS, LighterApiClient, LighterAuthRejectedError, LighterTokenRevokedError, } from './utils/apiClient.js';
17
16
  import { isAssetMarginEnabled } from './utils/assetCollateral.js';
18
- import { estimateLiquidationPrice, fetchDetailedAccount, leverageFromImf, lighterAsset, lighterWithdrawableBalances, mapFill, mapOpenPositions, mapOrder, mapPortfolioHistory, positionRemovableMargin, snapOrderPrice, snapOrderSize, toBigOrNull, toIsoFromMs, toIsoFromSeconds, toRequiredBig, } from './utils/index.js';
17
+ import { fetchDetailedAccount, leverageFromImf, lighterAsset, lighterFastWithdrawal, lighterWithdrawableBalances, lighterWithdrawalTypes, mapFill, mapOpenPositions, mapOrder, mapPortfolioHistory, positionRemovableMargin, snapOrderPrice, snapOrderSize, toIsoFromMs, toIsoFromSeconds, } from './utils/index.js';
18
+ import { requireOpenPositions } from './utils/mapOpenPositions.js';
19
19
  import { fetchRegisteredApiKey, normalizeLighterPublicKey, } from './utils/registeredApiKey.js';
20
20
  import { collateralSpotBalance, pooledSettlementSpendable, pooledSettlementUnits, } from './utils/settlementPool.js';
21
21
  import { spotPriceByAssetId, spotValuation } from './utils/spotPrice.js';
22
22
  import { isPlaceholderTxHash } from './utils/txHash.js';
23
23
  import { wireList } from './utils/wireList.js';
24
24
  const ZERO_FEE_TIER = { maker: '0', taker: '0' };
25
+ /** The sum of `values`, or `undefined` when any term is not a decimal string. */
26
+ const safeSum = (values) => values.reduce((sum, value) => sum === undefined ? undefined : safeAddDecimalString(sum, value), '0');
25
27
  const tickToFeeString = (tick) => numberToDecimalString(tick / LIGHTER_FEE_TICK_SCALE);
26
28
  const projectFeeTier = (limits) => ({
27
29
  maker: tickToFeeString(limits.current_maker_fee_tick),
@@ -306,6 +308,54 @@ export const createLighterProvider = (deployment, options = {}) => {
306
308
  return await run(fresh);
307
309
  }
308
310
  };
311
+ /**
312
+ * {@link retryOnRevoked}, then one retry with the standard token when the
313
+ * venue rejects the read-only one. The fallback sits outside
314
+ * `retryOnRevoked`, so a revocation the standard token reports never
315
+ * replaces the read-only one. The key is re-read at retry time because
316
+ * `REGISTER_API_KEY` can rotate it.
317
+ */
318
+ const retryWithStandardToken = (address, apiKey, token, run) => retryOnRevoked(address, token, run).catch(async (err) => {
319
+ if (!(err instanceof LighterAuthRejectedError) || apiKey === null) {
320
+ throw err;
321
+ }
322
+ const current = (await keyStore.get(address)) ?? apiKey;
323
+ return run(await getStandardAuthToken(address, current.apiKeyPrivateKey, {
324
+ apiKeyIndex: current.apiKeyIndex,
325
+ accountIndex: current.accountIndex,
326
+ }));
327
+ });
328
+ const perpsCategoryId = async () => {
329
+ const { providers } = await getProviders(requireClient());
330
+ return (providers
331
+ .find((p) => p.key === providerKey)
332
+ ?.categories.find((c) => c.quoteAsset !== null)?.id ?? providerKey);
333
+ };
334
+ /**
335
+ * The fast-withdraw terms for `accountIndex`, or `undefined` when no token
336
+ * resolves, a read fails, or Lighter offers no fast withdrawal.
337
+ */
338
+ const readFastWithdrawal = async (client, address, accountIndex) => {
339
+ try {
340
+ const apiKey = await keyStore.get(address);
341
+ const token = await resolveAuthToken(address, apiKey ?? undefined);
342
+ if (token === undefined) {
343
+ return undefined;
344
+ }
345
+ const info = await retryWithStandardToken(address, apiKey, token, (t) => client.getAuthed('/api/v1/fastwithdraw/info', t, { account_index: accountIndex }));
346
+ if (info.code !== 200 || !(info.to_account_index > 0)) {
347
+ return undefined;
348
+ }
349
+ const feeInfo = await retryWithStandardToken(address, apiKey, token, (t) => client.getAuthed('/api/v1/transferFeeInfo', t, {
350
+ account_index: accountIndex,
351
+ to_account_index: info.to_account_index,
352
+ }));
353
+ return lighterFastWithdrawal(info, feeInfo);
354
+ }
355
+ catch {
356
+ return undefined;
357
+ }
358
+ };
309
359
  const fetchAccountLimits = (client, accountIndex, authToken) => client.getAuthed('/api/v1/accountLimits', authToken, {
310
360
  account_index: accountIndex,
311
361
  });
@@ -409,7 +459,10 @@ export const createLighterProvider = (deployment, options = {}) => {
409
459
  if (leverage === undefined || !(leverage > 0)) {
410
460
  throw new PerpsError(PerpsErrorCode.SDKError, `The backend market '${marketId}' carries no positive Lighter default leverage`);
411
461
  }
412
- return { marginMode: MarginMode.CROSS, leverage };
462
+ return {
463
+ marginMode: MarginMode.CROSS,
464
+ leverage: numberToDecimalString(leverage),
465
+ };
413
466
  };
414
467
  const resolveAccountExists = async (address, opts) => (await fetchAccountIfExists(apiClient(opts), address)) !== undefined;
415
468
  let setupPromise;
@@ -518,24 +571,24 @@ export const createLighterProvider = (deployment, options = {}) => {
518
571
  ? readOnlyTokenManager.get(params.address, localKey.accountIndex)
519
572
  : Promise.resolve(undefined),
520
573
  ]);
521
- const positions = mapOpenPositions(account.positions, (id) => toPerpsMarketDisplay(registry.require(String(id))));
522
- const totalMarginUsed = positions.reduce((sum, p) => sum.plus(toRequiredBig(p.marginUsed, 'marginUsed')), new Big(0));
523
- const totalUnrealizedPnl = positions.reduce((sum, p) => sum.plus(toRequiredBig(p.unrealizedPnl, 'unrealizedPnl')), new Big(0));
574
+ const positions = requireOpenPositions(account.positions, (id) => toPerpsMarketDisplay(registry.require(String(id))));
575
+ const totalMarginUsed = safeSum(positions.map((p) => p.marginUsed));
576
+ const totalUnrealizedPnl = safeSum(positions.map((p) => p.unrealizedPnl));
524
577
  const instanceMeta = providers.find((p) => p.key === providerKey);
525
578
  const categories = instanceMeta?.categories ?? [];
526
579
  const perpsCategory = categories.find((c) => c.quoteAsset !== null);
527
- const availableBalance = toRequiredBig(account.available_balance, 'available_balance');
580
+ const availableBalance = unknownToDecimalString(account.available_balance, 'available_balance', providerKey);
528
581
  // Each asset has a spot route (`balance`) and a perps route
529
582
  // (`margin_balance`). The instance's settlement asset is valued 1:1; an
530
583
  // asset no spot market prices keeps a zero USD value. A unified account
531
584
  // pools both settlement routes into one spot row.
532
585
  const isPooled = (asset) => account.account_trading_mode === LT_ACCOUNT_TRADING_MODE_UNIFIED &&
533
586
  asset.asset_id === collateral.assetIndex;
534
- const heldAssets = account.assets.filter((asset) => (isPooled(asset)
587
+ const heldAssets = account.assets.filter((asset) => isDecimalStringGreaterThan(isPooled(asset)
535
588
  ? pooledSettlementUnits(asset)
536
- : toRequiredBig(asset.balance, 'balance')).gt(0));
589
+ : unknownToDecimalString(asset.balance, 'balance', providerKey), '0'));
537
590
  const marginAssets = account.assets.filter((asset) => !isPooled(asset) &&
538
- toRequiredBig(asset.margin_balance, 'margin_balance').gt(0));
591
+ isDecimalStringGreaterThan(unknownToDecimalString(asset.margin_balance, 'margin_balance', providerKey), '0'));
539
592
  const spotPrices = spotPriceByAssetId(registry.markets, LIGHTER_SPOT_CATEGORY_ID, prices, new Set([...heldAssets, ...marginAssets]
540
593
  .filter((a) => a.asset_id !== collateral.assetIndex)
541
594
  .map((a) => String(a.asset_id))));
@@ -546,7 +599,7 @@ export const createLighterProvider = (deployment, options = {}) => {
546
599
  asset,
547
600
  units,
548
601
  valueUsd,
549
- ...(price === undefined ? {} : { price: price.toFixed() }),
602
+ ...(price === undefined ? {} : { price }),
550
603
  };
551
604
  };
552
605
  const registryAsset = (a) => assetRegistry.get(String(a.asset_id)) ??
@@ -559,28 +612,26 @@ export const createLighterProvider = (deployment, options = {}) => {
559
612
  // account's free margin; every other perps-route asset releases none.
560
613
  const collateralBalances = marginAssets.map((a) => {
561
614
  const isSettlement = a.asset_id === collateral.assetIndex;
562
- const marginBalance = toRequiredBig(a.margin_balance, 'margin_balance').toFixed();
615
+ const marginBalance = unknownToDecimalString(a.margin_balance, 'margin_balance', providerKey);
563
616
  return {
564
- ...toBalance(a, perpsCategory?.id ?? providerKey, isSettlement ? settlementAsset : registryAsset(a), isDecimalString(a.margin_balance) ? a.margin_balance : marginBalance),
617
+ ...toBalance(a, perpsCategory?.id ?? providerKey, isSettlement ? settlementAsset : registryAsset(a), marginBalance),
565
618
  transferable: isSettlement
566
- ? calculateTransferable(availableBalance.toFixed(), marginBalance)
619
+ ? calculateTransferable(availableBalance, marginBalance)
567
620
  : '0',
568
621
  };
569
622
  });
570
623
  const balances = heldAssets.map((a) => {
571
624
  if (isPooled(a)) {
572
- const units = pooledSettlementUnits(a).toFixed();
625
+ const units = pooledSettlementUnits(a);
573
626
  return {
574
627
  ...toBalance(a, LIGHTER_SPOT_CATEGORY_ID, registryAsset(a), units),
575
- transferable: calculateTransferable(pooledSettlementSpendable(a, availableBalance).toFixed(), units),
628
+ transferable: calculateTransferable(pooledSettlementSpendable(a, availableBalance), units),
576
629
  };
577
630
  }
578
- const balance = toRequiredBig(a.balance, 'balance');
631
+ const balance = unknownToDecimalString(a.balance, 'balance', providerKey);
579
632
  return {
580
- ...toBalance(a, LIGHTER_SPOT_CATEGORY_ID, registryAsset(a), isDecimalString(a.balance) ? a.balance : balance.toFixed()),
581
- transferable: calculateTransferable(balance
582
- .minus(toRequiredBig(a.locked_balance, 'locked_balance'))
583
- .toFixed(), balance.toFixed()),
633
+ ...toBalance(a, LIGHTER_SPOT_CATEGORY_ID, registryAsset(a), balance),
634
+ transferable: calculateTransferable(subtractDecimalString(balance, unknownToDecimalString(a.locked_balance, 'locked_balance', providerKey)), balance),
584
635
  };
585
636
  });
586
637
  const assetCollateral = account.assets.flatMap((a) => a.margin_mode === undefined
@@ -620,8 +671,12 @@ export const createLighterProvider = (deployment, options = {}) => {
620
671
  balances,
621
672
  collateralBalances,
622
673
  positions,
623
- marginUsed: totalMarginUsed.toFixed(),
624
- unrealizedPnl: totalUnrealizedPnl.toFixed(),
674
+ ...(totalMarginUsed === undefined
675
+ ? {}
676
+ : { marginUsed: totalMarginUsed }),
677
+ ...(totalUnrealizedPnl === undefined
678
+ ? {}
679
+ : { unrealizedPnl: totalUnrealizedPnl }),
625
680
  feeTier: limitsResult === undefined
626
681
  ? ZERO_FEE_TIER
627
682
  : projectFeeTier(limitsResult),
@@ -635,8 +690,21 @@ export const createLighterProvider = (deployment, options = {}) => {
635
690
  return lighterDepositFlow(providerKey, await resolveAccountExists(params.address, opts));
636
691
  },
637
692
  async getWithdrawableBalances(params, opts) {
638
- const account = await fetchDetailedAccount(apiClient(opts), params.address);
639
- return lighterWithdrawableBalances(account, collateral.assetIndex);
693
+ const [account, categoryId] = await Promise.all([
694
+ fetchDetailedAccount(apiClient(opts), params.address),
695
+ perpsCategoryId(),
696
+ ]);
697
+ return lighterWithdrawableBalances(account, collateral.assetIndex, categoryId);
698
+ },
699
+ async getWithdrawalTypes(params, opts) {
700
+ const client = apiClient(opts);
701
+ const [account, categoryId] = await Promise.all([
702
+ fetchDetailedAccount(client, params.address),
703
+ perpsCategoryId(),
704
+ ]);
705
+ const rows = lighterWithdrawableBalances(account, collateral.assetIndex, categoryId);
706
+ const fast = await readFastWithdrawal(client, params.address, account.index);
707
+ return lighterWithdrawalTypes(rows, { categoryId, asset: { id: String(collateral.assetIndex) } }, fast);
640
708
  },
641
709
  async getPositions(params, opts) {
642
710
  const client = apiClient(opts);
@@ -668,8 +736,7 @@ export const createLighterProvider = (deployment, options = {}) => {
668
736
  }
669
737
  const account = await plugin.getAccount({ address: params.address }, opts);
670
738
  const config = lighterConfig(account);
671
- const crossFreeCollateral = toRequiredBig(config.crossAssetValue, 'crossAssetValue').minus(toRequiredBig(config.crossInitialMarginRequirement, 'crossInitialMarginRequirement'));
672
- return lighterAvailableToTrade(market, crossFreeCollateral.toFixed(), account.positions);
739
+ return lighterAvailableToTrade(market, subtractDecimalString(unknownToDecimalString(config.crossAssetValue, 'crossAssetValue', providerKey), unknownToDecimalString(config.crossInitialMarginRequirement, 'crossInitialMarginRequirement', providerKey)), account.positions);
673
740
  },
674
741
  /**
675
742
  * Lighter reports a market's margin mode and leverage on the account's
@@ -687,7 +754,7 @@ export const createLighterProvider = (deployment, options = {}) => {
687
754
  // An unparsable IMF throws; a non-positive one means no stored setting.
688
755
  const leverage = row === undefined
689
756
  ? undefined
690
- : leverageFromImf(toRequiredBig(row.initial_margin_fraction, 'initial_margin_fraction').toFixed());
757
+ : leverageFromImf(unknownToDecimalString(row.initial_margin_fraction, 'initial_margin_fraction', providerKey));
691
758
  if (row === undefined || leverage === undefined) {
692
759
  return resolveDefaultMarketSettings(marketId);
693
760
  }
@@ -755,7 +822,7 @@ export const createLighterProvider = (deployment, options = {}) => {
755
822
  continue;
756
823
  }
757
824
  const order = mapOrder(raw, market);
758
- if (statuses.has(order.status)) {
825
+ if (order !== undefined && statuses.has(order.status)) {
759
826
  orders.push(order);
760
827
  }
761
828
  }
@@ -790,7 +857,14 @@ export const createLighterProvider = (deployment, options = {}) => {
790
857
  registry.sync(),
791
858
  ]);
792
859
  const notFound = () => new PerpsError(PerpsErrorCode.OrderNotFound, `Lighter order ${params.id} not found for ${params.address}`);
793
- const detail = (order) => mapOrder(order, registry.require(String(order.market_index)));
860
+ const mapDetail = (order) => mapOrder(order, registry.require(String(order.market_index)));
861
+ const detail = (order) => {
862
+ const mapped = mapDetail(order);
863
+ if (mapped === undefined) {
864
+ throw notFound();
865
+ }
866
+ return mapped;
867
+ };
794
868
  // A tx-hash route would require mapping the caller's executeAction tx
795
869
  // hash → wasm nonce → matching order, which the LI.FI backend did via
796
870
  // its `UserAction` table; the SDK has no equivalent persistence, so we
@@ -813,7 +887,7 @@ export const createLighterProvider = (deployment, options = {}) => {
813
887
  // client order index can match more than one row. Prefer the live one.
814
888
  const matches = orders
815
889
  .filter((o) => String(o.client_order_index) === clientOrderIndex)
816
- .map(detail);
890
+ .flatMap((o) => mapDetail(o) ?? []);
817
891
  const hit = matches.find((o) => isActiveOrderStatus(o.status)) ?? matches[0];
818
892
  if (hit === undefined) {
819
893
  throw notFound();
@@ -861,10 +935,8 @@ export const createLighterProvider = (deployment, options = {}) => {
861
935
  // resolves, so its rows stay.
862
936
  const items = wireList(response.trades).flatMap((t) => {
863
937
  const market = registry.get(String(t.market_id));
864
- if (market === undefined) {
865
- return [];
866
- }
867
- return [mapFill(t, account.index, market)];
938
+ const mapped = market && mapFill(t, account.index, market);
939
+ return mapped ? [mapped] : [];
868
940
  });
869
941
  return {
870
942
  provider: providerKey,
@@ -895,22 +967,9 @@ export const createLighterProvider = (deployment, options = {}) => {
895
967
  ignore_transfers: false,
896
968
  };
897
969
  const read = (tok) => client.getAuthed('/api/v1/pnl', tok, queryParams);
898
- // The read-only token may not be accepted on `/pnl`; the standard token
899
- // is, so a read signed from the SDK's own key retries once with it. The
900
- // fallback sits outside `retryOnRevoked`, so a revocation the standard
901
- // token reports never replaces the read-only one. The key is re-read at
902
- // retry time because `REGISTER_API_KEY` can rotate it.
903
- const response = await retryOnRevoked(params.address, token, read).catch(async (err) => {
904
- if (!(err instanceof LighterAuthRejectedError) || apiKey === null) {
905
- throw err;
906
- }
907
- const current = (await keyStore.get(params.address)) ?? apiKey;
908
- return read(await getStandardAuthToken(params.address, current.apiKeyPrivateKey, {
909
- apiKeyIndex: current.apiKeyIndex,
910
- accountIndex: current.accountIndex,
911
- }));
912
- });
913
- return mapPortfolioHistory(params.range, wireList(response.pnl), new Big(getAccountSummary(account, account.positions).portfolioValue));
970
+ // The read-only token may not be accepted on `/pnl`; the standard token is.
971
+ const response = await retryWithStandardToken(params.address, apiKey, token, read);
972
+ return mapPortfolioHistory(params.range, wireList(response.pnl), getAccountSummary(account, account.positions).portfolioValue);
914
973
  },
915
974
  async getActivity(params, opts) {
916
975
  const token = await requireAuthToken('activity read', params.address);
@@ -986,8 +1045,8 @@ export const createLighterProvider = (deployment, options = {}) => {
986
1045
  if (market === undefined) {
987
1046
  return [];
988
1047
  }
989
- const price = toBigOrNull(l.trade.price);
990
- const size = toBigOrNull(l.trade.size);
1048
+ const notional = safeMultiplyDecimalString(l.trade.price, l.trade.size);
1049
+ const liquidatedNotionalPosition = notional === undefined ? undefined : safeAbsDecimalString(notional);
991
1050
  const marginMode = wireList(l.info.positions).find((p) => p.market_id === l.market_id)?.margin_mode;
992
1051
  // Lighter reports the margin mode as an integer, so the venue
993
1052
  // vocabulary the contract asks for is the SDK's own literal. An
@@ -1004,14 +1063,9 @@ export const createLighterProvider = (deployment, options = {}) => {
1004
1063
  provider: providerKey,
1005
1064
  timestamp: toIsoFromMs(l.executed_at),
1006
1065
  type: ActivityType.LIQUIDATION,
1007
- ...(price === null || size === null
1066
+ ...(liquidatedNotionalPosition === undefined
1008
1067
  ? {}
1009
- : {
1010
- liquidatedNotionalPosition: price
1011
- .times(size)
1012
- .abs()
1013
- .toFixed(),
1014
- }),
1068
+ : { liquidatedNotionalPosition }),
1015
1069
  // The account value at liquidation time is the pre-trade
1016
1070
  // snapshot, not the settled one Lighter also reports.
1017
1071
  ...(accountValue === undefined ? {} : { accountValue }),
@@ -1075,7 +1129,7 @@ export const createLighterProvider = (deployment, options = {}) => {
1075
1129
  },
1076
1130
  snapOrderPrice,
1077
1131
  snapOrderSize,
1078
- estimateLiquidationPrice,
1132
+ estimateLiquidationPrice: estimateLiquidationPriceAtMarketRate,
1079
1133
  positionRemovableMargin,
1080
1134
  projectConfig(config, setup) {
1081
1135
  if (config.provider !== providerKey) {