@lifi/perps-sdk-provider-lighter 0.2.0-alpha.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 (405) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +176 -0
  3. package/dist/cjs/LighterProvider.d.ts +20 -0
  4. package/dist/cjs/LighterProvider.d.ts.map +1 -0
  5. package/dist/cjs/LighterProvider.js +592 -0
  6. package/dist/cjs/LighterProvider.js.map +1 -0
  7. package/dist/cjs/accountConfig.d.ts +3 -0
  8. package/dist/cjs/accountConfig.d.ts.map +1 -0
  9. package/dist/cjs/accountConfig.js +69 -0
  10. package/dist/cjs/accountConfig.js.map +1 -0
  11. package/dist/cjs/accountSummary.d.ts +3 -0
  12. package/dist/cjs/accountSummary.d.ts.map +1 -0
  13. package/dist/cjs/accountSummary.js +8 -0
  14. package/dist/cjs/accountSummary.js.map +1 -0
  15. package/dist/cjs/constants.d.ts +14 -0
  16. package/dist/cjs/constants.d.ts.map +1 -0
  17. package/dist/cjs/constants.js +18 -0
  18. package/dist/cjs/constants.js.map +1 -0
  19. package/dist/cjs/index.d.ts +11 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +35 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/package.json +1 -0
  24. package/dist/cjs/signers/LighterKeyStore.d.ts +18 -0
  25. package/dist/cjs/signers/LighterKeyStore.d.ts.map +1 -0
  26. package/dist/cjs/signers/LighterKeyStore.js +54 -0
  27. package/dist/cjs/signers/LighterKeyStore.js.map +1 -0
  28. package/dist/cjs/signers/LighterReadOnlyTokenManager.d.ts +56 -0
  29. package/dist/cjs/signers/LighterReadOnlyTokenManager.d.ts.map +1 -0
  30. package/dist/cjs/signers/LighterReadOnlyTokenManager.js +127 -0
  31. package/dist/cjs/signers/LighterReadOnlyTokenManager.js.map +1 -0
  32. package/dist/cjs/signers/LighterSigner.d.ts +41 -0
  33. package/dist/cjs/signers/LighterSigner.d.ts.map +1 -0
  34. package/dist/cjs/signers/LighterSigner.js +175 -0
  35. package/dist/cjs/signers/LighterSigner.js.map +1 -0
  36. package/dist/cjs/signers/createAuthToken.d.ts +12 -0
  37. package/dist/cjs/signers/createAuthToken.d.ts.map +1 -0
  38. package/dist/cjs/signers/createAuthToken.js +28 -0
  39. package/dist/cjs/signers/createAuthToken.js.map +1 -0
  40. package/dist/cjs/signers/index.d.ts +11 -0
  41. package/dist/cjs/signers/index.d.ts.map +1 -0
  42. package/dist/cjs/signers/index.js +19 -0
  43. package/dist/cjs/signers/index.js.map +1 -0
  44. package/dist/cjs/signers/signActions.d.ts +15 -0
  45. package/dist/cjs/signers/signActions.d.ts.map +1 -0
  46. package/dist/cjs/signers/signActions.js +142 -0
  47. package/dist/cjs/signers/signActions.js.map +1 -0
  48. package/dist/cjs/signers/wasmLoader.d.ts +42 -0
  49. package/dist/cjs/signers/wasmLoader.d.ts.map +1 -0
  50. package/dist/cjs/signers/wasmLoader.js +166 -0
  51. package/dist/cjs/signers/wasmLoader.js.map +1 -0
  52. package/dist/cjs/types/account.d.ts +97 -0
  53. package/dist/cjs/types/account.d.ts.map +1 -0
  54. package/dist/cjs/types/account.js +3 -0
  55. package/dist/cjs/types/account.js.map +1 -0
  56. package/dist/cjs/types/action.d.ts +72 -0
  57. package/dist/cjs/types/action.d.ts.map +1 -0
  58. package/dist/cjs/types/action.js +23 -0
  59. package/dist/cjs/types/action.js.map +1 -0
  60. package/dist/cjs/types/activity.d.ts +73 -0
  61. package/dist/cjs/types/activity.d.ts.map +1 -0
  62. package/dist/cjs/types/activity.js +3 -0
  63. package/dist/cjs/types/activity.js.map +1 -0
  64. package/dist/cjs/types/asset.d.ts +122 -0
  65. package/dist/cjs/types/asset.d.ts.map +1 -0
  66. package/dist/cjs/types/asset.js +3 -0
  67. package/dist/cjs/types/asset.js.map +1 -0
  68. package/dist/cjs/types/fill.d.ts +29 -0
  69. package/dist/cjs/types/fill.d.ts.map +1 -0
  70. package/dist/cjs/types/fill.js +3 -0
  71. package/dist/cjs/types/fill.js.map +1 -0
  72. package/dist/cjs/types/index.d.ts +9 -0
  73. package/dist/cjs/types/index.d.ts.map +1 -0
  74. package/dist/cjs/types/index.js +25 -0
  75. package/dist/cjs/types/index.js.map +1 -0
  76. package/dist/cjs/types/order.d.ts +57 -0
  77. package/dist/cjs/types/order.d.ts.map +1 -0
  78. package/dist/cjs/types/order.js +3 -0
  79. package/dist/cjs/types/order.js.map +1 -0
  80. package/dist/cjs/types/submit.d.ts +39 -0
  81. package/dist/cjs/types/submit.d.ts.map +1 -0
  82. package/dist/cjs/types/submit.js +3 -0
  83. package/dist/cjs/types/submit.js.map +1 -0
  84. package/dist/cjs/types/ws.d.ts +84 -0
  85. package/dist/cjs/types/ws.d.ts.map +1 -0
  86. package/dist/cjs/types/ws.js +3 -0
  87. package/dist/cjs/types/ws.js.map +1 -0
  88. package/dist/cjs/utils/activityCursor.d.ts +12 -0
  89. package/dist/cjs/utils/activityCursor.d.ts.map +1 -0
  90. package/dist/cjs/utils/activityCursor.js +85 -0
  91. package/dist/cjs/utils/activityCursor.js.map +1 -0
  92. package/dist/cjs/utils/apiClient.d.ts +26 -0
  93. package/dist/cjs/utils/apiClient.d.ts.map +1 -0
  94. package/dist/cjs/utils/apiClient.js +94 -0
  95. package/dist/cjs/utils/apiClient.js.map +1 -0
  96. package/dist/cjs/utils/fetchDetailedAccount.d.ts +5 -0
  97. package/dist/cjs/utils/fetchDetailedAccount.d.ts.map +1 -0
  98. package/dist/cjs/utils/fetchDetailedAccount.js +22 -0
  99. package/dist/cjs/utils/fetchDetailedAccount.js.map +1 -0
  100. package/dist/cjs/utils/index.d.ts +16 -0
  101. package/dist/cjs/utils/index.d.ts.map +1 -0
  102. package/dist/cjs/utils/index.js +45 -0
  103. package/dist/cjs/utils/index.js.map +1 -0
  104. package/dist/cjs/utils/lighterAsset.d.ts +3 -0
  105. package/dist/cjs/utils/lighterAsset.d.ts.map +1 -0
  106. package/dist/cjs/utils/lighterAsset.js +12 -0
  107. package/dist/cjs/utils/lighterAsset.js.map +1 -0
  108. package/dist/cjs/utils/liquidation.d.ts +4 -0
  109. package/dist/cjs/utils/liquidation.d.ts.map +1 -0
  110. package/dist/cjs/utils/liquidation.js +16 -0
  111. package/dist/cjs/utils/liquidation.js.map +1 -0
  112. package/dist/cjs/utils/mapFill.d.ts +4 -0
  113. package/dist/cjs/utils/mapFill.d.ts.map +1 -0
  114. package/dist/cjs/utils/mapFill.js +61 -0
  115. package/dist/cjs/utils/mapFill.js.map +1 -0
  116. package/dist/cjs/utils/mapOpenPositions.d.ts +4 -0
  117. package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -0
  118. package/dist/cjs/utils/mapOpenPositions.js +9 -0
  119. package/dist/cjs/utils/mapOpenPositions.js.map +1 -0
  120. package/dist/cjs/utils/mapOrder.d.ts +15 -0
  121. package/dist/cjs/utils/mapOrder.d.ts.map +1 -0
  122. package/dist/cjs/utils/mapOrder.js +164 -0
  123. package/dist/cjs/utils/mapOrder.js.map +1 -0
  124. package/dist/cjs/utils/mapPosition.d.ts +4 -0
  125. package/dist/cjs/utils/mapPosition.d.ts.map +1 -0
  126. package/dist/cjs/utils/mapPosition.js +30 -0
  127. package/dist/cjs/utils/mapPosition.js.map +1 -0
  128. package/dist/cjs/utils/ohlcvInterval.d.ts +2 -0
  129. package/dist/cjs/utils/ohlcvInterval.d.ts.map +1 -0
  130. package/dist/cjs/utils/ohlcvInterval.js +26 -0
  131. package/dist/cjs/utils/ohlcvInterval.js.map +1 -0
  132. package/dist/cjs/utils/orderFormatting.d.ts +4 -0
  133. package/dist/cjs/utils/orderFormatting.d.ts.map +1 -0
  134. package/dist/cjs/utils/orderFormatting.js +23 -0
  135. package/dist/cjs/utils/orderFormatting.js.map +1 -0
  136. package/dist/cjs/utils/time.d.ts +3 -0
  137. package/dist/cjs/utils/time.d.ts.map +1 -0
  138. package/dist/cjs/utils/time.js +8 -0
  139. package/dist/cjs/utils/time.js.map +1 -0
  140. package/dist/cjs/utils/wireEncoding.d.ts +9 -0
  141. package/dist/cjs/utils/wireEncoding.d.ts.map +1 -0
  142. package/dist/cjs/utils/wireEncoding.js +87 -0
  143. package/dist/cjs/utils/wireEncoding.js.map +1 -0
  144. package/dist/cjs/websocket/LighterWsProvider.d.ts +45 -0
  145. package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -0
  146. package/dist/cjs/websocket/LighterWsProvider.js +396 -0
  147. package/dist/cjs/websocket/LighterWsProvider.js.map +1 -0
  148. package/dist/esm/LighterProvider.d.ts +105 -0
  149. package/dist/esm/LighterProvider.d.ts.map +1 -0
  150. package/dist/esm/LighterProvider.js +684 -0
  151. package/dist/esm/LighterProvider.js.map +1 -0
  152. package/dist/esm/accountConfig.d.ts +14 -0
  153. package/dist/esm/accountConfig.d.ts.map +1 -0
  154. package/dist/esm/accountConfig.js +135 -0
  155. package/dist/esm/accountConfig.js.map +1 -0
  156. package/dist/esm/accountSummary.d.ts +12 -0
  157. package/dist/esm/accountSummary.d.ts.map +1 -0
  158. package/dist/esm/accountSummary.js +14 -0
  159. package/dist/esm/accountSummary.js.map +1 -0
  160. package/dist/esm/constants.d.ts +74 -0
  161. package/dist/esm/constants.d.ts.map +1 -0
  162. package/dist/esm/constants.js +73 -0
  163. package/dist/esm/constants.js.map +1 -0
  164. package/dist/esm/index.d.ts +22 -0
  165. package/dist/esm/index.d.ts.map +1 -0
  166. package/dist/esm/index.js +22 -0
  167. package/dist/esm/index.js.map +1 -0
  168. package/dist/esm/package.json +1 -0
  169. package/dist/esm/signers/LighterKeyStore.d.ts +24 -0
  170. package/dist/esm/signers/LighterKeyStore.d.ts.map +1 -0
  171. package/dist/esm/signers/LighterKeyStore.js +55 -0
  172. package/dist/esm/signers/LighterKeyStore.js.map +1 -0
  173. package/dist/esm/signers/LighterReadOnlyTokenManager.d.ts +157 -0
  174. package/dist/esm/signers/LighterReadOnlyTokenManager.d.ts.map +1 -0
  175. package/dist/esm/signers/LighterReadOnlyTokenManager.js +194 -0
  176. package/dist/esm/signers/LighterReadOnlyTokenManager.js.map +1 -0
  177. package/dist/esm/signers/LighterSigner.d.ts +94 -0
  178. package/dist/esm/signers/LighterSigner.d.ts.map +1 -0
  179. package/dist/esm/signers/LighterSigner.js +228 -0
  180. package/dist/esm/signers/LighterSigner.js.map +1 -0
  181. package/dist/esm/signers/createAuthToken.d.ts +36 -0
  182. package/dist/esm/signers/createAuthToken.d.ts.map +1 -0
  183. package/dist/esm/signers/createAuthToken.js +42 -0
  184. package/dist/esm/signers/createAuthToken.js.map +1 -0
  185. package/dist/esm/signers/index.d.ts +11 -0
  186. package/dist/esm/signers/index.d.ts.map +1 -0
  187. package/dist/esm/signers/index.js +7 -0
  188. package/dist/esm/signers/index.js.map +1 -0
  189. package/dist/esm/signers/signActions.d.ts +54 -0
  190. package/dist/esm/signers/signActions.d.ts.map +1 -0
  191. package/dist/esm/signers/signActions.js +193 -0
  192. package/dist/esm/signers/signActions.js.map +1 -0
  193. package/dist/esm/signers/wasmLoader.d.ts +79 -0
  194. package/dist/esm/signers/wasmLoader.d.ts.map +1 -0
  195. package/dist/esm/signers/wasmLoader.js +180 -0
  196. package/dist/esm/signers/wasmLoader.js.map +1 -0
  197. package/dist/esm/types/account.d.ts +113 -0
  198. package/dist/esm/types/account.d.ts.map +1 -0
  199. package/dist/esm/types/account.js +4 -0
  200. package/dist/esm/types/account.js.map +1 -0
  201. package/dist/esm/types/action.d.ts +146 -0
  202. package/dist/esm/types/action.d.ts.map +1 -0
  203. package/dist/esm/types/action.js +50 -0
  204. package/dist/esm/types/action.js.map +1 -0
  205. package/dist/esm/types/activity.d.ts +83 -0
  206. package/dist/esm/types/activity.d.ts.map +1 -0
  207. package/dist/esm/types/activity.js +4 -0
  208. package/dist/esm/types/activity.js.map +1 -0
  209. package/dist/esm/types/asset.d.ts +134 -0
  210. package/dist/esm/types/asset.d.ts.map +1 -0
  211. package/dist/esm/types/asset.js +3 -0
  212. package/dist/esm/types/asset.js.map +1 -0
  213. package/dist/esm/types/fill.d.ts +31 -0
  214. package/dist/esm/types/fill.d.ts.map +1 -0
  215. package/dist/esm/types/fill.js +3 -0
  216. package/dist/esm/types/fill.js.map +1 -0
  217. package/dist/esm/types/index.d.ts +9 -0
  218. package/dist/esm/types/index.d.ts.map +1 -0
  219. package/dist/esm/types/index.js +12 -0
  220. package/dist/esm/types/index.js.map +1 -0
  221. package/dist/esm/types/order.d.ts +61 -0
  222. package/dist/esm/types/order.d.ts.map +1 -0
  223. package/dist/esm/types/order.js +3 -0
  224. package/dist/esm/types/order.js.map +1 -0
  225. package/dist/esm/types/submit.d.ts +76 -0
  226. package/dist/esm/types/submit.d.ts.map +1 -0
  227. package/dist/esm/types/submit.js +3 -0
  228. package/dist/esm/types/submit.js.map +1 -0
  229. package/dist/esm/types/ws.d.ts +124 -0
  230. package/dist/esm/types/ws.d.ts.map +1 -0
  231. package/dist/esm/types/ws.js +11 -0
  232. package/dist/esm/types/ws.js.map +1 -0
  233. package/dist/esm/utils/activityCursor.d.ts +51 -0
  234. package/dist/esm/utils/activityCursor.d.ts.map +1 -0
  235. package/dist/esm/utils/activityCursor.js +99 -0
  236. package/dist/esm/utils/activityCursor.js.map +1 -0
  237. package/dist/esm/utils/apiClient.d.ts +65 -0
  238. package/dist/esm/utils/apiClient.d.ts.map +1 -0
  239. package/dist/esm/utils/apiClient.js +131 -0
  240. package/dist/esm/utils/apiClient.js.map +1 -0
  241. package/dist/esm/utils/fetchDetailedAccount.d.ts +11 -0
  242. package/dist/esm/utils/fetchDetailedAccount.d.ts.map +1 -0
  243. package/dist/esm/utils/fetchDetailedAccount.js +24 -0
  244. package/dist/esm/utils/fetchDetailedAccount.js.map +1 -0
  245. package/dist/esm/utils/index.d.ts +16 -0
  246. package/dist/esm/utils/index.d.ts.map +1 -0
  247. package/dist/esm/utils/index.js +17 -0
  248. package/dist/esm/utils/index.js.map +1 -0
  249. package/dist/esm/utils/lighterAsset.d.ts +4 -0
  250. package/dist/esm/utils/lighterAsset.d.ts.map +1 -0
  251. package/dist/esm/utils/lighterAsset.js +9 -0
  252. package/dist/esm/utils/lighterAsset.js.map +1 -0
  253. package/dist/esm/utils/liquidation.d.ts +22 -0
  254. package/dist/esm/utils/liquidation.d.ts.map +1 -0
  255. package/dist/esm/utils/liquidation.js +31 -0
  256. package/dist/esm/utils/liquidation.js.map +1 -0
  257. package/dist/esm/utils/mapFill.d.ts +10 -0
  258. package/dist/esm/utils/mapFill.d.ts.map +1 -0
  259. package/dist/esm/utils/mapFill.js +72 -0
  260. package/dist/esm/utils/mapFill.js.map +1 -0
  261. package/dist/esm/utils/mapOpenPositions.d.ts +11 -0
  262. package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -0
  263. package/dist/esm/utils/mapOpenPositions.js +12 -0
  264. package/dist/esm/utils/mapOpenPositions.js.map +1 -0
  265. package/dist/esm/utils/mapOrder.d.ts +72 -0
  266. package/dist/esm/utils/mapOrder.d.ts.map +1 -0
  267. package/dist/esm/utils/mapOrder.js +219 -0
  268. package/dist/esm/utils/mapOrder.js.map +1 -0
  269. package/dist/esm/utils/mapPosition.d.ts +9 -0
  270. package/dist/esm/utils/mapPosition.d.ts.map +1 -0
  271. package/dist/esm/utils/mapPosition.js +34 -0
  272. package/dist/esm/utils/mapPosition.js.map +1 -0
  273. package/dist/esm/utils/ohlcvInterval.d.ts +3 -0
  274. package/dist/esm/utils/ohlcvInterval.d.ts.map +1 -0
  275. package/dist/esm/utils/ohlcvInterval.js +30 -0
  276. package/dist/esm/utils/ohlcvInterval.js.map +1 -0
  277. package/dist/esm/utils/orderFormatting.d.ts +29 -0
  278. package/dist/esm/utils/orderFormatting.d.ts.map +1 -0
  279. package/dist/esm/utils/orderFormatting.js +41 -0
  280. package/dist/esm/utils/orderFormatting.js.map +1 -0
  281. package/dist/esm/utils/time.d.ts +5 -0
  282. package/dist/esm/utils/time.d.ts.map +1 -0
  283. package/dist/esm/utils/time.js +5 -0
  284. package/dist/esm/utils/time.js.map +1 -0
  285. package/dist/esm/utils/wireEncoding.d.ts +72 -0
  286. package/dist/esm/utils/wireEncoding.d.ts.map +1 -0
  287. package/dist/esm/utils/wireEncoding.js +129 -0
  288. package/dist/esm/utils/wireEncoding.js.map +1 -0
  289. package/dist/esm/websocket/LighterWsProvider.d.ts +97 -0
  290. package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -0
  291. package/dist/esm/websocket/LighterWsProvider.js +489 -0
  292. package/dist/esm/websocket/LighterWsProvider.js.map +1 -0
  293. package/dist/types/LighterProvider.d.ts +105 -0
  294. package/dist/types/LighterProvider.d.ts.map +1 -0
  295. package/dist/types/accountConfig.d.ts +14 -0
  296. package/dist/types/accountConfig.d.ts.map +1 -0
  297. package/dist/types/accountSummary.d.ts +12 -0
  298. package/dist/types/accountSummary.d.ts.map +1 -0
  299. package/dist/types/constants.d.ts +74 -0
  300. package/dist/types/constants.d.ts.map +1 -0
  301. package/dist/types/index.d.ts +22 -0
  302. package/dist/types/index.d.ts.map +1 -0
  303. package/dist/types/signers/LighterKeyStore.d.ts +24 -0
  304. package/dist/types/signers/LighterKeyStore.d.ts.map +1 -0
  305. package/dist/types/signers/LighterReadOnlyTokenManager.d.ts +157 -0
  306. package/dist/types/signers/LighterReadOnlyTokenManager.d.ts.map +1 -0
  307. package/dist/types/signers/LighterSigner.d.ts +94 -0
  308. package/dist/types/signers/LighterSigner.d.ts.map +1 -0
  309. package/dist/types/signers/createAuthToken.d.ts +36 -0
  310. package/dist/types/signers/createAuthToken.d.ts.map +1 -0
  311. package/dist/types/signers/index.d.ts +11 -0
  312. package/dist/types/signers/index.d.ts.map +1 -0
  313. package/dist/types/signers/signActions.d.ts +54 -0
  314. package/dist/types/signers/signActions.d.ts.map +1 -0
  315. package/dist/types/signers/wasmLoader.d.ts +79 -0
  316. package/dist/types/signers/wasmLoader.d.ts.map +1 -0
  317. package/dist/types/types/account.d.ts +113 -0
  318. package/dist/types/types/account.d.ts.map +1 -0
  319. package/dist/types/types/action.d.ts +146 -0
  320. package/dist/types/types/action.d.ts.map +1 -0
  321. package/dist/types/types/activity.d.ts +83 -0
  322. package/dist/types/types/activity.d.ts.map +1 -0
  323. package/dist/types/types/asset.d.ts +134 -0
  324. package/dist/types/types/asset.d.ts.map +1 -0
  325. package/dist/types/types/fill.d.ts +31 -0
  326. package/dist/types/types/fill.d.ts.map +1 -0
  327. package/dist/types/types/index.d.ts +9 -0
  328. package/dist/types/types/index.d.ts.map +1 -0
  329. package/dist/types/types/order.d.ts +61 -0
  330. package/dist/types/types/order.d.ts.map +1 -0
  331. package/dist/types/types/submit.d.ts +76 -0
  332. package/dist/types/types/submit.d.ts.map +1 -0
  333. package/dist/types/types/ws.d.ts +124 -0
  334. package/dist/types/types/ws.d.ts.map +1 -0
  335. package/dist/types/utils/activityCursor.d.ts +51 -0
  336. package/dist/types/utils/activityCursor.d.ts.map +1 -0
  337. package/dist/types/utils/apiClient.d.ts +65 -0
  338. package/dist/types/utils/apiClient.d.ts.map +1 -0
  339. package/dist/types/utils/fetchDetailedAccount.d.ts +11 -0
  340. package/dist/types/utils/fetchDetailedAccount.d.ts.map +1 -0
  341. package/dist/types/utils/index.d.ts +16 -0
  342. package/dist/types/utils/index.d.ts.map +1 -0
  343. package/dist/types/utils/lighterAsset.d.ts +4 -0
  344. package/dist/types/utils/lighterAsset.d.ts.map +1 -0
  345. package/dist/types/utils/liquidation.d.ts +22 -0
  346. package/dist/types/utils/liquidation.d.ts.map +1 -0
  347. package/dist/types/utils/mapFill.d.ts +10 -0
  348. package/dist/types/utils/mapFill.d.ts.map +1 -0
  349. package/dist/types/utils/mapOpenPositions.d.ts +11 -0
  350. package/dist/types/utils/mapOpenPositions.d.ts.map +1 -0
  351. package/dist/types/utils/mapOrder.d.ts +72 -0
  352. package/dist/types/utils/mapOrder.d.ts.map +1 -0
  353. package/dist/types/utils/mapPosition.d.ts +9 -0
  354. package/dist/types/utils/mapPosition.d.ts.map +1 -0
  355. package/dist/types/utils/ohlcvInterval.d.ts +3 -0
  356. package/dist/types/utils/ohlcvInterval.d.ts.map +1 -0
  357. package/dist/types/utils/orderFormatting.d.ts +29 -0
  358. package/dist/types/utils/orderFormatting.d.ts.map +1 -0
  359. package/dist/types/utils/time.d.ts +5 -0
  360. package/dist/types/utils/time.d.ts.map +1 -0
  361. package/dist/types/utils/wireEncoding.d.ts +72 -0
  362. package/dist/types/utils/wireEncoding.d.ts.map +1 -0
  363. package/dist/types/websocket/LighterWsProvider.d.ts +97 -0
  364. package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -0
  365. package/dist/wasm/lighter-signer.wasm +0 -0
  366. package/dist/wasm/wasm_exec.js +575 -0
  367. package/package.json +67 -0
  368. package/src/LighterProvider.ts +1167 -0
  369. package/src/accountConfig.ts +162 -0
  370. package/src/accountSummary.ts +22 -0
  371. package/src/constants.ts +89 -0
  372. package/src/index.ts +37 -0
  373. package/src/signers/LighterKeyStore.ts +79 -0
  374. package/src/signers/LighterReadOnlyTokenManager.ts +340 -0
  375. package/src/signers/LighterSigner.ts +400 -0
  376. package/src/signers/createAuthToken.ts +69 -0
  377. package/src/signers/index.ts +36 -0
  378. package/src/signers/signActions.ts +311 -0
  379. package/src/signers/wasmLoader.ts +293 -0
  380. package/src/types/account.ts +123 -0
  381. package/src/types/action.ts +163 -0
  382. package/src/types/activity.ts +94 -0
  383. package/src/types/asset.ts +146 -0
  384. package/src/types/fill.ts +42 -0
  385. package/src/types/index.ts +12 -0
  386. package/src/types/order.ts +65 -0
  387. package/src/types/submit.ts +83 -0
  388. package/src/types/ws.ts +136 -0
  389. package/src/utils/activityCursor.ts +150 -0
  390. package/src/utils/apiClient.ts +185 -0
  391. package/src/utils/fetchDetailedAccount.ts +46 -0
  392. package/src/utils/index.ts +38 -0
  393. package/src/utils/lighterAsset.ts +10 -0
  394. package/src/utils/liquidation.ts +39 -0
  395. package/src/utils/mapFill.ts +108 -0
  396. package/src/utils/mapOpenPositions.ts +18 -0
  397. package/src/utils/mapOrder.ts +258 -0
  398. package/src/utils/mapPosition.ts +42 -0
  399. package/src/utils/ohlcvInterval.ts +34 -0
  400. package/src/utils/orderFormatting.ts +46 -0
  401. package/src/utils/time.ts +6 -0
  402. package/src/utils/wireEncoding.ts +179 -0
  403. package/src/websocket/LighterWsProvider.ts +725 -0
  404. package/wasm/lighter-signer.wasm +0 -0
  405. package/wasm/wasm_exec.js +575 -0
@@ -0,0 +1,51 @@
1
+ import { type ActivityItem } from '@lifi/perps-types';
2
+ /**
3
+ * Per-endpoint cursor envelope for Lighter activity pagination.
4
+ *
5
+ * Each key holds the upstream `cursor` / `next_cursor` returned by that
6
+ * endpoint on the previous call. When a key is **present** with a non-empty
7
+ * string the corresponding endpoint will be re-fetched at that cursor on the
8
+ * next call; when a key is **absent** the endpoint is treated as exhausted
9
+ * (or never paged because the type filter excluded it) and skipped.
10
+ *
11
+ * The envelope is round-tripped through `cursor` as base64url JSON so callers
12
+ * don't need to know the per-endpoint shape. The encoding mirrors the LI.FI
13
+ * backend's wire format so cursors created by the backend remain usable.
14
+ * @public
15
+ */
16
+ export interface LighterActivityCursor {
17
+ deposits?: string;
18
+ withdraws?: string;
19
+ fundings?: string;
20
+ liquidations?: string;
21
+ transfers?: string;
22
+ /**
23
+ * Already-fetched, merged-and-sorted rows that did not fit under the page
24
+ * `limit`. The upstream cursors above have advanced past these rows, so they
25
+ * are replayed (prepended) on the next page before any fresh fetch — without
26
+ * them the tail would be lost forever.
27
+ */
28
+ overflow?: ActivityItem[];
29
+ }
30
+ /**
31
+ * Encode a `LighterActivityCursor` as the base64url-of-JSON cursor string
32
+ * Lighter widgets persist between activity pages. Returns `undefined` when
33
+ * every per-endpoint key is empty and no `overflow` rows remain — the caller
34
+ * should report `hasMore: false` and omit `cursor` from `Pagination` then.
35
+ *
36
+ * Browser-direct: `Buffer` is Node-only. We use `btoa` over a Latin-1
37
+ * encoding of the UTF-8 bytes and then rewrite `+/=` to base64url. This is
38
+ * the same byte sequence Node's `Buffer.from(json, 'utf8').toString('base64url')`
39
+ * produces, so cursors round-trip across environments.
40
+ * @public
41
+ */
42
+ export declare const encodeActivityCursor: (env: LighterActivityCursor) => string | undefined;
43
+ /**
44
+ * Decode a previously-encoded activity cursor. Returns `undefined` for an
45
+ * absent cursor (first page) and throws {@link PerpsError} with
46
+ * `ValidationError` if the string is malformed — we'd rather fail loudly than
47
+ * silently re-page from page 1 and re-deliver already-paginated rows.
48
+ * @public
49
+ */
50
+ export declare const decodeActivityCursor: (cursor: string | undefined) => LighterActivityCursor | undefined;
51
+ //# sourceMappingURL=activityCursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activityCursor.d.ts","sourceRoot":"","sources":["../../../src/utils/activityCursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,mBAAmB,CAAA;AAErE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;CAC1B;AAaD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,GAC/B,KAAK,qBAAqB,KACzB,MAAM,GAAG,SAcX,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,GAAG,SAAS,KACzB,qBAAqB,GAAG,SA6C1B,CAAA"}
@@ -0,0 +1,99 @@
1
+ import { PerpsError } from '@lifi/perps-sdk';
2
+ import { PerpsErrorCode } from '@lifi/perps-types';
3
+ const CURSOR_KEYS = [
4
+ 'deposits',
5
+ 'withdraws',
6
+ 'fundings',
7
+ 'liquidations',
8
+ 'transfers',
9
+ ];
10
+ const isNonEmpty = (v) => typeof v === 'string' && v.length > 0;
11
+ /**
12
+ * Encode a `LighterActivityCursor` as the base64url-of-JSON cursor string
13
+ * Lighter widgets persist between activity pages. Returns `undefined` when
14
+ * every per-endpoint key is empty and no `overflow` rows remain — the caller
15
+ * should report `hasMore: false` and omit `cursor` from `Pagination` then.
16
+ *
17
+ * Browser-direct: `Buffer` is Node-only. We use `btoa` over a Latin-1
18
+ * encoding of the UTF-8 bytes and then rewrite `+/=` to base64url. This is
19
+ * the same byte sequence Node's `Buffer.from(json, 'utf8').toString('base64url')`
20
+ * produces, so cursors round-trip across environments.
21
+ * @public
22
+ */
23
+ export const encodeActivityCursor = (env) => {
24
+ const compact = {};
25
+ for (const key of CURSOR_KEYS) {
26
+ if (isNonEmpty(env[key])) {
27
+ compact[key] = env[key];
28
+ }
29
+ }
30
+ if (env.overflow !== undefined && env.overflow.length > 0) {
31
+ compact.overflow = env.overflow;
32
+ }
33
+ if (Object.keys(compact).length === 0) {
34
+ return undefined;
35
+ }
36
+ return toBase64Url(JSON.stringify(compact));
37
+ };
38
+ /**
39
+ * Decode a previously-encoded activity cursor. Returns `undefined` for an
40
+ * absent cursor (first page) and throws {@link PerpsError} with
41
+ * `ValidationError` if the string is malformed — we'd rather fail loudly than
42
+ * silently re-page from page 1 and re-deliver already-paginated rows.
43
+ * @public
44
+ */
45
+ export const decodeActivityCursor = (cursor) => {
46
+ if (cursor === undefined) {
47
+ return undefined;
48
+ }
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(fromBase64Url(cursor));
52
+ }
53
+ catch {
54
+ throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Lighter activity cursor: not base64url-encoded JSON');
55
+ }
56
+ if (parsed === null || typeof parsed !== 'object') {
57
+ throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Lighter activity cursor: expected JSON object');
58
+ }
59
+ const cursorRecord = parsed;
60
+ const env = {};
61
+ for (const key of CURSOR_KEYS) {
62
+ const v = cursorRecord[key];
63
+ if (v === undefined) {
64
+ continue;
65
+ }
66
+ if (typeof v !== 'string') {
67
+ throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid Lighter activity cursor: ${key} must be a string`);
68
+ }
69
+ env[key] = v;
70
+ }
71
+ const overflow = cursorRecord.overflow;
72
+ if (overflow !== undefined) {
73
+ if (!Array.isArray(overflow)) {
74
+ throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Lighter activity cursor: overflow must be an array');
75
+ }
76
+ env.overflow = overflow;
77
+ }
78
+ return env;
79
+ };
80
+ const toBase64Url = (s) => {
81
+ if (typeof Buffer !== 'undefined') {
82
+ return Buffer.from(s, 'utf8').toString('base64url');
83
+ }
84
+ const utf8 = unescape(encodeURIComponent(s));
85
+ return btoa(utf8).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
86
+ };
87
+ const fromBase64Url = (s) => {
88
+ if (typeof Buffer !== 'undefined') {
89
+ return Buffer.from(s, 'base64url').toString('utf8');
90
+ }
91
+ const padded = s.replace(/-/g, '+').replace(/_/g, '/') + padFor(s);
92
+ const decoded = atob(padded);
93
+ return decodeURIComponent(escape(decoded));
94
+ };
95
+ const padFor = (s) => {
96
+ const rem = s.length % 4;
97
+ return rem === 0 ? '' : '='.repeat(4 - rem);
98
+ };
99
+ //# sourceMappingURL=activityCursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activityCursor.js","sourceRoot":"","sources":["../../../src/utils/activityCursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { PerpsError, type ResolvedRetryPolicy } from '@lifi/perps-sdk';
2
+ /** @internal */
3
+ export type ApiParams = Record<string, string | number | boolean>;
4
+ /**
5
+ * Auth-gated read whose token Lighter rejected. Distinct from a generic
6
+ * {@link PerpsError} so callers can evict the stored read-only token and retry
7
+ * with a freshly-created one. Lighter signals this on either channel: an HTTP
8
+ * 401/403, or an HTTP 200 carrying an error `code` in the body.
9
+ * @internal
10
+ */
11
+ export declare class LighterAuthRejectedError extends PerpsError {
12
+ }
13
+ /** @internal */
14
+ export declare const LIGHTER_RETRY_DEFAULTS: ResolvedRetryPolicy;
15
+ /** @internal */
16
+ export interface LighterApiClientOptions {
17
+ signal?: AbortSignal;
18
+ policy?: ResolvedRetryPolicy;
19
+ fetchImpl?: typeof fetch;
20
+ }
21
+ /**
22
+ * HTTP boundary against Lighter's REST API.
23
+ *
24
+ * Browser-direct by design: no LI.FI backend hop, no caching shim — caller
25
+ * supplies the REST base URL, the path, and any query params, and we return
26
+ * the parsed JSON body. Lighter advertises CORS headers on every public
27
+ * endpoint so a vanilla `fetch` from the widget works.
28
+ *
29
+ * Auth-gated endpoints (accountLimits, accountActiveOrders, deposit/history,
30
+ * withdraw/history, positionFunding, liquidations, transfer/history) take the
31
+ * Lighter read-only token as the `auth` query parameter — NOT as an
32
+ * `Authorization` header. This matches Lighter's OpenAPI spec and lets the
33
+ * same call work browser-direct and from server-side proxies.
34
+ *
35
+ * Lighter signals rate limiting via 429 OR 405 (documented behaviour) with a
36
+ * documented 60s firewall cooldown. The default {@link ResolvedRetryPolicy}
37
+ * waits long enough to avoid hammering through the cooldown.
38
+ * @public
39
+ */
40
+ export declare class LighterApiClient {
41
+ private readonly baseUrl;
42
+ private readonly signal;
43
+ private readonly policy;
44
+ private readonly fetchImpl;
45
+ constructor(baseUrl: string, options?: LighterApiClientOptions);
46
+ private buildUrl;
47
+ get<T>(path: string, params?: ApiParams): Promise<T>;
48
+ /**
49
+ * Auth-gated GET. The token is appended as the `auth` query parameter (per
50
+ * Lighter's OpenAPI spec); the `Authorization` header is intentionally NOT
51
+ * used — Lighter rejects it.
52
+ */
53
+ getAuthed<T>(path: string, authToken: string, params?: ApiParams): Promise<T>;
54
+ /**
55
+ * GET that surfaces the raw `{status, body}` pair without throwing on
56
+ * non-2xx — used for endpoints (account lookup by L1 address) where the
57
+ * caller distinguishes specific Lighter error codes from generic failures.
58
+ */
59
+ getWithStatus<T>(path: string, params?: ApiParams): Promise<{
60
+ status: number;
61
+ data: T;
62
+ }>;
63
+ private getChecked;
64
+ }
65
+ //# sourceMappingURL=apiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../../src/utils/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAA;AAOxB,gBAAgB;AAChB,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;AAejE;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,UAAU;CAAG;AAO3D,gBAAgB;AAChB,eAAO,MAAM,sBAAsB,EAAE,mBAmBpC,CAAA;AAED,gBAAgB;AAChB,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB;IAO9D,OAAO,CAAC,QAAQ;IAaV,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1D;;;;OAIG;IACG,SAAS,CAAC,CAAC,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,SAAc,GACrB,OAAO,CAAC,CAAC,CAAC;IAoBb;;;;OAIG;IACG,aAAa,CAAC,CAAC,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;YAWzB,UAAU;CAiBzB"}
@@ -0,0 +1,131 @@
1
+ import { fetchWithRetry, PerpsError, } from '@lifi/perps-sdk';
2
+ import { PerpsErrorCode } from '@lifi/perps-types';
3
+ import { LIGHTER_INVALID_AUTH_CODE, LIGHTER_SUCCESS_CODES, } from '../constants.js';
4
+ /**
5
+ * Lighter signals errors on two channels: a non-2xx HTTP status, or an HTTP 200
6
+ * carrying an error `code` in the JSON body. Returns the body error `code` when
7
+ * the body advertises one that is not a success code, else `undefined`.
8
+ */
9
+ const lighterBodyErrorCode = (data) => {
10
+ const code = data?.code;
11
+ if (code === undefined || LIGHTER_SUCCESS_CODES.has(code)) {
12
+ return undefined;
13
+ }
14
+ return code;
15
+ };
16
+ /**
17
+ * Auth-gated read whose token Lighter rejected. Distinct from a generic
18
+ * {@link PerpsError} so callers can evict the stored read-only token and retry
19
+ * with a freshly-created one. Lighter signals this on either channel: an HTTP
20
+ * 401/403, or an HTTP 200 carrying an error `code` in the body.
21
+ * @internal
22
+ */
23
+ export class LighterAuthRejectedError extends PerpsError {
24
+ }
25
+ const isLighterAuthRejection = (status, data) => status === 401 ||
26
+ status === 403 ||
27
+ lighterBodyErrorCode(data) === LIGHTER_INVALID_AUTH_CODE;
28
+ /** @internal */
29
+ export const LIGHTER_RETRY_DEFAULTS = {
30
+ enabled: true,
31
+ maxAttempts: 2,
32
+ baseDelayMs: 10_000,
33
+ maxDelayMs: 60_000,
34
+ respectRetryAfter: true,
35
+ classify: ({ response }) => {
36
+ if (response.status === 429 || response.status === 405) {
37
+ return 'retry-rate-limit';
38
+ }
39
+ if (response.status === 502 ||
40
+ response.status === 503 ||
41
+ response.status === 504) {
42
+ return 'retry-server';
43
+ }
44
+ return 'fail';
45
+ },
46
+ };
47
+ /**
48
+ * HTTP boundary against Lighter's REST API.
49
+ *
50
+ * Browser-direct by design: no LI.FI backend hop, no caching shim — caller
51
+ * supplies the REST base URL, the path, and any query params, and we return
52
+ * the parsed JSON body. Lighter advertises CORS headers on every public
53
+ * endpoint so a vanilla `fetch` from the widget works.
54
+ *
55
+ * Auth-gated endpoints (accountLimits, accountActiveOrders, deposit/history,
56
+ * withdraw/history, positionFunding, liquidations, transfer/history) take the
57
+ * Lighter read-only token as the `auth` query parameter — NOT as an
58
+ * `Authorization` header. This matches Lighter's OpenAPI spec and lets the
59
+ * same call work browser-direct and from server-side proxies.
60
+ *
61
+ * Lighter signals rate limiting via 429 OR 405 (documented behaviour) with a
62
+ * documented 60s firewall cooldown. The default {@link ResolvedRetryPolicy}
63
+ * waits long enough to avoid hammering through the cooldown.
64
+ * @public
65
+ */
66
+ export class LighterApiClient {
67
+ baseUrl;
68
+ signal;
69
+ policy;
70
+ fetchImpl;
71
+ constructor(baseUrl, options) {
72
+ this.baseUrl = baseUrl.replace(/\/$/, '');
73
+ this.signal = options?.signal;
74
+ this.policy = options?.policy ?? LIGHTER_RETRY_DEFAULTS;
75
+ this.fetchImpl = options?.fetchImpl;
76
+ }
77
+ buildUrl(path, params) {
78
+ const url = `${this.baseUrl}${path}`;
79
+ if (!params || Object.keys(params).length === 0) {
80
+ return url;
81
+ }
82
+ const qs = Object.entries(params)
83
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
84
+ .join('&');
85
+ return `${url}?${qs}`;
86
+ }
87
+ async get(path, params) {
88
+ return this.getChecked(path, params);
89
+ }
90
+ /**
91
+ * Auth-gated GET. The token is appended as the `auth` query parameter (per
92
+ * Lighter's OpenAPI spec); the `Authorization` header is intentionally NOT
93
+ * used — Lighter rejects it.
94
+ */
95
+ async getAuthed(path, authToken, params = {}) {
96
+ const { status, data } = await this.getWithStatus(path, {
97
+ ...params,
98
+ auth: authToken,
99
+ });
100
+ if (isLighterAuthRejection(status, data)) {
101
+ throw new LighterAuthRejectedError(PerpsErrorCode.ThirdPartyError, `Lighter rejected the auth token for ${path}`);
102
+ }
103
+ if (status < 200 || status >= 300) {
104
+ throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter API request failed: ${status} — ${JSON.stringify(data).slice(0, 200)}`);
105
+ }
106
+ return data;
107
+ }
108
+ /**
109
+ * GET that surfaces the raw `{status, body}` pair without throwing on
110
+ * non-2xx — used for endpoints (account lookup by L1 address) where the
111
+ * caller distinguishes specific Lighter error codes from generic failures.
112
+ */
113
+ async getWithStatus(path, params) {
114
+ const url = this.buildUrl(path, params);
115
+ const response = await fetchWithRetry(url, {}, { policy: this.policy, fetchImpl: this.fetchImpl, signal: this.signal });
116
+ const data = (await response.json().catch(() => undefined));
117
+ return { status: response.status, data };
118
+ }
119
+ async getChecked(path, params) {
120
+ const { status, data } = await this.getWithStatus(path, params);
121
+ if (status < 200 || status >= 300) {
122
+ throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter API request failed: ${status} — ${JSON.stringify(data).slice(0, 200)}`);
123
+ }
124
+ const errorCode = lighterBodyErrorCode(data);
125
+ if (errorCode !== undefined) {
126
+ throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter API error for ${path}: code ${errorCode} — ${JSON.stringify(data).slice(0, 200)}`);
127
+ }
128
+ return data;
129
+ }
130
+ }
131
+ //# sourceMappingURL=apiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../../src/utils/apiClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Address } from 'viem';
2
+ import type { LtDetailedAccount } from '../types/index.js';
3
+ import type { LighterApiClient } from './apiClient.js';
4
+ /**
5
+ * Look up the Lighter account for an L1 address via `/api/v1/account`,
6
+ * discriminating Lighter's account-not-found body code from generic failures.
7
+ *
8
+ * @public
9
+ */
10
+ export declare const fetchDetailedAccount: (client: LighterApiClient, address: Address) => Promise<LtDetailedAccount>;
11
+ //# sourceMappingURL=fetchDetailedAccount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchDetailedAccount.d.ts","sourceRoot":"","sources":["../../../src/utils/fetchDetailedAccount.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,gBAAgB,EACxB,SAAS,OAAO,KACf,OAAO,CAAC,iBAAiB,CA6B3B,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { PerpsError } from '@lifi/perps-sdk';
2
+ import { PerpsErrorCode } from '@lifi/perps-types';
3
+ import { LIGHTER_CODE_ACCOUNT_NOT_FOUND } from '../constants.js';
4
+ /**
5
+ * Look up the Lighter account for an L1 address via `/api/v1/account`,
6
+ * discriminating Lighter's account-not-found body code from generic failures.
7
+ *
8
+ * @public
9
+ */
10
+ export const fetchDetailedAccount = async (client, address) => {
11
+ const { status, data } = await client.getWithStatus('/api/v1/account', { by: 'l1_address', value: address });
12
+ if (status === 400 && data?.code === LIGHTER_CODE_ACCOUNT_NOT_FOUND) {
13
+ throw new PerpsError(PerpsErrorCode.AccountNotFound, `No Lighter account found for address: ${address}`);
14
+ }
15
+ if (status < 200 || status >= 300) {
16
+ throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter account request failed: ${status} — ${JSON.stringify(data).slice(0, 200)}`);
17
+ }
18
+ const accounts = data?.accounts;
19
+ if (accounts === undefined || accounts.length === 0) {
20
+ throw new PerpsError(PerpsErrorCode.AccountNotFound, `No Lighter account found for address: ${address}`);
21
+ }
22
+ return accounts[0];
23
+ };
24
+ //# sourceMappingURL=fetchDetailedAccount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchDetailedAccount.js","sourceRoot":"","sources":["../../../src/utils/fetchDetailedAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAA;AAIhE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACvC,MAAwB,EACxB,OAAgB,EACY,EAAE;IAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAIhD,iBAAiB,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAE3D,IAAI,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,8BAA8B,EAAE,CAAC;QACpE,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,yCAAyC,OAAO,EAAE,CACnD,CAAA;IACH,CAAC;IAED,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,mCAAmC,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACpF,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAA;IAC/B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,yCAAyC,OAAO,EAAE,CACnD,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA"}
@@ -0,0 +1,16 @@
1
+ export type { LighterActivityCursor } from './activityCursor.js';
2
+ export { decodeActivityCursor, encodeActivityCursor, } from './activityCursor.js';
3
+ export { LighterApiClient } from './apiClient.js';
4
+ export { fetchDetailedAccount } from './fetchDetailedAccount.js';
5
+ export { lighterAsset } from './lighterAsset.js';
6
+ export { estimateLiquidationPrice } from './liquidation.js';
7
+ export { mapFill } from './mapFill.js';
8
+ export { mapOpenPositions } from './mapOpenPositions.js';
9
+ export { classifyAndMapOrders, isTriggerOrder, isTriggerType, mapOrder, mapOrderDetail, mapStatusReason, mapTriggerOrder, } from './mapOrder.js';
10
+ export { mapPosition } from './mapPosition.js';
11
+ export { mapInterval } from './ohlcvInterval.js';
12
+ export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
13
+ export { toIsoFromMs, toIsoFromSeconds } from './time.js';
14
+ export type { ScaleToIntegerPolicy } from './wireEncoding.js';
15
+ export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, scaleToInteger, } from './wireEncoding.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,17 @@
1
+ // biome-ignore-all lint/performance/noBarrelFile: single re-export entry point
2
+ // for the package's utility surface. Internal modules import per-file paths
3
+ // (e.g. `./apiClient.js`, `./mapFill.js`) directly.
4
+ export { decodeActivityCursor, encodeActivityCursor, } from './activityCursor.js';
5
+ export { LighterApiClient } from './apiClient.js';
6
+ export { fetchDetailedAccount } from './fetchDetailedAccount.js';
7
+ export { lighterAsset } from './lighterAsset.js';
8
+ export { estimateLiquidationPrice } from './liquidation.js';
9
+ export { mapFill } from './mapFill.js';
10
+ export { mapOpenPositions } from './mapOpenPositions.js';
11
+ export { classifyAndMapOrders, isTriggerOrder, isTriggerType, mapOrder, mapOrderDetail, mapStatusReason, mapTriggerOrder, } from './mapOrder.js';
12
+ export { mapPosition } from './mapPosition.js';
13
+ export { mapInterval } from './ohlcvInterval.js';
14
+ export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
15
+ export { toIsoFromMs, toIsoFromSeconds } from './time.js';
16
+ export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, scaleToInteger, } from './wireEncoding.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,oDAAoD;AAGpD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAEzD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Asset } from '@lifi/perps-types';
2
+ /** @public */
3
+ export declare const lighterAsset: (id: string, displaySymbol: string) => Asset;
4
+ //# sourceMappingURL=lighterAsset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lighterAsset.d.ts","sourceRoot":"","sources":["../../../src/utils/lighterAsset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG9C,cAAc;AACd,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,EAAE,eAAe,MAAM,KAAG,KAK/D,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { LIGHTER_PROVIDER_KEY } from '../constants.js';
2
+ /** @public */
3
+ export const lighterAsset = (id, displaySymbol) => ({
4
+ providerId: LIGHTER_PROVIDER_KEY,
5
+ id,
6
+ displaySymbol,
7
+ logoURI: '',
8
+ });
9
+ //# sourceMappingURL=lighterAsset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lighterAsset.js","sourceRoot":"","sources":["../../../src/utils/lighterAsset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD,cAAc;AACd,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,aAAqB,EAAS,EAAE,CAAC,CAAC;IACzE,UAAU,EAAE,oBAAoB;IAChC,EAAE;IACF,aAAa;IACb,OAAO,EAAE,EAAE;CACZ,CAAC,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Lighter liquidation price estimation.
3
+ *
4
+ * Lighter publishes a flat per-market `maintenance_margin_fraction` on its
5
+ * order books, surfaced on the generic {@link PerpsMarket} as
6
+ * `maintenanceMarginRate`. The estimate is the standard isolated-margin
7
+ * model parameterised by that rate.
8
+ */
9
+ import { type LiquidationEstimateParams } from '@lifi/perps-sdk';
10
+ import type { PerpsMarket } from '@lifi/perps-types';
11
+ /**
12
+ * Estimate the liquidation price of a new isolated position on a Lighter
13
+ * market.
14
+ *
15
+ * @returns The estimated liquidation price, or `undefined` when
16
+ * `market.maintenanceMarginRate` is absent (the model cannot be evaluated
17
+ * without the venue's maintenance margin rate) or the inputs are
18
+ * degenerate.
19
+ * @public
20
+ */
21
+ export declare function estimateLiquidationPrice(market: PerpsMarket, params: LiquidationEstimateParams): number | undefined;
22
+ //# sourceMappingURL=liquidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquidation.d.ts","sourceRoot":"","sources":["../../../src/utils/liquidation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,yBAAyB,GAChC,MAAM,GAAG,SAAS,CAUpB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Lighter liquidation price estimation.
3
+ *
4
+ * Lighter publishes a flat per-market `maintenance_margin_fraction` on its
5
+ * order books, surfaced on the generic {@link PerpsMarket} as
6
+ * `maintenanceMarginRate`. The estimate is the standard isolated-margin
7
+ * model parameterised by that rate.
8
+ */
9
+ import { estimateIsolatedLiquidationPrice, } from '@lifi/perps-sdk';
10
+ /**
11
+ * Estimate the liquidation price of a new isolated position on a Lighter
12
+ * market.
13
+ *
14
+ * @returns The estimated liquidation price, or `undefined` when
15
+ * `market.maintenanceMarginRate` is absent (the model cannot be evaluated
16
+ * without the venue's maintenance margin rate) or the inputs are
17
+ * degenerate.
18
+ * @public
19
+ */
20
+ export function estimateLiquidationPrice(market, params) {
21
+ if (market.maintenanceMarginRate === undefined) {
22
+ return undefined;
23
+ }
24
+ return estimateIsolatedLiquidationPrice({
25
+ entryPrice: params.entryPrice,
26
+ leverage: params.leverage,
27
+ isLong: params.isLong,
28
+ maintenanceMarginRate: market.maintenanceMarginRate,
29
+ });
30
+ }
31
+ //# sourceMappingURL=liquidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquidation.js","sourceRoot":"","sources":["../../../src/utils/liquidation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gCAAgC,GAEjC,MAAM,iBAAiB,CAAA;AAGxB;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAmB,EACnB,MAAiC;IAEjC,IAAI,MAAM,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,gCAAgC,CAAC;QACtC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;KACpD,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Fill, MarketDisplay } from '@lifi/perps-types';
2
+ import type { LtTrade } from '../types/index.js';
3
+ /**
4
+ * Map a raw Lighter trade to the generic Fill type.
5
+ * @param accountIndex - The viewer's Lighter account index (selects buy/sell side and maker/taker role).
6
+ * @param market - Backend-resolved market identity for `trade.market_id`.
7
+ * @public
8
+ */
9
+ export declare const mapFill: (trade: LtTrade, accountIndex: number, market: MarketDisplay) => Fill;
10
+ //# sourceMappingURL=mapFill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapFill.d.ts","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAQ5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAyChD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAClB,OAAO,OAAO,EACd,cAAc,MAAM,EACpB,QAAQ,aAAa,KACpB,IA2CF,CAAA"}
@@ -0,0 +1,72 @@
1
+ import { classifyFillFromPosition, ExplorerChainId, explorerTxUrl, } from '@lifi/perps-sdk';
2
+ import { FillStatus, LiquidityRole, OrderSide, OrderType, } from '@lifi/perps-types';
3
+ import Big from 'big.js';
4
+ /**
5
+ * Realized PnL on a position-reducing fill, derived from the pre-trade entry
6
+ * basis. Returns `undefined` for opens/increases (nothing closes) or when the
7
+ * entry-quote snapshot is absent, and `null` when the closed portion realizes
8
+ * exactly zero — mirroring the Hyperliquid mapper's `null`-for-zero convention.
9
+ */
10
+ const deriveRealizedPnl = (startPosition, entryQuoteBefore, fillSize, fillPrice, isBuyer) => {
11
+ if (entryQuoteBefore === undefined) {
12
+ return undefined;
13
+ }
14
+ const start = new Big(startPosition);
15
+ if (start.eq(0)) {
16
+ return undefined;
17
+ }
18
+ const isLong = start.gt(0);
19
+ const reducing = isLong ? !isBuyer : isBuyer;
20
+ if (!reducing) {
21
+ return undefined;
22
+ }
23
+ const absStart = start.abs();
24
+ const fill = new Big(fillSize);
25
+ // A fill larger than the open size flips the position; only the portion that
26
+ // unwinds the existing position realizes PnL.
27
+ const closedSize = fill.gt(absStart) ? absStart : fill;
28
+ const avgEntry = new Big(entryQuoteBefore).abs().div(absStart);
29
+ const price = new Big(fillPrice);
30
+ const pnl = isLong
31
+ ? price.minus(avgEntry).times(closedSize)
32
+ : avgEntry.minus(price).times(closedSize);
33
+ return pnl.eq(0) ? null : pnl.toString();
34
+ };
35
+ /**
36
+ * Map a raw Lighter trade to the generic Fill type.
37
+ * @param accountIndex - The viewer's Lighter account index (selects buy/sell side and maker/taker role).
38
+ * @param market - Backend-resolved market identity for `trade.market_id`.
39
+ * @public
40
+ */
41
+ export const mapFill = (trade, accountIndex, market) => {
42
+ const isBuyer = trade.bid_account_id === accountIndex;
43
+ const isMaker = (trade.is_maker_ask && !isBuyer) || (!trade.is_maker_ask && isBuyer);
44
+ // Lighter publishes both counterparties' position-before snapshots on every
45
+ // trade row; reading the wrong one mis-classifies when they differ.
46
+ const startPosition = isMaker
47
+ ? trade.maker_position_size_before
48
+ : trade.taker_position_size_before;
49
+ const entryQuoteBefore = isMaker
50
+ ? trade.maker_entry_quote_before
51
+ : trade.taker_entry_quote_before;
52
+ return {
53
+ id: trade.trade_id.toString(),
54
+ orderId: String(isBuyer ? trade.bid_id : trade.ask_id),
55
+ market,
56
+ side: isBuyer ? OrderSide.BUY : OrderSide.SELL,
57
+ type: OrderType.LIMIT,
58
+ size: trade.size,
59
+ price: trade.price,
60
+ status: FillStatus.FILLED,
61
+ liquidity: isMaker ? LiquidityRole.MAKER : LiquidityRole.TAKER,
62
+ fee: isMaker ? trade.maker_fee?.toString() : trade.taker_fee?.toString(),
63
+ realizedPnl: deriveRealizedPnl(startPosition, entryQuoteBefore, trade.size, trade.price, isBuyer),
64
+ startPosition,
65
+ // `classifyFillFromPosition` takes an HL-encoded side: `'B'` for buy,
66
+ // anything else for sell.
67
+ classification: classifyFillFromPosition(startPosition, isBuyer ? 'B' : 'A', trade.size),
68
+ createdAt: new Date(trade.timestamp).toISOString(),
69
+ explorerLink: explorerTxUrl(ExplorerChainId.LIGHTER, trade.tx_hash),
70
+ };
71
+ };
72
+ //# sourceMappingURL=mapFill.js.map