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