@lifi/perps-sdk 0.2.0-alpha.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (908) hide show
  1. package/README.md +138 -24
  2. package/dist/cjs/client/PerpsClient.d.ts +27 -48
  3. package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
  4. package/dist/cjs/client/PerpsClient.js +119 -578
  5. package/dist/cjs/client/PerpsClient.js.map +1 -1
  6. package/dist/cjs/client/bindProvider.d.ts +3 -0
  7. package/dist/cjs/client/bindProvider.d.ts.map +1 -0
  8. package/dist/cjs/client/bindProvider.js +9 -0
  9. package/dist/cjs/client/bindProvider.js.map +1 -0
  10. package/dist/cjs/client/createPerpsClient.d.ts +7 -38
  11. package/dist/cjs/client/createPerpsClient.d.ts.map +1 -1
  12. package/dist/cjs/client/createPerpsClient.js +25 -8
  13. package/dist/cjs/client/createPerpsClient.js.map +1 -1
  14. package/dist/cjs/client/requireProvider.d.ts +3 -0
  15. package/dist/cjs/client/requireProvider.d.ts.map +1 -0
  16. package/dist/cjs/client/requireProvider.js +16 -0
  17. package/dist/cjs/client/requireProvider.js.map +1 -0
  18. package/dist/cjs/errors/PerpsError.d.ts.map +1 -1
  19. package/dist/cjs/errors/PerpsError.js.map +1 -1
  20. package/dist/cjs/errors/constants.d.ts +2 -2
  21. package/dist/cjs/errors/constants.d.ts.map +1 -1
  22. package/dist/cjs/errors/constants.js +2 -2
  23. package/dist/cjs/errors/constants.js.map +1 -1
  24. package/dist/cjs/index.d.ts +41 -23
  25. package/dist/cjs/index.d.ts.map +1 -1
  26. package/dist/cjs/index.js +73 -41
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/registry/assetRegistry.d.ts +11 -0
  29. package/dist/cjs/registry/assetRegistry.d.ts.map +1 -0
  30. package/dist/cjs/registry/assetRegistry.js +39 -0
  31. package/dist/cjs/registry/assetRegistry.js.map +1 -0
  32. package/dist/cjs/registry/marketRegistry.d.ts +13 -0
  33. package/dist/cjs/registry/marketRegistry.d.ts.map +1 -0
  34. package/dist/cjs/registry/marketRegistry.js +58 -0
  35. package/dist/cjs/registry/marketRegistry.js.map +1 -0
  36. package/dist/cjs/registry/referenceDataRegistry.d.ts +20 -0
  37. package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -0
  38. package/dist/cjs/registry/referenceDataRegistry.js +59 -0
  39. package/dist/cjs/registry/referenceDataRegistry.js.map +1 -0
  40. package/dist/cjs/services/createAction.d.ts +4 -2
  41. package/dist/cjs/services/createAction.d.ts.map +1 -1
  42. package/dist/cjs/services/createAction.js +1 -1
  43. package/dist/cjs/services/createAction.js.map +1 -1
  44. package/dist/cjs/services/executeAction.d.ts +4 -2
  45. package/dist/cjs/services/executeAction.d.ts.map +1 -1
  46. package/dist/cjs/services/executeAction.js +2 -1
  47. package/dist/cjs/services/executeAction.js.map +1 -1
  48. package/dist/cjs/services/getAccount.d.ts +4 -2
  49. package/dist/cjs/services/getAccount.d.ts.map +1 -1
  50. package/dist/cjs/services/getAccount.js +2 -6
  51. package/dist/cjs/services/getAccount.js.map +1 -1
  52. package/dist/cjs/services/getActivity.d.ts +4 -2
  53. package/dist/cjs/services/getActivity.d.ts.map +1 -1
  54. package/dist/cjs/services/getActivity.js +4 -10
  55. package/dist/cjs/services/getActivity.js.map +1 -1
  56. package/dist/cjs/services/getAssets.d.ts +2 -1
  57. package/dist/cjs/services/getAssets.d.ts.map +1 -1
  58. package/dist/cjs/services/getAssets.js +1 -1
  59. package/dist/cjs/services/getAssets.js.map +1 -1
  60. package/dist/cjs/services/getFills.d.ts +4 -2
  61. package/dist/cjs/services/getFills.d.ts.map +1 -1
  62. package/dist/cjs/services/getFills.js +3 -5
  63. package/dist/cjs/services/getFills.js.map +1 -1
  64. package/dist/cjs/services/getMarket.d.ts +9 -0
  65. package/dist/cjs/services/getMarket.d.ts.map +1 -0
  66. package/dist/cjs/services/getMarket.js +13 -0
  67. package/dist/cjs/services/getMarket.js.map +1 -0
  68. package/dist/cjs/services/getMarkets.d.ts +9 -0
  69. package/dist/cjs/services/getMarkets.d.ts.map +1 -0
  70. package/dist/cjs/services/{getAsset.js → getMarkets.js} +6 -5
  71. package/dist/cjs/services/getMarkets.js.map +1 -0
  72. package/dist/cjs/services/getMeta.d.ts +5 -0
  73. package/dist/cjs/services/getMeta.d.ts.map +1 -0
  74. package/dist/cjs/services/getMeta.js +8 -0
  75. package/dist/cjs/services/getMeta.js.map +1 -0
  76. package/dist/cjs/services/getOhlcv.d.ts +3 -2
  77. package/dist/cjs/services/getOhlcv.d.ts.map +1 -1
  78. package/dist/cjs/services/getOhlcv.js +3 -2
  79. package/dist/cjs/services/getOhlcv.js.map +1 -1
  80. package/dist/cjs/services/getOrder.d.ts +4 -2
  81. package/dist/cjs/services/getOrder.d.ts.map +1 -1
  82. package/dist/cjs/services/getOrder.js +2 -6
  83. package/dist/cjs/services/getOrder.js.map +1 -1
  84. package/dist/cjs/services/getOrderbook.d.ts +3 -2
  85. package/dist/cjs/services/getOrderbook.d.ts.map +1 -1
  86. package/dist/cjs/services/getOrderbook.js +3 -2
  87. package/dist/cjs/services/getOrderbook.js.map +1 -1
  88. package/dist/cjs/services/getOrders.d.ts +5 -3
  89. package/dist/cjs/services/getOrders.d.ts.map +1 -1
  90. package/dist/cjs/services/getOrders.js +6 -8
  91. package/dist/cjs/services/getOrders.js.map +1 -1
  92. package/dist/cjs/services/getPositions.d.ts +5 -3
  93. package/dist/cjs/services/getPositions.d.ts.map +1 -1
  94. package/dist/cjs/services/getPositions.js +6 -8
  95. package/dist/cjs/services/getPositions.js.map +1 -1
  96. package/dist/cjs/services/getPrices.d.ts +3 -2
  97. package/dist/cjs/services/getPrices.d.ts.map +1 -1
  98. package/dist/cjs/services/getPrices.js +2 -2
  99. package/dist/cjs/services/getPrices.js.map +1 -1
  100. package/dist/cjs/services/getProviders.d.ts +2 -1
  101. package/dist/cjs/services/getProviders.d.ts.map +1 -1
  102. package/dist/cjs/services/getProviders.js +1 -1
  103. package/dist/cjs/services/getProviders.js.map +1 -1
  104. package/dist/cjs/services/getQuote.d.ts +12 -0
  105. package/dist/cjs/services/getQuote.d.ts.map +1 -0
  106. package/dist/cjs/services/getQuote.js +13 -0
  107. package/dist/cjs/services/getQuote.js.map +1 -0
  108. package/dist/cjs/services/getTermsAcceptance.d.ts +6 -0
  109. package/dist/cjs/services/getTermsAcceptance.d.ts.map +1 -0
  110. package/dist/cjs/services/getTermsAcceptance.js +9 -0
  111. package/dist/cjs/services/getTermsAcceptance.js.map +1 -0
  112. package/dist/cjs/services/resolveQuote.d.ts +7 -0
  113. package/dist/cjs/services/resolveQuote.d.ts.map +1 -0
  114. package/dist/cjs/services/resolveQuote.js +50 -0
  115. package/dist/cjs/services/resolveQuote.js.map +1 -0
  116. package/dist/cjs/services/resolveSubscribeQuote.d.ts +6 -0
  117. package/dist/cjs/services/resolveSubscribeQuote.d.ts.map +1 -0
  118. package/dist/cjs/services/resolveSubscribeQuote.js +65 -0
  119. package/dist/cjs/services/resolveSubscribeQuote.js.map +1 -0
  120. package/dist/cjs/storage/parseStoredRecord.d.ts +4 -0
  121. package/dist/cjs/storage/parseStoredRecord.d.ts.map +1 -0
  122. package/dist/cjs/storage/parseStoredRecord.js +26 -0
  123. package/dist/cjs/storage/parseStoredRecord.js.map +1 -0
  124. package/dist/cjs/storage/storage.d.ts.map +1 -0
  125. package/dist/cjs/storage/storage.js.map +1 -0
  126. package/dist/cjs/{agent → storage}/types.d.ts +0 -5
  127. package/dist/cjs/storage/types.d.ts.map +1 -0
  128. package/dist/cjs/{agent → storage}/types.js.map +1 -1
  129. package/dist/cjs/transport/fetchWithRetry.d.ts +8 -0
  130. package/dist/cjs/transport/fetchWithRetry.d.ts.map +1 -0
  131. package/dist/cjs/transport/fetchWithRetry.js +81 -0
  132. package/dist/cjs/transport/fetchWithRetry.js.map +1 -0
  133. package/dist/cjs/{utils → transport}/request.d.ts +3 -2
  134. package/dist/cjs/transport/request.d.ts.map +1 -0
  135. package/dist/cjs/{utils → transport}/request.js +14 -14
  136. package/dist/cjs/transport/request.js.map +1 -0
  137. package/dist/cjs/transport/retryPolicy.d.ts +37 -0
  138. package/dist/cjs/transport/retryPolicy.d.ts.map +1 -0
  139. package/dist/cjs/transport/retryPolicy.js +79 -0
  140. package/dist/cjs/transport/retryPolicy.js.map +1 -0
  141. package/dist/cjs/types/api.d.ts +85 -0
  142. package/dist/cjs/types/api.d.ts.map +1 -0
  143. package/dist/cjs/{realtime/lighter/types.js → types/api.js} +1 -1
  144. package/dist/cjs/types/api.js.map +1 -0
  145. package/dist/cjs/types/config.d.ts +26 -0
  146. package/dist/cjs/types/config.d.ts.map +1 -0
  147. package/dist/cjs/{realtime/types.js → types/config.js} +1 -1
  148. package/dist/cjs/types/config.js.map +1 -0
  149. package/dist/cjs/types/provider.d.ts +84 -0
  150. package/dist/cjs/types/provider.d.ts.map +1 -0
  151. package/dist/cjs/types/provider.js +3 -0
  152. package/dist/cjs/types/provider.js.map +1 -0
  153. package/dist/cjs/utils/accountSummary.d.ts +2 -8
  154. package/dist/cjs/utils/accountSummary.d.ts.map +1 -1
  155. package/dist/cjs/utils/accountSummary.js +12 -70
  156. package/dist/cjs/utils/accountSummary.js.map +1 -1
  157. package/dist/cjs/utils/assertNever.d.ts.map +1 -1
  158. package/dist/cjs/utils/assertNever.js.map +1 -1
  159. package/dist/cjs/utils/calculations.d.ts +36 -0
  160. package/dist/cjs/utils/calculations.d.ts.map +1 -1
  161. package/dist/cjs/utils/calculations.js +77 -0
  162. package/dist/cjs/utils/calculations.js.map +1 -1
  163. package/dist/cjs/utils/depositChain.d.ts +6 -0
  164. package/dist/cjs/utils/depositChain.d.ts.map +1 -0
  165. package/dist/cjs/utils/depositChain.js +13 -0
  166. package/dist/cjs/utils/depositChain.js.map +1 -0
  167. package/dist/cjs/utils/explorer.d.ts +9 -0
  168. package/dist/cjs/utils/explorer.d.ts.map +1 -0
  169. package/dist/cjs/utils/explorer.js +23 -0
  170. package/dist/cjs/utils/explorer.js.map +1 -0
  171. package/dist/cjs/utils/fillClassification.d.ts +3 -0
  172. package/dist/cjs/utils/fillClassification.d.ts.map +1 -0
  173. package/dist/cjs/utils/fillClassification.js +37 -0
  174. package/dist/cjs/utils/fillClassification.js.map +1 -0
  175. package/dist/cjs/utils/format.d.ts +13 -0
  176. package/dist/cjs/utils/format.d.ts.map +1 -0
  177. package/dist/cjs/utils/format.js +117 -0
  178. package/dist/cjs/utils/format.js.map +1 -0
  179. package/dist/cjs/utils/orderClassification.d.ts +3 -1
  180. package/dist/cjs/utils/orderClassification.d.ts.map +1 -1
  181. package/dist/cjs/utils/orderClassification.js +11 -1
  182. package/dist/cjs/utils/orderClassification.js.map +1 -1
  183. package/dist/cjs/utils/orderMath.d.ts +1 -1
  184. package/dist/cjs/utils/orderMath.d.ts.map +1 -1
  185. package/dist/cjs/utils/orderMath.js +2 -2
  186. package/dist/cjs/utils/orderMath.js.map +1 -1
  187. package/dist/cjs/utils/parse.d.ts.map +1 -1
  188. package/dist/cjs/utils/parse.js.map +1 -1
  189. package/dist/cjs/utils/positionMath.d.ts +6 -0
  190. package/dist/cjs/utils/positionMath.d.ts.map +1 -1
  191. package/dist/cjs/utils/positionMath.js +14 -0
  192. package/dist/cjs/utils/positionMath.js.map +1 -1
  193. package/dist/cjs/utils/signTypedData.d.ts +3 -3
  194. package/dist/cjs/utils/signTypedData.d.ts.map +1 -1
  195. package/dist/cjs/utils/signTypedData.js +3 -2
  196. package/dist/cjs/utils/signTypedData.js.map +1 -1
  197. package/dist/cjs/utils/sleep.d.ts.map +1 -1
  198. package/dist/cjs/utils/sleep.js.map +1 -1
  199. package/dist/cjs/utils/units.d.ts.map +1 -1
  200. package/dist/cjs/utils/units.js.map +1 -1
  201. package/dist/cjs/utils/validation.d.ts.map +1 -1
  202. package/dist/cjs/utils/validation.js.map +1 -1
  203. package/dist/cjs/version.d.ts +1 -1
  204. package/dist/cjs/version.d.ts.map +1 -1
  205. package/dist/cjs/version.js +1 -1
  206. package/dist/cjs/version.js.map +1 -1
  207. package/dist/cjs/websocket/PerpsWsClient.d.ts +27 -0
  208. package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -0
  209. package/dist/cjs/websocket/PerpsWsClient.js +84 -0
  210. package/dist/cjs/websocket/PerpsWsClient.js.map +1 -0
  211. package/dist/{types/realtime → cjs/websocket}/ReconnectingWebSocket.d.ts +23 -7
  212. package/dist/cjs/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  213. package/dist/cjs/websocket/ReconnectingWebSocket.js +213 -0
  214. package/dist/cjs/websocket/ReconnectingWebSocket.js.map +1 -0
  215. package/dist/cjs/websocket/WsProviderBase.d.ts +31 -0
  216. package/dist/cjs/websocket/WsProviderBase.d.ts.map +1 -0
  217. package/dist/cjs/websocket/WsProviderBase.js +197 -0
  218. package/dist/cjs/websocket/WsProviderBase.js.map +1 -0
  219. package/dist/cjs/websocket/cachePromise.d.ts +2 -0
  220. package/dist/cjs/websocket/cachePromise.d.ts.map +1 -0
  221. package/dist/cjs/websocket/cachePromise.js +18 -0
  222. package/dist/cjs/websocket/cachePromise.js.map +1 -0
  223. package/dist/cjs/websocket/types.d.ts +15 -0
  224. package/dist/cjs/websocket/types.d.ts.map +1 -0
  225. package/dist/cjs/{realtime → websocket}/types.js.map +1 -1
  226. package/dist/cjs/websocket/wsLog.d.ts +10 -0
  227. package/dist/cjs/websocket/wsLog.d.ts.map +1 -0
  228. package/dist/cjs/websocket/wsLog.js +31 -0
  229. package/dist/cjs/websocket/wsLog.js.map +1 -0
  230. package/dist/esm/client/PerpsClient.d.ts +200 -195
  231. package/dist/esm/client/PerpsClient.d.ts.map +1 -1
  232. package/dist/esm/client/PerpsClient.js +305 -794
  233. package/dist/esm/client/PerpsClient.js.map +1 -1
  234. package/dist/esm/client/bindProvider.d.ts +13 -0
  235. package/dist/esm/client/bindProvider.d.ts.map +1 -0
  236. package/dist/esm/client/bindProvider.js +16 -0
  237. package/dist/esm/client/bindProvider.js.map +1 -0
  238. package/dist/esm/client/createPerpsClient.d.ts +34 -53
  239. package/dist/esm/client/createPerpsClient.d.ts.map +1 -1
  240. package/dist/esm/client/createPerpsClient.js +51 -8
  241. package/dist/esm/client/createPerpsClient.js.map +1 -1
  242. package/dist/esm/client/requireProvider.d.ts +12 -0
  243. package/dist/esm/client/requireProvider.d.ts.map +1 -0
  244. package/dist/esm/client/requireProvider.js +22 -0
  245. package/dist/esm/client/requireProvider.js.map +1 -0
  246. package/dist/esm/errors/PerpsError.d.ts +8 -0
  247. package/dist/esm/errors/PerpsError.d.ts.map +1 -1
  248. package/dist/esm/errors/PerpsError.js +8 -0
  249. package/dist/esm/errors/PerpsError.js.map +1 -1
  250. package/dist/esm/errors/constants.d.ts +8 -2
  251. package/dist/esm/errors/constants.d.ts.map +1 -1
  252. package/dist/esm/errors/constants.js +8 -2
  253. package/dist/esm/errors/constants.js.map +1 -1
  254. package/dist/esm/index.d.ts +49 -23
  255. package/dist/esm/index.d.ts.map +1 -1
  256. package/dist/esm/index.js +38 -23
  257. package/dist/esm/index.js.map +1 -1
  258. package/dist/esm/registry/assetRegistry.d.ts +25 -0
  259. package/dist/esm/registry/assetRegistry.d.ts.map +1 -0
  260. package/dist/esm/registry/assetRegistry.js +48 -0
  261. package/dist/esm/registry/assetRegistry.js.map +1 -0
  262. package/dist/esm/registry/marketRegistry.d.ts +42 -0
  263. package/dist/esm/registry/marketRegistry.d.ts.map +1 -0
  264. package/dist/esm/registry/marketRegistry.js +81 -0
  265. package/dist/esm/registry/marketRegistry.js.map +1 -0
  266. package/dist/esm/registry/referenceDataRegistry.d.ts +44 -0
  267. package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -0
  268. package/dist/esm/registry/referenceDataRegistry.js +79 -0
  269. package/dist/esm/registry/referenceDataRegistry.js.map +1 -0
  270. package/dist/esm/services/createAction.d.ts +17 -2
  271. package/dist/esm/services/createAction.d.ts.map +1 -1
  272. package/dist/esm/services/createAction.js +9 -1
  273. package/dist/esm/services/createAction.js.map +1 -1
  274. package/dist/esm/services/executeAction.d.ts +17 -2
  275. package/dist/esm/services/executeAction.d.ts.map +1 -1
  276. package/dist/esm/services/executeAction.js +13 -1
  277. package/dist/esm/services/executeAction.js.map +1 -1
  278. package/dist/esm/services/getAccount.d.ts +19 -16
  279. package/dist/esm/services/getAccount.d.ts.map +1 -1
  280. package/dist/esm/services/getAccount.js +12 -18
  281. package/dist/esm/services/getAccount.js.map +1 -1
  282. package/dist/esm/services/getActivity.d.ts +15 -25
  283. package/dist/esm/services/getActivity.d.ts.map +1 -1
  284. package/dist/esm/services/getActivity.js +10 -28
  285. package/dist/esm/services/getActivity.js.map +1 -1
  286. package/dist/esm/services/getAssets.d.ts +14 -5
  287. package/dist/esm/services/getAssets.d.ts.map +1 -1
  288. package/dist/esm/services/getAssets.js +8 -4
  289. package/dist/esm/services/getAssets.js.map +1 -1
  290. package/dist/esm/services/getFills.d.ts +18 -29
  291. package/dist/esm/services/getFills.d.ts.map +1 -1
  292. package/dist/esm/services/getFills.js +10 -26
  293. package/dist/esm/services/getFills.js.map +1 -1
  294. package/dist/esm/services/getMarket.d.ts +34 -0
  295. package/dist/esm/services/getMarket.d.ts.map +1 -0
  296. package/dist/esm/services/getMarket.js +25 -0
  297. package/dist/esm/services/getMarket.js.map +1 -0
  298. package/dist/esm/services/getMarkets.d.ts +28 -0
  299. package/dist/esm/services/getMarkets.d.ts.map +1 -0
  300. package/dist/esm/services/getMarkets.js +22 -0
  301. package/dist/esm/services/getMarkets.js.map +1 -0
  302. package/dist/esm/services/getMeta.d.ts +19 -0
  303. package/dist/esm/services/getMeta.d.ts.map +1 -0
  304. package/dist/esm/services/getMeta.js +19 -0
  305. package/dist/esm/services/getMeta.js.map +1 -0
  306. package/dist/esm/services/getOhlcv.d.ts +15 -19
  307. package/dist/esm/services/getOhlcv.d.ts.map +1 -1
  308. package/dist/esm/services/getOhlcv.js +7 -13
  309. package/dist/esm/services/getOhlcv.js.map +1 -1
  310. package/dist/esm/services/getOrder.d.ts +16 -16
  311. package/dist/esm/services/getOrder.d.ts.map +1 -1
  312. package/dist/esm/services/getOrder.js +9 -17
  313. package/dist/esm/services/getOrder.js.map +1 -1
  314. package/dist/esm/services/getOrderbook.d.ts +13 -23
  315. package/dist/esm/services/getOrderbook.d.ts.map +1 -1
  316. package/dist/esm/services/getOrderbook.js +7 -21
  317. package/dist/esm/services/getOrderbook.js.map +1 -1
  318. package/dist/esm/services/getOrders.d.ts +17 -9
  319. package/dist/esm/services/getOrders.d.ts.map +1 -1
  320. package/dist/esm/services/getOrders.js +12 -9
  321. package/dist/esm/services/getOrders.js.map +1 -1
  322. package/dist/esm/services/getPositions.d.ts +17 -9
  323. package/dist/esm/services/getPositions.d.ts.map +1 -1
  324. package/dist/esm/services/getPositions.js +12 -9
  325. package/dist/esm/services/getPositions.js.map +1 -1
  326. package/dist/esm/services/getPrices.d.ts +12 -24
  327. package/dist/esm/services/getPrices.d.ts.map +1 -1
  328. package/dist/esm/services/getPrices.js +5 -22
  329. package/dist/esm/services/getPrices.js.map +1 -1
  330. package/dist/esm/services/getProviders.d.ts +3 -3
  331. package/dist/esm/services/getProviders.d.ts.map +1 -1
  332. package/dist/esm/services/getProviders.js +2 -3
  333. package/dist/esm/services/getProviders.js.map +1 -1
  334. package/dist/esm/services/getQuote.d.ts +42 -0
  335. package/dist/esm/services/getQuote.d.ts.map +1 -0
  336. package/dist/esm/services/getQuote.js +33 -0
  337. package/dist/esm/services/getQuote.js.map +1 -0
  338. package/dist/esm/services/getTermsAcceptance.d.ts +24 -0
  339. package/dist/esm/services/getTermsAcceptance.d.ts.map +1 -0
  340. package/dist/esm/services/getTermsAcceptance.js +24 -0
  341. package/dist/esm/services/getTermsAcceptance.js.map +1 -0
  342. package/dist/esm/services/resolveQuote.d.ts +36 -0
  343. package/dist/esm/services/resolveQuote.d.ts.map +1 -0
  344. package/dist/esm/services/resolveQuote.js +74 -0
  345. package/dist/esm/services/resolveQuote.js.map +1 -0
  346. package/dist/esm/services/resolveSubscribeQuote.d.ts +31 -0
  347. package/dist/esm/services/resolveSubscribeQuote.d.ts.map +1 -0
  348. package/dist/esm/services/resolveSubscribeQuote.js +86 -0
  349. package/dist/esm/services/resolveSubscribeQuote.js.map +1 -0
  350. package/dist/esm/storage/parseStoredRecord.d.ts +29 -0
  351. package/dist/esm/storage/parseStoredRecord.d.ts.map +1 -0
  352. package/dist/esm/storage/parseStoredRecord.js +47 -0
  353. package/dist/esm/storage/parseStoredRecord.js.map +1 -0
  354. package/dist/{types/agent → esm/storage}/storage.d.ts +6 -3
  355. package/dist/esm/storage/storage.d.ts.map +1 -0
  356. package/dist/esm/{agent → storage}/storage.js +6 -4
  357. package/dist/esm/storage/storage.js.map +1 -0
  358. package/dist/esm/storage/types.d.ts +14 -0
  359. package/dist/esm/storage/types.d.ts.map +1 -0
  360. package/dist/esm/{agent → storage}/types.js.map +1 -1
  361. package/dist/esm/transport/fetchWithRetry.d.ts +22 -0
  362. package/dist/esm/transport/fetchWithRetry.d.ts.map +1 -0
  363. package/dist/esm/transport/fetchWithRetry.js +87 -0
  364. package/dist/esm/transport/fetchWithRetry.js.map +1 -0
  365. package/dist/esm/transport/request.d.ts +25 -0
  366. package/dist/esm/transport/request.d.ts.map +1 -0
  367. package/dist/esm/{utils → transport}/request.js +19 -31
  368. package/dist/esm/transport/request.js.map +1 -0
  369. package/dist/esm/transport/retryPolicy.d.ts +106 -0
  370. package/dist/esm/transport/retryPolicy.d.ts.map +1 -0
  371. package/dist/esm/transport/retryPolicy.js +99 -0
  372. package/dist/esm/transport/retryPolicy.js.map +1 -0
  373. package/dist/esm/types/api.d.ts +214 -0
  374. package/dist/esm/types/api.d.ts.map +1 -0
  375. package/dist/esm/types/api.js +2 -0
  376. package/dist/esm/types/api.js.map +1 -0
  377. package/dist/esm/types/config.d.ts +70 -0
  378. package/dist/esm/types/config.d.ts.map +1 -0
  379. package/dist/esm/types/config.js +2 -0
  380. package/dist/esm/types/config.js.map +1 -0
  381. package/dist/esm/types/provider.d.ts +330 -0
  382. package/dist/esm/types/provider.d.ts.map +1 -0
  383. package/dist/esm/types/provider.js +2 -0
  384. package/dist/esm/types/provider.js.map +1 -0
  385. package/dist/esm/utils/accountSummary.d.ts +12 -12
  386. package/dist/esm/utils/accountSummary.d.ts.map +1 -1
  387. package/dist/esm/utils/accountSummary.js +18 -83
  388. package/dist/esm/utils/accountSummary.js.map +1 -1
  389. package/dist/esm/utils/assertNever.d.ts +1 -0
  390. package/dist/esm/utils/assertNever.d.ts.map +1 -1
  391. package/dist/esm/utils/assertNever.js +1 -0
  392. package/dist/esm/utils/assertNever.js.map +1 -1
  393. package/dist/esm/utils/calculations.d.ts +116 -0
  394. package/dist/esm/utils/calculations.d.ts.map +1 -1
  395. package/dist/esm/utils/calculations.js +140 -3
  396. package/dist/esm/utils/calculations.js.map +1 -1
  397. package/dist/esm/utils/depositChain.d.ts +25 -0
  398. package/dist/esm/utils/depositChain.d.ts.map +1 -0
  399. package/dist/esm/utils/depositChain.js +23 -0
  400. package/dist/esm/utils/depositChain.js.map +1 -0
  401. package/dist/esm/utils/explorer.d.ts +33 -0
  402. package/dist/esm/utils/explorer.d.ts.map +1 -0
  403. package/dist/esm/utils/explorer.js +38 -0
  404. package/dist/esm/utils/explorer.js.map +1 -0
  405. package/dist/esm/utils/fillClassification.d.ts +13 -0
  406. package/dist/esm/utils/fillClassification.d.ts.map +1 -0
  407. package/dist/esm/utils/fillClassification.js +44 -0
  408. package/dist/esm/utils/fillClassification.js.map +1 -0
  409. package/dist/esm/utils/format.d.ts +66 -0
  410. package/dist/esm/utils/format.d.ts.map +1 -0
  411. package/dist/esm/utils/format.js +171 -0
  412. package/dist/esm/utils/format.js.map +1 -0
  413. package/dist/esm/utils/orderClassification.d.ts +19 -1
  414. package/dist/esm/utils/orderClassification.d.ts.map +1 -1
  415. package/dist/esm/utils/orderClassification.js +26 -1
  416. package/dist/esm/utils/orderClassification.js.map +1 -1
  417. package/dist/esm/utils/orderMath.d.ts +8 -4
  418. package/dist/esm/utils/orderMath.d.ts.map +1 -1
  419. package/dist/esm/utils/orderMath.js +9 -5
  420. package/dist/esm/utils/orderMath.js.map +1 -1
  421. package/dist/esm/utils/parse.d.ts +8 -5
  422. package/dist/esm/utils/parse.d.ts.map +1 -1
  423. package/dist/esm/utils/parse.js +8 -6
  424. package/dist/esm/utils/parse.js.map +1 -1
  425. package/dist/esm/utils/positionMath.d.ts +29 -0
  426. package/dist/esm/utils/positionMath.d.ts.map +1 -1
  427. package/dist/esm/utils/positionMath.js +36 -0
  428. package/dist/esm/utils/positionMath.js.map +1 -1
  429. package/dist/esm/utils/signTypedData.d.ts +9 -4
  430. package/dist/esm/utils/signTypedData.d.ts.map +1 -1
  431. package/dist/esm/utils/signTypedData.js +9 -3
  432. package/dist/esm/utils/signTypedData.js.map +1 -1
  433. package/dist/esm/utils/sleep.d.ts +5 -0
  434. package/dist/esm/utils/sleep.d.ts.map +1 -1
  435. package/dist/esm/utils/sleep.js +5 -0
  436. package/dist/esm/utils/sleep.js.map +1 -1
  437. package/dist/esm/utils/units.d.ts +8 -1
  438. package/dist/esm/utils/units.d.ts.map +1 -1
  439. package/dist/esm/utils/units.js +8 -1
  440. package/dist/esm/utils/units.js.map +1 -1
  441. package/dist/esm/utils/validation.d.ts +4 -1
  442. package/dist/esm/utils/validation.d.ts.map +1 -1
  443. package/dist/esm/utils/validation.js +4 -1
  444. package/dist/esm/utils/validation.js.map +1 -1
  445. package/dist/esm/version.d.ts +1 -1
  446. package/dist/esm/version.d.ts.map +1 -1
  447. package/dist/esm/version.js +1 -1
  448. package/dist/esm/version.js.map +1 -1
  449. package/dist/esm/websocket/PerpsWsClient.d.ts +100 -0
  450. package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -0
  451. package/dist/esm/websocket/PerpsWsClient.js +121 -0
  452. package/dist/esm/websocket/PerpsWsClient.js.map +1 -0
  453. package/dist/esm/websocket/ReconnectingWebSocket.d.ts +130 -0
  454. package/dist/esm/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  455. package/dist/esm/websocket/ReconnectingWebSocket.js +288 -0
  456. package/dist/esm/websocket/ReconnectingWebSocket.js.map +1 -0
  457. package/dist/esm/websocket/WsProviderBase.d.ts +89 -0
  458. package/dist/esm/websocket/WsProviderBase.d.ts.map +1 -0
  459. package/dist/esm/websocket/WsProviderBase.js +246 -0
  460. package/dist/esm/websocket/WsProviderBase.js.map +1 -0
  461. package/dist/esm/websocket/cachePromise.d.ts +14 -0
  462. package/dist/esm/websocket/cachePromise.d.ts.map +1 -0
  463. package/dist/esm/websocket/cachePromise.js +27 -0
  464. package/dist/esm/websocket/cachePromise.js.map +1 -0
  465. package/dist/esm/websocket/types.d.ts +60 -0
  466. package/dist/esm/websocket/types.d.ts.map +1 -0
  467. package/dist/esm/{realtime → websocket}/types.js.map +1 -1
  468. package/dist/esm/websocket/wsLog.d.ts +50 -0
  469. package/dist/esm/websocket/wsLog.d.ts.map +1 -0
  470. package/dist/esm/websocket/wsLog.js +68 -0
  471. package/dist/esm/websocket/wsLog.js.map +1 -0
  472. package/dist/types/client/PerpsClient.d.ts +200 -195
  473. package/dist/types/client/PerpsClient.d.ts.map +1 -1
  474. package/dist/types/client/bindProvider.d.ts +13 -0
  475. package/dist/types/client/bindProvider.d.ts.map +1 -0
  476. package/dist/types/client/createPerpsClient.d.ts +34 -53
  477. package/dist/types/client/createPerpsClient.d.ts.map +1 -1
  478. package/dist/types/client/requireProvider.d.ts +12 -0
  479. package/dist/types/client/requireProvider.d.ts.map +1 -0
  480. package/dist/types/errors/PerpsError.d.ts +8 -0
  481. package/dist/types/errors/PerpsError.d.ts.map +1 -1
  482. package/dist/types/errors/constants.d.ts +8 -2
  483. package/dist/types/errors/constants.d.ts.map +1 -1
  484. package/dist/types/index.d.ts +49 -23
  485. package/dist/types/index.d.ts.map +1 -1
  486. package/dist/types/registry/assetRegistry.d.ts +25 -0
  487. package/dist/types/registry/assetRegistry.d.ts.map +1 -0
  488. package/dist/types/registry/marketRegistry.d.ts +42 -0
  489. package/dist/types/registry/marketRegistry.d.ts.map +1 -0
  490. package/dist/types/registry/referenceDataRegistry.d.ts +44 -0
  491. package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -0
  492. package/dist/types/services/createAction.d.ts +17 -2
  493. package/dist/types/services/createAction.d.ts.map +1 -1
  494. package/dist/types/services/executeAction.d.ts +17 -2
  495. package/dist/types/services/executeAction.d.ts.map +1 -1
  496. package/dist/types/services/getAccount.d.ts +19 -16
  497. package/dist/types/services/getAccount.d.ts.map +1 -1
  498. package/dist/types/services/getActivity.d.ts +15 -25
  499. package/dist/types/services/getActivity.d.ts.map +1 -1
  500. package/dist/types/services/getAssets.d.ts +14 -5
  501. package/dist/types/services/getAssets.d.ts.map +1 -1
  502. package/dist/types/services/getFills.d.ts +18 -29
  503. package/dist/types/services/getFills.d.ts.map +1 -1
  504. package/dist/types/services/getMarket.d.ts +34 -0
  505. package/dist/types/services/getMarket.d.ts.map +1 -0
  506. package/dist/types/services/getMarkets.d.ts +28 -0
  507. package/dist/types/services/getMarkets.d.ts.map +1 -0
  508. package/dist/types/services/getMeta.d.ts +19 -0
  509. package/dist/types/services/getMeta.d.ts.map +1 -0
  510. package/dist/types/services/getOhlcv.d.ts +15 -19
  511. package/dist/types/services/getOhlcv.d.ts.map +1 -1
  512. package/dist/types/services/getOrder.d.ts +16 -16
  513. package/dist/types/services/getOrder.d.ts.map +1 -1
  514. package/dist/types/services/getOrderbook.d.ts +13 -23
  515. package/dist/types/services/getOrderbook.d.ts.map +1 -1
  516. package/dist/types/services/getOrders.d.ts +17 -9
  517. package/dist/types/services/getOrders.d.ts.map +1 -1
  518. package/dist/types/services/getPositions.d.ts +17 -9
  519. package/dist/types/services/getPositions.d.ts.map +1 -1
  520. package/dist/types/services/getPrices.d.ts +12 -24
  521. package/dist/types/services/getPrices.d.ts.map +1 -1
  522. package/dist/types/services/getProviders.d.ts +3 -3
  523. package/dist/types/services/getProviders.d.ts.map +1 -1
  524. package/dist/types/services/getQuote.d.ts +42 -0
  525. package/dist/types/services/getQuote.d.ts.map +1 -0
  526. package/dist/types/services/getTermsAcceptance.d.ts +24 -0
  527. package/dist/types/services/getTermsAcceptance.d.ts.map +1 -0
  528. package/dist/types/services/resolveQuote.d.ts +36 -0
  529. package/dist/types/services/resolveQuote.d.ts.map +1 -0
  530. package/dist/types/services/resolveSubscribeQuote.d.ts +31 -0
  531. package/dist/types/services/resolveSubscribeQuote.d.ts.map +1 -0
  532. package/dist/types/storage/parseStoredRecord.d.ts +29 -0
  533. package/dist/types/storage/parseStoredRecord.d.ts.map +1 -0
  534. package/dist/{esm/agent → types/storage}/storage.d.ts +6 -3
  535. package/dist/types/storage/storage.d.ts.map +1 -0
  536. package/dist/types/storage/types.d.ts +14 -0
  537. package/dist/types/storage/types.d.ts.map +1 -0
  538. package/dist/types/transport/fetchWithRetry.d.ts +22 -0
  539. package/dist/types/transport/fetchWithRetry.d.ts.map +1 -0
  540. package/dist/types/transport/request.d.ts +25 -0
  541. package/dist/types/transport/request.d.ts.map +1 -0
  542. package/dist/types/transport/retryPolicy.d.ts +106 -0
  543. package/dist/types/transport/retryPolicy.d.ts.map +1 -0
  544. package/dist/types/types/api.d.ts +214 -0
  545. package/dist/types/types/api.d.ts.map +1 -0
  546. package/dist/types/types/config.d.ts +70 -0
  547. package/dist/types/types/config.d.ts.map +1 -0
  548. package/dist/types/types/provider.d.ts +330 -0
  549. package/dist/types/types/provider.d.ts.map +1 -0
  550. package/dist/types/utils/accountSummary.d.ts +12 -12
  551. package/dist/types/utils/accountSummary.d.ts.map +1 -1
  552. package/dist/types/utils/assertNever.d.ts +1 -0
  553. package/dist/types/utils/assertNever.d.ts.map +1 -1
  554. package/dist/types/utils/calculations.d.ts +116 -0
  555. package/dist/types/utils/calculations.d.ts.map +1 -1
  556. package/dist/types/utils/depositChain.d.ts +25 -0
  557. package/dist/types/utils/depositChain.d.ts.map +1 -0
  558. package/dist/types/utils/explorer.d.ts +33 -0
  559. package/dist/types/utils/explorer.d.ts.map +1 -0
  560. package/dist/types/utils/fillClassification.d.ts +13 -0
  561. package/dist/types/utils/fillClassification.d.ts.map +1 -0
  562. package/dist/types/utils/format.d.ts +66 -0
  563. package/dist/types/utils/format.d.ts.map +1 -0
  564. package/dist/types/utils/orderClassification.d.ts +19 -1
  565. package/dist/types/utils/orderClassification.d.ts.map +1 -1
  566. package/dist/types/utils/orderMath.d.ts +8 -4
  567. package/dist/types/utils/orderMath.d.ts.map +1 -1
  568. package/dist/types/utils/parse.d.ts +8 -5
  569. package/dist/types/utils/parse.d.ts.map +1 -1
  570. package/dist/types/utils/positionMath.d.ts +29 -0
  571. package/dist/types/utils/positionMath.d.ts.map +1 -1
  572. package/dist/types/utils/signTypedData.d.ts +9 -4
  573. package/dist/types/utils/signTypedData.d.ts.map +1 -1
  574. package/dist/types/utils/sleep.d.ts +5 -0
  575. package/dist/types/utils/sleep.d.ts.map +1 -1
  576. package/dist/types/utils/units.d.ts +8 -1
  577. package/dist/types/utils/units.d.ts.map +1 -1
  578. package/dist/types/utils/validation.d.ts +4 -1
  579. package/dist/types/utils/validation.d.ts.map +1 -1
  580. package/dist/types/version.d.ts +1 -1
  581. package/dist/types/version.d.ts.map +1 -1
  582. package/dist/types/websocket/PerpsWsClient.d.ts +100 -0
  583. package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -0
  584. package/dist/types/websocket/ReconnectingWebSocket.d.ts +130 -0
  585. package/dist/types/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  586. package/dist/types/websocket/WsProviderBase.d.ts +89 -0
  587. package/dist/types/websocket/WsProviderBase.d.ts.map +1 -0
  588. package/dist/types/websocket/cachePromise.d.ts +14 -0
  589. package/dist/types/websocket/cachePromise.d.ts.map +1 -0
  590. package/dist/types/websocket/types.d.ts +60 -0
  591. package/dist/types/websocket/types.d.ts.map +1 -0
  592. package/dist/types/websocket/wsLog.d.ts +50 -0
  593. package/dist/types/websocket/wsLog.d.ts.map +1 -0
  594. package/package.json +13 -60
  595. package/src/client/PerpsClient.ts +404 -1115
  596. package/src/client/bindProvider.ts +24 -0
  597. package/src/client/createPerpsClient.ts +68 -72
  598. package/src/client/requireProvider.ts +29 -0
  599. package/src/errors/PerpsError.ts +8 -0
  600. package/src/errors/constants.ts +8 -2
  601. package/src/index.ts +138 -82
  602. package/src/registry/assetRegistry.ts +62 -0
  603. package/src/registry/marketRegistry.ts +100 -0
  604. package/src/registry/referenceDataRegistry.ts +95 -0
  605. package/src/services/createAction.ts +17 -6
  606. package/src/services/executeAction.ts +21 -6
  607. package/src/services/getAccount.ts +24 -25
  608. package/src/services/getActivity.ts +27 -47
  609. package/src/services/getAssets.ts +15 -9
  610. package/src/services/getFills.ts +29 -42
  611. package/src/services/getMarket.ts +52 -0
  612. package/src/services/getMarkets.ts +40 -0
  613. package/src/services/getMeta.ts +30 -0
  614. package/src/services/getOhlcv.ts +24 -33
  615. package/src/services/getOrder.ts +20 -27
  616. package/src/services/getOrderbook.ts +19 -34
  617. package/src/services/getOrders.ts +27 -21
  618. package/src/services/getPositions.ts +27 -21
  619. package/src/services/getPrices.ts +14 -29
  620. package/src/services/getProviders.ts +4 -7
  621. package/src/services/getQuote.ts +58 -0
  622. package/src/services/getTermsAcceptance.ts +32 -0
  623. package/src/services/resolveQuote.ts +122 -0
  624. package/src/services/resolveSubscribeQuote.ts +109 -0
  625. package/src/storage/parseStoredRecord.ts +55 -0
  626. package/src/{agent → storage}/storage.ts +6 -4
  627. package/src/storage/types.ts +13 -0
  628. package/src/transport/fetchWithRetry.ts +116 -0
  629. package/src/{utils → transport}/request.ts +33 -45
  630. package/src/transport/retryPolicy.ts +202 -0
  631. package/src/types/api.ts +239 -0
  632. package/src/types/config.ts +79 -0
  633. package/src/types/provider.ts +429 -0
  634. package/src/utils/accountSummary.ts +25 -109
  635. package/src/utils/assertNever.ts +1 -0
  636. package/src/utils/calculations.ts +204 -7
  637. package/src/utils/depositChain.ts +37 -0
  638. package/src/utils/explorer.ts +51 -0
  639. package/src/utils/fillClassification.ts +51 -0
  640. package/src/utils/format.ts +212 -0
  641. package/src/utils/orderClassification.ts +33 -1
  642. package/src/utils/orderMath.ts +9 -5
  643. package/src/utils/parse.ts +8 -7
  644. package/src/utils/positionMath.ts +42 -0
  645. package/src/utils/signTypedData.ts +11 -5
  646. package/src/utils/sleep.ts +5 -0
  647. package/src/utils/units.ts +8 -1
  648. package/src/utils/validation.ts +4 -1
  649. package/src/version.ts +1 -1
  650. package/src/websocket/PerpsWsClient.ts +204 -0
  651. package/src/websocket/ReconnectingWebSocket.ts +353 -0
  652. package/src/websocket/WsProviderBase.ts +333 -0
  653. package/src/websocket/cachePromise.ts +30 -0
  654. package/src/websocket/types.ts +75 -0
  655. package/src/websocket/wsLog.ts +82 -0
  656. package/dist/cjs/agent/AgentManager.d.ts +0 -15
  657. package/dist/cjs/agent/AgentManager.d.ts.map +0 -1
  658. package/dist/cjs/agent/AgentManager.js +0 -82
  659. package/dist/cjs/agent/AgentManager.js.map +0 -1
  660. package/dist/cjs/agent/storage.d.ts.map +0 -1
  661. package/dist/cjs/agent/storage.js.map +0 -1
  662. package/dist/cjs/agent/types.d.ts.map +0 -1
  663. package/dist/cjs/client/projectAccountConfigSettings.d.ts +0 -3
  664. package/dist/cjs/client/projectAccountConfigSettings.d.ts.map +0 -1
  665. package/dist/cjs/client/projectAccountConfigSettings.js +0 -17
  666. package/dist/cjs/client/projectAccountConfigSettings.js.map +0 -1
  667. package/dist/cjs/client/types.d.ts +0 -85
  668. package/dist/cjs/client/types.d.ts.map +0 -1
  669. package/dist/cjs/client/types.js +0 -9
  670. package/dist/cjs/client/types.js.map +0 -1
  671. package/dist/cjs/providers/hyperliquid/accountConfig.d.ts +0 -3
  672. package/dist/cjs/providers/hyperliquid/accountConfig.d.ts.map +0 -1
  673. package/dist/cjs/providers/hyperliquid/accountConfig.js +0 -41
  674. package/dist/cjs/providers/hyperliquid/accountConfig.js.map +0 -1
  675. package/dist/cjs/providers/lighter/accountConfig.d.ts +0 -3
  676. package/dist/cjs/providers/lighter/accountConfig.d.ts.map +0 -1
  677. package/dist/cjs/providers/lighter/accountConfig.js +0 -45
  678. package/dist/cjs/providers/lighter/accountConfig.js.map +0 -1
  679. package/dist/cjs/realtime/PerpsWsClient.d.ts +0 -20
  680. package/dist/cjs/realtime/PerpsWsClient.d.ts.map +0 -1
  681. package/dist/cjs/realtime/PerpsWsClient.js +0 -69
  682. package/dist/cjs/realtime/PerpsWsClient.js.map +0 -1
  683. package/dist/cjs/realtime/ReconnectingWebSocket.d.ts +0 -36
  684. package/dist/cjs/realtime/ReconnectingWebSocket.d.ts.map +0 -1
  685. package/dist/cjs/realtime/ReconnectingWebSocket.js +0 -132
  686. package/dist/cjs/realtime/ReconnectingWebSocket.js.map +0 -1
  687. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -30
  688. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
  689. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js +0 -331
  690. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js.map +0 -1
  691. package/dist/cjs/realtime/hyperliquid/types.d.ts +0 -37
  692. package/dist/cjs/realtime/hyperliquid/types.d.ts.map +0 -1
  693. package/dist/cjs/realtime/hyperliquid/types.js.map +0 -1
  694. package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts +0 -48
  695. package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
  696. package/dist/cjs/realtime/lighter/LighterWsProvider.js +0 -424
  697. package/dist/cjs/realtime/lighter/LighterWsProvider.js.map +0 -1
  698. package/dist/cjs/realtime/lighter/types.d.ts +0 -84
  699. package/dist/cjs/realtime/lighter/types.d.ts.map +0 -1
  700. package/dist/cjs/realtime/lighter/types.js.map +0 -1
  701. package/dist/cjs/realtime/types.d.ts +0 -10
  702. package/dist/cjs/realtime/types.d.ts.map +0 -1
  703. package/dist/cjs/services/getAsset.d.ts +0 -8
  704. package/dist/cjs/services/getAsset.d.ts.map +0 -1
  705. package/dist/cjs/services/getAsset.js.map +0 -1
  706. package/dist/cjs/signers/lighter/LighterKeyStore.d.ts +0 -20
  707. package/dist/cjs/signers/lighter/LighterKeyStore.d.ts.map +0 -1
  708. package/dist/cjs/signers/lighter/LighterKeyStore.js +0 -42
  709. package/dist/cjs/signers/lighter/LighterKeyStore.js.map +0 -1
  710. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -66
  711. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
  712. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js +0 -141
  713. package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js.map +0 -1
  714. package/dist/cjs/signers/lighter/LighterSigner.d.ts +0 -41
  715. package/dist/cjs/signers/lighter/LighterSigner.d.ts.map +0 -1
  716. package/dist/cjs/signers/lighter/LighterSigner.js +0 -176
  717. package/dist/cjs/signers/lighter/LighterSigner.js.map +0 -1
  718. package/dist/cjs/signers/lighter/index.d.ts +0 -9
  719. package/dist/cjs/signers/lighter/index.d.ts.map +0 -1
  720. package/dist/cjs/signers/lighter/index.js +0 -20
  721. package/dist/cjs/signers/lighter/index.js.map +0 -1
  722. package/dist/cjs/signers/lighter/wasmLoader.d.ts +0 -42
  723. package/dist/cjs/signers/lighter/wasmLoader.d.ts.map +0 -1
  724. package/dist/cjs/signers/lighter/wasmLoader.js +0 -166
  725. package/dist/cjs/signers/lighter/wasmLoader.js.map +0 -1
  726. package/dist/cjs/utils/hyperliquid/index.d.ts +0 -3
  727. package/dist/cjs/utils/hyperliquid/index.d.ts.map +0 -1
  728. package/dist/cjs/utils/hyperliquid/index.js +0 -11
  729. package/dist/cjs/utils/hyperliquid/index.js.map +0 -1
  730. package/dist/cjs/utils/hyperliquid/liquidation.d.ts +0 -3
  731. package/dist/cjs/utils/hyperliquid/liquidation.d.ts.map +0 -1
  732. package/dist/cjs/utils/hyperliquid/liquidation.js +0 -24
  733. package/dist/cjs/utils/hyperliquid/liquidation.js.map +0 -1
  734. package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts +0 -4
  735. package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
  736. package/dist/cjs/utils/hyperliquid/orderFormatting.js +0 -33
  737. package/dist/cjs/utils/hyperliquid/orderFormatting.js.map +0 -1
  738. package/dist/cjs/utils/request.d.ts.map +0 -1
  739. package/dist/cjs/utils/request.js.map +0 -1
  740. package/dist/cjs/wasm/lighter-signer.wasm +0 -0
  741. package/dist/cjs/wasm/wasm_exec.js +0 -575
  742. package/dist/esm/agent/AgentManager.d.ts +0 -45
  743. package/dist/esm/agent/AgentManager.d.ts.map +0 -1
  744. package/dist/esm/agent/AgentManager.js +0 -112
  745. package/dist/esm/agent/AgentManager.js.map +0 -1
  746. package/dist/esm/agent/storage.d.ts.map +0 -1
  747. package/dist/esm/agent/storage.js.map +0 -1
  748. package/dist/esm/agent/types.d.ts +0 -23
  749. package/dist/esm/agent/types.d.ts.map +0 -1
  750. package/dist/esm/client/projectAccountConfigSettings.d.ts +0 -18
  751. package/dist/esm/client/projectAccountConfigSettings.d.ts.map +0 -1
  752. package/dist/esm/client/projectAccountConfigSettings.js +0 -29
  753. package/dist/esm/client/projectAccountConfigSettings.js.map +0 -1
  754. package/dist/esm/client/types.d.ts +0 -200
  755. package/dist/esm/client/types.d.ts.map +0 -1
  756. package/dist/esm/client/types.js +0 -12
  757. package/dist/esm/client/types.js.map +0 -1
  758. package/dist/esm/providers/hyperliquid/accountConfig.d.ts +0 -13
  759. package/dist/esm/providers/hyperliquid/accountConfig.d.ts.map +0 -1
  760. package/dist/esm/providers/hyperliquid/accountConfig.js +0 -69
  761. package/dist/esm/providers/hyperliquid/accountConfig.js.map +0 -1
  762. package/dist/esm/providers/lighter/accountConfig.d.ts +0 -13
  763. package/dist/esm/providers/lighter/accountConfig.d.ts.map +0 -1
  764. package/dist/esm/providers/lighter/accountConfig.js +0 -79
  765. package/dist/esm/providers/lighter/accountConfig.js.map +0 -1
  766. package/dist/esm/realtime/PerpsWsClient.d.ts +0 -26
  767. package/dist/esm/realtime/PerpsWsClient.d.ts.map +0 -1
  768. package/dist/esm/realtime/PerpsWsClient.js +0 -65
  769. package/dist/esm/realtime/PerpsWsClient.js.map +0 -1
  770. package/dist/esm/realtime/ReconnectingWebSocket.d.ts +0 -36
  771. package/dist/esm/realtime/ReconnectingWebSocket.d.ts.map +0 -1
  772. package/dist/esm/realtime/ReconnectingWebSocket.js +0 -128
  773. package/dist/esm/realtime/ReconnectingWebSocket.js.map +0 -1
  774. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -32
  775. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
  776. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js +0 -339
  777. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js.map +0 -1
  778. package/dist/esm/realtime/hyperliquid/types.d.ts +0 -37
  779. package/dist/esm/realtime/hyperliquid/types.d.ts.map +0 -1
  780. package/dist/esm/realtime/hyperliquid/types.js +0 -4
  781. package/dist/esm/realtime/hyperliquid/types.js.map +0 -1
  782. package/dist/esm/realtime/lighter/LighterWsProvider.d.ts +0 -68
  783. package/dist/esm/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
  784. package/dist/esm/realtime/lighter/LighterWsProvider.js +0 -474
  785. package/dist/esm/realtime/lighter/LighterWsProvider.js.map +0 -1
  786. package/dist/esm/realtime/lighter/types.d.ts +0 -108
  787. package/dist/esm/realtime/lighter/types.d.ts.map +0 -1
  788. package/dist/esm/realtime/lighter/types.js +0 -14
  789. package/dist/esm/realtime/lighter/types.js.map +0 -1
  790. package/dist/esm/realtime/types.d.ts +0 -10
  791. package/dist/esm/realtime/types.d.ts.map +0 -1
  792. package/dist/esm/services/getAsset.d.ts +0 -20
  793. package/dist/esm/services/getAsset.d.ts.map +0 -1
  794. package/dist/esm/services/getAsset.js +0 -18
  795. package/dist/esm/services/getAsset.js.map +0 -1
  796. package/dist/esm/signers/lighter/LighterKeyStore.d.ts +0 -29
  797. package/dist/esm/signers/lighter/LighterKeyStore.d.ts.map +0 -1
  798. package/dist/esm/signers/lighter/LighterKeyStore.js +0 -53
  799. package/dist/esm/signers/lighter/LighterKeyStore.js.map +0 -1
  800. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -174
  801. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
  802. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js +0 -214
  803. package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js.map +0 -1
  804. package/dist/esm/signers/lighter/LighterSigner.d.ts +0 -88
  805. package/dist/esm/signers/lighter/LighterSigner.d.ts.map +0 -1
  806. package/dist/esm/signers/lighter/LighterSigner.js +0 -226
  807. package/dist/esm/signers/lighter/LighterSigner.js.map +0 -1
  808. package/dist/esm/signers/lighter/index.d.ts +0 -9
  809. package/dist/esm/signers/lighter/index.d.ts.map +0 -1
  810. package/dist/esm/signers/lighter/index.js +0 -5
  811. package/dist/esm/signers/lighter/index.js.map +0 -1
  812. package/dist/esm/signers/lighter/wasmLoader.d.ts +0 -71
  813. package/dist/esm/signers/lighter/wasmLoader.d.ts.map +0 -1
  814. package/dist/esm/signers/lighter/wasmLoader.js +0 -181
  815. package/dist/esm/signers/lighter/wasmLoader.js.map +0 -1
  816. package/dist/esm/utils/hyperliquid/index.d.ts +0 -3
  817. package/dist/esm/utils/hyperliquid/index.d.ts.map +0 -1
  818. package/dist/esm/utils/hyperliquid/index.js +0 -3
  819. package/dist/esm/utils/hyperliquid/index.js.map +0 -1
  820. package/dist/esm/utils/hyperliquid/liquidation.d.ts +0 -46
  821. package/dist/esm/utils/hyperliquid/liquidation.d.ts.map +0 -1
  822. package/dist/esm/utils/hyperliquid/liquidation.js +0 -63
  823. package/dist/esm/utils/hyperliquid/liquidation.js.map +0 -1
  824. package/dist/esm/utils/hyperliquid/orderFormatting.d.ts +0 -44
  825. package/dist/esm/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
  826. package/dist/esm/utils/hyperliquid/orderFormatting.js +0 -79
  827. package/dist/esm/utils/hyperliquid/orderFormatting.js.map +0 -1
  828. package/dist/esm/utils/request.d.ts +0 -25
  829. package/dist/esm/utils/request.d.ts.map +0 -1
  830. package/dist/esm/utils/request.js.map +0 -1
  831. package/dist/esm/wasm/lighter-signer.wasm +0 -0
  832. package/dist/esm/wasm/wasm_exec.js +0 -575
  833. package/dist/types/agent/AgentManager.d.ts +0 -45
  834. package/dist/types/agent/AgentManager.d.ts.map +0 -1
  835. package/dist/types/agent/storage.d.ts.map +0 -1
  836. package/dist/types/agent/types.d.ts +0 -23
  837. package/dist/types/agent/types.d.ts.map +0 -1
  838. package/dist/types/client/projectAccountConfigSettings.d.ts +0 -18
  839. package/dist/types/client/projectAccountConfigSettings.d.ts.map +0 -1
  840. package/dist/types/client/types.d.ts +0 -200
  841. package/dist/types/client/types.d.ts.map +0 -1
  842. package/dist/types/providers/hyperliquid/accountConfig.d.ts +0 -13
  843. package/dist/types/providers/hyperliquid/accountConfig.d.ts.map +0 -1
  844. package/dist/types/providers/lighter/accountConfig.d.ts +0 -13
  845. package/dist/types/providers/lighter/accountConfig.d.ts.map +0 -1
  846. package/dist/types/realtime/PerpsWsClient.d.ts +0 -26
  847. package/dist/types/realtime/PerpsWsClient.d.ts.map +0 -1
  848. package/dist/types/realtime/ReconnectingWebSocket.d.ts.map +0 -1
  849. package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -32
  850. package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
  851. package/dist/types/realtime/hyperliquid/types.d.ts +0 -37
  852. package/dist/types/realtime/hyperliquid/types.d.ts.map +0 -1
  853. package/dist/types/realtime/lighter/LighterWsProvider.d.ts +0 -68
  854. package/dist/types/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
  855. package/dist/types/realtime/lighter/types.d.ts +0 -108
  856. package/dist/types/realtime/lighter/types.d.ts.map +0 -1
  857. package/dist/types/realtime/types.d.ts +0 -10
  858. package/dist/types/realtime/types.d.ts.map +0 -1
  859. package/dist/types/services/getAsset.d.ts +0 -20
  860. package/dist/types/services/getAsset.d.ts.map +0 -1
  861. package/dist/types/signers/lighter/LighterKeyStore.d.ts +0 -29
  862. package/dist/types/signers/lighter/LighterKeyStore.d.ts.map +0 -1
  863. package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -174
  864. package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
  865. package/dist/types/signers/lighter/LighterSigner.d.ts +0 -88
  866. package/dist/types/signers/lighter/LighterSigner.d.ts.map +0 -1
  867. package/dist/types/signers/lighter/index.d.ts +0 -9
  868. package/dist/types/signers/lighter/index.d.ts.map +0 -1
  869. package/dist/types/signers/lighter/wasmLoader.d.ts +0 -71
  870. package/dist/types/signers/lighter/wasmLoader.d.ts.map +0 -1
  871. package/dist/types/utils/hyperliquid/index.d.ts +0 -3
  872. package/dist/types/utils/hyperliquid/index.d.ts.map +0 -1
  873. package/dist/types/utils/hyperliquid/liquidation.d.ts +0 -46
  874. package/dist/types/utils/hyperliquid/liquidation.d.ts.map +0 -1
  875. package/dist/types/utils/hyperliquid/orderFormatting.d.ts +0 -44
  876. package/dist/types/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
  877. package/dist/types/utils/request.d.ts +0 -25
  878. package/dist/types/utils/request.d.ts.map +0 -1
  879. package/src/agent/AgentManager.ts +0 -137
  880. package/src/agent/types.ts +0 -24
  881. package/src/client/projectAccountConfigSettings.ts +0 -39
  882. package/src/client/types.ts +0 -240
  883. package/src/providers/hyperliquid/accountConfig.ts +0 -92
  884. package/src/providers/lighter/accountConfig.ts +0 -103
  885. package/src/realtime/PerpsWsClient.ts +0 -108
  886. package/src/realtime/ReconnectingWebSocket.ts +0 -156
  887. package/src/realtime/hyperliquid/HyperliquidWsProvider.ts +0 -413
  888. package/src/realtime/hyperliquid/types.ts +0 -46
  889. package/src/realtime/lighter/LighterWsProvider.ts +0 -682
  890. package/src/realtime/lighter/types.ts +0 -121
  891. package/src/realtime/types.ts +0 -16
  892. package/src/services/getAsset.ts +0 -37
  893. package/src/signers/lighter/LighterKeyStore.ts +0 -74
  894. package/src/signers/lighter/LighterReadOnlyTokenManager.ts +0 -358
  895. package/src/signers/lighter/LighterSigner.ts +0 -396
  896. package/src/signers/lighter/index.ts +0 -36
  897. package/src/signers/lighter/wasmLoader.ts +0 -291
  898. package/src/utils/hyperliquid/index.ts +0 -9
  899. package/src/utils/hyperliquid/liquidation.ts +0 -71
  900. package/src/utils/hyperliquid/orderFormatting.ts +0 -96
  901. package/wasm/lighter-signer.wasm +0 -0
  902. package/wasm/wasm_exec.js +0 -575
  903. /package/dist/cjs/{agent → storage}/storage.d.ts +0 -0
  904. /package/dist/cjs/{agent → storage}/storage.js +0 -0
  905. /package/dist/cjs/{agent → storage}/types.js +0 -0
  906. /package/dist/cjs/{realtime/hyperliquid → websocket}/types.js +0 -0
  907. /package/dist/esm/{agent → storage}/types.js +0 -0
  908. /package/dist/esm/{realtime → websocket}/types.js +0 -0
@@ -1,69 +1,45 @@
1
1
  import type {
2
- ActionDescriptor,
2
+ AccountResponse,
3
+ AccountSummary,
3
4
  ActionParamsMap,
4
5
  ActionStep,
5
- Address,
6
- ApproveReadOnlyTokenParams,
7
- AssetIdentity,
8
6
  CreateActionResponse,
9
- Eip712ActionStep,
10
- Eip712SignedActionStep,
11
- EvmTxActionStep,
12
- EvmTxSignedActionStep,
13
7
  ExecuteActionResponse,
8
+ MarketRef,
9
+ Position,
14
10
  Provider,
11
+ ProviderAction,
15
12
  SignedActionStep,
16
- WasmBlobActionStep,
17
- WasmBlobSignedActionStep,
18
13
  } from '@lifi/perps-types'
19
- import {
20
- ActionType,
21
- PerpsErrorCode,
22
- PerpsSigner,
23
- SigningMethod,
24
- } from '@lifi/perps-types'
25
- import { parseAbi } from 'viem'
26
- import { localStorageAdapter } from '../agent/storage.js'
27
- import type { StorageAdapter } from '../agent/types.js'
14
+ import { ActionType, PerpsErrorCode } from '@lifi/perps-types'
15
+ import type { Address } from 'viem'
28
16
  import { PerpsError } from '../errors/PerpsError.js'
29
17
  import { createAction } from '../services/createAction.js'
30
18
  import { executeAction } from '../services/executeAction.js'
31
- import { getAccount } from '../services/getAccount.js'
19
+ import { getAccount as fetchAccount } from '../services/getAccount.js'
32
20
  import { getProviders } from '../services/getProviders.js'
33
- import {
34
- type ApproveReadOnlyTokenResult,
35
- DEFAULT_API_KEY_INDEX,
36
- type LighterApiKey,
37
- LighterKeyStore,
38
- LighterReadOnlyTokenManager,
39
- type LighterReadOnlyTokenManagerOptions,
40
- LighterSigner,
41
- type LighterSignerConfig,
42
- walletClientSigner,
43
- } from '../signers/lighter/index.js'
44
- import {
45
- signTypedData,
46
- signTypedDataWithSigner,
47
- } from '../utils/signTypedData.js'
48
- import { createPerpsClient, type PerpsSDKClient } from './createPerpsClient.js'
49
- import { projectAccountConfigSettings } from './projectAccountConfigSettings.js'
50
- import {
51
- type CancelOrdersParams,
52
- type CheckPrerequisitesParams,
53
- type GetAccountResult,
54
- type GetSetupParams,
55
- type ModifyOrdersParams,
56
- type PerpsClientOptions,
57
- type PlaceOrderParams,
58
- type PlaceTriggerOrderParams,
59
- type SatisfySetupParams,
60
- type SatisfySetupResult,
61
- type SetupResult,
62
- SigningMode,
63
- type WithdrawParams,
64
- } from './types.js'
65
-
66
- const MAX_NONCE_RETRIES = 3
21
+ import type {
22
+ BuildProviderSetupParams,
23
+ CancelOrdersParams,
24
+ ExecuteProviderSetupParams,
25
+ ExecuteProviderSetupResult,
26
+ GetAccountResult,
27
+ GetSetupParams,
28
+ ModifyOrdersParams,
29
+ PerpsClientOptions,
30
+ PlaceOrderParams,
31
+ PlaceTriggerOrderParams,
32
+ ProviderSetup,
33
+ WithdrawParams,
34
+ } from '../types/api.js'
35
+ import type {
36
+ ActionSignerContribution,
37
+ PerpsProvider,
38
+ PerpsSDKClient,
39
+ SignActionsContext,
40
+ } from '../types/provider.js'
41
+ import { createPerpsClient } from './createPerpsClient.js'
42
+ import { requireProvider as resolveProvider } from './requireProvider.js'
67
43
 
68
44
  /**
69
45
  * Look up an action's descriptor in the provider's metadata. Throws if the
@@ -72,7 +48,7 @@ const MAX_NONCE_RETRIES = 3
72
48
  function findActionDescriptor(
73
49
  metadata: Provider,
74
50
  action: ActionType
75
- ): ActionDescriptor {
51
+ ): ProviderAction {
76
52
  const descriptor = [
77
53
  ...metadata.setup,
78
54
  ...metadata.options,
@@ -87,82 +63,52 @@ function findActionDescriptor(
87
63
  return descriptor
88
64
  }
89
65
 
66
+ /**
67
+ * The primary high-level perps API: wraps a {@link PerpsSDKClient} and owns the
68
+ * end-to-end signing pipeline for provider setup, orders, and account-level
69
+ * actions. Construct via `new PerpsClient(options)` or the SDK's higher-level
70
+ * wiring.
71
+ *
72
+ * @public
73
+ */
90
74
  export class PerpsClient {
91
75
  private sdkClient: PerpsSDKClient
92
- private storage: StorageAdapter
93
- private signingModes: Map<string, SigningMode> = new Map()
94
76
  private providerMetadataCache: Map<string, Provider> = new Map()
95
- private _signer: PerpsSDKClient['signer'] | undefined
96
- private readonly lighterConfig: LighterSignerConfig | undefined
97
- private readonly lighterReadOnlyTokenOptions:
98
- | LighterReadOnlyTokenManagerOptions
99
- | undefined
100
- private _lighterSigner: LighterSigner | undefined
101
- private _lighterKeyStore: LighterKeyStore | undefined
102
- private _lighterReadOnlyTokenManager: LighterReadOnlyTokenManager | undefined
77
+ private _userWallet: PerpsSDKClient['userWallet'] | undefined
103
78
 
104
79
  constructor(options: PerpsClientOptions) {
105
- this.storage = options.storage ?? localStorageAdapter
106
- this.lighterConfig = options.lighter
107
- this.lighterReadOnlyTokenOptions = options.lighterReadOnlyToken
108
80
  this.sdkClient = createPerpsClient({
109
81
  integrator: options.integrator,
110
82
  apiKey: options.apiKey,
111
83
  apiUrl: options.apiUrl,
112
- storage: this.storage,
113
84
  providers: options.providers,
114
85
  })
115
86
  }
116
87
 
117
- private getLighterSigner(): LighterSigner {
118
- if (!this._lighterSigner) {
119
- this._lighterSigner = new LighterSigner(this.lighterConfig)
120
- }
121
- return this._lighterSigner
122
- }
123
-
124
- private getLighterKeyStore(): LighterKeyStore {
125
- if (!this._lighterKeyStore) {
126
- this._lighterKeyStore = new LighterKeyStore(this.storage)
127
- }
128
- return this._lighterKeyStore
129
- }
130
-
131
- private getLighterReadOnlyTokenManager(): LighterReadOnlyTokenManager {
132
- if (!this._lighterReadOnlyTokenManager) {
133
- this._lighterReadOnlyTokenManager = new LighterReadOnlyTokenManager({
134
- storage: this.storage,
135
- ...this.lighterReadOnlyTokenOptions,
136
- })
137
- }
138
- return this._lighterReadOnlyTokenManager
139
- }
140
-
141
88
  /**
142
- * Set or update the wallet signer. Used whenever an action's descriptor
89
+ * Set or update the end-user's wallet. Used whenever an action's descriptor
143
90
  * names the user wallet in its `signers` list. Pass undefined to clear.
91
+ *
92
+ * @public
144
93
  */
145
- setSigner(signer: PerpsSDKClient['signer']): void {
146
- this._signer = signer
147
- // Override the signer on the sdkClient
148
- Object.defineProperty(this.sdkClient, 'signer', {
149
- get: () => this._signer,
94
+ setUserWallet(userWallet: PerpsSDKClient['userWallet']): void {
95
+ this._userWallet = userWallet
96
+ Object.defineProperty(this.sdkClient, 'userWallet', {
97
+ get: () => this._userWallet,
150
98
  configurable: true,
151
99
  })
152
100
  }
153
101
 
102
+ /**
103
+ * The underlying low-level {@link PerpsSDKClient} (config, user wallet,
104
+ * provider registry) backing this instance.
105
+ *
106
+ * @public
107
+ */
154
108
  get client(): PerpsSDKClient {
155
109
  return this.sdkClient
156
110
  }
157
111
 
158
- private modeKey(address: Address, provider: string): string {
159
- return `${address.toLowerCase()}:${provider.toLowerCase()}`
160
- }
161
-
162
- private signingModeStorageKey(address: Address, provider: string): string {
163
- return `lifi-perps-mode:${address.toLowerCase()}:${provider.toLowerCase()}`
164
- }
165
-
166
112
  private async getProviderMetadata(provider: string): Promise<Provider> {
167
113
  const cached = this.providerMetadataCache.get(provider)
168
114
  if (cached) {
@@ -187,714 +133,160 @@ export class PerpsClient {
187
133
  }
188
134
 
189
135
  /**
190
- * Action types that require explicit user input (a chosen mode or tier)
191
- * and therefore cannot be bulk-staged through `buildPrerequisites` with
192
- * empty params. Callers must dispatch these via `execute(...)` once a
193
- * value is picked. The post-`APPROVE_AGENT` auto-upgrade path also
194
- * dispatches `ACCOUNT_MODE` directly with `mode: 'unifiedAccount'`.
136
+ * Resolve the registered provider plugin for `provider`, throwing a
137
+ * `PerpsError` when the caller has not registered one via the SDK's
138
+ * `providers` option. The plugin owns signer identity and write-side signing.
195
139
  */
196
- private static readonly EXPLICIT_INPUT_PREREQUISITES: ReadonlySet<ActionType> =
197
- new Set([ActionType.ACCOUNT_MODE, ActionType.ACCOUNT_TYPE])
198
-
199
- private buildPrerequisiteInputs(
200
- prerequisites: ActionDescriptor[],
201
- mode: SigningMode,
202
- agentAddress?: Address
203
- ): Array<{ key: string; params?: Record<string, unknown> }> {
204
- return prerequisites
205
- .filter((p) => {
206
- // ACCOUNT_MODE / ACCOUNT_TYPE require explicit params; they're
207
- // dispatched separately via `execute(...)` (or the post-APPROVE_AGENT
208
- // auto-upgrade chain) rather than bulk-staged.
209
- if (PerpsClient.EXPLICIT_INPUT_PREREQUISITES.has(p.type)) {
210
- return false
211
- }
212
- if (mode === SigningMode.USER) {
213
- // USER mode: only items the user can sign, and never APPROVE_AGENT
214
- // (no agent is created in this mode).
215
- if (!p.signers.includes(PerpsSigner.USER)) {
216
- return false
217
- }
218
- if (p.type === ActionType.APPROVE_AGENT) {
219
- return false
220
- }
221
- return true
222
- }
223
- // USER_AGENT mode: include every remaining declared prerequisite.
224
- return true
225
- })
226
- .map((p) => {
227
- const params: Record<string, unknown> = {}
228
- if (p.type === ActionType.APPROVE_AGENT && agentAddress) {
229
- params.agentAddress = agentAddress
230
- }
231
- return {
232
- key: p.type,
233
- ...(Object.keys(params).length > 0 ? { params } : {}),
234
- }
235
- })
236
- }
237
-
238
- private async resolveSignerForAction(
239
- action: ActionType,
240
- address: Address,
241
- provider: string
242
- ): Promise<Address | undefined> {
243
- const mode = await this.loadSigningMode(address, provider)
244
- if (mode !== SigningMode.USER_AGENT) {
245
- return undefined
246
- }
247
-
248
- // Only AGENT-signed actions surface a distinct signerAddress on the wire.
249
- // API_KEY signers (e.g. Lighter's LighterKeyStore) are managed per-provider
250
- // and don't have an EVM address — the backend identifies the action by the
251
- // L1 `address` instead.
252
- const metadata = await this.getProviderMetadata(provider)
253
- const allActions = [
254
- ...metadata.setup,
255
- ...metadata.options,
256
- ...metadata.actions,
257
- ]
258
- const descriptor = allActions.find((d) => d.type === action)
259
- if (!descriptor?.signers.includes(PerpsSigner.AGENT)) {
260
- return undefined
261
- }
262
-
263
- const agent = await this.sdkClient.agentManager.getAgent(address, provider)
264
- return agent.address
265
- }
266
-
267
- /**
268
- * True if any descriptor for the provider lists `PerpsSigner.AGENT`.
269
- * Providers like Lighter sign with their own keystore and never need an
270
- * AgentManager-managed agent.
271
- */
272
- private async providerUsesAgent(provider: string): Promise<boolean> {
273
- const metadata = await this.getProviderMetadata(provider)
274
- const all = [...metadata.setup, ...metadata.options, ...metadata.actions]
275
- return all.some((d) => d.signers.includes(PerpsSigner.AGENT))
276
- }
277
-
278
- private async autoSignAndExecute(
279
- provider: string,
280
- address: Address,
281
- action: ActionType,
282
- actions: ActionStep[],
283
- descriptor: ActionDescriptor
284
- ): Promise<ExecuteActionResponse> {
285
- switch (descriptor.signingMethod) {
286
- case SigningMethod.EIP712: {
287
- const eip712Actions = actions as Eip712ActionStep[]
288
-
289
- if (descriptor.signers.includes(PerpsSigner.AGENT)) {
290
- const agent = await this.sdkClient.agentManager.getAgent(
291
- address,
292
- provider
293
- )
294
- const signedActions: SignedActionStep[] = await Promise.all(
295
- eip712Actions.map(
296
- async (a) =>
297
- ({
298
- action: a.action,
299
- typedData: a.typedData,
300
- signature: await signTypedData(agent.privateKey, a.typedData),
301
- }) satisfies Eip712SignedActionStep
302
- )
303
- )
304
- return executeAction(this.sdkClient, {
305
- provider,
306
- address,
307
- signerAddress: agent.address,
308
- action,
309
- actions: signedActions,
310
- })
311
- }
312
-
313
- if (descriptor.signers.includes(PerpsSigner.USER)) {
314
- const signer = this.sdkClient.signer
315
- if (!signer) {
316
- throw new PerpsError(
317
- PerpsErrorCode.SDKError,
318
- `Action '${action}' requires a user-wallet signature, but no signer was configured. Pass a WalletClient to createPerpsClient({ signer }).`
319
- )
320
- }
321
- const signedActions: SignedActionStep[] = await Promise.all(
322
- eip712Actions.map(
323
- async (a) =>
324
- ({
325
- action: a.action,
326
- typedData: a.typedData,
327
- signature: await signTypedDataWithSigner(signer, a.typedData),
328
- }) satisfies Eip712SignedActionStep
329
- )
330
- )
331
- return executeAction(this.sdkClient, {
332
- provider,
333
- address,
334
- signerAddress: address,
335
- action,
336
- actions: signedActions,
337
- })
338
- }
339
-
340
- throw new PerpsError(
341
- PerpsErrorCode.SDKError,
342
- `Action '${action}' descriptor names no supported signer (signers=[${descriptor.signers.join(', ')}]).`
343
- )
344
- }
345
-
346
- case SigningMethod.WASM_BLOB: {
347
- const wasmActions = actions as WasmBlobActionStep[]
348
- const signedActions = await this.signWasmBlobActions(
349
- provider,
350
- address,
351
- wasmActions
352
- )
353
- return executeAction(this.sdkClient, {
354
- provider,
355
- address,
356
- signerAddress: address,
357
- action,
358
- actions: signedActions,
359
- })
360
- }
361
-
362
- case SigningMethod.EVM_TX: {
363
- const evmActions = actions as EvmTxActionStep[]
364
- const signedActions = await this.signEvmTxActions(evmActions)
365
- return executeAction(this.sdkClient, {
366
- provider,
367
- address,
368
- signerAddress: address,
369
- action,
370
- actions: signedActions,
371
- })
372
- }
373
-
374
- default:
375
- throw new Error(`Unknown signingMethod: ${descriptor.signingMethod}`)
376
- }
140
+ private requireProvider(provider: string): PerpsProvider {
141
+ return resolveProvider(this.sdkClient, provider)
377
142
  }
378
143
 
379
144
  /**
380
- * Sign a single prerequisite step using whichever signing path matches the
381
- * step's shape EIP-712 typed data, WASM blob (with the hybrid EIP-191 +
382
- * WASM flow for REGISTER_API_KEY), or EVM transaction. Lets consumers
383
- * collect signed prereqs without embedding per-method signing logic.
145
+ * Ask the provider plugin for the signer-bearing wire fields of `action` —
146
+ * the on-wire `signerAddress` and any signer-derived params (e.g.
147
+ * Hyperliquid's `agentAddress` for `APPROVE_AGENT`). Forwards the descriptor's
148
+ * `signers` so the plugin can branch on signer role. Returns empty when the
149
+ * plugin signs as the user or with a non-EVM credential. Core constructs no
150
+ * `signerAddress` itself; signer identity is plugin-owned.
384
151
  */
385
- async signPrerequisite(
152
+ private async resolveActionRequest(
386
153
  provider: string,
387
- address: Address,
388
- step: ActionStep
389
- ): Promise<SignedActionStep> {
390
- if ('typedData' in step) {
391
- if (!this.sdkClient.signer) {
392
- throw new PerpsError(
393
- PerpsErrorCode.SDKError,
394
- 'EIP-712 prerequisite signing requires a wallet signer. Pass ' +
395
- '`signer` to createPerpsClient or call setSigner(walletClient).'
396
- )
397
- }
398
- return {
399
- action: step.action,
400
- typedData: step.typedData,
401
- signature: await signTypedDataWithSigner(
402
- this.sdkClient.signer,
403
- step.typedData
404
- ),
405
- } satisfies Eip712SignedActionStep
406
- }
407
- if ('wasmSignParams' in step) {
408
- const [signed] = await this.signWasmBlobActions(provider, address, [step])
409
- return signed
410
- }
411
- if ('txParams' in step) {
412
- const [signed] = await this.signEvmTxActions([step])
413
- return signed
154
+ descriptor: ProviderAction,
155
+ address: Address
156
+ ): Promise<ActionSignerContribution> {
157
+ const plugin = this.requireProvider(provider)
158
+ if (typeof plugin.resolveActionRequest !== 'function') {
159
+ return {}
414
160
  }
415
- throw new PerpsError(
416
- PerpsErrorCode.SDKError,
417
- 'Unknown ActionStep shape — expected typedData, wasmSignParams, or txParams.'
161
+ return plugin.resolveActionRequest(
162
+ descriptor.type,
163
+ address,
164
+ descriptor.signers
418
165
  )
419
166
  }
420
167
 
421
168
  /**
422
- * Sign and broadcast a sequence of EVM transactions via the user's wallet
423
- * client. Steps are submitted serially so a later step (e.g. deposit) can
424
- * rely on an earlier step (e.g. approve) having mined. Each step's
425
- * `txParams` carries chainId, target, function name, args, and a
426
- * human-readable abi from the backend.
169
+ * Delegate signing of `actions` to the provider plugin. The plugin owns
170
+ * every signing arm and branches on the descriptor's `signers` internally,
171
+ * reading the end-user's wallet from the {@link SignActionsContext} when an
172
+ * arm signs as the user.
427
173
  */
428
- private async signEvmTxActions(
429
- actions: EvmTxActionStep[]
430
- ): Promise<EvmTxSignedActionStep[]> {
431
- if (!this.sdkClient.signer) {
432
- throw new PerpsError(
433
- PerpsErrorCode.SDKError,
434
- 'EVM_TX signing requires a wallet signer. Pass `signer` to ' +
435
- 'createPerpsClient or call setSigner(walletClient).'
436
- )
437
- }
438
- const { signer } = this.sdkClient
439
- const signed: EvmTxSignedActionStep[] = []
440
-
441
- for (const step of actions) {
442
- const params = step.txParams as {
443
- chainId: number
444
- to: Address
445
- functionName: string
446
- args: readonly unknown[]
447
- abi: readonly string[]
448
- }
449
-
450
- const txHash = await signer.writeContract({
451
- address: params.to,
452
- abi: parseAbi(params.abi),
453
- functionName: params.functionName,
454
- args: params.args,
455
- chain: signer.chain,
456
- account: signer.account,
457
- })
458
-
459
- signed.push({
460
- action: step.action,
461
- txParams: step.txParams,
462
- txHash,
463
- })
464
- }
465
-
466
- return signed
467
- }
468
-
469
- /**
470
- * Sign a batch of WASM_BLOB action steps (Lighter). Ensures the user's
471
- * Lighter API keypair is registered first — generating one and running the
472
- * REGISTER_API_KEY hybrid flow via the L1 signer if not — then feeds each
473
- * subsequent step through the WASM signer and returns signed blobs.
474
- *
475
- * `ACCOUNT_TYPE` (Lighter `/api/v1/changeAccountTier`) is dispatched as a
476
- * WASM_BLOB envelope by the backend but is NOT a wasm-signed transaction —
477
- * Lighter authenticates the endpoint with an auth token and enforces
478
- * anti-replay server-side (24h cooldown, no open positions). The signer
479
- * mints a Lighter auth token via the same WASM `CreateAuthToken` the read
480
- * endpoints use and parks it in `signedTx.txInfo`; the backend's
481
- * `executeChangeAccountTier` consumes that field as the `auth` form
482
- * parameter. `txType`/`txHash` are unused for this action — they carry
483
- * placeholder values to satisfy the `WasmBlobSignedActionStep` shape.
484
- */
485
- private async signWasmBlobActions(
174
+ private async delegateSignActions(
486
175
  provider: string,
487
176
  address: Address,
488
- actions: WasmBlobActionStep[]
489
- ): Promise<WasmBlobSignedActionStep[]> {
490
- const signed: WasmBlobSignedActionStep[] = []
491
- for (const step of actions) {
492
- if (step.action === ActionType.REGISTER_API_KEY) {
493
- signed.push(await this.signRegisterApiKey(provider, address, step))
494
- } else if (step.action === ActionType.ACCOUNT_TYPE) {
495
- signed.push(await this.signAccountTierChange(address, step))
496
- } else {
497
- signed.push(await this.signStandardWasmAction(provider, address, step))
498
- }
499
- }
500
- return signed
501
- }
502
-
503
- private async signStandardWasmAction(
504
- provider: string,
505
- address: Address,
506
- step: WasmBlobActionStep
507
- ): Promise<WasmBlobSignedActionStep> {
508
- const apiKey = await this.getLighterKeyStore().get(address)
509
- if (!apiKey) {
177
+ descriptor: ProviderAction,
178
+ actions: ActionStep[]
179
+ ): Promise<SignedActionStep[]> {
180
+ const plugin = this.requireProvider(provider)
181
+ if (typeof plugin.signActions !== 'function') {
510
182
  throw new PerpsError(
511
183
  PerpsErrorCode.SDKError,
512
- `No Lighter API key registered for ${address}. ` +
513
- 'Run prepareAccount / REGISTER_API_KEY first.'
184
+ `Provider '${provider}' does not implement signActions for ` +
185
+ `signingMethod '${descriptor.signingMethod}'.`
514
186
  )
515
187
  }
516
- const signer = this.getLighterSigner()
517
- const signedTx = await signer.sign(step.action, step.wasmSignParams, {
518
- apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
519
- apiKeyIndex: apiKey.apiKeyIndex,
520
- accountIndex: apiKey.accountIndex,
521
- })
522
- void provider
523
- return {
524
- action: step.action,
525
- wasmSignParams: step.wasmSignParams,
526
- signedTx,
527
- }
528
- }
529
-
530
- /**
531
- * REGISTER_API_KEY flow:
532
- * 1. Look up the user's Lighter accountIndex from getAccount()
533
- * 2. Generate a fresh Lighter API keypair via the WASM signer
534
- * 3. Call SignChangePubKey to produce the WASM blob + EIP-191 message
535
- * 4. Have the user's L1 Ethereum wallet sign the message
536
- * 5. Inject the L1 signature into the ChangePubKey txInfo JSON
537
- * 6. Persist the keypair and return the signed blob
538
- *
539
- * Requires a USER wallet signer to be set via `setSigner` or passed at
540
- * construction — the L1 signature is the user's consent to rotate keys.
541
- */
542
- private async signRegisterApiKey(
543
- provider: string,
544
- address: Address,
545
- step: WasmBlobActionStep
546
- ): Promise<WasmBlobSignedActionStep> {
547
- if (!this.sdkClient.signer) {
548
- throw new PerpsError(
549
- PerpsErrorCode.SDKError,
550
- 'REGISTER_API_KEY requires a wallet signer — pass `signer` to ' +
551
- 'createPerpsClient or call setSigner(walletClient).'
552
- )
553
- }
554
-
555
- const params = step.wasmSignParams as {
556
- api_key_index?: number
557
- nonce?: number
558
- }
559
- const apiKeyIndex = params.api_key_index ?? DEFAULT_API_KEY_INDEX
560
- const nonce = params.nonce
561
- if (typeof nonce !== 'number') {
562
- throw new PerpsError(
563
- PerpsErrorCode.SDKError,
564
- 'REGISTER_API_KEY wasmSignParams is missing `nonce`.'
565
- )
566
- }
567
-
568
- const account = await getAccount(this.sdkClient, { provider, address })
569
- if (account.config.provider !== 'lighter') {
570
- throw new PerpsError(
571
- PerpsErrorCode.SDKError,
572
- `REGISTER_API_KEY requires a Lighter account, but getAccount ` +
573
- `returned config for provider '${account.config.provider}'.`
574
- )
575
- }
576
- const accountIndex = account.config.accountIndex
577
-
578
- const signer = this.getLighterSigner()
579
- const keypair = await signer.generateAPIKey()
580
- const changePubKey = await signer.signChangePubKey(
581
- keypair.publicKey,
582
- keypair.privateKey,
583
- nonce,
584
- apiKeyIndex,
585
- accountIndex
586
- )
587
-
588
- const l1Signature = await this.sdkClient.signer.signMessage({
589
- account: this.sdkClient.signer.account,
590
- message: changePubKey.messageToSign,
591
- })
592
-
593
- const txInfoWithL1Sig = signer.embedL1Signature(
594
- changePubKey.txInfo,
595
- l1Signature
188
+ return plugin.signActions(
189
+ descriptor.signingMethod,
190
+ actions,
191
+ address,
192
+ this.buildSignActionsContext(descriptor)
596
193
  )
597
-
598
- const apiKey: LighterApiKey = {
599
- accountIndex,
600
- apiKeyIndex,
601
- apiKeyPrivateKey: keypair.privateKey,
602
- apiKeyPublicKey: keypair.publicKey,
603
- }
604
- await this.getLighterKeyStore().set(address, apiKey)
605
-
606
- return {
607
- action: step.action,
608
- wasmSignParams: {
609
- ...step.wasmSignParams,
610
- new_public_key: keypair.publicKey,
611
- },
612
- signedTx: {
613
- txType: changePubKey.txType,
614
- txInfo: txInfoWithL1Sig,
615
- txHash: changePubKey.txHash,
616
- },
617
- }
618
194
  }
619
195
 
620
196
  /**
621
- * Sign an `ACCOUNT_TYPE` step (Lighter `changeAccountTier`).
622
- *
623
- * Lighter's `/api/v1/changeAccountTier` is an HTTP-only mutation
624
- * Lighter does NOT consume a wasm-signed transaction here; it
625
- * authenticates the request with the same auth token its read endpoints
626
- * use, and enforces anti-replay business rules server-side. The backend
627
- * therefore declares the step as a `WasmBlobActionStep` with
628
- * `wasmSignParams.kind = 'changeAccountTier'` and expects the SDK to
629
- * mint an auth token in lieu of a transaction signature. That contract
630
- * is documented in `lifi-perps-backend/src/providers/lighter/actions/
631
- * lighter.actions.accountType.ts` and consumed by `executeChangeAccountTier`.
632
- *
633
- * The auth-token deadline mirrors {@link createLighterAuthToken}'s 1h
634
- * default — Lighter caps tokens at 8h hard, and the backend's executor
635
- * runs `verifyPendingAction` then a single `/changeAccountTier` POST,
636
- * which completes well inside an hour.
197
+ * Assemble the per-call context the provider plugin needs in order to sign:
198
+ * the end-user's wallet and the descriptor's declared `signers`. Core
199
+ * forwards `signers` as data so the plugin can pick WHO signs; it does not
200
+ * branch on them. Provider-owned session credentials (the Hyperliquid agent
201
+ * keypair, Lighter's API key) are resolved inside the provider's
202
+ * `signActions`, not threaded through here.
637
203
  */
638
- private async signAccountTierChange(
639
- address: Address,
640
- step: WasmBlobActionStep
641
- ): Promise<WasmBlobSignedActionStep> {
642
- const apiKey = await this.getLighterKeyStore().get(address)
643
- if (!apiKey) {
644
- throw new PerpsError(
645
- PerpsErrorCode.SDKError,
646
- `No Lighter API key registered for ${address}. ` +
647
- 'Run prepareAccount / REGISTER_API_KEY first.'
648
- )
649
- }
650
- const signer = this.getLighterSigner()
651
- const deadline = Math.floor(Date.now() / 1000) + 60 * 60
652
- const authToken = await signer.createAuthToken(deadline, {
653
- apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
654
- apiKeyIndex: apiKey.apiKeyIndex,
655
- accountIndex: apiKey.accountIndex,
656
- })
657
- return {
658
- action: step.action,
659
- wasmSignParams: step.wasmSignParams,
660
- signedTx: {
661
- // `/changeAccountTier` reads only `txInfo` (the auth token); `txType`
662
- // and `txHash` are placeholders to satisfy the envelope shape.
663
- txType: 0,
664
- txInfo: authToken,
665
- txHash: '',
666
- },
204
+ private buildSignActionsContext(
205
+ descriptor: ProviderAction
206
+ ): SignActionsContext {
207
+ const ctx: SignActionsContext = { signers: descriptor.signers }
208
+ if (this.sdkClient.userWallet !== undefined) {
209
+ ctx.userWallet = this.sdkClient.userWallet
667
210
  }
211
+ return ctx
668
212
  }
669
213
 
670
214
  /**
671
- * Return a bearer token that authenticates Lighter's read endpoints
672
- * (getOrders, getOrder, getActivity, getFills).
673
- *
674
- * Resolution order:
675
- * 1. The long-lived read-only token persisted by `approveReadOnlyToken`,
676
- * when one is stored for this `(address, accountIndex)` AND has not
677
- * passed its recorded `expiry`. The SDK never returns an expired
678
- * stored token.
679
- * 2. A freshly minted 8h Lighter auth token, signed off the user's
680
- * Lighter API key. Requires `REGISTER_API_KEY` to have completed.
681
- * 3. `undefined` — caller falls back to public reads.
682
- *
683
- * `accountIndex` lets callers in pure read-only mode (no API key
684
- * registered) target the RO token. When omitted, the SDK derives it from
685
- * the user's registered API key.
215
+ * Sign a single provider setup action step by delegating to the provider
216
+ * plugin, which branches on the step's signing scheme internally. Lets
217
+ * consumers collect signed setup actions without embedding per-method
218
+ * signing logic.
686
219
  *
687
- * `deadlineSeconds` only affects the standard-token fallback (Lighter caps
688
- * those tokens at 8h). Read-only tokens carry their own mint-time expiry
689
- * recorded by {@link approveReadOnlyToken}.
220
+ * @throws {PerpsError} When the step's action is not declared by the provider.
221
+ * @public
690
222
  */
691
- async createLighterAuthToken(
692
- address: Address,
693
- deadlineSeconds?: number,
694
- accountIndex?: number
695
- ): Promise<string | undefined> {
696
- const apiKey = await this.getLighterKeyStore().get(address)
697
- const resolvedAccountIndex = accountIndex ?? apiKey?.accountIndex
698
- if (resolvedAccountIndex !== undefined) {
699
- const stored = await this.getLighterReadOnlyTokenManager().get(
700
- address,
701
- resolvedAccountIndex
702
- )
703
- if (stored) {
704
- return stored.token
705
- }
706
- }
707
- if (!apiKey) {
708
- return undefined
709
- }
710
- const deadline = deadlineSeconds ?? Math.floor(Date.now() / 1000) + 60 * 60
711
- const signer = this.getLighterSigner()
712
- return signer.createAuthToken(deadline, {
713
- apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
714
- apiKeyIndex: apiKey.apiKeyIndex,
715
- accountIndex: apiKey.accountIndex,
716
- })
717
- }
718
-
719
- /**
720
- * Mint a long-lived Lighter read-only token via Lighter's
721
- * `tokens/create` endpoint and persist it through the configured
722
- * `StorageAdapter`, keyed by `(L1 address, accountIndex)`.
723
- *
724
- * The user's connected wallet signs an EIP-191 message describing the
725
- * mint request; the resulting `Authorization` header authenticates the
726
- * Lighter HTTP call. The bearer string Lighter returns is persisted
727
- * alongside its `expiry` and `scope`; subsequent calls to
728
- * {@link createLighterAuthToken} prefer it over the 8h standard token.
729
- *
730
- * `expirySeconds` is the absolute unix-seconds expiry recorded on
731
- * Lighter's row. Lighter enforces 1 day ≤ lifetime ≤ 10 years
732
- * server-side; the SDK does NOT pre-validate and surfaces Lighter's 400
733
- * verbatim. `scope` defaults to `'all'`; the `'single'` variant is wired
734
- * through but only useful when the caller has a specific reason to scope
735
- * the token to one account.
736
- *
737
- * Requires a USER wallet signer to be set via {@link setSigner} or
738
- * passed at construction — the L1 signature is the user's consent.
739
- */
740
- async approveReadOnlyToken(
223
+ async signProviderSetupAction(
224
+ provider: string,
741
225
  address: Address,
742
- params: ApproveReadOnlyTokenParams
743
- ): Promise<ApproveReadOnlyTokenResult> {
744
- if (!this.sdkClient.signer) {
745
- throw new PerpsError(
746
- PerpsErrorCode.SDKError,
747
- 'approveReadOnlyToken requires a wallet signer — pass `signer` to ' +
748
- 'createPerpsClient or call setSigner(walletClient).'
749
- )
750
- }
751
- const signer = walletClientSigner(this.sdkClient.signer)
752
- return this.getLighterReadOnlyTokenManager().approve(signer, {
226
+ step: ActionStep
227
+ ): Promise<SignedActionStep> {
228
+ const metadata = await this.getProviderMetadata(provider)
229
+ const descriptor = findActionDescriptor(metadata, step.action)
230
+ const [signed] = await this.delegateSignActions(
231
+ provider,
753
232
  address,
754
- ...params,
755
- })
233
+ descriptor,
234
+ [step]
235
+ )
236
+ return signed
756
237
  }
757
238
 
758
239
  /**
759
- * Whether the stored Lighter read-only token for `(address, accountIndex)`
760
- * falls within `thresholdDays` of its `expiry`. Returns `false` when no
761
- * token is stored, when the stored token has already expired, or when
762
- * more than `thresholdDays` of life remain. Intended for widget renewal
763
- * banners (default threshold: 30 days).
240
+ * Build (but do not sign or submit) the unsigned action steps for `action`,
241
+ * letting the provider plugin contribute any signer-bearing request fields.
242
+ *
243
+ * @public
764
244
  */
765
- async isLighterReadOnlyTokenExpiringSoon(
766
- address: Address,
767
- accountIndex: number,
768
- thresholdDays?: number
769
- ): Promise<boolean> {
770
- return this.getLighterReadOnlyTokenManager().isReadOnlyTokenExpiringSoon(
771
- address,
772
- accountIndex,
773
- thresholdDays
774
- )
775
- }
776
-
777
- // ---------------------------------------------------------------------------
778
- // Generic action helpers
779
- // ---------------------------------------------------------------------------
780
-
781
245
  async buildAction<T extends ActionType>(
782
246
  action: T,
783
247
  params: { provider: string; address: Address; params: ActionParamsMap[T] }
784
248
  ): Promise<CreateActionResponse> {
785
- const signerAddress = await this.resolveSignerForAction(
786
- action,
787
- params.address,
788
- params.provider
789
- )
249
+ const metadata = await this.getProviderMetadata(params.provider)
250
+ const descriptor = findActionDescriptor(metadata, action)
251
+ const { signerAddress, params: signerParams } =
252
+ await this.resolveActionRequest(
253
+ params.provider,
254
+ descriptor,
255
+ params.address
256
+ )
790
257
  return createAction(this.sdkClient, {
791
258
  provider: params.provider,
792
259
  address: params.address,
793
260
  signerAddress,
794
261
  action,
795
- params: params.params,
262
+ params: {
263
+ ...params.params,
264
+ ...signerParams,
265
+ } as ActionParamsMap[T],
796
266
  })
797
267
  }
798
268
 
799
- // ---------------------------------------------------------------------------
800
- // Signing mode management
801
- // ---------------------------------------------------------------------------
802
-
803
- async setSigningMode(
804
- address: Address,
805
- provider: string,
806
- mode: SigningMode
807
- ): Promise<void> {
808
- const key = this.modeKey(address, provider)
809
- this.signingModes.set(key, mode)
810
- await this.storage.set(this.signingModeStorageKey(address, provider), mode)
811
- if (
812
- mode === SigningMode.USER_AGENT &&
813
- (await this.providerUsesAgent(provider))
814
- ) {
815
- await this.sdkClient.agentManager.getOrCreateAgent(address, provider)
816
- }
817
- }
818
-
819
- getSigningMode(address: Address, provider: string): SigningMode {
820
- return (
821
- this.signingModes.get(this.modeKey(address, provider)) ??
822
- SigningMode.USER_AGENT
823
- )
824
- }
825
-
826
- async loadSigningMode(
827
- address: Address,
828
- provider: string
829
- ): Promise<SigningMode> {
830
- const key = this.modeKey(address, provider)
831
- if (this.signingModes.has(key)) {
832
- return this.signingModes.get(key)!
833
- }
834
-
835
- const stored = await this.storage.get(
836
- this.signingModeStorageKey(address, provider)
837
- )
838
- const mode: SigningMode =
839
- stored === SigningMode.USER_AGENT || stored === SigningMode.USER
840
- ? stored
841
- : SigningMode.USER_AGENT
842
- this.signingModes.set(key, mode)
843
- return mode
844
- }
845
-
846
- async loadAgentMode(address: Address, provider: string): Promise<boolean> {
847
- const mode = await this.loadSigningMode(address, provider)
848
- return mode === SigningMode.USER_AGENT
849
- }
850
-
851
- async setAgentMode(
852
- address: Address,
853
- provider: string,
854
- useAgent: boolean
855
- ): Promise<void> {
856
- await this.setSigningMode(
857
- address,
858
- provider,
859
- useAgent ? SigningMode.USER_AGENT : SigningMode.USER
860
- )
861
- }
862
-
863
- async getAgentAddress(address: Address, provider: string): Promise<Address> {
864
- const agent = await this.sdkClient.agentManager.getAgent(address, provider)
865
- return agent.address
866
- }
867
-
868
- async hasAgent(address: Address, provider: string): Promise<boolean> {
869
- return this.sdkClient.agentManager.hasAgent(address, provider)
870
- }
871
-
872
- async removeAgent(address: Address, provider: string): Promise<void> {
873
- await this.sdkClient.agentManager.removeAgent(address, provider)
874
- this.signingModes.delete(this.modeKey(address, provider))
875
- await this.storage.remove(this.signingModeStorageKey(address, provider))
876
- }
877
-
878
- // ---------------------------------------------------------------------------
879
- // Account
880
- // ---------------------------------------------------------------------------
881
-
882
269
  /**
883
270
  * Fetch the user's account state from the backend and attach the
884
271
  * SDK-projected `settings` array — one `AccountConfigSetting` per
885
272
  * descriptor on `Provider.setup` + `Provider.options`. Callers read
886
273
  * `result.settings` directly without re-deriving values from the typed
887
274
  * `AccountConfig`.
275
+ *
276
+ * @throws {PerpsError} When the provider plugin is not registered, or the
277
+ * backend account fetch fails.
278
+ * @public
888
279
  */
889
280
  async getAccount(params: {
890
281
  provider: string
891
282
  address: Address
892
283
  }): Promise<GetAccountResult> {
284
+ const plugin = this.requireProvider(params.provider)
893
285
  const [response, metadata] = await Promise.all([
894
- getAccount(this.sdkClient, params),
286
+ fetchAccount(this.sdkClient, params),
895
287
  this.getProviderMetadata(params.provider),
896
288
  ])
897
- const settings = projectAccountConfigSettings(
289
+ const settings = plugin.projectConfig(
898
290
  response.config,
899
291
  metadata.setup,
900
292
  metadata.options
@@ -902,15 +294,34 @@ export class PerpsClient {
902
294
  return { ...response, settings }
903
295
  }
904
296
 
297
+ /**
298
+ * Roll an already-fetched {@link AccountResponse} (plus its positions) up
299
+ * into an {@link AccountSummary}, delegating to the owning provider so the
300
+ * venue-specific collateral and margin semantics are applied correctly.
301
+ */
302
+ getAccountSummary(
303
+ account: AccountResponse,
304
+ positions: Position[]
305
+ ): AccountSummary {
306
+ return this.requireProvider(account.provider).getAccountSummary(
307
+ account,
308
+ positions
309
+ )
310
+ }
311
+
905
312
  /**
906
313
  * Thin existence check for a provider account at `address`. Returns
907
314
  * `true` when `getAccount` resolves, `false` when the backend reports
908
315
  * `PerpsErrorCode.AccountNotFound`, and re-throws on any other error
909
316
  * (transport failures, validation errors, server errors).
317
+ *
318
+ * @throws {PerpsError} On any backend error other than
319
+ * `PerpsErrorCode.AccountNotFound`.
320
+ * @public
910
321
  */
911
322
  async accountExists(provider: string, address: Address): Promise<boolean> {
912
323
  try {
913
- await getAccount(this.sdkClient, { provider, address })
324
+ await fetchAccount(this.sdkClient, { provider, address })
914
325
  return true
915
326
  } catch (err) {
916
327
  if (
@@ -923,113 +334,68 @@ export class PerpsClient {
923
334
  }
924
335
  }
925
336
 
926
- // ---------------------------------------------------------------------------
927
- // Setup
928
- // ---------------------------------------------------------------------------
929
-
930
337
  /**
931
- * Return the unsatisfied entries on `Provider.setup` for this account,
932
- * split by signer role. Trading is gated on `isReady === true`.
338
+ * Return the unsatisfied entries on `Provider.setup` for this account as a
339
+ * flat, self-describing list. Trading is gated on `isReady === true`.
933
340
  *
934
341
  * `Provider.options` descriptors are NEVER returned here — options are
935
342
  * post-setup tunables and never gate trading. Option state is surfaced
936
343
  * separately via `getAccount().settings`.
344
+ *
345
+ * @public
937
346
  */
938
- async checkSetup(params: GetSetupParams): Promise<SetupResult> {
347
+ async checkSetup(params: GetSetupParams): Promise<ProviderSetup> {
939
348
  const { provider, address } = params
940
- const mode = await this.loadSigningMode(address, provider)
941
-
942
- const metadata = await this.getProviderMetadata(provider)
943
- const usesAgent = [
944
- ...metadata.setup,
945
- ...metadata.options,
946
- ...metadata.actions,
947
- ].some((d) => d.signers.includes(PerpsSigner.AGENT))
948
349
 
949
- let agentAddress: Address | undefined
950
- if (mode === SigningMode.USER_AGENT && usesAgent) {
951
- const agent = await this.sdkClient.agentManager.getOrCreateAgent(
952
- address,
953
- provider
954
- )
955
- agentAddress = agent.address
956
- }
957
-
958
- const allInputs = this.buildPrerequisiteInputs(
959
- metadata.setup,
960
- mode,
961
- agentAddress
962
- )
963
-
964
- if (allInputs.length === 0) {
965
- return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
966
- }
967
-
968
- // Build a signer lookup from setup descriptors.
969
- const signersByAction = new Map<string, PerpsSigner[]>()
970
- for (const desc of metadata.setup) {
971
- signersByAction.set(desc.type, desc.signers)
972
- }
973
-
974
- // Send all to backend via createAction for the first prerequisite type
975
- // The backend filters already-satisfied ones and returns typed data
976
- const { actions } = await this.buildPrerequisites({
977
- provider,
978
- address,
979
- signerAddress: agentAddress,
980
- })
981
-
982
- if (actions.length === 0) {
983
- return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
984
- }
985
-
986
- const userPrerequisites = actions.filter((a) => {
987
- const signers = signersByAction.get(a.action) ?? []
988
- return signers.includes(PerpsSigner.USER)
989
- })
990
- const agentPrerequisites = actions.filter((a) => {
991
- const signers = signersByAction.get(a.action) ?? []
992
- return signers.includes(PerpsSigner.AGENT)
993
- })
350
+ // The backend filters already-satisfied setup actions and returns typed
351
+ // data for those still outstanding; each plugin contributes its own
352
+ // signer-bearing request fields.
353
+ const { actions } = await this.buildProviderSetup({ provider, address })
994
354
 
995
355
  return {
996
- userPrerequisites,
997
- agentPrerequisites,
998
- isReady: false,
356
+ setup: actions,
357
+ isReady: actions.length === 0,
999
358
  }
1000
359
  }
1001
360
 
1002
- async buildPrerequisites(
1003
- params: CheckPrerequisitesParams
361
+ /**
362
+ * Build the unsigned setup `ActionStep`s still outstanding for an account,
363
+ * ordered by descriptor `sequence`. The backend filters already-satisfied
364
+ * setup; each plugin contributes its own signer-bearing request fields and
365
+ * any local-state params (e.g. Lighter's known pubkey).
366
+ *
367
+ * @public
368
+ */
369
+ async buildProviderSetup(
370
+ params: BuildProviderSetupParams
1004
371
  ): Promise<CreateActionResponse> {
1005
- const mode = await this.loadSigningMode(params.address, params.provider)
1006
- let { signerAddress } = params
1007
-
1008
- if (mode === SigningMode.USER_AGENT && !signerAddress) {
1009
- const agent = await this.sdkClient.agentManager.getAgent(
1010
- params.address,
1011
- params.provider
1012
- )
1013
- signerAddress = agent.address
1014
- }
372
+ const { provider, address } = params
1015
373
 
1016
- const metadata = await this.getProviderMetadata(params.provider)
1017
- const allInputs = this.buildPrerequisiteInputs(
1018
- metadata.setup,
1019
- mode,
1020
- signerAddress
374
+ const metadata = await this.getProviderMetadata(provider)
375
+ const orderedSetup = [...metadata.setup].sort(
376
+ (a, b) =>
377
+ (a.sequence ?? Number.MAX_SAFE_INTEGER) -
378
+ (b.sequence ?? Number.MAX_SAFE_INTEGER)
1021
379
  )
1022
380
 
1023
- // Use the first prerequisite type as the action type for the batch
1024
- // The backend handles all prerequisites in a single createPrerequisite call
381
+ const plugin = this.sdkClient.getProvider(provider)
1025
382
  const allActions: ActionStep[] = []
1026
- for (const input of allInputs) {
383
+ for (const descriptor of orderedSetup) {
384
+ const action = descriptor.type
385
+ const { signerAddress, params: signerParams } =
386
+ await this.resolveActionRequest(provider, descriptor, address)
387
+ const localParams = plugin?.resolveSetupParams
388
+ ? await plugin.resolveSetupParams(action, address)
389
+ : {}
1027
390
  const { actions } = await createAction(this.sdkClient, {
1028
- provider: params.provider,
1029
- address: params.address,
391
+ provider,
392
+ address,
1030
393
  signerAddress,
1031
- action: input.key as ActionType,
1032
- params: (input.params ?? {}) as Record<string, never>,
394
+ action,
395
+ params: {
396
+ ...signerParams,
397
+ ...localParams,
398
+ } as Record<string, never>,
1033
399
  })
1034
400
  allActions.push(...actions)
1035
401
  }
@@ -1038,272 +404,157 @@ export class PerpsClient {
1038
404
  }
1039
405
 
1040
406
  /**
1041
- * Default mode the SDK auto-applies after `APPROVE_AGENT` on a provider
1042
- * whose `options` array exposes a writable `ACCOUNT_MODE` (today
1043
- * Hyperliquid). Callers can override this through a subsequent
1044
- * `ACCOUNT_MODE` dispatch.
1045
- */
1046
- private static readonly DEFAULT_ACCOUNT_MODE = 'unifiedAccount'
1047
-
1048
- /**
1049
- * Prepare an `ACCOUNT_MODE` change by proactively reading the account's
1050
- * current `config.abstractionMode` and routing to the correct signer:
1051
- *
1052
- * - `abstractionMode == null` (never set, e.g. a fresh HL account):
1053
- * the change MAY be performed by the agent signer. Build, sign with
1054
- * the agent key, and dispatch. Returns `{ results }`.
1055
- * - `abstractionMode === mode`: idempotent no-op. Returns an empty
1056
- * results envelope without contacting `/createAction` or `/executeAction`.
1057
- * - `abstractionMode` set to any other value: HL requires a user-wallet
1058
- * signature to change the abstraction once it has been set. Build the
1059
- * action unsigned and return it as `{ fallback }` so the caller can
1060
- * surface a wallet prompt via `fallbackUserPrerequisites`.
407
+ * Submit the signed setup steps returned by `checkSetup` (and signed by the
408
+ * caller / `signProviderSetupAction`). Routes the batch on the first step's
409
+ * action and lets the plugin contribute that action's `signerAddress`.
410
+ * Throws on any per-step venue rejection.
1061
411
  *
1062
- * Network errors from `/account` propagate — we never guess the signer.
1063
- * `account.config.provider !== 'hyperliquid'` also throws: this helper
1064
- * is HL-specific and the dispatcher should never reach it for another
1065
- * provider (gated by `hasWritableAccountMode`).
412
+ * @public
1066
413
  */
1067
- private async prepareAccountModeChange(
1068
- provider: string,
1069
- address: Address,
1070
- mode: string
1071
- ): Promise<{
1072
- results?: ExecuteActionResponse
1073
- fallback?: ActionStep[]
1074
- }> {
1075
- const account = await getAccount(this.sdkClient, { provider, address })
1076
- if (account.config.provider !== 'hyperliquid') {
1077
- throw new PerpsError(
1078
- PerpsErrorCode.SDKError,
1079
- `prepareAccountModeChange is Hyperliquid-specific, but ` +
1080
- `getAccount returned config for provider ` +
1081
- `'${account.config.provider}'.`
1082
- )
1083
- }
1084
- const currentStatus = account.config.abstractionMode
414
+ async executeProviderSetup(
415
+ params: ExecuteProviderSetupParams
416
+ ): Promise<ExecuteProviderSetupResult> {
417
+ const { provider, address, setup, signedActions } = params
1085
418
 
1086
- // Idempotent short-circuit: already in the requested mode.
1087
- if (currentStatus === mode) {
1088
- return {}
419
+ if (signedActions.length === 0) {
420
+ return { results: { results: [] } }
1089
421
  }
1090
422
 
1091
- // Never set the agent is authorised to perform the change.
1092
- if (currentStatus == null) {
1093
- const agent = await this.sdkClient.agentManager.getAgent(
1094
- address,
1095
- provider
1096
- )
1097
-
1098
- const { actions } = await createAction(this.sdkClient, {
1099
- provider,
1100
- address,
1101
- signerAddress: agent.address,
1102
- action: ActionType.ACCOUNT_MODE,
1103
- params: { mode } satisfies ActionParamsMap[ActionType.ACCOUNT_MODE],
1104
- })
1105
-
1106
- if (actions.length === 0) {
1107
- // Backend's per-mode early-exit (defensive — shouldn't fire given
1108
- // the short-circuit above, but covers a race between our /account
1109
- // read and the backend's view of the current status).
1110
- return { results: { results: [] } }
1111
- }
1112
-
1113
- const signedActions: SignedActionStep[] = await Promise.all(
1114
- (actions as Eip712ActionStep[]).map(
1115
- async (a): Promise<Eip712SignedActionStep> => ({
1116
- action: a.action,
1117
- typedData: a.typedData,
1118
- signature: await signTypedData(agent.privateKey, a.typedData),
1119
- })
1120
- )
1121
- )
1122
-
1123
- const results = await executeAction(this.sdkClient, {
1124
- provider,
1125
- address,
1126
- signerAddress: agent.address,
1127
- action: ActionType.ACCOUNT_MODE,
1128
- actions: signedActions,
1129
- })
1130
-
1131
- return { results }
1132
- }
423
+ const action = setup[0]?.action ?? signedActions[0].action
424
+ const metadata = await this.getProviderMetadata(provider)
425
+ const descriptor = findActionDescriptor(metadata, action)
426
+ const { signerAddress } = await this.resolveActionRequest(
427
+ provider,
428
+ descriptor,
429
+ address
430
+ )
1133
431
 
1134
- // Already set to a different mode → HL requires a user-wallet signature.
1135
- // Build the action unsigned and surface it as a fallback to the caller.
1136
- const { actions: fallbackActions } = await createAction(this.sdkClient, {
432
+ const results = await executeAction(this.sdkClient, {
1137
433
  provider,
1138
434
  address,
1139
- action: ActionType.ACCOUNT_MODE,
1140
- params: { mode } satisfies ActionParamsMap[ActionType.ACCOUNT_MODE],
435
+ // The submitting account: the plugin-resolved signer (Hyperliquid's
436
+ // agent) when present, else the end-user's address.
437
+ signerAddress: signerAddress ?? address,
438
+ action,
439
+ actions: signedActions,
1141
440
  })
1142
441
 
1143
- return {
1144
- fallback: fallbackActions.length > 0 ? fallbackActions : undefined,
442
+ const failure = results.results.find((r) => !r.success)
443
+ if (failure) {
444
+ throw new PerpsError(PerpsErrorCode.ExchangeRejected, failure.error)
1145
445
  }
1146
- }
1147
446
 
1148
- /**
1149
- * True when the provider exposes an `ACCOUNT_MODE` descriptor (in `setup`
1150
- * or `options`) whose `mode` Param has a writable enumeration of values.
1151
- * Providers that omit `ACCOUNT_MODE` or expose it as read-only / free-form
1152
- * input return false.
1153
- */
1154
- private static hasWritableAccountMode(metadata: Provider): boolean {
1155
- const item = [...metadata.setup, ...metadata.options].find(
1156
- (i) => i.type === ActionType.ACCOUNT_MODE
1157
- )
1158
- if (!item) {
1159
- return false
1160
- }
1161
- const modeParam = item.params.find((p) => p.name === 'mode')
1162
- if (!modeParam) {
1163
- return false
1164
- }
1165
- // Writable multi-option: `values` enumerates choices and `readOnly`
1166
- // is not set (treat absence as writable, matching the descriptor
1167
- // contract in `Param`).
1168
- if (!modeParam.values || modeParam.values.length === 0) {
1169
- return false
1170
- }
1171
- return !modeParam.readOnly
447
+ return { results }
1172
448
  }
1173
449
 
1174
450
  /**
1175
- * Submit the signed setup steps returned by `checkSetup` (and seeded
1176
- * with user-wallet signatures by the caller). Internally splits into:
451
+ * Sign and submit one pre-staged setup `ActionStep` end-to-end.
452
+ *
453
+ * The caller is expected to have already obtained the step from a prior
454
+ * {@link checkSetup} call (typically cached by the widget's react-query) —
455
+ * we do NOT refetch. This avoids the double `createAction` round-trip and
456
+ * keeps the nonce that was allocated at staging time committed all the way
457
+ * through submit. If the cached step has gone stale (Lighter's `/nextNonce`
458
+ * advanced underneath us), `executeProviderSetup` will surface a nonce
459
+ * conflict that the caller invalidates on, refetches `checkSetup`, and
460
+ * retries with a fresh step.
1177
461
  *
1178
- * 1. Submit user-signed setup actions.
1179
- * 2. After a successful `APPROVE_AGENT`, auto-upgrade `ACCOUNT_MODE`
1180
- * to the SDK's default when the provider exposes a writable
1181
- * `ACCOUNT_MODE` Param (Hyperliquid today). The SDK reads
1182
- * `account.config.abstractionMode` to choose the signer: `null` →
1183
- * agent dispatch; non-null → wallet fallback returned in
1184
- * `fallbackUserPrerequisites`.
1185
- * 3. Sign and submit any pre-staged agent-side setup actions the
1186
- * backend returned alongside the user-signed ones.
462
+ * @throws {PerpsError} When the step's action is not in the provider's
463
+ * `setup` descriptors.
464
+ * @public
1187
465
  */
1188
- async satisfySetup(params: SatisfySetupParams): Promise<SatisfySetupResult> {
1189
- const { provider, address, required, userSignedActions } = params
1190
- const mode = await this.loadSigningMode(address, provider)
1191
-
1192
- // 1. Submit user-signed prerequisites
1193
- let userResults: ExecuteActionResponse = { results: [] }
1194
- if (userSignedActions.length > 0) {
1195
- const signerAddress =
1196
- mode === SigningMode.USER_AGENT
1197
- ? (await this.sdkClient.agentManager.getAgent(address, provider))
1198
- .address
1199
- : address
1200
-
1201
- // Submit all user-signed actions — use first action's type for routing
1202
- const firstAction = required.userPrerequisites[0]?.action as string
1203
- userResults = await executeAction(this.sdkClient, {
1204
- provider,
1205
- address,
1206
- signerAddress,
1207
- action: (firstAction ?? ActionType.APPROVE_AGENT) as ActionType,
1208
- actions: userSignedActions,
1209
- })
1210
-
1211
- const mandatoryFailure = userResults.results.find((r) => !r.success)
1212
- if (mandatoryFailure) {
1213
- return { userResults }
1214
- }
1215
- }
466
+ async executeProviderSetupAction(params: {
467
+ provider: string
468
+ address: Address
469
+ step: ActionStep
470
+ }): Promise<void> {
471
+ const { provider, address, step } = params
1216
472
 
1217
- // 2. Auto-upgrade ACCOUNT_MODE after APPROVE_AGENT.
1218
- //
1219
- // When the user-signed setup included a successful APPROVE_AGENT, the
1220
- // freshly approved agent is now authorised to sign account-level
1221
- // actions for accounts whose abstraction has never been set. If the
1222
- // provider exposes a writable `ACCOUNT_MODE` descriptor (Hyperliquid
1223
- // today), the SDK reads `account.config.abstractionMode` to decide
1224
- // the signer: `null` → agent-dispatch silently to the SDK's preferred
1225
- // default; non-null → return a wallet-signing fallback step. Either
1226
- // way the chain does NOT abort onboarding — `ACCOUNT_MODE` lives on
1227
- // `Provider.options`, not `Provider.setup`, and so does not gate
1228
- // trading.
1229
- let agentResults: ExecuteActionResponse | undefined
1230
- let fallbackUserPrerequisites: ActionStep[] | undefined
1231
- if (mode === SigningMode.USER_AGENT) {
1232
- const justApprovedAgent = userResults.results.some(
1233
- (r) => r.success && r.action === ActionType.APPROVE_AGENT
473
+ const metadata = await this.getProviderMetadata(provider)
474
+ const descriptor = metadata.setup.find((d) => d.type === step.action)
475
+ if (!descriptor) {
476
+ throw new PerpsError(
477
+ PerpsErrorCode.SDKError,
478
+ `Action '${step.action}' is not in '${provider}'.setup`
1234
479
  )
1235
- if (justApprovedAgent) {
1236
- const metadata = await this.getProviderMetadata(provider)
1237
- if (PerpsClient.hasWritableAccountMode(metadata)) {
1238
- const upgrade = await this.prepareAccountModeChange(
1239
- provider,
1240
- address,
1241
- PerpsClient.DEFAULT_ACCOUNT_MODE
1242
- )
1243
- agentResults = upgrade.results
1244
- fallbackUserPrerequisites = upgrade.fallback
1245
- }
1246
- }
1247
480
  }
1248
481
 
1249
- // 3. Sign and submit any pre-staged agent prerequisites returned by the
1250
- // backend's `buildPrerequisites` call. ACCOUNT_MODE is filtered out of
1251
- // bulk staging (it requires explicit `mode` params), so this block
1252
- // today only runs for future agent-signed steps the backend chooses
1253
- // to stage.
1254
- if (
1255
- required.agentPrerequisites.length > 0 &&
1256
- mode === SigningMode.USER_AGENT
1257
- ) {
1258
- const agent = await this.sdkClient.agentManager.getAgent(
1259
- address,
1260
- provider
1261
- )
1262
-
1263
- const signedAgentActions: SignedActionStep[] = await Promise.all(
1264
- (required.agentPrerequisites as Eip712ActionStep[]).map(
1265
- async (action) =>
1266
- ({
1267
- action: action.action,
1268
- typedData: action.typedData,
1269
- signature: await signTypedData(
1270
- agent.privateKey,
1271
- action.typedData
1272
- ),
1273
- }) satisfies Eip712SignedActionStep
1274
- )
1275
- )
1276
-
1277
- const firstAction = required.agentPrerequisites[0]?.action as string
1278
- const stagedResults = await executeAction(this.sdkClient, {
1279
- provider,
1280
- address,
1281
- signerAddress: agent.address,
1282
- action: (firstAction ?? ActionType.ACCOUNT_MODE) as ActionType,
1283
- actions: signedAgentActions,
1284
- })
1285
-
1286
- // Merge staged-prereq results with any auto-upgrade results from step 2.
1287
- agentResults = {
1288
- results: [...(agentResults?.results ?? []), ...stagedResults.results],
1289
- }
1290
- }
482
+ const signed = await this.signProviderSetupAction(provider, address, step)
483
+ await this.executeProviderSetup({
484
+ provider,
485
+ address,
486
+ setup: [step],
487
+ signedActions: [signed],
488
+ })
489
+ }
1291
490
 
1292
- return {
1293
- userResults,
1294
- ...(agentResults ? { agentResults } : {}),
1295
- ...(fallbackUserPrerequisites ? { fallbackUserPrerequisites } : {}),
491
+ /**
492
+ * Sign and submit a single provider-option change (a `Provider.options`
493
+ * tunable such as Lighter `ACCOUNT_TYPE` or Hyperliquid `ACCOUNT_MODE`)
494
+ * end-to-end, throwing on a venue rejection.
495
+ *
496
+ * Options are dispatched through the same {@link execute} pipeline as
497
+ * trades, but unlike a trade an option change is a single mandatory action:
498
+ * a per-action `success: false` (returned as a 200 OK) means the user's
499
+ * selection was rejected and must surface, not be silently dropped. This
500
+ * wrapper inspects the result and throws a {@link PerpsError} carrying the
501
+ * venue `error`, giving options the same throw contract that setup has via
502
+ * {@link executeProviderSetupAction}. The only structural difference is that
503
+ * an option carries `params` (the selected value) rather than a pre-staged
504
+ * step.
505
+ *
506
+ * `execute` itself is unchanged — it still returns results without throwing,
507
+ * which the trade hooks rely on for partial-fill handling.
508
+ *
509
+ * @throws {PerpsError} `PerpsErrorCode.ExchangeRejected` carrying the venue
510
+ * error when any returned result has `success: false`; also the errors
511
+ * `execute` itself can throw (unregistered provider, no signer, signing
512
+ * failure).
513
+ * @public
514
+ */
515
+ async executeProviderOption<T extends ActionType>(params: {
516
+ provider: string
517
+ address: Address
518
+ action: T
519
+ params: ActionParamsMap[T]
520
+ }): Promise<void> {
521
+ const { results } = await this.execute(params)
522
+ const failure = results.find((r) => !r.success)
523
+ if (failure) {
524
+ throw new PerpsError(PerpsErrorCode.ExchangeRejected, failure.error)
1296
525
  }
1297
526
  }
1298
527
 
1299
- // ---------------------------------------------------------------------------
1300
- // Typed action helpers
1301
- // ---------------------------------------------------------------------------
1302
-
528
+ /**
529
+ * Place a market or limit order. Convenience wrapper over {@link execute}
530
+ * with `ActionType.PLACE_ORDER`.
531
+ *
532
+ * @throws {PerpsError} When the provider is unregistered or the action
533
+ * cannot be signed/submitted.
534
+ * @example
535
+ * ```ts
536
+ * await client.placeOrder({
537
+ * provider: 'hyperliquid',
538
+ * address: '0xUser',
539
+ * market: { symbol: 'ETH' },
540
+ * side: 'buy',
541
+ * size: '0.1',
542
+ * })
543
+ * ```
544
+ * @public
545
+ */
1303
546
  async placeOrder(params: PlaceOrderParams): Promise<ExecuteActionResponse> {
1304
547
  return this.execute({ ...params, action: ActionType.PLACE_ORDER, params })
1305
548
  }
1306
549
 
550
+ /**
551
+ * Place a trigger (take-profit / stop-loss) order. Convenience wrapper over
552
+ * {@link execute} with `ActionType.PLACE_TRIGGER_ORDER`.
553
+ *
554
+ * @throws {PerpsError} When the provider is unregistered or the action
555
+ * cannot be signed/submitted.
556
+ * @public
557
+ */
1307
558
  async placeTriggerOrder(
1308
559
  params: PlaceTriggerOrderParams
1309
560
  ): Promise<ExecuteActionResponse> {
@@ -1314,22 +565,46 @@ export class PerpsClient {
1314
565
  })
1315
566
  }
1316
567
 
568
+ /**
569
+ * Cancel one or more open orders. Convenience wrapper over {@link execute}
570
+ * with `ActionType.CANCEL_ORDER`.
571
+ *
572
+ * @throws {PerpsError} When the provider is unregistered or the action
573
+ * cannot be signed/submitted.
574
+ * @public
575
+ */
1317
576
  async cancelOrders(
1318
577
  params: CancelOrdersParams
1319
578
  ): Promise<ExecuteActionResponse> {
1320
579
  return this.execute({ ...params, action: ActionType.CANCEL_ORDER, params })
1321
580
  }
1322
581
 
582
+ /**
583
+ * Modify one or more open orders. Convenience wrapper over {@link execute}
584
+ * with `ActionType.MODIFY_ORDER`.
585
+ *
586
+ * @throws {PerpsError} When the provider is unregistered or the action
587
+ * cannot be signed/submitted.
588
+ * @public
589
+ */
1323
590
  async modifyOrders(
1324
591
  params: ModifyOrdersParams
1325
592
  ): Promise<ExecuteActionResponse> {
1326
593
  return this.execute({ ...params, action: ActionType.MODIFY_ORDER, params })
1327
594
  }
1328
595
 
596
+ /**
597
+ * Add or remove isolated-position margin. Convenience wrapper over
598
+ * {@link execute} with `ActionType.UPDATE_POSITION_MARGIN`.
599
+ *
600
+ * @throws {PerpsError} When the provider is unregistered or the action
601
+ * cannot be signed/submitted.
602
+ * @public
603
+ */
1329
604
  async updatePositionMargin(params: {
1330
605
  provider: string
1331
606
  address: Address
1332
- asset: AssetIdentity
607
+ market: MarketRef
1333
608
  action: 'add' | 'remove'
1334
609
  amount: string
1335
610
  }): Promise<ExecuteActionResponse> {
@@ -1340,6 +615,14 @@ export class PerpsClient {
1340
615
  })
1341
616
  }
1342
617
 
618
+ /**
619
+ * Withdraw funds from the provider account. Convenience wrapper over
620
+ * {@link execute} with `ActionType.WITHDRAWAL`.
621
+ *
622
+ * @throws {PerpsError} When the provider is unregistered or the action
623
+ * cannot be signed/submitted.
624
+ * @public
625
+ */
1343
626
  async withdraw(params: WithdrawParams): Promise<ExecuteActionResponse> {
1344
627
  return this.execute({
1345
628
  provider: params.provider,
@@ -1350,48 +633,54 @@ export class PerpsClient {
1350
633
  }
1351
634
 
1352
635
  /**
1353
- * Execute any action through the SDK's signing pipeline. Signing is routed
1354
- * by the action's descriptor in provider metadata the agent keypair, the
1355
- * configured WalletClient signer, the Lighter API key, or an EVM tx — as
1356
- * the descriptor's `signers` and `signingMethod` dictate.
636
+ * Execute any action through the SDK's signing pipeline: fetch the unsigned
637
+ * steps, delegate signing to the provider plugin (which branches on the
638
+ * descriptor's scheme and signer internally), and submit. Core stays
639
+ * signer-agnostic — the plugin owns WHO signs and HOW.
640
+ *
641
+ * @throws {PerpsError} When the action is not declared by the provider,
642
+ * the plugin cannot sign it, or submission fails.
643
+ * @public
1357
644
  */
1358
645
  async execute<T extends ActionType>(params: {
1359
646
  provider: string
1360
647
  address: Address
1361
- signerAddress?: Address
1362
648
  action: T
1363
649
  params: ActionParamsMap[T]
1364
650
  }): Promise<ExecuteActionResponse> {
1365
- await this.loadSigningMode(params.address, params.provider)
1366
- const metadata = await this.getProviderMetadata(params.provider)
1367
- const descriptor = findActionDescriptor(metadata, params.action)
651
+ const { provider, address, action } = params
652
+ const metadata = await this.getProviderMetadata(provider)
653
+ const descriptor = findActionDescriptor(metadata, action)
1368
654
 
1369
- let lastError: unknown
1370
- for (let attempt = 0; attempt < MAX_NONCE_RETRIES; attempt++) {
1371
- const { actions } = await this.buildAction(params.action, {
1372
- provider: params.provider,
1373
- address: params.address,
1374
- params: params.params,
1375
- })
1376
- try {
1377
- return await this.autoSignAndExecute(
1378
- params.provider,
1379
- params.address,
1380
- params.action,
1381
- actions,
1382
- descriptor
1383
- )
1384
- } catch (err) {
1385
- if (
1386
- err instanceof PerpsError &&
1387
- err.code === PerpsErrorCode.InvalidNonce
1388
- ) {
1389
- lastError = err
1390
- continue
1391
- }
1392
- throw err
1393
- }
1394
- }
1395
- throw lastError
655
+ const { signerAddress, params: signerParams } =
656
+ await this.resolveActionRequest(provider, descriptor, address)
657
+
658
+ const { actions } = await createAction(this.sdkClient, {
659
+ provider,
660
+ address,
661
+ signerAddress,
662
+ action,
663
+ params: {
664
+ ...params.params,
665
+ ...signerParams,
666
+ } as ActionParamsMap[T],
667
+ })
668
+
669
+ const signedActions = await this.delegateSignActions(
670
+ provider,
671
+ address,
672
+ descriptor,
673
+ actions
674
+ )
675
+
676
+ return executeAction(this.sdkClient, {
677
+ provider,
678
+ address,
679
+ // The submitting account: the plugin-resolved signer (Hyperliquid's
680
+ // agent) when present, else the end-user's address.
681
+ signerAddress: signerAddress ?? address,
682
+ action,
683
+ actions: signedActions,
684
+ })
1396
685
  }
1397
686
  }