@lifi/perps-sdk 0.0.0-preview-64fca0d

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 (675) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cjs/client/PerpsClient.d.ts +63 -0
  3. package/dist/cjs/client/PerpsClient.d.ts.map +1 -0
  4. package/dist/cjs/client/PerpsClient.js +269 -0
  5. package/dist/cjs/client/PerpsClient.js.map +1 -0
  6. package/dist/cjs/client/bindProvider.d.ts +3 -0
  7. package/dist/cjs/client/bindProvider.d.ts.map +1 -0
  8. package/dist/cjs/client/bindProvider.js +9 -0
  9. package/dist/cjs/client/bindProvider.js.map +1 -0
  10. package/dist/cjs/client/createPerpsClient.d.ts +10 -0
  11. package/dist/cjs/client/createPerpsClient.d.ts.map +1 -0
  12. package/dist/cjs/client/createPerpsClient.js +54 -0
  13. package/dist/cjs/client/createPerpsClient.js.map +1 -0
  14. package/dist/cjs/client/requireProvider.d.ts +3 -0
  15. package/dist/cjs/client/requireProvider.d.ts.map +1 -0
  16. package/dist/cjs/client/requireProvider.js +16 -0
  17. package/dist/cjs/client/requireProvider.js.map +1 -0
  18. package/dist/cjs/errors/PerpsError.d.ts +8 -0
  19. package/dist/cjs/errors/PerpsError.d.ts.map +1 -0
  20. package/dist/cjs/errors/PerpsError.js +15 -0
  21. package/dist/cjs/errors/PerpsError.js.map +1 -0
  22. package/dist/cjs/errors/constants.d.ts +5 -0
  23. package/dist/cjs/errors/constants.d.ts.map +1 -0
  24. package/dist/cjs/errors/constants.js +9 -0
  25. package/dist/cjs/errors/constants.js.map +1 -0
  26. package/dist/cjs/index.d.ts +78 -0
  27. package/dist/cjs/index.d.ts.map +1 -0
  28. package/dist/cjs/index.js +168 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/package.json +1 -0
  31. package/dist/cjs/registry/assetRegistry.d.ts +11 -0
  32. package/dist/cjs/registry/assetRegistry.d.ts.map +1 -0
  33. package/dist/cjs/registry/assetRegistry.js +39 -0
  34. package/dist/cjs/registry/assetRegistry.js.map +1 -0
  35. package/dist/cjs/registry/marketRegistry.d.ts +13 -0
  36. package/dist/cjs/registry/marketRegistry.d.ts.map +1 -0
  37. package/dist/cjs/registry/marketRegistry.js +58 -0
  38. package/dist/cjs/registry/marketRegistry.js.map +1 -0
  39. package/dist/cjs/registry/referenceDataRegistry.d.ts +20 -0
  40. package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -0
  41. package/dist/cjs/registry/referenceDataRegistry.js +59 -0
  42. package/dist/cjs/registry/referenceDataRegistry.js.map +1 -0
  43. package/dist/cjs/services/createAction.d.ts +13 -0
  44. package/dist/cjs/services/createAction.d.ts.map +1 -0
  45. package/dist/cjs/services/createAction.js +17 -0
  46. package/dist/cjs/services/createAction.js.map +1 -0
  47. package/dist/cjs/services/executeAction.d.ts +13 -0
  48. package/dist/cjs/services/executeAction.d.ts.map +1 -0
  49. package/dist/cjs/services/executeAction.js +18 -0
  50. package/dist/cjs/services/executeAction.js.map +1 -0
  51. package/dist/cjs/services/getAccount.d.ts +10 -0
  52. package/dist/cjs/services/getAccount.d.ts.map +1 -0
  53. package/dist/cjs/services/getAccount.js +8 -0
  54. package/dist/cjs/services/getAccount.js.map +1 -0
  55. package/dist/cjs/services/getActivity.d.ts +15 -0
  56. package/dist/cjs/services/getActivity.d.ts.map +1 -0
  57. package/dist/cjs/services/getActivity.js +15 -0
  58. package/dist/cjs/services/getActivity.js.map +1 -0
  59. package/dist/cjs/services/getAssets.d.ts +8 -0
  60. package/dist/cjs/services/getAssets.d.ts.map +1 -0
  61. package/dist/cjs/services/getAssets.js +11 -0
  62. package/dist/cjs/services/getAssets.js.map +1 -0
  63. package/dist/cjs/services/getFills.d.ts +14 -0
  64. package/dist/cjs/services/getFills.d.ts.map +1 -0
  65. package/dist/cjs/services/getFills.js +14 -0
  66. package/dist/cjs/services/getFills.js.map +1 -0
  67. package/dist/cjs/services/getMarket.d.ts +9 -0
  68. package/dist/cjs/services/getMarket.d.ts.map +1 -0
  69. package/dist/cjs/services/getMarket.js +13 -0
  70. package/dist/cjs/services/getMarket.js.map +1 -0
  71. package/dist/cjs/services/getMarkets.d.ts +9 -0
  72. package/dist/cjs/services/getMarkets.d.ts.map +1 -0
  73. package/dist/cjs/services/getMarkets.js +12 -0
  74. package/dist/cjs/services/getMarkets.js.map +1 -0
  75. package/dist/cjs/services/getMeta.d.ts +5 -0
  76. package/dist/cjs/services/getMeta.d.ts.map +1 -0
  77. package/dist/cjs/services/getMeta.js +8 -0
  78. package/dist/cjs/services/getMeta.js.map +1 -0
  79. package/dist/cjs/services/getOhlcv.d.ts +13 -0
  80. package/dist/cjs/services/getOhlcv.d.ts.map +1 -0
  81. package/dist/cjs/services/getOhlcv.js +16 -0
  82. package/dist/cjs/services/getOhlcv.js.map +1 -0
  83. package/dist/cjs/services/getOrder.d.ts +11 -0
  84. package/dist/cjs/services/getOrder.d.ts.map +1 -0
  85. package/dist/cjs/services/getOrder.js +8 -0
  86. package/dist/cjs/services/getOrder.js.map +1 -0
  87. package/dist/cjs/services/getOrderbook.d.ts +10 -0
  88. package/dist/cjs/services/getOrderbook.d.ts.map +1 -0
  89. package/dist/cjs/services/getOrderbook.js +13 -0
  90. package/dist/cjs/services/getOrderbook.js.map +1 -0
  91. package/dist/cjs/services/getOrders.d.ts +13 -0
  92. package/dist/cjs/services/getOrders.d.ts.map +1 -0
  93. package/dist/cjs/services/getOrders.js +13 -0
  94. package/dist/cjs/services/getOrders.js.map +1 -0
  95. package/dist/cjs/services/getPositions.d.ts +13 -0
  96. package/dist/cjs/services/getPositions.d.ts.map +1 -0
  97. package/dist/cjs/services/getPositions.js +13 -0
  98. package/dist/cjs/services/getPositions.js.map +1 -0
  99. package/dist/cjs/services/getPrices.d.ts +9 -0
  100. package/dist/cjs/services/getPrices.d.ts.map +1 -0
  101. package/dist/cjs/services/getPrices.js +12 -0
  102. package/dist/cjs/services/getPrices.js.map +1 -0
  103. package/dist/cjs/services/getProviders.d.ts +5 -0
  104. package/dist/cjs/services/getProviders.d.ts.map +1 -0
  105. package/dist/cjs/services/getProviders.js +8 -0
  106. package/dist/cjs/services/getProviders.js.map +1 -0
  107. package/dist/cjs/services/getQuote.d.ts +12 -0
  108. package/dist/cjs/services/getQuote.d.ts.map +1 -0
  109. package/dist/cjs/services/getQuote.js +13 -0
  110. package/dist/cjs/services/getQuote.js.map +1 -0
  111. package/dist/cjs/services/getTermsAcceptance.d.ts +6 -0
  112. package/dist/cjs/services/getTermsAcceptance.d.ts.map +1 -0
  113. package/dist/cjs/services/getTermsAcceptance.js +9 -0
  114. package/dist/cjs/services/getTermsAcceptance.js.map +1 -0
  115. package/dist/cjs/services/resolveQuote.d.ts +6 -0
  116. package/dist/cjs/services/resolveQuote.d.ts.map +1 -0
  117. package/dist/cjs/services/resolveQuote.js +36 -0
  118. package/dist/cjs/services/resolveQuote.js.map +1 -0
  119. package/dist/cjs/services/resolveSubscribeQuote.d.ts +6 -0
  120. package/dist/cjs/services/resolveSubscribeQuote.d.ts.map +1 -0
  121. package/dist/cjs/services/resolveSubscribeQuote.js +63 -0
  122. package/dist/cjs/services/resolveSubscribeQuote.js.map +1 -0
  123. package/dist/cjs/storage/parseStoredRecord.d.ts +4 -0
  124. package/dist/cjs/storage/parseStoredRecord.d.ts.map +1 -0
  125. package/dist/cjs/storage/parseStoredRecord.js +26 -0
  126. package/dist/cjs/storage/parseStoredRecord.js.map +1 -0
  127. package/dist/cjs/storage/storage.d.ts +4 -0
  128. package/dist/cjs/storage/storage.d.ts.map +1 -0
  129. package/dist/cjs/storage/storage.js +47 -0
  130. package/dist/cjs/storage/storage.js.map +1 -0
  131. package/dist/cjs/storage/types.d.ts +6 -0
  132. package/dist/cjs/storage/types.d.ts.map +1 -0
  133. package/dist/cjs/storage/types.js +3 -0
  134. package/dist/cjs/storage/types.js.map +1 -0
  135. package/dist/cjs/transport/fetchWithRetry.d.ts +8 -0
  136. package/dist/cjs/transport/fetchWithRetry.d.ts.map +1 -0
  137. package/dist/cjs/transport/fetchWithRetry.js +81 -0
  138. package/dist/cjs/transport/fetchWithRetry.js.map +1 -0
  139. package/dist/cjs/transport/request.d.ts +8 -0
  140. package/dist/cjs/transport/request.d.ts.map +1 -0
  141. package/dist/cjs/transport/request.js +75 -0
  142. package/dist/cjs/transport/request.js.map +1 -0
  143. package/dist/cjs/transport/retryPolicy.d.ts +37 -0
  144. package/dist/cjs/transport/retryPolicy.d.ts.map +1 -0
  145. package/dist/cjs/transport/retryPolicy.js +79 -0
  146. package/dist/cjs/transport/retryPolicy.js.map +1 -0
  147. package/dist/cjs/types/api.d.ts +85 -0
  148. package/dist/cjs/types/api.d.ts.map +1 -0
  149. package/dist/cjs/types/api.js +3 -0
  150. package/dist/cjs/types/api.js.map +1 -0
  151. package/dist/cjs/types/config.d.ts +26 -0
  152. package/dist/cjs/types/config.d.ts.map +1 -0
  153. package/dist/cjs/types/config.js +3 -0
  154. package/dist/cjs/types/config.js.map +1 -0
  155. package/dist/cjs/types/provider.d.ts +84 -0
  156. package/dist/cjs/types/provider.d.ts.map +1 -0
  157. package/dist/cjs/types/provider.js +3 -0
  158. package/dist/cjs/types/provider.js.map +1 -0
  159. package/dist/cjs/utils/accountSummary.d.ts +3 -0
  160. package/dist/cjs/utils/accountSummary.d.ts.map +1 -0
  161. package/dist/cjs/utils/accountSummary.js +25 -0
  162. package/dist/cjs/utils/accountSummary.js.map +1 -0
  163. package/dist/cjs/utils/assertNever.d.ts +2 -0
  164. package/dist/cjs/utils/assertNever.d.ts.map +1 -0
  165. package/dist/cjs/utils/assertNever.js +7 -0
  166. package/dist/cjs/utils/assertNever.js.map +1 -0
  167. package/dist/cjs/utils/calculations.d.ts +51 -0
  168. package/dist/cjs/utils/calculations.d.ts.map +1 -0
  169. package/dist/cjs/utils/calculations.js +149 -0
  170. package/dist/cjs/utils/calculations.js.map +1 -0
  171. package/dist/cjs/utils/depositChain.d.ts +6 -0
  172. package/dist/cjs/utils/depositChain.d.ts.map +1 -0
  173. package/dist/cjs/utils/depositChain.js +13 -0
  174. package/dist/cjs/utils/depositChain.js.map +1 -0
  175. package/dist/cjs/utils/explorer.d.ts +9 -0
  176. package/dist/cjs/utils/explorer.d.ts.map +1 -0
  177. package/dist/cjs/utils/explorer.js +23 -0
  178. package/dist/cjs/utils/explorer.js.map +1 -0
  179. package/dist/cjs/utils/fillClassification.d.ts +3 -0
  180. package/dist/cjs/utils/fillClassification.d.ts.map +1 -0
  181. package/dist/cjs/utils/fillClassification.js +37 -0
  182. package/dist/cjs/utils/fillClassification.js.map +1 -0
  183. package/dist/cjs/utils/format.d.ts +13 -0
  184. package/dist/cjs/utils/format.d.ts.map +1 -0
  185. package/dist/cjs/utils/format.js +117 -0
  186. package/dist/cjs/utils/format.js.map +1 -0
  187. package/dist/cjs/utils/orderClassification.d.ts +10 -0
  188. package/dist/cjs/utils/orderClassification.d.ts.map +1 -0
  189. package/dist/cjs/utils/orderClassification.js +49 -0
  190. package/dist/cjs/utils/orderClassification.js.map +1 -0
  191. package/dist/cjs/utils/orderMath.d.ts +6 -0
  192. package/dist/cjs/utils/orderMath.d.ts.map +1 -0
  193. package/dist/cjs/utils/orderMath.js +71 -0
  194. package/dist/cjs/utils/orderMath.js.map +1 -0
  195. package/dist/cjs/utils/parse.d.ts +2 -0
  196. package/dist/cjs/utils/parse.d.ts.map +1 -0
  197. package/dist/cjs/utils/parse.js +14 -0
  198. package/dist/cjs/utils/parse.js.map +1 -0
  199. package/dist/cjs/utils/positionMath.d.ts +32 -0
  200. package/dist/cjs/utils/positionMath.d.ts.map +1 -0
  201. package/dist/cjs/utils/positionMath.js +52 -0
  202. package/dist/cjs/utils/positionMath.js.map +1 -0
  203. package/dist/cjs/utils/signTypedData.d.ts +5 -0
  204. package/dist/cjs/utils/signTypedData.d.ts.map +1 -0
  205. package/dist/cjs/utils/signTypedData.js +23 -0
  206. package/dist/cjs/utils/signTypedData.js.map +1 -0
  207. package/dist/cjs/utils/sleep.d.ts +2 -0
  208. package/dist/cjs/utils/sleep.d.ts.map +1 -0
  209. package/dist/cjs/utils/sleep.js +6 -0
  210. package/dist/cjs/utils/sleep.js.map +1 -0
  211. package/dist/cjs/utils/units.d.ts +3 -0
  212. package/dist/cjs/utils/units.d.ts.map +1 -0
  213. package/dist/cjs/utils/units.js +18 -0
  214. package/dist/cjs/utils/units.js.map +1 -0
  215. package/dist/cjs/utils/validation.d.ts +2 -0
  216. package/dist/cjs/utils/validation.d.ts.map +1 -0
  217. package/dist/cjs/utils/validation.js +16 -0
  218. package/dist/cjs/utils/validation.js.map +1 -0
  219. package/dist/cjs/version.d.ts +3 -0
  220. package/dist/cjs/version.d.ts.map +1 -0
  221. package/dist/cjs/version.js +6 -0
  222. package/dist/cjs/version.js.map +1 -0
  223. package/dist/cjs/websocket/PerpsWsClient.d.ts +27 -0
  224. package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -0
  225. package/dist/cjs/websocket/PerpsWsClient.js +84 -0
  226. package/dist/cjs/websocket/PerpsWsClient.js.map +1 -0
  227. package/dist/cjs/websocket/ReconnectingWebSocket.d.ts +52 -0
  228. package/dist/cjs/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  229. package/dist/cjs/websocket/ReconnectingWebSocket.js +213 -0
  230. package/dist/cjs/websocket/ReconnectingWebSocket.js.map +1 -0
  231. package/dist/cjs/websocket/WsProviderBase.d.ts +31 -0
  232. package/dist/cjs/websocket/WsProviderBase.d.ts.map +1 -0
  233. package/dist/cjs/websocket/WsProviderBase.js +197 -0
  234. package/dist/cjs/websocket/WsProviderBase.js.map +1 -0
  235. package/dist/cjs/websocket/cachePromise.d.ts +2 -0
  236. package/dist/cjs/websocket/cachePromise.d.ts.map +1 -0
  237. package/dist/cjs/websocket/cachePromise.js +18 -0
  238. package/dist/cjs/websocket/cachePromise.js.map +1 -0
  239. package/dist/cjs/websocket/types.d.ts +15 -0
  240. package/dist/cjs/websocket/types.d.ts.map +1 -0
  241. package/dist/cjs/websocket/types.js +3 -0
  242. package/dist/cjs/websocket/types.js.map +1 -0
  243. package/dist/cjs/websocket/wsLog.d.ts +10 -0
  244. package/dist/cjs/websocket/wsLog.d.ts.map +1 -0
  245. package/dist/cjs/websocket/wsLog.js +31 -0
  246. package/dist/cjs/websocket/wsLog.js.map +1 -0
  247. package/dist/esm/client/PerpsClient.d.ts +285 -0
  248. package/dist/esm/client/PerpsClient.d.ts.map +1 -0
  249. package/dist/esm/client/PerpsClient.js +498 -0
  250. package/dist/esm/client/PerpsClient.js.map +1 -0
  251. package/dist/esm/client/bindProvider.d.ts +13 -0
  252. package/dist/esm/client/bindProvider.d.ts.map +1 -0
  253. package/dist/esm/client/bindProvider.js +16 -0
  254. package/dist/esm/client/bindProvider.js.map +1 -0
  255. package/dist/esm/client/createPerpsClient.d.ts +37 -0
  256. package/dist/esm/client/createPerpsClient.d.ts.map +1 -0
  257. package/dist/esm/client/createPerpsClient.js +76 -0
  258. package/dist/esm/client/createPerpsClient.js.map +1 -0
  259. package/dist/esm/client/requireProvider.d.ts +12 -0
  260. package/dist/esm/client/requireProvider.d.ts.map +1 -0
  261. package/dist/esm/client/requireProvider.js +22 -0
  262. package/dist/esm/client/requireProvider.js.map +1 -0
  263. package/dist/esm/errors/PerpsError.d.ts +16 -0
  264. package/dist/esm/errors/PerpsError.d.ts.map +1 -0
  265. package/dist/esm/errors/PerpsError.js +19 -0
  266. package/dist/esm/errors/PerpsError.js.map +1 -0
  267. package/dist/esm/errors/constants.d.ts +11 -0
  268. package/dist/esm/errors/constants.d.ts.map +1 -0
  269. package/dist/esm/errors/constants.js +12 -0
  270. package/dist/esm/errors/constants.js.map +1 -0
  271. package/dist/esm/index.d.ts +86 -0
  272. package/dist/esm/index.d.ts.map +1 -0
  273. package/dist/esm/index.js +63 -0
  274. package/dist/esm/index.js.map +1 -0
  275. package/dist/esm/package.json +1 -0
  276. package/dist/esm/registry/assetRegistry.d.ts +25 -0
  277. package/dist/esm/registry/assetRegistry.d.ts.map +1 -0
  278. package/dist/esm/registry/assetRegistry.js +48 -0
  279. package/dist/esm/registry/assetRegistry.js.map +1 -0
  280. package/dist/esm/registry/marketRegistry.d.ts +42 -0
  281. package/dist/esm/registry/marketRegistry.d.ts.map +1 -0
  282. package/dist/esm/registry/marketRegistry.js +81 -0
  283. package/dist/esm/registry/marketRegistry.js.map +1 -0
  284. package/dist/esm/registry/referenceDataRegistry.d.ts +44 -0
  285. package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -0
  286. package/dist/esm/registry/referenceDataRegistry.js +79 -0
  287. package/dist/esm/registry/referenceDataRegistry.js.map +1 -0
  288. package/dist/esm/services/createAction.d.ts +26 -0
  289. package/dist/esm/services/createAction.d.ts.map +1 -0
  290. package/dist/esm/services/createAction.js +22 -0
  291. package/dist/esm/services/createAction.js.map +1 -0
  292. package/dist/esm/services/executeAction.d.ts +26 -0
  293. package/dist/esm/services/executeAction.d.ts.map +1 -0
  294. package/dist/esm/services/executeAction.js +26 -0
  295. package/dist/esm/services/executeAction.js.map +1 -0
  296. package/dist/esm/services/getAccount.d.ts +35 -0
  297. package/dist/esm/services/getAccount.d.ts.map +1 -0
  298. package/dist/esm/services/getAccount.js +25 -0
  299. package/dist/esm/services/getAccount.js.map +1 -0
  300. package/dist/esm/services/getActivity.d.ts +39 -0
  301. package/dist/esm/services/getActivity.d.ts.map +1 -0
  302. package/dist/esm/services/getActivity.js +29 -0
  303. package/dist/esm/services/getActivity.js.map +1 -0
  304. package/dist/esm/services/getAssets.d.ts +27 -0
  305. package/dist/esm/services/getAssets.d.ts.map +1 -0
  306. package/dist/esm/services/getAssets.js +22 -0
  307. package/dist/esm/services/getAssets.js.map +1 -0
  308. package/dist/esm/services/getFills.d.ts +38 -0
  309. package/dist/esm/services/getFills.d.ts.map +1 -0
  310. package/dist/esm/services/getFills.js +28 -0
  311. package/dist/esm/services/getFills.js.map +1 -0
  312. package/dist/esm/services/getMarket.d.ts +34 -0
  313. package/dist/esm/services/getMarket.d.ts.map +1 -0
  314. package/dist/esm/services/getMarket.js +25 -0
  315. package/dist/esm/services/getMarket.js.map +1 -0
  316. package/dist/esm/services/getMarkets.d.ts +28 -0
  317. package/dist/esm/services/getMarkets.d.ts.map +1 -0
  318. package/dist/esm/services/getMarkets.js +22 -0
  319. package/dist/esm/services/getMarkets.js.map +1 -0
  320. package/dist/esm/services/getMeta.d.ts +21 -0
  321. package/dist/esm/services/getMeta.d.ts.map +1 -0
  322. package/dist/esm/services/getMeta.js +21 -0
  323. package/dist/esm/services/getMeta.js.map +1 -0
  324. package/dist/esm/services/getOhlcv.d.ts +36 -0
  325. package/dist/esm/services/getOhlcv.d.ts.map +1 -0
  326. package/dist/esm/services/getOhlcv.js +28 -0
  327. package/dist/esm/services/getOhlcv.js.map +1 -0
  328. package/dist/esm/services/getOrder.d.ts +33 -0
  329. package/dist/esm/services/getOrder.d.ts.map +1 -0
  330. package/dist/esm/services/getOrder.js +22 -0
  331. package/dist/esm/services/getOrder.js.map +1 -0
  332. package/dist/esm/services/getOrderbook.d.ts +24 -0
  333. package/dist/esm/services/getOrderbook.d.ts.map +1 -0
  334. package/dist/esm/services/getOrderbook.js +17 -0
  335. package/dist/esm/services/getOrderbook.js.map +1 -0
  336. package/dist/esm/services/getOrders.d.ts +35 -0
  337. package/dist/esm/services/getOrders.d.ts.map +1 -0
  338. package/dist/esm/services/getOrders.js +26 -0
  339. package/dist/esm/services/getOrders.js.map +1 -0
  340. package/dist/esm/services/getPositions.d.ts +35 -0
  341. package/dist/esm/services/getPositions.d.ts.map +1 -0
  342. package/dist/esm/services/getPositions.js +26 -0
  343. package/dist/esm/services/getPositions.js.map +1 -0
  344. package/dist/esm/services/getPrices.d.ts +21 -0
  345. package/dist/esm/services/getPrices.d.ts.map +1 -0
  346. package/dist/esm/services/getPrices.js +15 -0
  347. package/dist/esm/services/getPrices.js.map +1 -0
  348. package/dist/esm/services/getProviders.d.ts +22 -0
  349. package/dist/esm/services/getProviders.d.ts.map +1 -0
  350. package/dist/esm/services/getProviders.js +22 -0
  351. package/dist/esm/services/getProviders.js.map +1 -0
  352. package/dist/esm/services/getQuote.d.ts +42 -0
  353. package/dist/esm/services/getQuote.d.ts.map +1 -0
  354. package/dist/esm/services/getQuote.js +33 -0
  355. package/dist/esm/services/getQuote.js.map +1 -0
  356. package/dist/esm/services/getTermsAcceptance.d.ts +26 -0
  357. package/dist/esm/services/getTermsAcceptance.d.ts.map +1 -0
  358. package/dist/esm/services/getTermsAcceptance.js +26 -0
  359. package/dist/esm/services/getTermsAcceptance.js.map +1 -0
  360. package/dist/esm/services/resolveQuote.d.ts +26 -0
  361. package/dist/esm/services/resolveQuote.d.ts.map +1 -0
  362. package/dist/esm/services/resolveQuote.js +52 -0
  363. package/dist/esm/services/resolveQuote.js.map +1 -0
  364. package/dist/esm/services/resolveSubscribeQuote.d.ts +31 -0
  365. package/dist/esm/services/resolveSubscribeQuote.d.ts.map +1 -0
  366. package/dist/esm/services/resolveSubscribeQuote.js +84 -0
  367. package/dist/esm/services/resolveSubscribeQuote.js.map +1 -0
  368. package/dist/esm/storage/parseStoredRecord.d.ts +29 -0
  369. package/dist/esm/storage/parseStoredRecord.d.ts.map +1 -0
  370. package/dist/esm/storage/parseStoredRecord.js +47 -0
  371. package/dist/esm/storage/parseStoredRecord.js.map +1 -0
  372. package/dist/esm/storage/storage.d.ts +15 -0
  373. package/dist/esm/storage/storage.d.ts.map +1 -0
  374. package/dist/esm/storage/storage.js +56 -0
  375. package/dist/esm/storage/storage.js.map +1 -0
  376. package/dist/esm/storage/types.d.ts +14 -0
  377. package/dist/esm/storage/types.d.ts.map +1 -0
  378. package/dist/esm/storage/types.js +2 -0
  379. package/dist/esm/storage/types.js.map +1 -0
  380. package/dist/esm/transport/fetchWithRetry.d.ts +22 -0
  381. package/dist/esm/transport/fetchWithRetry.d.ts.map +1 -0
  382. package/dist/esm/transport/fetchWithRetry.js +87 -0
  383. package/dist/esm/transport/fetchWithRetry.js.map +1 -0
  384. package/dist/esm/transport/request.d.ts +25 -0
  385. package/dist/esm/transport/request.d.ts.map +1 -0
  386. package/dist/esm/transport/request.js +82 -0
  387. package/dist/esm/transport/request.js.map +1 -0
  388. package/dist/esm/transport/retryPolicy.d.ts +106 -0
  389. package/dist/esm/transport/retryPolicy.d.ts.map +1 -0
  390. package/dist/esm/transport/retryPolicy.js +99 -0
  391. package/dist/esm/transport/retryPolicy.js.map +1 -0
  392. package/dist/esm/types/api.d.ts +214 -0
  393. package/dist/esm/types/api.d.ts.map +1 -0
  394. package/dist/esm/types/api.js +2 -0
  395. package/dist/esm/types/api.js.map +1 -0
  396. package/dist/esm/types/config.d.ts +70 -0
  397. package/dist/esm/types/config.d.ts.map +1 -0
  398. package/dist/esm/types/config.js +2 -0
  399. package/dist/esm/types/config.js.map +1 -0
  400. package/dist/esm/types/provider.d.ts +330 -0
  401. package/dist/esm/types/provider.d.ts.map +1 -0
  402. package/dist/esm/types/provider.js +2 -0
  403. package/dist/esm/types/provider.js.map +1 -0
  404. package/dist/esm/utils/accountSummary.d.ts +13 -0
  405. package/dist/esm/utils/accountSummary.d.ts.map +1 -0
  406. package/dist/esm/utils/accountSummary.js +32 -0
  407. package/dist/esm/utils/accountSummary.js.map +1 -0
  408. package/dist/esm/utils/assertNever.d.ts +20 -0
  409. package/dist/esm/utils/assertNever.d.ts.map +1 -0
  410. package/dist/esm/utils/assertNever.js +22 -0
  411. package/dist/esm/utils/assertNever.js.map +1 -0
  412. package/dist/esm/utils/calculations.d.ts +223 -0
  413. package/dist/esm/utils/calculations.d.ts.map +1 -0
  414. package/dist/esm/utils/calculations.js +291 -0
  415. package/dist/esm/utils/calculations.js.map +1 -0
  416. package/dist/esm/utils/depositChain.d.ts +25 -0
  417. package/dist/esm/utils/depositChain.d.ts.map +1 -0
  418. package/dist/esm/utils/depositChain.js +23 -0
  419. package/dist/esm/utils/depositChain.js.map +1 -0
  420. package/dist/esm/utils/explorer.d.ts +33 -0
  421. package/dist/esm/utils/explorer.d.ts.map +1 -0
  422. package/dist/esm/utils/explorer.js +38 -0
  423. package/dist/esm/utils/explorer.js.map +1 -0
  424. package/dist/esm/utils/fillClassification.d.ts +13 -0
  425. package/dist/esm/utils/fillClassification.d.ts.map +1 -0
  426. package/dist/esm/utils/fillClassification.js +44 -0
  427. package/dist/esm/utils/fillClassification.js.map +1 -0
  428. package/dist/esm/utils/format.d.ts +66 -0
  429. package/dist/esm/utils/format.d.ts.map +1 -0
  430. package/dist/esm/utils/format.js +171 -0
  431. package/dist/esm/utils/format.js.map +1 -0
  432. package/dist/esm/utils/orderClassification.d.ts +47 -0
  433. package/dist/esm/utils/orderClassification.d.ts.map +1 -0
  434. package/dist/esm/utils/orderClassification.js +78 -0
  435. package/dist/esm/utils/orderClassification.js.map +1 -0
  436. package/dist/esm/utils/orderMath.d.ts +44 -0
  437. package/dist/esm/utils/orderMath.d.ts.map +1 -0
  438. package/dist/esm/utils/orderMath.js +103 -0
  439. package/dist/esm/utils/orderMath.js.map +1 -0
  440. package/dist/esm/utils/parse.d.ts +22 -0
  441. package/dist/esm/utils/parse.d.ts.map +1 -0
  442. package/dist/esm/utils/parse.js +31 -0
  443. package/dist/esm/utils/parse.js.map +1 -0
  444. package/dist/esm/utils/positionMath.d.ts +107 -0
  445. package/dist/esm/utils/positionMath.d.ts.map +1 -0
  446. package/dist/esm/utils/positionMath.js +119 -0
  447. package/dist/esm/utils/positionMath.js.map +1 -0
  448. package/dist/esm/utils/signTypedData.d.ts +18 -0
  449. package/dist/esm/utils/signTypedData.d.ts.map +1 -0
  450. package/dist/esm/utils/signTypedData.js +32 -0
  451. package/dist/esm/utils/signTypedData.js.map +1 -0
  452. package/dist/esm/utils/sleep.d.ts +7 -0
  453. package/dist/esm/utils/sleep.d.ts.map +1 -0
  454. package/dist/esm/utils/sleep.js +7 -0
  455. package/dist/esm/utils/sleep.js.map +1 -0
  456. package/dist/esm/utils/units.d.ts +27 -0
  457. package/dist/esm/utils/units.d.ts.map +1 -0
  458. package/dist/esm/utils/units.js +38 -0
  459. package/dist/esm/utils/units.js.map +1 -0
  460. package/dist/esm/utils/validation.d.ts +18 -0
  461. package/dist/esm/utils/validation.d.ts.map +1 -0
  462. package/dist/esm/utils/validation.js +29 -0
  463. package/dist/esm/utils/validation.js.map +1 -0
  464. package/dist/esm/version.d.ts +3 -0
  465. package/dist/esm/version.d.ts.map +1 -0
  466. package/dist/esm/version.js +3 -0
  467. package/dist/esm/version.js.map +1 -0
  468. package/dist/esm/websocket/PerpsWsClient.d.ts +100 -0
  469. package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -0
  470. package/dist/esm/websocket/PerpsWsClient.js +121 -0
  471. package/dist/esm/websocket/PerpsWsClient.js.map +1 -0
  472. package/dist/esm/websocket/ReconnectingWebSocket.d.ts +130 -0
  473. package/dist/esm/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  474. package/dist/esm/websocket/ReconnectingWebSocket.js +288 -0
  475. package/dist/esm/websocket/ReconnectingWebSocket.js.map +1 -0
  476. package/dist/esm/websocket/WsProviderBase.d.ts +89 -0
  477. package/dist/esm/websocket/WsProviderBase.d.ts.map +1 -0
  478. package/dist/esm/websocket/WsProviderBase.js +246 -0
  479. package/dist/esm/websocket/WsProviderBase.js.map +1 -0
  480. package/dist/esm/websocket/cachePromise.d.ts +14 -0
  481. package/dist/esm/websocket/cachePromise.d.ts.map +1 -0
  482. package/dist/esm/websocket/cachePromise.js +27 -0
  483. package/dist/esm/websocket/cachePromise.js.map +1 -0
  484. package/dist/esm/websocket/types.d.ts +60 -0
  485. package/dist/esm/websocket/types.d.ts.map +1 -0
  486. package/dist/esm/websocket/types.js +2 -0
  487. package/dist/esm/websocket/types.js.map +1 -0
  488. package/dist/esm/websocket/wsLog.d.ts +50 -0
  489. package/dist/esm/websocket/wsLog.d.ts.map +1 -0
  490. package/dist/esm/websocket/wsLog.js +68 -0
  491. package/dist/esm/websocket/wsLog.js.map +1 -0
  492. package/dist/types/client/PerpsClient.d.ts +285 -0
  493. package/dist/types/client/PerpsClient.d.ts.map +1 -0
  494. package/dist/types/client/bindProvider.d.ts +13 -0
  495. package/dist/types/client/bindProvider.d.ts.map +1 -0
  496. package/dist/types/client/createPerpsClient.d.ts +37 -0
  497. package/dist/types/client/createPerpsClient.d.ts.map +1 -0
  498. package/dist/types/client/requireProvider.d.ts +12 -0
  499. package/dist/types/client/requireProvider.d.ts.map +1 -0
  500. package/dist/types/errors/PerpsError.d.ts +16 -0
  501. package/dist/types/errors/PerpsError.d.ts.map +1 -0
  502. package/dist/types/errors/constants.d.ts +11 -0
  503. package/dist/types/errors/constants.d.ts.map +1 -0
  504. package/dist/types/index.d.ts +86 -0
  505. package/dist/types/index.d.ts.map +1 -0
  506. package/dist/types/registry/assetRegistry.d.ts +25 -0
  507. package/dist/types/registry/assetRegistry.d.ts.map +1 -0
  508. package/dist/types/registry/marketRegistry.d.ts +42 -0
  509. package/dist/types/registry/marketRegistry.d.ts.map +1 -0
  510. package/dist/types/registry/referenceDataRegistry.d.ts +44 -0
  511. package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -0
  512. package/dist/types/services/createAction.d.ts +26 -0
  513. package/dist/types/services/createAction.d.ts.map +1 -0
  514. package/dist/types/services/executeAction.d.ts +26 -0
  515. package/dist/types/services/executeAction.d.ts.map +1 -0
  516. package/dist/types/services/getAccount.d.ts +35 -0
  517. package/dist/types/services/getAccount.d.ts.map +1 -0
  518. package/dist/types/services/getActivity.d.ts +39 -0
  519. package/dist/types/services/getActivity.d.ts.map +1 -0
  520. package/dist/types/services/getAssets.d.ts +27 -0
  521. package/dist/types/services/getAssets.d.ts.map +1 -0
  522. package/dist/types/services/getFills.d.ts +38 -0
  523. package/dist/types/services/getFills.d.ts.map +1 -0
  524. package/dist/types/services/getMarket.d.ts +34 -0
  525. package/dist/types/services/getMarket.d.ts.map +1 -0
  526. package/dist/types/services/getMarkets.d.ts +28 -0
  527. package/dist/types/services/getMarkets.d.ts.map +1 -0
  528. package/dist/types/services/getMeta.d.ts +21 -0
  529. package/dist/types/services/getMeta.d.ts.map +1 -0
  530. package/dist/types/services/getOhlcv.d.ts +36 -0
  531. package/dist/types/services/getOhlcv.d.ts.map +1 -0
  532. package/dist/types/services/getOrder.d.ts +33 -0
  533. package/dist/types/services/getOrder.d.ts.map +1 -0
  534. package/dist/types/services/getOrderbook.d.ts +24 -0
  535. package/dist/types/services/getOrderbook.d.ts.map +1 -0
  536. package/dist/types/services/getOrders.d.ts +35 -0
  537. package/dist/types/services/getOrders.d.ts.map +1 -0
  538. package/dist/types/services/getPositions.d.ts +35 -0
  539. package/dist/types/services/getPositions.d.ts.map +1 -0
  540. package/dist/types/services/getPrices.d.ts +21 -0
  541. package/dist/types/services/getPrices.d.ts.map +1 -0
  542. package/dist/types/services/getProviders.d.ts +22 -0
  543. package/dist/types/services/getProviders.d.ts.map +1 -0
  544. package/dist/types/services/getQuote.d.ts +42 -0
  545. package/dist/types/services/getQuote.d.ts.map +1 -0
  546. package/dist/types/services/getTermsAcceptance.d.ts +26 -0
  547. package/dist/types/services/getTermsAcceptance.d.ts.map +1 -0
  548. package/dist/types/services/resolveQuote.d.ts +26 -0
  549. package/dist/types/services/resolveQuote.d.ts.map +1 -0
  550. package/dist/types/services/resolveSubscribeQuote.d.ts +31 -0
  551. package/dist/types/services/resolveSubscribeQuote.d.ts.map +1 -0
  552. package/dist/types/storage/parseStoredRecord.d.ts +29 -0
  553. package/dist/types/storage/parseStoredRecord.d.ts.map +1 -0
  554. package/dist/types/storage/storage.d.ts +15 -0
  555. package/dist/types/storage/storage.d.ts.map +1 -0
  556. package/dist/types/storage/types.d.ts +14 -0
  557. package/dist/types/storage/types.d.ts.map +1 -0
  558. package/dist/types/transport/fetchWithRetry.d.ts +22 -0
  559. package/dist/types/transport/fetchWithRetry.d.ts.map +1 -0
  560. package/dist/types/transport/request.d.ts +25 -0
  561. package/dist/types/transport/request.d.ts.map +1 -0
  562. package/dist/types/transport/retryPolicy.d.ts +106 -0
  563. package/dist/types/transport/retryPolicy.d.ts.map +1 -0
  564. package/dist/types/types/api.d.ts +214 -0
  565. package/dist/types/types/api.d.ts.map +1 -0
  566. package/dist/types/types/config.d.ts +70 -0
  567. package/dist/types/types/config.d.ts.map +1 -0
  568. package/dist/types/types/provider.d.ts +330 -0
  569. package/dist/types/types/provider.d.ts.map +1 -0
  570. package/dist/types/utils/accountSummary.d.ts +13 -0
  571. package/dist/types/utils/accountSummary.d.ts.map +1 -0
  572. package/dist/types/utils/assertNever.d.ts +20 -0
  573. package/dist/types/utils/assertNever.d.ts.map +1 -0
  574. package/dist/types/utils/calculations.d.ts +223 -0
  575. package/dist/types/utils/calculations.d.ts.map +1 -0
  576. package/dist/types/utils/depositChain.d.ts +25 -0
  577. package/dist/types/utils/depositChain.d.ts.map +1 -0
  578. package/dist/types/utils/explorer.d.ts +33 -0
  579. package/dist/types/utils/explorer.d.ts.map +1 -0
  580. package/dist/types/utils/fillClassification.d.ts +13 -0
  581. package/dist/types/utils/fillClassification.d.ts.map +1 -0
  582. package/dist/types/utils/format.d.ts +66 -0
  583. package/dist/types/utils/format.d.ts.map +1 -0
  584. package/dist/types/utils/orderClassification.d.ts +47 -0
  585. package/dist/types/utils/orderClassification.d.ts.map +1 -0
  586. package/dist/types/utils/orderMath.d.ts +44 -0
  587. package/dist/types/utils/orderMath.d.ts.map +1 -0
  588. package/dist/types/utils/parse.d.ts +22 -0
  589. package/dist/types/utils/parse.d.ts.map +1 -0
  590. package/dist/types/utils/positionMath.d.ts +107 -0
  591. package/dist/types/utils/positionMath.d.ts.map +1 -0
  592. package/dist/types/utils/signTypedData.d.ts +18 -0
  593. package/dist/types/utils/signTypedData.d.ts.map +1 -0
  594. package/dist/types/utils/sleep.d.ts +7 -0
  595. package/dist/types/utils/sleep.d.ts.map +1 -0
  596. package/dist/types/utils/units.d.ts +27 -0
  597. package/dist/types/utils/units.d.ts.map +1 -0
  598. package/dist/types/utils/validation.d.ts +18 -0
  599. package/dist/types/utils/validation.d.ts.map +1 -0
  600. package/dist/types/version.d.ts +3 -0
  601. package/dist/types/version.d.ts.map +1 -0
  602. package/dist/types/websocket/PerpsWsClient.d.ts +100 -0
  603. package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -0
  604. package/dist/types/websocket/ReconnectingWebSocket.d.ts +130 -0
  605. package/dist/types/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  606. package/dist/types/websocket/WsProviderBase.d.ts +89 -0
  607. package/dist/types/websocket/WsProviderBase.d.ts.map +1 -0
  608. package/dist/types/websocket/cachePromise.d.ts +14 -0
  609. package/dist/types/websocket/cachePromise.d.ts.map +1 -0
  610. package/dist/types/websocket/types.d.ts +60 -0
  611. package/dist/types/websocket/types.d.ts.map +1 -0
  612. package/dist/types/websocket/wsLog.d.ts +50 -0
  613. package/dist/types/websocket/wsLog.d.ts.map +1 -0
  614. package/package.json +63 -0
  615. package/src/client/PerpsClient.ts +686 -0
  616. package/src/client/bindProvider.ts +24 -0
  617. package/src/client/createPerpsClient.ts +100 -0
  618. package/src/client/requireProvider.ts +29 -0
  619. package/src/errors/PerpsError.ts +23 -0
  620. package/src/errors/constants.ts +10 -0
  621. package/src/index.ts +215 -0
  622. package/src/registry/assetRegistry.ts +62 -0
  623. package/src/registry/marketRegistry.ts +100 -0
  624. package/src/registry/referenceDataRegistry.ts +95 -0
  625. package/src/services/createAction.ts +52 -0
  626. package/src/services/executeAction.ts +56 -0
  627. package/src/services/getAccount.ts +46 -0
  628. package/src/services/getActivity.ts +57 -0
  629. package/src/services/getAssets.ts +38 -0
  630. package/src/services/getFills.ts +55 -0
  631. package/src/services/getMarket.ts +52 -0
  632. package/src/services/getMarkets.ts +40 -0
  633. package/src/services/getMeta.ts +32 -0
  634. package/src/services/getOhlcv.ts +52 -0
  635. package/src/services/getOrder.ts +44 -0
  636. package/src/services/getOrderbook.ts +37 -0
  637. package/src/services/getOrders.ts +51 -0
  638. package/src/services/getPositions.ts +51 -0
  639. package/src/services/getPrices.ts +33 -0
  640. package/src/services/getProviders.ts +33 -0
  641. package/src/services/getQuote.ts +58 -0
  642. package/src/services/getTermsAcceptance.ts +34 -0
  643. package/src/services/resolveQuote.ts +90 -0
  644. package/src/services/resolveSubscribeQuote.ts +107 -0
  645. package/src/storage/parseStoredRecord.ts +55 -0
  646. package/src/storage/storage.ts +60 -0
  647. package/src/storage/types.ts +13 -0
  648. package/src/transport/fetchWithRetry.ts +116 -0
  649. package/src/transport/request.ts +123 -0
  650. package/src/transport/retryPolicy.ts +202 -0
  651. package/src/types/api.ts +239 -0
  652. package/src/types/config.ts +79 -0
  653. package/src/types/provider.ts +429 -0
  654. package/src/utils/accountSummary.ts +46 -0
  655. package/src/utils/assertNever.ts +23 -0
  656. package/src/utils/calculations.ts +407 -0
  657. package/src/utils/depositChain.ts +37 -0
  658. package/src/utils/explorer.ts +51 -0
  659. package/src/utils/fillClassification.ts +51 -0
  660. package/src/utils/format.ts +212 -0
  661. package/src/utils/orderClassification.ts +96 -0
  662. package/src/utils/orderMath.ts +134 -0
  663. package/src/utils/parse.ts +30 -0
  664. package/src/utils/positionMath.ts +149 -0
  665. package/src/utils/signTypedData.ts +41 -0
  666. package/src/utils/sleep.ts +7 -0
  667. package/src/utils/units.ts +39 -0
  668. package/src/utils/validation.ts +38 -0
  669. package/src/version.ts +2 -0
  670. package/src/websocket/PerpsWsClient.ts +204 -0
  671. package/src/websocket/ReconnectingWebSocket.ts +353 -0
  672. package/src/websocket/WsProviderBase.ts +333 -0
  673. package/src/websocket/cachePromise.ts +30 -0
  674. package/src/websocket/types.ts +75 -0
  675. package/src/websocket/wsLog.ts +82 -0
@@ -0,0 +1,100 @@
1
+ import { PerpsErrorCode } from '@lifi/perps-types'
2
+ import { PerpsError } from '../errors/PerpsError.js'
3
+ import type { PerpsConfig } from '../types/api.js'
4
+ import type { PerpsBaseConfig, ProviderConfigs } from '../types/config.js'
5
+ import type {
6
+ PerpsProvider,
7
+ PerpsProviderPlugin,
8
+ PerpsSDKClient,
9
+ } from '../types/provider.js'
10
+ import { bindProvider } from './bindProvider.js'
11
+
12
+ /**
13
+ * Default LI.FI perps API base URL used when `PerpsConfig.apiUrl` is omitted.
14
+ *
15
+ * @public
16
+ */
17
+ export const DEFAULT_API_URL = 'https://develop.li.quest/v1/perps'
18
+
19
+ /**
20
+ * Construct the low-level {@link PerpsSDKClient} — config, the optional
21
+ * end-user wallet, and provider registry — shared by the service functions and
22
+ * the higher-level {@link PerpsClient}.
23
+ *
24
+ * @throws {PerpsError} When `options.integrator` is missing.
25
+ * @example
26
+ * ```ts
27
+ * const client = createPerpsClient({
28
+ * integrator: 'my-app',
29
+ * apiKey: 'key',
30
+ * providers: [hyperliquidProvider()],
31
+ * })
32
+ * ```
33
+ * @public
34
+ */
35
+ export function createPerpsClient(options: PerpsConfig): PerpsSDKClient {
36
+ if (!options.integrator) {
37
+ const error = new PerpsError(
38
+ PerpsErrorCode.SDKError,
39
+ 'Integrator is required. Please see documentation at https://docs.li.fi'
40
+ )
41
+ error.tool = '@lifi/perps-sdk'
42
+ throw error
43
+ }
44
+
45
+ const apiUrl = options.apiUrl ?? DEFAULT_API_URL
46
+ const { providerPlugins, providerConfigs } = splitProviders(options.providers)
47
+
48
+ const config: PerpsBaseConfig = {
49
+ integrator: options.integrator,
50
+ apiKey: options.apiKey,
51
+ apiUrl,
52
+ disableVersionCheck: options.disableVersionCheck,
53
+ requestInterceptor: options.requestInterceptor,
54
+ providers: providerConfigs,
55
+ retry: options.retry,
56
+ fetch: options.fetch,
57
+ }
58
+
59
+ const client: PerpsSDKClient = {
60
+ get config() {
61
+ return config
62
+ },
63
+ get userWallet() {
64
+ return options.userWallet
65
+ },
66
+ get providers() {
67
+ return boundProviders
68
+ },
69
+ getProvider(key: string): PerpsProvider | undefined {
70
+ return boundProviders.find((p) => p.type === key)
71
+ },
72
+ }
73
+
74
+ const boundProviders: PerpsProvider[] = providerPlugins.map((plugin) =>
75
+ bindProvider(plugin, client)
76
+ )
77
+
78
+ return client
79
+ }
80
+
81
+ /**
82
+ * Split the overloaded `providers` option into its two shapes — the
83
+ * plugin array used by {@link PerpsSDKClient.getProvider}, and the
84
+ * keyed `ProviderConfigs` consumed internally by `PerpsWsClient` for
85
+ * markets filtering.
86
+ */
87
+ export function splitProviders(
88
+ input: PerpsProviderPlugin[] | ProviderConfigs | undefined
89
+ ): {
90
+ providerPlugins: PerpsProviderPlugin[]
91
+ providerConfigs?: ProviderConfigs
92
+ } {
93
+ if (input === undefined) {
94
+ return { providerPlugins: [] }
95
+ }
96
+ if (Array.isArray(input)) {
97
+ return { providerPlugins: input }
98
+ }
99
+ return { providerPlugins: [], providerConfigs: input }
100
+ }
@@ -0,0 +1,29 @@
1
+ import { PerpsErrorCode } from '@lifi/perps-types'
2
+ import { PerpsError } from '../errors/PerpsError.js'
3
+ import type { PerpsProvider, PerpsSDKClient } from '../types/provider.js'
4
+
5
+ /**
6
+ * Resolve the registered bound {@link PerpsProvider} for `provider`, or throw.
7
+ * Account reads run direct-to-venue through the provider, so a missing one is a
8
+ * wiring error (the consumer must pass it to
9
+ * `createPerpsClient({ providers: [...] })`) rather than a runtime-recoverable
10
+ * state.
11
+ *
12
+ * @internal
13
+ */
14
+ export function requireProvider(
15
+ client: PerpsSDKClient,
16
+ provider: string
17
+ ): PerpsProvider {
18
+ const plugin = client.getProvider(provider)
19
+ if (plugin === undefined) {
20
+ const error = new PerpsError(
21
+ PerpsErrorCode.SDKError,
22
+ `Provider plugin not registered: '${provider}'. Pass it to ` +
23
+ 'createPerpsClient({ providers: [...] }).'
24
+ )
25
+ error.tool = '@lifi/perps-sdk'
26
+ throw error
27
+ }
28
+ return plugin
29
+ }
@@ -0,0 +1,23 @@
1
+ import { PerpsErrorCode } from '@lifi/perps-types'
2
+
3
+ /**
4
+ * Error thrown by every SDK code path — backend error responses, transport
5
+ * failures, and SDK-side validation alike. Carries a {@link PerpsErrorCode}
6
+ * for programmatic branching and an optional `tool` tag identifying the
7
+ * originating package.
8
+ *
9
+ * @public
10
+ */
11
+ export class PerpsError extends Error {
12
+ code: PerpsErrorCode
13
+ override name = 'PerpsError'
14
+ tool?: string
15
+
16
+ constructor(
17
+ code: PerpsErrorCode = PerpsErrorCode.DefaultError,
18
+ message = 'Unknown error occurred'
19
+ ) {
20
+ super(message)
21
+ this.code = code
22
+ }
23
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Canonical human-readable messages paired with SDK-originated
3
+ * {@link PerpsError}s.
4
+ *
5
+ * @public
6
+ */
7
+ export enum PerpsErrorMessage {
8
+ AgentNotFound = 'Agent not found. Complete provider setup (APPROVE_AGENT) first.',
9
+ AgentStorageCorrupt = 'Stored agent keypair is malformed. Revoke and re-approve the agent (APPROVE_AGENT) to regenerate it.',
10
+ }
package/src/index.ts ADDED
@@ -0,0 +1,215 @@
1
+ // biome-ignore-all lint/performance/noBarrelFile: package public entry point.
2
+ // biome-ignore-all lint/performance/noReExportAll: package public entry point.
3
+
4
+ /**
5
+ * `@lifi/perps-sdk` — the public entry point. Exports `createPerpsClient` and
6
+ * `PerpsClient` (the primary API), the realtime `PerpsWsClient`, the pure
7
+ * calculation/parsing/order helpers, and re-exports the shared `@lifi/perps-types`.
8
+ *
9
+ * @packageDocumentation
10
+ * @public
11
+ */
12
+
13
+ export * from '@lifi/perps-types'
14
+ export {
15
+ createPerpsClient,
16
+ DEFAULT_API_URL,
17
+ } from './client/createPerpsClient.js'
18
+ export { PerpsClient } from './client/PerpsClient.js'
19
+ export { PerpsErrorMessage } from './errors/constants.js'
20
+ export { PerpsError } from './errors/PerpsError.js'
21
+ // Registries
22
+ export { AssetRegistry, getAssetRegistry } from './registry/assetRegistry.js'
23
+ export {
24
+ getMarketRegistry,
25
+ MarketRegistry,
26
+ toMarketDisplay,
27
+ } from './registry/marketRegistry.js'
28
+ // Services
29
+ export type { CreateActionParams } from './services/createAction.js'
30
+ export { createAction } from './services/createAction.js'
31
+ export type { ExecuteActionParams } from './services/executeAction.js'
32
+ export { executeAction } from './services/executeAction.js'
33
+ export type { GetAccountParams } from './services/getAccount.js'
34
+ export { getAccount } from './services/getAccount.js'
35
+ export type { GetActivityParams } from './services/getActivity.js'
36
+ export { getActivity } from './services/getActivity.js'
37
+ export type { GetAssetsParams } from './services/getAssets.js'
38
+ export { getAssets } from './services/getAssets.js'
39
+ export type { GetFillsParams } from './services/getFills.js'
40
+ export { getFills } from './services/getFills.js'
41
+ export type { GetMarketParams } from './services/getMarket.js'
42
+ export { getMarket } from './services/getMarket.js'
43
+ export type { GetMarketsParams } from './services/getMarkets.js'
44
+ export { getMarkets } from './services/getMarkets.js'
45
+ export { getMeta } from './services/getMeta.js'
46
+ export type { GetOhlcvParams } from './services/getOhlcv.js'
47
+ export { getOhlcv } from './services/getOhlcv.js'
48
+ export type { GetOrderParams } from './services/getOrder.js'
49
+ export { getOrder } from './services/getOrder.js'
50
+ export type { GetOrderbookParams } from './services/getOrderbook.js'
51
+ export { getOrderbook } from './services/getOrderbook.js'
52
+ export type { GetOrdersParams } from './services/getOrders.js'
53
+ export { getOrders } from './services/getOrders.js'
54
+ export type { GetPositionsParams } from './services/getPositions.js'
55
+ export { getPositions } from './services/getPositions.js'
56
+ export type { GetPricesParams } from './services/getPrices.js'
57
+ export { getPrices } from './services/getPrices.js'
58
+ export { getProviders } from './services/getProviders.js'
59
+ export type { GetQuoteParams } from './services/getQuote.js'
60
+ export { getQuote } from './services/getQuote.js'
61
+ export { getTermsAcceptance } from './services/getTermsAcceptance.js'
62
+ export { resolveQuote, resolveQuoteMarket } from './services/resolveQuote.js'
63
+ export {
64
+ QUOTE_THROTTLE_MS,
65
+ resolveSubscribeQuote,
66
+ } from './services/resolveSubscribeQuote.js'
67
+ export {
68
+ parseStoredRecord,
69
+ readValidatedRecord,
70
+ } from './storage/parseStoredRecord.js'
71
+ export { createMemoryStorage, localStorageAdapter } from './storage/storage.js'
72
+ export type { StorageAdapter } from './storage/types.js'
73
+ export type { FetchWithRetryOptions } from './transport/fetchWithRetry.js'
74
+ export { fetchWithRetry } from './transport/fetchWithRetry.js'
75
+ export type {
76
+ ProviderRetryConfig,
77
+ ResolvedRetryPolicy,
78
+ RetryAttemptContext,
79
+ RetryClassification,
80
+ RetryClassifyContext,
81
+ RetryConfig,
82
+ RetryPolicy,
83
+ } from './transport/retryPolicy.js'
84
+ export {
85
+ DISABLED_RETRY,
86
+ LIFI_REQUEST_KEY,
87
+ LIFI_RETRY_DEFAULTS,
88
+ resolveRetryPolicy,
89
+ } from './transport/retryPolicy.js'
90
+ export type {
91
+ BuildProviderSetupParams,
92
+ CancelOrdersParams,
93
+ ExecuteProviderSetupParams,
94
+ ExecuteProviderSetupResult,
95
+ GetAccountResult,
96
+ GetSetupParams,
97
+ ModifyOrdersParams,
98
+ PerpsClientOptions,
99
+ PerpsConfig,
100
+ PlaceOrderParams as ClientPlaceOrderParams,
101
+ PlaceTriggerOrderParams as ClientPlaceTriggerOrderParams,
102
+ ProviderSetup,
103
+ } from './types/api.js'
104
+ export type {
105
+ HyperliquidConfig,
106
+ PerpsBaseConfig,
107
+ PerpsClientSigner,
108
+ ProviderConfig,
109
+ ProviderConfigs,
110
+ RequestInterceptor,
111
+ SDKRequestOptions,
112
+ } from './types/config.js'
113
+ export type {
114
+ ActionSignerContribution,
115
+ LiquidationEstimateParams,
116
+ PerpsProvider,
117
+ PerpsProviderPlugin,
118
+ PerpsSDKClient,
119
+ ProviderGetAccountParams,
120
+ ProviderGetActivityParams,
121
+ ProviderGetFillsParams,
122
+ ProviderGetOrderParams,
123
+ ProviderGetOrdersParams,
124
+ ProviderGetPositionsParams,
125
+ ProviderGetQuoteParams,
126
+ QuoteListener,
127
+ SignActionsContext,
128
+ } from './types/provider.js'
129
+ export { summarizeAccount } from './utils/accountSummary.js'
130
+ export type { ExpectedPnl } from './utils/calculations.js'
131
+ export {
132
+ applySlippage,
133
+ buildQuote,
134
+ calculateExpectedPnl,
135
+ calculateNotionalValue,
136
+ calculatePositionSize,
137
+ calculateRealizedPnlPercent,
138
+ calculateRequiredMargin,
139
+ calculateRoe,
140
+ calculateUnrealizedPnl,
141
+ effectiveLeverage,
142
+ estimateFees,
143
+ liquidationDistancePercent,
144
+ percentFromPrice,
145
+ priceFromPercent,
146
+ removableMargin,
147
+ walkOrderbook,
148
+ } from './utils/calculations.js'
149
+ export type { DepositProviderKey } from './utils/depositChain.js'
150
+ export {
151
+ LIFI_DEPOSIT_CHAIN_BY_PROVIDER,
152
+ lifiDepositChainForProvider,
153
+ } from './utils/depositChain.js'
154
+ export { ExplorerChainId, explorerTxUrl } from './utils/explorer.js'
155
+ export { classifyFillFromPosition } from './utils/fillClassification.js'
156
+ export type { FormatOptions } from './utils/format.js'
157
+ export {
158
+ formatCompactUsd,
159
+ formatPrice,
160
+ formatSignedPercent,
161
+ formatSignedUsd,
162
+ formatUsd,
163
+ } from './utils/format.js'
164
+ export {
165
+ ACTIVE_ORDER_STATUSES,
166
+ classifyFill,
167
+ FillClassification,
168
+ isActiveOrderStatus,
169
+ isStopLossOrder,
170
+ isTakeProfitOrder,
171
+ isTpSlOrder,
172
+ } from './utils/orderClassification.js'
173
+ export {
174
+ expectedRealizedPnlForOpenOrder,
175
+ expectedRealizedPnlForTriggerOrder,
176
+ findMatchingPosition,
177
+ resolveCloseSize,
178
+ } from './utils/orderMath.js'
179
+ export { stringToFloat } from './utils/parse.js'
180
+ export {
181
+ directionSign,
182
+ estimateIsolatedLiquidationPrice,
183
+ predictAverageEntryPrice,
184
+ predictNewLeverage,
185
+ predictUnrealizedPnl,
186
+ realizedPnlOnClose,
187
+ } from './utils/positionMath.js'
188
+ export {
189
+ signTypedData,
190
+ signTypedDataWithSigner,
191
+ } from './utils/signTypedData.js'
192
+ export { fromBaseUnits, fromBaseUnitsNumber } from './utils/units.js'
193
+ export { validateMargin } from './utils/validation.js'
194
+ // Version
195
+ export { name, version } from './version.js'
196
+ export { cachePromise } from './websocket/cachePromise.js'
197
+ export type {
198
+ PerpsWsClientOptions,
199
+ WsProviderFactory,
200
+ } from './websocket/PerpsWsClient.js'
201
+ export { PerpsWsClient } from './websocket/PerpsWsClient.js'
202
+ export type { ReconnectingWebSocketOptions } from './websocket/ReconnectingWebSocket.js'
203
+ export { ReconnectingWebSocket } from './websocket/ReconnectingWebSocket.js'
204
+ export type {
205
+ EventForSubscription,
206
+ SubscriptionListener,
207
+ WsConnectionStatus,
208
+ WsProvider,
209
+ WsStatusListener,
210
+ } from './websocket/types.js'
211
+ export {
212
+ WS_CHANNEL_TEARDOWN_LINGER_MS,
213
+ WsProviderBase,
214
+ } from './websocket/WsProviderBase.js'
215
+ export { wsLog } from './websocket/wsLog.js'
@@ -0,0 +1,62 @@
1
+ import type { Asset, AssetsResponse } from '@lifi/perps-types'
2
+ import { buildUrl, request } from '../transport/request.js'
3
+ import type { PerpsSDKClient } from '../types/provider.js'
4
+ import { ReferenceDataRegistry } from './referenceDataRegistry.js'
5
+
6
+ /**
7
+ * Per-provider index over the backend's `/assets` token registry, keyed by
8
+ * `Asset.id` — the provider-native asset id (Lighter: the stringified
9
+ * `asset_id`, Hyperliquid spot: the venue token index). Obtain via
10
+ * {@link getAssetRegistry}.
11
+ *
12
+ * @public
13
+ */
14
+ export class AssetRegistry extends ReferenceDataRegistry<Asset> {
15
+ constructor(client: PerpsSDKClient, provider: string) {
16
+ super(client, provider, 'asset')
17
+ }
18
+
19
+ /** The most recently synced asset list. Empty before the first {@link sync}. */
20
+ get assets(): readonly Asset[] {
21
+ return this.items
22
+ }
23
+
24
+ protected fetchItems(bypassHttpCache: boolean): Promise<Asset[]> {
25
+ const url = buildUrl(`${this.client.config.apiUrl}/assets`, {
26
+ provider: this.provider,
27
+ })
28
+ return request<AssetsResponse>(
29
+ this.client.config,
30
+ url,
31
+ bypassHttpCache ? { cache: 'no-cache' } : {}
32
+ ).then((response) => response.assets)
33
+ }
34
+
35
+ protected keyOf(asset: Asset): string {
36
+ return asset.id
37
+ }
38
+ }
39
+
40
+ const registries = new WeakMap<PerpsSDKClient, Map<string, AssetRegistry>>()
41
+
42
+ /**
43
+ * The stable {@link AssetRegistry} for `(client, provider)`.
44
+ *
45
+ * @public
46
+ */
47
+ export function getAssetRegistry(
48
+ client: PerpsSDKClient,
49
+ provider: string
50
+ ): AssetRegistry {
51
+ let byProvider = registries.get(client)
52
+ if (byProvider === undefined) {
53
+ byProvider = new Map()
54
+ registries.set(client, byProvider)
55
+ }
56
+ let registry = byProvider.get(provider)
57
+ if (registry === undefined) {
58
+ registry = new AssetRegistry(client, provider)
59
+ byProvider.set(provider, registry)
60
+ }
61
+ return registry
62
+ }
@@ -0,0 +1,100 @@
1
+ import type { Market, MarketDisplay, MarketsResponse } from '@lifi/perps-types'
2
+ import { PerpsErrorCode } from '@lifi/perps-types'
3
+ import { PerpsError } from '../errors/PerpsError.js'
4
+ import { buildUrl, request } from '../transport/request.js'
5
+ import type { PerpsSDKClient } from '../types/provider.js'
6
+ import { ReferenceDataRegistry } from './referenceDataRegistry.js'
7
+
8
+ /**
9
+ * Per-provider index over the backend's enriched `/markets` list, keyed by
10
+ * `Market.id` — the venue wire key (Hyperliquid: the coin string, Lighter:
11
+ * the stringified `market_index`). Obtain via {@link getMarketRegistry};
12
+ * shared by the provider packages' REST services and WS providers.
13
+ *
14
+ * @public
15
+ */
16
+ export class MarketRegistry extends ReferenceDataRegistry<Market> {
17
+ constructor(client: PerpsSDKClient, provider: string) {
18
+ super(client, provider, 'market')
19
+ }
20
+
21
+ /** The most recently synced market list. Empty before the first {@link sync}. */
22
+ get markets(): readonly Market[] {
23
+ return this.items
24
+ }
25
+
26
+ /**
27
+ * Lookup by `Market.id`, throwing when the backend list does not know the
28
+ * id. The list is the source of truth for every tradable market, so an id
29
+ * the venue references but the backend does not know is a hard error —
30
+ * never a silent fallback to an unenriched stand-in.
31
+ *
32
+ * @throws {PerpsError} `MarketNotFound`.
33
+ */
34
+ require(marketId: string): Market {
35
+ const market = this.get(marketId)
36
+ if (market === undefined) {
37
+ const error = new PerpsError(
38
+ PerpsErrorCode.MarketNotFound,
39
+ `No ${this.provider} market found for marketId '${marketId}'`
40
+ )
41
+ error.tool = this.provider
42
+ throw error
43
+ }
44
+ return market
45
+ }
46
+
47
+ protected fetchItems(bypassHttpCache: boolean): Promise<Market[]> {
48
+ const url = buildUrl(`${this.client.config.apiUrl}/markets`, {
49
+ provider: this.provider,
50
+ })
51
+ return request<MarketsResponse>(
52
+ this.client.config,
53
+ url,
54
+ bypassHttpCache ? { cache: 'no-cache' } : {}
55
+ ).then((response) => response.markets)
56
+ }
57
+
58
+ protected keyOf(market: Market): string {
59
+ return market.id
60
+ }
61
+ }
62
+
63
+ const registries = new WeakMap<PerpsSDKClient, Map<string, MarketRegistry>>()
64
+
65
+ /**
66
+ * The stable {@link MarketRegistry} for `(client, provider)`.
67
+ *
68
+ * @public
69
+ */
70
+ export function getMarketRegistry(
71
+ client: PerpsSDKClient,
72
+ provider: string
73
+ ): MarketRegistry {
74
+ let byProvider = registries.get(client)
75
+ if (byProvider === undefined) {
76
+ byProvider = new Map()
77
+ registries.set(client, byProvider)
78
+ }
79
+ let registry = byProvider.get(provider)
80
+ if (registry === undefined) {
81
+ registry = new MarketRegistry(client, provider)
82
+ byProvider.set(provider, registry)
83
+ }
84
+ return registry
85
+ }
86
+
87
+ /**
88
+ * Project a {@link Market} to the {@link MarketDisplay} identity embedded on
89
+ * mapped positions/orders/fills, preserving the backend's `baseAsset` and
90
+ * `quoteAsset` verbatim (logos, display names).
91
+ *
92
+ * @public
93
+ */
94
+ export const toMarketDisplay = (market: Market): MarketDisplay => ({
95
+ providerId: market.providerId,
96
+ id: market.id,
97
+ categoryId: market.categoryId,
98
+ baseAsset: market.baseAsset,
99
+ quoteAsset: market.quoteAsset,
100
+ })
@@ -0,0 +1,95 @@
1
+ import type { PerpsSDKClient } from '../types/provider.js'
2
+
3
+ /** Minimum gap between unknown-id-triggered, HTTP-cache-bypassing refetches. */
4
+ const REFRESH_COOLDOWN_MS = 60_000
5
+
6
+ /**
7
+ * Per-provider hash index over one of the provider's reference-data lists
8
+ * (`/markets`, `/assets`), keyed by the list's own primary key.
9
+ *
10
+ * NOT a cache: it holds no freshness policy of its own. Every {@link sync}
11
+ * refetches through the HTTP layer, whose `cache-control` headers decide
12
+ * whether the response comes from disk or the network. A lookup miss
13
+ * schedules a cooldown-gated background refetch that bypasses the HTTP
14
+ * cache — the id may have listed after the cached snapshot.
15
+ *
16
+ * @internal
17
+ */
18
+ export abstract class ReferenceDataRegistry<T> {
19
+ private index = new Map<string, T>()
20
+ private current: readonly T[] = []
21
+ private inflight: Promise<readonly T[]> | undefined
22
+ private warnedIds = new Set<string>()
23
+ private refreshAfter = 0
24
+
25
+ protected constructor(
26
+ protected readonly client: PerpsSDKClient,
27
+ readonly provider: string,
28
+ private readonly kind: string
29
+ ) {}
30
+
31
+ /** Fetch the provider's full list, bypassing the HTTP cache when asked. */
32
+ protected abstract fetchItems(bypassHttpCache: boolean): Promise<T[]>
33
+
34
+ /** The item's primary key — what {@link get} is keyed by. */
35
+ protected abstract keyOf(item: T): string
36
+
37
+ /**
38
+ * Fetch the list through the HTTP cache and rebuild the index. Concurrent
39
+ * callers share one in-flight fetch; a settled fetch is never reused, so
40
+ * HTTP `cache-control` alone governs freshness.
41
+ */
42
+ sync(): Promise<readonly T[]> {
43
+ if (!this.inflight) {
44
+ this.inflight = this.load(false).finally(() => {
45
+ this.inflight = undefined
46
+ })
47
+ }
48
+ return this.inflight
49
+ }
50
+
51
+ /** The most recently synced list. Empty before the first {@link sync}. */
52
+ protected get items(): readonly T[] {
53
+ return this.current
54
+ }
55
+
56
+ /**
57
+ * O(1) lookup by primary key. A miss warns once per id and schedules the
58
+ * cooldown-gated, cache-bypassing background refetch.
59
+ */
60
+ get(id: string): T | undefined {
61
+ const item = this.index.get(id)
62
+ if (item !== undefined) {
63
+ return item
64
+ }
65
+ if (!this.warnedIds.has(id)) {
66
+ this.warnedIds.add(id)
67
+ console.warn(`[${this.provider}] unknown ${this.kind} id '${id}'`)
68
+ }
69
+ this.scheduleRefresh()
70
+ return undefined
71
+ }
72
+
73
+ private async load(bypassHttpCache: boolean): Promise<readonly T[]> {
74
+ const items = await this.fetchItems(bypassHttpCache)
75
+ this.index = new Map(items.map((item) => [this.keyOf(item), item]))
76
+ this.current = items
77
+ this.warnedIds.clear()
78
+ return items
79
+ }
80
+
81
+ private scheduleRefresh(): void {
82
+ const now = Date.now()
83
+ if (now < this.refreshAfter) {
84
+ return
85
+ }
86
+ // Set before any await so concurrent misses cannot trigger a refetch storm.
87
+ this.refreshAfter = now + REFRESH_COOLDOWN_MS
88
+ this.load(true).catch((error) =>
89
+ console.error(
90
+ `[${this.provider}] ${this.kind} registry refresh failed`,
91
+ error
92
+ )
93
+ )
94
+ }
95
+ }
@@ -0,0 +1,52 @@
1
+ import type {
2
+ ActionParamsMap,
3
+ ActionType,
4
+ CreateActionResponse,
5
+ } from '@lifi/perps-types'
6
+ import type { Address } from 'viem'
7
+ import { request } from '../transport/request.js'
8
+ import type { SDKRequestOptions } from '../types/config.js'
9
+ import type { PerpsSDKClient } from '../types/provider.js'
10
+
11
+ /**
12
+ * Parameters for {@link createAction}.
13
+ *
14
+ * @public
15
+ */
16
+ export interface CreateActionParams<T extends ActionType = ActionType> {
17
+ provider: string
18
+ address: Address
19
+ signerAddress?: Address
20
+ action: T
21
+ params: ActionParamsMap[T]
22
+ }
23
+
24
+ /**
25
+ * Request the backend to build the unsigned `ActionStep`s for an action. The
26
+ * returned steps are signed client-side and submitted via
27
+ * {@link executeAction}.
28
+ *
29
+ * @throws {PerpsError} On backend error responses, network, or parsing errors.
30
+ * @public
31
+ */
32
+ export async function createAction<T extends ActionType>(
33
+ client: PerpsSDKClient,
34
+ params: CreateActionParams<T>,
35
+ options?: SDKRequestOptions
36
+ ): Promise<CreateActionResponse> {
37
+ return request<CreateActionResponse>(
38
+ client.config,
39
+ `${client.config.apiUrl}/createAction`,
40
+ {
41
+ method: 'POST',
42
+ body: JSON.stringify({
43
+ provider: params.provider,
44
+ address: params.address,
45
+ signerAddress: params.signerAddress,
46
+ action: params.action,
47
+ params: params.params,
48
+ }),
49
+ },
50
+ options
51
+ )
52
+ }