perp-cli 0.12.17 → 0.14.1
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 +247 -27
- 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 +303 -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 +70 -92
- 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 +248 -0
- package/dist/commands/funds.d.ts +25 -0
- package/dist/commands/funds.js +925 -245
- package/dist/commands/history.js +102 -54
- 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 +357 -459
- 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 +240 -6
- package/dist/exchanges/aster.js +1139 -195
- 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 +152 -0
- package/dist/exchanges/ondo/adapter.js +811 -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 +95 -0
- package/dist/exchanges/ondo/funds.js +198 -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 +293 -4
- package/dist/exchanges/pacifica.js +1044 -90
- 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 +1386 -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 +29 -0
- package/dist/exchanges/venues/ondo.js +136 -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 +39 -0
- package/dist/exchanges/venues/qfex.js +140 -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 +156 -684
- package/dist/jobs.d.ts +84 -6
- package/dist/jobs.js +239 -41
- package/dist/landing.d.ts +7 -2
- package/dist/landing.js +19 -3
- package/dist/mcp-server.d.ts +14 -4
- package/dist/mcp-server.js +821 -403
- package/dist/mcp-trade-guard.d.ts +16 -0
- package/dist/mcp-trade-guard.js +59 -0
- package/dist/onchain-balances.d.ts +40 -0
- package/dist/onchain-balances.js +173 -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 +159 -55
- package/skills/perp-cli/references/agent-operations.md +112 -58
- package/skills/perp-cli/references/commands.md +269 -73
- package/skills/perp-cli/references/strategies.md +34 -31
- package/skills/perp-cli/scripts/arb-monitor.sh +10 -5
- package/skills/perp-cli/scripts/funding-analysis.sh +14 -9
- 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 +31 -15
- 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
|
@@ -10,3 +10,9 @@ export { LighterAdapter } from "./lighter.js";
|
|
|
10
10
|
export { AsterAdapter } from "./aster.js";
|
|
11
11
|
export { HyperliquidSpotAdapter } from "./hyperliquid-spot.js";
|
|
12
12
|
export { LighterSpotAdapter } from "./lighter-spot.js";
|
|
13
|
+
export { getVenue, listVenues, listVenuesWithRole, resolveVenueId, tryResolveVenueId, parseVenueRef, networkConfig, requireCapabilities, fundingBasisOf, settlementIntervalOf, isLegacyVenue, isVenueId, READ_ONLY_CREDENTIALS, } from "./venue.js";
|
|
14
|
+
export type { VenueDefinition, VenueCapabilities, VenueCreateContext, VenueCredentials, VenueNetworkConfig, VenuePublicData, VenueRole, VenueRef, RateLimitPolicy, MasterKeyKind, AgentKeyKind, } from "./venue.js";
|
|
15
|
+
export type { VenueId, LegacyVenueId, Network, FundingRateBasis, VenueMarket, VenueFundingRate, TimeInForce, OrderRequest, OrderResult } from "./venue-types.js";
|
|
16
|
+
export { ensureVenuesRegistered, ALL_VENUES } from "./venues/index.js";
|
|
17
|
+
export { isTradingV2, validateOrderRequest, validateLegacyTif } from "./trading-v2.js";
|
|
18
|
+
export type { TradingV2 } from "./trading-v2.js";
|
package/dist/exchanges/index.js
CHANGED
|
@@ -9,3 +9,7 @@ export { LighterAdapter } from "./lighter.js";
|
|
|
9
9
|
export { AsterAdapter } from "./aster.js";
|
|
10
10
|
export { HyperliquidSpotAdapter } from "./hyperliquid-spot.js";
|
|
11
11
|
export { LighterSpotAdapter } from "./lighter-spot.js";
|
|
12
|
+
// Venue abstraction (docs/DESIGN-venue-abstraction.md §10)
|
|
13
|
+
export { getVenue, listVenues, listVenuesWithRole, resolveVenueId, tryResolveVenueId, parseVenueRef, networkConfig, requireCapabilities, fundingBasisOf, settlementIntervalOf, isLegacyVenue, isVenueId, READ_ONLY_CREDENTIALS, } from "./venue.js";
|
|
14
|
+
export { ensureVenuesRegistered, ALL_VENUES } from "./venues/index.js";
|
|
15
|
+
export { isTradingV2, validateOrderRequest, validateLegacyTif } from "./trading-v2.js";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ResolvedSlippage } from "./slippage.js";
|
|
1
2
|
/**
|
|
2
3
|
* Common exchange interface for multi-DEX CLI support.
|
|
3
4
|
* All exchange adapters (Pacifica, Hyperliquid, Lighter) implement this.
|
|
@@ -5,24 +6,51 @@
|
|
|
5
6
|
export interface ExchangeMarketInfo {
|
|
6
7
|
symbol: string;
|
|
7
8
|
markPrice: string;
|
|
8
|
-
|
|
9
|
+
/** null = venue does not publish an index/oracle price for this market */
|
|
10
|
+
indexPrice: string | null;
|
|
9
11
|
fundingRate: string | null;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
/** null = venue does not publish 24h volume */
|
|
13
|
+
volume24h: string | null;
|
|
14
|
+
/** null = venue does not publish open interest (never "0" as a stand-in) */
|
|
15
|
+
openInterest: string | null;
|
|
12
16
|
maxLeverage: number;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
/** quantity precision (e.g. 0 = integers only, 2 = 0.01); null = unknown */
|
|
18
|
+
sizeDecimals: number | null;
|
|
19
|
+
/** lot step size (e.g. "1", "0.1", "0.001"); null = unknown */
|
|
20
|
+
stepSize: string | null;
|
|
21
|
+
/** hours one quoted fundingRate covers; null = use the venue definition's fundingRateBasis */
|
|
22
|
+
fundingHours: number | null;
|
|
23
|
+
/**
|
|
24
|
+
* Notional-tiered leverage caps, ascending by `lowerBound` (USD notional).
|
|
25
|
+
* `maxLeverage` above is the TOP tier — the cap falls as size grows, so a
|
|
26
|
+
* pre-trade check that uses it alone passes orders the venue will reject.
|
|
27
|
+
* Resolve with `maxLeverageForNotional()`. null when the venue does not
|
|
28
|
+
* publish tiers (then `maxLeverage` applies at every size).
|
|
29
|
+
*/
|
|
30
|
+
marginTiers: Array<{
|
|
31
|
+
lowerBound: number;
|
|
32
|
+
maxLeverage: number;
|
|
33
|
+
}> | null;
|
|
16
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Effective max leverage for an order of `notional` USD.
|
|
37
|
+
*
|
|
38
|
+
* A venue that publishes no tiers (`marginTiers === null`) has one flat cap,
|
|
39
|
+
* `maxLeverage`, at every size — that is the venue's definition, not a fallback.
|
|
40
|
+
*/
|
|
41
|
+
export declare function maxLeverageForNotional(market: ExchangeMarketInfo, notional: number): number;
|
|
17
42
|
export interface ExchangePosition {
|
|
18
43
|
symbol: string;
|
|
19
44
|
side: "long" | "short";
|
|
20
45
|
size: string;
|
|
21
46
|
entryPrice: string;
|
|
22
47
|
markPrice: string;
|
|
23
|
-
|
|
48
|
+
/** null = venue does not report a liquidation price */
|
|
49
|
+
liquidationPrice: string | null;
|
|
24
50
|
unrealizedPnl: string;
|
|
25
51
|
leverage: number;
|
|
52
|
+
/** Margin mode of the position, set only by adapters whose venue reports it per position. */
|
|
53
|
+
marginMode?: "cross" | "isolated";
|
|
26
54
|
}
|
|
27
55
|
export interface ExchangeOrder {
|
|
28
56
|
orderId: string;
|
|
@@ -33,6 +61,8 @@ export interface ExchangeOrder {
|
|
|
33
61
|
filled: string;
|
|
34
62
|
status: string;
|
|
35
63
|
type: string;
|
|
64
|
+
/** Trigger (stop) price of a stop / TP / SL order; null for plain orders or when the venue does not report it. */
|
|
65
|
+
triggerPrice: string | null;
|
|
36
66
|
}
|
|
37
67
|
export interface ExchangeBalance {
|
|
38
68
|
equity: string;
|
|
@@ -60,7 +90,8 @@ export interface ExchangeKline {
|
|
|
60
90
|
low: string;
|
|
61
91
|
close: string;
|
|
62
92
|
volume: string;
|
|
63
|
-
|
|
93
|
+
/** null = venue does not publish a trade count for the candle */
|
|
94
|
+
trades: number | null;
|
|
64
95
|
}
|
|
65
96
|
export interface ExchangeAdapter {
|
|
66
97
|
readonly name: string;
|
|
@@ -87,8 +118,13 @@ export interface ExchangeAdapter {
|
|
|
87
118
|
getOrderHistory(limit?: number): Promise<ExchangeOrder[]>;
|
|
88
119
|
getTradeHistory(limit?: number): Promise<ExchangeTrade[]>;
|
|
89
120
|
getFundingPayments(limit?: number): Promise<ExchangeFundingPayment[]>;
|
|
90
|
-
|
|
91
|
-
|
|
121
|
+
/**
|
|
122
|
+
* Market order = IOC within the resolved slippage bound (design §13.2). `opts` is
|
|
123
|
+
* required so every caller states reduceOnly and passes resolveSlippage() output.
|
|
124
|
+
*/
|
|
125
|
+
marketOrder(symbol: string, side: "buy" | "sell", size: string, opts: {
|
|
126
|
+
reduceOnly: boolean;
|
|
127
|
+
slippage: ResolvedSlippage;
|
|
92
128
|
}): Promise<unknown>;
|
|
93
129
|
limitOrder(symbol: string, side: "buy" | "sell", price: string, size: string, opts?: {
|
|
94
130
|
reduceOnly?: boolean;
|
|
@@ -98,8 +134,25 @@ export interface ExchangeAdapter {
|
|
|
98
134
|
cancelOrder(symbol: string, orderId: string): Promise<unknown>;
|
|
99
135
|
cancelAllOrders(symbol?: string): Promise<unknown>;
|
|
100
136
|
setLeverage(symbol: string, leverage: number, marginMode?: "cross" | "isolated"): Promise<unknown>;
|
|
137
|
+
/**
|
|
138
|
+
* triggerType selects the trigger price source where the venue supports it
|
|
139
|
+
* (currently Pacifica: "mark" | "last" | "mid"). Adapters that don't support
|
|
140
|
+
* a configurable trigger source ignore the field and use their venue default.
|
|
141
|
+
* `slippage` (resolveSlippage() output) bounds the execution price of a market
|
|
142
|
+
* trigger on venues that send it as a protection-priced limit once triggered
|
|
143
|
+
* (Lighter, Arcus: required there for a market trigger — adapters never read
|
|
144
|
+
* settings, design §13.10 #1); venue-native market triggers ignore it.
|
|
145
|
+
* `kind` ("tp" | "sl") states the protective intent explicitly: venues with distinct
|
|
146
|
+
* take-profit / stop-loss trigger types (Aster, Lighter) send that type as given — no
|
|
147
|
+
* price-based classification — and a trigger already crossed is left for the venue to
|
|
148
|
+
* reject. Omitted (plain `trade stop`): the adapter classifies from the trigger vs its
|
|
149
|
+
* reference price. Venues with a single trigger type ignore it.
|
|
150
|
+
*/
|
|
101
151
|
stopOrder(symbol: string, side: "buy" | "sell", size: string, triggerPrice: string, opts?: {
|
|
102
152
|
limitPrice?: string;
|
|
103
153
|
reduceOnly?: boolean;
|
|
154
|
+
triggerType?: "mark" | "last" | "mid";
|
|
155
|
+
slippage?: ResolvedSlippage;
|
|
156
|
+
kind?: "tp" | "sl";
|
|
104
157
|
}): Promise<unknown>;
|
|
105
158
|
}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Effective max leverage for an order of `notional` USD.
|
|
3
|
+
*
|
|
4
|
+
* A venue that publishes no tiers (`marginTiers === null`) has one flat cap,
|
|
5
|
+
* `maxLeverage`, at every size — that is the venue's definition, not a fallback.
|
|
4
6
|
*/
|
|
5
|
-
export {
|
|
7
|
+
export function maxLeverageForNotional(market, notional) {
|
|
8
|
+
if (!Number.isFinite(notional)) {
|
|
9
|
+
throw new Error(`maxLeverageForNotional: notional must be finite (got ${notional})`);
|
|
10
|
+
}
|
|
11
|
+
const tiers = market.marginTiers;
|
|
12
|
+
if (tiers === null || tiers.length === 0)
|
|
13
|
+
return market.maxLeverage;
|
|
14
|
+
let effective = market.maxLeverage;
|
|
15
|
+
for (const t of tiers) {
|
|
16
|
+
if (notional >= t.lowerBound)
|
|
17
|
+
effective = t.maxLeverage;
|
|
18
|
+
}
|
|
19
|
+
return effective;
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Venue-final IOC / market order outcome (design `docs/DESIGN-venue-abstraction.md` §13.10 #4).
|
|
3
|
+
*
|
|
4
|
+
* An adapter whose market / IOC responses report the order's FINAL filled size (nothing
|
|
5
|
+
* of the order can still execute) implements `iocOutcomeOf(raw)` on the RAW result its
|
|
6
|
+
* legacy `marketOrder` / `limitOrder(tif IOC)` / `spotMarketOrder` returned:
|
|
7
|
+
* - returns `{ filledSize, final: true }` only when `raw` is such a response AND the venue
|
|
8
|
+
* reported the final filled size of THAT order (e.g. HL `statuses[0].filled.totalSz`,
|
|
9
|
+
* Lighter tx `event_info` status "filled" or accountOrders `filled_base_amount`, Aster `executedQty` with a terminal status);
|
|
10
|
+
* `filledSize` is a plain decimal string in base units, "0" = definitely nothing filled;
|
|
11
|
+
* - returns `null` for anything else (unrecognized shape, resting / open order, no fill
|
|
12
|
+
* report, not final) — the caller then measures the fill (position / balance delta).
|
|
13
|
+
* It never throws and never guesses: a missing report is `null`, never "0".
|
|
14
|
+
*
|
|
15
|
+
* Consumers (`placePerpVerified`, `closePerpVerified`, `spotMarketFill`) still cross-check
|
|
16
|
+
* the reported fill against a measured delta. Adapters without the method are measured as
|
|
17
|
+
* before (`isIocOutcomeCapable` handles absence).
|
|
18
|
+
*/
|
|
19
|
+
export interface IocOutcome {
|
|
20
|
+
/** Final filled size in base units (plain decimal string, "0" = nothing filled). */
|
|
21
|
+
filledSize: string;
|
|
22
|
+
final: true;
|
|
23
|
+
}
|
|
24
|
+
export interface IocOutcomeCapable {
|
|
25
|
+
iocOutcomeOf(raw: unknown): IocOutcome | null;
|
|
26
|
+
}
|
|
27
|
+
export declare function isIocOutcomeCapable(a: unknown): a is IocOutcomeCapable;
|
|
28
|
+
/**
|
|
29
|
+
* Tolerance for comparing a venue-final fill with the order size or a measured delta.
|
|
30
|
+
* Never derived from the decimals of the strings ("5" vs "4" would give a 1-lot tolerance
|
|
31
|
+
* and call a partial fill complete):
|
|
32
|
+
* - market `stepSize` known (> 0) → half a lot: lot multiples differ by at least one lot,
|
|
33
|
+
* so anything below half a lot is representation noise;
|
|
34
|
+
* - unknown → float-noise epsilon max(size, fill) × 1e-9.
|
|
35
|
+
*/
|
|
36
|
+
export declare function iocLotTolerance(size: string, filledSize: string, stepSize?: string | number | null): number;
|
|
37
|
+
/**
|
|
38
|
+
* The average FILL price the venue reported in a raw order result (plain positive decimal
|
|
39
|
+
* string), or null when it reports none. Read only from fill fields — Hyperliquid
|
|
40
|
+
* `response.data.statuses[0].filled.avgPx`; `avgPrice` of an Aster order object or of a
|
|
41
|
+
* TradingV2 OrderResult — and never from the order's own `price` (the limit / slippage
|
|
42
|
+
* protection price that was SENT, which is not where it filled).
|
|
43
|
+
*/
|
|
44
|
+
export declare function reportedAvgFillPrice(raw: unknown): string | null;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Venue-final IOC / market order outcome (design `docs/DESIGN-venue-abstraction.md` §13.10 #4).
|
|
3
|
+
*
|
|
4
|
+
* An adapter whose market / IOC responses report the order's FINAL filled size (nothing
|
|
5
|
+
* of the order can still execute) implements `iocOutcomeOf(raw)` on the RAW result its
|
|
6
|
+
* legacy `marketOrder` / `limitOrder(tif IOC)` / `spotMarketOrder` returned:
|
|
7
|
+
* - returns `{ filledSize, final: true }` only when `raw` is such a response AND the venue
|
|
8
|
+
* reported the final filled size of THAT order (e.g. HL `statuses[0].filled.totalSz`,
|
|
9
|
+
* Lighter tx `event_info` status "filled" or accountOrders `filled_base_amount`, Aster `executedQty` with a terminal status);
|
|
10
|
+
* `filledSize` is a plain decimal string in base units, "0" = definitely nothing filled;
|
|
11
|
+
* - returns `null` for anything else (unrecognized shape, resting / open order, no fill
|
|
12
|
+
* report, not final) — the caller then measures the fill (position / balance delta).
|
|
13
|
+
* It never throws and never guesses: a missing report is `null`, never "0".
|
|
14
|
+
*
|
|
15
|
+
* Consumers (`placePerpVerified`, `closePerpVerified`, `spotMarketFill`) still cross-check
|
|
16
|
+
* the reported fill against a measured delta. Adapters without the method are measured as
|
|
17
|
+
* before (`isIocOutcomeCapable` handles absence).
|
|
18
|
+
*/
|
|
19
|
+
export function isIocOutcomeCapable(a) {
|
|
20
|
+
return a !== null && typeof a === "object" && typeof a.iocOutcomeOf === "function";
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Tolerance for comparing a venue-final fill with the order size or a measured delta.
|
|
24
|
+
* Never derived from the decimals of the strings ("5" vs "4" would give a 1-lot tolerance
|
|
25
|
+
* and call a partial fill complete):
|
|
26
|
+
* - market `stepSize` known (> 0) → half a lot: lot multiples differ by at least one lot,
|
|
27
|
+
* so anything below half a lot is representation noise;
|
|
28
|
+
* - unknown → float-noise epsilon max(size, fill) × 1e-9.
|
|
29
|
+
*/
|
|
30
|
+
export function iocLotTolerance(size, filledSize, stepSize) {
|
|
31
|
+
const step = stepSize === undefined || stepSize === null ? NaN : Number(stepSize);
|
|
32
|
+
if (Number.isFinite(step) && step > 0)
|
|
33
|
+
return step / 2;
|
|
34
|
+
const mag = Math.max(Math.abs(Number(size)), Math.abs(Number(filledSize)));
|
|
35
|
+
return (Number.isFinite(mag) ? mag : 0) * 1e-9;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The average FILL price the venue reported in a raw order result (plain positive decimal
|
|
39
|
+
* string), or null when it reports none. Read only from fill fields — Hyperliquid
|
|
40
|
+
* `response.data.statuses[0].filled.avgPx`; `avgPrice` of an Aster order object or of a
|
|
41
|
+
* TradingV2 OrderResult — and never from the order's own `price` (the limit / slippage
|
|
42
|
+
* protection price that was SENT, which is not where it filled).
|
|
43
|
+
*/
|
|
44
|
+
export function reportedAvgFillPrice(raw) {
|
|
45
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
46
|
+
return null;
|
|
47
|
+
const r = raw;
|
|
48
|
+
const statuses = r.response?.data?.statuses;
|
|
49
|
+
const first = Array.isArray(statuses) ? statuses[0] : null;
|
|
50
|
+
const hl = first !== null && typeof first === "object" ? first.filled?.avgPx : undefined;
|
|
51
|
+
for (const v of [r.avgPrice, hl]) {
|
|
52
|
+
const s = typeof v === "number" && Number.isFinite(v) ? String(v) : v;
|
|
53
|
+
if (typeof s === "string" && /^\d+(\.\d+)?$/.test(s) && Number(s) > 0)
|
|
54
|
+
return s;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TradingV2 for the four pre-existing venues (pacifica, hyperliquid, lighter /
|
|
3
|
+
* lighter-rh, aster) — design §13.7, §13.10 #8.
|
|
4
|
+
*
|
|
5
|
+
* Composition, not modification: the legacy ExchangeAdapter methods keep returning
|
|
6
|
+
* their raw venue responses (in-process contract for smart-order, perp-order,
|
|
7
|
+
* plan-executor, grid). This wrapper calls the same adapter methods (same send
|
|
8
|
+
* path) and normalizes the raw response into an OrderResult + execution record.
|
|
9
|
+
* The raw response is kept verbatim in `venueRaw`.
|
|
10
|
+
*
|
|
11
|
+
* Status rules (SSOT Rule #2): a status / fill is reported only when the venue
|
|
12
|
+
* response proves it; otherwise "accepted" with finality "pending".
|
|
13
|
+
*/
|
|
14
|
+
import type { ExchangeAdapter } from "./interface.js";
|
|
15
|
+
import type { ResolvedSlippage } from "./slippage.js";
|
|
16
|
+
import { type TradingV2 } from "./trading-v2.js";
|
|
17
|
+
import { type Network, type OrderResult } from "./venue-types.js";
|
|
18
|
+
export declare function tradingV2Of(adapter: ExchangeAdapter, network: Network): TradingV2;
|
|
19
|
+
export declare function toTradingV2(adapter: ExchangeAdapter, network: Network): TradingV2;
|
|
20
|
+
/** One reduce-only protective trigger (TP or SL) of a separateOrders venue (design §13.5). */
|
|
21
|
+
export interface TpSlLeg {
|
|
22
|
+
symbol: string;
|
|
23
|
+
/** Side that closes the protected position (sell closes a long). */
|
|
24
|
+
closeSide: "buy" | "sell";
|
|
25
|
+
/** Positive size (the verified fill or the live position) — never "0". */
|
|
26
|
+
size: string;
|
|
27
|
+
trigger: string;
|
|
28
|
+
kind: "tp" | "sl";
|
|
29
|
+
/** Limit price once triggered; null = market trigger. */
|
|
30
|
+
limitPrice: string | null;
|
|
31
|
+
/** Resolved bound for protection-priced market triggers (Lighter); native triggers ignore it. */
|
|
32
|
+
slippage: ResolvedSlippage;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Place one reduce-only TP/SL trigger on a separateOrders venue (hyperliquid, lighter /
|
|
36
|
+
* lighter-rh, aster) and normalize the result. HL tags the trigger "tp"/"sl" natively;
|
|
37
|
+
* Lighter / Aster receive the leg kind explicitly and send take-profit / stop-loss as given.
|
|
38
|
+
*/
|
|
39
|
+
export declare function placeTpSlLeg(adapter: ExchangeAdapter, network: Network, leg: TpSlLeg): Promise<OrderResult>;
|