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.
- package/LICENSE +21 -0
- package/README.md +293 -0
- package/dist/__tests__/alert-logic.test.d.ts +1 -0
- package/dist/__tests__/alert-logic.test.js +107 -0
- package/dist/__tests__/arb-auto-3dex.test.d.ts +1 -0
- package/dist/__tests__/arb-auto-3dex.test.js +397 -0
- package/dist/__tests__/arb-history-stats.test.d.ts +1 -0
- package/dist/__tests__/arb-history-stats.test.js +176 -0
- package/dist/__tests__/arb-logic.test.d.ts +1 -0
- package/dist/__tests__/arb-logic.test.js +84 -0
- package/dist/__tests__/arb-manage.test.d.ts +1 -0
- package/dist/__tests__/arb-manage.test.js +253 -0
- package/dist/__tests__/arb-new-features.test.d.ts +1 -0
- package/dist/__tests__/arb-new-features.test.js +457 -0
- package/dist/__tests__/arb-sizing.test.d.ts +1 -0
- package/dist/__tests__/arb-sizing.test.js +48 -0
- package/dist/__tests__/arb-state.test.d.ts +1 -0
- package/dist/__tests__/arb-state.test.js +284 -0
- package/dist/__tests__/arb-userflow.test.d.ts +1 -0
- package/dist/__tests__/arb-userflow.test.js +945 -0
- package/dist/__tests__/arb-utils.test.d.ts +1 -0
- package/dist/__tests__/arb-utils.test.js +264 -0
- package/dist/__tests__/bot-conditions.test.d.ts +1 -0
- package/dist/__tests__/bot-conditions.test.js +341 -0
- package/dist/__tests__/client-id-tracker.test.d.ts +1 -0
- package/dist/__tests__/client-id-tracker.test.js +137 -0
- package/dist/__tests__/commands/new-atomic-commands.test.d.ts +1 -0
- package/dist/__tests__/commands/new-atomic-commands.test.js +502 -0
- package/dist/__tests__/commands/order-intent.test.d.ts +1 -0
- package/dist/__tests__/commands/order-intent.test.js +600 -0
- package/dist/__tests__/commands/trade-commands.test.d.ts +1 -0
- package/dist/__tests__/commands/trade-commands.test.js +821 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +86 -0
- package/dist/__tests__/cross-chain-margin.test.d.ts +1 -0
- package/dist/__tests__/cross-chain-margin.test.js +287 -0
- package/dist/__tests__/dex-asset-map.test.d.ts +1 -0
- package/dist/__tests__/dex-asset-map.test.js +191 -0
- package/dist/__tests__/errors.test.d.ts +1 -0
- package/dist/__tests__/errors.test.js +110 -0
- package/dist/__tests__/event-stream.test.d.ts +1 -0
- package/dist/__tests__/event-stream.test.js +276 -0
- package/dist/__tests__/exchanges/interface.test.d.ts +1 -0
- package/dist/__tests__/exchanges/interface.test.js +132 -0
- package/dist/__tests__/exchanges/mock-adapter.d.ts +69 -0
- package/dist/__tests__/exchanges/mock-adapter.js +137 -0
- package/dist/__tests__/execution-log.test.d.ts +1 -0
- package/dist/__tests__/execution-log.test.js +106 -0
- package/dist/__tests__/funding-calc.test.d.ts +1 -0
- package/dist/__tests__/funding-calc.test.js +71 -0
- package/dist/__tests__/funding-history.test.d.ts +1 -0
- package/dist/__tests__/funding-history.test.js +343 -0
- package/dist/__tests__/funding-rates.test.d.ts +1 -0
- package/dist/__tests__/funding-rates.test.js +342 -0
- package/dist/__tests__/funding.test.d.ts +1 -0
- package/dist/__tests__/funding.test.js +173 -0
- package/dist/__tests__/gap-logic.test.d.ts +1 -0
- package/dist/__tests__/gap-logic.test.js +43 -0
- package/dist/__tests__/hip3-dex.test.d.ts +1 -0
- package/dist/__tests__/hip3-dex.test.js +234 -0
- package/dist/__tests__/integration/agent-features.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/agent-features.integration.test.js +553 -0
- package/dist/__tests__/integration/atomic-commands.integration.test.d.ts +13 -0
- package/dist/__tests__/integration/atomic-commands.integration.test.js +246 -0
- package/dist/__tests__/integration/bridge-simulation.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/bridge-simulation.integration.test.js +453 -0
- package/dist/__tests__/integration/bridge-strict.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/bridge-strict.integration.test.js +812 -0
- package/dist/__tests__/integration/bridge.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/bridge.integration.test.js +309 -0
- package/dist/__tests__/integration/cli-e2e.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/cli-e2e.integration.test.js +202 -0
- package/dist/__tests__/integration/dex-arb.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/dex-arb.integration.test.js +116 -0
- package/dist/__tests__/integration/envelope-consistency.integration.test.d.ts +13 -0
- package/dist/__tests__/integration/envelope-consistency.integration.test.js +205 -0
- package/dist/__tests__/integration/hip3-dex.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/hip3-dex.integration.test.js +147 -0
- package/dist/__tests__/integration/hyperliquid.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/hyperliquid.integration.test.js +79 -0
- package/dist/__tests__/integration/lighter.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/lighter.integration.test.js +53 -0
- package/dist/__tests__/integration/new-commands-e2e.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/new-commands-e2e.integration.test.js +236 -0
- package/dist/__tests__/integration/order-verification.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/order-verification.integration.test.js +321 -0
- package/dist/__tests__/integration/pacifica.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/pacifica.integration.test.js +75 -0
- package/dist/__tests__/integration/response-shapes.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/response-shapes.integration.test.js +278 -0
- package/dist/__tests__/liquidity.test.d.ts +1 -0
- package/dist/__tests__/liquidity.test.js +225 -0
- package/dist/__tests__/plan-executor.test.d.ts +1 -0
- package/dist/__tests__/plan-executor.test.js +314 -0
- package/dist/__tests__/position-history.test.d.ts +1 -0
- package/dist/__tests__/position-history.test.js +367 -0
- package/dist/__tests__/retry.test.d.ts +1 -0
- package/dist/__tests__/retry.test.js +310 -0
- package/dist/__tests__/risk-assessment.test.d.ts +1 -0
- package/dist/__tests__/risk-assessment.test.js +145 -0
- package/dist/__tests__/security-adversarial.test.d.ts +1 -0
- package/dist/__tests__/security-adversarial.test.js +574 -0
- package/dist/__tests__/strategies.test.d.ts +1 -0
- package/dist/__tests__/strategies.test.js +539 -0
- package/dist/__tests__/trade-execution.test.d.ts +1 -0
- package/dist/__tests__/trade-execution.test.js +129 -0
- package/dist/__tests__/trade-validator.test.d.ts +1 -0
- package/dist/__tests__/trade-validator.test.js +655 -0
- package/dist/__tests__/utils.test.d.ts +1 -0
- package/dist/__tests__/utils.test.js +76 -0
- package/dist/api/public/hyperliquid.d.ts +18 -0
- package/dist/api/public/hyperliquid.js +82 -0
- package/dist/api/public/index.d.ts +8 -0
- package/dist/api/public/index.js +8 -0
- package/dist/api/public/lighter.d.ts +24 -0
- package/dist/api/public/lighter.js +100 -0
- package/dist/api/public/pacifica.d.ts +17 -0
- package/dist/api/public/pacifica.js +54 -0
- package/dist/api/public/urls.d.ts +12 -0
- package/dist/api/public/urls.js +33 -0
- package/dist/arb/history-stats.d.ts +44 -0
- package/dist/arb/history-stats.js +135 -0
- package/dist/arb/index.d.ts +4 -0
- package/dist/arb/index.js +4 -0
- package/dist/arb/sizing.d.ts +23 -0
- package/dist/arb/sizing.js +96 -0
- package/dist/arb/state.d.ts +51 -0
- package/dist/arb/state.js +112 -0
- package/dist/arb/utils.d.ts +81 -0
- package/dist/arb/utils.js +267 -0
- package/dist/arb-history-stats.d.ts +5 -0
- package/dist/arb-history-stats.js +5 -0
- package/dist/arb-sizing.d.ts +5 -0
- package/dist/arb-sizing.js +5 -0
- package/dist/arb-state.d.ts +5 -0
- package/dist/arb-state.js +5 -0
- package/dist/arb-utils.d.ts +5 -0
- package/dist/arb-utils.js +5 -0
- package/dist/bot/conditions.d.ts +32 -0
- package/dist/bot/conditions.js +141 -0
- package/dist/bot/config.d.ts +76 -0
- package/dist/bot/config.js +160 -0
- package/dist/bot/engine.d.ts +8 -0
- package/dist/bot/engine.js +519 -0
- package/dist/bot/presets.d.ts +11 -0
- package/dist/bot/presets.js +296 -0
- package/dist/bridge-engine.d.ts +133 -0
- package/dist/bridge-engine.js +1487 -0
- package/dist/cache.d.ts +25 -0
- package/dist/cache.js +99 -0
- package/dist/cli-spec.d.ts +50 -0
- package/dist/cli-spec.js +75 -0
- package/dist/client-id-tracker.d.ts +25 -0
- package/dist/client-id-tracker.js +76 -0
- package/dist/commands/account.d.ts +3 -0
- package/dist/commands/account.js +425 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.js +386 -0
- package/dist/commands/alert.d.ts +2 -0
- package/dist/commands/alert.js +421 -0
- package/dist/commands/analytics.d.ts +3 -0
- package/dist/commands/analytics.js +311 -0
- package/dist/commands/arb/index.d.ts +3 -0
- package/dist/commands/arb/index.js +921 -0
- package/dist/commands/arb-auto.d.ts +54 -0
- package/dist/commands/arb-auto.js +1328 -0
- package/dist/commands/arb-manage.d.ts +5 -0
- package/dist/commands/arb-manage.js +5 -0
- package/dist/commands/arb.d.ts +2 -0
- package/dist/commands/arb.js +347 -0
- package/dist/commands/backtest.d.ts +2 -0
- package/dist/commands/backtest.js +327 -0
- package/dist/commands/bot.d.ts +3 -0
- package/dist/commands/bot.js +412 -0
- package/dist/commands/bridge.d.ts +2 -0
- package/dist/commands/bridge.js +396 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.js +176 -0
- package/dist/commands/deposit.d.ts +4 -0
- package/dist/commands/deposit.js +573 -0
- package/dist/commands/dex.d.ts +3 -0
- package/dist/commands/dex.js +114 -0
- package/dist/commands/env.d.ts +2 -0
- package/dist/commands/env.js +136 -0
- package/dist/commands/funding.d.ts +2 -0
- package/dist/commands/funding.js +347 -0
- package/dist/commands/gap.d.ts +2 -0
- package/dist/commands/gap.js +305 -0
- package/dist/commands/health.d.ts +2 -0
- package/dist/commands/health.js +67 -0
- package/dist/commands/history.d.ts +2 -0
- package/dist/commands/history.js +235 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.js +266 -0
- package/dist/commands/jobs.d.ts +2 -0
- package/dist/commands/jobs.js +133 -0
- package/dist/commands/manage.d.ts +4 -0
- package/dist/commands/manage.js +309 -0
- package/dist/commands/market.d.ts +3 -0
- package/dist/commands/market.js +225 -0
- package/dist/commands/plan.d.ts +3 -0
- package/dist/commands/plan.js +95 -0
- package/dist/commands/portfolio.d.ts +3 -0
- package/dist/commands/portfolio.js +169 -0
- package/dist/commands/rebalance.d.ts +3 -0
- package/dist/commands/rebalance.js +293 -0
- package/dist/commands/risk.d.ts +3 -0
- package/dist/commands/risk.js +169 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.js +202 -0
- package/dist/commands/settings.d.ts +2 -0
- package/dist/commands/settings.js +102 -0
- package/dist/commands/stream.d.ts +5 -0
- package/dist/commands/stream.js +123 -0
- package/dist/commands/trade.d.ts +3 -0
- package/dist/commands/trade.js +1273 -0
- package/dist/commands/wallet.d.ts +14 -0
- package/dist/commands/wallet.js +602 -0
- package/dist/commands/withdraw.d.ts +3 -0
- package/dist/commands/withdraw.js +187 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +68 -0
- package/dist/cross-chain-margin.d.ts +46 -0
- package/dist/cross-chain-margin.js +107 -0
- package/dist/dashboard/server.d.ts +80 -0
- package/dist/dashboard/server.js +340 -0
- package/dist/dashboard/ui.d.ts +4 -0
- package/dist/dashboard/ui.js +538 -0
- package/dist/dashboard/ws-feeds.d.ts +29 -0
- package/dist/dashboard/ws-feeds.js +660 -0
- package/dist/dex-asset-map.d.ts +80 -0
- package/dist/dex-asset-map.js +201 -0
- package/dist/errors.d.ts +109 -0
- package/dist/errors.js +84 -0
- package/dist/event-stream.d.ts +25 -0
- package/dist/event-stream.js +168 -0
- package/dist/exchanges/hyperliquid.d.ts +212 -0
- package/dist/exchanges/hyperliquid.js +931 -0
- package/dist/exchanges/interface.d.ts +95 -0
- package/dist/exchanges/interface.js +5 -0
- package/dist/exchanges/lighter.d.ts +159 -0
- package/dist/exchanges/lighter.js +793 -0
- package/dist/exchanges/pacifica.d.ts +51 -0
- package/dist/exchanges/pacifica.js +248 -0
- package/dist/execution-log.d.ts +36 -0
- package/dist/execution-log.js +102 -0
- package/dist/funding/history.d.ts +63 -0
- package/dist/funding/history.js +266 -0
- package/dist/funding/index.d.ts +3 -0
- package/dist/funding/index.js +3 -0
- package/dist/funding/normalize.d.ts +39 -0
- package/dist/funding/normalize.js +66 -0
- package/dist/funding/rates.d.ts +45 -0
- package/dist/funding/rates.js +172 -0
- package/dist/funding-history.d.ts +5 -0
- package/dist/funding-history.js +5 -0
- package/dist/funding-rates.d.ts +5 -0
- package/dist/funding-rates.js +5 -0
- package/dist/funding.d.ts +5 -0
- package/dist/funding.js +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +458 -0
- package/dist/jobs.d.ts +37 -0
- package/dist/jobs.js +152 -0
- package/dist/liquidity.d.ts +34 -0
- package/dist/liquidity.js +100 -0
- package/dist/mcp-server.d.ts +9 -0
- package/dist/mcp-server.js +1206 -0
- package/dist/pacifica/client.d.ts +111 -0
- package/dist/pacifica/client.js +310 -0
- package/dist/pacifica/constants.d.ts +27 -0
- package/dist/pacifica/constants.js +47 -0
- package/dist/pacifica/deposit.d.ts +14 -0
- package/dist/pacifica/deposit.js +78 -0
- package/dist/pacifica/index.d.ts +6 -0
- package/dist/pacifica/index.js +11 -0
- package/dist/pacifica/signing.d.ts +49 -0
- package/dist/pacifica/signing.js +97 -0
- package/dist/pacifica/types/account.d.ts +42 -0
- package/dist/pacifica/types/account.js +1 -0
- package/dist/pacifica/types/index.d.ts +6 -0
- package/dist/pacifica/types/index.js +6 -0
- package/dist/pacifica/types/lake.d.ts +18 -0
- package/dist/pacifica/types/lake.js +1 -0
- package/dist/pacifica/types/market.d.ts +64 -0
- package/dist/pacifica/types/market.js +1 -0
- package/dist/pacifica/types/order.d.ts +92 -0
- package/dist/pacifica/types/order.js +1 -0
- package/dist/pacifica/types/position.d.ts +25 -0
- package/dist/pacifica/types/position.js +1 -0
- package/dist/pacifica/types/ws.d.ts +34 -0
- package/dist/pacifica/types/ws.js +41 -0
- package/dist/pacifica/ws-client.d.ts +42 -0
- package/dist/pacifica/ws-client.js +180 -0
- package/dist/plan-executor.d.ts +48 -0
- package/dist/plan-executor.js +280 -0
- package/dist/position-history.d.ts +68 -0
- package/dist/position-history.js +222 -0
- package/dist/rebalance.d.ts +64 -0
- package/dist/rebalance.js +142 -0
- package/dist/retry.d.ts +74 -0
- package/dist/retry.js +129 -0
- package/dist/risk.d.ts +48 -0
- package/dist/risk.js +156 -0
- package/dist/settings.d.ts +19 -0
- package/dist/settings.js +45 -0
- package/dist/shared-api.d.ts +5 -0
- package/dist/shared-api.js +5 -0
- package/dist/strategies/dca.d.ts +25 -0
- package/dist/strategies/dca.js +114 -0
- package/dist/strategies/funding-arb.d.ts +15 -0
- package/dist/strategies/funding-arb.js +281 -0
- package/dist/strategies/grid.d.ts +34 -0
- package/dist/strategies/grid.js +185 -0
- package/dist/strategies/trailing-stop.d.ts +17 -0
- package/dist/strategies/trailing-stop.js +121 -0
- package/dist/strategies/twap.d.ts +20 -0
- package/dist/strategies/twap.js +78 -0
- package/dist/trade-validator.d.ts +39 -0
- package/dist/trade-validator.js +154 -0
- package/dist/utils.d.ts +38 -0
- package/dist/utils.js +110 -0
- package/package.json +63 -0
- package/skills/perp-cli/SKILL.md +149 -0
- 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 {};
|