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,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builder fees — one uniform, default-OFF mechanism for every venue.
|
|
3
|
+
*
|
|
4
|
+
* A builder fee is an extra per-order fee the venue pays to a third-party "builder"
|
|
5
|
+
* (Hyperliquid builder codes, Pacifica builder program, Aster builder, Ondo builder
|
|
6
|
+
* codes). It is charged to the USER, so perp-cli never attaches one unless:
|
|
7
|
+
* 1. `settings.builder.<venue>` is set explicitly by the user (absent = off — there
|
|
8
|
+
* is no shipped default and no env var), and
|
|
9
|
+
* 2. the venue approval the fee needs is CONFIRMED (venue status read, cached per
|
|
10
|
+
* process for BUILDER_APPROVAL_TTL_MS; a builder-related order rejection drops the
|
|
11
|
+
* cached read). Approval-free venues (Ondo) are confirmed by (1) alone.
|
|
12
|
+
* A builder-related order rejection is returned to the caller with remediation
|
|
13
|
+
* (--no-builder / re-approve) and is NEVER retried — re-sending is a new order.
|
|
14
|
+
* An order whose approval is missing / unknown is sent WITHOUT the fee and says so in
|
|
15
|
+
* `execution.notes` (and once on stderr) — the fee is the builder's, never a reason to
|
|
16
|
+
* fail or silently change the user's order. `--no-builder` disables it per command.
|
|
17
|
+
*
|
|
18
|
+
* Per-venue facts (official docs, checked 2026-10-02):
|
|
19
|
+
* - hyperliquid https://hyperliquid.gitbook.io/hyperliquid-docs/trading/builder-codes
|
|
20
|
+
* ApproveBuilderFee signed by the MAIN wallet (an agent cannot sign it); order action
|
|
21
|
+
* `builder: { b: <address>, f: <tenths of a bp> }`; max 0.1% perps / 1% spot; status
|
|
22
|
+
* info `{ type: "maxBuilderFee", user, builder }`. HIP-3 dexes are not covered by the
|
|
23
|
+
* docs → never attached there.
|
|
24
|
+
* - pacifica https://pacifica.gitbook.io/docs/programs/builder-program.md
|
|
25
|
+
* approve_builder_code { builder_code, max_fee_rate } signed by the account; per-order
|
|
26
|
+
* `builder_code` on create_market / create / stop/create / positions/tpsl. TWAP
|
|
27
|
+
* (create_twap_order) does not document builder_code → never sent there.
|
|
28
|
+
* The builder sets its own fee_rate; the user's approved max_fee_rate caps it, so the
|
|
29
|
+
* code is attached only while the approved max_fee_rate ≤ the configured feeBps (the
|
|
30
|
+
* user's consent). The venue documents no ceiling → perp-cli caps the consent at 10
|
|
31
|
+
* bps. Spot rejects it (err 108).
|
|
32
|
+
* - aster https://asterdex.github.io/aster-api-website/asterCode/integration-flow/
|
|
33
|
+
* + asterdex/api-docs demo/aster-code.py: approveBuilder { builder, maxFeeRate ≤ 0.001 }
|
|
34
|
+
* master-signed; orders carry `builder` + `feeRate` (decimal) signed by the API wallet;
|
|
35
|
+
* list GET /fapi/v3/builder, revoke DELETE /fapi/v3/builder (DelBuilder). The testnet
|
|
36
|
+
* API documents no approveBuilder → testnet off.
|
|
37
|
+
* - ondo https://docs.ondoperps.xyz/api-reference/integration_guide (+ rest-spec)
|
|
38
|
+
* no user approval; per-order `builderCode: { code, feeRateBpsFractional }` on
|
|
39
|
+
* POST /v1/perps/orders and POST /v1/perps/stop_order (stops do NOT inherit it); cap
|
|
40
|
+
* 10 bps; sandbox uses the same API.
|
|
41
|
+
* - qfex https://docs.qfex.com/qfex/builder-code
|
|
42
|
+
* fee SHARE, not an extra fee: the trader pays the normal venue fee and the venue credits
|
|
43
|
+
* part of it to the builder (feeKind "share", feeBps null). No user approval. The code
|
|
44
|
+
* (UUID) rides on the Trade WebSocket auth (`params.builder_code`) for the life of the
|
|
45
|
+
* connection — never per order; an unknown code is not an error, so attribution is not
|
|
46
|
+
* confirmable from the trader side. Prod codes mean nothing on UAT → testnet off.
|
|
47
|
+
* - lighter / lighter-rh: unsupported — see UNSUPPORTED below.
|
|
48
|
+
* - arcus: unsupported — see UNSUPPORTED below.
|
|
49
|
+
*/
|
|
50
|
+
import { PerpError } from "../errors.js";
|
|
51
|
+
import type { Network, VenueId } from "./venue-types.js";
|
|
52
|
+
export type BuilderFeeKind = "exact" | "max" | "share";
|
|
53
|
+
export interface BuilderFeeCapability {
|
|
54
|
+
/** "master" = the owner wallet signs a one-time approval; "none" = no approval exists. */
|
|
55
|
+
approval: "master" | "none";
|
|
56
|
+
/** What identifies the builder in settings.builder.<venue>. */
|
|
57
|
+
identity: "address" | "code";
|
|
58
|
+
/** Largest fee (bps) a perp order may carry; null = feeKind "share" (no user-paid fee exists). */
|
|
59
|
+
perpCapBps: number | null;
|
|
60
|
+
/** Largest fee (bps) the venue allows on spot; null = spot does not take a builder fee. Spot orders never carry one in perp-cli. */
|
|
61
|
+
spotCapBps: number | null;
|
|
62
|
+
/** false = HIP-3 dexes never carry the fee (Hyperliquid); null = not applicable. */
|
|
63
|
+
hip3: false | null;
|
|
64
|
+
/** false = the venue's testnet has no builder flow → never attached on testnet. */
|
|
65
|
+
testnet: boolean;
|
|
66
|
+
/** Smallest fee increment (bps) the venue can express; null = feeKind "share". */
|
|
67
|
+
feeStepBps: number | null;
|
|
68
|
+
/**
|
|
69
|
+
* "exact" = the order carries this fee; "max" = the user approves a ceiling, the builder sets
|
|
70
|
+
* the actual rate (Pacifica); "share" = the venue shares its own fee with the builder — the
|
|
71
|
+
* user pays the normal fee and nothing extra (QFEX), so there is no feeBps.
|
|
72
|
+
*/
|
|
73
|
+
feeKind: BuilderFeeKind;
|
|
74
|
+
/** Official doc the facts were taken from. */
|
|
75
|
+
docs: string;
|
|
76
|
+
}
|
|
77
|
+
export declare const BUILDER_FEE_CAPABILITIES: {
|
|
78
|
+
readonly [K in VenueId]: BuilderFeeCapability | null;
|
|
79
|
+
};
|
|
80
|
+
/** Why a venue has no builder-fee support (shown in CAPABILITY_UNSUPPORTED). */
|
|
81
|
+
export declare const BUILDER_FEE_UNSUPPORTED: {
|
|
82
|
+
readonly [K in VenueId]?: string;
|
|
83
|
+
};
|
|
84
|
+
export declare function builderFeeUnsupported(venue: VenueId): PerpError;
|
|
85
|
+
export declare function builderFeeVenues(): VenueId[];
|
|
86
|
+
/** Capability of a venue, or CAPABILITY_UNSUPPORTED. */
|
|
87
|
+
export declare function requireBuilderCapability(venue: VenueId): BuilderFeeCapability;
|
|
88
|
+
export interface BuilderAddressEntry {
|
|
89
|
+
address: string;
|
|
90
|
+
feeBps: number;
|
|
91
|
+
}
|
|
92
|
+
export interface BuilderCodeEntry {
|
|
93
|
+
code: string;
|
|
94
|
+
feeBps: number;
|
|
95
|
+
}
|
|
96
|
+
/** feeKind "share" (QFEX): attribution only — there is no user-paid fee, so no feeBps key. */
|
|
97
|
+
export interface BuilderShareEntry {
|
|
98
|
+
code: string;
|
|
99
|
+
}
|
|
100
|
+
/** settings.builder — absent venue = builder fee off. Ships empty. */
|
|
101
|
+
export interface BuilderSettings {
|
|
102
|
+
hyperliquid?: BuilderAddressEntry;
|
|
103
|
+
pacifica?: BuilderCodeEntry;
|
|
104
|
+
aster?: BuilderAddressEntry;
|
|
105
|
+
ondo?: BuilderCodeEntry;
|
|
106
|
+
qfex?: BuilderShareEntry;
|
|
107
|
+
}
|
|
108
|
+
/** A configured builder, normalized: identity = address (lowercase) or code. */
|
|
109
|
+
export interface BuilderTarget {
|
|
110
|
+
venue: VenueId;
|
|
111
|
+
identity: string;
|
|
112
|
+
/** Extra fee charged to the user (bps); null = feeKind "share" (the user pays the normal venue fee only). */
|
|
113
|
+
feeBps: number | null;
|
|
114
|
+
}
|
|
115
|
+
/** The configured user-paid fee of an "exact" / "max" venue. A "share" target has none. */
|
|
116
|
+
export declare function requireFeeBps(t: {
|
|
117
|
+
venue: VenueId;
|
|
118
|
+
feeBps: number | null;
|
|
119
|
+
}): number;
|
|
120
|
+
/**
|
|
121
|
+
* Validate one settings.builder.<venue> entry. Throws `invalid(problem)` — never clamps
|
|
122
|
+
* or rewrites a value. Returns the normalized target.
|
|
123
|
+
*/
|
|
124
|
+
export declare function parseBuilderEntry(venue: string, raw: unknown, invalid: (problem: string) => Error): BuilderTarget;
|
|
125
|
+
/** Validate the whole settings.builder object (absent / null = nothing configured). */
|
|
126
|
+
export declare function parseBuilderSettings(raw: unknown, invalid: (problem: string) => Error): BuilderSettings;
|
|
127
|
+
/** "2.5 bps", or "fee share (no extra fee)" for a share target. */
|
|
128
|
+
export declare function feeText(t: {
|
|
129
|
+
feeBps: number | null;
|
|
130
|
+
}): string;
|
|
131
|
+
/** The configured target for a venue, or null (off). */
|
|
132
|
+
export declare function builderTargetOf(builder: BuilderSettings, venue: VenueId): BuilderTarget | null;
|
|
133
|
+
export type BuilderApproval =
|
|
134
|
+
/** The venue reports an approval covering the configured fee. maxFeeBps = approved ceiling (null = venue has no approval step). */
|
|
135
|
+
{
|
|
136
|
+
status: "approved";
|
|
137
|
+
maxFeeBps: number | null;
|
|
138
|
+
}
|
|
139
|
+
/** The venue reports no approval, or one below the configured fee (maxFeeBps = approved ceiling, null = none). */
|
|
140
|
+
| {
|
|
141
|
+
status: "notApproved";
|
|
142
|
+
maxFeeBps: number | null;
|
|
143
|
+
}
|
|
144
|
+
/** feeKind "max": the approved ceiling is ABOVE the configured fee — the builder could charge more than the user configured. */
|
|
145
|
+
| {
|
|
146
|
+
status: "aboveConsent";
|
|
147
|
+
maxFeeBps: number;
|
|
148
|
+
}
|
|
149
|
+
/** The approval could not be determined (request failed / response unreadable). */
|
|
150
|
+
| {
|
|
151
|
+
status: "unknown";
|
|
152
|
+
reason: string;
|
|
153
|
+
};
|
|
154
|
+
/** The fee an order actually carried (OrderExecution.builderFee). */
|
|
155
|
+
export interface AppliedBuilderFee {
|
|
156
|
+
venue: VenueId;
|
|
157
|
+
/** Builder address (lowercase) or code. */
|
|
158
|
+
identity: string;
|
|
159
|
+
/** Extra fee charged to the user (bps); null = feeKind "share". */
|
|
160
|
+
feeBps: number | null;
|
|
161
|
+
/** "max" = approved ceiling; the builder's own rate applies (Pacifica). "share" = venue fee share, nothing extra. */
|
|
162
|
+
feeKind: BuilderFeeKind;
|
|
163
|
+
/** The ceiling the venue reports as approved (bps); null = the venue has no approval step. */
|
|
164
|
+
approvedMaxBps: number | null;
|
|
165
|
+
}
|
|
166
|
+
export interface BuilderDecision {
|
|
167
|
+
applied: AppliedBuilderFee | null;
|
|
168
|
+
/** Why a CONFIGURED fee was not attached (null when attached or not configured). */
|
|
169
|
+
note: string | null;
|
|
170
|
+
}
|
|
171
|
+
export declare const NO_BUILDER: BuilderDecision;
|
|
172
|
+
/** How long a venue approval read is reused before it is read again. */
|
|
173
|
+
export declare const BUILDER_APPROVAL_TTL_MS: number;
|
|
174
|
+
/** Forget cached approval reads and stderr warnings (after approve / revoke; test hook). */
|
|
175
|
+
export declare function resetBuilderApprovalCache(): void;
|
|
176
|
+
/** Drop the cached approval reads of one venue + network (the next order re-reads the venue). */
|
|
177
|
+
export declare function invalidateBuilderApproval(venue: VenueId, network: Network): void;
|
|
178
|
+
/**
|
|
179
|
+
* Per-adapter builder-fee gate. Built only when settings.builder.<venue> is set
|
|
180
|
+
* (resolveBuilderGate) — an unconfigured venue has no gate and no notes at all.
|
|
181
|
+
*/
|
|
182
|
+
export declare class BuilderFeeGate {
|
|
183
|
+
readonly target: BuilderTarget;
|
|
184
|
+
readonly network: Network;
|
|
185
|
+
/** Static reason the configured fee is never attached by this adapter (--no-builder, testnet). */
|
|
186
|
+
private readonly skipReason;
|
|
187
|
+
/** Reads the venue approval for the active account; null when the venue has no approval step. */
|
|
188
|
+
private readonly readApproval;
|
|
189
|
+
/** Account the approval belongs to (master address) — part of the cache key. */
|
|
190
|
+
private readonly accountOf;
|
|
191
|
+
constructor(target: BuilderTarget, network: Network,
|
|
192
|
+
/** Static reason the configured fee is never attached by this adapter (--no-builder, testnet). */
|
|
193
|
+
skipReason: string | null,
|
|
194
|
+
/** Reads the venue approval for the active account; null when the venue has no approval step. */
|
|
195
|
+
readApproval: ((target: BuilderTarget) => Promise<BuilderApproval>) | null,
|
|
196
|
+
/** Account the approval belongs to (master address) — part of the cache key. */
|
|
197
|
+
accountOf: () => string);
|
|
198
|
+
get capability(): BuilderFeeCapability;
|
|
199
|
+
/** Venue approval for the configured builder (cached for BUILDER_APPROVAL_TTL_MS). Failures → "unknown". */
|
|
200
|
+
approval(): Promise<BuilderApproval>;
|
|
201
|
+
/**
|
|
202
|
+
* Whether the next perp order carries the fee. `hip3` = the order is on a Hyperliquid
|
|
203
|
+
* HIP-3 dex. Never throws: a fee that cannot be attached becomes a note.
|
|
204
|
+
*/
|
|
205
|
+
decide(opts: {
|
|
206
|
+
hip3: boolean;
|
|
207
|
+
}): Promise<BuilderDecision>;
|
|
208
|
+
private warnOnce;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The gate for an adapter being created, or null when settings.builder.<venue> is not
|
|
212
|
+
* set (default) or the context is read-only. The single place builder settings are
|
|
213
|
+
* resolved (adapters never read settings).
|
|
214
|
+
*/
|
|
215
|
+
export declare function resolveBuilderGate(venue: VenueId, ctx: {
|
|
216
|
+
network: Network;
|
|
217
|
+
noBuilder: boolean;
|
|
218
|
+
readOnly: boolean;
|
|
219
|
+
}, builder: BuilderSettings, readApproval: ((target: BuilderTarget) => Promise<BuilderApproval>) | null, accountOf: () => string): BuilderFeeGate | null;
|
|
220
|
+
/** Gate held by an adapter (public `builderFee` field), or null. */
|
|
221
|
+
export declare function builderGateOf(adapter: unknown): BuilderFeeGate | null;
|
|
222
|
+
/** Decision for an adapter's next perp order (no gate = not configured = NO_BUILDER). */
|
|
223
|
+
export declare function builderDecisionOf(adapter: unknown, opts: {
|
|
224
|
+
hip3: boolean;
|
|
225
|
+
}): Promise<BuilderDecision>;
|
|
226
|
+
/** Fee rate as a decimal fraction string: 2.5 bps → "0.00025". */
|
|
227
|
+
export declare function bpsToRate(bps: number): string;
|
|
228
|
+
/** Decimal fraction (string | number) → bps, or null when unreadable. */
|
|
229
|
+
export declare function rateToBps(rate: unknown): number | null;
|
|
230
|
+
/** Hyperliquid `f` (tenths of a basis point). */
|
|
231
|
+
export declare function hlFeeTenthsBps(bps: number): number;
|
|
232
|
+
/** Hyperliquid ApproveBuilderFee maxFeeRate: a percent string ("0.01%" = 1 bp). */
|
|
233
|
+
export declare function hlMaxFeeRatePercent(bps: number): string;
|
|
234
|
+
/** feeKind "exact": approval verdict from the venue's approved ceiling (bps; null = no approval on record). */
|
|
235
|
+
export declare function approvalFromMax(maxFeeBps: number | null, feeBps: number): BuilderApproval;
|
|
236
|
+
/**
|
|
237
|
+
* feeKind "max" (Pacifica): the builder picks its own rate up to the approved ceiling, so the
|
|
238
|
+
* configured feeBps is the user's consent and the approved ceiling must not exceed it.
|
|
239
|
+
* null = no approval on record.
|
|
240
|
+
*/
|
|
241
|
+
export declare function approvalFromCeiling(maxFeeBps: number | null, feeBps: number): BuilderApproval;
|
|
242
|
+
/**
|
|
243
|
+
* An order the venue rejected for a builder-related reason (the error text names the builder):
|
|
244
|
+
* the cached approval of that venue is dropped (the next order re-reads it) and the rejection is
|
|
245
|
+
* returned with remediation. The order is NOT retried — re-sending is a new order, so that stays
|
|
246
|
+
* the user's explicit choice. Any other error (or no gate) is returned unchanged.
|
|
247
|
+
*/
|
|
248
|
+
export declare function builderRejectionOf(adapter: unknown, err: unknown): unknown;
|
|
249
|
+
/**
|
|
250
|
+
* Builder decision for a planned perp order on `symbol` (dry-run / preview): the same
|
|
251
|
+
* cached gate decision a live order would use. Hyperliquid resolves the asset id so a
|
|
252
|
+
* HIP-3 market reports "not attached".
|
|
253
|
+
*/
|
|
254
|
+
export declare function builderPlanFor(adapter: unknown, symbol: string | null): Promise<BuilderDecision>;
|