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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 HypurrQuant
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,293 @@
1
+ # perp-cli
2
+
3
+ Multi-DEX perpetual futures CLI for **Pacifica**, **Hyperliquid**, and **Lighter**.
4
+
5
+ Trade, bridge, arbitrage, and manage positions across 3 exchanges from a single command line.
6
+
7
+ ```bash
8
+ npm install -g perp-cli
9
+ perp status --json
10
+ ```
11
+
12
+ ## Features
13
+
14
+ - **3 Exchanges** — Pacifica (Solana), Hyperliquid (HyperEVM), Lighter (Ethereum)
15
+ - **Live Dashboard** — Real-time multi-exchange dashboard with WebSocket feeds
16
+ - **CCTP V2 Bridge** — $0 fee USDC bridging across Solana, Arbitrum, Base (6 routes)
17
+ - **Funding Rate Arb** — Cross-exchange funding rate arbitrage scanner + auto-executor
18
+ - **Grid & DCA Bots** — Automated strategies with background job management
19
+ - **AI Agent Mode** — JSON schema + structured I/O for LLM-powered trading agents
20
+ - **Full JSON Output** — Every command supports `--json` for programmatic access
21
+
22
+ ## Quick Start
23
+
24
+ ```bash
25
+ # Interactive setup (recommended for first-time users)
26
+ perp init
27
+
28
+ # Or configure exchange keys manually
29
+ export HL_PRIVATE_KEY=<evm-hex-key> # Hyperliquid
30
+ export PRIVATE_KEY=<solana-base58-key> # Pacifica
31
+ export LIGHTER_PRIVATE_KEY=<evm-hex-key> # Lighter
32
+
33
+ # Or use wallet management
34
+ perp wallet import evm <key> # Import & auto-bind to HL + Lighter
35
+ perp wallet import solana <key> # Import & auto-bind to Pacifica
36
+
37
+ # Set default exchange (skip -e flag)
38
+ perp settings set default-exchange hyperliquid
39
+
40
+ # Check status
41
+ perp status
42
+ perp -e pacifica status
43
+ ```
44
+
45
+ ## Commands
46
+
47
+ ### Market Data
48
+
49
+ ```bash
50
+ perp market list # All available markets
51
+ perp market mid BTC # Mid price
52
+ perp market info BTC # Market details (tick size, max leverage)
53
+ perp market book BTC # Orderbook
54
+ perp market funding BTC # Funding rate
55
+ ```
56
+
57
+ ### Account
58
+
59
+ ```bash
60
+ perp account info # Balance & margin
61
+ perp account positions # Open positions
62
+ perp account orders # Open orders
63
+ perp account history # Trade history
64
+ perp account margin BTC # Position-level margin info
65
+ ```
66
+
67
+ ### Trading
68
+
69
+ ```bash
70
+ perp trade buy BTC 0.01 # Market buy
71
+ perp trade sell BTC 0.01 # Market sell
72
+ perp trade buy BTC 0.01 -p 60000 # Limit buy @ $60,000
73
+ perp trade close BTC # Close position
74
+ perp trade cancel <orderId> # Cancel order
75
+ perp trade tp BTC 65000 # Take-profit
76
+ perp trade sl BTC 58000 # Stop-loss
77
+ ```
78
+
79
+ ### Position Management
80
+
81
+ ```bash
82
+ perp manage leverage BTC 10 # Set leverage
83
+ perp manage margin-mode BTC cross # Cross/isolated margin
84
+ ```
85
+
86
+ ### Deposit & Withdraw
87
+
88
+ ```bash
89
+ perp deposit pacifica 100 # Deposit USDC into Pacifica
90
+ perp deposit hyperliquid 100 # Deposit USDC into Hyperliquid (Arbitrum)
91
+ perp deposit lighter ethereum 100 # Deposit via Ethereum L1
92
+ perp deposit lighter cctp arb 100 # Deposit via CCTP (Arbitrum/Base/Avalanche)
93
+ perp deposit lighter info # Show all Lighter deposit routes
94
+ perp withdraw pacifica 50 # Withdraw USDC
95
+ perp withdraw hyperliquid 50
96
+ perp deposit info # All deposit instructions
97
+ ```
98
+
99
+ ### Cross-Chain Bridge (CCTP V2)
100
+
101
+ Zero-fee USDC bridging powered by Circle CCTP V2.
102
+
103
+ ```bash
104
+ perp bridge chains # Supported chains
105
+ perp bridge quote --from solana --to arbitrum --amount 100
106
+ perp bridge send --from solana --to arbitrum --amount 100
107
+ perp bridge exchange --from pacifica --to hyperliquid --amount 100
108
+ perp bridge status <orderId>
109
+ ```
110
+
111
+ **Supported routes:** Solana ↔ Arbitrum ↔ Base (all 6 directions, $0 CCTP fee)
112
+
113
+ ### Funding Rate Arbitrage
114
+
115
+ ```bash
116
+ perp arb rates # Compare rates across exchanges
117
+ perp arb scan --min 10 # Find opportunities (>10 bps spread)
118
+ perp arb auto --min-spread 30 # Auto-execute arb (daemon mode)
119
+ ```
120
+
121
+ ### Automated Strategies
122
+
123
+ ```bash
124
+ # Grid trading
125
+ perp run grid BTC --range 5 --grids 10 --size 100
126
+
127
+ # DCA (Dollar Cost Average)
128
+ perp run dca BTC --interval 1h --size 50 --side buy
129
+
130
+ # Funding arb bot
131
+ perp run arb --min-spread 20
132
+ ```
133
+
134
+ ### Real-Time Streams
135
+
136
+ ```bash
137
+ perp stream book BTC # Live orderbook
138
+ perp stream trades BTC # Live trades
139
+ perp stream funding # Live funding rates
140
+ ```
141
+
142
+ ### Live Dashboard
143
+
144
+ ```bash
145
+ perp dashboard # Real-time multi-exchange dashboard
146
+ perp dashboard --port 3457 # Custom port
147
+ perp dashboard --exchanges hl,pac # Specific exchanges only
148
+ ```
149
+
150
+ WebSocket-based real-time monitoring: positions, orders, balances, funding rates, arb opportunities across all exchanges. Includes HIP-3 dex position tracking.
151
+
152
+ ### Cross-Exchange Tools
153
+
154
+ ```bash
155
+ perp gap show # Price gaps between exchanges
156
+ perp gap watch --min 0.05 # Live gap monitor
157
+ perp portfolio # Unified portfolio view
158
+ perp risk overview # Cross-exchange risk assessment
159
+ perp analytics pnl # P&L analytics
160
+ ```
161
+
162
+ ### Background Jobs
163
+
164
+ ```bash
165
+ perp jobs list # Running background jobs
166
+ perp jobs start arb # Start arb in background (tmux)
167
+ perp jobs stop <id> # Stop a job
168
+ perp jobs logs <id> # View job logs
169
+ ```
170
+
171
+ ### Alerts
172
+
173
+ ```bash
174
+ perp alert add -t price -s BTC --above 100000 --telegram
175
+ perp alert add -t funding -s ETH --spread 30
176
+ perp alert daemon --interval 30
177
+ ```
178
+
179
+ ## Claude Code Agent Skill
180
+
181
+ Install as a Claude Code plugin to let Claude trade for you:
182
+
183
+ ```bash
184
+ # In Claude Code
185
+ /plugin marketplace add hypurrquant/perp-cli
186
+ /plugin install perp-trading@hypurrquant-perp-cli
187
+ ```
188
+
189
+ Once installed, use `/perp-trading` in Claude Code:
190
+
191
+ ```
192
+ /perp-trading status # Check all exchanges
193
+ /perp-trading BTC 0.01 long on hyperliquid # Natural language trading
194
+ /perp-trading scan arb opportunities # Find funding rate arb
195
+ /perp-trading bridge 100 USDC solana to arb # Cross-chain bridge
196
+ ```
197
+
198
+ The skill includes safety guardrails (balance checks, user confirmation before trades, error handling with retries).
199
+
200
+ ## AI Agent Integration
201
+
202
+ Every command supports `--json` for structured output:
203
+
204
+ ```bash
205
+ # Discover capabilities
206
+ perp api-spec --json # Full command spec for agent discovery
207
+ perp schema --json # CLI schema with error codes
208
+
209
+ # Machine-readable trading
210
+ perp --json -e hyperliquid market mid BTC
211
+ perp --json trade buy ETH 0.1
212
+ perp --json account positions
213
+ ```
214
+
215
+ All JSON responses follow a consistent envelope:
216
+
217
+ ```json
218
+ {
219
+ "ok": true,
220
+ "data": { ... },
221
+ "meta": { "timestamp": "2026-03-08T..." }
222
+ }
223
+ ```
224
+
225
+ Error responses:
226
+
227
+ ```json
228
+ {
229
+ "ok": false,
230
+ "error": { "code": "INSUFFICIENT_BALANCE", "message": "...", "retryable": false },
231
+ "meta": { "timestamp": "..." }
232
+ }
233
+ ```
234
+
235
+ ### Composite Plans
236
+
237
+ Multi-step atomic operations for agents:
238
+
239
+ ```bash
240
+ perp plan example # Example plan JSON
241
+ perp plan validate plan.json # Validate a plan
242
+ perp plan execute plan.json # Execute multi-step plan
243
+ ```
244
+
245
+ ## Configuration
246
+
247
+ ### Wallet Management (Recommended)
248
+
249
+ ```bash
250
+ perp init # Interactive setup wizard
251
+ perp wallet generate evm # Generate new EVM wallet
252
+ perp wallet import solana <key> # Import existing key
253
+ perp wallet use <name> # Auto-bind to exchanges by type
254
+ perp wallet list # List all wallets
255
+ perp wallet balance # On-chain balances
256
+ ```
257
+
258
+ Wallets are stored in `~/.perp/wallets.json` (file permission 0600).
259
+
260
+ ### Environment Variables
261
+
262
+ ```bash
263
+ # Exchange keys (alternative to wallet management)
264
+ PRIVATE_KEY= # Default key (Solana base58 or EVM hex)
265
+ PACIFICA_PRIVATE_KEY= # Pacifica (Solana)
266
+ HL_PRIVATE_KEY= # Hyperliquid (EVM)
267
+ LIGHTER_PRIVATE_KEY= # Lighter (EVM)
268
+ LIGHTER_API_KEY= # Lighter API key (40-byte)
269
+ ```
270
+
271
+ Key resolution order: `--private-key` flag → exchange-specific env var → `PRIVATE_KEY` → wallet store → `~/.perp/<exchange>.key`
272
+
273
+ ### Settings
274
+
275
+ ```bash
276
+ perp settings show # Current settings
277
+ perp settings set default-exchange hyperliquid # Set default exchange
278
+ perp settings referrals on # Enable referral codes
279
+ perp settings set referralCodes.hyperliquid MYCODE
280
+ ```
281
+
282
+ ## Tech Stack
283
+
284
+ - **TypeScript** + Node.js (ESM)
285
+ - **Solana**: `@solana/web3.js`, `tweetnacl`, `bs58`
286
+ - **EVM**: `ethers` v6
287
+ - **Exchanges**: `hyperliquid` SDK, `lighter-sdk` (WASM), `@pacifica/sdk`
288
+ - **Bridge**: Circle CCTP V2 (Solana ↔ EVM), deBridge DLN (fallback)
289
+ - **Testing**: Vitest (860+ tests)
290
+
291
+ ## License
292
+
293
+ MIT
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,107 @@
1
+ import { describe, it, expect } from "vitest";
2
+ /**
3
+ * Tests for the alert price merging logic (extracted from alert.ts).
4
+ * Validates the fix for the price map key inconsistency bug.
5
+ */
6
+ function mergePrices(pacData, hlData) {
7
+ const map = new Map();
8
+ if (pacData) {
9
+ for (const p of pacData) {
10
+ map.set(`pac:${p.symbol}`, Number(p.mark));
11
+ }
12
+ }
13
+ if (hlData) {
14
+ for (const [symbol, price] of Object.entries(hlData)) {
15
+ map.set(`hl:${symbol}`, Number(price));
16
+ }
17
+ }
18
+ // Merge into bare symbol keys: prefer pac price, fallback to hl
19
+ const allSymbols = new Set();
20
+ for (const k of map.keys()) {
21
+ if (k.includes(":"))
22
+ allSymbols.add(k.split(":")[1]);
23
+ }
24
+ for (const sym of allSymbols) {
25
+ const pacPrice = map.get(`pac:${sym}`);
26
+ const hlPrice = map.get(`hl:${sym}`);
27
+ map.set(sym, pacPrice ?? hlPrice ?? 0);
28
+ }
29
+ return map;
30
+ }
31
+ describe("Alert price merging", () => {
32
+ it("prefers Pacifica price when both available", () => {
33
+ const map = mergePrices([{ symbol: "BTC", mark: "100000" }], { BTC: "99900" });
34
+ expect(map.get("BTC")).toBe(100000);
35
+ expect(map.get("pac:BTC")).toBe(100000);
36
+ expect(map.get("hl:BTC")).toBe(99900);
37
+ });
38
+ it("falls back to HL price when pac unavailable", () => {
39
+ const map = mergePrices(null, { ETH: "3500" });
40
+ expect(map.get("ETH")).toBe(3500);
41
+ expect(map.has("pac:ETH")).toBe(false);
42
+ expect(map.get("hl:ETH")).toBe(3500);
43
+ });
44
+ it("handles Pacifica-only symbols", () => {
45
+ const map = mergePrices([{ symbol: "SOL", mark: "150" }], {});
46
+ expect(map.get("SOL")).toBe(150);
47
+ });
48
+ it("handles empty data", () => {
49
+ const map = mergePrices(null, null);
50
+ expect(map.size).toBe(0);
51
+ });
52
+ it("handles multiple symbols from both sources", () => {
53
+ const map = mergePrices([
54
+ { symbol: "BTC", mark: "100000" },
55
+ { symbol: "ETH", mark: "3500" },
56
+ ], {
57
+ BTC: "99900",
58
+ ETH: "3490",
59
+ SOL: "150",
60
+ });
61
+ // Pac preferred for BTC and ETH
62
+ expect(map.get("BTC")).toBe(100000);
63
+ expect(map.get("ETH")).toBe(3500);
64
+ // HL-only for SOL
65
+ expect(map.get("SOL")).toBe(150);
66
+ });
67
+ it("bare symbol key is always set (no orphaned prefixed keys)", () => {
68
+ const map = mergePrices([{ symbol: "DOGE", mark: "0.15" }], { DOGE: "0.14", ARB: "1.20" });
69
+ // Every symbol with a prefixed key should have a bare key
70
+ for (const k of map.keys()) {
71
+ if (k.includes(":")) {
72
+ const bare = k.split(":")[1];
73
+ expect(map.has(bare)).toBe(true);
74
+ }
75
+ }
76
+ });
77
+ });
78
+ describe("Alert trigger conditions", () => {
79
+ it("fires price above alert", () => {
80
+ const currentPrice = 105000;
81
+ const threshold = 100000;
82
+ const condition = "above";
83
+ expect(condition === "above" && currentPrice >= threshold).toBe(true);
84
+ });
85
+ it("does NOT fire price above when below", () => {
86
+ const currentPrice = 95000;
87
+ const threshold = 100000;
88
+ const condition = "above";
89
+ expect(condition === "above" && currentPrice >= threshold).toBe(false);
90
+ });
91
+ it("fires price below alert", () => {
92
+ const currentPrice = 95000;
93
+ const threshold = 100000;
94
+ const condition = "below";
95
+ expect(condition === "below" && currentPrice <= threshold).toBe(true);
96
+ });
97
+ it("fires funding spread alert", () => {
98
+ const spread = 35; // annual %
99
+ const alertThreshold = 30;
100
+ expect(spread >= alertThreshold).toBe(true);
101
+ });
102
+ it("does NOT fire funding spread below threshold", () => {
103
+ const spread = 25;
104
+ const alertThreshold = 30;
105
+ expect(spread >= alertThreshold).toBe(false);
106
+ });
107
+ });
@@ -0,0 +1 @@
1
+ export {};