perp-cli 0.3.3

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 (325) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +293 -0
  3. package/dist/__tests__/alert-logic.test.d.ts +1 -0
  4. package/dist/__tests__/alert-logic.test.js +107 -0
  5. package/dist/__tests__/arb-auto-3dex.test.d.ts +1 -0
  6. package/dist/__tests__/arb-auto-3dex.test.js +397 -0
  7. package/dist/__tests__/arb-history-stats.test.d.ts +1 -0
  8. package/dist/__tests__/arb-history-stats.test.js +176 -0
  9. package/dist/__tests__/arb-logic.test.d.ts +1 -0
  10. package/dist/__tests__/arb-logic.test.js +84 -0
  11. package/dist/__tests__/arb-manage.test.d.ts +1 -0
  12. package/dist/__tests__/arb-manage.test.js +253 -0
  13. package/dist/__tests__/arb-new-features.test.d.ts +1 -0
  14. package/dist/__tests__/arb-new-features.test.js +457 -0
  15. package/dist/__tests__/arb-sizing.test.d.ts +1 -0
  16. package/dist/__tests__/arb-sizing.test.js +48 -0
  17. package/dist/__tests__/arb-state.test.d.ts +1 -0
  18. package/dist/__tests__/arb-state.test.js +284 -0
  19. package/dist/__tests__/arb-userflow.test.d.ts +1 -0
  20. package/dist/__tests__/arb-userflow.test.js +945 -0
  21. package/dist/__tests__/arb-utils.test.d.ts +1 -0
  22. package/dist/__tests__/arb-utils.test.js +264 -0
  23. package/dist/__tests__/bot-conditions.test.d.ts +1 -0
  24. package/dist/__tests__/bot-conditions.test.js +341 -0
  25. package/dist/__tests__/client-id-tracker.test.d.ts +1 -0
  26. package/dist/__tests__/client-id-tracker.test.js +137 -0
  27. package/dist/__tests__/commands/new-atomic-commands.test.d.ts +1 -0
  28. package/dist/__tests__/commands/new-atomic-commands.test.js +502 -0
  29. package/dist/__tests__/commands/order-intent.test.d.ts +1 -0
  30. package/dist/__tests__/commands/order-intent.test.js +600 -0
  31. package/dist/__tests__/commands/trade-commands.test.d.ts +1 -0
  32. package/dist/__tests__/commands/trade-commands.test.js +821 -0
  33. package/dist/__tests__/config.test.d.ts +1 -0
  34. package/dist/__tests__/config.test.js +86 -0
  35. package/dist/__tests__/cross-chain-margin.test.d.ts +1 -0
  36. package/dist/__tests__/cross-chain-margin.test.js +287 -0
  37. package/dist/__tests__/dex-asset-map.test.d.ts +1 -0
  38. package/dist/__tests__/dex-asset-map.test.js +191 -0
  39. package/dist/__tests__/errors.test.d.ts +1 -0
  40. package/dist/__tests__/errors.test.js +110 -0
  41. package/dist/__tests__/event-stream.test.d.ts +1 -0
  42. package/dist/__tests__/event-stream.test.js +276 -0
  43. package/dist/__tests__/exchanges/interface.test.d.ts +1 -0
  44. package/dist/__tests__/exchanges/interface.test.js +132 -0
  45. package/dist/__tests__/exchanges/mock-adapter.d.ts +69 -0
  46. package/dist/__tests__/exchanges/mock-adapter.js +137 -0
  47. package/dist/__tests__/execution-log.test.d.ts +1 -0
  48. package/dist/__tests__/execution-log.test.js +106 -0
  49. package/dist/__tests__/funding-calc.test.d.ts +1 -0
  50. package/dist/__tests__/funding-calc.test.js +71 -0
  51. package/dist/__tests__/funding-history.test.d.ts +1 -0
  52. package/dist/__tests__/funding-history.test.js +343 -0
  53. package/dist/__tests__/funding-rates.test.d.ts +1 -0
  54. package/dist/__tests__/funding-rates.test.js +342 -0
  55. package/dist/__tests__/funding.test.d.ts +1 -0
  56. package/dist/__tests__/funding.test.js +173 -0
  57. package/dist/__tests__/gap-logic.test.d.ts +1 -0
  58. package/dist/__tests__/gap-logic.test.js +43 -0
  59. package/dist/__tests__/hip3-dex.test.d.ts +1 -0
  60. package/dist/__tests__/hip3-dex.test.js +234 -0
  61. package/dist/__tests__/integration/agent-features.integration.test.d.ts +1 -0
  62. package/dist/__tests__/integration/agent-features.integration.test.js +553 -0
  63. package/dist/__tests__/integration/atomic-commands.integration.test.d.ts +13 -0
  64. package/dist/__tests__/integration/atomic-commands.integration.test.js +246 -0
  65. package/dist/__tests__/integration/bridge-simulation.integration.test.d.ts +1 -0
  66. package/dist/__tests__/integration/bridge-simulation.integration.test.js +453 -0
  67. package/dist/__tests__/integration/bridge-strict.integration.test.d.ts +1 -0
  68. package/dist/__tests__/integration/bridge-strict.integration.test.js +812 -0
  69. package/dist/__tests__/integration/bridge.integration.test.d.ts +1 -0
  70. package/dist/__tests__/integration/bridge.integration.test.js +309 -0
  71. package/dist/__tests__/integration/cli-e2e.integration.test.d.ts +1 -0
  72. package/dist/__tests__/integration/cli-e2e.integration.test.js +202 -0
  73. package/dist/__tests__/integration/dex-arb.integration.test.d.ts +1 -0
  74. package/dist/__tests__/integration/dex-arb.integration.test.js +116 -0
  75. package/dist/__tests__/integration/envelope-consistency.integration.test.d.ts +13 -0
  76. package/dist/__tests__/integration/envelope-consistency.integration.test.js +205 -0
  77. package/dist/__tests__/integration/hip3-dex.integration.test.d.ts +1 -0
  78. package/dist/__tests__/integration/hip3-dex.integration.test.js +147 -0
  79. package/dist/__tests__/integration/hyperliquid.integration.test.d.ts +1 -0
  80. package/dist/__tests__/integration/hyperliquid.integration.test.js +79 -0
  81. package/dist/__tests__/integration/lighter.integration.test.d.ts +1 -0
  82. package/dist/__tests__/integration/lighter.integration.test.js +53 -0
  83. package/dist/__tests__/integration/new-commands-e2e.integration.test.d.ts +9 -0
  84. package/dist/__tests__/integration/new-commands-e2e.integration.test.js +236 -0
  85. package/dist/__tests__/integration/order-verification.integration.test.d.ts +1 -0
  86. package/dist/__tests__/integration/order-verification.integration.test.js +321 -0
  87. package/dist/__tests__/integration/pacifica.integration.test.d.ts +1 -0
  88. package/dist/__tests__/integration/pacifica.integration.test.js +75 -0
  89. package/dist/__tests__/integration/response-shapes.integration.test.d.ts +1 -0
  90. package/dist/__tests__/integration/response-shapes.integration.test.js +278 -0
  91. package/dist/__tests__/liquidity.test.d.ts +1 -0
  92. package/dist/__tests__/liquidity.test.js +225 -0
  93. package/dist/__tests__/plan-executor.test.d.ts +1 -0
  94. package/dist/__tests__/plan-executor.test.js +314 -0
  95. package/dist/__tests__/position-history.test.d.ts +1 -0
  96. package/dist/__tests__/position-history.test.js +367 -0
  97. package/dist/__tests__/retry.test.d.ts +1 -0
  98. package/dist/__tests__/retry.test.js +310 -0
  99. package/dist/__tests__/risk-assessment.test.d.ts +1 -0
  100. package/dist/__tests__/risk-assessment.test.js +145 -0
  101. package/dist/__tests__/security-adversarial.test.d.ts +1 -0
  102. package/dist/__tests__/security-adversarial.test.js +574 -0
  103. package/dist/__tests__/strategies.test.d.ts +1 -0
  104. package/dist/__tests__/strategies.test.js +539 -0
  105. package/dist/__tests__/trade-execution.test.d.ts +1 -0
  106. package/dist/__tests__/trade-execution.test.js +129 -0
  107. package/dist/__tests__/trade-validator.test.d.ts +1 -0
  108. package/dist/__tests__/trade-validator.test.js +655 -0
  109. package/dist/__tests__/utils.test.d.ts +1 -0
  110. package/dist/__tests__/utils.test.js +76 -0
  111. package/dist/api/public/hyperliquid.d.ts +18 -0
  112. package/dist/api/public/hyperliquid.js +82 -0
  113. package/dist/api/public/index.d.ts +8 -0
  114. package/dist/api/public/index.js +8 -0
  115. package/dist/api/public/lighter.d.ts +24 -0
  116. package/dist/api/public/lighter.js +100 -0
  117. package/dist/api/public/pacifica.d.ts +17 -0
  118. package/dist/api/public/pacifica.js +54 -0
  119. package/dist/api/public/urls.d.ts +12 -0
  120. package/dist/api/public/urls.js +33 -0
  121. package/dist/arb/history-stats.d.ts +44 -0
  122. package/dist/arb/history-stats.js +135 -0
  123. package/dist/arb/index.d.ts +4 -0
  124. package/dist/arb/index.js +4 -0
  125. package/dist/arb/sizing.d.ts +23 -0
  126. package/dist/arb/sizing.js +96 -0
  127. package/dist/arb/state.d.ts +51 -0
  128. package/dist/arb/state.js +112 -0
  129. package/dist/arb/utils.d.ts +81 -0
  130. package/dist/arb/utils.js +267 -0
  131. package/dist/arb-history-stats.d.ts +5 -0
  132. package/dist/arb-history-stats.js +5 -0
  133. package/dist/arb-sizing.d.ts +5 -0
  134. package/dist/arb-sizing.js +5 -0
  135. package/dist/arb-state.d.ts +5 -0
  136. package/dist/arb-state.js +5 -0
  137. package/dist/arb-utils.d.ts +5 -0
  138. package/dist/arb-utils.js +5 -0
  139. package/dist/bot/conditions.d.ts +32 -0
  140. package/dist/bot/conditions.js +141 -0
  141. package/dist/bot/config.d.ts +76 -0
  142. package/dist/bot/config.js +160 -0
  143. package/dist/bot/engine.d.ts +8 -0
  144. package/dist/bot/engine.js +519 -0
  145. package/dist/bot/presets.d.ts +11 -0
  146. package/dist/bot/presets.js +296 -0
  147. package/dist/bridge-engine.d.ts +133 -0
  148. package/dist/bridge-engine.js +1487 -0
  149. package/dist/cache.d.ts +25 -0
  150. package/dist/cache.js +99 -0
  151. package/dist/cli-spec.d.ts +50 -0
  152. package/dist/cli-spec.js +75 -0
  153. package/dist/client-id-tracker.d.ts +25 -0
  154. package/dist/client-id-tracker.js +76 -0
  155. package/dist/commands/account.d.ts +3 -0
  156. package/dist/commands/account.js +425 -0
  157. package/dist/commands/agent.d.ts +3 -0
  158. package/dist/commands/agent.js +386 -0
  159. package/dist/commands/alert.d.ts +2 -0
  160. package/dist/commands/alert.js +421 -0
  161. package/dist/commands/analytics.d.ts +3 -0
  162. package/dist/commands/analytics.js +311 -0
  163. package/dist/commands/arb/index.d.ts +3 -0
  164. package/dist/commands/arb/index.js +921 -0
  165. package/dist/commands/arb-auto.d.ts +54 -0
  166. package/dist/commands/arb-auto.js +1328 -0
  167. package/dist/commands/arb-manage.d.ts +5 -0
  168. package/dist/commands/arb-manage.js +5 -0
  169. package/dist/commands/arb.d.ts +2 -0
  170. package/dist/commands/arb.js +347 -0
  171. package/dist/commands/backtest.d.ts +2 -0
  172. package/dist/commands/backtest.js +327 -0
  173. package/dist/commands/bot.d.ts +3 -0
  174. package/dist/commands/bot.js +412 -0
  175. package/dist/commands/bridge.d.ts +2 -0
  176. package/dist/commands/bridge.js +396 -0
  177. package/dist/commands/dashboard.d.ts +3 -0
  178. package/dist/commands/dashboard.js +176 -0
  179. package/dist/commands/deposit.d.ts +4 -0
  180. package/dist/commands/deposit.js +573 -0
  181. package/dist/commands/dex.d.ts +3 -0
  182. package/dist/commands/dex.js +114 -0
  183. package/dist/commands/env.d.ts +2 -0
  184. package/dist/commands/env.js +136 -0
  185. package/dist/commands/funding.d.ts +2 -0
  186. package/dist/commands/funding.js +347 -0
  187. package/dist/commands/gap.d.ts +2 -0
  188. package/dist/commands/gap.js +305 -0
  189. package/dist/commands/health.d.ts +2 -0
  190. package/dist/commands/health.js +67 -0
  191. package/dist/commands/history.d.ts +2 -0
  192. package/dist/commands/history.js +235 -0
  193. package/dist/commands/init.d.ts +15 -0
  194. package/dist/commands/init.js +266 -0
  195. package/dist/commands/jobs.d.ts +2 -0
  196. package/dist/commands/jobs.js +133 -0
  197. package/dist/commands/manage.d.ts +4 -0
  198. package/dist/commands/manage.js +309 -0
  199. package/dist/commands/market.d.ts +3 -0
  200. package/dist/commands/market.js +225 -0
  201. package/dist/commands/plan.d.ts +3 -0
  202. package/dist/commands/plan.js +95 -0
  203. package/dist/commands/portfolio.d.ts +3 -0
  204. package/dist/commands/portfolio.js +169 -0
  205. package/dist/commands/rebalance.d.ts +3 -0
  206. package/dist/commands/rebalance.js +293 -0
  207. package/dist/commands/risk.d.ts +3 -0
  208. package/dist/commands/risk.js +169 -0
  209. package/dist/commands/run.d.ts +3 -0
  210. package/dist/commands/run.js +202 -0
  211. package/dist/commands/settings.d.ts +2 -0
  212. package/dist/commands/settings.js +102 -0
  213. package/dist/commands/stream.d.ts +5 -0
  214. package/dist/commands/stream.js +123 -0
  215. package/dist/commands/trade.d.ts +3 -0
  216. package/dist/commands/trade.js +1273 -0
  217. package/dist/commands/wallet.d.ts +14 -0
  218. package/dist/commands/wallet.js +602 -0
  219. package/dist/commands/withdraw.d.ts +3 -0
  220. package/dist/commands/withdraw.js +187 -0
  221. package/dist/config.d.ts +5 -0
  222. package/dist/config.js +68 -0
  223. package/dist/cross-chain-margin.d.ts +46 -0
  224. package/dist/cross-chain-margin.js +107 -0
  225. package/dist/dashboard/server.d.ts +80 -0
  226. package/dist/dashboard/server.js +340 -0
  227. package/dist/dashboard/ui.d.ts +4 -0
  228. package/dist/dashboard/ui.js +538 -0
  229. package/dist/dashboard/ws-feeds.d.ts +29 -0
  230. package/dist/dashboard/ws-feeds.js +660 -0
  231. package/dist/dex-asset-map.d.ts +80 -0
  232. package/dist/dex-asset-map.js +201 -0
  233. package/dist/errors.d.ts +109 -0
  234. package/dist/errors.js +84 -0
  235. package/dist/event-stream.d.ts +25 -0
  236. package/dist/event-stream.js +168 -0
  237. package/dist/exchanges/hyperliquid.d.ts +212 -0
  238. package/dist/exchanges/hyperliquid.js +931 -0
  239. package/dist/exchanges/interface.d.ts +95 -0
  240. package/dist/exchanges/interface.js +5 -0
  241. package/dist/exchanges/lighter.d.ts +159 -0
  242. package/dist/exchanges/lighter.js +793 -0
  243. package/dist/exchanges/pacifica.d.ts +51 -0
  244. package/dist/exchanges/pacifica.js +248 -0
  245. package/dist/execution-log.d.ts +36 -0
  246. package/dist/execution-log.js +102 -0
  247. package/dist/funding/history.d.ts +63 -0
  248. package/dist/funding/history.js +266 -0
  249. package/dist/funding/index.d.ts +3 -0
  250. package/dist/funding/index.js +3 -0
  251. package/dist/funding/normalize.d.ts +39 -0
  252. package/dist/funding/normalize.js +66 -0
  253. package/dist/funding/rates.d.ts +45 -0
  254. package/dist/funding/rates.js +172 -0
  255. package/dist/funding-history.d.ts +5 -0
  256. package/dist/funding-history.js +5 -0
  257. package/dist/funding-rates.d.ts +5 -0
  258. package/dist/funding-rates.js +5 -0
  259. package/dist/funding.d.ts +5 -0
  260. package/dist/funding.js +5 -0
  261. package/dist/index.d.ts +2 -0
  262. package/dist/index.js +458 -0
  263. package/dist/jobs.d.ts +37 -0
  264. package/dist/jobs.js +152 -0
  265. package/dist/liquidity.d.ts +34 -0
  266. package/dist/liquidity.js +100 -0
  267. package/dist/mcp-server.d.ts +9 -0
  268. package/dist/mcp-server.js +1206 -0
  269. package/dist/pacifica/client.d.ts +111 -0
  270. package/dist/pacifica/client.js +310 -0
  271. package/dist/pacifica/constants.d.ts +27 -0
  272. package/dist/pacifica/constants.js +47 -0
  273. package/dist/pacifica/deposit.d.ts +14 -0
  274. package/dist/pacifica/deposit.js +78 -0
  275. package/dist/pacifica/index.d.ts +6 -0
  276. package/dist/pacifica/index.js +11 -0
  277. package/dist/pacifica/signing.d.ts +49 -0
  278. package/dist/pacifica/signing.js +97 -0
  279. package/dist/pacifica/types/account.d.ts +42 -0
  280. package/dist/pacifica/types/account.js +1 -0
  281. package/dist/pacifica/types/index.d.ts +6 -0
  282. package/dist/pacifica/types/index.js +6 -0
  283. package/dist/pacifica/types/lake.d.ts +18 -0
  284. package/dist/pacifica/types/lake.js +1 -0
  285. package/dist/pacifica/types/market.d.ts +64 -0
  286. package/dist/pacifica/types/market.js +1 -0
  287. package/dist/pacifica/types/order.d.ts +92 -0
  288. package/dist/pacifica/types/order.js +1 -0
  289. package/dist/pacifica/types/position.d.ts +25 -0
  290. package/dist/pacifica/types/position.js +1 -0
  291. package/dist/pacifica/types/ws.d.ts +34 -0
  292. package/dist/pacifica/types/ws.js +41 -0
  293. package/dist/pacifica/ws-client.d.ts +42 -0
  294. package/dist/pacifica/ws-client.js +180 -0
  295. package/dist/plan-executor.d.ts +48 -0
  296. package/dist/plan-executor.js +280 -0
  297. package/dist/position-history.d.ts +68 -0
  298. package/dist/position-history.js +222 -0
  299. package/dist/rebalance.d.ts +64 -0
  300. package/dist/rebalance.js +142 -0
  301. package/dist/retry.d.ts +74 -0
  302. package/dist/retry.js +129 -0
  303. package/dist/risk.d.ts +48 -0
  304. package/dist/risk.js +156 -0
  305. package/dist/settings.d.ts +19 -0
  306. package/dist/settings.js +45 -0
  307. package/dist/shared-api.d.ts +5 -0
  308. package/dist/shared-api.js +5 -0
  309. package/dist/strategies/dca.d.ts +25 -0
  310. package/dist/strategies/dca.js +114 -0
  311. package/dist/strategies/funding-arb.d.ts +15 -0
  312. package/dist/strategies/funding-arb.js +281 -0
  313. package/dist/strategies/grid.d.ts +34 -0
  314. package/dist/strategies/grid.js +185 -0
  315. package/dist/strategies/trailing-stop.d.ts +17 -0
  316. package/dist/strategies/trailing-stop.js +121 -0
  317. package/dist/strategies/twap.d.ts +20 -0
  318. package/dist/strategies/twap.js +78 -0
  319. package/dist/trade-validator.d.ts +39 -0
  320. package/dist/trade-validator.js +154 -0
  321. package/dist/utils.d.ts +38 -0
  322. package/dist/utils.js +110 -0
  323. package/package.json +63 -0
  324. package/skills/perp-cli/SKILL.md +149 -0
  325. package/skills/perp-cli/references/commands.md +143 -0
@@ -0,0 +1,97 @@
1
+ import bs58 from "bs58";
2
+ import { DEFAULT_EXPIRY_WINDOW } from "./constants.js";
3
+ /**
4
+ * Recursively sort all object keys alphabetically.
5
+ * Exact port of Python SDK's sort_json_keys().
6
+ */
7
+ export function sortJsonKeys(value) {
8
+ if (value === null || value === undefined)
9
+ return value;
10
+ if (Array.isArray(value)) {
11
+ return value.map(sortJsonKeys);
12
+ }
13
+ if (typeof value === "object") {
14
+ const sorted = {};
15
+ for (const key of Object.keys(value).sort()) {
16
+ sorted[key] = sortJsonKeys(value[key]);
17
+ }
18
+ return sorted;
19
+ }
20
+ return value;
21
+ }
22
+ /**
23
+ * Prepare the message string for signing.
24
+ * Exact port of Python SDK's prepare_message().
25
+ *
26
+ * Header must contain: type, timestamp, expiry_window
27
+ * Returns compact JSON with sorted keys and payload nested under "data".
28
+ */
29
+ export function prepareMessage(header, payload) {
30
+ if (!header.type || !header.timestamp || !header.expiry_window) {
31
+ throw new Error("Header must have type, timestamp, and expiry_window");
32
+ }
33
+ const data = {
34
+ ...header,
35
+ data: payload,
36
+ };
37
+ const sorted = sortJsonKeys(data);
38
+ // JSON.stringify with no space args produces compact JSON (same as Python separators=(",",":"))
39
+ return JSON.stringify(sorted);
40
+ }
41
+ /**
42
+ * Create a signing header with current timestamp.
43
+ */
44
+ export function createHeader(type, expiryWindow = DEFAULT_EXPIRY_WINDOW) {
45
+ return {
46
+ type,
47
+ timestamp: Date.now(),
48
+ expiry_window: expiryWindow,
49
+ };
50
+ }
51
+ /**
52
+ * Sign a message using a wallet adapter's signMessage function.
53
+ * Used in browser context with Phantom/Solflare/etc.
54
+ *
55
+ * @param header - Operation header (type, timestamp, expiry_window)
56
+ * @param payload - Operation payload
57
+ * @param signMessage - Wallet adapter's signMessage function
58
+ * @returns [message, base58EncodedSignature]
59
+ */
60
+ export async function signWithWallet(header, payload, signMessage) {
61
+ const message = prepareMessage(header, payload);
62
+ const messageBytes = new TextEncoder().encode(message);
63
+ const signatureBytes = await signMessage(messageBytes);
64
+ const signature = bs58.encode(signatureBytes);
65
+ return [message, signature];
66
+ }
67
+ /**
68
+ * Build a signed request body for REST API POST.
69
+ * Flattens payload to top level and adds account, signature, timestamp, expiry_window.
70
+ */
71
+ export async function buildSignedRequest(operationType, payload, account, signMessage, expiryWindow = DEFAULT_EXPIRY_WINDOW) {
72
+ const header = createHeader(operationType, expiryWindow);
73
+ const [, signature] = await signWithWallet(header, payload, signMessage);
74
+ return {
75
+ account,
76
+ signature,
77
+ timestamp: header.timestamp,
78
+ expiry_window: header.expiry_window,
79
+ ...payload,
80
+ };
81
+ }
82
+ /**
83
+ * Build a signed request with agent wallet.
84
+ * Used when an agent wallet is trading on behalf of a main account.
85
+ */
86
+ export async function buildAgentSignedRequest(operationType, payload, mainAccount, agentWallet, signMessage, expiryWindow = DEFAULT_EXPIRY_WINDOW) {
87
+ const header = createHeader(operationType, expiryWindow);
88
+ const [, signature] = await signWithWallet(header, payload, signMessage);
89
+ return {
90
+ account: mainAccount,
91
+ agent_wallet: agentWallet,
92
+ signature,
93
+ timestamp: header.timestamp,
94
+ expiry_window: header.expiry_window,
95
+ ...payload,
96
+ };
97
+ }
@@ -0,0 +1,42 @@
1
+ export interface AccountInfo {
2
+ balance: string;
3
+ fee_level: number;
4
+ maker_fee: string;
5
+ taker_fee: string;
6
+ account_equity: string;
7
+ available_to_spend: string;
8
+ available_to_withdraw: string;
9
+ pending_balance: string;
10
+ pending_interest: string;
11
+ total_margin_used: string;
12
+ cross_mmr: string;
13
+ positions_count: number;
14
+ orders_count: number;
15
+ stop_orders_count: number;
16
+ }
17
+ export interface AccountSettings {
18
+ symbol: string;
19
+ margin_mode: "cross" | "isolated";
20
+ leverage: number;
21
+ }
22
+ export interface SubaccountInfo {
23
+ subaccount_name: string;
24
+ subaccount_address: string;
25
+ }
26
+ export interface TransferFundsParams {
27
+ from_account: string;
28
+ to_account: string;
29
+ amount: string;
30
+ }
31
+ export interface WithdrawParams {
32
+ amount: string;
33
+ dest_address: string;
34
+ }
35
+ export interface UpdateLeverageParams {
36
+ symbol: string;
37
+ leverage: number;
38
+ }
39
+ export interface UpdateMarginModeParams {
40
+ symbol: string;
41
+ is_isolated: boolean;
42
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export * from "./market.js";
2
+ export * from "./order.js";
3
+ export * from "./position.js";
4
+ export * from "./account.js";
5
+ export * from "./ws.js";
6
+ export * from "./lake.js";
@@ -0,0 +1,6 @@
1
+ export * from "./market.js";
2
+ export * from "./order.js";
3
+ export * from "./position.js";
4
+ export * from "./account.js";
5
+ export * from "./ws.js";
6
+ export * from "./lake.js";
@@ -0,0 +1,18 @@
1
+ export interface CreateLakeParams {
2
+ symbol: string;
3
+ amount: string;
4
+ }
5
+ export interface LakeDepositParams {
6
+ lake_id: string;
7
+ amount: string;
8
+ }
9
+ export interface LakeWithdrawParams {
10
+ lake_id: string;
11
+ amount: string;
12
+ }
13
+ export interface LakeInfo {
14
+ lake_id: string;
15
+ symbol: string;
16
+ amount: string;
17
+ created_at: number;
18
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,64 @@
1
+ export interface MarketInfo {
2
+ symbol: string;
3
+ tick_size: string;
4
+ lot_size: string;
5
+ max_leverage: number;
6
+ funding_rate: string;
7
+ next_funding_rate: string;
8
+ open_interest: string;
9
+ volume_24h: string;
10
+ mark_price: string;
11
+ index_price: string;
12
+ }
13
+ export interface PriceInfo {
14
+ symbol: string;
15
+ mark: string;
16
+ mid: string;
17
+ oracle: string;
18
+ funding: string;
19
+ next_funding: string;
20
+ open_interest: string;
21
+ volume_24h: string;
22
+ timestamp: number;
23
+ }
24
+ export interface OrderbookEntry {
25
+ p: string;
26
+ a: string;
27
+ n: number;
28
+ }
29
+ export interface Orderbook {
30
+ s: string;
31
+ l: [OrderbookEntry[], OrderbookEntry[]];
32
+ t: number;
33
+ li: number;
34
+ }
35
+ export interface Trade {
36
+ event_type: string;
37
+ price: string;
38
+ amount: string;
39
+ side: "bid" | "ask";
40
+ cause: string;
41
+ created_at: number;
42
+ }
43
+ export interface Kline {
44
+ t: number;
45
+ T: number;
46
+ s: string;
47
+ i: string;
48
+ o: string;
49
+ c: string;
50
+ h: string;
51
+ l: string;
52
+ v: string;
53
+ n: number;
54
+ }
55
+ export interface FundingRateHistory {
56
+ oracle_price: string;
57
+ bid_impact_price: string;
58
+ ask_impact_price: string;
59
+ funding_rate: string;
60
+ next_funding_rate: string;
61
+ created_at: number;
62
+ }
63
+ export type KlineInterval = "1m" | "3m" | "5m" | "15m" | "30m" | "1h" | "2h" | "4h" | "8h" | "12h" | "1d";
64
+ export type AggLevel = 1 | 10 | 100 | 1000 | 10000;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
1
+ export type Side = "bid" | "ask";
2
+ export type TimeInForce = "GTC" | "IOC" | "ALO" | "TOB";
3
+ export interface MarketOrderParams {
4
+ symbol: string;
5
+ amount: string;
6
+ side: Side;
7
+ slippage_percent: string;
8
+ reduce_only: boolean;
9
+ client_order_id?: string;
10
+ }
11
+ export interface LimitOrderParams {
12
+ symbol: string;
13
+ price: string;
14
+ amount: string;
15
+ side: Side;
16
+ tif: TimeInForce;
17
+ reduce_only: boolean;
18
+ client_order_id?: string;
19
+ }
20
+ export interface StopOrderParams {
21
+ symbol: string;
22
+ side: Side;
23
+ reduce_only: boolean;
24
+ stop_order: {
25
+ stop_price: string;
26
+ amount: string;
27
+ limit_price?: string;
28
+ client_order_id?: string;
29
+ };
30
+ }
31
+ export interface EditOrderParams {
32
+ symbol: string;
33
+ order_id: number;
34
+ price: string;
35
+ amount: string;
36
+ }
37
+ export interface CancelOrderParams {
38
+ symbol: string;
39
+ order_id?: number;
40
+ client_order_id?: string;
41
+ }
42
+ export interface CancelAllOrdersParams {
43
+ all_symbols: boolean;
44
+ exclude_reduce_only: boolean;
45
+ }
46
+ export interface TWAPParams {
47
+ symbol: string;
48
+ amount: string;
49
+ side: Side;
50
+ slippage_percent?: string;
51
+ reduce_only?: boolean;
52
+ duration_in_seconds: number;
53
+ client_order_id?: string;
54
+ }
55
+ export interface CancelTWAPParams {
56
+ symbol: string;
57
+ twap_order_id: number;
58
+ }
59
+ export interface TPSLParams {
60
+ symbol: string;
61
+ side: Side;
62
+ take_profit?: {
63
+ stop_price: string;
64
+ limit_price?: string;
65
+ amount?: string;
66
+ };
67
+ stop_loss?: {
68
+ stop_price: string;
69
+ };
70
+ }
71
+ export type BatchActionType = "Create" | "Cancel";
72
+ export interface BatchAction {
73
+ type: BatchActionType;
74
+ data: Record<string, unknown>;
75
+ }
76
+ export interface OrderInfo {
77
+ order_id: number;
78
+ client_order_id: string | null;
79
+ symbol: string;
80
+ side: Side;
81
+ price: string;
82
+ initial_amount: string;
83
+ filled_amount: string;
84
+ cancelled_amount: string;
85
+ stop_price: string | null;
86
+ order_type: string;
87
+ stop_parent_order_id: number | null;
88
+ trigger_price_type: string | null;
89
+ reduce_only: boolean;
90
+ created_at: number;
91
+ updated_at: number;
92
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { Side } from "./order.js";
2
+ export interface Position {
3
+ symbol: string;
4
+ side: Side;
5
+ amount: string;
6
+ entry_price: string;
7
+ mark_price: string;
8
+ liquidation_price: string;
9
+ unrealized_pnl: string;
10
+ margin_used: string;
11
+ leverage: number;
12
+ created_at: number;
13
+ }
14
+ export interface PositionTPSL {
15
+ symbol: string;
16
+ side: Side;
17
+ take_profit?: {
18
+ stop_price: string;
19
+ limit_price?: string;
20
+ amount?: string;
21
+ };
22
+ stop_loss?: {
23
+ stop_price: string;
24
+ };
25
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,34 @@
1
+ export type PublicChannel = "prices" | "book" | "bbo" | "trades" | "candle" | "mark_price_candle";
2
+ export type PrivateChannel = "account_positions" | "account_order_updates" | "account_info" | "account_margin" | "account_leverage" | "account_trades" | "account_twap_orders" | "account_twap_order_updates";
3
+ export type Channel = PublicChannel | PrivateChannel;
4
+ export interface WSSubscription {
5
+ method: "subscribe" | "unsubscribe";
6
+ params: {
7
+ source: Channel;
8
+ [key: string]: unknown;
9
+ };
10
+ }
11
+ export type WSTradingMethod = "create_order" | "create_market_order" | "edit_order" | "batch_order" | "cancel_order" | "cancel_all_orders";
12
+ export interface WSTradingRequest {
13
+ id: string;
14
+ params: Record<string, unknown>;
15
+ }
16
+ export interface WSTradingResponse {
17
+ code: number;
18
+ data: Record<string, unknown>;
19
+ id: string;
20
+ t: number;
21
+ type: string;
22
+ }
23
+ export declare const ORDER_UPDATE_FIELDS: Record<string, string>;
24
+ export declare const ACCOUNT_INFO_FIELDS: Record<string, string>;
25
+ export declare const WS_CODES: {
26
+ readonly SUCCESS: 200;
27
+ readonly INVALID_REQUEST: 400;
28
+ readonly INVALID_SIGNATURE: 401;
29
+ readonly INVALID_SIGNER: 402;
30
+ readonly UNAUTHORIZED: 403;
31
+ readonly ENGINE_ERROR: 420;
32
+ readonly RATE_LIMIT: 429;
33
+ readonly UNKNOWN_ERROR: 500;
34
+ };
@@ -0,0 +1,41 @@
1
+ // Field abbreviation mappings for order updates
2
+ export const ORDER_UPDATE_FIELDS = {
3
+ i: "order_id",
4
+ I: "client_order_id",
5
+ u: "account",
6
+ s: "symbol",
7
+ d: "side",
8
+ p: "price",
9
+ a: "amount",
10
+ f: "filled",
11
+ oe: "order_event",
12
+ os: "order_status",
13
+ ot: "order_type",
14
+ li: "last_order_id",
15
+ };
16
+ // Field abbreviation mappings for account info
17
+ export const ACCOUNT_INFO_FIELDS = {
18
+ b: "balance",
19
+ f: "fee_level",
20
+ ae: "account_equity",
21
+ as: "available_to_spend",
22
+ aw: "available_to_withdraw",
23
+ pb: "pending_balance",
24
+ mu: "margin_used",
25
+ cm: "cross_mmr",
26
+ pc: "positions_count",
27
+ oc: "orders_count",
28
+ sc: "stop_orders_count",
29
+ t: "timestamp",
30
+ };
31
+ // WS error codes
32
+ export const WS_CODES = {
33
+ SUCCESS: 200,
34
+ INVALID_REQUEST: 400,
35
+ INVALID_SIGNATURE: 401,
36
+ INVALID_SIGNER: 402,
37
+ UNAUTHORIZED: 403,
38
+ ENGINE_ERROR: 420,
39
+ RATE_LIMIT: 429,
40
+ UNKNOWN_ERROR: 500,
41
+ };
@@ -0,0 +1,42 @@
1
+ import { type Network } from "./constants.js";
2
+ import type { Channel, PublicChannel, PrivateChannel, WSTradingResponse } from "./types/ws.js";
3
+ type MessageHandler = (data: unknown) => void;
4
+ type SignMessageFn = (message: Uint8Array) => Promise<Uint8Array>;
5
+ export interface PacificaWSConfig {
6
+ network?: Network;
7
+ wsUrl?: string;
8
+ apiKey?: string;
9
+ autoReconnect?: boolean;
10
+ heartbeatInterval?: number;
11
+ }
12
+ export declare class PacificaWSClient {
13
+ private ws;
14
+ private wsUrl;
15
+ private apiKey?;
16
+ private autoReconnect;
17
+ private heartbeatInterval;
18
+ private heartbeatTimer;
19
+ private reconnectTimer;
20
+ private handlers;
21
+ private tradingCallbacks;
22
+ private isConnected;
23
+ constructor(config?: PacificaWSConfig);
24
+ connect(): Promise<void>;
25
+ disconnect(): void;
26
+ private startHeartbeat;
27
+ private stopHeartbeat;
28
+ private send;
29
+ private handleMessage;
30
+ subscribe(channel: PublicChannel, params?: Record<string, unknown>): void;
31
+ subscribePrivate(channel: PrivateChannel, account: string): void;
32
+ unsubscribe(channel: Channel, params?: Record<string, unknown>): void;
33
+ on(channel: string, handler: MessageHandler): void;
34
+ off(channel: string, handler: MessageHandler): void;
35
+ createOrder(params: Record<string, unknown>, account: string, signMessage: SignMessageFn): Promise<WSTradingResponse>;
36
+ createMarketOrder(params: Record<string, unknown>, account: string, signMessage: SignMessageFn): Promise<WSTradingResponse>;
37
+ editOrder(params: Record<string, unknown>, account: string, signMessage: SignMessageFn): Promise<WSTradingResponse>;
38
+ cancelOrder(params: Record<string, unknown>, account: string, signMessage: SignMessageFn): Promise<WSTradingResponse>;
39
+ cancelAllOrders(params: Record<string, unknown>, account: string, signMessage: SignMessageFn): Promise<WSTradingResponse>;
40
+ private sendTradingCommand;
41
+ }
42
+ export {};
@@ -0,0 +1,180 @@
1
+ import { getNetworkConfig } from "./constants.js";
2
+ import { buildSignedRequest } from "./signing.js";
3
+ export class PacificaWSClient {
4
+ ws = null;
5
+ wsUrl;
6
+ apiKey;
7
+ autoReconnect;
8
+ heartbeatInterval;
9
+ heartbeatTimer = null;
10
+ reconnectTimer = null;
11
+ handlers = new Map();
12
+ tradingCallbacks = new Map();
13
+ isConnected = false;
14
+ constructor(config = {}) {
15
+ this.wsUrl = config.wsUrl || getNetworkConfig(config.network).wsUrl;
16
+ this.apiKey = config.apiKey;
17
+ this.autoReconnect = config.autoReconnect ?? true;
18
+ this.heartbeatInterval = config.heartbeatInterval ?? 30000;
19
+ }
20
+ connect() {
21
+ return new Promise((resolve, reject) => {
22
+ try {
23
+ const url = this.apiKey ? `${this.wsUrl}?PF-API-KEY=${this.apiKey}` : this.wsUrl;
24
+ this.ws = new WebSocket(url);
25
+ this.ws.onopen = () => {
26
+ this.isConnected = true;
27
+ this.startHeartbeat();
28
+ resolve();
29
+ };
30
+ this.ws.onmessage = (event) => {
31
+ this.handleMessage(event.data);
32
+ };
33
+ this.ws.onclose = () => {
34
+ this.isConnected = false;
35
+ this.stopHeartbeat();
36
+ if (this.autoReconnect) {
37
+ this.reconnectTimer = setTimeout(() => this.connect(), 3000);
38
+ }
39
+ };
40
+ this.ws.onerror = (err) => {
41
+ if (!this.isConnected)
42
+ reject(err);
43
+ };
44
+ }
45
+ catch (err) {
46
+ reject(err);
47
+ }
48
+ });
49
+ }
50
+ disconnect() {
51
+ this.autoReconnect = false;
52
+ this.stopHeartbeat();
53
+ if (this.reconnectTimer) {
54
+ clearTimeout(this.reconnectTimer);
55
+ this.reconnectTimer = null;
56
+ }
57
+ if (this.ws) {
58
+ this.ws.close();
59
+ this.ws = null;
60
+ }
61
+ this.isConnected = false;
62
+ }
63
+ startHeartbeat() {
64
+ this.heartbeatTimer = setInterval(() => {
65
+ this.send({ method: "ping" });
66
+ }, this.heartbeatInterval);
67
+ }
68
+ stopHeartbeat() {
69
+ if (this.heartbeatTimer) {
70
+ clearInterval(this.heartbeatTimer);
71
+ this.heartbeatTimer = null;
72
+ }
73
+ }
74
+ send(data) {
75
+ if (this.ws && this.isConnected) {
76
+ this.ws.send(JSON.stringify(data));
77
+ }
78
+ }
79
+ handleMessage(raw) {
80
+ try {
81
+ const text = typeof raw === "string" ? raw : "";
82
+ if (!text)
83
+ return;
84
+ const msg = JSON.parse(text);
85
+ // Pong response
86
+ if (msg.channel === "pong")
87
+ return;
88
+ // Trading response (has id field)
89
+ if (msg.id && this.tradingCallbacks.has(msg.id)) {
90
+ const cb = this.tradingCallbacks.get(msg.id);
91
+ this.tradingCallbacks.delete(msg.id);
92
+ cb(msg);
93
+ return;
94
+ }
95
+ // Channel data
96
+ const channel = msg.channel || msg.source;
97
+ if (channel) {
98
+ const cbs = this.handlers.get(channel);
99
+ if (cbs) {
100
+ cbs.forEach((cb) => cb(msg));
101
+ }
102
+ }
103
+ // Global handler
104
+ const allCbs = this.handlers.get("*");
105
+ if (allCbs) {
106
+ allCbs.forEach((cb) => cb(msg));
107
+ }
108
+ }
109
+ catch {
110
+ // Ignore parse errors
111
+ }
112
+ }
113
+ // ==================== SUBSCRIPTIONS ====================
114
+ subscribe(channel, params) {
115
+ this.send({
116
+ method: "subscribe",
117
+ params: { source: channel, ...params },
118
+ });
119
+ }
120
+ subscribePrivate(channel, account) {
121
+ this.send({
122
+ method: "subscribe",
123
+ params: { source: channel, account },
124
+ });
125
+ }
126
+ unsubscribe(channel, params) {
127
+ this.send({
128
+ method: "unsubscribe",
129
+ params: { source: channel, ...params },
130
+ });
131
+ }
132
+ on(channel, handler) {
133
+ if (!this.handlers.has(channel)) {
134
+ this.handlers.set(channel, new Set());
135
+ }
136
+ this.handlers.get(channel).add(handler);
137
+ }
138
+ off(channel, handler) {
139
+ this.handlers.get(channel)?.delete(handler);
140
+ }
141
+ // ==================== WS TRADING ====================
142
+ async createOrder(params, account, signMessage) {
143
+ const id = crypto.randomUUID();
144
+ const body = await buildSignedRequest("create_order", params, account, signMessage);
145
+ return this.sendTradingCommand(id, { create_order: body });
146
+ }
147
+ async createMarketOrder(params, account, signMessage) {
148
+ const id = crypto.randomUUID();
149
+ const body = await buildSignedRequest("create_market_order", params, account, signMessage);
150
+ return this.sendTradingCommand(id, { create_market_order: body });
151
+ }
152
+ async editOrder(params, account, signMessage) {
153
+ const id = crypto.randomUUID();
154
+ const body = await buildSignedRequest("edit_order", params, account, signMessage);
155
+ return this.sendTradingCommand(id, { edit_order: body });
156
+ }
157
+ async cancelOrder(params, account, signMessage) {
158
+ const id = crypto.randomUUID();
159
+ const body = await buildSignedRequest("cancel_order", params, account, signMessage);
160
+ return this.sendTradingCommand(id, { cancel_order: body });
161
+ }
162
+ async cancelAllOrders(params, account, signMessage) {
163
+ const id = crypto.randomUUID();
164
+ const body = await buildSignedRequest("cancel_all_orders", params, account, signMessage);
165
+ return this.sendTradingCommand(id, { cancel_all_orders: body });
166
+ }
167
+ sendTradingCommand(id, params) {
168
+ return new Promise((resolve, reject) => {
169
+ this.tradingCallbacks.set(id, resolve);
170
+ this.send({ id, params });
171
+ // Timeout after 10s
172
+ setTimeout(() => {
173
+ if (this.tradingCallbacks.has(id)) {
174
+ this.tradingCallbacks.delete(id);
175
+ reject(new Error(`Trading command ${id} timed out`));
176
+ }
177
+ }, 10000);
178
+ });
179
+ }
180
+ }