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,95 @@
1
+ /**
2
+ * Pacifica venue definition (design §10.1, §10.8, §10.13 #4).
3
+ * Adapter + public-data code are loaded lazily (§10.10).
4
+ */
5
+ import { BUILDER_FEE_CAPABILITIES } from "../builder-fee.js";
6
+ const publicData = {
7
+ async fetchFundingRates(net) {
8
+ return (await import("../../funding/legacy-public.js")).legacyPublicData("pacifica").fetchFundingRates(net);
9
+ },
10
+ async fetchMarkets(net) {
11
+ return (await import("../../funding/legacy-public.js")).legacyPublicData("pacifica").fetchMarkets(net);
12
+ },
13
+ };
14
+ /** Pacifica `client_order_id` format: "Full UUID string" (docs.pacifica.fi rest-api orders/create-limit-order). */
15
+ export const PACIFICA_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
16
+ export const pacificaVenue = {
17
+ id: "pacifica",
18
+ aliases: ["pac"],
19
+ displayName: "Pacifica",
20
+ family: "pacifica",
21
+ masterKeyKind: "solana",
22
+ agentKeyKind: "solana",
23
+ secretStorage: { kind: "ows-wallet", dir: null },
24
+ // URLs: src/pacifica/constants.ts
25
+ networks: {
26
+ mainnet: {
27
+ restUrl: "https://api.pacifica.fi/api/v1",
28
+ wsUrl: "wss://ws.pacifica.fi/ws",
29
+ explorerUrl: null,
30
+ signingChainId: null,
31
+ settlementChain: "solana",
32
+ collateral: ["USDC"],
33
+ collateralAssetIndex: null,
34
+ rpcUrl: null,
35
+ depositPins: null,
36
+ },
37
+ testnet: {
38
+ restUrl: "https://test-api.pacifica.fi/api/v1",
39
+ wsUrl: "wss://test-ws.pacifica.fi/ws",
40
+ explorerUrl: null,
41
+ signingChainId: null,
42
+ settlementChain: "solana",
43
+ collateral: ["USDC"],
44
+ collateralAssetIndex: null,
45
+ rpcUrl: null,
46
+ depositPins: null,
47
+ },
48
+ },
49
+ fundingRateBasis: { kind: "perHours", hours: 1 },
50
+ settlementIntervalHours: 1,
51
+ fundingVerified: true,
52
+ roles: ["marketData", "account", "trading"],
53
+ capabilities: {
54
+ marketOrder: "slippageBounded",
55
+ timeInForce: ["GTC", "IOC", "ALO", "TOB"],
56
+ reduceOnlyTif: null,
57
+ // docs.pacifica.fi rest-api orders/create-limit-order: `client_order_id` | Full UUID string |
58
+ // optional | "Client-defined order ID"; orders/cancel-order accepts `client_order_id`
59
+ // ("required (if no OID)"). CLI rule: V2_CLIENT_ID_RULES (commands/trade.ts) / PACIFICA_UUID_RE.
60
+ clientOrderId: true,
61
+ orderAck: "sync",
62
+ tpsl: "positionLevel",
63
+ amend: "native",
64
+ batchPlaceMax: null,
65
+ marginModes: ["cross", "isolated"],
66
+ withdrawAssets: ["USDC"],
67
+ },
68
+ // docs.pacifica.fi "Rate limits": "Pacifica uses a credit-based rate limiting system with a
69
+ // 60-second rolling window." Tier "Unidentified IP | 125" base credits/60s (valid API Config
70
+ // Key: 300); "Standard request/action | 1" credit.
71
+ // Declared only — per §10.9 the limiter is applied to new venues + lighter-rh.
72
+ rateLimit: { capacity: 125, refillPerSec: 125 / 60, weights: null },
73
+ restrictedRegions: [],
74
+ symbolIdentity: "baseTicker",
75
+ publicData,
76
+ // §12: spot (SOL-USDC) shares the perp account — USDC is perp margin, no transfer.
77
+ spot: {
78
+ accountModel: "unified",
79
+ quoteAssets: { mainnet: ["USDC"], testnet: ["USDC"] },
80
+ capabilities: { limitOrder: true, orderbook: true, cancel: true, transfer: false },
81
+ async createSpot(perp) {
82
+ const [{ PacificaAdapter }, { PacificaSpotAdapter }] = await Promise.all([
83
+ import("../pacifica.js"), import("../pacifica-spot.js"),
84
+ ]);
85
+ if (!(perp instanceof PacificaAdapter))
86
+ throw new Error(`pacifica spot needs a PacificaAdapter (got ${perp.name})`);
87
+ const spot = new PacificaSpotAdapter(perp);
88
+ await spot.init();
89
+ return spot;
90
+ },
91
+ },
92
+ maxSlippageBps: 5000,
93
+ builderFee: BUILDER_FEE_CAPABILITIES["pacifica"],
94
+ create: async (ctx) => (await import("./create-helpers.js")).createPacifica(ctx),
95
+ };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * QFEX venue definition (design §14.1 as amended by §14.12).
3
+ *
4
+ * TradFi perpetuals (equities, indices, commodities; no spot) on a custodial, off-chain
5
+ * matching engine. All markets are cross-margin, margin asset USDC. Orders go over the Trade
6
+ * WebSocket only; account reads, leverage and transfers over REST; deposits / withdrawals over
7
+ * the separate "banker" host. Hot-path key = HMAC API key created on the QFEX website (2FA),
8
+ * stored in ~/.perp/qfex-agents/<publicKey>.json (SSOT Rule #3). There is no wallet signature.
9
+ * Not registered here; the registry module owns registerVenue().
10
+ */
11
+ import type { VenueDefinition } from "../venue.js";
12
+ import type { Network } from "../venue-types.js";
13
+ /**
14
+ * Hosts per network. VenueNetworkConfig carries only two (rest + ws), so the MDS and banker
15
+ * hosts live here. Testnet = QFEX "UAT": "identical API and behaviour, separate exchange
16
+ * instance with no real funds" (official CLI README "Environments").
17
+ */
18
+ export declare const QFEX_ENDPOINTS: Readonly<Record<Network, {
19
+ rest: string;
20
+ tradeWs: string;
21
+ mdsWs: string;
22
+ banker: string;
23
+ }>>;
24
+ /** Chain QFEX USDC deposits / withdrawals use in perp-cli (banker network ARBITRUM_ONE). */
25
+ export declare const QFEX_WITHDRAW_NETWORK = "arbitrum";
26
+ /** Banker `network` value for QFEX_WITHDRAW_NETWORK. */
27
+ export declare const QFEX_BANKER_NETWORK = "ARBITRUM_ONE";
28
+ export declare const qfexVenue: VenueDefinition;
@@ -0,0 +1,132 @@
1
+ /**
2
+ * QFEX venue definition (design §14.1 as amended by §14.12).
3
+ *
4
+ * TradFi perpetuals (equities, indices, commodities; no spot) on a custodial, off-chain
5
+ * matching engine. All markets are cross-margin, margin asset USDC. Orders go over the Trade
6
+ * WebSocket only; account reads, leverage and transfers over REST; deposits / withdrawals over
7
+ * the separate "banker" host. Hot-path key = HMAC API key created on the QFEX website (2FA),
8
+ * stored in ~/.perp/qfex-agents/<publicKey>.json (SSOT Rule #3). There is no wallet signature.
9
+ * Not registered here; the registry module owns registerVenue().
10
+ */
11
+ import { BUILDER_FEE_CAPABILITIES } from "../builder-fee.js";
12
+ import { QFEX_MODIFY_KEEPS_CLIENT_ID, QFEX_RESTING_REDUCE_ONLY_VERIFIED } from "../qfex/signing.js";
13
+ /**
14
+ * Hosts per network. VenueNetworkConfig carries only two (rest + ws), so the MDS and banker
15
+ * hosts live here. Testnet = QFEX "UAT": "identical API and behaviour, separate exchange
16
+ * instance with no real funds" (official CLI README "Environments").
17
+ */
18
+ export const QFEX_ENDPOINTS = {
19
+ mainnet: { rest: "https://api.qfex.com", tradeWs: "wss://trade.qfex.com", mdsWs: "wss://mds.qfex.com", banker: "https://banker.qfex.com" },
20
+ testnet: { rest: "https://api.qfex.io", tradeWs: "wss://trade.qfex.io", mdsWs: "wss://mds.qfex.io", banker: "https://banker.qfex.io" },
21
+ };
22
+ /** Chain QFEX USDC deposits / withdrawals use in perp-cli (banker network ARBITRUM_ONE). */
23
+ export const QFEX_WITHDRAW_NETWORK = "arbitrum";
24
+ /** Banker `network` value for QFEX_WITHDRAW_NETWORK. */
25
+ export const QFEX_BANKER_NETWORK = "ARBITRUM_ONE";
26
+ /** Lazy: public.ts (and `ws`) is only loaded when market data is actually requested. */
27
+ const publicData = {
28
+ async fetchFundingRates(net) {
29
+ return (await import("../qfex/public.js")).qfexPublicData.fetchFundingRates(net);
30
+ },
31
+ async fetchMarkets(net) {
32
+ return (await import("../qfex/public.js")).qfexPublicData.fetchMarkets(net);
33
+ },
34
+ };
35
+ function network(net) {
36
+ return {
37
+ restUrl: QFEX_ENDPOINTS[net].rest,
38
+ wsUrl: QFEX_ENDPOINTS[net].tradeWs,
39
+ explorerUrl: null,
40
+ signingChainId: null,
41
+ settlementChain: "offchain",
42
+ collateral: ["USDC"],
43
+ collateralAssetIndex: null,
44
+ rpcUrl: null,
45
+ depositPins: null,
46
+ };
47
+ }
48
+ export const qfexVenue = {
49
+ id: "qfex",
50
+ aliases: ["qf"],
51
+ displayName: "QFEX",
52
+ family: "qfex",
53
+ // Custodial: there is no owner-wallet signing path at all.
54
+ masterKeyKind: "none",
55
+ agentKeyKind: "hmac",
56
+ secretStorage: { kind: "perp-keystore", dir: "qfex-agents" },
57
+ networks: { mainnet: network("mainnet"), testnet: network("testnet") },
58
+ // Docs /qfex/funding: settled every 60 minutes.
59
+ fundingRateBasis: { kind: "perHours", hours: 1 },
60
+ settlementIntervalHours: 1,
61
+ // Q4: the unit of `funding_rate` (and funding_rate vs next_funding_rate) is not verified
62
+ // against settled payments, and equity funding accrues only ~120 of 168 hours a week, so
63
+ // hourly × 8760 overstates it. Until both are settled QFEX is not a funding-arb venue.
64
+ fundingVerified: false,
65
+ roles: ["marketData", "account", "trading"],
66
+ capabilities: {
67
+ // The venue offers a native MARKET order (bounded only by the price band — docs /qfex/risk-limits
68
+ // "Dynamic price bands": 1.65%–10% by product preset and session; "integrations should use
69
+ // that live value rather than hardcoding a percentage"); the
70
+ // adapter sends every market order as an IOC LIMIT at the tick-aligned protection price
71
+ // (mark ± resolved slippage, design §13.2) — the same declaration as Ondo.
72
+ marketOrder: "native",
73
+ // ALO = order_type "ALO" + GTC.
74
+ timeInForce: ["GTC", "IOC", "FOK", "ALO"],
75
+ // Reduce-only (Q2, production 2026-10-05: `reduce_only` is a JSON boolean; rejected with no
76
+ // position, but an order larger than the position is accepted and RESTS at full size). The
77
+ // adapter enforces side and size against the live position before each send, which covers
78
+ // an immediate order only — a resting one is refused until match-time capping is proven
79
+ // (QFEX_RESTING_REDUCE_ONLY_VERIFIED, qfex/signing.ts).
80
+ reduceOnlyTif: QFEX_RESTING_REDUCE_ONLY_VERIFIED === true ? null : ["IOC"],
81
+ clientOrderId: true,
82
+ // The ACK arrives first; fills / rejections follow as separate events. Client order ids
83
+ // are GENERATED only (venue ids are not unique) — a user --client-id is refused.
84
+ orderAck: "async",
85
+ // Attached take_profit / stop_loss exists on add_order, but the stop quantity on a partial
86
+ // or zero-fill entry and the id of the resulting stop are unverified (Q7) → separate
87
+ // reduce-only TAKE_PROFIT / STOP_LOSS stop orders sized to the verified fill (Q21 passed on
88
+ // production 2026-10-12: the stop ACK echoes the client id — qfex/signing.ts QFEX_STOP_CLIENT_ID_ECHO).
89
+ tpsl: "separateOrders",
90
+ // modify_order returns a NEW order id; the MODIFIED frame keeps the client id (Q5, production
91
+ // 2026-10-12 — QFEX_MODIFY_KEEPS_CLIENT_ID) → native amend correlated by client id.
92
+ amend: QFEX_MODIFY_KEEPS_CLIENT_ID === true ? "native" : null,
93
+ batchPlaceMax: null,
94
+ marginModes: ["cross"],
95
+ // TRON USDT and USD bank rails are out of scope.
96
+ withdrawAssets: ["USDC"],
97
+ },
98
+ // Venue budget: 12,000 weight / 60 s per USER across all connections and keys (general and
99
+ // cancel buckets separate). This process takes 25% (50/s, burst 100); the rest is left to the
100
+ // user's other processes, the QFEX web app and the official CLI. Weights: docs /websocket/rate.
101
+ rateLimit: {
102
+ capacity: 100,
103
+ refillPerSec: 50,
104
+ weights: {
105
+ add_order: 1, cancel_order: 1, modify_order: 1, get_order: 2, get_user_orders: 5, cancel_all_orders: 2,
106
+ get_user_trades: 0.5, subscribe: 0.1, unsubscribe: 0.1, set_user_leverage: 0.1, cancel_stop_order: 1,
107
+ modify_stop_order: 1,
108
+ },
109
+ },
110
+ // Docs /qfex/faq + prohibited-jurisdictions ("including but not limited to"). Warn-only.
111
+ restrictedRegions: ["US", "GB", "ES", "UA", "SY", "IR", "RU", "KP", "MM", "BY", "VE", "SD"],
112
+ symbolIdentity: "explicit",
113
+ publicData,
114
+ spot: null,
115
+ // Widest documented price band (equities at the open: 10%). The order's own band is checked before sending.
116
+ maxSlippageBps: 1000,
117
+ builderFee: BUILDER_FEE_CAPABILITIES["qfex"],
118
+ create: async (ctx) => {
119
+ const { QfexAdapter } = await import("../qfex/adapter.js");
120
+ const adapter = new QfexAdapter(qfexVenue, ctx);
121
+ // Builder code: only settings builder.qfex (off by default); no approval step. It rides on
122
+ // the connection's auth, so --no-builder / testnet use a session without it.
123
+ const { loadSettings } = await import("../../settings.js");
124
+ const { resolveBuilderGate } = await import("../builder-fee.js");
125
+ const settings = loadSettings();
126
+ adapter.builderFee = resolveBuilderGate("qfex", ctx, settings.builder, null, () => "");
127
+ // Withdraw gate (settings.withdraw.qfex): absent = withdraw() refuses.
128
+ const gate = settings.withdraw.qfex;
129
+ adapter.withdrawGate = gate === undefined ? null : gate;
130
+ return adapter;
131
+ },
132
+ };
@@ -11,13 +11,21 @@ function genId() {
11
11
  }
12
12
  /** Append an execution record to the log */
13
13
  export function logExecution(record) {
14
- ensureDir();
15
14
  const full = {
16
15
  id: genId(),
17
16
  timestamp: new Date().toISOString(),
18
17
  ...record,
19
18
  };
20
- appendFileSync(LOG_FILE, JSON.stringify(full) + "\n", { mode: 0o600 });
19
+ // The log is a record OF an outcome, never part of it: a write failure (disk full, read-only
20
+ // home, permissions) must not turn a filled order into a thrown "failed" one. It is reported
21
+ // on stderr and the caller continues with the real result.
22
+ try {
23
+ ensureDir();
24
+ appendFileSync(LOG_FILE, JSON.stringify(full) + "\n", { mode: 0o600 });
25
+ }
26
+ catch (e) {
27
+ process.stderr.write(`[perp] Warning: could not write the execution log (${LOG_FILE}): ${e instanceof Error ? e.message : String(e)} — the ${record.type} on ${record.exchange} was recorded as "${record.status}" in memory only\n`);
28
+ }
21
29
  return full;
22
30
  }
23
31
  /** Read execution log with optional filters */
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Public market data for the legacy venues without a native `getVenueMarkets`
3
+ * (pacifica, hyperliquid core, aster) — design §10.6. Lighter uses
4
+ * exchanges/lighter-public.ts.
5
+ *
6
+ * Network-aware: the REST base comes from `legacyPublicBaseUrl(venue, net)`,
7
+ * never from the mutable `*_API_URL` globals. A network without a known public
8
+ * API throws NOT_IMPLEMENTED.
9
+ *
10
+ * FUNDING BASIS / SETTLEMENT
11
+ * pacifica, hyperliquid: the venue definition (fundingBasisOf / settlementIntervalOf).
12
+ * aster: per symbol from GET /fapi/v3/fundingInfo `fundingIntervalHours`
13
+ * (live 2026-09-30: 1h/2h/4h/8h mixed). One quoted rate covers one interval,
14
+ * so basis hours == settlement hours. A symbol missing from fundingInfo is
15
+ * excluded with a warning (its period would be a guess).
16
+ *
17
+ * ASSET CLASS
18
+ * hyperliquid core: crypto (HIP-3 dexes are not served here).
19
+ * pacifica: crypto-centric; PACIFICA_NON_CRYPTO lists every non-crypto perp
20
+ * listed on 2026-09-30.
21
+ * aster: exchangeInfo `underlyingSubType` (STOCK / ETF / Commodities / pre-launch).
22
+ * AMBIGUOUS tickers are excluded with a warning so they cannot produce a false
23
+ * cross-venue match (SPX = the SPX6900 token, whose ticker equals the S&P 500
24
+ * canonical key).
25
+ *
26
+ * Fields a venue does not publish on this path are null (HL has no fixed tick
27
+ * size; Aster leverage brackets need a signed call; Aster OI is per-symbol only).
28
+ */
29
+ import type { VenuePublicData } from "../exchanges/venue.js";
30
+ export type LegacyPublicVenue = "pacifica" | "hyperliquid" | "aster";
31
+ export declare function legacyPublicData(venue: LegacyPublicVenue): VenuePublicData;