@lifi/perps-sdk 0.1.1-alpha.4 → 0.1.1-alpha.40

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 (595) hide show
  1. package/README.md +38 -15
  2. package/dist/cjs/agent/AgentManager.d.ts +5 -5
  3. package/dist/cjs/agent/AgentManager.d.ts.map +1 -1
  4. package/dist/cjs/agent/AgentManager.js +16 -14
  5. package/dist/cjs/agent/AgentManager.js.map +1 -1
  6. package/dist/cjs/client/PerpsClient.d.ts +70 -21
  7. package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
  8. package/dist/cjs/client/PerpsClient.js +323 -175
  9. package/dist/cjs/client/PerpsClient.js.map +1 -1
  10. package/dist/cjs/client/createPerpsClient.d.ts +12 -2
  11. package/dist/cjs/client/createPerpsClient.d.ts.map +1 -1
  12. package/dist/cjs/client/createPerpsClient.js +6 -5
  13. package/dist/cjs/client/createPerpsClient.js.map +1 -1
  14. package/dist/cjs/client/types.d.ts +42 -25
  15. package/dist/cjs/client/types.d.ts.map +1 -1
  16. package/dist/cjs/client/types.js +6 -0
  17. package/dist/cjs/client/types.js.map +1 -1
  18. package/dist/cjs/errors/PerpsError.d.ts +2 -3
  19. package/dist/cjs/errors/PerpsError.d.ts.map +1 -1
  20. package/dist/cjs/errors/PerpsError.js +3 -15
  21. package/dist/cjs/errors/PerpsError.js.map +1 -1
  22. package/dist/cjs/errors/constants.d.ts +0 -10
  23. package/dist/cjs/errors/constants.d.ts.map +1 -1
  24. package/dist/cjs/errors/constants.js +1 -12
  25. package/dist/cjs/errors/constants.js.map +1 -1
  26. package/dist/cjs/index.d.ts +31 -32
  27. package/dist/cjs/index.d.ts.map +1 -1
  28. package/dist/cjs/index.js +58 -42
  29. package/dist/cjs/index.js.map +1 -1
  30. package/dist/cjs/realtime/PerpsWsClient.d.ts +1 -0
  31. package/dist/cjs/realtime/PerpsWsClient.d.ts.map +1 -1
  32. package/dist/cjs/realtime/PerpsWsClient.js +28 -23
  33. package/dist/cjs/realtime/PerpsWsClient.js.map +1 -1
  34. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts +9 -5
  35. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
  36. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js +162 -52
  37. package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js.map +1 -1
  38. package/dist/cjs/realtime/hyperliquid/types.d.ts +11 -9
  39. package/dist/cjs/realtime/hyperliquid/types.d.ts.map +1 -1
  40. package/dist/cjs/services/createAction.d.ts +11 -0
  41. package/dist/cjs/services/createAction.d.ts.map +1 -0
  42. package/dist/cjs/services/{submitAuthorization.js → createAction.js} +7 -6
  43. package/dist/cjs/services/createAction.js.map +1 -0
  44. package/dist/cjs/services/executeAction.d.ts +11 -0
  45. package/dist/cjs/services/executeAction.d.ts.map +1 -0
  46. package/dist/cjs/services/{submitOrder.js → executeAction.js} +6 -5
  47. package/dist/cjs/services/executeAction.js.map +1 -0
  48. package/dist/cjs/services/getAccount.d.ts +1 -1
  49. package/dist/cjs/services/getAccount.d.ts.map +1 -1
  50. package/dist/cjs/services/getAccount.js +1 -1
  51. package/dist/cjs/services/getAccount.js.map +1 -1
  52. package/dist/cjs/services/getActivity.d.ts +13 -0
  53. package/dist/cjs/services/getActivity.d.ts.map +1 -0
  54. package/dist/cjs/services/getActivity.js +21 -0
  55. package/dist/cjs/services/getActivity.js.map +1 -0
  56. package/dist/cjs/services/getAsset.d.ts +8 -0
  57. package/dist/cjs/services/getAsset.d.ts.map +1 -0
  58. package/dist/cjs/services/{getMarkets.js → getAsset.js} +6 -4
  59. package/dist/cjs/services/getAsset.js.map +1 -0
  60. package/dist/cjs/services/getAssets.d.ts +7 -0
  61. package/dist/cjs/services/getAssets.d.ts.map +1 -0
  62. package/dist/cjs/services/{getMarket.js → getAssets.js} +5 -5
  63. package/dist/cjs/services/getAssets.js.map +1 -0
  64. package/dist/cjs/services/getFills.d.ts +12 -0
  65. package/dist/cjs/services/getFills.d.ts.map +1 -0
  66. package/dist/cjs/services/{getHistory.js → getFills.js} +7 -5
  67. package/dist/cjs/services/getFills.js.map +1 -0
  68. package/dist/cjs/services/getOhlcv.d.ts +1 -1
  69. package/dist/cjs/services/getOhlcv.d.ts.map +1 -1
  70. package/dist/cjs/services/getOhlcv.js +1 -1
  71. package/dist/cjs/services/getOhlcv.js.map +1 -1
  72. package/dist/cjs/services/getOrder.d.ts +1 -1
  73. package/dist/cjs/services/getOrder.d.ts.map +1 -1
  74. package/dist/cjs/services/getOrder.js +1 -1
  75. package/dist/cjs/services/getOrder.js.map +1 -1
  76. package/dist/cjs/services/getOrderbook.d.ts +1 -1
  77. package/dist/cjs/services/getOrderbook.d.ts.map +1 -1
  78. package/dist/cjs/services/getOrderbook.js +1 -1
  79. package/dist/cjs/services/getOrderbook.js.map +1 -1
  80. package/dist/cjs/services/getOrders.d.ts +11 -0
  81. package/dist/cjs/services/getOrders.d.ts.map +1 -0
  82. package/dist/cjs/services/getOrders.js +15 -0
  83. package/dist/cjs/services/getOrders.js.map +1 -0
  84. package/dist/cjs/services/getPositions.d.ts +11 -0
  85. package/dist/cjs/services/getPositions.d.ts.map +1 -0
  86. package/dist/cjs/services/getPositions.js +15 -0
  87. package/dist/cjs/services/getPositions.js.map +1 -0
  88. package/dist/cjs/services/getPrices.d.ts +1 -1
  89. package/dist/cjs/services/getPrices.d.ts.map +1 -1
  90. package/dist/cjs/services/getPrices.js +1 -1
  91. package/dist/cjs/services/getPrices.js.map +1 -1
  92. package/dist/cjs/services/getProviders.d.ts +4 -0
  93. package/dist/cjs/services/getProviders.d.ts.map +1 -0
  94. package/dist/cjs/services/{getDexes.js → getProviders.js} +4 -4
  95. package/dist/cjs/services/getProviders.js.map +1 -0
  96. package/dist/cjs/utils/accountSummary.d.ts +9 -0
  97. package/dist/cjs/utils/accountSummary.d.ts.map +1 -0
  98. package/dist/cjs/utils/accountSummary.js +81 -0
  99. package/dist/cjs/utils/accountSummary.js.map +1 -0
  100. package/dist/cjs/utils/calculations.d.ts +16 -0
  101. package/dist/cjs/utils/calculations.d.ts.map +1 -0
  102. package/dist/cjs/utils/calculations.js +71 -0
  103. package/dist/cjs/utils/calculations.js.map +1 -0
  104. package/dist/cjs/utils/hyperliquid/index.d.ts +3 -0
  105. package/dist/cjs/utils/hyperliquid/index.d.ts.map +1 -0
  106. package/dist/cjs/utils/hyperliquid/index.js +11 -0
  107. package/dist/cjs/utils/hyperliquid/index.js.map +1 -0
  108. package/dist/cjs/utils/hyperliquid/liquidation.d.ts +3 -0
  109. package/dist/cjs/utils/hyperliquid/liquidation.d.ts.map +1 -0
  110. package/dist/cjs/utils/hyperliquid/liquidation.js +24 -0
  111. package/dist/cjs/utils/hyperliquid/liquidation.js.map +1 -0
  112. package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts +4 -0
  113. package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
  114. package/dist/cjs/utils/hyperliquid/orderFormatting.js +33 -0
  115. package/dist/cjs/utils/hyperliquid/orderFormatting.js.map +1 -0
  116. package/dist/cjs/utils/orderClassification.d.ts +8 -0
  117. package/dist/cjs/utils/orderClassification.d.ts.map +1 -0
  118. package/dist/cjs/utils/orderClassification.js +39 -0
  119. package/dist/cjs/utils/orderClassification.js.map +1 -0
  120. package/dist/cjs/utils/parse.d.ts +2 -0
  121. package/dist/cjs/utils/parse.d.ts.map +1 -0
  122. package/dist/cjs/utils/parse.js +14 -0
  123. package/dist/cjs/utils/parse.js.map +1 -0
  124. package/dist/cjs/utils/request.d.ts.map +1 -1
  125. package/dist/cjs/utils/request.js +16 -4
  126. package/dist/cjs/utils/request.js.map +1 -1
  127. package/dist/cjs/utils/units.d.ts +3 -0
  128. package/dist/cjs/utils/units.d.ts.map +1 -0
  129. package/dist/cjs/utils/units.js +18 -0
  130. package/dist/cjs/utils/units.js.map +1 -0
  131. package/dist/cjs/utils/validation.d.ts +2 -0
  132. package/dist/cjs/utils/validation.d.ts.map +1 -0
  133. package/dist/cjs/utils/validation.js +16 -0
  134. package/dist/cjs/utils/validation.js.map +1 -0
  135. package/dist/cjs/version.d.ts +1 -1
  136. package/dist/cjs/version.d.ts.map +1 -1
  137. package/dist/cjs/version.js +1 -1
  138. package/dist/cjs/version.js.map +1 -1
  139. package/dist/esm/agent/AgentManager.d.ts +9 -9
  140. package/dist/esm/agent/AgentManager.d.ts.map +1 -1
  141. package/dist/esm/agent/AgentManager.js +20 -18
  142. package/dist/esm/agent/AgentManager.js.map +1 -1
  143. package/dist/esm/agent/storage.d.ts +1 -1
  144. package/dist/esm/agent/storage.js +1 -1
  145. package/dist/esm/client/PerpsClient.d.ts +70 -189
  146. package/dist/esm/client/PerpsClient.d.ts.map +1 -1
  147. package/dist/esm/client/PerpsClient.js +355 -361
  148. package/dist/esm/client/PerpsClient.js.map +1 -1
  149. package/dist/esm/client/createPerpsClient.d.ts +30 -7
  150. package/dist/esm/client/createPerpsClient.d.ts.map +1 -1
  151. package/dist/esm/client/createPerpsClient.js +6 -6
  152. package/dist/esm/client/createPerpsClient.js.map +1 -1
  153. package/dist/esm/client/types.d.ts +75 -48
  154. package/dist/esm/client/types.d.ts.map +1 -1
  155. package/dist/esm/client/types.js +11 -1
  156. package/dist/esm/client/types.js.map +1 -1
  157. package/dist/esm/errors/PerpsError.d.ts +2 -3
  158. package/dist/esm/errors/PerpsError.d.ts.map +1 -1
  159. package/dist/esm/errors/PerpsError.js +3 -15
  160. package/dist/esm/errors/PerpsError.js.map +1 -1
  161. package/dist/esm/errors/constants.d.ts +0 -10
  162. package/dist/esm/errors/constants.d.ts.map +1 -1
  163. package/dist/esm/errors/constants.js +0 -11
  164. package/dist/esm/errors/constants.js.map +1 -1
  165. package/dist/esm/index.d.ts +31 -32
  166. package/dist/esm/index.d.ts.map +1 -1
  167. package/dist/esm/index.js +22 -23
  168. package/dist/esm/index.js.map +1 -1
  169. package/dist/esm/realtime/PerpsWsClient.d.ts +1 -0
  170. package/dist/esm/realtime/PerpsWsClient.d.ts.map +1 -1
  171. package/dist/esm/realtime/PerpsWsClient.js +30 -23
  172. package/dist/esm/realtime/PerpsWsClient.js.map +1 -1
  173. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts +11 -5
  174. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
  175. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js +174 -53
  176. package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js.map +1 -1
  177. package/dist/esm/realtime/hyperliquid/types.d.ts +11 -9
  178. package/dist/esm/realtime/hyperliquid/types.d.ts.map +1 -1
  179. package/dist/esm/services/createAction.d.ts +11 -0
  180. package/dist/esm/services/createAction.d.ts.map +1 -0
  181. package/dist/esm/services/createAction.js +14 -0
  182. package/dist/esm/services/createAction.js.map +1 -0
  183. package/dist/esm/services/executeAction.d.ts +11 -0
  184. package/dist/esm/services/executeAction.d.ts.map +1 -0
  185. package/dist/esm/services/executeAction.js +14 -0
  186. package/dist/esm/services/executeAction.js.map +1 -0
  187. package/dist/esm/services/getAccount.d.ts +7 -7
  188. package/dist/esm/services/getAccount.d.ts.map +1 -1
  189. package/dist/esm/services/getAccount.js +6 -6
  190. package/dist/esm/services/getAccount.js.map +1 -1
  191. package/dist/esm/services/getActivity.d.ts +49 -0
  192. package/dist/esm/services/getActivity.d.ts.map +1 -0
  193. package/dist/esm/services/getActivity.js +47 -0
  194. package/dist/esm/services/getActivity.js.map +1 -0
  195. package/dist/esm/services/getAsset.d.ts +20 -0
  196. package/dist/esm/services/getAsset.d.ts.map +1 -0
  197. package/dist/esm/services/getAsset.js +18 -0
  198. package/dist/esm/services/getAsset.js.map +1 -0
  199. package/dist/esm/services/getAssets.d.ts +18 -0
  200. package/dist/esm/services/getAssets.d.ts.map +1 -0
  201. package/dist/esm/services/getAssets.js +18 -0
  202. package/dist/esm/services/getAssets.js.map +1 -0
  203. package/dist/{types/services/getHistory.d.ts → esm/services/getFills.d.ts} +17 -13
  204. package/dist/esm/services/getFills.d.ts.map +1 -0
  205. package/dist/esm/services/{getHistory.js → getFills.js} +13 -11
  206. package/dist/esm/services/getFills.js.map +1 -0
  207. package/dist/esm/services/getOhlcv.d.ts +4 -4
  208. package/dist/esm/services/getOhlcv.d.ts.map +1 -1
  209. package/dist/esm/services/getOhlcv.js +3 -3
  210. package/dist/esm/services/getOhlcv.js.map +1 -1
  211. package/dist/esm/services/getOrder.d.ts +4 -4
  212. package/dist/esm/services/getOrder.d.ts.map +1 -1
  213. package/dist/esm/services/getOrder.js +3 -3
  214. package/dist/esm/services/getOrder.js.map +1 -1
  215. package/dist/esm/services/getOrderbook.d.ts +4 -4
  216. package/dist/esm/services/getOrderbook.d.ts.map +1 -1
  217. package/dist/esm/services/getOrderbook.js +3 -3
  218. package/dist/esm/services/getOrderbook.js.map +1 -1
  219. package/dist/esm/services/getOrders.d.ts +27 -0
  220. package/dist/esm/services/getOrders.d.ts.map +1 -0
  221. package/dist/esm/services/getOrders.js +23 -0
  222. package/dist/esm/services/getOrders.js.map +1 -0
  223. package/dist/esm/services/getPositions.d.ts +27 -0
  224. package/dist/esm/services/getPositions.d.ts.map +1 -0
  225. package/dist/esm/services/getPositions.js +23 -0
  226. package/dist/esm/services/getPositions.js.map +1 -0
  227. package/dist/esm/services/getPrices.d.ts +5 -5
  228. package/dist/esm/services/getPrices.d.ts.map +1 -1
  229. package/dist/esm/services/getPrices.js +4 -4
  230. package/dist/esm/services/getPrices.js.map +1 -1
  231. package/dist/esm/services/getProviders.d.ts +20 -0
  232. package/dist/esm/services/getProviders.d.ts.map +1 -0
  233. package/dist/esm/services/getProviders.js +21 -0
  234. package/dist/esm/services/getProviders.js.map +1 -0
  235. package/dist/esm/utils/accountSummary.d.ts +13 -0
  236. package/dist/esm/utils/accountSummary.d.ts.map +1 -0
  237. package/dist/esm/utils/accountSummary.js +92 -0
  238. package/dist/esm/utils/accountSummary.js.map +1 -0
  239. package/dist/esm/utils/calculations.d.ts +109 -0
  240. package/dist/esm/utils/calculations.d.ts.map +1 -0
  241. package/dist/esm/utils/calculations.js +154 -0
  242. package/dist/esm/utils/calculations.js.map +1 -0
  243. package/dist/esm/utils/hyperliquid/index.d.ts +3 -0
  244. package/dist/esm/utils/hyperliquid/index.d.ts.map +1 -0
  245. package/dist/esm/utils/hyperliquid/index.js +3 -0
  246. package/dist/esm/utils/hyperliquid/index.js.map +1 -0
  247. package/dist/esm/utils/hyperliquid/liquidation.d.ts +46 -0
  248. package/dist/esm/utils/hyperliquid/liquidation.d.ts.map +1 -0
  249. package/dist/esm/utils/hyperliquid/liquidation.js +63 -0
  250. package/dist/esm/utils/hyperliquid/liquidation.js.map +1 -0
  251. package/dist/esm/utils/hyperliquid/orderFormatting.d.ts +44 -0
  252. package/dist/esm/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
  253. package/dist/esm/utils/hyperliquid/orderFormatting.js +79 -0
  254. package/dist/esm/utils/hyperliquid/orderFormatting.js.map +1 -0
  255. package/dist/esm/utils/orderClassification.d.ts +29 -0
  256. package/dist/esm/utils/orderClassification.d.ts.map +1 -0
  257. package/dist/esm/utils/orderClassification.js +53 -0
  258. package/dist/esm/utils/orderClassification.js.map +1 -0
  259. package/dist/esm/utils/parse.d.ts +18 -0
  260. package/dist/esm/utils/parse.d.ts.map +1 -0
  261. package/dist/esm/utils/parse.js +28 -0
  262. package/dist/esm/utils/parse.js.map +1 -0
  263. package/dist/esm/utils/request.d.ts +1 -2
  264. package/dist/esm/utils/request.d.ts.map +1 -1
  265. package/dist/esm/utils/request.js +20 -7
  266. package/dist/esm/utils/request.js.map +1 -1
  267. package/dist/esm/utils/units.d.ts +20 -0
  268. package/dist/esm/utils/units.d.ts.map +1 -0
  269. package/dist/esm/utils/units.js +31 -0
  270. package/dist/esm/utils/units.js.map +1 -0
  271. package/dist/esm/utils/validation.d.ts +15 -0
  272. package/dist/esm/utils/validation.d.ts.map +1 -0
  273. package/dist/esm/utils/validation.js +26 -0
  274. package/dist/esm/utils/validation.js.map +1 -0
  275. package/dist/esm/version.d.ts +1 -1
  276. package/dist/esm/version.d.ts.map +1 -1
  277. package/dist/esm/version.js +1 -1
  278. package/dist/esm/version.js.map +1 -1
  279. package/dist/types/agent/AgentManager.d.ts +9 -9
  280. package/dist/types/agent/AgentManager.d.ts.map +1 -1
  281. package/dist/types/agent/storage.d.ts +1 -1
  282. package/dist/types/client/PerpsClient.d.ts +70 -189
  283. package/dist/types/client/PerpsClient.d.ts.map +1 -1
  284. package/dist/types/client/createPerpsClient.d.ts +30 -7
  285. package/dist/types/client/createPerpsClient.d.ts.map +1 -1
  286. package/dist/types/client/types.d.ts +75 -48
  287. package/dist/types/client/types.d.ts.map +1 -1
  288. package/dist/types/errors/PerpsError.d.ts +2 -3
  289. package/dist/types/errors/PerpsError.d.ts.map +1 -1
  290. package/dist/types/errors/constants.d.ts +0 -10
  291. package/dist/types/errors/constants.d.ts.map +1 -1
  292. package/dist/types/index.d.ts +31 -32
  293. package/dist/types/index.d.ts.map +1 -1
  294. package/dist/types/realtime/PerpsWsClient.d.ts +1 -0
  295. package/dist/types/realtime/PerpsWsClient.d.ts.map +1 -1
  296. package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts +11 -5
  297. package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
  298. package/dist/types/realtime/hyperliquid/types.d.ts +11 -9
  299. package/dist/types/realtime/hyperliquid/types.d.ts.map +1 -1
  300. package/dist/types/services/createAction.d.ts +11 -0
  301. package/dist/types/services/createAction.d.ts.map +1 -0
  302. package/dist/types/services/executeAction.d.ts +11 -0
  303. package/dist/types/services/executeAction.d.ts.map +1 -0
  304. package/dist/types/services/getAccount.d.ts +7 -7
  305. package/dist/types/services/getAccount.d.ts.map +1 -1
  306. package/dist/types/services/getActivity.d.ts +49 -0
  307. package/dist/types/services/getActivity.d.ts.map +1 -0
  308. package/dist/types/services/getAsset.d.ts +20 -0
  309. package/dist/types/services/getAsset.d.ts.map +1 -0
  310. package/dist/types/services/getAssets.d.ts +18 -0
  311. package/dist/types/services/getAssets.d.ts.map +1 -0
  312. package/dist/{esm/services/getHistory.d.ts → types/services/getFills.d.ts} +17 -13
  313. package/dist/types/services/getFills.d.ts.map +1 -0
  314. package/dist/types/services/getOhlcv.d.ts +4 -4
  315. package/dist/types/services/getOhlcv.d.ts.map +1 -1
  316. package/dist/types/services/getOrder.d.ts +4 -4
  317. package/dist/types/services/getOrder.d.ts.map +1 -1
  318. package/dist/types/services/getOrderbook.d.ts +4 -4
  319. package/dist/types/services/getOrderbook.d.ts.map +1 -1
  320. package/dist/types/services/getOrders.d.ts +27 -0
  321. package/dist/types/services/getOrders.d.ts.map +1 -0
  322. package/dist/types/services/getPositions.d.ts +27 -0
  323. package/dist/types/services/getPositions.d.ts.map +1 -0
  324. package/dist/types/services/getPrices.d.ts +5 -5
  325. package/dist/types/services/getPrices.d.ts.map +1 -1
  326. package/dist/types/services/getProviders.d.ts +20 -0
  327. package/dist/types/services/getProviders.d.ts.map +1 -0
  328. package/dist/types/utils/accountSummary.d.ts +13 -0
  329. package/dist/types/utils/accountSummary.d.ts.map +1 -0
  330. package/dist/types/utils/calculations.d.ts +109 -0
  331. package/dist/types/utils/calculations.d.ts.map +1 -0
  332. package/dist/types/utils/hyperliquid/index.d.ts +3 -0
  333. package/dist/types/utils/hyperliquid/index.d.ts.map +1 -0
  334. package/dist/types/utils/hyperliquid/liquidation.d.ts +46 -0
  335. package/dist/types/utils/hyperliquid/liquidation.d.ts.map +1 -0
  336. package/dist/types/utils/hyperliquid/orderFormatting.d.ts +44 -0
  337. package/dist/types/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
  338. package/dist/types/utils/orderClassification.d.ts +29 -0
  339. package/dist/types/utils/orderClassification.d.ts.map +1 -0
  340. package/dist/types/utils/parse.d.ts +18 -0
  341. package/dist/types/utils/parse.d.ts.map +1 -0
  342. package/dist/types/utils/request.d.ts +1 -2
  343. package/dist/types/utils/request.d.ts.map +1 -1
  344. package/dist/types/utils/units.d.ts +20 -0
  345. package/dist/types/utils/units.d.ts.map +1 -0
  346. package/dist/types/utils/validation.d.ts +15 -0
  347. package/dist/types/utils/validation.d.ts.map +1 -0
  348. package/dist/types/version.d.ts +1 -1
  349. package/dist/types/version.d.ts.map +1 -1
  350. package/package.json +8 -4
  351. package/src/agent/AgentManager.ts +21 -19
  352. package/src/agent/storage.ts +1 -1
  353. package/src/client/PerpsClient.ts +569 -446
  354. package/src/client/createPerpsClient.ts +36 -11
  355. package/src/client/types.ts +84 -51
  356. package/src/errors/PerpsError.ts +3 -22
  357. package/src/errors/constants.ts +0 -11
  358. package/src/index.ts +70 -47
  359. package/src/realtime/PerpsWsClient.ts +47 -31
  360. package/src/realtime/hyperliquid/HyperliquidWsProvider.ts +203 -64
  361. package/src/realtime/hyperliquid/types.ts +8 -10
  362. package/src/services/createAction.ts +41 -0
  363. package/src/services/executeAction.ts +41 -0
  364. package/src/services/getAccount.ts +8 -8
  365. package/src/services/getActivity.ts +77 -0
  366. package/src/services/getAsset.ts +34 -0
  367. package/src/services/getAssets.ts +32 -0
  368. package/src/services/{getHistory.ts → getFills.ts} +23 -17
  369. package/src/services/getOhlcv.ts +5 -5
  370. package/src/services/getOrder.ts +5 -5
  371. package/src/services/getOrderbook.ts +5 -5
  372. package/src/services/getOrders.ts +45 -0
  373. package/src/services/getPositions.ts +45 -0
  374. package/src/services/getPrices.ts +6 -6
  375. package/src/services/{getDexes.ts → getProviders.ts} +10 -10
  376. package/src/utils/accountSummary.ts +124 -0
  377. package/src/utils/calculations.ts +209 -0
  378. package/src/utils/hyperliquid/index.ts +9 -0
  379. package/src/utils/hyperliquid/liquidation.ts +71 -0
  380. package/src/utils/hyperliquid/orderFormatting.ts +96 -0
  381. package/src/utils/orderClassification.ts +64 -0
  382. package/src/utils/parse.ts +28 -0
  383. package/src/utils/request.ts +22 -7
  384. package/src/utils/units.ts +32 -0
  385. package/src/utils/validation.ts +35 -0
  386. package/src/version.ts +1 -1
  387. package/dist/cjs/dex/hyperliquid.d.ts +0 -3
  388. package/dist/cjs/dex/hyperliquid.d.ts.map +0 -1
  389. package/dist/cjs/dex/hyperliquid.js +0 -21
  390. package/dist/cjs/dex/hyperliquid.js.map +0 -1
  391. package/dist/cjs/dex/registry.d.ts +0 -3
  392. package/dist/cjs/dex/registry.d.ts.map +0 -1
  393. package/dist/cjs/dex/registry.js +0 -16
  394. package/dist/cjs/dex/registry.js.map +0 -1
  395. package/dist/cjs/dex/types.d.ts +0 -13
  396. package/dist/cjs/dex/types.d.ts.map +0 -1
  397. package/dist/cjs/dex/types.js +0 -3
  398. package/dist/cjs/dex/types.js.map +0 -1
  399. package/dist/cjs/errors/AgentError.d.ts +0 -10
  400. package/dist/cjs/errors/AgentError.d.ts.map +0 -1
  401. package/dist/cjs/errors/AgentError.js +0 -23
  402. package/dist/cjs/errors/AgentError.js.map +0 -1
  403. package/dist/cjs/errors/HTTPError.d.ts +0 -11
  404. package/dist/cjs/errors/HTTPError.d.ts.map +0 -1
  405. package/dist/cjs/errors/HTTPError.js +0 -62
  406. package/dist/cjs/errors/HTTPError.js.map +0 -1
  407. package/dist/cjs/errors/PerpsSDKError.d.ts +0 -9
  408. package/dist/cjs/errors/PerpsSDKError.d.ts.map +0 -1
  409. package/dist/cjs/errors/PerpsSDKError.js +0 -36
  410. package/dist/cjs/errors/PerpsSDKError.js.map +0 -1
  411. package/dist/cjs/errors/ServerError.d.ts +0 -10
  412. package/dist/cjs/errors/ServerError.d.ts.map +0 -1
  413. package/dist/cjs/errors/ServerError.js +0 -24
  414. package/dist/cjs/errors/ServerError.js.map +0 -1
  415. package/dist/cjs/errors/ValidationError.d.ts +0 -9
  416. package/dist/cjs/errors/ValidationError.d.ts.map +0 -1
  417. package/dist/cjs/errors/ValidationError.js +0 -23
  418. package/dist/cjs/errors/ValidationError.js.map +0 -1
  419. package/dist/cjs/errors/utils/rootCause.d.ts +0 -6
  420. package/dist/cjs/errors/utils/rootCause.d.ts.map +0 -1
  421. package/dist/cjs/errors/utils/rootCause.js +0 -41
  422. package/dist/cjs/errors/utils/rootCause.js.map +0 -1
  423. package/dist/cjs/services/cancelOrder.d.ts +0 -10
  424. package/dist/cjs/services/cancelOrder.d.ts.map +0 -1
  425. package/dist/cjs/services/cancelOrder.js +0 -16
  426. package/dist/cjs/services/cancelOrder.js.map +0 -1
  427. package/dist/cjs/services/createAuthorization.d.ts +0 -10
  428. package/dist/cjs/services/createAuthorization.d.ts.map +0 -1
  429. package/dist/cjs/services/createAuthorization.js +0 -16
  430. package/dist/cjs/services/createAuthorization.js.map +0 -1
  431. package/dist/cjs/services/createOrder.d.ts +0 -21
  432. package/dist/cjs/services/createOrder.d.ts.map +0 -1
  433. package/dist/cjs/services/createOrder.js +0 -27
  434. package/dist/cjs/services/createOrder.js.map +0 -1
  435. package/dist/cjs/services/createWithdrawal.d.ts +0 -9
  436. package/dist/cjs/services/createWithdrawal.d.ts.map +0 -1
  437. package/dist/cjs/services/createWithdrawal.js +0 -15
  438. package/dist/cjs/services/createWithdrawal.js.map +0 -1
  439. package/dist/cjs/services/getDexes.d.ts +0 -4
  440. package/dist/cjs/services/getDexes.d.ts.map +0 -1
  441. package/dist/cjs/services/getDexes.js.map +0 -1
  442. package/dist/cjs/services/getHistory.d.ts +0 -10
  443. package/dist/cjs/services/getHistory.d.ts.map +0 -1
  444. package/dist/cjs/services/getHistory.js.map +0 -1
  445. package/dist/cjs/services/getMarket.d.ts +0 -8
  446. package/dist/cjs/services/getMarket.d.ts.map +0 -1
  447. package/dist/cjs/services/getMarket.js.map +0 -1
  448. package/dist/cjs/services/getMarkets.d.ts +0 -7
  449. package/dist/cjs/services/getMarkets.d.ts.map +0 -1
  450. package/dist/cjs/services/getMarkets.js.map +0 -1
  451. package/dist/cjs/services/submitAuthorization.d.ts +0 -10
  452. package/dist/cjs/services/submitAuthorization.d.ts.map +0 -1
  453. package/dist/cjs/services/submitAuthorization.js.map +0 -1
  454. package/dist/cjs/services/submitOrder.d.ts +0 -10
  455. package/dist/cjs/services/submitOrder.d.ts.map +0 -1
  456. package/dist/cjs/services/submitOrder.js.map +0 -1
  457. package/dist/cjs/services/submitWithdrawal.d.ts +0 -9
  458. package/dist/cjs/services/submitWithdrawal.d.ts.map +0 -1
  459. package/dist/cjs/services/submitWithdrawal.js +0 -15
  460. package/dist/cjs/services/submitWithdrawal.js.map +0 -1
  461. package/dist/esm/dex/hyperliquid.d.ts +0 -3
  462. package/dist/esm/dex/hyperliquid.d.ts.map +0 -1
  463. package/dist/esm/dex/hyperliquid.js +0 -19
  464. package/dist/esm/dex/hyperliquid.js.map +0 -1
  465. package/dist/esm/dex/registry.d.ts +0 -3
  466. package/dist/esm/dex/registry.d.ts.map +0 -1
  467. package/dist/esm/dex/registry.js +0 -13
  468. package/dist/esm/dex/registry.js.map +0 -1
  469. package/dist/esm/dex/types.d.ts +0 -15
  470. package/dist/esm/dex/types.d.ts.map +0 -1
  471. package/dist/esm/dex/types.js +0 -2
  472. package/dist/esm/dex/types.js.map +0 -1
  473. package/dist/esm/errors/AgentError.d.ts +0 -25
  474. package/dist/esm/errors/AgentError.d.ts.map +0 -1
  475. package/dist/esm/errors/AgentError.js +0 -35
  476. package/dist/esm/errors/AgentError.js.map +0 -1
  477. package/dist/esm/errors/HTTPError.d.ts +0 -11
  478. package/dist/esm/errors/HTTPError.d.ts.map +0 -1
  479. package/dist/esm/errors/HTTPError.js +0 -61
  480. package/dist/esm/errors/HTTPError.js.map +0 -1
  481. package/dist/esm/errors/PerpsSDKError.d.ts +0 -40
  482. package/dist/esm/errors/PerpsSDKError.d.ts.map +0 -1
  483. package/dist/esm/errors/PerpsSDKError.js +0 -67
  484. package/dist/esm/errors/PerpsSDKError.js.map +0 -1
  485. package/dist/esm/errors/ServerError.d.ts +0 -23
  486. package/dist/esm/errors/ServerError.d.ts.map +0 -1
  487. package/dist/esm/errors/ServerError.js +0 -34
  488. package/dist/esm/errors/ServerError.js.map +0 -1
  489. package/dist/esm/errors/ValidationError.d.ts +0 -23
  490. package/dist/esm/errors/ValidationError.d.ts.map +0 -1
  491. package/dist/esm/errors/ValidationError.js +0 -34
  492. package/dist/esm/errors/ValidationError.js.map +0 -1
  493. package/dist/esm/errors/utils/rootCause.d.ts +0 -71
  494. package/dist/esm/errors/utils/rootCause.d.ts.map +0 -1
  495. package/dist/esm/errors/utils/rootCause.js +0 -99
  496. package/dist/esm/errors/utils/rootCause.js.map +0 -1
  497. package/dist/esm/services/cancelOrder.d.ts +0 -51
  498. package/dist/esm/services/cancelOrder.d.ts.map +0 -1
  499. package/dist/esm/services/cancelOrder.js +0 -50
  500. package/dist/esm/services/cancelOrder.js.map +0 -1
  501. package/dist/esm/services/createAuthorization.d.ts +0 -51
  502. package/dist/esm/services/createAuthorization.d.ts.map +0 -1
  503. package/dist/esm/services/createAuthorization.js +0 -50
  504. package/dist/esm/services/createAuthorization.js.map +0 -1
  505. package/dist/esm/services/createOrder.d.ts +0 -74
  506. package/dist/esm/services/createOrder.d.ts.map +0 -1
  507. package/dist/esm/services/createOrder.js +0 -62
  508. package/dist/esm/services/createOrder.js.map +0 -1
  509. package/dist/esm/services/createWithdrawal.d.ts +0 -49
  510. package/dist/esm/services/createWithdrawal.d.ts.map +0 -1
  511. package/dist/esm/services/createWithdrawal.js +0 -49
  512. package/dist/esm/services/createWithdrawal.js.map +0 -1
  513. package/dist/esm/services/getDexes.d.ts +0 -20
  514. package/dist/esm/services/getDexes.d.ts.map +0 -1
  515. package/dist/esm/services/getDexes.js +0 -21
  516. package/dist/esm/services/getDexes.js.map +0 -1
  517. package/dist/esm/services/getHistory.d.ts.map +0 -1
  518. package/dist/esm/services/getHistory.js.map +0 -1
  519. package/dist/esm/services/getMarket.d.ts +0 -27
  520. package/dist/esm/services/getMarket.d.ts.map +0 -1
  521. package/dist/esm/services/getMarket.js +0 -25
  522. package/dist/esm/services/getMarket.js.map +0 -1
  523. package/dist/esm/services/getMarkets.d.ts +0 -25
  524. package/dist/esm/services/getMarkets.d.ts.map +0 -1
  525. package/dist/esm/services/getMarkets.js +0 -23
  526. package/dist/esm/services/getMarkets.js.map +0 -1
  527. package/dist/esm/services/submitAuthorization.d.ts +0 -42
  528. package/dist/esm/services/submitAuthorization.d.ts.map +0 -1
  529. package/dist/esm/services/submitAuthorization.js +0 -41
  530. package/dist/esm/services/submitAuthorization.js.map +0 -1
  531. package/dist/esm/services/submitOrder.d.ts +0 -44
  532. package/dist/esm/services/submitOrder.d.ts.map +0 -1
  533. package/dist/esm/services/submitOrder.js +0 -43
  534. package/dist/esm/services/submitOrder.js.map +0 -1
  535. package/dist/esm/services/submitWithdrawal.d.ts +0 -40
  536. package/dist/esm/services/submitWithdrawal.d.ts.map +0 -1
  537. package/dist/esm/services/submitWithdrawal.js +0 -40
  538. package/dist/esm/services/submitWithdrawal.js.map +0 -1
  539. package/dist/types/dex/hyperliquid.d.ts +0 -3
  540. package/dist/types/dex/hyperliquid.d.ts.map +0 -1
  541. package/dist/types/dex/registry.d.ts +0 -3
  542. package/dist/types/dex/registry.d.ts.map +0 -1
  543. package/dist/types/dex/types.d.ts +0 -15
  544. package/dist/types/dex/types.d.ts.map +0 -1
  545. package/dist/types/errors/AgentError.d.ts +0 -25
  546. package/dist/types/errors/AgentError.d.ts.map +0 -1
  547. package/dist/types/errors/HTTPError.d.ts +0 -11
  548. package/dist/types/errors/HTTPError.d.ts.map +0 -1
  549. package/dist/types/errors/PerpsSDKError.d.ts +0 -40
  550. package/dist/types/errors/PerpsSDKError.d.ts.map +0 -1
  551. package/dist/types/errors/ServerError.d.ts +0 -23
  552. package/dist/types/errors/ServerError.d.ts.map +0 -1
  553. package/dist/types/errors/ValidationError.d.ts +0 -23
  554. package/dist/types/errors/ValidationError.d.ts.map +0 -1
  555. package/dist/types/errors/utils/rootCause.d.ts +0 -71
  556. package/dist/types/errors/utils/rootCause.d.ts.map +0 -1
  557. package/dist/types/services/cancelOrder.d.ts +0 -51
  558. package/dist/types/services/cancelOrder.d.ts.map +0 -1
  559. package/dist/types/services/createAuthorization.d.ts +0 -51
  560. package/dist/types/services/createAuthorization.d.ts.map +0 -1
  561. package/dist/types/services/createOrder.d.ts +0 -74
  562. package/dist/types/services/createOrder.d.ts.map +0 -1
  563. package/dist/types/services/createWithdrawal.d.ts +0 -49
  564. package/dist/types/services/createWithdrawal.d.ts.map +0 -1
  565. package/dist/types/services/getDexes.d.ts +0 -20
  566. package/dist/types/services/getDexes.d.ts.map +0 -1
  567. package/dist/types/services/getHistory.d.ts.map +0 -1
  568. package/dist/types/services/getMarket.d.ts +0 -27
  569. package/dist/types/services/getMarket.d.ts.map +0 -1
  570. package/dist/types/services/getMarkets.d.ts +0 -25
  571. package/dist/types/services/getMarkets.d.ts.map +0 -1
  572. package/dist/types/services/submitAuthorization.d.ts +0 -42
  573. package/dist/types/services/submitAuthorization.d.ts.map +0 -1
  574. package/dist/types/services/submitOrder.d.ts +0 -44
  575. package/dist/types/services/submitOrder.d.ts.map +0 -1
  576. package/dist/types/services/submitWithdrawal.d.ts +0 -40
  577. package/dist/types/services/submitWithdrawal.d.ts.map +0 -1
  578. package/src/dex/hyperliquid.ts +0 -20
  579. package/src/dex/registry.ts +0 -15
  580. package/src/dex/types.ts +0 -16
  581. package/src/errors/AgentError.ts +0 -43
  582. package/src/errors/HTTPError.ts +0 -72
  583. package/src/errors/PerpsSDKError.ts +0 -79
  584. package/src/errors/ServerError.ts +0 -41
  585. package/src/errors/ValidationError.ts +0 -38
  586. package/src/errors/utils/rootCause.ts +0 -112
  587. package/src/services/cancelOrder.ts +0 -75
  588. package/src/services/createAuthorization.ts +0 -79
  589. package/src/services/createOrder.ts +0 -116
  590. package/src/services/createWithdrawal.ts +0 -76
  591. package/src/services/getMarket.ts +0 -41
  592. package/src/services/getMarkets.ts +0 -37
  593. package/src/services/submitAuthorization.ts +0 -70
  594. package/src/services/submitOrder.ts +0 -72
  595. package/src/services/submitWithdrawal.ts +0 -67
@@ -1,572 +1,695 @@
1
1
  import type {
2
+ ActionDescriptor,
3
+ ActionParamsMap,
4
+ ActionStep,
2
5
  Address,
3
- AuthorizationsResponse,
4
- CancelOrderPayloadResponse,
5
- CreateAuthorizationResponse,
6
- CreateOrderResponse,
7
- CreateWithdrawalResponse,
8
- OrderActionType,
9
- SignedAuthorization,
10
- SignedOrderAction,
11
- SubmitOrderResponse,
12
- SubmitWithdrawalResponse,
6
+ AssetIdentity,
7
+ CreateActionResponse,
8
+ ExecuteActionResponse,
9
+ Provider,
10
+ SignedActionStep,
13
11
  } from '@lifi/perps-types'
14
- import { PerpsErrorCode } from '@lifi/perps-types'
15
- import { getDexAuthProvider } from '../dex/registry.js'
12
+ import { ActionType, PerpsErrorCode, PerpsSigner } from '@lifi/perps-types'
13
+ import { localStorageAdapter } from '../agent/storage.js'
14
+ import type { StorageAdapter } from '../agent/types.js'
16
15
  import { PerpsErrorMessage } from '../errors/constants.js'
17
16
  import { PerpsError } from '../errors/PerpsError.js'
18
- import { cancelOrder } from '../services/cancelOrder.js'
19
- import { createAuthorization } from '../services/createAuthorization.js'
20
- import { createOrder } from '../services/createOrder.js'
21
- import { createWithdrawal } from '../services/createWithdrawal.js'
22
- import type { SubmitAuthorizationParams } from '../services/submitAuthorization.js'
23
- import { submitAuthorization } from '../services/submitAuthorization.js'
24
- import type { SubmitOrderParams } from '../services/submitOrder.js'
25
- import { submitOrder } from '../services/submitOrder.js'
26
- import type { SubmitWithdrawalParams } from '../services/submitWithdrawal.js'
27
- import { submitWithdrawal } from '../services/submitWithdrawal.js'
17
+ import { createAction } from '../services/createAction.js'
18
+ import { executeAction } from '../services/executeAction.js'
19
+ import { getProviders } from '../services/getProviders.js'
28
20
  import { signTypedData } from '../utils/signTypedData.js'
29
21
  import { createPerpsClient, type PerpsSDKClient } from './createPerpsClient.js'
30
- import type {
31
- BuildAuthorizationParams,
32
- BuildWithdrawalParams,
33
- CancelOrdersParams,
34
- ExecuteAuthorizationsParams,
35
- ExecuteAuthorizationsResult,
36
- GetRequiredAuthorizationsParams,
37
- PerpsClientOptions,
38
- PlaceOrderParams,
39
- RequiredAuthorizationsResult,
22
+ import {
23
+ type BuildWithdrawalParams,
24
+ type CancelOrdersParams,
25
+ type CheckPrerequisitesParams,
26
+ type ExecutePrerequisitesParams,
27
+ type ExecutePrerequisitesResult,
28
+ type GetPrerequisitesParams,
29
+ type ModifyOrdersParams,
30
+ type PerpsClientOptions,
31
+ type PlaceOrderParams,
32
+ type PlaceTriggerOrderParams,
33
+ type PrerequisitesResult,
40
34
  SigningMode,
41
35
  } from './types.js'
42
36
 
43
- /**
44
- * Stateful client for managing signing modes and trading operations.
45
- *
46
- * The PerpsClient provides two signing modes:
47
- * - `USER`: User wallet signs each action (wallet popup per action)
48
- * - `USER_AGENT`: SDK-generated agent signs actions (no popups after setup)
49
- *
50
- * In `USER_AGENT` mode, the client:
51
- * - Generates an agent keypair stored in localStorage (or custom storage)
52
- * - Auto-injects agent address into authorization requests
53
- * - Auto-signs trading actions with the agent key
54
- *
55
- * @remarks
56
- * The example below uses Hyperliquid. Authorization keys and parameters are DEX-specific.
57
- *
58
- * @example
59
- * ```ts
60
- * const perps = new PerpsClient({ integrator: 'my-app' })
61
- *
62
- * // Set up agent signing for a user + DEX pair
63
- * await perps.setSigningMode(userAddress, 'hyperliquid', 'USER_AGENT')
64
- *
65
- * // Check and execute required authorizations
66
- * const required = await perps.getRequiredAuthorizations({
67
- * dex: 'hyperliquid',
68
- * address: userAddress,
69
- * })
70
- *
71
- * // ... sign actions with user wallet ...
72
- *
73
- * // Place orders (agent signs automatically)
74
- * const result = await perps.placeOrder({
75
- * address: userAddress,
76
- * dex: 'hyperliquid',
77
- * symbol: 'BTC',
78
- * side: 'BUY',
79
- * type: 'MARKET',
80
- * size: '0.1',
81
- * price: '95000.00'
82
- * })
83
- * ```
84
- */
85
37
  export class PerpsClient {
86
38
  private sdkClient: PerpsSDKClient
39
+ private storage: StorageAdapter
87
40
  private signingModes: Map<string, SigningMode> = new Map()
41
+ private providerMetadataCache: Map<string, Provider> = new Map()
88
42
 
89
43
  constructor(options: PerpsClientOptions) {
44
+ this.storage = options.storage ?? localStorageAdapter
90
45
  this.sdkClient = createPerpsClient({
91
46
  integrator: options.integrator,
92
47
  apiKey: options.apiKey,
93
48
  apiUrl: options.apiUrl,
94
- storage: options.storage,
49
+ storage: this.storage,
50
+ providers: options.providers,
95
51
  })
96
52
  }
97
53
 
98
- /**
99
- * Get the underlying SDK client for use with service functions.
100
- */
101
54
  get client(): PerpsSDKClient {
102
55
  return this.sdkClient
103
56
  }
104
57
 
105
- /**
106
- * Get the storage key for a user + DEX pair.
107
- */
108
- private modeKey(address: Address, dex: string): string {
109
- return `${address.toLowerCase()}:${dex.toLowerCase()}`
58
+ private modeKey(address: Address, provider: string): string {
59
+ return `${address.toLowerCase()}:${provider.toLowerCase()}`
110
60
  }
111
61
 
112
- /**
113
- * Set the signing mode for a user + DEX pair.
114
- *
115
- * In `USER_AGENT` mode, generates an agent keypair if one doesn't exist.
116
- *
117
- * @param address - User wallet address
118
- * @param dex - DEX identifier
119
- * @param mode - Signing mode to set
120
- */
121
- async setSigningMode(
122
- address: Address,
123
- dex: string,
124
- mode: SigningMode
125
- ): Promise<void> {
126
- const key = this.modeKey(address, dex)
127
- this.signingModes.set(key, mode)
62
+ private signingModeStorageKey(address: Address, provider: string): string {
63
+ return `lifi-perps-mode:${address.toLowerCase()}:${provider.toLowerCase()}`
64
+ }
128
65
 
129
- if (mode === 'USER_AGENT') {
130
- // Generate agent keypair if not exists
131
- await this.sdkClient.agentManager.getOrCreateAgent(address, dex)
66
+ private async getProviderMetadata(provider: string): Promise<Provider> {
67
+ const cached = this.providerMetadataCache.get(provider)
68
+ if (cached) {
69
+ return cached
70
+ }
71
+
72
+ const { providers } = await getProviders(this.sdkClient)
73
+ for (const d of providers) {
74
+ this.providerMetadataCache.set(d.key, d)
132
75
  }
133
- }
134
76
 
135
- /**
136
- * Get the current signing mode for a user + DEX pair.
137
- * Defaults to `USER` if not set.
138
- */
139
- getSigningMode(address: Address, dex: string): SigningMode {
140
- return this.signingModes.get(this.modeKey(address, dex)) ?? 'USER'
77
+ const metadata = this.providerMetadataCache.get(provider)
78
+ if (!metadata) {
79
+ const error = new PerpsError(
80
+ PerpsErrorCode.SDKError,
81
+ `Unsupported provider: ${provider}`
82
+ )
83
+ error.tool = '@lifi/perps-sdk'
84
+ throw error
85
+ }
86
+ return metadata
141
87
  }
142
88
 
143
- /**
144
- * Get the agent address for a user + DEX pair.
145
- *
146
- * @throws {PerpsError} If in USER mode or agent not found
147
- */
148
- async getAgentAddress(address: Address, dex: string): Promise<Address> {
149
- const agent = await this.sdkClient.agentManager.getAgent(address, dex)
150
- return agent.address
89
+ private buildPrerequisiteInputs(
90
+ prerequisites: ActionDescriptor[],
91
+ mode: SigningMode,
92
+ agentAddress?: Address
93
+ ): Array<{ key: string; params?: Record<string, unknown> }> {
94
+ return prerequisites
95
+ .filter((p) => {
96
+ if (mode === SigningMode.USER) {
97
+ if (!p.signers.includes(PerpsSigner.USER)) {
98
+ return false
99
+ }
100
+ if (p.type === ActionType.APPROVE_AGENT) {
101
+ return false
102
+ }
103
+ return true
104
+ }
105
+ if (
106
+ p.signers.includes(PerpsSigner.USER) &&
107
+ !p.signers.includes(PerpsSigner.AGENT) &&
108
+ p.type === ActionType.USER_SET_ABSTRACTION
109
+ ) {
110
+ return false
111
+ }
112
+ return true
113
+ })
114
+ .map((p) => {
115
+ const params: Record<string, unknown> = {}
116
+ if (p.type === ActionType.APPROVE_AGENT && agentAddress) {
117
+ params.agentAddress = agentAddress
118
+ }
119
+ return {
120
+ key: p.type,
121
+ ...(Object.keys(params).length > 0 ? { params } : {}),
122
+ }
123
+ })
151
124
  }
152
125
 
153
- /**
154
- * Check if an agent exists for a user + DEX pair.
155
- */
156
- async hasAgent(address: Address, dex: string): Promise<boolean> {
157
- return this.sdkClient.agentManager.hasAgent(address, dex)
158
- }
159
-
160
- /**
161
- * Remove the agent for a user + DEX pair.
162
- * Also resets signing mode to USER.
163
- */
164
- async removeAgent(address: Address, dex: string): Promise<void> {
165
- await this.sdkClient.agentManager.removeAgent(address, dex)
166
- this.signingModes.delete(this.modeKey(address, dex))
167
- }
168
-
169
- /**
170
- * Build authorization payloads for signing.
171
- *
172
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
173
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
174
- *
175
- * @param params - Authorization parameters
176
- * @returns Authorization actions with typed data for signing
177
- */
178
- async buildAuthorization(
179
- params: BuildAuthorizationParams
180
- ): Promise<CreateAuthorizationResponse> {
181
- const mode = this.getSigningMode(params.address, params.dex)
182
- let { signerAddress } = params
126
+ private async resolveSignerForAction(
127
+ action: ActionType,
128
+ address: Address,
129
+ provider: string
130
+ ): Promise<Address | undefined> {
131
+ const mode = await this.loadSigningMode(address, provider)
132
+ if (mode !== SigningMode.USER_AGENT) {
133
+ return undefined
134
+ }
183
135
 
184
- if (mode === 'USER_AGENT') {
185
- const agent = await this.sdkClient.agentManager.getAgent(
186
- params.address,
187
- params.dex
188
- )
189
- signerAddress = signerAddress ?? agent.address
136
+ // Check if this action supports agent signing
137
+ const metadata = await this.getProviderMetadata(provider)
138
+ const allActions = [...metadata.prepareAccountActions, ...metadata.actions]
139
+ const descriptor = allActions.find((d) => d.type === action)
140
+ if (!descriptor?.signers.includes(PerpsSigner.AGENT)) {
141
+ return undefined
190
142
  }
191
143
 
192
- return createAuthorization(this.sdkClient, {
193
- ...params,
194
- signerAddress,
195
- })
144
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider)
145
+ return agent.address
196
146
  }
197
147
 
198
- /**
199
- * Submit signed authorizations.
200
- *
201
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
202
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
203
- *
204
- * @param params - Signed authorization parameters
205
- */
206
- async submitAuthorizations(
207
- params: SubmitAuthorizationParams
208
- ): Promise<AuthorizationsResponse> {
209
- const mode = this.getSigningMode(params.address, params.dex)
210
- let { signerAddress } = params
211
-
212
- if (mode === 'USER_AGENT') {
213
- const agent = await this.sdkClient.agentManager.getAgent(
214
- params.address,
215
- params.dex
148
+ private requireAgentMode(address: Address, provider: string, method: string) {
149
+ const mode = this.getSigningMode(address, provider)
150
+ if (mode !== SigningMode.USER_AGENT) {
151
+ const error = new PerpsError(
152
+ PerpsErrorCode.SDKError,
153
+ `${PerpsErrorMessage.InvalidSigningMode} ${method} requires USER_AGENT mode.`
216
154
  )
217
- signerAddress = signerAddress ?? agent.address
155
+ error.tool = '@lifi/perps-sdk'
156
+ throw error
218
157
  }
219
-
220
- return submitAuthorization(this.sdkClient, { ...params, signerAddress })
221
158
  }
222
159
 
223
- /**
224
- * Build order payloads for signing.
225
- *
226
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
227
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
228
- *
229
- * @param params - Order parameters
230
- * @returns Order actions with typed data for signing
231
- */
232
- async buildOrder(params: PlaceOrderParams): Promise<CreateOrderResponse> {
233
- const mode = this.getSigningMode(params.address, params.dex)
234
- let signerAddress: Address | undefined
160
+ private async autoSignAndExecute(
161
+ provider: string,
162
+ address: Address,
163
+ action: ActionType,
164
+ actions: ActionStep[]
165
+ ): Promise<ExecuteActionResponse> {
166
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider)
235
167
 
236
- if (mode === 'USER_AGENT') {
237
- const agent = await this.sdkClient.agentManager.getAgent(
238
- params.address,
239
- params.dex
240
- )
241
- signerAddress = agent.address
242
- }
168
+ const signedActions: SignedActionStep[] = await Promise.all(
169
+ actions.map(async (a) => ({
170
+ action: a.action,
171
+ typedData: a.typedData,
172
+ signature: await signTypedData(agent.privateKey, a.typedData),
173
+ }))
174
+ )
243
175
 
244
- return createOrder(this.sdkClient, {
245
- dex: params.dex,
246
- address: params.address,
247
- signerAddress,
248
- clientOrderId: params.clientOrderId,
249
- symbol: params.symbol,
250
- side: params.side,
251
- type: params.type,
252
- size: params.size,
253
- price: params.price,
254
- leverage: params.leverage,
255
- reduceOnly: params.reduceOnly,
256
- timeInForce: params.timeInForce,
257
- expiresAt: params.expiresAt,
258
- takeProfit: params.takeProfit,
259
- stopLoss: params.stopLoss,
176
+ return executeAction(this.sdkClient, {
177
+ provider,
178
+ address,
179
+ signerAddress: agent.address,
180
+ action,
181
+ actions: signedActions,
260
182
  })
261
183
  }
262
184
 
263
- /**
264
- * Build cancel order payloads for signing.
265
- *
266
- * In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
267
- * In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
268
- *
269
- * @param params - Cancel parameters
270
- * @returns Cancel actions with typed data for signing
271
- */
272
- async buildCancelOrder(
273
- params: CancelOrdersParams
274
- ): Promise<CancelOrderPayloadResponse> {
275
- const mode = this.getSigningMode(params.address, params.dex)
276
- let signerAddress: Address | undefined
185
+ // ---------------------------------------------------------------------------
186
+ // Generic action helpers
187
+ // ---------------------------------------------------------------------------
277
188
 
278
- if (mode === 'USER_AGENT') {
279
- const agent = await this.sdkClient.agentManager.getAgent(
280
- params.address,
281
- params.dex
282
- )
283
- signerAddress = agent.address
284
- }
285
-
286
- return cancelOrder(this.sdkClient, {
287
- dex: params.dex,
189
+ async buildAction<T extends ActionType>(
190
+ action: T,
191
+ params: { provider: string; address: Address; params: ActionParamsMap[T] }
192
+ ): Promise<CreateActionResponse> {
193
+ const signerAddress = await this.resolveSignerForAction(
194
+ action,
195
+ params.address,
196
+ params.provider
197
+ )
198
+ return createAction(this.sdkClient, {
199
+ provider: params.provider,
288
200
  address: params.address,
289
201
  signerAddress,
290
- ids: params.ids,
202
+ action,
203
+ params: params.params,
291
204
  })
292
205
  }
293
206
 
294
- /**
295
- * Place an order with automatic agent signing.
296
- *
297
- * **Requires USER_AGENT mode.** For USER mode, use `buildOrder()` + `submitSignedOrder()`.
298
- *
299
- * @param params - Order parameters
300
- * @returns Order submission results
301
- * @throws {PerpsError} If not in USER_AGENT mode
302
- */
303
- async placeOrder(params: PlaceOrderParams): Promise<SubmitOrderResponse> {
304
- const mode = this.getSigningMode(params.address, params.dex)
305
-
306
- if (mode !== 'USER_AGENT') {
307
- throw new PerpsError(
308
- PerpsErrorCode.ValidationError,
309
- `${PerpsErrorMessage.InvalidSigningMode} placeOrder() requires USER_AGENT mode. Use createOrder() + submitOrder() for USER mode.`
310
- )
207
+ async submitSignedAction(
208
+ action: ActionType,
209
+ params: {
210
+ provider: string
211
+ address: Address
212
+ actions: SignedActionStep[]
311
213
  }
214
+ ): Promise<ExecuteActionResponse> {
215
+ return executeAction(this.sdkClient, { ...params, action })
216
+ }
312
217
 
313
- const agent = await this.sdkClient.agentManager.getAgent(
314
- params.address,
315
- params.dex
316
- )
218
+ // ---------------------------------------------------------------------------
219
+ // Signing mode management
220
+ // ---------------------------------------------------------------------------
317
221
 
318
- // 1. Create order payloads
319
- const { actions } = await createOrder(this.sdkClient, {
320
- dex: params.dex,
321
- address: params.address,
322
- signerAddress: agent.address,
323
- clientOrderId: params.clientOrderId,
324
- symbol: params.symbol,
325
- side: params.side,
326
- type: params.type,
327
- size: params.size,
328
- price: params.price,
329
- leverage: params.leverage,
330
- reduceOnly: params.reduceOnly,
331
- timeInForce: params.timeInForce,
332
- expiresAt: params.expiresAt,
333
- takeProfit: params.takeProfit,
334
- stopLoss: params.stopLoss,
335
- })
222
+ async setSigningMode(
223
+ address: Address,
224
+ provider: string,
225
+ mode: SigningMode
226
+ ): Promise<void> {
227
+ const key = this.modeKey(address, provider)
228
+ this.signingModes.set(key, mode)
229
+ await this.storage.set(this.signingModeStorageKey(address, provider), mode)
230
+ if (mode === SigningMode.USER_AGENT) {
231
+ await this.sdkClient.agentManager.getOrCreateAgent(address, provider)
232
+ }
233
+ }
336
234
 
337
- // 2. Sign each action with agent key
338
- const signedActions: SignedOrderAction[] = await Promise.all(
339
- actions.map(async (a) => ({
340
- action: a.action,
341
- typedData: a.typedData,
342
- signature: await signTypedData(agent.privateKey, a.typedData),
343
- }))
235
+ getSigningMode(address: Address, provider: string): SigningMode {
236
+ return (
237
+ this.signingModes.get(this.modeKey(address, provider)) ??
238
+ SigningMode.USER_AGENT
344
239
  )
345
-
346
- // 3. Submit
347
- return submitOrder(this.sdkClient, {
348
- dex: params.dex,
349
- address: params.address,
350
- signerAddress: agent.address,
351
- actions: signedActions,
352
- })
353
240
  }
354
241
 
355
- /**
356
- * Cancel orders with automatic agent signing.
357
- *
358
- * **Requires USER_AGENT mode.** For USER mode, use `buildCancelOrder()` + `submitSignedOrder()`.
359
- *
360
- * @param params - Cancel parameters
361
- * @returns Cancel submission results
362
- * @throws {PerpsError} If not in USER_AGENT mode
363
- */
364
- async cancelOrders(params: CancelOrdersParams): Promise<SubmitOrderResponse> {
365
- const mode = this.getSigningMode(params.address, params.dex)
366
-
367
- if (mode !== 'USER_AGENT') {
368
- throw new PerpsError(
369
- PerpsErrorCode.ValidationError,
370
- `${PerpsErrorMessage.InvalidSigningMode} cancelOrders() requires USER_AGENT mode. Use cancelOrder() + submitOrder() for USER mode.`
371
- )
242
+ async loadSigningMode(
243
+ address: Address,
244
+ provider: string
245
+ ): Promise<SigningMode> {
246
+ const key = this.modeKey(address, provider)
247
+ if (this.signingModes.has(key)) {
248
+ return this.signingModes.get(key)!
372
249
  }
373
250
 
374
- const agent = await this.sdkClient.agentManager.getAgent(
375
- params.address,
376
- params.dex
251
+ const stored = await this.storage.get(
252
+ this.signingModeStorageKey(address, provider)
377
253
  )
254
+ const mode: SigningMode =
255
+ stored === SigningMode.USER_AGENT || stored === SigningMode.USER
256
+ ? stored
257
+ : SigningMode.USER_AGENT
258
+ this.signingModes.set(key, mode)
259
+ return mode
260
+ }
378
261
 
379
- // 1. Create cancel payloads
380
- const { actions } = await cancelOrder(this.sdkClient, {
381
- dex: params.dex,
382
- address: params.address,
383
- signerAddress: agent.address,
384
- ids: params.ids,
385
- })
262
+ async loadAgentMode(address: Address, provider: string): Promise<boolean> {
263
+ const mode = await this.loadSigningMode(address, provider)
264
+ return mode === SigningMode.USER_AGENT
265
+ }
386
266
 
387
- // 2. Sign each action with agent key
388
- const signedActions: SignedOrderAction[] = await Promise.all(
389
- actions.map(async (a) => ({
390
- action: a.action as OrderActionType,
391
- typedData: a.typedData,
392
- signature: await signTypedData(agent.privateKey, a.typedData),
393
- }))
267
+ async setAgentMode(
268
+ address: Address,
269
+ provider: string,
270
+ useAgent: boolean
271
+ ): Promise<void> {
272
+ await this.setSigningMode(
273
+ address,
274
+ provider,
275
+ useAgent ? SigningMode.USER_AGENT : SigningMode.USER
394
276
  )
277
+ }
395
278
 
396
- // 3. Submit
397
- return submitOrder(this.sdkClient, {
398
- dex: params.dex,
399
- address: params.address,
400
- signerAddress: agent.address,
401
- actions: signedActions,
402
- })
279
+ async getAgentAddress(address: Address, provider: string): Promise<Address> {
280
+ const agent = await this.sdkClient.agentManager.getAgent(address, provider)
281
+ return agent.address
403
282
  }
404
283
 
405
- /**
406
- * Submit pre-signed order actions.
407
- *
408
- * Use this for USER mode when you've already signed the actions with the user's wallet.
409
- * Auto-injects `signerAddress` if not provided (defaults to `address`).
410
- *
411
- * @param params - Signed order parameters
412
- */
413
- async submitSignedOrder(
414
- params: SubmitOrderParams
415
- ): Promise<SubmitOrderResponse> {
416
- return submitOrder(this.sdkClient, params)
417
- }
418
-
419
- /**
420
- * Build a withdrawal payload for the user to sign.
421
- *
422
- * Withdrawals are user-signed only — agents cannot initiate withdrawals.
423
- * No agent injection is performed regardless of signing mode.
424
- *
425
- * @param params - Withdrawal parameters
426
- * @returns Withdrawal action with typed data for signing
427
- */
428
- async buildWithdrawal(
429
- params: BuildWithdrawalParams
430
- ): Promise<CreateWithdrawalResponse> {
431
- return createWithdrawal(this.sdkClient, {
432
- dex: params.dex,
433
- address: params.address,
434
- withdrawal: params.withdrawal,
435
- })
284
+ async hasAgent(address: Address, provider: string): Promise<boolean> {
285
+ return this.sdkClient.agentManager.hasAgent(address, provider)
286
+ }
287
+
288
+ async removeAgent(address: Address, provider: string): Promise<void> {
289
+ await this.sdkClient.agentManager.removeAgent(address, provider)
290
+ this.signingModes.delete(this.modeKey(address, provider))
291
+ await this.storage.remove(this.signingModeStorageKey(address, provider))
436
292
  }
437
293
 
438
- /**
439
- * Submit a signed withdrawal.
440
- *
441
- * Withdrawals are user-signed only — agents cannot initiate withdrawals.
442
- *
443
- * @param params - Signed withdrawal parameters
444
- * @returns Withdrawal result
445
- */
446
- async submitWithdrawal(
447
- params: SubmitWithdrawalParams
448
- ): Promise<SubmitWithdrawalResponse> {
449
- return submitWithdrawal(this.sdkClient, params)
450
- }
451
-
452
- /**
453
- * Determine which authorizations (if any) the user needs to sign before trading.
454
- *
455
- * Uses the dex auth provider to determine what authorizations to request,
456
- * then calls buildAuthorization — the backend filters already-valid auths
457
- * and returns only what's needed.
458
- *
459
- * @param params - Parameters including dex, address, and dex-specific config
460
- * @returns Which authorizations are needed and whether the user is ready to trade
461
- */
462
- async getRequiredAuthorizations(
463
- params: GetRequiredAuthorizationsParams
464
- ): Promise<RequiredAuthorizationsResult> {
465
- const { dex, address } = params
466
- const mode = this.getSigningMode(address, dex)
467
- const provider = getDexAuthProvider(dex)
468
-
469
- // Ensure agent exists in USER_AGENT mode
294
+ // ---------------------------------------------------------------------------
295
+ // Prerequisites (was: authorizations)
296
+ // ---------------------------------------------------------------------------
297
+
298
+ async checkPrerequisites(
299
+ params: GetPrerequisitesParams
300
+ ): Promise<PrerequisitesResult> {
301
+ const { provider, address } = params
302
+ const mode = await this.loadSigningMode(address, provider)
303
+
470
304
  let agentAddress: Address | undefined
471
- if (mode === 'USER_AGENT') {
305
+ if (mode === SigningMode.USER_AGENT) {
472
306
  const agent = await this.sdkClient.agentManager.getOrCreateAgent(
473
307
  address,
474
- dex
308
+ provider
475
309
  )
476
310
  agentAddress = agent.address
477
311
  }
478
312
 
479
- // Provider declares auth inputs categorized as user/agent
480
- const authInputs = provider.getAuthorizationInputs({
481
- signingMode: mode,
482
- agentAddress,
483
- })
313
+ const metadata = await this.getProviderMetadata(provider)
314
+ const allInputs = this.buildPrerequisiteInputs(
315
+ metadata.prepareAccountActions,
316
+ mode,
317
+ agentAddress
318
+ )
484
319
 
485
- const allInputs = [...authInputs.user, ...authInputs.agent]
486
320
  if (allInputs.length === 0) {
487
- return { userAuthorizations: [], agentAuthorizations: [], isReady: true }
321
+ return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
488
322
  }
489
323
 
490
- // Send ALL to backend it filters already-satisfied ones and returns typed data
491
- const { actions } = await this.buildAuthorization({
492
- dex,
324
+ // Build a signer lookup from action descriptors
325
+ const signersByAction = new Map<string, PerpsSigner[]>()
326
+ for (const desc of metadata.prepareAccountActions) {
327
+ signersByAction.set(desc.type, desc.signers)
328
+ }
329
+
330
+ // Send all to backend via createAction for the first prerequisite type
331
+ // The backend filters already-satisfied ones and returns typed data
332
+ const { actions } = await this.buildPrerequisites({
333
+ provider,
493
334
  address,
494
- authorizations: allInputs,
335
+ signerAddress: agentAddress,
495
336
  })
496
337
 
497
338
  if (actions.length === 0) {
498
- return { userAuthorizations: [], agentAuthorizations: [], isReady: true }
339
+ return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
499
340
  }
500
341
 
501
- // Categorize backend results using provider's original key sets
502
- const agentKeys = new Set(authInputs.agent.map((a) => a.key))
503
- const userAuthorizations = actions.filter((a) => !agentKeys.has(a.action))
504
- const agentAuthorizations = actions.filter((a) => agentKeys.has(a.action))
342
+ const userPrerequisites = actions.filter((a) => {
343
+ const signers = signersByAction.get(a.action) ?? []
344
+ return signers.includes(PerpsSigner.USER)
345
+ })
346
+ const agentPrerequisites = actions.filter((a) => {
347
+ const signers = signersByAction.get(a.action) ?? []
348
+ return signers.includes(PerpsSigner.AGENT)
349
+ })
505
350
 
506
351
  return {
507
- userAuthorizations,
508
- agentAuthorizations,
352
+ userPrerequisites,
353
+ agentPrerequisites,
509
354
  isReady: false,
510
355
  }
511
356
  }
512
357
 
513
- /**
514
- * Execute authorizations: submit user-signed actions, then auto-sign and submit
515
- * any agent authorizations.
516
- *
517
- * @param params - User-signed actions and the required authorizations result
518
- * @returns Combined results from user and agent submissions
519
- */
520
- async executeAuthorizations(
521
- params: ExecuteAuthorizationsParams
522
- ): Promise<ExecuteAuthorizationsResult> {
523
- const { dex, address, required, userSignedActions } = params
524
- const mode = this.getSigningMode(address, dex)
525
-
526
- // 1. Submit user-signed actions (if any)
527
- let userResults: AuthorizationsResponse = { results: [] }
358
+ async buildPrerequisites(
359
+ params: CheckPrerequisitesParams
360
+ ): Promise<CreateActionResponse> {
361
+ const mode = await this.loadSigningMode(params.address, params.provider)
362
+ let { signerAddress } = params
363
+
364
+ if (mode === SigningMode.USER_AGENT && !signerAddress) {
365
+ const agent = await this.sdkClient.agentManager.getAgent(
366
+ params.address,
367
+ params.provider
368
+ )
369
+ signerAddress = agent.address
370
+ }
371
+
372
+ const metadata = await this.getProviderMetadata(params.provider)
373
+ const allInputs = this.buildPrerequisiteInputs(
374
+ metadata.prepareAccountActions,
375
+ mode,
376
+ signerAddress
377
+ )
378
+
379
+ // Use the first prerequisite type as the action type for the batch
380
+ // The backend handles all prerequisites in a single createPrerequisite call
381
+ const allActions: ActionStep[] = []
382
+ for (const input of allInputs) {
383
+ const { actions } = await createAction(this.sdkClient, {
384
+ provider: params.provider,
385
+ address: params.address,
386
+ signerAddress,
387
+ action: input.key as ActionType,
388
+ params: (input.params ?? {}) as Record<string, never>,
389
+ })
390
+ allActions.push(...actions)
391
+ }
392
+
393
+ return { actions: allActions }
394
+ }
395
+
396
+ async executePrerequisites(
397
+ params: ExecutePrerequisitesParams
398
+ ): Promise<ExecutePrerequisitesResult> {
399
+ const { provider, address, required, userSignedActions } = params
400
+ const mode = await this.loadSigningMode(address, provider)
401
+
402
+ // 1. Submit user-signed prerequisites
403
+ let userResults: ExecuteActionResponse = { results: [] }
528
404
  if (userSignedActions.length > 0) {
529
405
  const signerAddress =
530
- mode === 'USER_AGENT'
531
- ? (await this.sdkClient.agentManager.getAgent(address, dex)).address
406
+ mode === SigningMode.USER_AGENT
407
+ ? (await this.sdkClient.agentManager.getAgent(address, provider))
408
+ .address
532
409
  : address
533
- userResults = await submitAuthorization(this.sdkClient, {
534
- dex,
410
+
411
+ // Submit all user-signed actions — use first action's type for routing
412
+ const firstAction = required.userPrerequisites[0]?.action as string
413
+ userResults = await executeAction(this.sdkClient, {
414
+ provider,
535
415
  address,
536
416
  signerAddress,
417
+ action: (firstAction ?? ActionType.APPROVE_AGENT) as ActionType,
537
418
  actions: userSignedActions,
538
419
  })
539
420
 
540
- // Check for failures - return early if any user auth failed
541
- const failed = userResults.results.find((r) => !r.success)
542
- if (failed) {
421
+ const mandatoryFailure = userResults.results.find((r) => !r.success)
422
+ if (mandatoryFailure) {
543
423
  return { userResults }
544
424
  }
545
425
  }
546
426
 
547
- // 2. Auto-sign and submit agent authorizations (if any)
548
- // Typed data already built by getRequiredAuthorizations — just sign and submit
549
- if (required.agentAuthorizations.length > 0 && mode === 'USER_AGENT') {
550
- const agent = await this.sdkClient.agentManager.getAgent(address, dex)
427
+ // 2. Auto-sign and submit agent prerequisites
428
+ if (
429
+ required.agentPrerequisites.length > 0 &&
430
+ mode === SigningMode.USER_AGENT
431
+ ) {
432
+ const agent = await this.sdkClient.agentManager.getAgent(
433
+ address,
434
+ provider
435
+ )
551
436
 
552
- const signedAgentActions: SignedAuthorization[] = await Promise.all(
553
- required.agentAuthorizations.map(async (action) => ({
437
+ const signedAgentActions: SignedActionStep[] = await Promise.all(
438
+ required.agentPrerequisites.map(async (action) => ({
554
439
  action: action.action,
555
440
  typedData: action.typedData,
556
441
  signature: await signTypedData(agent.privateKey, action.typedData),
557
442
  }))
558
443
  )
559
444
 
560
- const agentResults = await submitAuthorization(this.sdkClient, {
561
- dex,
445
+ const firstAction = required.agentPrerequisites[0]?.action as string
446
+ const agentResults = await executeAction(this.sdkClient, {
447
+ provider,
562
448
  address,
563
449
  signerAddress: agent.address,
450
+ action: (firstAction ?? ActionType.AGENT_SET_ABSTRACTION) as ActionType,
564
451
  actions: signedAgentActions,
565
452
  })
566
453
 
454
+ // If AGENT_SET_ABSTRACTION failed (e.g. dexAbstraction → unified upgrade),
455
+ // fall back to USER_SET_ABSTRACTION so the user can sign it manually.
456
+ const abstractionFailed = agentResults.results.some(
457
+ (r) => !r.success && r.action === ActionType.AGENT_SET_ABSTRACTION
458
+ )
459
+
460
+ if (abstractionFailed) {
461
+ const { actions: fallbackActions } = await createAction(
462
+ this.sdkClient,
463
+ {
464
+ provider,
465
+ address,
466
+ action: ActionType.USER_SET_ABSTRACTION,
467
+ params: {} as ActionParamsMap[ActionType.USER_SET_ABSTRACTION],
468
+ }
469
+ )
470
+
471
+ if (fallbackActions.length > 0) {
472
+ return {
473
+ userResults,
474
+ agentResults,
475
+ fallbackUserPrerequisites: fallbackActions,
476
+ }
477
+ }
478
+ }
479
+
567
480
  return { userResults, agentResults }
568
481
  }
569
482
 
570
483
  return { userResults }
571
484
  }
485
+
486
+ // ---------------------------------------------------------------------------
487
+ // Trading — build (USER mode) methods
488
+ // ---------------------------------------------------------------------------
489
+
490
+ async buildOrder(params: PlaceOrderParams): Promise<CreateActionResponse> {
491
+ return this.buildAction(ActionType.PLACE_ORDER, {
492
+ provider: params.provider,
493
+ address: params.address,
494
+ params: {
495
+ asset: params.asset,
496
+ side: params.side,
497
+ type: params.type,
498
+ size: params.size,
499
+ price: params.price,
500
+ leverage: params.leverage,
501
+ reduceOnly: params.reduceOnly,
502
+ timeInForce: params.timeInForce,
503
+ expiresAt: params.expiresAt,
504
+ takeProfit: params.takeProfit,
505
+ stopLoss: params.stopLoss,
506
+ },
507
+ })
508
+ }
509
+
510
+ async buildTriggerOrder(
511
+ params: PlaceTriggerOrderParams
512
+ ): Promise<CreateActionResponse> {
513
+ return this.buildAction(ActionType.PLACE_TRIGGER_ORDER, {
514
+ provider: params.provider,
515
+ address: params.address,
516
+ params: {
517
+ asset: params.asset,
518
+ side: params.side,
519
+ takeProfit: params.takeProfit,
520
+ stopLoss: params.stopLoss,
521
+ },
522
+ })
523
+ }
524
+
525
+ async buildCancelOrder(
526
+ params: CancelOrdersParams
527
+ ): Promise<CreateActionResponse> {
528
+ return this.buildAction(ActionType.CANCEL_ORDER, {
529
+ provider: params.provider,
530
+ address: params.address,
531
+ params: { ids: params.ids },
532
+ })
533
+ }
534
+
535
+ async buildModifyOrder(
536
+ params: ModifyOrdersParams
537
+ ): Promise<CreateActionResponse> {
538
+ return this.buildAction(ActionType.MODIFY_ORDER, {
539
+ provider: params.provider,
540
+ address: params.address,
541
+ params: {
542
+ modifications: params.modifications,
543
+ },
544
+ })
545
+ }
546
+
547
+ async buildPositionMargin(params: {
548
+ provider: string
549
+ address: Address
550
+ asset: AssetIdentity
551
+ action: 'add' | 'remove'
552
+ amount: string
553
+ }): Promise<CreateActionResponse> {
554
+ return this.buildAction(ActionType.UPDATE_POSITION_MARGIN, {
555
+ provider: params.provider,
556
+ address: params.address,
557
+ params: {
558
+ asset: params.asset,
559
+ action: params.action,
560
+ amount: params.amount,
561
+ },
562
+ })
563
+ }
564
+
565
+ async buildWithdrawal(
566
+ params: BuildWithdrawalParams
567
+ ): Promise<CreateActionResponse> {
568
+ return this.buildAction(ActionType.WITHDRAWAL, {
569
+ provider: params.provider,
570
+ address: params.address,
571
+ params: params.withdrawal,
572
+ })
573
+ }
574
+
575
+ // ---------------------------------------------------------------------------
576
+ // Trading — submit signed actions (USER mode)
577
+ // ---------------------------------------------------------------------------
578
+
579
+ async submitSignedOrder(params: {
580
+ provider: string
581
+ address: Address
582
+ actions: SignedActionStep[]
583
+ }): Promise<ExecuteActionResponse> {
584
+ return this.submitSignedAction(ActionType.PLACE_ORDER, params)
585
+ }
586
+
587
+ async submitSignedPosition(params: {
588
+ provider: string
589
+ address: Address
590
+ actions: SignedActionStep[]
591
+ }): Promise<ExecuteActionResponse> {
592
+ return this.submitSignedAction(ActionType.UPDATE_POSITION_MARGIN, params)
593
+ }
594
+
595
+ async submitWithdrawal(params: {
596
+ provider: string
597
+ address: Address
598
+ action: SignedActionStep
599
+ }): Promise<ExecuteActionResponse> {
600
+ return this.submitSignedAction(ActionType.WITHDRAWAL, {
601
+ provider: params.provider,
602
+ address: params.address,
603
+ actions: [params.action],
604
+ })
605
+ }
606
+
607
+ // ---------------------------------------------------------------------------
608
+ // Trading — auto-sign (USER_AGENT mode)
609
+ // ---------------------------------------------------------------------------
610
+
611
+ async placeOrder(params: PlaceOrderParams): Promise<ExecuteActionResponse> {
612
+ await this.loadSigningMode(params.address, params.provider)
613
+ this.requireAgentMode(params.address, params.provider, 'placeOrder()')
614
+
615
+ const { actions } = await this.buildOrder(params)
616
+ return this.autoSignAndExecute(
617
+ params.provider,
618
+ params.address,
619
+ ActionType.PLACE_ORDER,
620
+ actions
621
+ )
622
+ }
623
+
624
+ async placeTriggerOrder(
625
+ params: PlaceTriggerOrderParams
626
+ ): Promise<ExecuteActionResponse> {
627
+ await this.loadSigningMode(params.address, params.provider)
628
+ this.requireAgentMode(
629
+ params.address,
630
+ params.provider,
631
+ 'placeTriggerOrder()'
632
+ )
633
+
634
+ const { actions } = await this.buildTriggerOrder(params)
635
+ return this.autoSignAndExecute(
636
+ params.provider,
637
+ params.address,
638
+ ActionType.PLACE_TRIGGER_ORDER,
639
+ actions
640
+ )
641
+ }
642
+
643
+ async cancelOrders(
644
+ params: CancelOrdersParams
645
+ ): Promise<ExecuteActionResponse> {
646
+ await this.loadSigningMode(params.address, params.provider)
647
+ this.requireAgentMode(params.address, params.provider, 'cancelOrders()')
648
+
649
+ const { actions } = await this.buildCancelOrder(params)
650
+ return this.autoSignAndExecute(
651
+ params.provider,
652
+ params.address,
653
+ ActionType.CANCEL_ORDER,
654
+ actions
655
+ )
656
+ }
657
+
658
+ async modifyOrders(
659
+ params: ModifyOrdersParams
660
+ ): Promise<ExecuteActionResponse> {
661
+ await this.loadSigningMode(params.address, params.provider)
662
+ this.requireAgentMode(params.address, params.provider, 'modifyOrders()')
663
+
664
+ const { actions } = await this.buildModifyOrder(params)
665
+ return this.autoSignAndExecute(
666
+ params.provider,
667
+ params.address,
668
+ ActionType.MODIFY_ORDER,
669
+ actions
670
+ )
671
+ }
672
+
673
+ async updatePositionMargin(params: {
674
+ provider: string
675
+ address: Address
676
+ asset: AssetIdentity
677
+ action: 'add' | 'remove'
678
+ amount: string
679
+ }): Promise<ExecuteActionResponse> {
680
+ await this.loadSigningMode(params.address, params.provider)
681
+ this.requireAgentMode(
682
+ params.address,
683
+ params.provider,
684
+ 'updatePositionMargin()'
685
+ )
686
+
687
+ const { actions } = await this.buildPositionMargin(params)
688
+ return this.autoSignAndExecute(
689
+ params.provider,
690
+ params.address,
691
+ ActionType.UPDATE_POSITION_MARGIN,
692
+ actions
693
+ )
694
+ }
572
695
  }