perp-cli 0.12.17 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +247 -27
  2. package/dist/_stderr-filter.js +0 -1
  3. package/dist/agent-wallet/lighter-keystore.d.ts +11 -0
  4. package/dist/agent-wallet/lighter-keystore.js +92 -10
  5. package/dist/agent-wallet/passphrase.d.ts +1 -1
  6. package/dist/agent-wallet/passphrase.js +16 -3
  7. package/dist/agent-wallet/store.d.ts +37 -4
  8. package/dist/agent-wallet/store.js +132 -0
  9. package/dist/agent-wallet/venue-keystore.d.ts +14 -0
  10. package/dist/agent-wallet/venue-keystore.js +121 -0
  11. package/dist/api/public/hyperliquid.js +4 -4
  12. package/dist/api/public/lighter.js +5 -5
  13. package/dist/api/public/pacifica.d.ts +0 -1
  14. package/dist/api/public/pacifica.js +4 -13
  15. package/dist/api/public/urls.d.ts +9 -1
  16. package/dist/api/public/urls.js +35 -13
  17. package/dist/arb/file-lock.d.ts +11 -0
  18. package/dist/arb/file-lock.js +74 -0
  19. package/dist/arb/index.d.ts +2 -2
  20. package/dist/arb/index.js +2 -2
  21. package/dist/arb/pending-entry.d.ts +32 -0
  22. package/dist/arb/pending-entry.js +77 -0
  23. package/dist/arb/sizing.d.ts +6 -13
  24. package/dist/arb/sizing.js +12 -51
  25. package/dist/arb/state.d.ts +45 -12
  26. package/dist/arb/state.js +214 -42
  27. package/dist/arb/utils.d.ts +20 -6
  28. package/dist/arb/utils.js +43 -39
  29. package/dist/bot/conditions.d.ts +4 -4
  30. package/dist/bot/conditions.js +11 -6
  31. package/dist/bot/config.d.ts +17 -1
  32. package/dist/bot/config.js +48 -12
  33. package/dist/bot/engine.d.ts +61 -2
  34. package/dist/bot/engine.js +610 -144
  35. package/dist/bot/fill-size.d.ts +7 -0
  36. package/dist/bot/fill-size.js +18 -0
  37. package/dist/bot/index.d.ts +1 -1
  38. package/dist/bot/index.js +1 -1
  39. package/dist/bot/perp-order.d.ts +99 -0
  40. package/dist/bot/perp-order.js +299 -0
  41. package/dist/bot/presets.d.ts +7 -0
  42. package/dist/bot/presets.js +17 -0
  43. package/dist/bot/quarantine.d.ts +75 -0
  44. package/dist/bot/quarantine.js +190 -0
  45. package/dist/bot/quote-rules.d.ts +23 -0
  46. package/dist/bot/quote-rules.js +69 -0
  47. package/dist/bot/strategies/avellaneda-mm.d.ts +32 -2
  48. package/dist/bot/strategies/avellaneda-mm.js +72 -70
  49. package/dist/bot/strategies/basis-arb.js +2 -0
  50. package/dist/bot/strategies/dca-strategy.d.ts +2 -0
  51. package/dist/bot/strategies/dca-strategy.js +5 -0
  52. package/dist/bot/strategies/funding-arb-strategy.d.ts +43 -3
  53. package/dist/bot/strategies/funding-arb-strategy.js +571 -380
  54. package/dist/bot/strategies/funding-arb-utils.d.ts +48 -23
  55. package/dist/bot/strategies/funding-arb-utils.js +159 -195
  56. package/dist/bot/strategies/funding-arb-v2.d.ts +32 -0
  57. package/dist/bot/strategies/funding-arb-v2.js +258 -47
  58. package/dist/bot/strategies/funding-auto.js +215 -194
  59. package/dist/bot/strategies/spot-perp-arb-strategy.d.ts +14 -0
  60. package/dist/bot/strategies/spot-perp-arb-strategy.js +217 -50
  61. package/dist/bot/strategies/spot-perp-executor.d.ts +73 -19
  62. package/dist/bot/strategies/spot-perp-executor.js +319 -120
  63. package/dist/bot/strategies/spot-perp-state.d.ts +43 -0
  64. package/dist/bot/strategies/spot-perp-state.js +70 -0
  65. package/dist/bot/strategy-types.d.ts +6 -0
  66. package/dist/bot/tui/BotDashboard.d.ts +7 -2
  67. package/dist/bot/tui/BotDashboard.js +6 -3
  68. package/dist/bridge-engine.d.ts +120 -19
  69. package/dist/bridge-engine.js +710 -422
  70. package/dist/bridge-signers.d.ts +54 -0
  71. package/dist/bridge-signers.js +161 -0
  72. package/dist/cache.d.ts +4 -1
  73. package/dist/cache.js +11 -0
  74. package/dist/cli-flags.d.ts +50 -0
  75. package/dist/cli-flags.js +104 -0
  76. package/dist/cli-program.d.ts +35 -0
  77. package/dist/cli-program.js +286 -0
  78. package/dist/cli-spec.js +1 -1
  79. package/dist/client-id-tracker.js +11 -2
  80. package/dist/commands/account.d.ts +7 -1
  81. package/dist/commands/account.js +70 -92
  82. package/dist/commands/agent-import.d.ts +114 -0
  83. package/dist/commands/agent-import.js +794 -0
  84. package/dist/commands/agent.d.ts +232 -2
  85. package/dist/commands/agent.js +1858 -955
  86. package/dist/commands/alerts.d.ts +1 -0
  87. package/dist/commands/alerts.js +31 -28
  88. package/dist/commands/arb/index.d.ts +60 -1
  89. package/dist/commands/arb/index.js +381 -384
  90. package/dist/commands/arb-auto.d.ts +132 -4
  91. package/dist/commands/arb-auto.js +1474 -967
  92. package/dist/commands/arb.d.ts +3 -1
  93. package/dist/commands/arb.js +62 -30
  94. package/dist/commands/bot.js +127 -47
  95. package/dist/commands/bridge.d.ts +2 -1
  96. package/dist/commands/bridge.js +339 -192
  97. package/dist/commands/builder.d.ts +55 -0
  98. package/dist/commands/builder.js +387 -0
  99. package/dist/commands/funds-onchain.d.ts +32 -0
  100. package/dist/commands/funds-onchain.js +286 -0
  101. package/dist/commands/funds.d.ts +25 -0
  102. package/dist/commands/funds.js +939 -245
  103. package/dist/commands/history.js +72 -45
  104. package/dist/commands/init.d.ts +107 -15
  105. package/dist/commands/init.js +1116 -249
  106. package/dist/commands/jobs.d.ts +2 -1
  107. package/dist/commands/jobs.js +77 -15
  108. package/dist/commands/manage.js +136 -91
  109. package/dist/commands/market.d.ts +4 -1
  110. package/dist/commands/market.js +35 -32
  111. package/dist/commands/outcome.d.ts +10 -0
  112. package/dist/commands/outcome.js +396 -0
  113. package/dist/commands/plan.js +52 -12
  114. package/dist/commands/portfolio.d.ts +1 -0
  115. package/dist/commands/portfolio.js +60 -72
  116. package/dist/commands/rebalance.d.ts +2 -1
  117. package/dist/commands/rebalance.js +33 -43
  118. package/dist/commands/risk.js +46 -19
  119. package/dist/commands/settings.d.ts +1 -0
  120. package/dist/commands/settings.js +246 -51
  121. package/dist/commands/trade.d.ts +50 -0
  122. package/dist/commands/trade.js +1943 -695
  123. package/dist/commands/wallet.d.ts +30 -1
  124. package/dist/commands/wallet.js +316 -337
  125. package/dist/config.d.ts +60 -9
  126. package/dist/config.js +252 -82
  127. package/dist/constants.d.ts +29 -4
  128. package/dist/constants.js +62 -20
  129. package/dist/dashboard/server.d.ts +2 -0
  130. package/dist/dashboard/server.js +9 -6
  131. package/dist/dashboard/ui.js +6 -4
  132. package/dist/dashboard/ws-feeds.js +20 -8
  133. package/dist/dex-asset-map.js +5 -3
  134. package/dist/errors.d.ts +122 -0
  135. package/dist/errors.js +194 -0
  136. package/dist/event-stream.js +75 -19
  137. package/dist/evm-master-tx.d.ts +59 -0
  138. package/dist/evm-master-tx.js +154 -0
  139. package/dist/exchanges/adapter-network.d.ts +10 -0
  140. package/dist/exchanges/adapter-network.js +10 -0
  141. package/dist/exchanges/arcus/adapter.d.ts +196 -0
  142. package/dist/exchanges/arcus/adapter.js +1092 -0
  143. package/dist/exchanges/arcus/agent.d.ts +55 -0
  144. package/dist/exchanges/arcus/agent.js +188 -0
  145. package/dist/exchanges/arcus/client.d.ts +63 -0
  146. package/dist/exchanges/arcus/client.js +285 -0
  147. package/dist/exchanges/arcus/public.d.ts +65 -0
  148. package/dist/exchanges/arcus/public.js +138 -0
  149. package/dist/exchanges/arcus/signing.d.ts +176 -0
  150. package/dist/exchanges/arcus/signing.js +288 -0
  151. package/dist/exchanges/arcus/spot-chain.d.ts +60 -0
  152. package/dist/exchanges/arcus/spot-chain.js +241 -0
  153. package/dist/exchanges/arcus/spot-router.d.ts +177 -0
  154. package/dist/exchanges/arcus/spot-router.js +183 -0
  155. package/dist/exchanges/arcus/spot.d.ts +109 -0
  156. package/dist/exchanges/arcus/spot.js +645 -0
  157. package/dist/exchanges/aster-funds.d.ts +127 -0
  158. package/dist/exchanges/aster-funds.js +252 -0
  159. package/dist/exchanges/aster-nonce.d.ts +2 -0
  160. package/dist/exchanges/aster-nonce.js +107 -0
  161. package/dist/exchanges/aster-spot.d.ts +117 -0
  162. package/dist/exchanges/aster-spot.js +686 -0
  163. package/dist/exchanges/aster-typed-data.d.ts +133 -7
  164. package/dist/exchanges/aster-typed-data.js +121 -7
  165. package/dist/exchanges/aster.d.ts +219 -6
  166. package/dist/exchanges/aster.js +1023 -153
  167. package/dist/exchanges/builder-fee.d.ts +254 -0
  168. package/dist/exchanges/builder-fee.js +421 -0
  169. package/dist/exchanges/canonical-symbols.d.ts +32 -0
  170. package/dist/exchanges/canonical-symbols.js +96 -0
  171. package/dist/exchanges/capabilities.d.ts +7 -1
  172. package/dist/exchanges/capabilities.js +7 -0
  173. package/dist/exchanges/hl-signing.d.ts +165 -0
  174. package/dist/exchanges/hl-signing.js +158 -0
  175. package/dist/exchanges/hyperliquid-outcome.d.ts +211 -0
  176. package/dist/exchanges/hyperliquid-outcome.js +646 -0
  177. package/dist/exchanges/hyperliquid-spot.d.ts +44 -5
  178. package/dist/exchanges/hyperliquid-spot.js +308 -117
  179. package/dist/exchanges/hyperliquid.d.ts +462 -57
  180. package/dist/exchanges/hyperliquid.js +1575 -449
  181. package/dist/exchanges/index.d.ts +6 -0
  182. package/dist/exchanges/index.js +4 -0
  183. package/dist/exchanges/interface.d.ts +63 -10
  184. package/dist/exchanges/interface.js +18 -3
  185. package/dist/exchanges/ioc-outcome.d.ts +44 -0
  186. package/dist/exchanges/ioc-outcome.js +57 -0
  187. package/dist/exchanges/legacy-trading-v2.d.ts +39 -0
  188. package/dist/exchanges/legacy-trading-v2.js +940 -0
  189. package/dist/exchanges/lighter-public.d.ts +43 -0
  190. package/dist/exchanges/lighter-public.js +276 -0
  191. package/dist/exchanges/lighter-rh-deposit.d.ts +62 -0
  192. package/dist/exchanges/lighter-rh-deposit.js +185 -0
  193. package/dist/exchanges/lighter-signer.d.ts +123 -0
  194. package/dist/exchanges/lighter-signer.js +215 -0
  195. package/dist/exchanges/lighter-spot.d.ts +91 -13
  196. package/dist/exchanges/lighter-spot.js +595 -233
  197. package/dist/exchanges/lighter.d.ts +611 -39
  198. package/dist/exchanges/lighter.js +1890 -649
  199. package/dist/exchanges/ondo/adapter.d.ts +166 -0
  200. package/dist/exchanges/ondo/adapter.js +835 -0
  201. package/dist/exchanges/ondo/agent.d.ts +31 -0
  202. package/dist/exchanges/ondo/agent.js +101 -0
  203. package/dist/exchanges/ondo/client.d.ts +60 -0
  204. package/dist/exchanges/ondo/client.js +297 -0
  205. package/dist/exchanges/ondo/funds.d.ts +122 -0
  206. package/dist/exchanges/ondo/funds.js +290 -0
  207. package/dist/exchanges/ondo/public.d.ts +95 -0
  208. package/dist/exchanges/ondo/public.js +214 -0
  209. package/dist/exchanges/ondo/spot.d.ts +127 -0
  210. package/dist/exchanges/ondo/spot.js +392 -0
  211. package/dist/exchanges/outcome-interface.d.ts +140 -0
  212. package/dist/exchanges/outcome-interface.js +16 -0
  213. package/dist/exchanges/pacifica-spot.d.ts +83 -0
  214. package/dist/exchanges/pacifica-spot.js +324 -0
  215. package/dist/exchanges/pacifica-typed-data.d.ts +30 -13
  216. package/dist/exchanges/pacifica-typed-data.js +57 -9
  217. package/dist/exchanges/pacifica.d.ts +288 -4
  218. package/dist/exchanges/pacifica.js +1013 -76
  219. package/dist/exchanges/precision.d.ts +47 -0
  220. package/dist/exchanges/precision.js +209 -0
  221. package/dist/exchanges/qfex/adapter.d.ts +341 -0
  222. package/dist/exchanges/qfex/adapter.js +1383 -0
  223. package/dist/exchanges/qfex/agent.d.ts +58 -0
  224. package/dist/exchanges/qfex/agent.js +188 -0
  225. package/dist/exchanges/qfex/client.d.ts +54 -0
  226. package/dist/exchanges/qfex/client.js +138 -0
  227. package/dist/exchanges/qfex/errors.d.ts +70 -0
  228. package/dist/exchanges/qfex/errors.js +236 -0
  229. package/dist/exchanges/qfex/public.d.ts +122 -0
  230. package/dist/exchanges/qfex/public.js +268 -0
  231. package/dist/exchanges/qfex/signing.d.ts +160 -0
  232. package/dist/exchanges/qfex/signing.js +283 -0
  233. package/dist/exchanges/qfex/ws-transport.d.ts +294 -0
  234. package/dist/exchanges/qfex/ws-transport.js +798 -0
  235. package/dist/exchanges/rate-limiter.d.ts +12 -0
  236. package/dist/exchanges/rate-limiter.js +64 -0
  237. package/dist/exchanges/registry.d.ts +14 -2
  238. package/dist/exchanges/registry.js +20 -32
  239. package/dist/exchanges/slippage.d.ts +37 -0
  240. package/dist/exchanges/slippage.js +70 -0
  241. package/dist/exchanges/spot-factory.d.ts +166 -0
  242. package/dist/exchanges/spot-factory.js +431 -0
  243. package/dist/exchanges/spot-interface.d.ts +98 -4
  244. package/dist/exchanges/spot-interface.js +27 -1
  245. package/dist/exchanges/spot-result.d.ts +79 -0
  246. package/dist/exchanges/spot-result.js +273 -0
  247. package/dist/exchanges/trading-v2.d.ts +117 -0
  248. package/dist/exchanges/trading-v2.js +301 -0
  249. package/dist/exchanges/venue-types.d.ts +231 -0
  250. package/dist/exchanges/venue-types.js +87 -0
  251. package/dist/exchanges/venue.d.ts +211 -0
  252. package/dist/exchanges/venue.js +132 -0
  253. package/dist/exchanges/venues/arcus.d.ts +8 -0
  254. package/dist/exchanges/venues/arcus.js +109 -0
  255. package/dist/exchanges/venues/aster.d.ts +49 -0
  256. package/dist/exchanges/venues/aster.js +176 -0
  257. package/dist/exchanges/venues/create-helpers.d.ts +18 -0
  258. package/dist/exchanges/venues/create-helpers.js +199 -0
  259. package/dist/exchanges/venues/hyperliquid.d.ts +23 -0
  260. package/dist/exchanges/venues/hyperliquid.js +126 -0
  261. package/dist/exchanges/venues/index.d.ts +16 -0
  262. package/dist/exchanges/venues/index.js +26 -0
  263. package/dist/exchanges/venues/lighter-family.d.ts +92 -0
  264. package/dist/exchanges/venues/lighter-family.js +166 -0
  265. package/dist/exchanges/venues/lighter-rh.d.ts +7 -0
  266. package/dist/exchanges/venues/lighter-rh.js +58 -0
  267. package/dist/exchanges/venues/lighter.d.ts +6 -0
  268. package/dist/exchanges/venues/lighter.js +55 -0
  269. package/dist/exchanges/venues/ondo.d.ts +34 -0
  270. package/dist/exchanges/venues/ondo.js +140 -0
  271. package/dist/exchanges/venues/pacifica.d.ts +8 -0
  272. package/dist/exchanges/venues/pacifica.js +95 -0
  273. package/dist/exchanges/venues/qfex.d.ts +28 -0
  274. package/dist/exchanges/venues/qfex.js +132 -0
  275. package/dist/execution-log.js +10 -2
  276. package/dist/funding/legacy-public.d.ts +31 -0
  277. package/dist/funding/legacy-public.js +369 -0
  278. package/dist/funding/normalize.d.ts +28 -16
  279. package/dist/funding/normalize.js +61 -29
  280. package/dist/funding/rates.d.ts +46 -11
  281. package/dist/funding/rates.js +228 -277
  282. package/dist/guardrail/perp-guardrail.js +0 -0
  283. package/dist/index.js +156 -684
  284. package/dist/jobs.d.ts +84 -6
  285. package/dist/jobs.js +239 -41
  286. package/dist/landing.d.ts +7 -2
  287. package/dist/landing.js +19 -3
  288. package/dist/mcp-server.d.ts +14 -4
  289. package/dist/mcp-server.js +820 -402
  290. package/dist/mcp-trade-guard.d.ts +16 -0
  291. package/dist/mcp-trade-guard.js +59 -0
  292. package/dist/pacifica/client.d.ts +41 -10
  293. package/dist/pacifica/client.js +167 -63
  294. package/dist/pacifica/constants.d.ts +0 -1
  295. package/dist/pacifica/constants.js +0 -5
  296. package/dist/pacifica/deposit.d.ts +30 -3
  297. package/dist/pacifica/deposit.js +119 -2
  298. package/dist/pacifica/faucet.d.ts +29 -0
  299. package/dist/pacifica/faucet.js +100 -0
  300. package/dist/pacifica/sign-tx.d.ts +15 -0
  301. package/dist/pacifica/sign-tx.js +41 -0
  302. package/dist/pacifica/types/account.d.ts +28 -4
  303. package/dist/pacifica/types/lake.d.ts +20 -5
  304. package/dist/pacifica/types/lake.js +4 -0
  305. package/dist/pacifica/types/market.d.ts +5 -0
  306. package/dist/pacifica/types/order.d.ts +4 -1
  307. package/dist/pacifica/types/position.d.ts +9 -1
  308. package/dist/plan-executor.d.ts +10 -5
  309. package/dist/plan-executor.js +165 -54
  310. package/dist/position-history.js +13 -0
  311. package/dist/rebalance.d.ts +26 -2
  312. package/dist/rebalance.js +86 -7
  313. package/dist/relay-swap.d.ts +232 -0
  314. package/dist/relay-swap.js +630 -0
  315. package/dist/risk.js +5 -1
  316. package/dist/secret-env.d.ts +15 -0
  317. package/dist/secret-env.js +36 -0
  318. package/dist/settings.d.ts +169 -6
  319. package/dist/settings.js +219 -38
  320. package/dist/signer/ows-evm.d.ts +13 -0
  321. package/dist/signer/ows-evm.js +22 -0
  322. package/dist/smart-order.d.ts +9 -0
  323. package/dist/smart-order.js +53 -8
  324. package/dist/strategies/dca.d.ts +6 -2
  325. package/dist/strategies/dca.js +66 -26
  326. package/dist/strategies/funding-arb.d.ts +11 -1
  327. package/dist/strategies/funding-arb.js +202 -89
  328. package/dist/strategies/grid.d.ts +31 -0
  329. package/dist/strategies/grid.js +89 -11
  330. package/dist/strategies/pending-stop.d.ts +8 -0
  331. package/dist/strategies/pending-stop.js +12 -0
  332. package/dist/strategies/split-order.d.ts +45 -17
  333. package/dist/strategies/split-order.js +157 -91
  334. package/dist/strategies/trailing-stop.d.ts +2 -1
  335. package/dist/strategies/trailing-stop.js +52 -6
  336. package/dist/strategies/twap.d.ts +6 -1
  337. package/dist/strategies/twap.js +39 -11
  338. package/dist/trade-validator.d.ts +22 -0
  339. package/dist/trade-validator.js +119 -15
  340. package/dist/utils/numeric.d.ts +46 -0
  341. package/dist/utils/numeric.js +79 -0
  342. package/dist/utils.d.ts +19 -0
  343. package/dist/utils.js +96 -19
  344. package/dist/withdraw-gate.d.ts +49 -0
  345. package/dist/withdraw-gate.js +131 -0
  346. package/package.json +15 -6
  347. package/skills/perp-cli/SKILL.md +142 -55
  348. package/skills/perp-cli/references/agent-operations.md +110 -56
  349. package/skills/perp-cli/references/commands.md +266 -71
  350. package/skills/perp-cli/references/strategies.md +34 -31
  351. package/skills/perp-cli/scripts/arb-monitor.sh +10 -5
  352. package/skills/perp-cli/scripts/funding-analysis.sh +14 -9
  353. package/skills/perp-cli/scripts/preflight.sh +21 -14
  354. package/skills/perp-cli/scripts/spot-perp-scan.sh +12 -7
  355. package/skills/perp-cli/scripts/validate-arb.sh +31 -15
  356. package/vendor/lighter-signer/SHA256SUMS +2 -0
  357. package/vendor/lighter-signer/VERSION +8 -0
  358. package/vendor/lighter-signer/lighter-signer.wasm +0 -0
  359. package/vendor/lighter-signer/wasm_exec.js +575 -0
  360. package/dist/bot/strategies/funding-arb-v2-strategy.d.ts +0 -42
  361. package/dist/bot/strategies/funding-arb-v2-strategy.js +0 -864
@@ -0,0 +1,294 @@
1
+ /**
2
+ * QFEX Trade WebSocket transport (design §14.2 as amended by §14.12 #2, #3, #4, #11, #13).
3
+ *
4
+ * The venue has no request id. Correlation therefore rests on four rules:
5
+ * 1. ONE command at a time per connection (FIFO) — reads share the queue.
6
+ * 2. An order is recognized by its GENERATED client order id only; every frame is ignored
7
+ * until an order_response for that id arrives (ACK or rejection), then the order is pinned
8
+ * to the `order_id` of that frame. A user-supplied id is never used (ids are not unique on
9
+ * the venue).
10
+ * 3. The "sent" boundary is the call to `ws.send()`: a socket that is not OPEN before it =
11
+ * NOT SENT (definite). Anything that goes wrong after it — send callback error, close,
12
+ * timeout, ServerError, an error frame without a matching echo — is an UNKNOWN outcome
13
+ * (ORDER_PENDING). Nothing is ever re-sent or replayed.
14
+ * 4. After any timeout / unknown outcome the connection is destroyed, so a late frame can
15
+ * never meet the next command. The next command opens a fresh, re-authenticated,
16
+ * re-subscribed connection.
17
+ *
18
+ * Status is never inferred from silence: a GTC / ALO order is returned as acknowledged
19
+ * (pending) right after its ACK; "open" comes only from a get_user_orders row.
20
+ *
21
+ * cancel_on_disconnect is NOT in the message whitelist: this transport cannot send it.
22
+ * (A different connection of the same user that enabled it — e.g. the official CLI — still
23
+ * cancels all of the account's orders when THAT connection drops.)
24
+ *
25
+ * Idle: between commands the socket is unref()'d so it never keeps the process alive, and it
26
+ * is closed after `idleCloseMs`. The server keeps an authenticated connection alive with
27
+ * WebSocket ping frames (docs authenticate page); `ws` answers them automatically.
28
+ */
29
+ import type { RateLimitPolicy } from "../venue.js";
30
+ import { type QfexErrFrame } from "./errors.js";
31
+ import { type QfexCredentials } from "./signing.js";
32
+ export interface QfexTimeouts {
33
+ connectMs: number;
34
+ authMs: number;
35
+ subscribeMs: number;
36
+ /** First correlated order_response after an add / modify. */
37
+ ackMs: number;
38
+ /** IOC / FOK: terminal frame, measured from the send (includes the 500 ms speed bump). */
39
+ immediateFinalMs: number;
40
+ /**
41
+ * ALO (post-only): how long after the send a terminal frame is awaited once the order was
42
+ * ACKed. Docs (docs.qfex.com "Order Entry"): "If an ALO order would immediately match with an
43
+ * existing order, it is **cancelled** instead." — the venue ACKs first and sends the CANCELLED
44
+ * order_response afterwards (live production 2026-10-05). The docs give no timing for that
45
+ * frame; the window covers the venue's 500 ms speed bump with margin. No frame in the window
46
+ * = the order rests (as before).
47
+ */
48
+ postOnlyFinalMs: number;
49
+ /** After a terminal frame: wait for fill frames until they add up. */
50
+ fillsMs: number;
51
+ cancelMs: number;
52
+ readMs: number;
53
+ }
54
+ export declare const QFEX_TIMEOUTS: QfexTimeouts;
55
+ /** Idle connection lifetime for long-lived processes (MCP server, bots). */
56
+ export declare const QFEX_IDLE_CLOSE_MS = 30000;
57
+ /**
58
+ * Every message type this transport may send. `cancel_on_disconnect` is deliberately absent
59
+ * (unit-test pinned): enabling it would cancel ALL of the account's orders when a one-shot
60
+ * CLI connection closes.
61
+ */
62
+ export declare const QFEX_SENDABLE_TYPES: ReadonlySet<string>;
63
+ export type QfexFrame = Record<string, unknown>;
64
+ export interface QfexOrderResponse {
65
+ order_id: string;
66
+ symbol: string;
67
+ status: string;
68
+ quantity: number;
69
+ price: number;
70
+ take_profit: number | null;
71
+ stop_loss: number | null;
72
+ side: "BUY" | "SELL";
73
+ type: string;
74
+ time_in_force: string;
75
+ user_id: string;
76
+ client_order_id: string;
77
+ quantity_remaining: number;
78
+ update_time: number;
79
+ trade_id: string | null;
80
+ /** Echo of the order's reduce-only flag (a JSON boolean on production frames; absent from the documented example). */
81
+ reduce_only?: boolean;
82
+ }
83
+ export interface QfexFillResponse {
84
+ trade_id: string;
85
+ symbol: string;
86
+ price: number;
87
+ quantity: number;
88
+ side: "BUY" | "SELL";
89
+ order_id: string;
90
+ client_order_id: string;
91
+ fee: number;
92
+ }
93
+ /** `order_response` payload of a frame, or null. Only frames with the fields correlation needs qualify. */
94
+ export declare function orderResponseOf(frame: QfexFrame): QfexOrderResponse | null;
95
+ export declare function fillResponseOf(frame: QfexFrame): QfexFillResponse | null;
96
+ /**
97
+ * Error frame in any documented shape (design §14.12 #11):
98
+ * { "err": { error_code, message, incoming_message } } /websocket/errors + AsyncAPI
99
+ * { "type": "Err", error_code, message, incoming_message } /websocket/rate
100
+ * { "type": "error", error_code, message } the docs' own client samples
101
+ * An absent or empty (`{}`) incoming_message is "no echo".
102
+ */
103
+ export declare function errFrameOf(frame: QfexFrame): QfexErrFrame | null;
104
+ export interface QfexSessionOptions {
105
+ /** wss://trade.qfex.com (no query). */
106
+ url: string;
107
+ network: "mainnet" | "testnet";
108
+ credentials: QfexCredentials;
109
+ /** Concrete account UUID the session authenticates as. */
110
+ accountId: string;
111
+ /** Builder code attached to the connection's auth; null = none. */
112
+ builderCode: string | null;
113
+ rateLimit: RateLimitPolicy;
114
+ timeouts: QfexTimeouts;
115
+ idleCloseMs: number;
116
+ }
117
+ type Waited = {
118
+ kind: "frame";
119
+ frame: QfexFrame;
120
+ } | {
121
+ kind: "timeout";
122
+ } | {
123
+ kind: "closed";
124
+ reason: string;
125
+ };
126
+ /** Frame source handed to a command body. */
127
+ export interface QfexCommandIo {
128
+ /** Next frame, or timeout / close. A timeout or close marks the session for destruction unless `soft`. */
129
+ next(deadlineAt: number, soft?: boolean): Promise<Waited>;
130
+ }
131
+ /** Remediation of an order whose outcome is unknown: the status lookup by generated client id. */
132
+ export declare function qfexPendingRemediation(spec: {
133
+ clientOrderId: string | null;
134
+ symbol: string | null;
135
+ }): string;
136
+ export declare class QfexTradeSession {
137
+ private readonly opts;
138
+ private conn;
139
+ private queue;
140
+ private idleTimer;
141
+ private inFlight;
142
+ /** Number of connections opened by this session (diagnostics / tests). */
143
+ connectCount: number;
144
+ constructor(opts: QfexSessionOptions);
145
+ private fail;
146
+ private nextFrame;
147
+ /** Drop the connection without a closing handshake; its late frames go nowhere. */
148
+ private destroy;
149
+ /** Close the connection (normal closure). Safe to call at any time; queued after the running command. */
150
+ close(): Promise<void>;
151
+ private setRef;
152
+ /** true when nothing owned by this session keeps the event loop alive. */
153
+ isIdleUnref(): boolean;
154
+ private sendRaw;
155
+ private notReady;
156
+ /** connect → auth → subscribe. Every failure here is BEFORE any command was sent. */
157
+ private open;
158
+ /** Authenticate only (key import): connect + auth + subscribe, then close. Sends no command. */
159
+ verifyAuth(): Promise<void>;
160
+ private closeNow;
161
+ private enqueue;
162
+ private onSigint;
163
+ /**
164
+ * Run one command: wait for the queue, connect if needed, send, then let `body` read frames.
165
+ * Throws PerpError. Mutating commands: not-sent failures are definite (ORDER_REJECTED "not
166
+ * sent"), post-send failures are ORDER_PENDING. The session is destroyed after any timeout,
167
+ * close or thrown non-definite error inside `body`.
168
+ */
169
+ private transact;
170
+ /** Unknown-outcome error of a mutating command (ORDER_PENDING, with the c:<id> lookup). */
171
+ private pending;
172
+ /**
173
+ * An error frame during a command. Read: the mapped error. Mutating: a definite refusal only
174
+ * when the venue echoed THIS request and the code is a refusal; otherwise unknown.
175
+ */
176
+ private errOutcome;
177
+ private assertUser;
178
+ /**
179
+ * add_order. Resolves once the venue has answered for THIS order as far as the order type
180
+ * allows: `immediate` (IOC / FOK) waits for a terminal frame; a resting order returns right
181
+ * after its first correlated frame — except `postOnly` (ALO), which waits postOnlyFinalMs for
182
+ * the venue's CANCELLED frame (it would have crossed) before it is reported resting. Throws the mapped rejection (definite), or ORDER_PENDING
183
+ * when nothing correlated arrived (session destroyed).
184
+ */
185
+ addOrder(req: {
186
+ params: Record<string, unknown> & {
187
+ symbol: string;
188
+ client_order_id: string;
189
+ };
190
+ immediate: boolean;
191
+ /** ALO: see QfexTimeouts.postOnlyFinalMs. */
192
+ postOnly?: boolean;
193
+ lotSize: string;
194
+ band: {
195
+ lower: string;
196
+ upper: string;
197
+ } | null;
198
+ }): Promise<QfexAddResult>;
199
+ /**
200
+ * cancel_order by ORDER ID (the adapter resolves client ids first: a client-id cancel would
201
+ * cancel every order sharing that id). Never throws for an unproven cancel — "unknown".
202
+ */
203
+ cancelOrder(symbol: string, orderId: string): Promise<QfexCancelOutcome>;
204
+ /** cancel_stop_order (TAKE_PROFIT / STOP_LOSS rows of get_user_orders). */
205
+ cancelStopOrder(symbol: string, stopOrderId: string): Promise<QfexCancelOutcome>;
206
+ private cancelById;
207
+ /**
208
+ * cancel_all_orders. The venue documents no completion signal: CANCELLED frames for the
209
+ * `expected` order ids are collected until all arrived or the window ends. What is not
210
+ * proven here is settled by the caller's verifying get_user_orders.
211
+ */
212
+ cancelAll(symbol: string | null, expected: ReadonlySet<string>, watch?: ReadonlySet<string>): Promise<{
213
+ cancelled: string[];
214
+ frames: QfexFrame[];
215
+ complete: boolean;
216
+ note: string | null;
217
+ }>;
218
+ /**
219
+ * modify_order (wire function; the adapter keeps amend gated until Q5 is verified).
220
+ * The reply carries a NEW order_id. It is accepted only when it is MODIFIED, carries the
221
+ * client id of the order being modified AND its symbol / side / type / price / quantity equal
222
+ * the request. A CANNOT_MODIFY_* / rejection frame is matched on the OLD order id.
223
+ */
224
+ modifyOrder(req: {
225
+ params: Record<string, unknown> & {
226
+ symbol: string;
227
+ order_id: string;
228
+ side: string;
229
+ order_type: string;
230
+ price: number;
231
+ quantity: number;
232
+ };
233
+ clientOrderId: string;
234
+ lotSize: string;
235
+ tickSize: string;
236
+ }): Promise<QfexOrderResponse>;
237
+ /** get_user_orders: every open order (stops included as TAKE_PROFIT / STOP_LOSS rows), all pages. */
238
+ getUserOrders(symbol: string | null): Promise<QfexOrderResponse[]>;
239
+ }
240
+ export interface QfexAddResult {
241
+ orderId: string;
242
+ clientOrderId: string;
243
+ /** Correlated order_response frames in arrival order ([0] = the ACK or first status). */
244
+ responses: QfexOrderResponse[];
245
+ /** fill_response frames of this order, de-duplicated by trade_id. */
246
+ fills: QfexFillResponse[];
247
+ /** The venue frame after which nothing of the order can execute; null when none arrived. */
248
+ terminal: QfexOrderResponse | null;
249
+ /** Why waiting stopped: a terminal frame, a resting order's ACK, or a timeout / close after the ACK. */
250
+ ended: "terminal" | "resting" | "timeout" | "closed";
251
+ frames: QfexFrame[];
252
+ /** user_id values that differ from the session account (Q22 unverified — reported, not failed). */
253
+ userIdMismatches: string[];
254
+ }
255
+ export type QfexCancelOutcome = {
256
+ kind: "cancelled";
257
+ frame: QfexOrderResponse;
258
+ }
259
+ /** The venue answered for this order and did NOT cancel it (NO_SUCH_ORDER, REJECTED, already FILLED). */
260
+ | {
261
+ kind: "refused";
262
+ status: string;
263
+ frame: QfexOrderResponse;
264
+ }
265
+ /** Sent, not proven either way. */
266
+ | {
267
+ kind: "unknown";
268
+ reason: string;
269
+ };
270
+ /** The process-wide session for this identity. A different builder code (or --no-builder) is a different session. */
271
+ export declare function qfexTradeSession(opts: QfexSessionOptions): QfexTradeSession;
272
+ export interface QfexMdsSnapshot {
273
+ /** Venue symbol → mark price entry (each carries its own venue timestamp). */
274
+ marks: Map<string, {
275
+ price: string;
276
+ time: number;
277
+ }>;
278
+ /** Venue symbol → open interest (base units). */
279
+ openInterest: Map<string, string>;
280
+ /** Venue symbol → 24h volume, quote notional. */
281
+ volumeNotional: Map<string, string>;
282
+ frame: QfexFrame;
283
+ }
284
+ /** Parse one `market_stats` frame. */
285
+ export declare function parseMarketStats(frame: QfexFrame): QfexMdsSnapshot;
286
+ /** How long a one-shot MDS snapshot may take (connect + first market_stats frame). */
287
+ export declare const QFEX_MDS_TIMEOUT_MS = 3000;
288
+ /**
289
+ * One `market_stats` snapshot from the public MDS WebSocket, then close. `symbol` = one venue
290
+ * symbol (order reference prices) or "*" (scans / listings). Throws PRICE_STALE when no
291
+ * snapshot arrives in time — never substitutes index / last / mid.
292
+ */
293
+ export declare function fetchQfexMarketStats(mdsUrl: string, symbol: string, timeoutMs: number): Promise<QfexMdsSnapshot>;
294
+ export {};