@lifi/perps-sdk 0.1.1-alpha.9 → 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 (748) hide show
  1. package/README.md +38 -15
  2. package/dist/cjs/agent/AgentManager.d.ts +5 -5
  3. package/dist/cjs/agent/AgentManager.d.ts.map +1 -1
  4. package/dist/cjs/agent/AgentManager.js +16 -14
  5. package/dist/cjs/agent/AgentManager.js.map +1 -1
  6. package/dist/cjs/client/PerpsClient.d.ts +75 -21
  7. package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
  8. package/dist/cjs/client/PerpsClient.js +642 -173
  9. package/dist/cjs/client/PerpsClient.js.map +1 -1
  10. package/dist/cjs/client/createPerpsClient.d.ts +15 -2
  11. package/dist/cjs/client/createPerpsClient.d.ts.map +1 -1
  12. package/dist/cjs/client/createPerpsClient.js +6 -3
  13. package/dist/cjs/client/createPerpsClient.js.map +1 -1
  14. package/dist/cjs/client/projectAccountConfigSettings.d.ts +3 -0
  15. package/dist/cjs/client/projectAccountConfigSettings.d.ts.map +1 -0
  16. package/dist/cjs/client/projectAccountConfigSettings.js +17 -0
  17. package/dist/cjs/client/projectAccountConfigSettings.js.map +1 -0
  18. package/dist/cjs/client/types.d.ts +49 -26
  19. package/dist/cjs/client/types.d.ts.map +1 -1
  20. package/dist/cjs/client/types.js +6 -0
  21. package/dist/cjs/client/types.js.map +1 -1
  22. package/dist/cjs/errors/PerpsError.d.ts +2 -3
  23. package/dist/cjs/errors/PerpsError.d.ts.map +1 -1
  24. package/dist/cjs/errors/PerpsError.js +3 -15
  25. package/dist/cjs/errors/PerpsError.js.map +1 -1
  26. package/dist/cjs/errors/constants.d.ts +0 -10
  27. package/dist/cjs/errors/constants.d.ts.map +1 -1
  28. package/dist/cjs/errors/constants.js +1 -12
  29. package/dist/cjs/errors/constants.js.map +1 -1
  30. package/dist/cjs/index.d.ts +37 -31
  31. package/dist/cjs/index.d.ts.map +1 -1
  32. package/dist/cjs/index.js +87 -42
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/cjs/providers/hyperliquid/accountConfig.d.ts +3 -0
  35. package/dist/cjs/providers/hyperliquid/accountConfig.d.ts.map +1 -0
  36. package/dist/cjs/providers/hyperliquid/accountConfig.js +41 -0
  37. package/dist/cjs/providers/hyperliquid/accountConfig.js.map +1 -0
  38. package/dist/cjs/providers/lighter/accountConfig.d.ts +3 -0
  39. package/dist/cjs/providers/lighter/accountConfig.d.ts.map +1 -0
  40. package/dist/cjs/providers/lighter/accountConfig.js +45 -0
  41. package/dist/cjs/providers/lighter/accountConfig.js.map +1 -0
  42. package/dist/cjs/realtime/PerpsWsClient.d.ts +7 -1
  43. package/dist/cjs/realtime/PerpsWsClient.d.ts.map +1 -1
  44. package/dist/cjs/realtime/PerpsWsClient.js +36 -23
  45. package/dist/cjs/realtime/PerpsWsClient.js.map +1 -1
  46. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts +9 -5
  47. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
  48. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js +158 -52
  49. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js.map +1 -1
  50. package/dist/cjs/realtime/hyperliquid/types.d.ts +11 -9
  51. package/dist/cjs/realtime/hyperliquid/types.d.ts.map +1 -1
  52. package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts +48 -0
  53. package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts.map +1 -0
  54. package/dist/cjs/realtime/lighter/LighterWsProvider.js +424 -0
  55. package/dist/cjs/realtime/lighter/LighterWsProvider.js.map +1 -0
  56. package/dist/cjs/realtime/lighter/types.d.ts +84 -0
  57. package/dist/cjs/realtime/lighter/types.d.ts.map +1 -0
  58. package/dist/cjs/{dex → realtime/lighter}/types.js.map +1 -1
  59. package/dist/cjs/services/createAction.d.ts +11 -0
  60. package/dist/cjs/services/createAction.d.ts.map +1 -0
  61. package/dist/cjs/services/{submitAuthorization.js → createAction.js} +7 -6
  62. package/dist/cjs/services/createAction.js.map +1 -0
  63. package/dist/cjs/services/executeAction.d.ts +11 -0
  64. package/dist/cjs/services/executeAction.d.ts.map +1 -0
  65. package/dist/cjs/services/{submitOrder.js → executeAction.js} +6 -5
  66. package/dist/cjs/services/executeAction.js.map +1 -0
  67. package/dist/cjs/services/getAccount.d.ts +1 -1
  68. package/dist/cjs/services/getAccount.d.ts.map +1 -1
  69. package/dist/cjs/services/getAccount.js +1 -1
  70. package/dist/cjs/services/getAccount.js.map +1 -1
  71. package/dist/cjs/services/getActivity.d.ts +13 -0
  72. package/dist/cjs/services/getActivity.d.ts.map +1 -0
  73. package/dist/cjs/services/getActivity.js +21 -0
  74. package/dist/cjs/services/getActivity.js.map +1 -0
  75. package/dist/cjs/services/getAsset.d.ts +8 -0
  76. package/dist/cjs/services/getAsset.d.ts.map +1 -0
  77. package/dist/cjs/services/{getMarkets.js → getAsset.js} +6 -4
  78. package/dist/cjs/services/getAsset.js.map +1 -0
  79. package/dist/cjs/services/getAssets.d.ts +7 -0
  80. package/dist/cjs/services/getAssets.d.ts.map +1 -0
  81. package/dist/cjs/services/{getMarket.js → getAssets.js} +5 -5
  82. package/dist/cjs/services/getAssets.js.map +1 -0
  83. package/dist/cjs/services/getFills.d.ts +12 -0
  84. package/dist/cjs/services/getFills.d.ts.map +1 -0
  85. package/dist/cjs/services/{getHistory.js → getFills.js} +7 -5
  86. package/dist/cjs/services/getFills.js.map +1 -0
  87. package/dist/cjs/services/getOhlcv.d.ts +1 -1
  88. package/dist/cjs/services/getOhlcv.d.ts.map +1 -1
  89. package/dist/cjs/services/getOhlcv.js +2 -2
  90. package/dist/cjs/services/getOhlcv.js.map +1 -1
  91. package/dist/cjs/services/getOrder.d.ts +1 -1
  92. package/dist/cjs/services/getOrder.d.ts.map +1 -1
  93. package/dist/cjs/services/getOrder.js +2 -2
  94. package/dist/cjs/services/getOrder.js.map +1 -1
  95. package/dist/cjs/services/getOrderbook.d.ts +1 -1
  96. package/dist/cjs/services/getOrderbook.d.ts.map +1 -1
  97. package/dist/cjs/services/getOrderbook.js +2 -2
  98. package/dist/cjs/services/getOrderbook.js.map +1 -1
  99. package/dist/cjs/services/getOrders.d.ts +11 -0
  100. package/dist/cjs/services/getOrders.d.ts.map +1 -0
  101. package/dist/cjs/services/getOrders.js +15 -0
  102. package/dist/cjs/services/getOrders.js.map +1 -0
  103. package/dist/cjs/services/getPositions.d.ts +11 -0
  104. package/dist/cjs/services/getPositions.d.ts.map +1 -0
  105. package/dist/cjs/services/getPositions.js +15 -0
  106. package/dist/cjs/services/getPositions.js.map +1 -0
  107. package/dist/cjs/services/getPrices.d.ts +1 -1
  108. package/dist/cjs/services/getPrices.d.ts.map +1 -1
  109. package/dist/cjs/services/getPrices.js +1 -1
  110. package/dist/cjs/services/getPrices.js.map +1 -1
  111. package/dist/cjs/services/getProviders.d.ts +4 -0
  112. package/dist/cjs/services/getProviders.d.ts.map +1 -0
  113. package/dist/cjs/services/{getDexes.js → getProviders.js} +4 -4
  114. package/dist/cjs/services/getProviders.js.map +1 -0
  115. package/dist/cjs/signers/lighter/LighterKeyStore.d.ts +20 -0
  116. package/dist/cjs/signers/lighter/LighterKeyStore.d.ts.map +1 -0
  117. package/dist/cjs/signers/lighter/LighterKeyStore.js +42 -0
  118. package/dist/cjs/signers/lighter/LighterKeyStore.js.map +1 -0
  119. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts +66 -0
  120. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +1 -0
  121. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js +141 -0
  122. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js.map +1 -0
  123. package/dist/cjs/signers/lighter/LighterSigner.d.ts +41 -0
  124. package/dist/cjs/signers/lighter/LighterSigner.d.ts.map +1 -0
  125. package/dist/cjs/signers/lighter/LighterSigner.js +176 -0
  126. package/dist/cjs/signers/lighter/LighterSigner.js.map +1 -0
  127. package/dist/cjs/signers/lighter/index.d.ts +9 -0
  128. package/dist/cjs/signers/lighter/index.d.ts.map +1 -0
  129. package/dist/cjs/signers/lighter/index.js +20 -0
  130. package/dist/cjs/signers/lighter/index.js.map +1 -0
  131. package/dist/cjs/signers/lighter/wasmLoader.d.ts +42 -0
  132. package/dist/cjs/signers/lighter/wasmLoader.d.ts.map +1 -0
  133. package/dist/cjs/signers/lighter/wasmLoader.js +166 -0
  134. package/dist/cjs/signers/lighter/wasmLoader.js.map +1 -0
  135. package/dist/cjs/utils/accountSummary.d.ts +9 -0
  136. package/dist/cjs/utils/accountSummary.d.ts.map +1 -0
  137. package/dist/cjs/utils/accountSummary.js +83 -0
  138. package/dist/cjs/utils/accountSummary.js.map +1 -0
  139. package/dist/cjs/utils/assertNever.d.ts +2 -0
  140. package/dist/cjs/utils/assertNever.d.ts.map +1 -0
  141. package/dist/cjs/utils/assertNever.js +7 -0
  142. package/dist/cjs/utils/assertNever.js.map +1 -0
  143. package/dist/cjs/utils/calculations.d.ts +16 -0
  144. package/dist/cjs/utils/calculations.d.ts.map +1 -0
  145. package/dist/cjs/utils/calculations.js +71 -0
  146. package/dist/cjs/utils/calculations.js.map +1 -0
  147. package/dist/cjs/utils/hyperliquid/index.d.ts +3 -0
  148. package/dist/cjs/utils/hyperliquid/index.d.ts.map +1 -0
  149. package/dist/cjs/utils/hyperliquid/index.js +11 -0
  150. package/dist/cjs/utils/hyperliquid/index.js.map +1 -0
  151. package/dist/cjs/utils/hyperliquid/liquidation.d.ts +3 -0
  152. package/dist/cjs/utils/hyperliquid/liquidation.d.ts.map +1 -0
  153. package/dist/cjs/utils/hyperliquid/liquidation.js +24 -0
  154. package/dist/cjs/utils/hyperliquid/liquidation.js.map +1 -0
  155. package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts +4 -0
  156. package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
  157. package/dist/cjs/utils/hyperliquid/orderFormatting.js +33 -0
  158. package/dist/cjs/utils/hyperliquid/orderFormatting.js.map +1 -0
  159. package/dist/cjs/utils/orderClassification.d.ts +8 -0
  160. package/dist/cjs/utils/orderClassification.d.ts.map +1 -0
  161. package/dist/cjs/utils/orderClassification.js +39 -0
  162. package/dist/cjs/utils/orderClassification.js.map +1 -0
  163. package/dist/cjs/utils/orderMath.d.ts +6 -0
  164. package/dist/cjs/utils/orderMath.d.ts.map +1 -0
  165. package/dist/cjs/utils/orderMath.js +71 -0
  166. package/dist/cjs/utils/orderMath.js.map +1 -0
  167. package/dist/cjs/utils/parse.d.ts +2 -0
  168. package/dist/cjs/utils/parse.d.ts.map +1 -0
  169. package/dist/cjs/utils/parse.js +14 -0
  170. package/dist/cjs/utils/parse.js.map +1 -0
  171. package/dist/cjs/utils/positionMath.d.ts +26 -0
  172. package/dist/cjs/utils/positionMath.d.ts.map +1 -0
  173. package/dist/cjs/utils/positionMath.js +38 -0
  174. package/dist/cjs/utils/positionMath.js.map +1 -0
  175. package/dist/cjs/utils/request.d.ts.map +1 -1
  176. package/dist/cjs/utils/request.js +19 -4
  177. package/dist/cjs/utils/request.js.map +1 -1
  178. package/dist/cjs/utils/signTypedData.d.ts +2 -0
  179. package/dist/cjs/utils/signTypedData.d.ts.map +1 -1
  180. package/dist/cjs/utils/signTypedData.js +10 -3
  181. package/dist/cjs/utils/signTypedData.js.map +1 -1
  182. package/dist/cjs/utils/units.d.ts +3 -0
  183. package/dist/cjs/utils/units.d.ts.map +1 -0
  184. package/dist/cjs/utils/units.js +18 -0
  185. package/dist/cjs/utils/units.js.map +1 -0
  186. package/dist/cjs/utils/validation.d.ts +2 -0
  187. package/dist/cjs/utils/validation.d.ts.map +1 -0
  188. package/dist/cjs/utils/validation.js +16 -0
  189. package/dist/cjs/utils/validation.js.map +1 -0
  190. package/dist/cjs/version.d.ts +1 -1
  191. package/dist/cjs/version.js +1 -1
  192. package/dist/cjs/wasm/lighter-signer.wasm +0 -0
  193. package/dist/cjs/wasm/wasm_exec.js +575 -0
  194. package/dist/esm/agent/AgentManager.d.ts +9 -9
  195. package/dist/esm/agent/AgentManager.d.ts.map +1 -1
  196. package/dist/esm/agent/AgentManager.js +20 -18
  197. package/dist/esm/agent/AgentManager.js.map +1 -1
  198. package/dist/esm/agent/storage.d.ts +1 -1
  199. package/dist/esm/agent/storage.js +1 -1
  200. package/dist/esm/client/PerpsClient.d.ts +226 -144
  201. package/dist/esm/client/PerpsClient.d.ts.map +1 -1
  202. package/dist/esm/client/PerpsClient.js +869 -320
  203. package/dist/esm/client/PerpsClient.js.map +1 -1
  204. package/dist/esm/client/createPerpsClient.d.ts +30 -51
  205. package/dist/esm/client/createPerpsClient.d.ts.map +1 -1
  206. package/dist/esm/client/createPerpsClient.js +6 -21
  207. package/dist/esm/client/createPerpsClient.js.map +1 -1
  208. package/dist/esm/client/projectAccountConfigSettings.d.ts +18 -0
  209. package/dist/esm/client/projectAccountConfigSettings.d.ts.map +1 -0
  210. package/dist/esm/client/projectAccountConfigSettings.js +29 -0
  211. package/dist/esm/client/projectAccountConfigSettings.js.map +1 -0
  212. package/dist/esm/client/types.d.ts +115 -49
  213. package/dist/esm/client/types.d.ts.map +1 -1
  214. package/dist/esm/client/types.js +11 -1
  215. package/dist/esm/client/types.js.map +1 -1
  216. package/dist/esm/errors/PerpsError.d.ts +2 -3
  217. package/dist/esm/errors/PerpsError.d.ts.map +1 -1
  218. package/dist/esm/errors/PerpsError.js +3 -15
  219. package/dist/esm/errors/PerpsError.js.map +1 -1
  220. package/dist/esm/errors/constants.d.ts +0 -10
  221. package/dist/esm/errors/constants.d.ts.map +1 -1
  222. package/dist/esm/errors/constants.js +0 -11
  223. package/dist/esm/errors/constants.js.map +1 -1
  224. package/dist/esm/index.d.ts +37 -31
  225. package/dist/esm/index.d.ts.map +1 -1
  226. package/dist/esm/index.js +27 -22
  227. package/dist/esm/index.js.map +1 -1
  228. package/dist/esm/providers/hyperliquid/accountConfig.d.ts +13 -0
  229. package/dist/esm/providers/hyperliquid/accountConfig.d.ts.map +1 -0
  230. package/dist/esm/providers/hyperliquid/accountConfig.js +69 -0
  231. package/dist/esm/providers/hyperliquid/accountConfig.js.map +1 -0
  232. package/dist/esm/providers/lighter/accountConfig.d.ts +13 -0
  233. package/dist/esm/providers/lighter/accountConfig.d.ts.map +1 -0
  234. package/dist/esm/providers/lighter/accountConfig.js +79 -0
  235. package/dist/esm/providers/lighter/accountConfig.js.map +1 -0
  236. package/dist/esm/realtime/PerpsWsClient.d.ts +13 -1
  237. package/dist/esm/realtime/PerpsWsClient.d.ts.map +1 -1
  238. package/dist/esm/realtime/PerpsWsClient.js +36 -23
  239. package/dist/esm/realtime/PerpsWsClient.js.map +1 -1
  240. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts +11 -5
  241. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
  242. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js +170 -53
  243. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js.map +1 -1
  244. package/dist/esm/realtime/hyperliquid/types.d.ts +11 -9
  245. package/dist/esm/realtime/hyperliquid/types.d.ts.map +1 -1
  246. package/dist/esm/realtime/lighter/LighterWsProvider.d.ts +68 -0
  247. package/dist/esm/realtime/lighter/LighterWsProvider.d.ts.map +1 -0
  248. package/dist/esm/realtime/lighter/LighterWsProvider.js +474 -0
  249. package/dist/esm/realtime/lighter/LighterWsProvider.js.map +1 -0
  250. package/dist/esm/realtime/lighter/types.d.ts +108 -0
  251. package/dist/esm/realtime/lighter/types.d.ts.map +1 -0
  252. package/dist/esm/realtime/lighter/types.js +14 -0
  253. package/dist/esm/realtime/lighter/types.js.map +1 -0
  254. package/dist/esm/services/createAction.d.ts +11 -0
  255. package/dist/esm/services/createAction.d.ts.map +1 -0
  256. package/dist/esm/services/createAction.js +14 -0
  257. package/dist/esm/services/createAction.js.map +1 -0
  258. package/dist/esm/services/executeAction.d.ts +11 -0
  259. package/dist/esm/services/executeAction.d.ts.map +1 -0
  260. package/dist/esm/services/executeAction.js +14 -0
  261. package/dist/esm/services/executeAction.js.map +1 -0
  262. package/dist/esm/services/getAccount.d.ts +7 -7
  263. package/dist/esm/services/getAccount.d.ts.map +1 -1
  264. package/dist/esm/services/getAccount.js +6 -6
  265. package/dist/esm/services/getAccount.js.map +1 -1
  266. package/dist/esm/services/getActivity.d.ts +49 -0
  267. package/dist/esm/services/getActivity.d.ts.map +1 -0
  268. package/dist/esm/services/getActivity.js +47 -0
  269. package/dist/esm/services/getActivity.js.map +1 -0
  270. package/dist/esm/services/getAsset.d.ts +20 -0
  271. package/dist/esm/services/getAsset.d.ts.map +1 -0
  272. package/dist/esm/services/getAsset.js +18 -0
  273. package/dist/esm/services/getAsset.js.map +1 -0
  274. package/dist/esm/services/getAssets.d.ts +18 -0
  275. package/dist/esm/services/getAssets.d.ts.map +1 -0
  276. package/dist/esm/services/getAssets.js +18 -0
  277. package/dist/esm/services/getAssets.js.map +1 -0
  278. package/dist/{types/services/getHistory.d.ts → esm/services/getFills.d.ts} +17 -13
  279. package/dist/esm/services/getFills.d.ts.map +1 -0
  280. package/dist/esm/services/{getHistory.js → getFills.js} +13 -11
  281. package/dist/esm/services/getFills.js.map +1 -0
  282. package/dist/esm/services/getOhlcv.d.ts +4 -4
  283. package/dist/esm/services/getOhlcv.d.ts.map +1 -1
  284. package/dist/esm/services/getOhlcv.js +4 -4
  285. package/dist/esm/services/getOhlcv.js.map +1 -1
  286. package/dist/esm/services/getOrder.d.ts +4 -4
  287. package/dist/esm/services/getOrder.d.ts.map +1 -1
  288. package/dist/esm/services/getOrder.js +4 -4
  289. package/dist/esm/services/getOrder.js.map +1 -1
  290. package/dist/esm/services/getOrderbook.d.ts +4 -4
  291. package/dist/esm/services/getOrderbook.d.ts.map +1 -1
  292. package/dist/esm/services/getOrderbook.js +4 -4
  293. package/dist/esm/services/getOrderbook.js.map +1 -1
  294. package/dist/esm/services/getOrders.d.ts +27 -0
  295. package/dist/esm/services/getOrders.d.ts.map +1 -0
  296. package/dist/esm/services/getOrders.js +23 -0
  297. package/dist/esm/services/getOrders.js.map +1 -0
  298. package/dist/esm/services/getPositions.d.ts +27 -0
  299. package/dist/esm/services/getPositions.d.ts.map +1 -0
  300. package/dist/esm/services/getPositions.js +23 -0
  301. package/dist/esm/services/getPositions.js.map +1 -0
  302. package/dist/esm/services/getPrices.d.ts +5 -5
  303. package/dist/esm/services/getPrices.d.ts.map +1 -1
  304. package/dist/esm/services/getPrices.js +4 -4
  305. package/dist/esm/services/getPrices.js.map +1 -1
  306. package/dist/esm/services/getProviders.d.ts +20 -0
  307. package/dist/esm/services/getProviders.d.ts.map +1 -0
  308. package/dist/esm/services/getProviders.js +21 -0
  309. package/dist/esm/services/getProviders.js.map +1 -0
  310. package/dist/esm/signers/lighter/LighterKeyStore.d.ts +29 -0
  311. package/dist/esm/signers/lighter/LighterKeyStore.d.ts.map +1 -0
  312. package/dist/esm/signers/lighter/LighterKeyStore.js +53 -0
  313. package/dist/esm/signers/lighter/LighterKeyStore.js.map +1 -0
  314. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts +174 -0
  315. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +1 -0
  316. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js +214 -0
  317. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js.map +1 -0
  318. package/dist/esm/signers/lighter/LighterSigner.d.ts +88 -0
  319. package/dist/esm/signers/lighter/LighterSigner.d.ts.map +1 -0
  320. package/dist/esm/signers/lighter/LighterSigner.js +226 -0
  321. package/dist/esm/signers/lighter/LighterSigner.js.map +1 -0
  322. package/dist/esm/signers/lighter/index.d.ts +9 -0
  323. package/dist/esm/signers/lighter/index.d.ts.map +1 -0
  324. package/dist/esm/signers/lighter/index.js +5 -0
  325. package/dist/esm/signers/lighter/index.js.map +1 -0
  326. package/dist/esm/signers/lighter/wasmLoader.d.ts +71 -0
  327. package/dist/esm/signers/lighter/wasmLoader.d.ts.map +1 -0
  328. package/dist/esm/signers/lighter/wasmLoader.js +181 -0
  329. package/dist/esm/signers/lighter/wasmLoader.js.map +1 -0
  330. package/dist/esm/utils/accountSummary.d.ts +13 -0
  331. package/dist/esm/utils/accountSummary.d.ts.map +1 -0
  332. package/dist/esm/utils/accountSummary.js +97 -0
  333. package/dist/esm/utils/accountSummary.js.map +1 -0
  334. package/dist/esm/utils/assertNever.d.ts +19 -0
  335. package/dist/esm/utils/assertNever.d.ts.map +1 -0
  336. package/dist/esm/utils/assertNever.js +21 -0
  337. package/dist/esm/utils/assertNever.js.map +1 -0
  338. package/dist/esm/utils/calculations.d.ts +109 -0
  339. package/dist/esm/utils/calculations.d.ts.map +1 -0
  340. package/dist/esm/utils/calculations.js +154 -0
  341. package/dist/esm/utils/calculations.js.map +1 -0
  342. package/dist/esm/utils/hyperliquid/index.d.ts +3 -0
  343. package/dist/esm/utils/hyperliquid/index.d.ts.map +1 -0
  344. package/dist/esm/utils/hyperliquid/index.js +3 -0
  345. package/dist/esm/utils/hyperliquid/index.js.map +1 -0
  346. package/dist/esm/utils/hyperliquid/liquidation.d.ts +46 -0
  347. package/dist/esm/utils/hyperliquid/liquidation.d.ts.map +1 -0
  348. package/dist/esm/utils/hyperliquid/liquidation.js +63 -0
  349. package/dist/esm/utils/hyperliquid/liquidation.js.map +1 -0
  350. package/dist/esm/utils/hyperliquid/orderFormatting.d.ts +44 -0
  351. package/dist/esm/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
  352. package/dist/esm/utils/hyperliquid/orderFormatting.js +79 -0
  353. package/dist/esm/utils/hyperliquid/orderFormatting.js.map +1 -0
  354. package/dist/esm/utils/orderClassification.d.ts +29 -0
  355. package/dist/esm/utils/orderClassification.d.ts.map +1 -0
  356. package/dist/esm/utils/orderClassification.js +53 -0
  357. package/dist/esm/utils/orderClassification.js.map +1 -0
  358. package/dist/esm/utils/orderMath.d.ts +40 -0
  359. package/dist/esm/utils/orderMath.d.ts.map +1 -0
  360. package/dist/esm/utils/orderMath.js +99 -0
  361. package/dist/esm/utils/orderMath.js.map +1 -0
  362. package/dist/esm/utils/parse.d.ts +18 -0
  363. package/dist/esm/utils/parse.d.ts.map +1 -0
  364. package/dist/esm/utils/parse.js +28 -0
  365. package/dist/esm/utils/parse.js.map +1 -0
  366. package/dist/esm/utils/positionMath.d.ts +78 -0
  367. package/dist/esm/utils/positionMath.d.ts.map +1 -0
  368. package/dist/esm/utils/positionMath.js +83 -0
  369. package/dist/esm/utils/positionMath.js.map +1 -0
  370. package/dist/esm/utils/request.d.ts +1 -2
  371. package/dist/esm/utils/request.d.ts.map +1 -1
  372. package/dist/esm/utils/request.js +23 -7
  373. package/dist/esm/utils/request.js.map +1 -1
  374. package/dist/esm/utils/signTypedData.d.ts +8 -10
  375. package/dist/esm/utils/signTypedData.d.ts.map +1 -1
  376. package/dist/esm/utils/signTypedData.js +15 -14
  377. package/dist/esm/utils/signTypedData.js.map +1 -1
  378. package/dist/esm/utils/units.d.ts +20 -0
  379. package/dist/esm/utils/units.d.ts.map +1 -0
  380. package/dist/esm/utils/units.js +31 -0
  381. package/dist/esm/utils/units.js.map +1 -0
  382. package/dist/esm/utils/validation.d.ts +15 -0
  383. package/dist/esm/utils/validation.d.ts.map +1 -0
  384. package/dist/esm/utils/validation.js +26 -0
  385. package/dist/esm/utils/validation.js.map +1 -0
  386. package/dist/esm/version.d.ts +1 -1
  387. package/dist/esm/version.js +1 -1
  388. package/dist/esm/wasm/lighter-signer.wasm +0 -0
  389. package/dist/esm/wasm/wasm_exec.js +575 -0
  390. package/dist/types/agent/AgentManager.d.ts +9 -9
  391. package/dist/types/agent/AgentManager.d.ts.map +1 -1
  392. package/dist/types/agent/storage.d.ts +1 -1
  393. package/dist/types/client/PerpsClient.d.ts +226 -144
  394. package/dist/types/client/PerpsClient.d.ts.map +1 -1
  395. package/dist/types/client/createPerpsClient.d.ts +30 -51
  396. package/dist/types/client/createPerpsClient.d.ts.map +1 -1
  397. package/dist/types/client/projectAccountConfigSettings.d.ts +18 -0
  398. package/dist/types/client/projectAccountConfigSettings.d.ts.map +1 -0
  399. package/dist/types/client/types.d.ts +115 -49
  400. package/dist/types/client/types.d.ts.map +1 -1
  401. package/dist/types/errors/PerpsError.d.ts +2 -3
  402. package/dist/types/errors/PerpsError.d.ts.map +1 -1
  403. package/dist/types/errors/constants.d.ts +0 -10
  404. package/dist/types/errors/constants.d.ts.map +1 -1
  405. package/dist/types/index.d.ts +37 -31
  406. package/dist/types/index.d.ts.map +1 -1
  407. package/dist/types/providers/hyperliquid/accountConfig.d.ts +13 -0
  408. package/dist/types/providers/hyperliquid/accountConfig.d.ts.map +1 -0
  409. package/dist/types/providers/lighter/accountConfig.d.ts +13 -0
  410. package/dist/types/providers/lighter/accountConfig.d.ts.map +1 -0
  411. package/dist/types/realtime/PerpsWsClient.d.ts +13 -1
  412. package/dist/types/realtime/PerpsWsClient.d.ts.map +1 -1
  413. package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts +11 -5
  414. package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
  415. package/dist/types/realtime/hyperliquid/types.d.ts +11 -9
  416. package/dist/types/realtime/hyperliquid/types.d.ts.map +1 -1
  417. package/dist/types/realtime/lighter/LighterWsProvider.d.ts +68 -0
  418. package/dist/types/realtime/lighter/LighterWsProvider.d.ts.map +1 -0
  419. package/dist/types/realtime/lighter/types.d.ts +108 -0
  420. package/dist/types/realtime/lighter/types.d.ts.map +1 -0
  421. package/dist/types/services/createAction.d.ts +11 -0
  422. package/dist/types/services/createAction.d.ts.map +1 -0
  423. package/dist/types/services/executeAction.d.ts +11 -0
  424. package/dist/types/services/executeAction.d.ts.map +1 -0
  425. package/dist/types/services/getAccount.d.ts +7 -7
  426. package/dist/types/services/getAccount.d.ts.map +1 -1
  427. package/dist/types/services/getActivity.d.ts +49 -0
  428. package/dist/types/services/getActivity.d.ts.map +1 -0
  429. package/dist/types/services/getAsset.d.ts +20 -0
  430. package/dist/types/services/getAsset.d.ts.map +1 -0
  431. package/dist/types/services/getAssets.d.ts +18 -0
  432. package/dist/types/services/getAssets.d.ts.map +1 -0
  433. package/dist/{esm/services/getHistory.d.ts → types/services/getFills.d.ts} +17 -13
  434. package/dist/types/services/getFills.d.ts.map +1 -0
  435. package/dist/types/services/getOhlcv.d.ts +4 -4
  436. package/dist/types/services/getOhlcv.d.ts.map +1 -1
  437. package/dist/types/services/getOrder.d.ts +4 -4
  438. package/dist/types/services/getOrder.d.ts.map +1 -1
  439. package/dist/types/services/getOrderbook.d.ts +4 -4
  440. package/dist/types/services/getOrderbook.d.ts.map +1 -1
  441. package/dist/types/services/getOrders.d.ts +27 -0
  442. package/dist/types/services/getOrders.d.ts.map +1 -0
  443. package/dist/types/services/getPositions.d.ts +27 -0
  444. package/dist/types/services/getPositions.d.ts.map +1 -0
  445. package/dist/types/services/getPrices.d.ts +5 -5
  446. package/dist/types/services/getPrices.d.ts.map +1 -1
  447. package/dist/types/services/getProviders.d.ts +20 -0
  448. package/dist/types/services/getProviders.d.ts.map +1 -0
  449. package/dist/types/signers/lighter/LighterKeyStore.d.ts +29 -0
  450. package/dist/types/signers/lighter/LighterKeyStore.d.ts.map +1 -0
  451. package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts +174 -0
  452. package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +1 -0
  453. package/dist/types/signers/lighter/LighterSigner.d.ts +88 -0
  454. package/dist/types/signers/lighter/LighterSigner.d.ts.map +1 -0
  455. package/dist/types/signers/lighter/index.d.ts +9 -0
  456. package/dist/types/signers/lighter/index.d.ts.map +1 -0
  457. package/dist/types/signers/lighter/wasmLoader.d.ts +71 -0
  458. package/dist/types/signers/lighter/wasmLoader.d.ts.map +1 -0
  459. package/dist/types/utils/accountSummary.d.ts +13 -0
  460. package/dist/types/utils/accountSummary.d.ts.map +1 -0
  461. package/dist/types/utils/assertNever.d.ts +19 -0
  462. package/dist/types/utils/assertNever.d.ts.map +1 -0
  463. package/dist/types/utils/calculations.d.ts +109 -0
  464. package/dist/types/utils/calculations.d.ts.map +1 -0
  465. package/dist/types/utils/hyperliquid/index.d.ts +3 -0
  466. package/dist/types/utils/hyperliquid/index.d.ts.map +1 -0
  467. package/dist/types/utils/hyperliquid/liquidation.d.ts +46 -0
  468. package/dist/types/utils/hyperliquid/liquidation.d.ts.map +1 -0
  469. package/dist/types/utils/hyperliquid/orderFormatting.d.ts +44 -0
  470. package/dist/types/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
  471. package/dist/types/utils/orderClassification.d.ts +29 -0
  472. package/dist/types/utils/orderClassification.d.ts.map +1 -0
  473. package/dist/types/utils/orderMath.d.ts +40 -0
  474. package/dist/types/utils/orderMath.d.ts.map +1 -0
  475. package/dist/types/utils/parse.d.ts +18 -0
  476. package/dist/types/utils/parse.d.ts.map +1 -0
  477. package/dist/types/utils/positionMath.d.ts +78 -0
  478. package/dist/types/utils/positionMath.d.ts.map +1 -0
  479. package/dist/types/utils/request.d.ts +1 -2
  480. package/dist/types/utils/request.d.ts.map +1 -1
  481. package/dist/types/utils/signTypedData.d.ts +8 -10
  482. package/dist/types/utils/signTypedData.d.ts.map +1 -1
  483. package/dist/types/utils/units.d.ts +20 -0
  484. package/dist/types/utils/units.d.ts.map +1 -0
  485. package/dist/types/utils/validation.d.ts +15 -0
  486. package/dist/types/utils/validation.d.ts.map +1 -0
  487. package/dist/types/version.d.ts +1 -1
  488. package/package.json +15 -6
  489. package/src/agent/AgentManager.ts +21 -19
  490. package/src/agent/storage.ts +1 -1
  491. package/src/client/PerpsClient.ts +1221 -396
  492. package/src/client/createPerpsClient.ts +39 -54
  493. package/src/client/projectAccountConfigSettings.ts +39 -0
  494. package/src/client/types.ts +130 -52
  495. package/src/errors/PerpsError.ts +3 -22
  496. package/src/errors/constants.ts +0 -11
  497. package/src/index.ts +115 -47
  498. package/src/providers/hyperliquid/accountConfig.ts +92 -0
  499. package/src/providers/lighter/accountConfig.ts +103 -0
  500. package/src/realtime/PerpsWsClient.ts +67 -32
  501. package/src/realtime/hyperliquid/HyperliquidWsProvider.ts +199 -64
  502. package/src/realtime/hyperliquid/types.ts +8 -10
  503. package/src/realtime/lighter/LighterWsProvider.ts +682 -0
  504. package/src/realtime/lighter/types.ts +121 -0
  505. package/src/services/createAction.ts +41 -0
  506. package/src/services/executeAction.ts +41 -0
  507. package/src/services/getAccount.ts +8 -8
  508. package/src/services/getActivity.ts +77 -0
  509. package/src/services/getAsset.ts +37 -0
  510. package/src/services/getAssets.ts +32 -0
  511. package/src/services/{getHistory.ts → getFills.ts} +23 -17
  512. package/src/services/getOhlcv.ts +14 -11
  513. package/src/services/getOrder.ts +11 -8
  514. package/src/services/getOrderbook.ts +11 -8
  515. package/src/services/getOrders.ts +45 -0
  516. package/src/services/getPositions.ts +45 -0
  517. package/src/services/getPrices.ts +6 -6
  518. package/src/services/{getDexes.ts → getProviders.ts} +10 -10
  519. package/src/signers/lighter/LighterKeyStore.ts +74 -0
  520. package/src/signers/lighter/LighterReadOnlyTokenManager.ts +358 -0
  521. package/src/signers/lighter/LighterSigner.ts +396 -0
  522. package/src/signers/lighter/index.ts +36 -0
  523. package/src/signers/lighter/wasmLoader.ts +291 -0
  524. package/src/utils/accountSummary.ts +130 -0
  525. package/src/utils/assertNever.ts +22 -0
  526. package/src/utils/calculations.ts +209 -0
  527. package/src/utils/hyperliquid/index.ts +9 -0
  528. package/src/utils/hyperliquid/liquidation.ts +71 -0
  529. package/src/utils/hyperliquid/orderFormatting.ts +96 -0
  530. package/src/utils/orderClassification.ts +64 -0
  531. package/src/utils/orderMath.ts +130 -0
  532. package/src/utils/parse.ts +28 -0
  533. package/src/utils/positionMath.ts +107 -0
  534. package/src/utils/request.ts +26 -7
  535. package/src/utils/signTypedData.ts +19 -15
  536. package/src/utils/units.ts +32 -0
  537. package/src/utils/validation.ts +35 -0
  538. package/src/version.ts +1 -1
  539. package/wasm/lighter-signer.wasm +0 -0
  540. package/wasm/wasm_exec.js +575 -0
  541. package/dist/cjs/dex/hyperliquid.d.ts +0 -3
  542. package/dist/cjs/dex/hyperliquid.d.ts.map +0 -1
  543. package/dist/cjs/dex/hyperliquid.js +0 -21
  544. package/dist/cjs/dex/hyperliquid.js.map +0 -1
  545. package/dist/cjs/dex/registry.d.ts +0 -3
  546. package/dist/cjs/dex/registry.d.ts.map +0 -1
  547. package/dist/cjs/dex/registry.js +0 -16
  548. package/dist/cjs/dex/registry.js.map +0 -1
  549. package/dist/cjs/dex/types.d.ts +0 -13
  550. package/dist/cjs/dex/types.d.ts.map +0 -1
  551. package/dist/cjs/errors/AgentError.d.ts +0 -10
  552. package/dist/cjs/errors/AgentError.d.ts.map +0 -1
  553. package/dist/cjs/errors/AgentError.js +0 -23
  554. package/dist/cjs/errors/AgentError.js.map +0 -1
  555. package/dist/cjs/errors/HTTPError.d.ts +0 -11
  556. package/dist/cjs/errors/HTTPError.d.ts.map +0 -1
  557. package/dist/cjs/errors/HTTPError.js +0 -62
  558. package/dist/cjs/errors/HTTPError.js.map +0 -1
  559. package/dist/cjs/errors/PerpsSDKError.d.ts +0 -9
  560. package/dist/cjs/errors/PerpsSDKError.d.ts.map +0 -1
  561. package/dist/cjs/errors/PerpsSDKError.js +0 -36
  562. package/dist/cjs/errors/PerpsSDKError.js.map +0 -1
  563. package/dist/cjs/errors/ServerError.d.ts +0 -10
  564. package/dist/cjs/errors/ServerError.d.ts.map +0 -1
  565. package/dist/cjs/errors/ServerError.js +0 -24
  566. package/dist/cjs/errors/ServerError.js.map +0 -1
  567. package/dist/cjs/errors/ValidationError.d.ts +0 -9
  568. package/dist/cjs/errors/ValidationError.d.ts.map +0 -1
  569. package/dist/cjs/errors/ValidationError.js +0 -23
  570. package/dist/cjs/errors/ValidationError.js.map +0 -1
  571. package/dist/cjs/errors/utils/rootCause.d.ts +0 -6
  572. package/dist/cjs/errors/utils/rootCause.d.ts.map +0 -1
  573. package/dist/cjs/errors/utils/rootCause.js +0 -41
  574. package/dist/cjs/errors/utils/rootCause.js.map +0 -1
  575. package/dist/cjs/services/cancelOrder.d.ts +0 -10
  576. package/dist/cjs/services/cancelOrder.d.ts.map +0 -1
  577. package/dist/cjs/services/cancelOrder.js +0 -16
  578. package/dist/cjs/services/cancelOrder.js.map +0 -1
  579. package/dist/cjs/services/createAuthorization.d.ts +0 -10
  580. package/dist/cjs/services/createAuthorization.d.ts.map +0 -1
  581. package/dist/cjs/services/createAuthorization.js +0 -16
  582. package/dist/cjs/services/createAuthorization.js.map +0 -1
  583. package/dist/cjs/services/createOrder.d.ts +0 -21
  584. package/dist/cjs/services/createOrder.d.ts.map +0 -1
  585. package/dist/cjs/services/createOrder.js +0 -27
  586. package/dist/cjs/services/createOrder.js.map +0 -1
  587. package/dist/cjs/services/createWithdrawal.d.ts +0 -9
  588. package/dist/cjs/services/createWithdrawal.d.ts.map +0 -1
  589. package/dist/cjs/services/createWithdrawal.js +0 -15
  590. package/dist/cjs/services/createWithdrawal.js.map +0 -1
  591. package/dist/cjs/services/getDexes.d.ts +0 -4
  592. package/dist/cjs/services/getDexes.d.ts.map +0 -1
  593. package/dist/cjs/services/getDexes.js.map +0 -1
  594. package/dist/cjs/services/getHistory.d.ts +0 -10
  595. package/dist/cjs/services/getHistory.d.ts.map +0 -1
  596. package/dist/cjs/services/getHistory.js.map +0 -1
  597. package/dist/cjs/services/getMarket.d.ts +0 -8
  598. package/dist/cjs/services/getMarket.d.ts.map +0 -1
  599. package/dist/cjs/services/getMarket.js.map +0 -1
  600. package/dist/cjs/services/getMarkets.d.ts +0 -7
  601. package/dist/cjs/services/getMarkets.d.ts.map +0 -1
  602. package/dist/cjs/services/getMarkets.js.map +0 -1
  603. package/dist/cjs/services/submitAuthorization.d.ts +0 -10
  604. package/dist/cjs/services/submitAuthorization.d.ts.map +0 -1
  605. package/dist/cjs/services/submitAuthorization.js.map +0 -1
  606. package/dist/cjs/services/submitOrder.d.ts +0 -10
  607. package/dist/cjs/services/submitOrder.d.ts.map +0 -1
  608. package/dist/cjs/services/submitOrder.js.map +0 -1
  609. package/dist/cjs/services/submitWithdrawal.d.ts +0 -9
  610. package/dist/cjs/services/submitWithdrawal.d.ts.map +0 -1
  611. package/dist/cjs/services/submitWithdrawal.js +0 -15
  612. package/dist/cjs/services/submitWithdrawal.js.map +0 -1
  613. package/dist/esm/dex/hyperliquid.d.ts +0 -3
  614. package/dist/esm/dex/hyperliquid.d.ts.map +0 -1
  615. package/dist/esm/dex/hyperliquid.js +0 -19
  616. package/dist/esm/dex/hyperliquid.js.map +0 -1
  617. package/dist/esm/dex/registry.d.ts +0 -3
  618. package/dist/esm/dex/registry.d.ts.map +0 -1
  619. package/dist/esm/dex/registry.js +0 -13
  620. package/dist/esm/dex/registry.js.map +0 -1
  621. package/dist/esm/dex/types.d.ts +0 -15
  622. package/dist/esm/dex/types.d.ts.map +0 -1
  623. package/dist/esm/dex/types.js +0 -2
  624. package/dist/esm/dex/types.js.map +0 -1
  625. package/dist/esm/errors/AgentError.d.ts +0 -25
  626. package/dist/esm/errors/AgentError.d.ts.map +0 -1
  627. package/dist/esm/errors/AgentError.js +0 -35
  628. package/dist/esm/errors/AgentError.js.map +0 -1
  629. package/dist/esm/errors/HTTPError.d.ts +0 -11
  630. package/dist/esm/errors/HTTPError.d.ts.map +0 -1
  631. package/dist/esm/errors/HTTPError.js +0 -61
  632. package/dist/esm/errors/HTTPError.js.map +0 -1
  633. package/dist/esm/errors/PerpsSDKError.d.ts +0 -40
  634. package/dist/esm/errors/PerpsSDKError.d.ts.map +0 -1
  635. package/dist/esm/errors/PerpsSDKError.js +0 -67
  636. package/dist/esm/errors/PerpsSDKError.js.map +0 -1
  637. package/dist/esm/errors/ServerError.d.ts +0 -23
  638. package/dist/esm/errors/ServerError.d.ts.map +0 -1
  639. package/dist/esm/errors/ServerError.js +0 -34
  640. package/dist/esm/errors/ServerError.js.map +0 -1
  641. package/dist/esm/errors/ValidationError.d.ts +0 -23
  642. package/dist/esm/errors/ValidationError.d.ts.map +0 -1
  643. package/dist/esm/errors/ValidationError.js +0 -34
  644. package/dist/esm/errors/ValidationError.js.map +0 -1
  645. package/dist/esm/errors/utils/rootCause.d.ts +0 -71
  646. package/dist/esm/errors/utils/rootCause.d.ts.map +0 -1
  647. package/dist/esm/errors/utils/rootCause.js +0 -99
  648. package/dist/esm/errors/utils/rootCause.js.map +0 -1
  649. package/dist/esm/services/cancelOrder.d.ts +0 -51
  650. package/dist/esm/services/cancelOrder.d.ts.map +0 -1
  651. package/dist/esm/services/cancelOrder.js +0 -50
  652. package/dist/esm/services/cancelOrder.js.map +0 -1
  653. package/dist/esm/services/createAuthorization.d.ts +0 -51
  654. package/dist/esm/services/createAuthorization.d.ts.map +0 -1
  655. package/dist/esm/services/createAuthorization.js +0 -50
  656. package/dist/esm/services/createAuthorization.js.map +0 -1
  657. package/dist/esm/services/createOrder.d.ts +0 -74
  658. package/dist/esm/services/createOrder.d.ts.map +0 -1
  659. package/dist/esm/services/createOrder.js +0 -62
  660. package/dist/esm/services/createOrder.js.map +0 -1
  661. package/dist/esm/services/createWithdrawal.d.ts +0 -49
  662. package/dist/esm/services/createWithdrawal.d.ts.map +0 -1
  663. package/dist/esm/services/createWithdrawal.js +0 -49
  664. package/dist/esm/services/createWithdrawal.js.map +0 -1
  665. package/dist/esm/services/getDexes.d.ts +0 -20
  666. package/dist/esm/services/getDexes.d.ts.map +0 -1
  667. package/dist/esm/services/getDexes.js +0 -21
  668. package/dist/esm/services/getDexes.js.map +0 -1
  669. package/dist/esm/services/getHistory.d.ts.map +0 -1
  670. package/dist/esm/services/getHistory.js.map +0 -1
  671. package/dist/esm/services/getMarket.d.ts +0 -27
  672. package/dist/esm/services/getMarket.d.ts.map +0 -1
  673. package/dist/esm/services/getMarket.js +0 -25
  674. package/dist/esm/services/getMarket.js.map +0 -1
  675. package/dist/esm/services/getMarkets.d.ts +0 -25
  676. package/dist/esm/services/getMarkets.d.ts.map +0 -1
  677. package/dist/esm/services/getMarkets.js +0 -23
  678. package/dist/esm/services/getMarkets.js.map +0 -1
  679. package/dist/esm/services/submitAuthorization.d.ts +0 -42
  680. package/dist/esm/services/submitAuthorization.d.ts.map +0 -1
  681. package/dist/esm/services/submitAuthorization.js +0 -41
  682. package/dist/esm/services/submitAuthorization.js.map +0 -1
  683. package/dist/esm/services/submitOrder.d.ts +0 -44
  684. package/dist/esm/services/submitOrder.d.ts.map +0 -1
  685. package/dist/esm/services/submitOrder.js +0 -43
  686. package/dist/esm/services/submitOrder.js.map +0 -1
  687. package/dist/esm/services/submitWithdrawal.d.ts +0 -40
  688. package/dist/esm/services/submitWithdrawal.d.ts.map +0 -1
  689. package/dist/esm/services/submitWithdrawal.js +0 -40
  690. package/dist/esm/services/submitWithdrawal.js.map +0 -1
  691. package/dist/types/dex/hyperliquid.d.ts +0 -3
  692. package/dist/types/dex/hyperliquid.d.ts.map +0 -1
  693. package/dist/types/dex/registry.d.ts +0 -3
  694. package/dist/types/dex/registry.d.ts.map +0 -1
  695. package/dist/types/dex/types.d.ts +0 -15
  696. package/dist/types/dex/types.d.ts.map +0 -1
  697. package/dist/types/errors/AgentError.d.ts +0 -25
  698. package/dist/types/errors/AgentError.d.ts.map +0 -1
  699. package/dist/types/errors/HTTPError.d.ts +0 -11
  700. package/dist/types/errors/HTTPError.d.ts.map +0 -1
  701. package/dist/types/errors/PerpsSDKError.d.ts +0 -40
  702. package/dist/types/errors/PerpsSDKError.d.ts.map +0 -1
  703. package/dist/types/errors/ServerError.d.ts +0 -23
  704. package/dist/types/errors/ServerError.d.ts.map +0 -1
  705. package/dist/types/errors/ValidationError.d.ts +0 -23
  706. package/dist/types/errors/ValidationError.d.ts.map +0 -1
  707. package/dist/types/errors/utils/rootCause.d.ts +0 -71
  708. package/dist/types/errors/utils/rootCause.d.ts.map +0 -1
  709. package/dist/types/services/cancelOrder.d.ts +0 -51
  710. package/dist/types/services/cancelOrder.d.ts.map +0 -1
  711. package/dist/types/services/createAuthorization.d.ts +0 -51
  712. package/dist/types/services/createAuthorization.d.ts.map +0 -1
  713. package/dist/types/services/createOrder.d.ts +0 -74
  714. package/dist/types/services/createOrder.d.ts.map +0 -1
  715. package/dist/types/services/createWithdrawal.d.ts +0 -49
  716. package/dist/types/services/createWithdrawal.d.ts.map +0 -1
  717. package/dist/types/services/getDexes.d.ts +0 -20
  718. package/dist/types/services/getDexes.d.ts.map +0 -1
  719. package/dist/types/services/getHistory.d.ts.map +0 -1
  720. package/dist/types/services/getMarket.d.ts +0 -27
  721. package/dist/types/services/getMarket.d.ts.map +0 -1
  722. package/dist/types/services/getMarkets.d.ts +0 -25
  723. package/dist/types/services/getMarkets.d.ts.map +0 -1
  724. package/dist/types/services/submitAuthorization.d.ts +0 -42
  725. package/dist/types/services/submitAuthorization.d.ts.map +0 -1
  726. package/dist/types/services/submitOrder.d.ts +0 -44
  727. package/dist/types/services/submitOrder.d.ts.map +0 -1
  728. package/dist/types/services/submitWithdrawal.d.ts +0 -40
  729. package/dist/types/services/submitWithdrawal.d.ts.map +0 -1
  730. package/src/dex/hyperliquid.ts +0 -20
  731. package/src/dex/registry.ts +0 -15
  732. package/src/dex/types.ts +0 -16
  733. package/src/errors/AgentError.ts +0 -43
  734. package/src/errors/HTTPError.ts +0 -72
  735. package/src/errors/PerpsSDKError.ts +0 -79
  736. package/src/errors/ServerError.ts +0 -41
  737. package/src/errors/ValidationError.ts +0 -38
  738. package/src/errors/utils/rootCause.ts +0 -112
  739. package/src/services/cancelOrder.ts +0 -75
  740. package/src/services/createAuthorization.ts +0 -79
  741. package/src/services/createOrder.ts +0 -116
  742. package/src/services/createWithdrawal.ts +0 -76
  743. package/src/services/getMarket.ts +0 -41
  744. package/src/services/getMarkets.ts +0 -37
  745. package/src/services/submitAuthorization.ts +0 -70
  746. package/src/services/submitOrder.ts +0 -72
  747. package/src/services/submitWithdrawal.ts +0 -67
  748. /package/dist/cjs/{dex → realtime/lighter}/types.js +0 -0
@@ -1,438 +1,987 @@
1
- import { PerpsErrorCode } from '@lifi/perps-types';
2
- import { getDexAuthProvider } from '../dex/registry.js';
3
- import { PerpsErrorMessage } from '../errors/constants.js';
1
+ import { ActionType, PerpsErrorCode, PerpsSigner, SigningMethod, } from '@lifi/perps-types';
2
+ import { parseAbi } from 'viem';
3
+ import { localStorageAdapter } from '../agent/storage.js';
4
4
  import { PerpsError } from '../errors/PerpsError.js';
5
- import { cancelOrder } from '../services/cancelOrder.js';
6
- import { createAuthorization } from '../services/createAuthorization.js';
7
- import { createOrder } from '../services/createOrder.js';
8
- import { createWithdrawal } from '../services/createWithdrawal.js';
9
- import { submitAuthorization } from '../services/submitAuthorization.js';
10
- import { submitOrder } from '../services/submitOrder.js';
11
- import { submitWithdrawal } from '../services/submitWithdrawal.js';
12
- import { signTypedData } from '../utils/signTypedData.js';
5
+ import { createAction } from '../services/createAction.js';
6
+ import { executeAction } from '../services/executeAction.js';
7
+ import { getAccount } from '../services/getAccount.js';
8
+ import { getProviders } from '../services/getProviders.js';
9
+ import { DEFAULT_API_KEY_INDEX, LighterKeyStore, LighterReadOnlyTokenManager, LighterSigner, walletClientSigner, } from '../signers/lighter/index.js';
10
+ import { signTypedData, signTypedDataWithSigner, } from '../utils/signTypedData.js';
13
11
  import { createPerpsClient } from './createPerpsClient.js';
12
+ import { projectAccountConfigSettings } from './projectAccountConfigSettings.js';
13
+ import { SigningMode, } from './types.js';
14
+ const MAX_NONCE_RETRIES = 3;
14
15
  /**
15
- * Stateful client for managing signing modes and trading operations.
16
- *
17
- * The PerpsClient provides two signing modes:
18
- * - `USER`: User wallet signs each action (wallet popup per action)
19
- * - `USER_AGENT`: SDK-generated agent signs actions (no popups after setup)
20
- *
21
- * In `USER_AGENT` mode, the client:
22
- * - Generates an agent keypair stored in localStorage (or custom storage)
23
- * - Auto-injects agent address into authorization requests
24
- * - Auto-signs trading actions with the agent key
25
- *
26
- * @remarks
27
- * The example below uses Hyperliquid. Authorization keys and parameters are DEX-specific.
28
- *
29
- * @example
30
- * ```ts
31
- * const perps = new PerpsClient({ integrator: 'my-app' })
32
- *
33
- * // Set up agent signing for a user + DEX pair
34
- * await perps.setSigningMode(userAddress, 'hyperliquid', 'USER_AGENT')
35
- *
36
- * // Check and execute required authorizations
37
- * const required = await perps.getRequiredAuthorizations({
38
- * dex: 'hyperliquid',
39
- * address: userAddress,
40
- * })
41
- *
42
- * // ... sign actions with user wallet ...
43
- *
44
- * // Place orders (agent signs automatically)
45
- * const result = await perps.placeOrder({
46
- * address: userAddress,
47
- * dex: 'hyperliquid',
48
- * symbol: 'BTC',
49
- * side: 'BUY',
50
- * type: 'MARKET',
51
- * size: '0.1',
52
- * price: '95000.00'
53
- * })
54
- * ```
16
+ * Look up an action's descriptor in the provider's metadata. Throws if the
17
+ * action isn't declared — defensive: better to fail loudly than to mis-sign.
55
18
  */
19
+ function findActionDescriptor(metadata, action) {
20
+ const descriptor = [
21
+ ...metadata.setup,
22
+ ...metadata.options,
23
+ ...metadata.actions,
24
+ ].find((d) => d.type === action);
25
+ if (!descriptor) {
26
+ throw new PerpsError(PerpsErrorCode.SDKError, `Provider '${metadata.key}' does not declare action '${action}'.`);
27
+ }
28
+ return descriptor;
29
+ }
56
30
  export class PerpsClient {
57
31
  sdkClient;
32
+ storage;
58
33
  signingModes = new Map();
34
+ providerMetadataCache = new Map();
35
+ _signer;
36
+ lighterConfig;
37
+ lighterReadOnlyTokenOptions;
38
+ _lighterSigner;
39
+ _lighterKeyStore;
40
+ _lighterReadOnlyTokenManager;
59
41
  constructor(options) {
42
+ this.storage = options.storage ?? localStorageAdapter;
43
+ this.lighterConfig = options.lighter;
44
+ this.lighterReadOnlyTokenOptions = options.lighterReadOnlyToken;
60
45
  this.sdkClient = createPerpsClient({
61
46
  integrator: options.integrator,
62
47
  apiKey: options.apiKey,
63
48
  apiUrl: options.apiUrl,
64
- storage: options.storage,
49
+ storage: this.storage,
50
+ providers: options.providers,
65
51
  });
66
52
  }
53
+ getLighterSigner() {
54
+ if (!this._lighterSigner) {
55
+ this._lighterSigner = new LighterSigner(this.lighterConfig);
56
+ }
57
+ return this._lighterSigner;
58
+ }
59
+ getLighterKeyStore() {
60
+ if (!this._lighterKeyStore) {
61
+ this._lighterKeyStore = new LighterKeyStore(this.storage);
62
+ }
63
+ return this._lighterKeyStore;
64
+ }
65
+ getLighterReadOnlyTokenManager() {
66
+ if (!this._lighterReadOnlyTokenManager) {
67
+ this._lighterReadOnlyTokenManager = new LighterReadOnlyTokenManager({
68
+ storage: this.storage,
69
+ ...this.lighterReadOnlyTokenOptions,
70
+ });
71
+ }
72
+ return this._lighterReadOnlyTokenManager;
73
+ }
67
74
  /**
68
- * Get the underlying SDK client for use with service functions.
75
+ * Set or update the wallet signer. Used whenever an action's descriptor
76
+ * names the user wallet in its `signers` list. Pass undefined to clear.
69
77
  */
78
+ setSigner(signer) {
79
+ this._signer = signer;
80
+ // Override the signer on the sdkClient
81
+ Object.defineProperty(this.sdkClient, 'signer', {
82
+ get: () => this._signer,
83
+ configurable: true,
84
+ });
85
+ }
70
86
  get client() {
71
87
  return this.sdkClient;
72
88
  }
73
- /**
74
- * Get the storage key for a user + DEX pair.
75
- */
76
- modeKey(address, dex) {
77
- return `${address.toLowerCase()}:${dex.toLowerCase()}`;
89
+ modeKey(address, provider) {
90
+ return `${address.toLowerCase()}:${provider.toLowerCase()}`;
78
91
  }
79
- /**
80
- * Set the signing mode for a user + DEX pair.
81
- *
82
- * In `USER_AGENT` mode, generates an agent keypair if one doesn't exist.
83
- *
84
- * @param address - User wallet address
85
- * @param dex - DEX identifier
86
- * @param mode - Signing mode to set
87
- */
88
- async setSigningMode(address, dex, mode) {
89
- const key = this.modeKey(address, dex);
90
- this.signingModes.set(key, mode);
91
- if (mode === 'USER_AGENT') {
92
- // Generate agent keypair if not exists
93
- await this.sdkClient.agentManager.getOrCreateAgent(address, dex);
92
+ signingModeStorageKey(address, provider) {
93
+ return `lifi-perps-mode:${address.toLowerCase()}:${provider.toLowerCase()}`;
94
+ }
95
+ async getProviderMetadata(provider) {
96
+ const cached = this.providerMetadataCache.get(provider);
97
+ if (cached) {
98
+ return cached;
99
+ }
100
+ const { providers } = await getProviders(this.sdkClient);
101
+ for (const d of providers) {
102
+ this.providerMetadataCache.set(d.key, d);
103
+ }
104
+ const metadata = this.providerMetadataCache.get(provider);
105
+ if (!metadata) {
106
+ const error = new PerpsError(PerpsErrorCode.SDKError, `Unsupported provider: ${provider}`);
107
+ error.tool = '@lifi/perps-sdk';
108
+ throw error;
94
109
  }
110
+ return metadata;
95
111
  }
96
112
  /**
97
- * Get the current signing mode for a user + DEX pair.
98
- * Defaults to `USER` if not set.
113
+ * Action types that require explicit user input (a chosen mode or tier)
114
+ * and therefore cannot be bulk-staged through `buildPrerequisites` with
115
+ * empty params. Callers must dispatch these via `execute(...)` once a
116
+ * value is picked. The post-`APPROVE_AGENT` auto-upgrade path also
117
+ * dispatches `ACCOUNT_MODE` directly with `mode: 'unifiedAccount'`.
99
118
  */
100
- getSigningMode(address, dex) {
101
- return this.signingModes.get(this.modeKey(address, dex)) ?? 'USER';
119
+ static EXPLICIT_INPUT_PREREQUISITES = new Set([ActionType.ACCOUNT_MODE, ActionType.ACCOUNT_TYPE]);
120
+ buildPrerequisiteInputs(prerequisites, mode, agentAddress) {
121
+ return prerequisites
122
+ .filter((p) => {
123
+ // ACCOUNT_MODE / ACCOUNT_TYPE require explicit params; they're
124
+ // dispatched separately via `execute(...)` (or the post-APPROVE_AGENT
125
+ // auto-upgrade chain) rather than bulk-staged.
126
+ if (PerpsClient.EXPLICIT_INPUT_PREREQUISITES.has(p.type)) {
127
+ return false;
128
+ }
129
+ if (mode === SigningMode.USER) {
130
+ // USER mode: only items the user can sign, and never APPROVE_AGENT
131
+ // (no agent is created in this mode).
132
+ if (!p.signers.includes(PerpsSigner.USER)) {
133
+ return false;
134
+ }
135
+ if (p.type === ActionType.APPROVE_AGENT) {
136
+ return false;
137
+ }
138
+ return true;
139
+ }
140
+ // USER_AGENT mode: include every remaining declared prerequisite.
141
+ return true;
142
+ })
143
+ .map((p) => {
144
+ const params = {};
145
+ if (p.type === ActionType.APPROVE_AGENT && agentAddress) {
146
+ params.agentAddress = agentAddress;
147
+ }
148
+ return {
149
+ key: p.type,
150
+ ...(Object.keys(params).length > 0 ? { params } : {}),
151
+ };
152
+ });
153
+ }
154
+ async resolveSignerForAction(action, address, provider) {
155
+ const mode = await this.loadSigningMode(address, provider);
156
+ if (mode !== SigningMode.USER_AGENT) {
157
+ return undefined;
158
+ }
159
+ // Only AGENT-signed actions surface a distinct signerAddress on the wire.
160
+ // API_KEY signers (e.g. Lighter's LighterKeyStore) are managed per-provider
161
+ // and don't have an EVM address — the backend identifies the action by the
162
+ // L1 `address` instead.
163
+ const metadata = await this.getProviderMetadata(provider);
164
+ const allActions = [
165
+ ...metadata.setup,
166
+ ...metadata.options,
167
+ ...metadata.actions,
168
+ ];
169
+ const descriptor = allActions.find((d) => d.type === action);
170
+ if (!descriptor?.signers.includes(PerpsSigner.AGENT)) {
171
+ return undefined;
172
+ }
173
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider);
174
+ return agent.address;
102
175
  }
103
176
  /**
104
- * Get the agent address for a user + DEX pair.
105
- *
106
- * @throws {PerpsError} If in USER mode or agent not found
177
+ * True if any descriptor for the provider lists `PerpsSigner.AGENT`.
178
+ * Providers like Lighter sign with their own keystore and never need an
179
+ * AgentManager-managed agent.
107
180
  */
108
- async getAgentAddress(address, dex) {
109
- const agent = await this.sdkClient.agentManager.getAgent(address, dex);
110
- return agent.address;
181
+ async providerUsesAgent(provider) {
182
+ const metadata = await this.getProviderMetadata(provider);
183
+ const all = [...metadata.setup, ...metadata.options, ...metadata.actions];
184
+ return all.some((d) => d.signers.includes(PerpsSigner.AGENT));
185
+ }
186
+ async autoSignAndExecute(provider, address, action, actions, descriptor) {
187
+ switch (descriptor.signingMethod) {
188
+ case SigningMethod.EIP712: {
189
+ const eip712Actions = actions;
190
+ if (descriptor.signers.includes(PerpsSigner.AGENT)) {
191
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider);
192
+ const signedActions = await Promise.all(eip712Actions.map(async (a) => ({
193
+ action: a.action,
194
+ typedData: a.typedData,
195
+ signature: await signTypedData(agent.privateKey, a.typedData),
196
+ })));
197
+ return executeAction(this.sdkClient, {
198
+ provider,
199
+ address,
200
+ signerAddress: agent.address,
201
+ action,
202
+ actions: signedActions,
203
+ });
204
+ }
205
+ if (descriptor.signers.includes(PerpsSigner.USER)) {
206
+ const signer = this.sdkClient.signer;
207
+ if (!signer) {
208
+ throw new PerpsError(PerpsErrorCode.SDKError, `Action '${action}' requires a user-wallet signature, but no signer was configured. Pass a WalletClient to createPerpsClient({ signer }).`);
209
+ }
210
+ const signedActions = await Promise.all(eip712Actions.map(async (a) => ({
211
+ action: a.action,
212
+ typedData: a.typedData,
213
+ signature: await signTypedDataWithSigner(signer, a.typedData),
214
+ })));
215
+ return executeAction(this.sdkClient, {
216
+ provider,
217
+ address,
218
+ signerAddress: address,
219
+ action,
220
+ actions: signedActions,
221
+ });
222
+ }
223
+ throw new PerpsError(PerpsErrorCode.SDKError, `Action '${action}' descriptor names no supported signer (signers=[${descriptor.signers.join(', ')}]).`);
224
+ }
225
+ case SigningMethod.WASM_BLOB: {
226
+ const wasmActions = actions;
227
+ const signedActions = await this.signWasmBlobActions(provider, address, wasmActions);
228
+ return executeAction(this.sdkClient, {
229
+ provider,
230
+ address,
231
+ signerAddress: address,
232
+ action,
233
+ actions: signedActions,
234
+ });
235
+ }
236
+ case SigningMethod.EVM_TX: {
237
+ const evmActions = actions;
238
+ const signedActions = await this.signEvmTxActions(evmActions);
239
+ return executeAction(this.sdkClient, {
240
+ provider,
241
+ address,
242
+ signerAddress: address,
243
+ action,
244
+ actions: signedActions,
245
+ });
246
+ }
247
+ default:
248
+ throw new Error(`Unknown signingMethod: ${descriptor.signingMethod}`);
249
+ }
111
250
  }
112
251
  /**
113
- * Check if an agent exists for a user + DEX pair.
252
+ * Sign a single prerequisite step using whichever signing path matches the
253
+ * step's shape — EIP-712 typed data, WASM blob (with the hybrid EIP-191 +
254
+ * WASM flow for REGISTER_API_KEY), or EVM transaction. Lets consumers
255
+ * collect signed prereqs without embedding per-method signing logic.
114
256
  */
115
- async hasAgent(address, dex) {
116
- return this.sdkClient.agentManager.hasAgent(address, dex);
257
+ async signPrerequisite(provider, address, step) {
258
+ if ('typedData' in step) {
259
+ if (!this.sdkClient.signer) {
260
+ throw new PerpsError(PerpsErrorCode.SDKError, 'EIP-712 prerequisite signing requires a wallet signer. Pass ' +
261
+ '`signer` to createPerpsClient or call setSigner(walletClient).');
262
+ }
263
+ return {
264
+ action: step.action,
265
+ typedData: step.typedData,
266
+ signature: await signTypedDataWithSigner(this.sdkClient.signer, step.typedData),
267
+ };
268
+ }
269
+ if ('wasmSignParams' in step) {
270
+ const [signed] = await this.signWasmBlobActions(provider, address, [step]);
271
+ return signed;
272
+ }
273
+ if ('txParams' in step) {
274
+ const [signed] = await this.signEvmTxActions([step]);
275
+ return signed;
276
+ }
277
+ throw new PerpsError(PerpsErrorCode.SDKError, 'Unknown ActionStep shape — expected typedData, wasmSignParams, or txParams.');
117
278
  }
118
279
  /**
119
- * Remove the agent for a user + DEX pair.
120
- * Also resets signing mode to USER.
280
+ * Sign and broadcast a sequence of EVM transactions via the user's wallet
281
+ * client. Steps are submitted serially so a later step (e.g. deposit) can
282
+ * rely on an earlier step (e.g. approve) having mined. Each step's
283
+ * `txParams` carries chainId, target, function name, args, and a
284
+ * human-readable abi from the backend.
121
285
  */
122
- async removeAgent(address, dex) {
123
- await this.sdkClient.agentManager.removeAgent(address, dex);
124
- this.signingModes.delete(this.modeKey(address, dex));
286
+ async signEvmTxActions(actions) {
287
+ if (!this.sdkClient.signer) {
288
+ throw new PerpsError(PerpsErrorCode.SDKError, 'EVM_TX signing requires a wallet signer. Pass `signer` to ' +
289
+ 'createPerpsClient or call setSigner(walletClient).');
290
+ }
291
+ const { signer } = this.sdkClient;
292
+ const signed = [];
293
+ for (const step of actions) {
294
+ const params = step.txParams;
295
+ const txHash = await signer.writeContract({
296
+ address: params.to,
297
+ abi: parseAbi(params.abi),
298
+ functionName: params.functionName,
299
+ args: params.args,
300
+ chain: signer.chain,
301
+ account: signer.account,
302
+ });
303
+ signed.push({
304
+ action: step.action,
305
+ txParams: step.txParams,
306
+ txHash,
307
+ });
308
+ }
309
+ return signed;
125
310
  }
126
311
  /**
127
- * Build authorization payloads for signing.
128
- *
129
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
130
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
312
+ * Sign a batch of WASM_BLOB action steps (Lighter). Ensures the user's
313
+ * Lighter API keypair is registered first — generating one and running the
314
+ * REGISTER_API_KEY hybrid flow via the L1 signer if not — then feeds each
315
+ * subsequent step through the WASM signer and returns signed blobs.
131
316
  *
132
- * @param params - Authorization parameters
133
- * @returns Authorization actions with typed data for signing
317
+ * `ACCOUNT_TYPE` (Lighter `/api/v1/changeAccountTier`) is dispatched as a
318
+ * WASM_BLOB envelope by the backend but is NOT a wasm-signed transaction —
319
+ * Lighter authenticates the endpoint with an auth token and enforces
320
+ * anti-replay server-side (24h cooldown, no open positions). The signer
321
+ * mints a Lighter auth token via the same WASM `CreateAuthToken` the read
322
+ * endpoints use and parks it in `signedTx.txInfo`; the backend's
323
+ * `executeChangeAccountTier` consumes that field as the `auth` form
324
+ * parameter. `txType`/`txHash` are unused for this action — they carry
325
+ * placeholder values to satisfy the `WasmBlobSignedActionStep` shape.
134
326
  */
135
- async buildAuthorization(params) {
136
- const mode = this.getSigningMode(params.address, params.dex);
137
- let { signerAddress } = params;
138
- if (mode === 'USER_AGENT') {
139
- const agent = await this.sdkClient.agentManager.getAgent(params.address, params.dex);
140
- signerAddress = signerAddress ?? agent.address;
327
+ async signWasmBlobActions(provider, address, actions) {
328
+ const signed = [];
329
+ for (const step of actions) {
330
+ if (step.action === ActionType.REGISTER_API_KEY) {
331
+ signed.push(await this.signRegisterApiKey(provider, address, step));
332
+ }
333
+ else if (step.action === ActionType.ACCOUNT_TYPE) {
334
+ signed.push(await this.signAccountTierChange(address, step));
335
+ }
336
+ else {
337
+ signed.push(await this.signStandardWasmAction(provider, address, step));
338
+ }
141
339
  }
142
- return createAuthorization(this.sdkClient, {
143
- ...params,
144
- signerAddress,
340
+ return signed;
341
+ }
342
+ async signStandardWasmAction(provider, address, step) {
343
+ const apiKey = await this.getLighterKeyStore().get(address);
344
+ if (!apiKey) {
345
+ throw new PerpsError(PerpsErrorCode.SDKError, `No Lighter API key registered for ${address}. ` +
346
+ 'Run prepareAccount / REGISTER_API_KEY first.');
347
+ }
348
+ const signer = this.getLighterSigner();
349
+ const signedTx = await signer.sign(step.action, step.wasmSignParams, {
350
+ apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
351
+ apiKeyIndex: apiKey.apiKeyIndex,
352
+ accountIndex: apiKey.accountIndex,
145
353
  });
354
+ void provider;
355
+ return {
356
+ action: step.action,
357
+ wasmSignParams: step.wasmSignParams,
358
+ signedTx,
359
+ };
146
360
  }
147
361
  /**
148
- * Submit signed authorizations.
149
- *
150
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
151
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
362
+ * REGISTER_API_KEY flow:
363
+ * 1. Look up the user's Lighter accountIndex from getAccount()
364
+ * 2. Generate a fresh Lighter API keypair via the WASM signer
365
+ * 3. Call SignChangePubKey to produce the WASM blob + EIP-191 message
366
+ * 4. Have the user's L1 Ethereum wallet sign the message
367
+ * 5. Inject the L1 signature into the ChangePubKey txInfo JSON
368
+ * 6. Persist the keypair and return the signed blob
152
369
  *
153
- * @param params - Signed authorization parameters
370
+ * Requires a USER wallet signer to be set via `setSigner` or passed at
371
+ * construction — the L1 signature is the user's consent to rotate keys.
154
372
  */
155
- async submitAuthorizations(params) {
156
- const mode = this.getSigningMode(params.address, params.dex);
157
- let { signerAddress } = params;
158
- if (mode === 'USER_AGENT') {
159
- const agent = await this.sdkClient.agentManager.getAgent(params.address, params.dex);
160
- signerAddress = signerAddress ?? agent.address;
373
+ async signRegisterApiKey(provider, address, step) {
374
+ if (!this.sdkClient.signer) {
375
+ throw new PerpsError(PerpsErrorCode.SDKError, 'REGISTER_API_KEY requires a wallet signer — pass `signer` to ' +
376
+ 'createPerpsClient or call setSigner(walletClient).');
161
377
  }
162
- return submitAuthorization(this.sdkClient, { ...params, signerAddress });
378
+ const params = step.wasmSignParams;
379
+ const apiKeyIndex = params.api_key_index ?? DEFAULT_API_KEY_INDEX;
380
+ const nonce = params.nonce;
381
+ if (typeof nonce !== 'number') {
382
+ throw new PerpsError(PerpsErrorCode.SDKError, 'REGISTER_API_KEY wasmSignParams is missing `nonce`.');
383
+ }
384
+ const account = await getAccount(this.sdkClient, { provider, address });
385
+ if (account.config.provider !== 'lighter') {
386
+ throw new PerpsError(PerpsErrorCode.SDKError, `REGISTER_API_KEY requires a Lighter account, but getAccount ` +
387
+ `returned config for provider '${account.config.provider}'.`);
388
+ }
389
+ const accountIndex = account.config.accountIndex;
390
+ const signer = this.getLighterSigner();
391
+ const keypair = await signer.generateAPIKey();
392
+ const changePubKey = await signer.signChangePubKey(keypair.publicKey, keypair.privateKey, nonce, apiKeyIndex, accountIndex);
393
+ const l1Signature = await this.sdkClient.signer.signMessage({
394
+ account: this.sdkClient.signer.account,
395
+ message: changePubKey.messageToSign,
396
+ });
397
+ const txInfoWithL1Sig = signer.embedL1Signature(changePubKey.txInfo, l1Signature);
398
+ const apiKey = {
399
+ accountIndex,
400
+ apiKeyIndex,
401
+ apiKeyPrivateKey: keypair.privateKey,
402
+ apiKeyPublicKey: keypair.publicKey,
403
+ };
404
+ await this.getLighterKeyStore().set(address, apiKey);
405
+ return {
406
+ action: step.action,
407
+ wasmSignParams: {
408
+ ...step.wasmSignParams,
409
+ new_public_key: keypair.publicKey,
410
+ },
411
+ signedTx: {
412
+ txType: changePubKey.txType,
413
+ txInfo: txInfoWithL1Sig,
414
+ txHash: changePubKey.txHash,
415
+ },
416
+ };
163
417
  }
164
418
  /**
165
- * Build order payloads for signing.
419
+ * Sign an `ACCOUNT_TYPE` step (Lighter `changeAccountTier`).
166
420
  *
167
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
168
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
421
+ * Lighter's `/api/v1/changeAccountTier` is an HTTP-only mutation
422
+ * Lighter does NOT consume a wasm-signed transaction here; it
423
+ * authenticates the request with the same auth token its read endpoints
424
+ * use, and enforces anti-replay business rules server-side. The backend
425
+ * therefore declares the step as a `WasmBlobActionStep` with
426
+ * `wasmSignParams.kind = 'changeAccountTier'` and expects the SDK to
427
+ * mint an auth token in lieu of a transaction signature. That contract
428
+ * is documented in `lifi-perps-backend/src/providers/lighter/actions/
429
+ * lighter.actions.accountType.ts` and consumed by `executeChangeAccountTier`.
169
430
  *
170
- * @param params - Order parameters
171
- * @returns Order actions with typed data for signing
431
+ * The auth-token deadline mirrors {@link createLighterAuthToken}'s 1h
432
+ * default Lighter caps tokens at 8h hard, and the backend's executor
433
+ * runs `verifyPendingAction` then a single `/changeAccountTier` POST,
434
+ * which completes well inside an hour.
172
435
  */
173
- async buildOrder(params) {
174
- const mode = this.getSigningMode(params.address, params.dex);
175
- let signerAddress;
176
- if (mode === 'USER_AGENT') {
177
- const agent = await this.sdkClient.agentManager.getAgent(params.address, params.dex);
178
- signerAddress = agent.address;
436
+ async signAccountTierChange(address, step) {
437
+ const apiKey = await this.getLighterKeyStore().get(address);
438
+ if (!apiKey) {
439
+ throw new PerpsError(PerpsErrorCode.SDKError, `No Lighter API key registered for ${address}. ` +
440
+ 'Run prepareAccount / REGISTER_API_KEY first.');
179
441
  }
180
- return createOrder(this.sdkClient, {
181
- dex: params.dex,
182
- address: params.address,
183
- signerAddress,
184
- clientOrderId: params.clientOrderId,
185
- symbol: params.symbol,
186
- side: params.side,
187
- type: params.type,
188
- size: params.size,
189
- price: params.price,
190
- leverage: params.leverage,
191
- reduceOnly: params.reduceOnly,
192
- timeInForce: params.timeInForce,
193
- expiresAt: params.expiresAt,
194
- takeProfit: params.takeProfit,
195
- stopLoss: params.stopLoss,
442
+ const signer = this.getLighterSigner();
443
+ const deadline = Math.floor(Date.now() / 1000) + 60 * 60;
444
+ const authToken = await signer.createAuthToken(deadline, {
445
+ apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
446
+ apiKeyIndex: apiKey.apiKeyIndex,
447
+ accountIndex: apiKey.accountIndex,
196
448
  });
449
+ return {
450
+ action: step.action,
451
+ wasmSignParams: step.wasmSignParams,
452
+ signedTx: {
453
+ // `/changeAccountTier` reads only `txInfo` (the auth token); `txType`
454
+ // and `txHash` are placeholders to satisfy the envelope shape.
455
+ txType: 0,
456
+ txInfo: authToken,
457
+ txHash: '',
458
+ },
459
+ };
197
460
  }
198
461
  /**
199
- * Build cancel order payloads for signing.
462
+ * Return a bearer token that authenticates Lighter's read endpoints
463
+ * (getOrders, getOrder, getActivity, getFills).
200
464
  *
201
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
202
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
465
+ * Resolution order:
466
+ * 1. The long-lived read-only token persisted by `approveReadOnlyToken`,
467
+ * when one is stored for this `(address, accountIndex)` AND has not
468
+ * passed its recorded `expiry`. The SDK never returns an expired
469
+ * stored token.
470
+ * 2. A freshly minted 8h Lighter auth token, signed off the user's
471
+ * Lighter API key. Requires `REGISTER_API_KEY` to have completed.
472
+ * 3. `undefined` — caller falls back to public reads.
203
473
  *
204
- * @param params - Cancel parameters
205
- * @returns Cancel actions with typed data for signing
474
+ * `accountIndex` lets callers in pure read-only mode (no API key
475
+ * registered) target the RO token. When omitted, the SDK derives it from
476
+ * the user's registered API key.
477
+ *
478
+ * `deadlineSeconds` only affects the standard-token fallback (Lighter caps
479
+ * those tokens at 8h). Read-only tokens carry their own mint-time expiry
480
+ * recorded by {@link approveReadOnlyToken}.
206
481
  */
207
- async buildCancelOrder(params) {
208
- const mode = this.getSigningMode(params.address, params.dex);
209
- let signerAddress;
210
- if (mode === 'USER_AGENT') {
211
- const agent = await this.sdkClient.agentManager.getAgent(params.address, params.dex);
212
- signerAddress = agent.address;
482
+ async createLighterAuthToken(address, deadlineSeconds, accountIndex) {
483
+ const apiKey = await this.getLighterKeyStore().get(address);
484
+ const resolvedAccountIndex = accountIndex ?? apiKey?.accountIndex;
485
+ if (resolvedAccountIndex !== undefined) {
486
+ const stored = await this.getLighterReadOnlyTokenManager().get(address, resolvedAccountIndex);
487
+ if (stored) {
488
+ return stored.token;
489
+ }
213
490
  }
214
- return cancelOrder(this.sdkClient, {
215
- dex: params.dex,
216
- address: params.address,
217
- signerAddress,
218
- ids: params.ids,
491
+ if (!apiKey) {
492
+ return undefined;
493
+ }
494
+ const deadline = deadlineSeconds ?? Math.floor(Date.now() / 1000) + 60 * 60;
495
+ const signer = this.getLighterSigner();
496
+ return signer.createAuthToken(deadline, {
497
+ apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
498
+ apiKeyIndex: apiKey.apiKeyIndex,
499
+ accountIndex: apiKey.accountIndex,
219
500
  });
220
501
  }
221
502
  /**
222
- * Place an order with automatic agent signing.
503
+ * Mint a long-lived Lighter read-only token via Lighter's
504
+ * `tokens/create` endpoint and persist it through the configured
505
+ * `StorageAdapter`, keyed by `(L1 address, accountIndex)`.
223
506
  *
224
- * **Requires USER_AGENT mode.** For USER mode, use `buildOrder()` + `submitSignedOrder()`.
507
+ * The user's connected wallet signs an EIP-191 message describing the
508
+ * mint request; the resulting `Authorization` header authenticates the
509
+ * Lighter HTTP call. The bearer string Lighter returns is persisted
510
+ * alongside its `expiry` and `scope`; subsequent calls to
511
+ * {@link createLighterAuthToken} prefer it over the 8h standard token.
225
512
  *
226
- * @param params - Order parameters
227
- * @returns Order submission results
228
- * @throws {PerpsError} If not in USER_AGENT mode
513
+ * `expirySeconds` is the absolute unix-seconds expiry recorded on
514
+ * Lighter's row. Lighter enforces 1 day ≤ lifetime ≤ 10 years
515
+ * server-side; the SDK does NOT pre-validate and surfaces Lighter's 400
516
+ * verbatim. `scope` defaults to `'all'`; the `'single'` variant is wired
517
+ * through but only useful when the caller has a specific reason to scope
518
+ * the token to one account.
519
+ *
520
+ * Requires a USER wallet signer to be set via {@link setSigner} or
521
+ * passed at construction — the L1 signature is the user's consent.
229
522
  */
230
- async placeOrder(params) {
231
- const mode = this.getSigningMode(params.address, params.dex);
232
- if (mode !== 'USER_AGENT') {
233
- throw new PerpsError(PerpsErrorCode.ValidationError, `${PerpsErrorMessage.InvalidSigningMode} placeOrder() requires USER_AGENT mode. Use createOrder() + submitOrder() for USER mode.`);
234
- }
235
- const agent = await this.sdkClient.agentManager.getAgent(params.address, params.dex);
236
- // 1. Create order payloads
237
- const { actions } = await createOrder(this.sdkClient, {
238
- dex: params.dex,
239
- address: params.address,
240
- signerAddress: agent.address,
241
- clientOrderId: params.clientOrderId,
242
- symbol: params.symbol,
243
- side: params.side,
244
- type: params.type,
245
- size: params.size,
246
- price: params.price,
247
- leverage: params.leverage,
248
- reduceOnly: params.reduceOnly,
249
- timeInForce: params.timeInForce,
250
- expiresAt: params.expiresAt,
251
- takeProfit: params.takeProfit,
252
- stopLoss: params.stopLoss,
253
- });
254
- // 2. Sign each action with agent key
255
- const signedActions = await Promise.all(actions.map(async (a) => ({
256
- action: a.action,
257
- typedData: a.typedData,
258
- signature: await signTypedData(agent.privateKey, a.typedData),
259
- })));
260
- // 3. Submit
261
- return submitOrder(this.sdkClient, {
262
- dex: params.dex,
263
- address: params.address,
264
- signerAddress: agent.address,
265
- actions: signedActions,
523
+ async approveReadOnlyToken(address, params) {
524
+ if (!this.sdkClient.signer) {
525
+ throw new PerpsError(PerpsErrorCode.SDKError, 'approveReadOnlyToken requires a wallet signer — pass `signer` to ' +
526
+ 'createPerpsClient or call setSigner(walletClient).');
527
+ }
528
+ const signer = walletClientSigner(this.sdkClient.signer);
529
+ return this.getLighterReadOnlyTokenManager().approve(signer, {
530
+ address,
531
+ ...params,
266
532
  });
267
533
  }
268
534
  /**
269
- * Cancel orders with automatic agent signing.
270
- *
271
- * **Requires USER_AGENT mode.** For USER mode, use `buildCancelOrder()` + `submitSignedOrder()`.
272
- *
273
- * @param params - Cancel parameters
274
- * @returns Cancel submission results
275
- * @throws {PerpsError} If not in USER_AGENT mode
535
+ * Whether the stored Lighter read-only token for `(address, accountIndex)`
536
+ * falls within `thresholdDays` of its `expiry`. Returns `false` when no
537
+ * token is stored, when the stored token has already expired, or when
538
+ * more than `thresholdDays` of life remain. Intended for widget renewal
539
+ * banners (default threshold: 30 days).
276
540
  */
277
- async cancelOrders(params) {
278
- const mode = this.getSigningMode(params.address, params.dex);
279
- if (mode !== 'USER_AGENT') {
280
- throw new PerpsError(PerpsErrorCode.ValidationError, `${PerpsErrorMessage.InvalidSigningMode} cancelOrders() requires USER_AGENT mode. Use cancelOrder() + submitOrder() for USER mode.`);
281
- }
282
- const agent = await this.sdkClient.agentManager.getAgent(params.address, params.dex);
283
- // 1. Create cancel payloads
284
- const { actions } = await cancelOrder(this.sdkClient, {
285
- dex: params.dex,
286
- address: params.address,
287
- signerAddress: agent.address,
288
- ids: params.ids,
289
- });
290
- // 2. Sign each action with agent key
291
- const signedActions = await Promise.all(actions.map(async (a) => ({
292
- action: a.action,
293
- typedData: a.typedData,
294
- signature: await signTypedData(agent.privateKey, a.typedData),
295
- })));
296
- // 3. Submit
297
- return submitOrder(this.sdkClient, {
298
- dex: params.dex,
541
+ async isLighterReadOnlyTokenExpiringSoon(address, accountIndex, thresholdDays) {
542
+ return this.getLighterReadOnlyTokenManager().isReadOnlyTokenExpiringSoon(address, accountIndex, thresholdDays);
543
+ }
544
+ // ---------------------------------------------------------------------------
545
+ // Generic action helpers
546
+ // ---------------------------------------------------------------------------
547
+ async buildAction(action, params) {
548
+ const signerAddress = await this.resolveSignerForAction(action, params.address, params.provider);
549
+ return createAction(this.sdkClient, {
550
+ provider: params.provider,
299
551
  address: params.address,
300
- signerAddress: agent.address,
301
- actions: signedActions,
552
+ signerAddress,
553
+ action,
554
+ params: params.params,
302
555
  });
303
556
  }
304
- /**
305
- * Submit pre-signed order actions.
306
- *
307
- * Use this for USER mode when you've already signed the actions with the user's wallet.
308
- * Auto-injects `signerAddress` if not provided (defaults to `address`).
309
- *
310
- * @param params - Signed order parameters
311
- */
312
- async submitSignedOrder(params) {
313
- return submitOrder(this.sdkClient, params);
557
+ // ---------------------------------------------------------------------------
558
+ // Signing mode management
559
+ // ---------------------------------------------------------------------------
560
+ async setSigningMode(address, provider, mode) {
561
+ const key = this.modeKey(address, provider);
562
+ this.signingModes.set(key, mode);
563
+ await this.storage.set(this.signingModeStorageKey(address, provider), mode);
564
+ if (mode === SigningMode.USER_AGENT &&
565
+ (await this.providerUsesAgent(provider))) {
566
+ await this.sdkClient.agentManager.getOrCreateAgent(address, provider);
567
+ }
568
+ }
569
+ getSigningMode(address, provider) {
570
+ return (this.signingModes.get(this.modeKey(address, provider)) ??
571
+ SigningMode.USER_AGENT);
314
572
  }
573
+ async loadSigningMode(address, provider) {
574
+ const key = this.modeKey(address, provider);
575
+ if (this.signingModes.has(key)) {
576
+ return this.signingModes.get(key);
577
+ }
578
+ const stored = await this.storage.get(this.signingModeStorageKey(address, provider));
579
+ const mode = stored === SigningMode.USER_AGENT || stored === SigningMode.USER
580
+ ? stored
581
+ : SigningMode.USER_AGENT;
582
+ this.signingModes.set(key, mode);
583
+ return mode;
584
+ }
585
+ async loadAgentMode(address, provider) {
586
+ const mode = await this.loadSigningMode(address, provider);
587
+ return mode === SigningMode.USER_AGENT;
588
+ }
589
+ async setAgentMode(address, provider, useAgent) {
590
+ await this.setSigningMode(address, provider, useAgent ? SigningMode.USER_AGENT : SigningMode.USER);
591
+ }
592
+ async getAgentAddress(address, provider) {
593
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider);
594
+ return agent.address;
595
+ }
596
+ async hasAgent(address, provider) {
597
+ return this.sdkClient.agentManager.hasAgent(address, provider);
598
+ }
599
+ async removeAgent(address, provider) {
600
+ await this.sdkClient.agentManager.removeAgent(address, provider);
601
+ this.signingModes.delete(this.modeKey(address, provider));
602
+ await this.storage.remove(this.signingModeStorageKey(address, provider));
603
+ }
604
+ // ---------------------------------------------------------------------------
605
+ // Account
606
+ // ---------------------------------------------------------------------------
315
607
  /**
316
- * Build a withdrawal payload for the user to sign.
317
- *
318
- * Withdrawals are user-signed only agents cannot initiate withdrawals.
319
- * No agent injection is performed regardless of signing mode.
320
- *
321
- * @param params - Withdrawal parameters
322
- * @returns Withdrawal action with typed data for signing
608
+ * Fetch the user's account state from the backend and attach the
609
+ * SDK-projected `settings` array — one `AccountConfigSetting` per
610
+ * descriptor on `Provider.setup` + `Provider.options`. Callers read
611
+ * `result.settings` directly without re-deriving values from the typed
612
+ * `AccountConfig`.
323
613
  */
324
- async buildWithdrawal(params) {
325
- return createWithdrawal(this.sdkClient, {
326
- dex: params.dex,
327
- address: params.address,
328
- withdrawal: params.withdrawal,
329
- });
614
+ async getAccount(params) {
615
+ const [response, metadata] = await Promise.all([
616
+ getAccount(this.sdkClient, params),
617
+ this.getProviderMetadata(params.provider),
618
+ ]);
619
+ const settings = projectAccountConfigSettings(response.config, metadata.setup, metadata.options);
620
+ return { ...response, settings };
330
621
  }
331
622
  /**
332
- * Submit a signed withdrawal.
333
- *
334
- * Withdrawals are user-signed only agents cannot initiate withdrawals.
335
- *
336
- * @param params - Signed withdrawal parameters
337
- * @returns Withdrawal result
623
+ * Thin existence check for a provider account at `address`. Returns
624
+ * `true` when `getAccount` resolves, `false` when the backend reports
625
+ * `PerpsErrorCode.AccountNotFound`, and re-throws on any other error
626
+ * (transport failures, validation errors, server errors).
338
627
  */
339
- async submitWithdrawal(params) {
340
- return submitWithdrawal(this.sdkClient, params);
628
+ async accountExists(provider, address) {
629
+ try {
630
+ await getAccount(this.sdkClient, { provider, address });
631
+ return true;
632
+ }
633
+ catch (err) {
634
+ if (err instanceof PerpsError &&
635
+ err.code === PerpsErrorCode.AccountNotFound) {
636
+ return false;
637
+ }
638
+ throw err;
639
+ }
341
640
  }
641
+ // ---------------------------------------------------------------------------
642
+ // Setup
643
+ // ---------------------------------------------------------------------------
342
644
  /**
343
- * Determine which authorizations (if any) the user needs to sign before trading.
344
- *
345
- * Uses the dex auth provider to determine what authorizations to request,
346
- * then calls buildAuthorization — the backend filters already-valid auths
347
- * and returns only what's needed.
645
+ * Return the unsatisfied entries on `Provider.setup` for this account,
646
+ * split by signer role. Trading is gated on `isReady === true`.
348
647
  *
349
- * @param params - Parameters including dex, address, and dex-specific config
350
- * @returns Which authorizations are needed and whether the user is ready to trade
648
+ * `Provider.options` descriptors are NEVER returned here options are
649
+ * post-setup tunables and never gate trading. Option state is surfaced
650
+ * separately via `getAccount().settings`.
351
651
  */
352
- async getRequiredAuthorizations(params) {
353
- const { dex, address } = params;
354
- const mode = this.getSigningMode(address, dex);
355
- const provider = getDexAuthProvider(dex);
356
- // Ensure agent exists in USER_AGENT mode
652
+ async checkSetup(params) {
653
+ const { provider, address } = params;
654
+ const mode = await this.loadSigningMode(address, provider);
655
+ const metadata = await this.getProviderMetadata(provider);
656
+ const usesAgent = [
657
+ ...metadata.setup,
658
+ ...metadata.options,
659
+ ...metadata.actions,
660
+ ].some((d) => d.signers.includes(PerpsSigner.AGENT));
357
661
  let agentAddress;
358
- if (mode === 'USER_AGENT') {
359
- const agent = await this.sdkClient.agentManager.getOrCreateAgent(address, dex);
662
+ if (mode === SigningMode.USER_AGENT && usesAgent) {
663
+ const agent = await this.sdkClient.agentManager.getOrCreateAgent(address, provider);
360
664
  agentAddress = agent.address;
361
665
  }
362
- // Provider declares auth inputs categorized as user/agent
363
- const authInputs = provider.getAuthorizationInputs({
364
- signingMode: mode,
365
- agentAddress,
366
- });
367
- const allInputs = [...authInputs.user, ...authInputs.agent];
666
+ const allInputs = this.buildPrerequisiteInputs(metadata.setup, mode, agentAddress);
368
667
  if (allInputs.length === 0) {
369
- return { userAuthorizations: [], agentAuthorizations: [], isReady: true };
668
+ return { userPrerequisites: [], agentPrerequisites: [], isReady: true };
370
669
  }
371
- // Send ALL to backend it filters already-satisfied ones and returns typed data
372
- const { actions } = await this.buildAuthorization({
373
- dex,
670
+ // Build a signer lookup from setup descriptors.
671
+ const signersByAction = new Map();
672
+ for (const desc of metadata.setup) {
673
+ signersByAction.set(desc.type, desc.signers);
674
+ }
675
+ // Send all to backend via createAction for the first prerequisite type
676
+ // The backend filters already-satisfied ones and returns typed data
677
+ const { actions } = await this.buildPrerequisites({
678
+ provider,
374
679
  address,
375
- authorizations: allInputs,
680
+ signerAddress: agentAddress,
376
681
  });
377
682
  if (actions.length === 0) {
378
- return { userAuthorizations: [], agentAuthorizations: [], isReady: true };
683
+ return { userPrerequisites: [], agentPrerequisites: [], isReady: true };
379
684
  }
380
- // Categorize backend results using provider's original key sets
381
- const agentKeys = new Set(authInputs.agent.map((a) => a.key));
382
- const userAuthorizations = actions.filter((a) => !agentKeys.has(a.action));
383
- const agentAuthorizations = actions.filter((a) => agentKeys.has(a.action));
685
+ const userPrerequisites = actions.filter((a) => {
686
+ const signers = signersByAction.get(a.action) ?? [];
687
+ return signers.includes(PerpsSigner.USER);
688
+ });
689
+ const agentPrerequisites = actions.filter((a) => {
690
+ const signers = signersByAction.get(a.action) ?? [];
691
+ return signers.includes(PerpsSigner.AGENT);
692
+ });
384
693
  return {
385
- userAuthorizations,
386
- agentAuthorizations,
694
+ userPrerequisites,
695
+ agentPrerequisites,
387
696
  isReady: false,
388
697
  };
389
698
  }
699
+ async buildPrerequisites(params) {
700
+ const mode = await this.loadSigningMode(params.address, params.provider);
701
+ let { signerAddress } = params;
702
+ if (mode === SigningMode.USER_AGENT && !signerAddress) {
703
+ const agent = await this.sdkClient.agentManager.getAgent(params.address, params.provider);
704
+ signerAddress = agent.address;
705
+ }
706
+ const metadata = await this.getProviderMetadata(params.provider);
707
+ const allInputs = this.buildPrerequisiteInputs(metadata.setup, mode, signerAddress);
708
+ // Use the first prerequisite type as the action type for the batch
709
+ // The backend handles all prerequisites in a single createPrerequisite call
710
+ const allActions = [];
711
+ for (const input of allInputs) {
712
+ const { actions } = await createAction(this.sdkClient, {
713
+ provider: params.provider,
714
+ address: params.address,
715
+ signerAddress,
716
+ action: input.key,
717
+ params: (input.params ?? {}),
718
+ });
719
+ allActions.push(...actions);
720
+ }
721
+ return { actions: allActions };
722
+ }
723
+ /**
724
+ * Default mode the SDK auto-applies after `APPROVE_AGENT` on a provider
725
+ * whose `options` array exposes a writable `ACCOUNT_MODE` (today
726
+ * Hyperliquid). Callers can override this through a subsequent
727
+ * `ACCOUNT_MODE` dispatch.
728
+ */
729
+ static DEFAULT_ACCOUNT_MODE = 'unifiedAccount';
390
730
  /**
391
- * Execute authorizations: submit user-signed actions, then auto-sign and submit
392
- * any agent authorizations.
731
+ * Prepare an `ACCOUNT_MODE` change by proactively reading the account's
732
+ * current `config.abstractionMode` and routing to the correct signer:
733
+ *
734
+ * - `abstractionMode == null` (never set, e.g. a fresh HL account):
735
+ * the change MAY be performed by the agent signer. Build, sign with
736
+ * the agent key, and dispatch. Returns `{ results }`.
737
+ * - `abstractionMode === mode`: idempotent no-op. Returns an empty
738
+ * results envelope without contacting `/createAction` or `/executeAction`.
739
+ * - `abstractionMode` set to any other value: HL requires a user-wallet
740
+ * signature to change the abstraction once it has been set. Build the
741
+ * action unsigned and return it as `{ fallback }` so the caller can
742
+ * surface a wallet prompt via `fallbackUserPrerequisites`.
393
743
  *
394
- * @param params - User-signed actions and the required authorizations result
395
- * @returns Combined results from user and agent submissions
744
+ * Network errors from `/account` propagate we never guess the signer.
745
+ * `account.config.provider !== 'hyperliquid'` also throws: this helper
746
+ * is HL-specific and the dispatcher should never reach it for another
747
+ * provider (gated by `hasWritableAccountMode`).
396
748
  */
397
- async executeAuthorizations(params) {
398
- const { dex, address, required, userSignedActions } = params;
399
- const mode = this.getSigningMode(address, dex);
400
- // 1. Submit user-signed actions (if any)
749
+ async prepareAccountModeChange(provider, address, mode) {
750
+ const account = await getAccount(this.sdkClient, { provider, address });
751
+ if (account.config.provider !== 'hyperliquid') {
752
+ throw new PerpsError(PerpsErrorCode.SDKError, `prepareAccountModeChange is Hyperliquid-specific, but ` +
753
+ `getAccount returned config for provider ` +
754
+ `'${account.config.provider}'.`);
755
+ }
756
+ const currentStatus = account.config.abstractionMode;
757
+ // Idempotent short-circuit: already in the requested mode.
758
+ if (currentStatus === mode) {
759
+ return {};
760
+ }
761
+ // Never set → the agent is authorised to perform the change.
762
+ if (currentStatus == null) {
763
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider);
764
+ const { actions } = await createAction(this.sdkClient, {
765
+ provider,
766
+ address,
767
+ signerAddress: agent.address,
768
+ action: ActionType.ACCOUNT_MODE,
769
+ params: { mode },
770
+ });
771
+ if (actions.length === 0) {
772
+ // Backend's per-mode early-exit (defensive — shouldn't fire given
773
+ // the short-circuit above, but covers a race between our /account
774
+ // read and the backend's view of the current status).
775
+ return { results: { results: [] } };
776
+ }
777
+ const signedActions = await Promise.all(actions.map(async (a) => ({
778
+ action: a.action,
779
+ typedData: a.typedData,
780
+ signature: await signTypedData(agent.privateKey, a.typedData),
781
+ })));
782
+ const results = await executeAction(this.sdkClient, {
783
+ provider,
784
+ address,
785
+ signerAddress: agent.address,
786
+ action: ActionType.ACCOUNT_MODE,
787
+ actions: signedActions,
788
+ });
789
+ return { results };
790
+ }
791
+ // Already set to a different mode → HL requires a user-wallet signature.
792
+ // Build the action unsigned and surface it as a fallback to the caller.
793
+ const { actions: fallbackActions } = await createAction(this.sdkClient, {
794
+ provider,
795
+ address,
796
+ action: ActionType.ACCOUNT_MODE,
797
+ params: { mode },
798
+ });
799
+ return {
800
+ fallback: fallbackActions.length > 0 ? fallbackActions : undefined,
801
+ };
802
+ }
803
+ /**
804
+ * True when the provider exposes an `ACCOUNT_MODE` descriptor (in `setup`
805
+ * or `options`) whose `mode` Param has a writable enumeration of values.
806
+ * Providers that omit `ACCOUNT_MODE` or expose it as read-only / free-form
807
+ * input return false.
808
+ */
809
+ static hasWritableAccountMode(metadata) {
810
+ const item = [...metadata.setup, ...metadata.options].find((i) => i.type === ActionType.ACCOUNT_MODE);
811
+ if (!item) {
812
+ return false;
813
+ }
814
+ const modeParam = item.params.find((p) => p.name === 'mode');
815
+ if (!modeParam) {
816
+ return false;
817
+ }
818
+ // Writable multi-option: `values` enumerates choices and `readOnly`
819
+ // is not set (treat absence as writable, matching the descriptor
820
+ // contract in `Param`).
821
+ if (!modeParam.values || modeParam.values.length === 0) {
822
+ return false;
823
+ }
824
+ return !modeParam.readOnly;
825
+ }
826
+ /**
827
+ * Submit the signed setup steps returned by `checkSetup` (and seeded
828
+ * with user-wallet signatures by the caller). Internally splits into:
829
+ *
830
+ * 1. Submit user-signed setup actions.
831
+ * 2. After a successful `APPROVE_AGENT`, auto-upgrade `ACCOUNT_MODE`
832
+ * to the SDK's default when the provider exposes a writable
833
+ * `ACCOUNT_MODE` Param (Hyperliquid today). The SDK reads
834
+ * `account.config.abstractionMode` to choose the signer: `null` →
835
+ * agent dispatch; non-null → wallet fallback returned in
836
+ * `fallbackUserPrerequisites`.
837
+ * 3. Sign and submit any pre-staged agent-side setup actions the
838
+ * backend returned alongside the user-signed ones.
839
+ */
840
+ async satisfySetup(params) {
841
+ const { provider, address, required, userSignedActions } = params;
842
+ const mode = await this.loadSigningMode(address, provider);
843
+ // 1. Submit user-signed prerequisites
401
844
  let userResults = { results: [] };
402
845
  if (userSignedActions.length > 0) {
403
- const signerAddress = mode === 'USER_AGENT'
404
- ? (await this.sdkClient.agentManager.getAgent(address, dex)).address
846
+ const signerAddress = mode === SigningMode.USER_AGENT
847
+ ? (await this.sdkClient.agentManager.getAgent(address, provider))
848
+ .address
405
849
  : address;
406
- userResults = await submitAuthorization(this.sdkClient, {
407
- dex,
850
+ // Submit all user-signed actions — use first action's type for routing
851
+ const firstAction = required.userPrerequisites[0]?.action;
852
+ userResults = await executeAction(this.sdkClient, {
853
+ provider,
408
854
  address,
409
855
  signerAddress,
856
+ action: (firstAction ?? ActionType.APPROVE_AGENT),
410
857
  actions: userSignedActions,
411
858
  });
412
- // Check for failures - return early if any user auth failed
413
- const failed = userResults.results.find((r) => !r.success);
414
- if (failed) {
859
+ const mandatoryFailure = userResults.results.find((r) => !r.success);
860
+ if (mandatoryFailure) {
415
861
  return { userResults };
416
862
  }
417
863
  }
418
- // 2. Auto-sign and submit agent authorizations (if any)
419
- // Typed data already built by getRequiredAuthorizations — just sign and submit
420
- if (required.agentAuthorizations.length > 0 && mode === 'USER_AGENT') {
421
- const agent = await this.sdkClient.agentManager.getAgent(address, dex);
422
- const signedAgentActions = await Promise.all(required.agentAuthorizations.map(async (action) => ({
864
+ // 2. Auto-upgrade ACCOUNT_MODE after APPROVE_AGENT.
865
+ //
866
+ // When the user-signed setup included a successful APPROVE_AGENT, the
867
+ // freshly approved agent is now authorised to sign account-level
868
+ // actions for accounts whose abstraction has never been set. If the
869
+ // provider exposes a writable `ACCOUNT_MODE` descriptor (Hyperliquid
870
+ // today), the SDK reads `account.config.abstractionMode` to decide
871
+ // the signer: `null` → agent-dispatch silently to the SDK's preferred
872
+ // default; non-null → return a wallet-signing fallback step. Either
873
+ // way the chain does NOT abort onboarding — `ACCOUNT_MODE` lives on
874
+ // `Provider.options`, not `Provider.setup`, and so does not gate
875
+ // trading.
876
+ let agentResults;
877
+ let fallbackUserPrerequisites;
878
+ if (mode === SigningMode.USER_AGENT) {
879
+ const justApprovedAgent = userResults.results.some((r) => r.success && r.action === ActionType.APPROVE_AGENT);
880
+ if (justApprovedAgent) {
881
+ const metadata = await this.getProviderMetadata(provider);
882
+ if (PerpsClient.hasWritableAccountMode(metadata)) {
883
+ const upgrade = await this.prepareAccountModeChange(provider, address, PerpsClient.DEFAULT_ACCOUNT_MODE);
884
+ agentResults = upgrade.results;
885
+ fallbackUserPrerequisites = upgrade.fallback;
886
+ }
887
+ }
888
+ }
889
+ // 3. Sign and submit any pre-staged agent prerequisites returned by the
890
+ // backend's `buildPrerequisites` call. ACCOUNT_MODE is filtered out of
891
+ // bulk staging (it requires explicit `mode` params), so this block
892
+ // today only runs for future agent-signed steps the backend chooses
893
+ // to stage.
894
+ if (required.agentPrerequisites.length > 0 &&
895
+ mode === SigningMode.USER_AGENT) {
896
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider);
897
+ const signedAgentActions = await Promise.all(required.agentPrerequisites.map(async (action) => ({
423
898
  action: action.action,
424
899
  typedData: action.typedData,
425
900
  signature: await signTypedData(agent.privateKey, action.typedData),
426
901
  })));
427
- const agentResults = await submitAuthorization(this.sdkClient, {
428
- dex,
902
+ const firstAction = required.agentPrerequisites[0]?.action;
903
+ const stagedResults = await executeAction(this.sdkClient, {
904
+ provider,
429
905
  address,
430
906
  signerAddress: agent.address,
907
+ action: (firstAction ?? ActionType.ACCOUNT_MODE),
431
908
  actions: signedAgentActions,
432
909
  });
433
- return { userResults, agentResults };
910
+ // Merge staged-prereq results with any auto-upgrade results from step 2.
911
+ agentResults = {
912
+ results: [...(agentResults?.results ?? []), ...stagedResults.results],
913
+ };
914
+ }
915
+ return {
916
+ userResults,
917
+ ...(agentResults ? { agentResults } : {}),
918
+ ...(fallbackUserPrerequisites ? { fallbackUserPrerequisites } : {}),
919
+ };
920
+ }
921
+ // ---------------------------------------------------------------------------
922
+ // Typed action helpers
923
+ // ---------------------------------------------------------------------------
924
+ async placeOrder(params) {
925
+ return this.execute({ ...params, action: ActionType.PLACE_ORDER, params });
926
+ }
927
+ async placeTriggerOrder(params) {
928
+ return this.execute({
929
+ ...params,
930
+ action: ActionType.PLACE_TRIGGER_ORDER,
931
+ params,
932
+ });
933
+ }
934
+ async cancelOrders(params) {
935
+ return this.execute({ ...params, action: ActionType.CANCEL_ORDER, params });
936
+ }
937
+ async modifyOrders(params) {
938
+ return this.execute({ ...params, action: ActionType.MODIFY_ORDER, params });
939
+ }
940
+ async updatePositionMargin(params) {
941
+ return this.execute({
942
+ ...params,
943
+ action: ActionType.UPDATE_POSITION_MARGIN,
944
+ params,
945
+ });
946
+ }
947
+ async withdraw(params) {
948
+ return this.execute({
949
+ provider: params.provider,
950
+ address: params.address,
951
+ action: ActionType.WITHDRAWAL,
952
+ params: params.withdrawal,
953
+ });
954
+ }
955
+ /**
956
+ * Execute any action through the SDK's signing pipeline. Signing is routed
957
+ * by the action's descriptor in provider metadata — the agent keypair, the
958
+ * configured WalletClient signer, the Lighter API key, or an EVM tx — as
959
+ * the descriptor's `signers` and `signingMethod` dictate.
960
+ */
961
+ async execute(params) {
962
+ await this.loadSigningMode(params.address, params.provider);
963
+ const metadata = await this.getProviderMetadata(params.provider);
964
+ const descriptor = findActionDescriptor(metadata, params.action);
965
+ let lastError;
966
+ for (let attempt = 0; attempt < MAX_NONCE_RETRIES; attempt++) {
967
+ const { actions } = await this.buildAction(params.action, {
968
+ provider: params.provider,
969
+ address: params.address,
970
+ params: params.params,
971
+ });
972
+ try {
973
+ return await this.autoSignAndExecute(params.provider, params.address, params.action, actions, descriptor);
974
+ }
975
+ catch (err) {
976
+ if (err instanceof PerpsError &&
977
+ err.code === PerpsErrorCode.InvalidNonce) {
978
+ lastError = err;
979
+ continue;
980
+ }
981
+ throw err;
982
+ }
434
983
  }
435
- return { userResults };
984
+ throw lastError;
436
985
  }
437
986
  }
438
987
  //# sourceMappingURL=PerpsClient.js.map