@nemesis-oss/binance-sdk 2.0.0 → 3.0.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/LICENSE +21 -0
- package/README.md +280 -9
- package/dist/{index-BO27qOb5.d.cts → index-C06A22Dz.d.cts} +5506 -3153
- package/dist/{index-BO27qOb5.d.ts → index-C06A22Dz.d.ts} +5506 -3153
- package/dist/index.cjs +10761 -3849
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1908 -302
- package/dist/index.d.ts +1908 -302
- package/dist/index.js +10675 -3850
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.cjs +8583 -3842
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +8583 -3842
- package/dist/mcp/index.js.map +1 -1
- package/dist/tools/index.cjs +578 -481
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.d.cts +2 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.js +577 -481
- package/dist/tools/index.js.map +1 -1
- package/package.json +6 -3
package/dist/mcp/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/index.ts","../../src/client/HttpClient.ts","../../src/errors/BinanceError.ts","../../src/errors/BinanceAuthError.ts","../../src/errors/BinanceApiError.ts","../../src/errors/RateLimitError.ts","../../src/errors/NetworkError.ts","../../src/errors/PolicyViolationError.ts","../../src/errors/DryRunError.ts","../../src/client/RateLimitTracker.ts","../../src/client/Signer.ts","../../src/client/TradingPolicy.ts","../../src/client/endpoints.ts","../../src/types/futures.types.ts","../../src/resources/FuturesData.ts","../../src/types/market.types.ts","../../src/resources/MarketDataBase.ts","../../src/resources/FuturesMarket.ts","../../src/resources/SpotMarket.ts","../../src/types/spot.types.ts","../../src/resources/SpotTrading.ts","../../src/types/userdata.types.ts","../../src/resources/SpotUserDataStream.ts","../../src/types/account.types.ts","../../src/resources/FuturesAccount.ts","../../src/types/trading.types.ts","../../src/resources/FuturesTrading.ts","../../src/types/filters.types.ts","../../src/resources/FuturesOps.ts","../../src/resources/UserDataStream.ts","../../src/types/coinm.types.ts","../../src/resources/CoinMMarket.ts","../../src/resources/CoinMAccount.ts","../../src/resources/CoinMTrading.ts","../../src/resources/CoinMUserDataStream.ts","../../src/types/margin.types.ts","../../src/resources/Margin.ts","../../src/types/wallet.types.ts","../../src/resources/Wallet.ts","../../src/types/subaccount.types.ts","../../src/resources/SubAccount.ts","../../src/ws/BaseWS.ts","../../src/types/ws.types.ts","../../src/ws/FuturesMarketWS.ts","../../src/ws/SpotMarketWS.ts","../../src/ws/SpotUserWS.ts","../../src/ws/FuturesUserWS.ts","../../src/ws/CoinMMarketWS.ts","../../src/ws/CoinMUserWS.ts","../../src/ws/WsApi.ts","../../src/ws/SpotWsApi.ts","../../src/client/BinanceClient.ts","../../src/mcp/server.ts","../../src/tools/account.tools.ts","../../src/tools/types.ts","../../src/tools/derived.tools.ts","../../src/tools/market-data.tools.ts","../../src/tools/paper.tools.ts","../../src/tools/spot.tools.ts","../../src/tools/trading.tools.ts","../../src/tools/ws.tools.ts","../../src/tools/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport http from 'node:http';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { BinanceClient } from '../client/BinanceClient.js';\nimport { createBinanceMcpServer } from './server.js';\n\nfunction clientFromEnv(): BinanceClient {\n return new BinanceClient({\n apiKey: process.env.BINANCE_API_KEY,\n apiSecret: process.env.BINANCE_API_SECRET,\n testnet: process.env.BINANCE_TESTNET === 'true' || process.env.BINANCE_ENV === 'testnet',\n demo: process.env.BINANCE_ENV === 'demo',\n });\n}\n\nasync function startStdio(): Promise<void> {\n const server = createBinanceMcpServer(clientFromEnv());\n await server.connect(new StdioServerTransport());\n}\n\nfunction startHttp(): void {\n const port = Number(process.env.PORT || process.env.MCP_PORT || 3100);\n const server = http.createServer((req, res) => {\n res.setHeader('content-type', 'application/json');\n if (req.url === '/health') {\n res.end(JSON.stringify({ ok: true, name: 'binance-sdk-mcp' }));\n return;\n }\n res.statusCode = 501;\n res.end(JSON.stringify({ error: 'Use stdio for MCP JSON-RPC. HTTP health endpoint is available at /health.' }));\n });\n server.listen(port, () => console.error(`binance-sdk MCP HTTP health server listening on ${port}`));\n}\n\nif (process.argv.includes('--http') || process.env.MCP_TRANSPORT === 'http') startHttp();\nelse startStdio().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n","import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';\nimport Bottleneck from 'bottleneck';\nimport { BinanceApiError, BinanceAuthError, NetworkError, RateLimitError } from '../errors/index.js';\nimport { RateLimitTracker, type RateLimitUsage } from './RateLimitTracker.js';\nimport { Signer, type SignatureAlgorithm } from './Signer.js';\nimport type { TradingPolicy } from './TradingPolicy.js';\n\nexport type AuthMode = 'public' | 'apiKey' | 'signed';\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\nexport type { SignatureAlgorithm };\n\nexport interface HttpClientOptions {\n baseURL: string;\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n recvWindow?: number;\n timeoutMs?: number;\n maxRetries?: number;\n minTimeMs?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitTokensPerSecond?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitMaxTokens?: number;\n /** Assumed per-minute IP weight ceiling used to preempt -1003 bans. Binance's default is 6000 for most REST hosts. */\n rateLimitWeightPerMinute?: number;\n /** Fraction of rateLimitWeightPerMinute at which requests are delayed until the next minute window. Set >=1 to disable. */\n rateLimitSafetyMargin?: number;\n retryBaseDelayMs?: number;\n retryMaxDelayMs?: number;\n retryFactor?: number;\n /** Custom keep-alive/https agent, e.g. for corporate proxies or connection pooling. */\n httpsAgent?: AxiosRequestConfig['httpsAgent'];\n /** Axios proxy configuration. */\n proxy?: AxiosRequestConfig['proxy'];\n /** Client-side guardrails evaluated before any mutating request is sent. */\n policy?: TradingPolicy;\n}\n\ninterface BinanceErrorBody {\n code?: number;\n msg?: string;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 418, 500, 502, 503, 504]);\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction normalizeHeaders(headers: unknown): Record<string, string> {\n const result: Record<string, string> = {};\n if (!headers || typeof headers !== 'object') return result;\n for (const [key, value] of Object.entries(headers as Record<string, unknown>)) {\n if (value !== undefined && value !== null) result[key.toLowerCase()] = String(value);\n }\n return result;\n}\n\nexport class HttpClient {\n private readonly axios: AxiosInstance;\n private readonly limiter: Bottleneck;\n private readonly signer: Signer;\n private readonly rateLimitTracker: RateLimitTracker;\n private readonly policy?: TradingPolicy;\n private readonly apiKey?: string;\n private readonly recvWindow: number;\n private readonly timeoutMs: number;\n private maxRetries: number;\n private minTimeMs: number;\n private retryBaseDelayMs: number;\n private retryMaxDelayMs: number;\n private retryFactor: number;\n private pendingRequests = 0;\n private timeOffsetMs = 0;\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey;\n this.recvWindow = options.recvWindow ?? 5000;\n this.timeoutMs = options.timeoutMs ?? 15_000;\n this.maxRetries = options.maxRetries ?? 3;\n this.minTimeMs = options.minTimeMs ?? 50;\n this.retryBaseDelayMs = options.retryBaseDelayMs ?? 1000;\n this.retryMaxDelayMs = options.retryMaxDelayMs ?? 30_000;\n this.retryFactor = options.retryFactor ?? 2;\n this.signer = new Signer({\n algorithm: options.signatureAlgorithm,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n });\n this.rateLimitTracker = new RateLimitTracker({\n weightLimitPerMinute: options.rateLimitWeightPerMinute,\n safetyMargin: options.rateLimitSafetyMargin,\n });\n this.policy = options.policy;\n this.axios = axios.create({\n baseURL: options.baseURL,\n timeout: this.timeoutMs,\n httpsAgent: options.httpsAgent,\n proxy: options.proxy,\n });\n this.limiter = new Bottleneck({ minTime: this.minTimeMs });\n }\n\n async get<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('GET', path, params, mode);\n }\n\n async post<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('POST', path, params, mode);\n }\n\n async put<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('PUT', path, params, mode);\n }\n\n async delete<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('DELETE', path, params, mode);\n }\n\n getRateLimiterStatus(): { minTimeMs: number; queueLength: number } {\n return { minTimeMs: this.minTimeMs, queueLength: this.pendingRequests };\n }\n\n /** Snapshot of the most recently observed `X-MBX-USED-WEIGHT-*` / `X-MBX-ORDER-COUNT-*` response headers. */\n getRateLimitUsage(): Readonly<RateLimitUsage> {\n return this.rateLimitTracker.getUsage();\n }\n\n configureRateLimiter(options: { minTimeMs?: number }): void {\n if (options.minTimeMs !== undefined) {\n this.minTimeMs = options.minTimeMs;\n this.limiter.updateSettings({ minTime: this.minTimeMs });\n }\n }\n\n getRetryConfig(): {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n factor: number;\n } {\n return {\n maxRetries: this.maxRetries,\n baseDelayMs: this.retryBaseDelayMs,\n maxDelayMs: this.retryMaxDelayMs,\n factor: this.retryFactor,\n };\n }\n\n configureRetry(options: { maxRetries?: number; baseDelayMs?: number; maxDelayMs?: number; factor?: number }): void {\n if (options.maxRetries !== undefined) this.maxRetries = options.maxRetries;\n if (options.baseDelayMs !== undefined) this.retryBaseDelayMs = options.baseDelayMs;\n if (options.maxDelayMs !== undefined) this.retryMaxDelayMs = options.maxDelayMs;\n if (options.factor !== undefined) this.retryFactor = options.factor;\n }\n\n /**\n * Fetches server time from `timePath` (e.g. '/time', '/fapi/v1/time', '/dapi/v1/time') and\n * stores the offset from local time, applied to every signed request's `timestamp` param.\n * Mitigates `-1021` (timestamp outside recvWindow) errors caused by local clock drift.\n */\n async syncTime(timePath = '/time'): Promise<number> {\n const res = await this.axios.request<{ serverTime: number }>({ method: 'GET', url: timePath });\n this.timeOffsetMs = res.data.serverTime - Date.now();\n return this.timeOffsetMs;\n }\n\n getTimeOffsetMs(): number {\n return this.timeOffsetMs;\n }\n\n private async request<T>(\n method: HttpMethod,\n path: string,\n params: Record<string, unknown> | undefined,\n mode: AuthMode,\n ): Promise<T> {\n // Evaluated before signing and before the limiter, so a refused request costs no\n // rate-limit budget and never has a signature generated for it.\n this.policy?.check(method, path, params ?? {});\n const url = this.buildUrl(path, params, mode);\n const config: AxiosRequestConfig = { method, url, headers: this.buildHeaders(mode) };\n return this.limiter.schedule(async () => {\n const throttleMs = this.rateLimitTracker.getThrottleDelayMs();\n if (throttleMs > 0) await sleep(throttleMs);\n return this.requestWithRetry<T>(config, 0, method, path);\n });\n }\n\n private buildHeaders(mode: AuthMode): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'binance-sdk',\n };\n if (mode !== 'public') headers['X-MBX-APIKEY'] = this.requireApiKey();\n return headers;\n }\n\n private buildUrl(\n path: string,\n params: Record<string, unknown> | undefined,\n mode: AuthMode,\n ): string {\n if (mode !== 'signed') return this.appendQuery(path, params);\n const requestData = { ...params, timestamp: Date.now() + this.timeOffsetMs, recvWindow: this.recvWindow };\n const queryString = this.buildQueryString(requestData);\n const signature = this.sign(queryString);\n return `${path}?${queryString}&signature=${signature}`;\n }\n\n private appendQuery(path: string, params: Record<string, unknown> | undefined): string {\n const queryString = this.buildQueryString(params);\n return queryString ? `${path}?${queryString}` : path;\n }\n\n private buildQueryString(params: Record<string, unknown> | undefined): string {\n if (!params) return '';\n return Object.entries(params)\n .filter(([, val]) => val !== undefined && val !== null)\n .flatMap(([key, val]) =>\n Array.isArray(val)\n ? val.map((item) => `${key}=${encodeURIComponent(String(item))}`)\n : [`${key}=${encodeURIComponent(String(val))}`],\n )\n .join('&');\n }\n\n private sign(queryString: string): string {\n if (!this.signer.canSign()) {\n throw new BinanceAuthError(this.signer.algorithm === 'HMAC' ? 'apiSecret' : 'privateKey');\n }\n return this.signer.sign(queryString);\n }\n\n private requireApiKey(): string {\n if (!this.apiKey) throw new BinanceAuthError('apiKey');\n return this.apiKey;\n }\n\n private async requestWithRetry<T>(\n config: AxiosRequestConfig,\n attempt: number,\n method: HttpMethod,\n endpoint: string,\n ): Promise<T> {\n this.pendingRequests += 1;\n try {\n const res = await this.axios.request<T>(config);\n this.rateLimitTracker.update(normalizeHeaders(res.headers));\n return res.data;\n } catch (err) {\n if (!axios.isAxiosError(err)) {\n throw new NetworkError('Unexpected error calling Binance API', err);\n }\n const status = err.response?.status;\n const body = err.response?.data as BinanceErrorBody | undefined;\n const headers = normalizeHeaders(err.response?.headers);\n this.rateLimitTracker.update(headers);\n\n if (attempt < this.maxRetries && this.shouldRetry(err)) {\n await sleep(this.calculateDelay(attempt));\n return this.requestWithRetry<T>(config, attempt + 1, method, endpoint);\n }\n\n const context = { endpoint, method, headers };\n if (status === 429 || status === 418) {\n throw new RateLimitError(\n body?.msg ?? 'Binance rate limit exceeded',\n body?.code ?? -1,\n status,\n this.parseRetryAfterMs(headers),\n context,\n );\n }\n if (status && body) {\n throw new BinanceApiError(body.msg ?? 'Binance API error', body.code ?? -1, status, context);\n }\n throw new NetworkError(err.message, err);\n } finally {\n this.pendingRequests -= 1;\n }\n }\n\n private parseRetryAfterMs(headers: Record<string, string>): number | undefined {\n const raw = headers['retry-after'];\n if (!raw) return undefined;\n const seconds = Number(raw);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n }\n\n private shouldRetry(err: { response?: { status?: number } }): boolean {\n if (err.response?.status !== undefined) return RETRYABLE_STATUS.has(err.response.status);\n return true;\n }\n\n private calculateDelay(attempt: number): number {\n const delay = Math.min(this.retryBaseDelayMs * this.retryFactor ** attempt, this.retryMaxDelayMs);\n const jitter = delay * 0.1 * (Math.random() * 2 - 1);\n return Math.max(0, delay + jitter);\n }\n}\n","export class BinanceError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BinanceError';\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport class BinanceAuthError extends BinanceError {\n readonly missing: 'apiKey' | 'apiSecret' | 'privateKey';\n\n constructor(missing: 'apiKey' | 'apiSecret' | 'privateKey') {\n super(`API ${missing} required for authenticated requests`);\n this.name = 'BinanceAuthError';\n this.missing = missing;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport interface BinanceApiErrorContext {\n endpoint?: string;\n method?: string;\n headers?: Record<string, string>;\n}\n\nexport class BinanceApiError extends BinanceError {\n readonly code: number;\n readonly status: number;\n readonly endpoint?: string;\n readonly method?: string;\n readonly headers?: Record<string, string>;\n\n constructor(message: string, code: number, status: number, context?: BinanceApiErrorContext) {\n super(message);\n this.name = 'BinanceApiError';\n this.code = code;\n this.status = status;\n this.endpoint = context?.endpoint;\n this.method = context?.method;\n this.headers = context?.headers;\n }\n\n /** -1003 (way too many requests) or HTTP 429/418. */\n isRateLimitError(): boolean {\n return this.code === -1003 || this.status === 429 || this.status === 418;\n }\n\n /** -1021: request timestamp outside recvWindow, usually caused by local clock drift. */\n isTimestampError(): boolean {\n return this.code === -1021;\n }\n\n /** -2010: account has insufficient balance for the requested action. */\n isInsufficientBalance(): boolean {\n return this.code === -2010;\n }\n}\n","import { BinanceApiError, type BinanceApiErrorContext } from './BinanceApiError.js';\n\nexport class RateLimitError extends BinanceApiError {\n readonly retryAfterMs?: number;\n\n constructor(\n message: string,\n code: number,\n status: number,\n retryAfterMs?: number,\n context?: BinanceApiErrorContext,\n ) {\n super(message, code, status, context);\n this.name = 'RateLimitError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport class NetworkError extends BinanceError {\n readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n this.cause = cause;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport type PolicyRule =\n | 'readOnly'\n | 'symbolNotAllowed'\n | 'maxNotionalPerOrder'\n | 'notionalUndeterminable'\n | 'withdrawalsBlocked'\n | 'transfersBlocked'\n | 'blockedPath';\n\n/**\n * Thrown when a request is refused by the client's own {@link TradingPolicy} — before it\n * ever reaches Binance. Distinct from BinanceApiError, which reports an exchange rejection.\n */\nexport class PolicyViolationError extends BinanceError {\n readonly rule: PolicyRule;\n readonly method: string;\n readonly endpoint: string;\n readonly details?: Record<string, unknown>;\n\n constructor(\n rule: PolicyRule,\n message: string,\n method: string,\n endpoint: string,\n details?: Record<string, unknown>,\n ) {\n super(`Blocked by trading policy (${rule}): ${message} [${method} ${endpoint}]`);\n this.name = 'PolicyViolationError';\n this.rule = rule;\n this.method = method;\n this.endpoint = endpoint;\n this.details = details;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\n/**\n * Thrown instead of sending a mutating request when the client is in dry-run mode.\n *\n * Dry run deliberately throws rather than returning a synthetic success payload: a fabricated\n * orderId would lead an agent to believe an order exists and then try to manage or cancel it.\n * Failing loudly — while carrying the exact request that *would* have been sent — is the only\n * safe signal. Tool layers should catch this and surface `describe()` back to the model.\n */\nexport class DryRunError extends BinanceError {\n readonly method: string;\n readonly endpoint: string;\n readonly params: Record<string, unknown>;\n\n constructor(method: string, endpoint: string, params: Record<string, unknown> = {}) {\n super(`DRY RUN — request not sent: ${method} ${endpoint} ${JSON.stringify(params)}`);\n this.name = 'DryRunError';\n this.method = method;\n this.endpoint = endpoint;\n this.params = params;\n }\n\n /** Human/LLM-readable description of the suppressed request. */\n describe(): string {\n return `Would have sent ${this.method} ${this.endpoint} with ${JSON.stringify(this.params)}`;\n }\n}\n","export interface RateLimitUsage {\n /** Highest `x-mbx-used-weight-*` value seen across all interval headers on the last response. */\n usedWeight: number;\n /** Per-header-suffix used-weight snapshot, e.g. `{ '1m': 120 }`. */\n usedWeightByInterval: Record<string, number>;\n /** Per-header-suffix order-count snapshot, e.g. `{ '10s': 3, '1d': 45 }`. */\n orderCountByInterval: Record<string, number>;\n lastUpdated: number;\n}\n\nexport interface RateLimitTrackerOptions {\n /** Assumed weight-per-minute ceiling used to compute throttling delay. Binance's default IP limit is 6000 for most REST hosts. */\n weightLimitPerMinute?: number;\n /** Fraction of the weight limit at which the tracker starts delaying requests (0-1). Set >=1 to disable throttling. */\n safetyMargin?: number;\n}\n\nconst WEIGHT_HEADER = /^x-mbx-used-weight-(.+)$/i;\nconst ORDER_COUNT_HEADER = /^x-mbx-order-count-(.+)$/i;\n\n/**\n * Tracks Binance's `X-MBX-USED-WEIGHT-*` / `X-MBX-ORDER-COUNT-*` response headers so callers can\n * back off before hitting `-1003` (IP ban) instead of reacting to it after the fact.\n */\nexport class RateLimitTracker {\n private readonly weightLimitPerMinute: number;\n private readonly safetyMargin: number;\n private usage: RateLimitUsage = {\n usedWeight: 0,\n usedWeightByInterval: {},\n orderCountByInterval: {},\n lastUpdated: 0,\n };\n\n constructor(options: RateLimitTrackerOptions = {}) {\n this.weightLimitPerMinute = options.weightLimitPerMinute ?? 6000;\n this.safetyMargin = options.safetyMargin ?? 0.8;\n }\n\n update(headers: Record<string, string> | undefined): void {\n if (!headers) return;\n const usedWeightByInterval: Record<string, number> = {};\n const orderCountByInterval: Record<string, number> = {};\n\n for (const [key, value] of Object.entries(headers)) {\n const weightMatch = key.match(WEIGHT_HEADER);\n if (weightMatch?.[1]) {\n usedWeightByInterval[weightMatch[1]] = Number(value);\n continue;\n }\n const orderMatch = key.match(ORDER_COUNT_HEADER);\n if (orderMatch?.[1]) {\n orderCountByInterval[orderMatch[1]] = Number(value);\n }\n }\n\n if (Object.keys(usedWeightByInterval).length === 0 && Object.keys(orderCountByInterval).length === 0) {\n return;\n }\n\n this.usage = {\n usedWeight: Math.max(0, ...Object.values(usedWeightByInterval)),\n usedWeightByInterval,\n orderCountByInterval,\n lastUpdated: Date.now(),\n };\n }\n\n getUsage(): Readonly<RateLimitUsage> {\n return this.usage;\n }\n\n /**\n * Milliseconds a caller should wait before its next request, based on the most recently\n * observed 1-minute weight usage. Returns 0 when usage is stale or under the safety margin.\n */\n getThrottleDelayMs(): number {\n if (this.safetyMargin >= 1) return 0;\n const oneMinuteWeight = this.usage.usedWeightByInterval['1m'] ?? this.usage.usedWeight;\n if (!oneMinuteWeight) return 0;\n if (Date.now() - this.usage.lastUpdated > 60_000) return 0;\n\n const threshold = this.weightLimitPerMinute * this.safetyMargin;\n if (oneMinuteWeight < threshold) return 0;\n\n const msIntoMinute = Date.now() % 60_000;\n return 60_000 - msIntoMinute;\n }\n}\n","import { createHmac, createPrivateKey, createSign, sign as cryptoSign, type KeyObject } from 'node:crypto';\n\nexport type SignatureAlgorithm = 'HMAC' | 'ED25519' | 'RSA';\n\nexport interface SignerOptions {\n algorithm?: SignatureAlgorithm;\n /** HMAC secret string. Required when algorithm is 'HMAC' (the default). */\n apiSecret?: string;\n /** PEM-encoded private key (or raw Buffer). Required for 'ED25519' and 'RSA'. */\n privateKey?: string | Buffer;\n}\n\n/**\n * Signs Binance request payloads. HMAC-SHA256 (the classic API-secret flow) is the default;\n * Ed25519 and RSA keys — which Binance now recommends over HMAC — are signed via `privateKey`.\n */\nexport class Signer {\n readonly algorithm: SignatureAlgorithm;\n private readonly apiSecret?: string;\n private readonly privateKey?: KeyObject;\n\n constructor(options: SignerOptions) {\n this.algorithm = options.algorithm ?? (options.privateKey ? 'ED25519' : 'HMAC');\n this.apiSecret = options.apiSecret;\n if (options.privateKey) {\n this.privateKey = createPrivateKey(options.privateKey);\n }\n }\n\n canSign(): boolean {\n return this.algorithm === 'HMAC' ? Boolean(this.apiSecret) : Boolean(this.privateKey);\n }\n\n sign(payload: string): string {\n switch (this.algorithm) {\n case 'HMAC': {\n if (!this.apiSecret) throw new Error('apiSecret is required for HMAC signing');\n return createHmac('sha256', this.apiSecret).update(payload).digest('hex');\n }\n case 'ED25519': {\n if (!this.privateKey) throw new Error('privateKey is required for ED25519 signing');\n return cryptoSign(null, Buffer.from(payload), this.privateKey).toString('base64');\n }\n case 'RSA': {\n if (!this.privateKey) throw new Error('privateKey is required for RSA signing');\n return createSign('RSA-SHA256').update(payload).sign(this.privateKey, 'base64');\n }\n default: {\n const exhaustive: never = this.algorithm;\n throw new Error(`Unsupported signature algorithm: ${String(exhaustive)}`);\n }\n }\n }\n}\n","import { DryRunError } from '../errors/DryRunError.js';\nimport { PolicyViolationError, type PolicyRule } from '../errors/PolicyViolationError.js';\nimport type { HttpMethod } from './HttpClient.js';\n\nexport interface TradingPolicyOptions {\n /**\n * Intercept every mutating request (POST/PUT/DELETE) and throw {@link DryRunError} instead of\n * sending it. Read-only GETs still hit the network, so an agent can research freely but\n * cannot act.\n */\n dryRun?: boolean;\n /** Reject every mutating request outright. Unlike dryRun this is not a rehearsal mode. */\n readOnly?: boolean;\n /**\n * Allowlist of tradeable symbols. Any order-bearing request naming a symbol outside this\n * list is rejected. Case-insensitive.\n */\n allowedSymbols?: string[];\n /**\n * Hard cap on a single order's notional value, in quote currency. When set, an order whose\n * notional cannot be determined from its parameters (e.g. a MARKET order with no price) is\n * also rejected — an unverifiable order is not a safe order.\n */\n maxNotionalPerOrder?: number;\n /** Permit withdrawal requests. Defaults to false: opting into a policy at all denies withdrawals. */\n allowWithdrawals?: boolean;\n /** Permit account-to-account transfers. Defaults to true; set false to pin funds in place. */\n allowTransfers?: boolean;\n /** Extra path fragments to refuse, matched case-insensitively as substrings. */\n blockedPaths?: string[];\n}\n\nconst WITHDRAW_FRAGMENTS = ['/capital/withdraw/apply'];\nconst TRANSFER_FRAGMENTS = [\n '/asset/transfer',\n '/margin/transfer',\n '/margin/isolated/transfer',\n '/universaltransfer',\n '/futures/transfer',\n];\nconst MUTATING_METHODS = new Set<HttpMethod>(['POST', 'PUT', 'DELETE']);\n\nfunction toNumber(value: unknown): number | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n const num = Number(value);\n return Number.isFinite(num) ? num : undefined;\n}\n\nfunction includesFragment(path: string, fragments: string[]): boolean {\n const lower = path.toLowerCase();\n return fragments.some((fragment) => lower.includes(fragment.toLowerCase()));\n}\n\n/**\n * Client-side guardrails evaluated before a request leaves the process.\n *\n * This exists for autonomous/LLM-driven callers: a misread prompt should not be able to spend\n * the account. It is a defence-in-depth layer, not a substitute for exchange-side API-key\n * restrictions (IP allowlists, disabled withdrawals) — anything that bypasses this HttpClient\n * bypasses the policy too.\n */\nexport class TradingPolicy {\n private readonly allowedSymbols?: Set<string>;\n\n constructor(private readonly options: TradingPolicyOptions = {}) {\n if (options.allowedSymbols?.length) {\n this.allowedSymbols = new Set(options.allowedSymbols.map((s) => s.toUpperCase()));\n }\n }\n\n /** Throws {@link PolicyViolationError} or {@link DryRunError} if the request is not permitted. */\n check(method: HttpMethod, path: string, params: Record<string, unknown> = {}): void {\n if (!MUTATING_METHODS.has(method)) return;\n\n const deny = (rule: PolicyRule, message: string, details?: Record<string, unknown>): never => {\n throw new PolicyViolationError(rule, message, method, path, details);\n };\n\n if (this.options.blockedPaths?.length && includesFragment(path, this.options.blockedPaths)) {\n deny('blockedPath', 'endpoint is on the blocked-path list');\n }\n\n if (this.options.readOnly) {\n deny('readOnly', 'client is in read-only mode; mutating requests are refused');\n }\n\n if (includesFragment(path, WITHDRAW_FRAGMENTS) && this.options.allowWithdrawals !== true) {\n deny('withdrawalsBlocked', 'withdrawals are disabled; set safety.allowWithdrawals to permit them');\n }\n\n if (includesFragment(path, TRANSFER_FRAGMENTS) && this.options.allowTransfers === false) {\n deny('transfersBlocked', 'account transfers are disabled by policy');\n }\n\n this.checkSymbol(path, params, deny);\n this.checkNotional(path, params, deny);\n\n if (this.options.dryRun) {\n throw new DryRunError(method, path, params);\n }\n }\n\n private checkSymbol(\n path: string,\n params: Record<string, unknown>,\n deny: (rule: PolicyRule, message: string, details?: Record<string, unknown>) => never,\n ): void {\n if (!this.allowedSymbols) return;\n const symbol = params.symbol;\n if (typeof symbol !== 'string' || symbol === '') return;\n if (!this.allowedSymbols.has(symbol.toUpperCase())) {\n deny('symbolNotAllowed', `symbol ${symbol} is not in the allowed list`, {\n symbol,\n allowed: [...this.allowedSymbols],\n });\n }\n }\n\n private checkNotional(\n path: string,\n params: Record<string, unknown>,\n deny: (rule: PolicyRule, message: string, details?: Record<string, unknown>) => never,\n ): void {\n const max = this.options.maxNotionalPerOrder;\n if (max === undefined) return;\n if (!path.toLowerCase().includes('order')) return;\n\n const quantity = toNumber(params.quantity);\n const quoteOrderQty = toNumber(params.quoteOrderQty);\n // Only order-placing requests carry a size; cancels and queries are unaffected.\n if (quantity === undefined && quoteOrderQty === undefined) return;\n\n const price = toNumber(params.price);\n const notional = quoteOrderQty ?? (price !== undefined && quantity !== undefined ? price * quantity : undefined);\n\n if (notional === undefined) {\n deny(\n 'notionalUndeterminable',\n `cannot verify notional against the ${max} cap (no price on this order); supply a price or raise/remove maxNotionalPerOrder`,\n { quantity, maxNotionalPerOrder: max },\n );\n }\n\n if (notional > max) {\n deny('maxNotionalPerOrder', `order notional ${notional} exceeds the ${max} cap`, {\n notional,\n maxNotionalPerOrder: max,\n });\n }\n }\n}\n","export type Environment = 'live' | 'testnet' | 'demo';\n\nexport interface Endpoints {\n restRoot: string;\n restFapi: string;\n restFuturesData: string;\n restSpot: string;\n restApiRoot: string;\n restDapiRoot: string;\n restDapi: string;\n wsMarket: string;\n wsUser: string;\n wsApi: string;\n wsSpotMarket: string;\n wsSpotUser: string;\n wsSpotApi: string;\n wsDapiMarket: string;\n wsDapiUser: string;\n}\n\nexport function resolveEnvironment(options?: {\n testnet?: boolean;\n demo?: boolean;\n apiBase?: string;\n wsBase?: string;\n wsUserBase?: string;\n wsApiBase?: string;\n dapiBase?: string;\n wsSpotApiBase?: string;\n wsDapiBase?: string;\n}): { env: Environment; endpoints: Endpoints } {\n const env: Environment = options?.demo ? 'demo' : options?.testnet ? 'testnet' : 'live';\n\n const restHost =\n options?.apiBase ??\n (env === 'demo'\n ? 'https://demo-fapi.binance.com'\n : env === 'testnet'\n ? 'https://testnet.binancefuture.com'\n : 'https://fapi.binance.com');\n\n const wsMarketHost =\n options?.wsBase ??\n (env === 'demo'\n ? 'wss://demo-fstream.binance.com/stream'\n : env === 'testnet'\n ? 'wss://fstream.binancefuture.com/stream'\n : 'wss://fstream.binance.com/stream');\n\n const wsUserHost =\n options?.wsUserBase ??\n (env === 'demo'\n ? 'wss://demo-fstream.binance.com/ws'\n : env === 'testnet'\n ? 'wss://fstream.binancefuture.com/ws'\n : 'wss://fstream.binance.com/ws');\n\n const wsApiHost =\n options?.wsApiBase ??\n (env === 'demo'\n ? 'wss://demo-fapi.binance.com/ws-fapi/v1'\n : 'wss://ws-fapi.binance.com/ws-fapi/v1');\n\n const restSpotHost =\n options?.apiBase ??\n (env === 'testnet' ? 'https://testnet.binance.vision' : 'https://api.binance.com');\n\n const wsSpotMarketHost =\n options?.wsBase ??\n (env === 'testnet' ? 'wss://testnet.binance.vision/stream' : 'wss://stream.binance.com:9443/stream');\n\n const wsSpotUserHost =\n options?.wsUserBase ??\n (env === 'testnet' ? 'wss://testnet.binance.vision/ws' : 'wss://stream.binance.com:9443/ws');\n\n // Binance has no dedicated COIN-M demo trading host, so demo mode falls back to testnet.\n const restDapiHost =\n options?.dapiBase ??\n (env === 'testnet' || env === 'demo' ? 'https://testnet.binancefuture.com' : 'https://dapi.binance.com');\n\n const wsSpotApiHost =\n options?.wsSpotApiBase ??\n (env === 'testnet' ? 'wss://testnet.binance.vision/ws-api/v3' : 'wss://ws-api.binance.com:443/ws-api/v3');\n\n // Binance has no dedicated COIN-M demo WS host either, so demo mode falls back to testnet here too.\n const wsDapiHost =\n options?.wsDapiBase ??\n (env === 'testnet' || env === 'demo' ? 'wss://dstream.binancefuture.com' : 'wss://dstream.binance.com');\n\n return {\n env,\n endpoints: {\n restRoot: restHost,\n restFapi: `${restHost}/fapi/v1`,\n restFuturesData: `${restHost}/futures/data`,\n restSpot: `${restSpotHost}/api/v3`,\n restApiRoot: restSpotHost,\n restDapiRoot: restDapiHost,\n restDapi: `${restDapiHost}/dapi/v1`,\n wsMarket: wsMarketHost,\n wsUser: wsUserHost,\n wsApi: wsApiHost,\n wsSpotMarket: wsSpotMarketHost,\n wsSpotUser: wsSpotUserHost,\n wsSpotApi: wsSpotApiHost,\n wsDapiMarket: `${wsDapiHost}/stream`,\n wsDapiUser: `${wsDapiHost}/ws`,\n },\n };\n}\n","import { z } from 'zod';\n\nexport const FundingRateSchema = z.object({\n symbol: z.string(),\n fundingTime: z.number(),\n fundingRate: z.string().transform(Number),\n markPrice: z.string().transform(Number).optional(),\n});\nexport type FundingRate = z.infer<typeof FundingRateSchema>;\nexport const FundingRateHistorySchema = z.array(FundingRateSchema);\n\nexport const PremiumIndexSchema = z.object({\n symbol: z.string(),\n markPrice: z.string().transform(Number),\n indexPrice: z.string().transform(Number),\n estimatedSettlePrice: z.string().transform(Number),\n lastFundingRate: z.string().transform(Number),\n nextFundingTime: z.number(),\n interestRate: z.string().transform(Number),\n time: z.number(),\n});\nexport type PremiumIndex = z.infer<typeof PremiumIndexSchema>;\n\nexport const OpenInterestSchema = z.object({\n symbol: z.string(),\n openInterest: z.string().transform(Number),\n time: z.number(),\n});\nexport type OpenInterest = z.infer<typeof OpenInterestSchema>;\n\nexport const OpenInterestHistEntrySchema = z.object({\n symbol: z.string(),\n sumOpenInterest: z.string().transform(Number),\n sumOpenInterestValue: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type OpenInterestHistEntry = z.infer<typeof OpenInterestHistEntrySchema>;\nexport const OpenInterestHistSchema = z.array(OpenInterestHistEntrySchema);\n\nexport const LongShortRatioEntrySchema = z.object({\n symbol: z.string(),\n longShortRatio: z.string().transform(Number),\n longAccount: z.string().transform(Number),\n shortAccount: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type LongShortRatioEntry = z.infer<typeof LongShortRatioEntrySchema>;\nexport const LongShortRatioSchema = z.array(LongShortRatioEntrySchema);\n\nexport const TakerLongShortRatioEntrySchema = z.object({\n buySellRatio: z.string().transform(Number),\n buyVol: z.string().transform(Number),\n sellVol: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type TakerLongShortRatioEntry = z.infer<typeof TakerLongShortRatioEntrySchema>;\nexport const TakerLongShortRatioSchema = z.array(TakerLongShortRatioEntrySchema);\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n FundingRate,\n FundingRateHistorySchema,\n LongShortRatioEntry,\n LongShortRatioSchema,\n OpenInterest,\n OpenInterestHistEntry,\n OpenInterestHistSchema,\n OpenInterestSchema,\n PremiumIndex,\n PremiumIndexSchema,\n TakerLongShortRatioEntry,\n TakerLongShortRatioSchema,\n} from '../types/futures.types.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport interface FuturesDataEndpoints {\n restFapi?: string;\n restFuturesData?: string;\n apiKey?: string;\n apiSecret?: string;\n recvWindow?: number;\n timeoutMs?: number;\n maxRetries?: number;\n retryBaseDelayMs?: number;\n retryMaxDelayMs?: number;\n}\n\nexport class FuturesData {\n private readonly http: HttpClient;\n private readonly dataHttp: HttpClient;\n\n constructor(endpoints?: FuturesDataEndpoints) {\n const { restFapi, restFuturesData, ...httpOptions } = endpoints ?? {};\n this.http = new HttpClient({ baseURL: restFapi ?? 'https://fapi.binance.com/fapi/v1', ...httpOptions });\n this.dataHttp = new HttpClient({\n baseURL: restFuturesData ?? 'https://fapi.binance.com/futures/data',\n ...httpOptions,\n });\n }\n\n async fundingRateHistory(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<FundingRate[]> {\n const data = await this.http.get('/fundingRate', {\n symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 100,\n });\n return FundingRateHistorySchema.parse(data);\n }\n\n async premiumIndex(symbol: string): Promise<PremiumIndex> {\n return PremiumIndexSchema.parse(await this.http.get('/premiumIndex', { symbol }));\n }\n\n async openInterest(symbol: string): Promise<OpenInterest> {\n return OpenInterestSchema.parse(await this.http.get('/openInterest', { symbol }));\n }\n\n async openInterestHist(symbol: string, period: string, limit = 30): Promise<OpenInterestHistEntry[]> {\n const data = await this.dataHttp.get('/openInterestHist', { symbol, period, limit });\n return OpenInterestHistSchema.parse(data);\n }\n\n async topLongShortAccountRatio(symbol: string, period: string, limit = 30): Promise<LongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/topLongShortAccountRatio', { symbol, period, limit });\n return LongShortRatioSchema.parse(data);\n }\n\n async topLongShortPositionRatio(symbol: string, period: string, limit = 30): Promise<LongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/topLongShortPositionRatio', { symbol, period, limit });\n return LongShortRatioSchema.parse(data);\n }\n\n async globalLongShortAccountRatio(symbol: string, period: string, limit = 30): Promise<LongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/globalLongShortAccountRatio', { symbol, period, limit });\n return LongShortRatioSchema.parse(data);\n }\n\n async takerLongShortRatio(symbol: string, period: string, limit = 30): Promise<TakerLongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/takerlongshortRatio', { symbol, period, limit });\n return TakerLongShortRatioSchema.parse(data);\n }\n\n async basis(\n symbol: string,\n period: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<unknown[]> {\n return this.dataHttp.get('/basis', {\n symbol,\n period,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n });\n }\n\n async fundingInfo(): Promise<unknown[]> {\n return this.http.get('/fundingInfo');\n }\n\n async assetIndex(symbol?: string): Promise<unknown[] | unknown> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/assetIndex', params);\n }\n\n async compositeIndexInfo(symbol?: string): Promise<unknown> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/indexInfo', params);\n }\n\n async adlQuantile(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/adlQuantile', params, 'signed');\n }\n\n async blvtInfo(\n tokenName: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<unknown[]> {\n return this.http.get('/lvtKlines', {\n tokenName,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n });\n }\n\n async indexPriceConstituents(symbol: string): Promise<unknown> {\n return this.http.get('/constituents', { symbol });\n }\n\n async symbolConfig(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/symbolConfig', params, 'signed');\n }\n\n async forceOrders(options?: {\n symbol?: string;\n autoCloseType?: 'LIQUIDATION' | 'ADL';\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<unknown[]> {\n return this.http.get(\n '/forceOrders',\n {\n symbol: options?.symbol,\n autoCloseType: options?.autoCloseType,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n },\n 'signed',\n );\n }\n\n async insuranceFundBalance(options?: { symbol?: string; startTime?: number; endTime?: number; limit?: number }): Promise<unknown[]> {\n return this.dataHttp.get('/insuranceBalance', {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n });\n }\n\n async pmExchangeInfo(): Promise<unknown> {\n return this.http.get('/pmExchangeInfo');\n }\n\n async delistSchedule(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/delistSchedule', params);\n }\n\n async symbolAdlRisk(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/symbolAdlRisk', params, 'signed');\n }\n\n async deliveryPrice(pair: string): Promise<{ deliveryTime: number; deliveryPrice: number }[]> {\n return this.dataHttp.get('/delivery-price', { pair });\n }\n}\n","import { z } from 'zod';\n\nexport const KlineIntervalSchema = z.enum([\n '1m', '3m', '5m', '15m', '30m',\n '1h', '2h', '4h', '6h', '8h', '12h',\n '1d', '3d', '1w', '1M',\n]);\nexport type KlineInterval = z.infer<typeof KlineIntervalSchema>;\n\nconst RawKlineSchema = z.tuple([\n z.number(), z.string(), z.string(), z.string(), z.string(), z.string(),\n z.number(), z.string(), z.number(), z.string(), z.string(), z.string(),\n]);\n\nexport const KlineSchema = RawKlineSchema.transform(\n ([openTime, open, high, low, close, volume, closeTime, quoteAssetVolume, trades, takerBuyBaseVolume, takerBuyQuoteVolume]) => ({\n openTime,\n open: Number(open),\n high: Number(high),\n low: Number(low),\n close: Number(close),\n volume: Number(volume),\n closeTime,\n quoteAssetVolume: Number(quoteAssetVolume),\n trades,\n takerBuyBaseVolume: Number(takerBuyBaseVolume),\n takerBuyQuoteVolume: Number(takerBuyQuoteVolume),\n }),\n);\nexport type Kline = z.infer<typeof KlineSchema>;\nexport const KlinesResponseSchema = z.array(KlineSchema);\n\nexport const TickerPriceSchema = z.object({\n symbol: z.string(),\n price: z.string().transform(Number),\n time: z.number().optional(),\n});\nexport type TickerPrice = z.infer<typeof TickerPriceSchema>;\n\nexport const Ticker24hrSchema = z.object({\n symbol: z.string(),\n priceChange: z.string().transform(Number),\n priceChangePercent: z.string().transform(Number),\n weightedAvgPrice: z.string().transform(Number),\n lastPrice: z.string().transform(Number),\n lastQty: z.string().transform(Number),\n openPrice: z.string().transform(Number),\n highPrice: z.string().transform(Number),\n lowPrice: z.string().transform(Number),\n volume: z.string().transform(Number),\n quoteVolume: z.string().transform(Number),\n openTime: z.number(),\n closeTime: z.number(),\n firstId: z.number(),\n lastId: z.number(),\n count: z.number(),\n});\nexport type Ticker24hr = z.infer<typeof Ticker24hrSchema>;\n\nexport const BookTickerSchema = z.object({\n symbol: z.string(),\n bidPrice: z.string().transform(Number),\n bidQty: z.string().transform(Number),\n askPrice: z.string().transform(Number),\n askQty: z.string().transform(Number),\n time: z.number().optional(),\n});\nexport type BookTicker = z.infer<typeof BookTickerSchema>;\n\nconst DepthLevelSchema = z\n .tuple([z.string(), z.string()])\n .transform(([price, qty]) => ({ price: Number(price), qty: Number(qty) }));\n\nexport const DepthSnapshotSchema = z.object({\n lastUpdateId: z.number(),\n bids: z.array(DepthLevelSchema),\n asks: z.array(DepthLevelSchema),\n});\nexport type DepthSnapshot = z.infer<typeof DepthSnapshotSchema>;\n\nexport const TradeSchema = z.object({\n id: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n time: z.number(),\n isBuyerMaker: z.boolean(),\n});\nexport type Trade = z.infer<typeof TradeSchema>;\nexport const TradesResponseSchema = z.array(TradeSchema);\n\nexport const AggTradeSchema = z.object({\n a: z.number(),\n p: z.string().transform(Number),\n q: z.string().transform(Number),\n f: z.number(),\n l: z.number(),\n T: z.number(),\n m: z.boolean(),\n});\nexport type AggTrade = z.infer<typeof AggTradeSchema>;\nexport const AggTradesResponseSchema = z.array(AggTradeSchema);\n\nexport const AvgPriceSchema = z.object({\n mins: z.number(),\n price: z.string().transform(Number),\n});\nexport type AvgPrice = z.infer<typeof AvgPriceSchema>;\n\nexport const ExchangeSymbolSchema = z\n .object({\n symbol: z.string(),\n status: z.string(),\n baseAsset: z.string(),\n quoteAsset: z.string(),\n })\n .loose();\nexport type ExchangeSymbol = z.infer<typeof ExchangeSymbolSchema>;\n\nexport const ExchangeInfoSchema = z\n .object({\n timezone: z.string(),\n serverTime: z.number(),\n symbols: z.array(ExchangeSymbolSchema),\n })\n .loose();\nexport type ExchangeInfo = z.infer<typeof ExchangeInfoSchema>;\n","import type { HttpClient } from '../client/HttpClient.js';\nimport {\n AggTrade,\n AggTradesResponseSchema,\n BookTicker,\n BookTickerSchema,\n DepthSnapshot,\n DepthSnapshotSchema,\n ExchangeInfo,\n ExchangeInfoSchema,\n Kline,\n KlineInterval,\n KlinesResponseSchema,\n Ticker24hr,\n Ticker24hrSchema,\n TickerPrice,\n TickerPriceSchema,\n Trade,\n TradesResponseSchema,\n} from '../types/market.types.js';\n\nexport class MarketDataBase {\n constructor(protected readonly http: HttpClient) {}\n\n async exchangeInfo(): Promise<ExchangeInfo> {\n return ExchangeInfoSchema.parse(await this.http.get('/exchangeInfo'));\n }\n\n async ping(): Promise<Record<string, unknown>> {\n return this.http.get('/ping');\n }\n\n async serverTime(): Promise<{ serverTime: number }> {\n return this.http.get('/time');\n }\n\n async historicalTrades(symbol: string, options?: { fromId?: number; limit?: number }): Promise<Trade[]> {\n const data = await this.http.get('/historicalTrades', {\n symbol,\n fromId: options?.fromId,\n limit: options?.limit ?? 500,\n });\n return TradesResponseSchema.parse(data);\n }\n\n async klines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/klines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async tickerPrice(symbol: string): Promise<TickerPrice> {\n return TickerPriceSchema.parse(await this.http.get('/ticker/price', { symbol }));\n }\n\n async ticker24hr(symbol: string): Promise<Ticker24hr> {\n return Ticker24hrSchema.parse(await this.http.get('/ticker/24hr', { symbol }));\n }\n\n async bookTicker(symbol: string): Promise<BookTicker> {\n return BookTickerSchema.parse(await this.http.get('/ticker/bookTicker', { symbol }));\n }\n\n async depth(symbol: string, limit = 100): Promise<DepthSnapshot> {\n return DepthSnapshotSchema.parse(await this.http.get('/depth', { symbol, limit }));\n }\n\n async trades(symbol: string, limit = 500): Promise<Trade[]> {\n return TradesResponseSchema.parse(await this.http.get('/trades', { symbol, limit }));\n }\n\n async aggTrades(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<AggTrade[]> {\n const data = await this.http.get('/aggTrades', {\n symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return AggTradesResponseSchema.parse(data);\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { MarketDataBase } from './MarketDataBase.js';\nimport {\n Kline,\n KlinesResponseSchema,\n KlineInterval,\n TickerPrice,\n TickerPriceSchema,\n BookTicker,\n BookTickerSchema,\n DepthSnapshot,\n DepthSnapshotSchema,\n ExchangeInfo,\n ExchangeInfoSchema,\n} from '../types/market.types.js';\n\nexport class FuturesMarket extends MarketDataBase {\n private readonly rootHttp: HttpClient;\n\n constructor(http?: HttpClient, restRoot?: string) {\n super(http ?? new HttpClient({ baseURL: 'https://fapi.binance.com/fapi/v1' }));\n this.rootHttp = new HttpClient({ baseURL: restRoot ?? 'https://fapi.binance.com' });\n }\n\n async continuousKlines(\n pair: string,\n contractType: 'perpetual' | 'current_quarter' | 'next_quarter',\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/continuousKlines', {\n pair,\n contractType,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async indexPriceKlines(\n pair: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/indexPriceKlines', {\n pair,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async markPriceKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/markPriceKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async premiumIndexKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/premiumIndexKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async rpiDepth(symbol: string, limit = 1000): Promise<DepthSnapshot> {\n return DepthSnapshotSchema.parse(await this.http.get('/rpiDepth', { symbol, limit }));\n }\n\n async tradingDayTicker(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/tradingDayTicker', params);\n }\n\n async tickerPriceV2(symbol?: string): Promise<TickerPrice[] | TickerPrice> {\n const params = symbol ? { symbol } : {};\n return TickerPriceSchema.parse(await this.rootHttp.get('/fapi/v2/ticker/price', params));\n }\n\n async bookTickerV2(symbol?: string): Promise<BookTicker[] | BookTicker> {\n const params = symbol ? { symbol } : {};\n return BookTickerSchema.parse(await this.rootHttp.get('/fapi/v2/ticker/bookTicker', params));\n }\n\n async instrumentDetails(symbol: string): Promise<ExchangeInfo['symbols'][number]> {\n const info = await ExchangeInfoSchema.parse(await this.http.get('/exchangeInfo'));\n const details = info.symbols.find((s) => s.symbol === symbol);\n if (!details) throw new Error(`Instrument ${symbol} not found`);\n return details;\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { MarketDataBase } from './MarketDataBase.js';\nimport { AvgPrice, AvgPriceSchema, Kline, KlineInterval, KlinesResponseSchema } from '../types/market.types.js';\n\nexport class SpotMarket extends MarketDataBase {\n constructor(http?: HttpClient) {\n super(http ?? new HttpClient({ baseURL: 'https://api.binance.com/api/v3' }));\n }\n\n async avgPrice(symbol: string): Promise<AvgPrice> {\n return AvgPriceSchema.parse(await this.http.get('/avgPrice', { symbol }));\n }\n\n /** Optimized klines endpoint (`/uiKlines`) with the same response shape as `/klines`. */\n async uiKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/uiKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n /** Rolling window ticker (`/ticker`). Omit `symbol` for all symbols. */\n async rollingWindowTicker(\n symbol?: string,\n windowSize?: '1d' | '7d' | '30d',\n ): Promise<unknown[] | unknown> {\n const params = { symbol, windowSize };\n return this.http.get('/ticker', params);\n }\n\n /** Trading-day ticker (`/ticker/tradingDay`). Omit `symbol` for all symbols. */\n async tradingDayTicker(\n symbol?: string,\n options?: { timeZone?: string; type?: 'FULL' | 'MINI' },\n ): Promise<unknown[] | unknown> {\n return this.http.get('/ticker/tradingDay', { symbol, ...options });\n }\n}\n","import { z } from 'zod';\n\n// ---- Spot order / OCO / trade ----\n\nexport const SpotOrderSchema = z\n .object({\n symbol: z.string(),\n orderId: z.number(),\n clientOrderId: z.string(),\n status: z.string(),\n side: z.string(),\n type: z.string(),\n timeInForce: z.string().optional(),\n price: z.string().transform(Number).optional(),\n origQty: z.string().transform(Number).optional(),\n executedQty: z.string().transform(Number).optional(),\n cummulativeQuoteQty: z.string().transform(Number).optional(),\n stopPrice: z.string().transform(Number).optional(),\n icebergQty: z.string().transform(Number).optional(),\n originalQuoteOrderQty: z.string().transform(Number).optional(),\n transactTime: z.number().optional(),\n workingTime: z.number().optional(),\n orderListId: z.number().optional(),\n selfTradePreventionMode: z.string().optional(),\n fills: z.array(z.unknown()).optional(),\n })\n .loose();\nexport type SpotOrder = z.infer<typeof SpotOrderSchema>;\nexport const SpotOrderResponseSchema = SpotOrderSchema;\nexport const SpotOrdersResponseSchema = z.array(SpotOrderSchema);\n\nexport const SpotOCOOrderAckSchema = z\n .object({\n orderListId: z.number(),\n contingencyType: z.string(),\n listStatusType: z.string(),\n listOrderStatus: z.string(),\n listClientOrderId: z.string(),\n transactionTime: z.number(),\n symbol: z.string(),\n orders: z.array(SpotOrderSchema),\n orderReports: z.array(z.unknown()).optional(),\n })\n .loose();\nexport type SpotOCOOrderAck = z.infer<typeof SpotOCOOrderAckSchema>;\nexport const SpotOCOOrderAckResponseSchema = SpotOCOOrderAckSchema;\nexport const SpotOCOOrdersResponseSchema = z.array(SpotOCOOrderAckSchema);\n\nexport const SpotTradeSchema = z\n .object({\n symbol: z.string(),\n id: z.number(),\n orderId: z.number(),\n orderListId: z.number().optional(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n time: z.number(),\n isBuyer: z.boolean(),\n isMaker: z.boolean(),\n isBestMatch: z.boolean(),\n })\n .loose();\nexport type SpotTrade = z.infer<typeof SpotTradeSchema>;\nexport const SpotTradesResponseSchema = z.array(SpotTradeSchema);\n\n// ---- Spot account ----\n\nexport const SpotBalanceSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n});\nexport type SpotBalance = z.infer<typeof SpotBalanceSchema>;\n\nexport const SpotAccountSchema = z\n .object({\n makerCommission: z.number(),\n takerCommission: z.number(),\n buyerCommission: z.number(),\n sellerCommission: z.number(),\n canTrade: z.boolean(),\n canWithdraw: z.boolean(),\n canDeposit: z.boolean(),\n updateTime: z.number().optional(),\n accountType: z.string().optional(),\n balances: z.array(SpotBalanceSchema),\n permissions: z.array(z.string()).optional(),\n })\n .loose();\nexport type SpotAccountInfo = z.infer<typeof SpotAccountSchema>;\n\n// ---- Spot user data stream events (listenKey stream) ----\n\nexport const SpotExecutionReportSchema = z.object({ e: z.literal('executionReport') }).loose();\nexport type SpotExecutionReport = z.infer<typeof SpotExecutionReportSchema>;\n\nexport const SpotOutboundAccountPositionSchema = z\n .object({ e: z.literal('outboundAccountPosition') })\n .loose();\nexport type SpotOutboundAccountPosition = z.infer<typeof SpotOutboundAccountPositionSchema>;\n\nexport const SpotBalanceUpdateSchema = z.object({ e: z.literal('balanceUpdate') }).loose();\nexport type SpotBalanceUpdate = z.infer<typeof SpotBalanceUpdateSchema>;\n\nexport const SpotListStatusSchema = z.object({ e: z.literal('listStatus') }).loose();\nexport type SpotListStatus = z.infer<typeof SpotListStatusSchema>;\n\nexport type SpotUserDataEvent =\n | SpotExecutionReport\n | SpotOutboundAccountPosition\n | SpotBalanceUpdate\n | SpotListStatus;\n\nexport function parseSpotUserDataEvent(raw: unknown): SpotUserDataEvent {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Invalid spot user-data payload');\n }\n const eventType = (raw as { e?: string }).e;\n if (eventType === 'executionReport') return SpotExecutionReportSchema.parse(raw);\n if (eventType === 'outboundAccountPosition') return SpotOutboundAccountPositionSchema.parse(raw);\n if (eventType === 'balanceUpdate') return SpotBalanceUpdateSchema.parse(raw);\n if (eventType === 'listStatus') return SpotListStatusSchema.parse(raw);\n throw new Error(`Unknown spot user-data event type: ${eventType}`);\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n SpotAccountInfo,\n SpotAccountSchema,\n SpotOCOOrderAck,\n SpotOCOOrderAckResponseSchema,\n SpotOCOOrdersResponseSchema,\n SpotOrder,\n SpotOrderSchema,\n SpotOrdersResponseSchema,\n SpotTrade,\n SpotTradesResponseSchema,\n} from '../types/spot.types.js';\n\nexport class SpotTrading {\n constructor(private readonly http: HttpClient) {}\n\n async createOrder(params: Record<string, unknown>): Promise<SpotOrder> {\n return SpotOrderSchema.parse(await this.http.post('/order', params, 'signed'));\n }\n\n async testOrder(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.http.post('/order/test', params, 'signed');\n }\n\n async getOrder(symbol: string, options?: { orderId?: number; origClientOrderId?: string }): Promise<SpotOrder> {\n return SpotOrderSchema.parse(\n await this.http.get('/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string; newClientOrderId?: string },\n ): Promise<SpotOrder> {\n return SpotOrderSchema.parse(\n await this.http.delete('/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOpenOrders(symbol: string): Promise<SpotOrder[]> {\n return SpotOrdersResponseSchema.parse(\n await this.http.delete('/openOrders', { symbol }, 'signed'),\n );\n }\n\n async getOpenOrders(symbol?: string): Promise<SpotOrder[]> {\n const params = symbol ? { symbol } : {};\n return SpotOrdersResponseSchema.parse(await this.http.get('/openOrders', params, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<SpotOrder[]> {\n return SpotOrdersResponseSchema.parse(\n await this.http.get('/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelReplaceOrder(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.http.post('/order/cancelReplace', params, 'signed');\n }\n\n // ---- OCO order lists ----\n\n async createOCOOrder(params: Record<string, unknown>): Promise<SpotOCOOrderAck> {\n return SpotOCOOrderAckResponseSchema.parse(\n await this.http.post('/orderList', params, 'signed'),\n );\n }\n\n async cancelOCOOrder(\n symbol: string,\n options?: { orderListId?: number; listClientOrderId?: string; newClientOrderId?: string },\n ): Promise<SpotOCOOrderAck> {\n return SpotOCOOrderAckResponseSchema.parse(\n await this.http.delete('/orderList', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOCOOrder(\n symbol: string,\n options?: { orderListId?: number; origClientOrderId?: string },\n ): Promise<SpotOCOOrderAck> {\n return SpotOCOOrderAckResponseSchema.parse(\n await this.http.get('/orderList', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenOCOOrders(): Promise<SpotOCOOrderAck[]> {\n return SpotOCOOrdersResponseSchema.parse(\n await this.http.get('/openOrderLists', undefined, 'signed'),\n );\n }\n\n async getAllOCOOrders(\n symbol: string,\n options?: { fromId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<SpotOCOOrderAck[]> {\n return SpotOCOOrdersResponseSchema.parse(\n await this.http.get('/allOrderLists', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOpenOCOOrders(symbol: string): Promise<SpotOCOOrderAck[]> {\n return SpotOCOOrdersResponseSchema.parse(\n await this.http.delete('/openOrderLists', { symbol }, 'signed'),\n );\n }\n}\n\nexport class SpotAccount {\n constructor(private readonly http: HttpClient) {}\n\n async account(): Promise<SpotAccountInfo> {\n return SpotAccountSchema.parse(await this.http.get('/account', undefined, 'signed'));\n }\n\n async myTrades(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; fromId?: number; limit?: number },\n ): Promise<SpotTrade[]> {\n return SpotTradesResponseSchema.parse(\n await this.http.get('/myTrades', { symbol, ...options }, 'signed'),\n );\n }\n\n async myPreventedMatches(\n symbol: string,\n options?: {\n preventedMatchId?: number;\n orderId?: number;\n fromPreventedMatchId?: number;\n limit?: number;\n },\n ): Promise<unknown[]> {\n return this.http.get('/myPreventedMatches', { symbol, ...options }, 'signed');\n }\n\n async accountCommission(symbol: string): Promise<Record<string, unknown>> {\n return this.http.get('/account/commission', { symbol }, 'signed');\n }\n\n async rateLimitOrder(): Promise<unknown[]> {\n return this.http.get('/rateLimit/order', undefined, 'signed');\n }\n}\n","import { z } from 'zod';\n\nexport const ListenKeySchema = z.object({\n listenKey: z.string(),\n});\nexport type ListenKey = z.infer<typeof ListenKeySchema>;\n\nexport const UserDataAccountUpdateSchema = z.object({\n e: z.literal('ACCOUNT_UPDATE'),\n E: z.number(),\n T: z.number(),\n a: z.object({\n m: z.string().transform(Number),\n B: z.array(\n z.object({\n a: z.string(),\n wb: z.string().transform(Number),\n cw: z.string().transform(Number),\n bc: z.string().transform(Number),\n }),\n ),\n P: z.array(\n z.object({\n s: z.string(),\n pa: z.string().transform(Number),\n ep: z.string().transform(Number),\n cr: z.string().transform(Number),\n up: z.string().transform(Number),\n mt: z.string(),\n iw: z.string().transform(Number).optional(),\n ps: z.string(),\n }),\n ),\n }),\n});\nexport type UserDataAccountUpdate = z.infer<typeof UserDataAccountUpdateSchema>;\n\nexport const UserDataOrderTradeUpdateSchema = z.object({\n e: z.literal('ORDER_TRADE_UPDATE'),\n E: z.number(),\n T: z.number(),\n o: z.object({\n s: z.string(),\n c: z.string(),\n i: z.number(),\n S: z.string(),\n o: z.string(),\n f: z.string(),\n q: z.string().transform(Number),\n p: z.string().transform(Number),\n ap: z.string().transform(Number),\n sp: z.string().transform(Number),\n x: z.string(),\n X: z.string(),\n l: z.string().transform(Number),\n z: z.string().transform(Number),\n L: z.string().transform(Number),\n n: z.string().transform(Number),\n N: z.string(),\n T: z.number(),\n t: z.number(),\n b: z.string().transform(Number),\n a: z.string().transform(Number),\n m: z.boolean(),\n R: z.boolean(),\n wt: z.string(),\n ot: z.string(),\n ps: z.string(),\n cp: z.boolean().optional(),\n AP: z.string().transform(Number).optional(),\n cr: z.string().transform(Number).optional(),\n rp: z.string().transform(Number).optional(),\n }),\n});\nexport type UserDataOrderTradeUpdate = z.infer<typeof UserDataOrderTradeUpdateSchema>;\n\nexport const UserDataMarginCallSchema = z.object({\n e: z.literal('MARGIN_CALL'),\n E: z.number(),\n cw: z.string().transform(Number),\n p: z.array(\n z.object({\n s: z.string(),\n ps: z.string(),\n pa: z.string().transform(Number),\n mt: z.string(),\n iw: z.string().transform(Number),\n mp: z.string().transform(Number),\n up: z.string().transform(Number),\n mm: z.string().transform(Number),\n }),\n ),\n});\nexport type UserDataMarginCall = z.infer<typeof UserDataMarginCallSchema>;\n\nexport type UserDataEvent = UserDataAccountUpdate | UserDataOrderTradeUpdate | UserDataMarginCall;\n\nexport function parseUserDataEvent(raw: unknown): UserDataEvent {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Invalid user-data payload');\n }\n const eventType = (raw as { e?: string }).e;\n if (eventType === 'ACCOUNT_UPDATE') return UserDataAccountUpdateSchema.parse(raw);\n if (eventType === 'ORDER_TRADE_UPDATE') return UserDataOrderTradeUpdateSchema.parse(raw);\n if (eventType === 'MARGIN_CALL') return UserDataMarginCallSchema.parse(raw);\n throw new Error(`Unknown user-data event type: ${eventType}`);\n}\n\nexport const WsApiResponseSchema = z.object({\n id: z.string(),\n status: z.number(),\n result: z.unknown(),\n error: z\n .object({\n code: z.number(),\n msg: z.string(),\n })\n .optional(),\n});\nexport type WsApiResponse = z.infer<typeof WsApiResponseSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport { ListenKey, ListenKeySchema } from '../types/userdata.types.js';\n\nexport class SpotUserDataStream {\n constructor(private readonly http: HttpClient) {}\n\n async createListenKey(): Promise<ListenKey> {\n return ListenKeySchema.parse(await this.http.post('/userDataStream', undefined, 'apiKey'));\n }\n\n async keepAliveListenKey(): Promise<Record<string, unknown>> {\n return this.http.put('/userDataStream', undefined, 'apiKey');\n }\n\n async closeListenKey(): Promise<Record<string, unknown>> {\n return this.http.delete('/userDataStream', undefined, 'apiKey');\n }\n}\n","import { z } from 'zod';\n\nexport const BalanceSchema = z.object({\n accountAlias: z.string(),\n asset: z.string(),\n balance: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n marginAvailable: z.boolean(),\n updateTime: z.number(),\n});\nexport type Balance = z.infer<typeof BalanceSchema>;\nexport const BalancesResponseSchema = z.array(BalanceSchema);\n\nexport const PositionRiskSchema = z.object({\n symbol: z.string(),\n positionAmt: z.string().transform(Number),\n entryPrice: z.string().transform(Number),\n markPrice: z.string().transform(Number),\n unRealizedProfit: z.string().transform(Number),\n liquidationPrice: z.string().transform(Number),\n leverage: z.string().transform(Number),\n marginType: z.enum(['isolated', 'cross']),\n positionSide: z.string(),\n isolatedWallet: z.string().transform(Number).optional(),\n isolatedMargin: z.string().transform(Number).optional(),\n notional: z.string().transform(Number),\n updateTime: z.number().optional(),\n});\nexport type PositionRisk = z.infer<typeof PositionRiskSchema>;\nexport const PositionRiskResponseSchema = z.array(PositionRiskSchema);\n\nexport const AccountAssetSchema = z.object({\n asset: z.string(),\n walletBalance: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n marginBalance: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n marginAvailable: z.boolean().optional(),\n updateTime: z.number(),\n});\nexport type AccountAsset = z.infer<typeof AccountAssetSchema>;\n\nexport const AccountPositionSchema = z.object({\n symbol: z.string(),\n positionAmt: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n leverage: z.string().transform(Number),\n isolated: z.boolean(),\n entryPrice: z.string().transform(Number),\n positionSide: z.string(),\n positionNotional: z.string().transform(Number),\n isolatedWallet: z.string().transform(Number).optional(),\n isolatedMargin: z.string().transform(Number).optional(),\n notional: z.string().transform(Number).optional(),\n});\nexport type AccountPosition = z.infer<typeof AccountPositionSchema>;\n\nexport const AccountSchema = z.object({\n feeTier: z.number(),\n canTrade: z.boolean(),\n canDeposit: z.boolean(),\n canWithdraw: z.boolean(),\n updateTime: z.number(),\n totalInitialMargin: z.string().transform(Number),\n totalMaintMargin: z.string().transform(Number),\n totalWalletBalance: z.string().transform(Number),\n totalUnrealizedProfit: z.string().transform(Number),\n totalMarginBalance: z.string().transform(Number),\n totalPositionInitialMargin: z.string().transform(Number),\n totalOpenOrderInitialMargin: z.string().transform(Number),\n totalCrossWalletBalance: z.string().transform(Number),\n totalCrossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n assets: z.array(AccountAssetSchema),\n positions: z.array(AccountPositionSchema),\n});\nexport type Account = z.infer<typeof AccountSchema>;\n\nexport const IncomeSchema = z.object({\n symbol: z.string().optional(),\n incomeType: z.string(),\n income: z.string().transform(Number),\n asset: z.string(),\n time: z.number(),\n info: z.string().optional(),\n tranId: z.number(),\n tradeId: z.string().optional(),\n});\nexport type Income = z.infer<typeof IncomeSchema>;\nexport const IncomeHistoryResponseSchema = z.array(IncomeSchema);\n\nexport const UserTradeSchema = z.object({\n buyer: z.boolean(),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n id: z.number(),\n maker: z.boolean(),\n orderId: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n realizedPnl: z.string().transform(Number),\n side: z.string(),\n positionSide: z.string(),\n symbol: z.string(),\n time: z.number(),\n});\nexport type UserTrade = z.infer<typeof UserTradeSchema>;\nexport const UserTradesResponseSchema = z.array(UserTradeSchema);\n\nexport const CommissionRateSchema = z.object({\n symbol: z.string(),\n makerCommissionRate: z.string().transform(Number),\n takerCommissionRate: z.string().transform(Number),\n});\nexport type CommissionRate = z.infer<typeof CommissionRateSchema>;\n\nexport const LeverageBracketSchema = z.object({\n symbol: z.string().optional(),\n bracketNotional: z.string().transform(Number).optional(),\n bracket: z.number().optional(),\n maxLeverage: z.number().optional(),\n maintMarginRatio: z.string().transform(Number).optional(),\n cum: z.string().transform(Number).optional(),\n});\nexport type LeverageBracket = z.infer<typeof LeverageBracketSchema>;\nexport const LeverageBracketResponseSchema = z.array(\n z.object({\n symbol: z.string(),\n brackets: z.array(LeverageBracketSchema),\n }),\n);\n\nexport const PositionModeSchema = z.object({\n dualSidePosition: z.boolean(),\n});\nexport type PositionMode = z.infer<typeof PositionModeSchema>;\n\nexport const MultiAssetsMarginSchema = z.object({\n multiAssetsMargin: z.boolean(),\n});\nexport type MultiAssetsMargin = z.infer<typeof MultiAssetsMarginSchema>;\n\nexport const FeeBurnStatusSchema = z.object({\n feeBurn: z.boolean(),\n});\nexport type FeeBurnStatus = z.infer<typeof FeeBurnStatusSchema>;\n\nexport const PositionMarginHistoryEntrySchema = z.object({\n amount: z.string().transform(Number),\n asset: z.string(),\n symbol: z.string(),\n time: z.number(),\n type: z.number(),\n positionSide: z.string(),\n});\nexport type PositionMarginHistoryEntry = z.infer<typeof PositionMarginHistoryEntrySchema>;\nexport const PositionMarginHistorySchema = z.array(PositionMarginHistoryEntrySchema);\n\nexport const ApiTradingStatusSchema = z.object({\n isLocked: z.boolean(),\n plannedRecoverTime: z.number(),\n updateTime: z.number(),\n triggerCondition: z.record(z.string(), z.number()).optional(),\n indicators: z.record(z.string(), z.unknown()).optional(),\n});\nexport type ApiTradingStatus = z.infer<typeof ApiTradingStatusSchema>;\n\nexport const RateLimitOrderSchema = z.object({\n rateLimitType: z.string(),\n interval: z.string(),\n intervalNum: z.number(),\n limit: z.number(),\n count: z.number(),\n});\nexport type RateLimitOrder = z.infer<typeof RateLimitOrderSchema>;\nexport const RateLimitOrderResponseSchema = z.array(RateLimitOrderSchema);\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n Account,\n AccountSchema,\n ApiTradingStatus,\n ApiTradingStatusSchema,\n Balance,\n BalancesResponseSchema,\n CommissionRate,\n CommissionRateSchema,\n FeeBurnStatus,\n FeeBurnStatusSchema,\n Income,\n IncomeHistoryResponseSchema,\n LeverageBracket,\n LeverageBracketResponseSchema,\n MultiAssetsMargin,\n MultiAssetsMarginSchema,\n PositionMarginHistoryEntry,\n PositionMarginHistorySchema,\n PositionMode,\n PositionModeSchema,\n PositionRisk,\n PositionRiskResponseSchema,\n RateLimitOrder,\n RateLimitOrderResponseSchema,\n UserTrade,\n UserTradesResponseSchema,\n} from '../types/account.types.js';\n\nexport class FuturesAccount {\n constructor(private readonly http: HttpClient) {}\n\n async balance(): Promise<Balance[]> {\n return BalancesResponseSchema.parse(await this.http.get('/fapi/v2/balance', undefined, 'signed'));\n }\n\n async account(): Promise<Account> {\n return AccountSchema.parse(await this.http.get('/fapi/v2/account', undefined, 'signed'));\n }\n\n async positionRisk(symbol?: string): Promise<PositionRisk[]> {\n const params = symbol ? { symbol } : {};\n return PositionRiskResponseSchema.parse(await this.http.get('/fapi/v2/positionRisk', params, 'signed'));\n }\n\n async balanceV3(): Promise<Balance[]> {\n return BalancesResponseSchema.parse(await this.http.get('/fapi/v3/balance', undefined, 'signed'));\n }\n\n async accountV3(): Promise<Account> {\n return AccountSchema.parse(await this.http.get('/fapi/v3/account', undefined, 'signed'));\n }\n\n async positionRiskV3(symbol?: string): Promise<PositionRisk[]> {\n const params = symbol ? { symbol } : {};\n return PositionRiskResponseSchema.parse(await this.http.get('/fapi/v3/positionRisk', params, 'signed'));\n }\n\n async incomeHistory(options?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<Income[]> {\n const params = {\n symbol: options?.symbol,\n incomeType: options?.incomeType,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n };\n return IncomeHistoryResponseSchema.parse(await this.http.get('/fapi/v1/income', params, 'signed'));\n }\n\n async userTrades(options?: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n fromId?: number;\n }): Promise<UserTrade[]> {\n const params = {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n fromId: options?.fromId,\n };\n return UserTradesResponseSchema.parse(await this.http.get('/fapi/v1/userTrades', params, 'signed'));\n }\n\n async leverageBrackets(symbol?: string): Promise<{ symbol: string; brackets: LeverageBracket[] }[]> {\n const params = symbol ? { symbol } : {};\n return LeverageBracketResponseSchema.parse(await this.http.get('/fapi/v1/leverageBracket', params, 'signed'));\n }\n\n async commissionRate(symbol: string): Promise<CommissionRate> {\n return CommissionRateSchema.parse(await this.http.get('/fapi/v1/commissionRate', { symbol }, 'signed'));\n }\n\n async multiAssetsMargin(): Promise<MultiAssetsMargin> {\n return MultiAssetsMarginSchema.parse(await this.http.get('/fapi/v1/multiAssetsMargin', undefined, 'signed'));\n }\n\n async setMultiAssetsMargin(multiAssetsMargin: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/multiAssetsMargin', { multiAssetsMargin }, 'signed');\n }\n\n async feeBurnStatus(): Promise<FeeBurnStatus> {\n return FeeBurnStatusSchema.parse(await this.http.get('/fapi/v1/feeBurn', undefined, 'signed'));\n }\n\n async setFeeBurnStatus(feeBurn: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/feeBurn', { feeBurn }, 'signed');\n }\n\n async positionMode(): Promise<PositionMode> {\n return PositionModeSchema.parse(await this.http.get('/fapi/v1/positionSide/dual', undefined, 'signed'));\n }\n\n async setPositionMode(dualSidePosition: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/positionSide/dual', { dualSidePosition }, 'signed');\n }\n\n async apiTradingStatus(): Promise<ApiTradingStatus> {\n return ApiTradingStatusSchema.parse(await this.http.get('/fapi/v1/apiTradingStatus', undefined, 'signed'));\n }\n\n async positionMarginHistory(options?: {\n symbol: string;\n type?: number;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<PositionMarginHistoryEntry[]> {\n const params = {\n symbol: options?.symbol,\n type: options?.type,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n };\n return PositionMarginHistorySchema.parse(await this.http.get('/fapi/v1/positionMargin/history', params, 'signed'));\n }\n\n async rateLimitOrder(): Promise<RateLimitOrder[]> {\n return RateLimitOrderResponseSchema.parse(await this.http.get('/fapi/v1/rateLimit/order', undefined, 'signed'));\n }\n\n async accountConfig(): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/accountConfig', undefined, 'signed');\n }\n\n async pmAccountInfo(asset: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/pmAccountInfo', { asset }, 'signed');\n }\n\n async requestIncomeDownload(options: { startTime: number; endTime: number }): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/income/asyn', options, 'signed');\n }\n\n async getIncomeDownloadStatus(downloadId: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/income/asyn/id', { downloadId }, 'signed');\n }\n\n async requestOrderDownload(options?: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n }): Promise<Record<string, unknown>> {\n const params = {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n };\n return this.http.get('/fapi/v1/order/asyn', params, 'signed');\n }\n\n async getOrderDownloadStatus(downloadId: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/order/asyn/id', { downloadId }, 'signed');\n }\n\n async requestTradeDownload(options?: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n }): Promise<Record<string, unknown>> {\n const params = {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n };\n return this.http.get('/fapi/v1/trade/asyn', params, 'signed');\n }\n\n async getTradeDownloadStatus(downloadId: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/trade/asyn/id', { downloadId }, 'signed');\n }\n}\n","import { z } from 'zod';\n\nexport const OrderSchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumQuote: z.string().transform(Number),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n stopPrice: z.string().transform(Number).optional(),\n closePosition: z.boolean().optional(),\n timeInForce: z.string().optional(),\n origType: z.string().optional(),\n time: z.number(),\n updateTime: z.number(),\n workingType: z.string().optional(),\n priceProtect: z.boolean().optional(),\n});\nexport type Order = z.infer<typeof OrderSchema>;\nexport const OrderResponseSchema = OrderSchema;\nexport const OrdersResponseSchema = z.array(OrderSchema);\n\nexport const CreateOrderParamsSchema = z.object({\n symbol: z.string(),\n side: z.enum(['BUY', 'SELL']),\n type: z.string(),\n quantity: z.union([z.string(), z.number()]).optional(),\n price: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX', 'GTD']).optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n reduceOnly: z.boolean().optional(),\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional(),\n newClientOrderId: z.string().optional(),\n closePosition: z.boolean().optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT']).optional(),\n priceProtect: z.boolean().optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional(),\n callbackRate: z.union([z.string(), z.number()]).optional(),\n activationPrice: z.union([z.string(), z.number()]).optional(),\n selfTradePreventionMode: z.enum(['NONE', 'EXPIRE_TAKER', 'EXPIRE_MAKER', 'EXPIRE_BOTH']).optional(),\n goodTillDate: z.number().optional(),\n});\nexport type CreateOrderParams = z.infer<typeof CreateOrderParamsSchema>;\n\nexport const ModifyOrderParamsSchema = CreateOrderParamsSchema.extend({\n orderId: z.number().optional(),\n origClientOrderId: z.string().optional(),\n origType: z.string().optional(),\n});\nexport type ModifyOrderParams = z.infer<typeof ModifyOrderParamsSchema>;\n\nexport const AlgoOrderSchema = z.object({\n algoId: z.number(),\n symbol: z.string(),\n side: z.string(),\n positionSide: z.string(),\n totalQty: z.string().transform(Number).optional(),\n executedQty: z.string().transform(Number).optional(),\n executedAmt: z.string().transform(Number).optional(),\n avgPrice: z.string().transform(Number).optional(),\n clientAlgoId: z.string().optional(),\n bookTime: z.number().optional(),\n endTime: z.number().optional(),\n algoStatus: z.string().optional(),\n algoType: z.string().optional(),\n urgency: z.string().optional(),\n});\nexport type AlgoOrder = z.infer<typeof AlgoOrderSchema>;\nexport const AlgoOrderResponseSchema = AlgoOrderSchema;\nexport const AlgoOrdersResponseSchema = z.array(AlgoOrderSchema);\n\nexport const BatchOrdersItemSchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumQuote: z.string().transform(Number),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n time: z.number(),\n updateTime: z.number(),\n});\nexport type BatchOrdersItem = z.infer<typeof BatchOrdersItemSchema>;\nexport const BatchOrdersResponseSchema = z.array(BatchOrdersItemSchema);\n\nexport const OrderModifyHistoryEntrySchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumQuote: z.string().transform(Number),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n origType: z.string().optional(),\n stopPrice: z.string().transform(Number).optional(),\n updateTime: z.number(),\n});\nexport type OrderModifyHistoryEntry = z.infer<typeof OrderModifyHistoryEntrySchema>;\nexport const OrderModifyHistorySchema = z.array(OrderModifyHistoryEntrySchema);\n\nexport const LeverageChangeSchema = z.object({\n leverage: z.number(),\n maxNotionalValue: z.union([z.string(), z.number()]),\n symbol: z.string(),\n});\nexport type LeverageChange = z.infer<typeof LeverageChangeSchema>;\n\nexport const MarginTypeChangeSchema = z.object({\n code: z.number(),\n msg: z.string(),\n});\nexport type MarginTypeChange = z.infer<typeof MarginTypeChangeSchema>;\n\nexport const PositionMarginChangeSchema = z.object({\n amount: z.number(),\n code: z.number(),\n msg: z.string(),\n type: z.number(),\n});\nexport type PositionMarginChange = z.infer<typeof PositionMarginChangeSchema>;\n\nexport const CountdownCancelAllSchema = z.object({\n symbol: z.string(),\n countdownTime: z.number(),\n});\nexport type CountdownCancelAll = z.infer<typeof CountdownCancelAllSchema>;\n\nexport const NewOrderAckSchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string(),\n avgPrice: z.string(),\n origQty: z.string(),\n executedQty: z.string(),\n cumQuote: z.string(),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n timeInForce: z.string().optional(),\n time: z.number(),\n updateTime: z.number(),\n workingType: z.string().optional(),\n origType: z.string().optional(),\n closePosition: z.boolean().optional(),\n});\nexport type NewOrderAck = z.infer<typeof NewOrderAckSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n AlgoOrder,\n AlgoOrderResponseSchema,\n AlgoOrdersResponseSchema,\n BatchOrdersItem,\n BatchOrdersResponseSchema,\n CountdownCancelAll,\n CountdownCancelAllSchema,\n CreateOrderParams,\n LeverageChange,\n LeverageChangeSchema,\n MarginTypeChange,\n MarginTypeChangeSchema,\n ModifyOrderParams,\n NewOrderAck,\n NewOrderAckSchema,\n Order,\n OrderModifyHistoryEntry,\n OrderModifyHistorySchema,\n OrderResponseSchema,\n OrdersResponseSchema,\n PositionMarginChange,\n PositionMarginChangeSchema,\n} from '../types/trading.types.js';\n\nexport class FuturesTrading {\n constructor(private readonly http: HttpClient) {}\n\n async setLeverage(symbol: string, leverage: number): Promise<LeverageChange> {\n return LeverageChangeSchema.parse(\n await this.http.post('/fapi/v1/leverage', { symbol, leverage }, 'signed'),\n );\n }\n\n async createOrder(params: CreateOrderParams): Promise<NewOrderAck | Order> {\n return NewOrderAckSchema.parse(await this.http.post('/fapi/v1/order', params, 'signed'));\n }\n\n async createTestOrder(params: CreateOrderParams): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/order/test', params, 'signed');\n }\n\n async getOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string },\n ): Promise<Order> {\n return OrderResponseSchema.parse(\n await this.http.get('/fapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string },\n ): Promise<Order> {\n return OrderResponseSchema.parse(\n await this.http.delete('/fapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async getCurrentOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string },\n ): Promise<Order> {\n return OrderResponseSchema.parse(\n await this.http.get('/fapi/v1/openOrder', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenOrders(symbol?: string): Promise<Order[]> {\n const params = symbol ? { symbol } : {};\n return OrdersResponseSchema.parse(await this.http.get('/fapi/v1/openOrders', params, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<Order[]> {\n return OrdersResponseSchema.parse(\n await this.http.get('/fapi/v1/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelAllOpenOrders(symbol: string): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/allOpenOrders', { symbol }, 'signed');\n }\n\n async modifyOrder(params: ModifyOrderParams): Promise<Order> {\n return OrderResponseSchema.parse(await this.http.put('/fapi/v1/order', params, 'signed'));\n }\n\n async createAlgoOrder(params: Record<string, unknown>): Promise<AlgoOrder> {\n return AlgoOrderResponseSchema.parse(await this.http.post('/fapi/v1/algoOrder', params, 'signed'));\n }\n\n async cancelAlgoOrder(\n symbol: string,\n options?: { algoId?: number; clientAlgoId?: string },\n ): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/algoOrder', { symbol, ...options }, 'signed');\n }\n\n async cancelAllOpenAlgoOrders(symbol: string): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/algoOpenOrders', { symbol }, 'signed');\n }\n\n async getAlgoOrder(\n symbol: string,\n options?: { algoId?: number; clientAlgoId?: string },\n ): Promise<AlgoOrder> {\n return AlgoOrderResponseSchema.parse(\n await this.http.get('/fapi/v1/algoOrder', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenAlgoOrders(symbol?: string): Promise<AlgoOrder[]> {\n const params = symbol ? { symbol } : {};\n return AlgoOrdersResponseSchema.parse(await this.http.get('/fapi/v1/openAlgoOrders', params, 'signed'));\n }\n\n async getAllAlgoOrders(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<AlgoOrder[]> {\n return AlgoOrdersResponseSchema.parse(\n await this.http.get('/fapi/v1/allAlgoOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async createBatchOrders(batchOrders: CreateOrderParams[]): Promise<BatchOrdersItem[]> {\n return BatchOrdersResponseSchema.parse(\n await this.http.post('/fapi/v1/batchOrders', { batchOrders: JSON.stringify(batchOrders) }, 'signed'),\n );\n }\n\n async modifyBatchOrders(batchOrders: ModifyOrderParams[]): Promise<BatchOrdersItem[]> {\n return BatchOrdersResponseSchema.parse(\n await this.http.put('/fapi/v1/batchOrders', { batchOrders: JSON.stringify(batchOrders) }, 'signed'),\n );\n }\n\n async cancelBatchOrders(\n symbol: string,\n options?: { orderIdList?: number[]; origClientOrderIdList?: string[] },\n ): Promise<BatchOrdersItem[]> {\n const params: Record<string, unknown> = { symbol };\n if (options?.orderIdList?.length) params.orderIdList = JSON.stringify(options.orderIdList);\n if (options?.origClientOrderIdList?.length) {\n params.origClientOrderIdList = JSON.stringify(options.origClientOrderIdList);\n }\n return BatchOrdersResponseSchema.parse(await this.http.delete('/fapi/v1/batchOrders', params, 'signed'));\n }\n\n async getOrderModifyHistory(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<OrderModifyHistoryEntry[]> {\n return OrderModifyHistorySchema.parse(\n await this.http.get('/fapi/v1/orderAmendment', { symbol, ...options }, 'signed'),\n );\n }\n\n async setMarginType(symbol: string, marginType: 'isolated' | 'cross'): Promise<MarginTypeChange> {\n return MarginTypeChangeSchema.parse(\n await this.http.post('/fapi/v1/marginType', { symbol, marginType }, 'signed'),\n );\n }\n\n async modifyPositionMargin(symbol: string, amount: number, type: number): Promise<PositionMarginChange> {\n return PositionMarginChangeSchema.parse(\n await this.http.post('/fapi/v1/positionMargin', { symbol, amount, type }, 'signed'),\n );\n }\n\n async setCountdownCancelAll(symbol: string, countdownTime: number): Promise<CountdownCancelAll> {\n return CountdownCancelAllSchema.parse(\n await this.http.post('/fapi/v1/countdownCancelAll', { symbol, countdownTime }, 'signed'),\n );\n }\n\n async convertExchangeInfo(options?: { fromAsset?: string; toAsset?: string }): Promise<unknown[]> {\n return this.http.get('/fapi/v1/convert/exchangeInfo', options);\n }\n\n async convertGetQuote(params: {\n fromAsset: string;\n toAsset: string;\n fromAmount?: number;\n toAmount?: number;\n validTime?: '10s' | '30s' | '1m' | '2m';\n }): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/convert/getQuote', params, 'signed');\n }\n\n async convertAcceptQuote(quoteId: string): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/convert/acceptQuote', { quoteId }, 'signed');\n }\n\n async convertOrderStatus(options: { orderId?: string; quoteId?: string }): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/convert/orderStatus', options, 'signed');\n }\n}\n","import type { ExchangeSymbol } from './market.types.js';\n\n/**\n * Symbol trading rules, flattened out of the loose `filters` array that\n * `/fapi/v1/exchangeInfo` returns. Callers need these to round prices and\n * quantities before sending an order — Binance rejects anything that does not\n * sit exactly on a tick/step boundary (-1111) or that falls under the minimum\n * notional (-4164).\n */\nexport interface SymbolRules {\n symbol: string;\n status: string;\n baseAsset: string;\n quoteAsset: string;\n /** Tick the price must sit on, e.g. 0.10 for BTCUSDT. */\n tickSize: number;\n tickDecimals: number;\n /** Step the quantity must sit on for limit orders, e.g. 0.001 for BTCUSDT. */\n stepSize: number;\n stepDecimals: number;\n minQty: number;\n maxQty: number;\n /** MARKET orders carry their own LOT_SIZE, usually with a lower max. */\n marketStepSize: number;\n marketStepDecimals: number;\n marketMinQty: number;\n marketMaxQty: number;\n /** MIN_NOTIONAL — on USD-M futures the field is `notional`, not `minNotional`. */\n minNotional: number;\n}\n\ninterface RawFilter {\n filterType?: unknown;\n [key: string]: unknown;\n}\n\nfunction filtersOf(symbol: ExchangeSymbol): RawFilter[] {\n const raw = (symbol as unknown as Record<string, unknown>).filters;\n return Array.isArray(raw) ? (raw as RawFilter[]) : [];\n}\n\nfunction filterOf(symbol: ExchangeSymbol, filterType: string): RawFilter | undefined {\n return filtersOf(symbol).find((f) => f.filterType === filterType);\n}\n\nfunction num(value: unknown, fallback: number): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\n/**\n * Decimal places implied by a step string, e.g. \"0.00100000\" -> 3, \"1\" -> 0.\n * Derived from the string rather than the number so that a step like 0.0000001\n * never picks up an exponent representation.\n */\nexport function stepDecimals(step: string | number): number {\n const text = typeof step === 'number' ? step.toFixed(12) : String(step).trim();\n const dot = text.indexOf('.');\n if (dot === -1) return 0;\n return text.slice(dot + 1).replace(/0+$/, '').length;\n}\n\n/** Format a value at a fixed precision, which is what should be sent to Binance. */\nexport function formatToDecimals(value: number, decimals: number): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Round down onto a step boundary. Used for quantities, where rounding up would\n * silently take on more risk than the caller asked for. The epsilon absorbs\n * binary-float error so that e.g. 0.3 / 0.1 = 2.9999999999999996 still floors to 3.\n */\nexport function floorToStep(value: number, step: number, decimals = stepDecimals(step)): number {\n if (!(step > 0)) return value;\n const steps = Math.floor(value / step + 1e-9);\n return Number((steps * step).toFixed(decimals));\n}\n\n/** Round to the nearest step boundary. Used for prices, where direction is not a risk. */\nexport function roundToStep(value: number, step: number, decimals = stepDecimals(step)): number {\n if (!(step > 0)) return value;\n const steps = Math.round(value / step);\n return Number((steps * step).toFixed(decimals));\n}\n\n/** Flatten one `exchangeInfo.symbols[]` entry into typed trading rules. */\nexport function symbolRulesFrom(symbol: ExchangeSymbol): SymbolRules {\n const raw = symbol as unknown as Record<string, unknown>;\n const price = filterOf(symbol, 'PRICE_FILTER');\n const lot = filterOf(symbol, 'LOT_SIZE');\n const marketLot = filterOf(symbol, 'MARKET_LOT_SIZE');\n const notional = filterOf(symbol, 'MIN_NOTIONAL');\n\n const tickSizeRaw = price?.tickSize ?? 10 ** -num(raw.pricePrecision, 2);\n const stepSizeRaw = lot?.stepSize ?? 10 ** -num(raw.quantityPrecision, 3);\n const marketStepRaw = marketLot?.stepSize ?? stepSizeRaw;\n\n return {\n symbol: symbol.symbol,\n status: symbol.status,\n baseAsset: symbol.baseAsset,\n quoteAsset: symbol.quoteAsset,\n tickSize: num(tickSizeRaw, 0.01),\n tickDecimals: stepDecimals(tickSizeRaw as string | number),\n stepSize: num(stepSizeRaw, 0.001),\n stepDecimals: stepDecimals(stepSizeRaw as string | number),\n minQty: num(lot?.minQty, 0),\n maxQty: num(lot?.maxQty, Number.POSITIVE_INFINITY),\n marketStepSize: num(marketStepRaw, 0.001),\n marketStepDecimals: stepDecimals(marketStepRaw as string | number),\n marketMinQty: num(marketLot?.minQty, num(lot?.minQty, 0)),\n marketMaxQty: num(marketLot?.maxQty, num(lot?.maxQty, Number.POSITIVE_INFINITY)),\n minNotional: num(notional?.notional, 0),\n };\n}\n","import type { FuturesAccount } from './FuturesAccount.js';\nimport type { FuturesData } from './FuturesData.js';\nimport type { FuturesMarket } from './FuturesMarket.js';\nimport type { FuturesTrading } from './FuturesTrading.js';\nimport type { PositionRisk } from '../types/account.types.js';\nimport {\n floorToStep,\n formatToDecimals,\n roundToStep,\n symbolRulesFrom,\n type SymbolRules,\n} from '../types/filters.types.js';\n\nexport interface SizePositionParams {\n symbol: string;\n side: 'BUY' | 'SELL';\n stopPrice: number;\n entryPrice?: number;\n riskAmount?: number;\n riskPct?: number;\n leverage?: number;\n marketOrder?: boolean;\n}\n\nexport interface PositionSizing {\n ok: boolean;\n reasons: string[];\n symbol: string;\n side: 'BUY' | 'SELL';\n entryPrice: number;\n stopPrice: number;\n riskPerUnit: number;\n riskAmount: number;\n rawQuantity: number;\n quantity: number;\n /** Pass this to createOrder — a string avoids float round-tripping. */\n quantityStr: string;\n notional: number;\n minNotional: number;\n leverage: number;\n requiredMargin: number;\n availableBalance?: number;\n rules: SymbolRules;\n}\n\nexport interface ClosePositionParams {\n symbol: string;\n positionSide?: 'BOTH' | 'LONG' | 'SHORT';\n /** Fraction of the position to close, 0 < portion <= 1. Defaults to the whole position. */\n portion?: number;\n dryRun?: boolean;\n}\n\nexport interface BracketOrderParams {\n symbol: string;\n side: 'BUY' | 'SELL';\n quantity: number | string;\n entryPrice?: number;\n stopLossPrice: number;\n takeProfitPrice?: number;\n positionSide?: 'BOTH' | 'LONG' | 'SHORT';\n workingType?: 'MARK_PRICE' | 'CONTRACT_PRICE';\n}\n\nconst RULES_TTL_MS = 60_000;\n\n/**\n * Composite operations layered over the single-endpoint resources.\n *\n * Everything here fans out over `FuturesMarket` / `FuturesData` / `FuturesAccount` /\n * `FuturesTrading` directly. It deliberately does not call the LLM tool handlers,\n * which return formatted JSON strings — composing at this layer keeps typed values\n * typed and avoids a parse/stringify round-trip per step.\n */\nexport class FuturesOps {\n private rulesCache = new Map<string, { rules: SymbolRules; at: number }>();\n\n constructor(\n private readonly market: FuturesMarket,\n private readonly data: FuturesData,\n private readonly account: FuturesAccount,\n private readonly trading: FuturesTrading,\n ) {}\n\n /** Typed tick/step/notional rules for a symbol, cached briefly (exchangeInfo is a large payload). */\n async symbolRules(symbol: string, options?: { refresh?: boolean }): Promise<SymbolRules> {\n const key = symbol.toUpperCase();\n const cached = this.rulesCache.get(key);\n if (!options?.refresh && cached && Date.now() - cached.at < RULES_TTL_MS) return cached.rules;\n\n const details = await this.market.instrumentDetails(key);\n const rules = symbolRulesFrom(details);\n this.rulesCache.set(key, { rules, at: Date.now() });\n return rules;\n }\n\n /** Round a price to the symbol's tick and a quantity to its step, ready to send. */\n async quantize(\n symbol: string,\n values: { price?: number; quantity?: number; marketOrder?: boolean },\n ): Promise<{ price?: string; quantity?: string; rules: SymbolRules }> {\n const rules = await this.symbolRules(symbol);\n const step = values.marketOrder ? rules.marketStepSize : rules.stepSize;\n const stepDp = values.marketOrder ? rules.marketStepDecimals : rules.stepDecimals;\n return {\n price:\n values.price === undefined\n ? undefined\n : formatToDecimals(roundToStep(values.price, rules.tickSize, rules.tickDecimals), rules.tickDecimals),\n quantity:\n values.quantity === undefined\n ? undefined\n : formatToDecimals(floorToStep(values.quantity, step, stepDp), stepDp),\n rules,\n };\n }\n\n /**\n * Risk-based position sizing. Converts \"risk N quote units between entry and stop\"\n * into a quantity that satisfies the symbol's step size, lot bounds and min notional,\n * and reports every constraint it could not satisfy instead of silently adjusting risk.\n */\n async sizePosition(params: SizePositionParams): Promise<PositionSizing> {\n const symbol = params.symbol.toUpperCase();\n const reasons: string[] = [];\n\n if ((params.riskAmount === undefined) === (params.riskPct === undefined)) {\n throw new Error('Provide exactly one of riskAmount or riskPct');\n }\n\n const rules = await this.symbolRules(symbol);\n const entryPrice = params.entryPrice ?? (await this.data.premiumIndex(symbol)).markPrice;\n\n let availableBalance: number | undefined;\n let riskAmount = params.riskAmount ?? 0;\n if (params.riskPct !== undefined) {\n const balances = await this.account.balanceV3();\n availableBalance = balances.find((b) => b.asset === rules.quoteAsset)?.availableBalance ?? 0;\n riskAmount = availableBalance * (params.riskPct / 100);\n }\n\n const riskPerUnit = Math.abs(entryPrice - params.stopPrice);\n const stopOnCorrectSide =\n params.side === 'BUY' ? params.stopPrice < entryPrice : params.stopPrice > entryPrice;\n if (!stopOnCorrectSide) {\n reasons.push(\n `stopPrice ${params.stopPrice} is on the wrong side of entry ${entryPrice} for a ${params.side}`,\n );\n }\n if (riskPerUnit <= 0) reasons.push('stopPrice equals entryPrice, risk per unit is zero');\n\n const step = params.marketOrder ? rules.marketStepSize : rules.stepSize;\n const stepDp = params.marketOrder ? rules.marketStepDecimals : rules.stepDecimals;\n const minQty = params.marketOrder ? rules.marketMinQty : rules.minQty;\n const maxQty = params.marketOrder ? rules.marketMaxQty : rules.maxQty;\n\n const rawQuantity = riskPerUnit > 0 ? riskAmount / riskPerUnit : 0;\n let quantity = floorToStep(rawQuantity, step, stepDp);\n\n if (quantity > maxQty) {\n reasons.push(`quantity ${quantity} exceeds maxQty ${maxQty}, clamped`);\n quantity = floorToStep(maxQty, step, stepDp);\n }\n if (quantity < minQty) {\n reasons.push(`quantity ${quantity} is below minQty ${minQty} for this symbol`);\n }\n\n const notional = quantity * entryPrice;\n if (rules.minNotional > 0 && notional < rules.minNotional) {\n reasons.push(\n `notional ${notional.toFixed(2)} is below the ${rules.minNotional} minimum; ` +\n `raising risk or widening the stop is required (this tool will not increase risk for you)`,\n );\n }\n if (rules.status !== 'TRADING') reasons.push(`symbol status is ${rules.status}, not TRADING`);\n\n const leverage = params.leverage ?? 1;\n const requiredMargin = notional / leverage;\n if (availableBalance !== undefined && requiredMargin > availableBalance) {\n reasons.push(\n `required margin ${requiredMargin.toFixed(2)} exceeds available balance ${availableBalance.toFixed(2)}`,\n );\n }\n\n return {\n ok: reasons.length === 0 && quantity > 0,\n reasons,\n symbol,\n side: params.side,\n entryPrice,\n stopPrice: params.stopPrice,\n riskPerUnit,\n riskAmount,\n rawQuantity,\n quantity,\n quantityStr: formatToDecimals(quantity, stepDp),\n notional,\n minNotional: rules.minNotional,\n leverage,\n requiredMargin,\n availableBalance,\n rules,\n };\n }\n\n /**\n * Flatten an open position with a reduce-only market order.\n *\n * Picks the closing side from the sign of `positionAmt` and, critically, chooses\n * between `reduceOnly` and `positionSide`: Binance rejects `reduceOnly` in hedge\n * mode, and rejects a LONG/SHORT `positionSide` in one-way mode.\n */\n async closePosition(params: ClosePositionParams): Promise<{\n closed: boolean;\n reason?: string;\n position?: PositionRisk;\n order?: unknown;\n request?: Record<string, unknown>;\n }> {\n const symbol = params.symbol.toUpperCase();\n const portion = params.portion ?? 1;\n if (!(portion > 0 && portion <= 1)) throw new Error('portion must be within (0, 1]');\n\n const positions = await this.account.positionRiskV3(symbol);\n const open = positions.filter(\n (p) =>\n p.positionAmt !== 0 &&\n (params.positionSide === undefined || p.positionSide === params.positionSide),\n );\n\n if (open.length === 0) return { closed: false, reason: `no open position on ${symbol}` };\n if (open.length > 1) {\n return {\n closed: false,\n reason: `${open.length} positions open on ${symbol} (hedge mode); pass positionSide to pick one`,\n };\n }\n\n const position = open[0] as PositionRisk;\n const rules = await this.symbolRules(symbol);\n const quantity = floorToStep(\n Math.abs(position.positionAmt) * portion,\n rules.marketStepSize,\n rules.marketStepDecimals,\n );\n if (quantity <= 0) {\n return { closed: false, reason: 'closing quantity rounds to zero at this symbol step size', position };\n }\n\n const hedgeMode = position.positionSide !== 'BOTH';\n const request: Record<string, unknown> = {\n symbol,\n side: position.positionAmt > 0 ? 'SELL' : 'BUY',\n type: 'MARKET',\n quantity: formatToDecimals(quantity, rules.marketStepDecimals),\n ...(hedgeMode ? { positionSide: position.positionSide } : { reduceOnly: true }),\n };\n\n if (params.dryRun) return { closed: false, reason: 'dryRun', position, request };\n\n const order = await this.trading.createOrder(request as never);\n return { closed: true, position, order, request };\n }\n\n /**\n * One-call market picture: 24h stats, mark/index and funding, open interest and\n * positioning. Uses allSettled so a single unavailable feed degrades one field\n * instead of failing the whole snapshot.\n */\n async marketSnapshot(\n symbol: string,\n options?: { period?: string },\n ): Promise<Record<string, unknown>> {\n const s = symbol.toUpperCase();\n const period = options?.period ?? '1h';\n const [ticker, premium, openInterest, longShort] = await Promise.allSettled([\n this.market.ticker24hr(s),\n this.data.premiumIndex(s),\n this.data.openInterest(s),\n this.data.globalLongShortAccountRatio(s, period, 1),\n ]);\n\n const settled = <T>(r: PromiseSettledResult<T>): unknown =>\n r.status === 'fulfilled' ? r.value : { error: String((r as PromiseRejectedResult).reason) };\n\n return {\n symbol: s,\n asOf: Date.now(),\n ticker24hr: settled(ticker),\n markPrice: settled(premium),\n openInterest: settled(openInterest),\n longShortAccountRatio: settled(longShort),\n };\n }\n\n /** Balances, open positions and working orders in one call, with the noise filtered out. */\n async accountOverview(): Promise<Record<string, unknown>> {\n const [balances, positions, openOrders] = await Promise.allSettled([\n this.account.balanceV3(),\n this.account.positionRiskV3(),\n this.trading.getOpenOrders(),\n ]);\n\n const fundedBalances =\n balances.status === 'fulfilled' ? balances.value.filter((b) => b.balance !== 0) : [];\n const openPositions =\n positions.status === 'fulfilled' ? positions.value.filter((p) => p.positionAmt !== 0) : [];\n\n return {\n asOf: Date.now(),\n balances: balances.status === 'fulfilled' ? fundedBalances : { error: String(balances.reason) },\n positions: positions.status === 'fulfilled' ? openPositions : { error: String(positions.reason) },\n openOrders: openOrders.status === 'fulfilled' ? openOrders.value : { error: String(openOrders.reason) },\n totals:\n positions.status === 'fulfilled'\n ? {\n openPositionCount: openPositions.length,\n unrealizedPnl: openPositions.reduce((sum, p) => sum + p.unRealizedProfit, 0),\n grossNotional: openPositions.reduce((sum, p) => sum + Math.abs(p.notional), 0),\n }\n : undefined,\n };\n }\n\n /**\n * Entry order plus its protective stop-loss and optional take-profit, with every\n * price quantized to the symbol tick.\n *\n * The protective legs are placed after the entry is accepted. If a protective leg\n * fails, the failure is reported per-leg rather than unwound: the entry may already\n * have filled, so cancelling it is not a safe automatic recovery.\n */\n async placeBracketOrder(params: BracketOrderParams): Promise<Record<string, unknown>> {\n const symbol = params.symbol.toUpperCase();\n const rules = await this.symbolRules(symbol);\n const tick = (p: number): string =>\n formatToDecimals(roundToStep(p, rules.tickSize, rules.tickDecimals), rules.tickDecimals);\n\n const quantity = formatToDecimals(\n floorToStep(Number(params.quantity), rules.stepSize, rules.stepDecimals),\n rules.stepDecimals,\n );\n if (Number(quantity) <= 0) throw new Error('quantity rounds to zero at this symbol step size');\n\n const exitSide = params.side === 'BUY' ? 'SELL' : 'BUY';\n const hedgeMode = params.positionSide !== undefined && params.positionSide !== 'BOTH';\n const sideFields = hedgeMode ? { positionSide: params.positionSide } : { reduceOnly: true };\n const workingType = params.workingType ?? 'MARK_PRICE';\n\n const entry = await this.trading.createOrder({\n symbol,\n side: params.side,\n type: params.entryPrice === undefined ? 'MARKET' : 'LIMIT',\n quantity,\n ...(params.entryPrice === undefined\n ? {}\n : { price: tick(params.entryPrice), timeInForce: 'GTC' as const }),\n ...(hedgeMode ? { positionSide: params.positionSide } : {}),\n });\n\n const protective = await Promise.allSettled([\n this.trading.createOrder({\n symbol,\n side: exitSide,\n type: 'STOP_MARKET',\n quantity,\n stopPrice: tick(params.stopLossPrice),\n workingType,\n ...sideFields,\n } as never),\n ...(params.takeProfitPrice === undefined\n ? []\n : [\n this.trading.createOrder({\n symbol,\n side: exitSide,\n type: 'TAKE_PROFIT_MARKET',\n quantity,\n stopPrice: tick(params.takeProfitPrice),\n workingType,\n ...sideFields,\n } as never),\n ]),\n ]);\n\n const [stopLoss, takeProfit] = protective;\n const leg = (r?: PromiseSettledResult<unknown>): unknown =>\n r === undefined\n ? undefined\n : r.status === 'fulfilled'\n ? r.value\n : { error: String((r as PromiseRejectedResult).reason) };\n\n const failures = protective.filter((r) => r.status === 'rejected').length;\n return {\n symbol,\n quantity,\n entry,\n stopLoss: leg(stopLoss),\n takeProfit: leg(takeProfit),\n protectionComplete: failures === 0,\n ...(failures > 0\n ? {\n warning:\n 'Entry was submitted but at least one protective order failed. The position may be ' +\n 'unprotected — review and place the missing leg manually.',\n }\n : {}),\n };\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { ListenKey, ListenKeySchema } from '../types/userdata.types.js';\n\nexport class UserDataStream {\n constructor(private readonly http: HttpClient) {}\n\n async createListenKey(): Promise<ListenKey> {\n return ListenKeySchema.parse(await this.http.post('/fapi/v1/listenKey', undefined, 'apiKey'));\n }\n\n async keepAliveListenKey(): Promise<Record<string, unknown>> {\n return this.http.put('/fapi/v1/listenKey', undefined, 'apiKey');\n }\n\n async closeListenKey(): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/listenKey', undefined, 'apiKey');\n }\n}\n","import { z } from 'zod';\n\nexport const CoinMBalanceSchema = z.object({\n accountAlias: z.string(),\n asset: z.string(),\n balance: z.string().transform(Number),\n withdrawAvailable: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n updateTime: z.number(),\n});\nexport type CoinMBalance = z.infer<typeof CoinMBalanceSchema>;\nexport const CoinMBalanceResponseSchema = z.array(CoinMBalanceSchema);\n\nexport const CoinMPositionRiskSchema = z\n .object({\n symbol: z.string(),\n pair: z.string().optional(),\n positionAmt: z.string().transform(Number),\n entryPrice: z.string().transform(Number),\n markPrice: z.string().transform(Number),\n unRealizedProfit: z.string().transform(Number),\n liquidationPrice: z.string().transform(Number),\n leverage: z.string().transform(Number),\n maxQty: z.string().transform(Number).optional(),\n marginType: z.enum(['isolated', 'cross']),\n isolatedMargin: z.string().transform(Number).optional(),\n isAutoAddMargin: z.union([z.string(), z.boolean()]).optional(),\n positionSide: z.string(),\n notionalValue: z.string().transform(Number).optional(),\n breakEvenPrice: z.string().transform(Number).optional(),\n updateTime: z.number().optional(),\n })\n .loose();\nexport type CoinMPositionRisk = z.infer<typeof CoinMPositionRiskSchema>;\nexport const CoinMPositionRiskResponseSchema = z.array(CoinMPositionRiskSchema);\n\nexport const CoinMAccountAssetSchema = z\n .object({\n asset: z.string(),\n walletBalance: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n marginBalance: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n updateTime: z.number(),\n })\n .loose();\nexport type CoinMAccountAsset = z.infer<typeof CoinMAccountAssetSchema>;\n\nexport const CoinMAccountPositionSchema = z\n .object({\n symbol: z.string(),\n positionAmt: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n leverage: z.string().transform(Number),\n isolated: z.boolean(),\n positionSide: z.string(),\n entryPrice: z.string().transform(Number),\n maxQty: z.string().transform(Number).optional(),\n updateTime: z.number().optional(),\n })\n .loose();\nexport type CoinMAccountPosition = z.infer<typeof CoinMAccountPositionSchema>;\n\nexport const CoinMAccountSchema = z\n .object({\n canDeposit: z.boolean(),\n canTrade: z.boolean(),\n canWithdraw: z.boolean(),\n feeTier: z.number(),\n updateTime: z.number(),\n assets: z.array(CoinMAccountAssetSchema),\n positions: z.array(CoinMAccountPositionSchema),\n })\n .loose();\nexport type CoinMAccountInfo = z.infer<typeof CoinMAccountSchema>;\n\nexport const CoinMOrderSchema = z\n .object({\n orderId: z.number(),\n symbol: z.string(),\n pair: z.string().optional(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumBase: z.string().transform(Number).optional(),\n type: z.string(),\n reduceOnly: z.boolean(),\n closePosition: z.boolean().optional(),\n side: z.string(),\n positionSide: z.string(),\n stopPrice: z.string().transform(Number).optional(),\n workingType: z.string().optional(),\n priceProtect: z.boolean().optional(),\n origType: z.string().optional(),\n timeInForce: z.string().optional(),\n activatePrice: z.string().transform(Number).optional(),\n priceRate: z.string().transform(Number).optional(),\n time: z.number(),\n updateTime: z.number(),\n })\n .loose();\nexport type CoinMOrder = z.infer<typeof CoinMOrderSchema>;\nexport const CoinMOrderResponseSchema = CoinMOrderSchema;\nexport const CoinMOrdersResponseSchema = z.array(CoinMOrderSchema);\n\nexport const CoinMCreateOrderParamsSchema = z.object({\n symbol: z.string(),\n side: z.enum(['BUY', 'SELL']),\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional(),\n type: z.string(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n quantity: z.union([z.string(), z.number()]).optional(),\n reduceOnly: z.boolean().optional(),\n price: z.union([z.string(), z.number()]).optional(),\n newClientOrderId: z.string().optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n closePosition: z.boolean().optional(),\n activationPrice: z.union([z.string(), z.number()]).optional(),\n callbackRate: z.union([z.string(), z.number()]).optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional(),\n priceProtect: z.boolean().optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT']).optional(),\n});\nexport type CoinMCreateOrderParams = z.infer<typeof CoinMCreateOrderParamsSchema>;\n\nexport const CoinMLeverageChangeSchema = z.object({\n leverage: z.number(),\n maxQty: z.string().transform(Number),\n symbol: z.string(),\n});\nexport type CoinMLeverageChange = z.infer<typeof CoinMLeverageChangeSchema>;\n\nexport const CoinMMarginTypeChangeSchema = z.object({ code: z.number(), msg: z.string() });\nexport type CoinMMarginTypeChange = z.infer<typeof CoinMMarginTypeChangeSchema>;\n\nexport const CoinMPositionMarginChangeSchema = z.object({\n amount: z.number(),\n code: z.number(),\n msg: z.string(),\n type: z.number(),\n});\nexport type CoinMPositionMarginChange = z.infer<typeof CoinMPositionMarginChangeSchema>;\n\nexport const CoinMIncomeSchema = z\n .object({\n symbol: z.string().optional(),\n incomeType: z.string(),\n income: z.string().transform(Number),\n asset: z.string(),\n info: z.string().optional(),\n time: z.number(),\n tranId: z.number(),\n tradeId: z.string().optional(),\n })\n .loose();\nexport type CoinMIncome = z.infer<typeof CoinMIncomeSchema>;\nexport const CoinMIncomeHistoryResponseSchema = z.array(CoinMIncomeSchema);\n\nexport const CoinMUserTradeSchema = z\n .object({\n symbol: z.string(),\n id: z.number(),\n orderId: z.number(),\n pair: z.string().optional(),\n side: z.string(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n realizedPnl: z.string().transform(Number),\n marginAsset: z.string().optional(),\n baseQty: z.string().transform(Number).optional(),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n time: z.number(),\n positionSide: z.string(),\n buyer: z.boolean(),\n maker: z.boolean(),\n })\n .loose();\nexport type CoinMUserTrade = z.infer<typeof CoinMUserTradeSchema>;\nexport const CoinMUserTradesResponseSchema = z.array(CoinMUserTradeSchema);\n\nexport const CoinMOpenInterestHistEntrySchema = z.object({\n pair: z.string(),\n contractType: z.string(),\n sumOpenInterest: z.string().transform(Number),\n sumOpenInterestValue: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type CoinMOpenInterestHistEntry = z.infer<typeof CoinMOpenInterestHistEntrySchema>;\nexport const CoinMOpenInterestHistSchema = z.array(CoinMOpenInterestHistEntrySchema);\n\nexport const CoinMPositionModeSchema = z.object({ dualSidePosition: z.boolean() });\nexport type CoinMPositionMode = z.infer<typeof CoinMPositionModeSchema>;\n\nexport const CoinMLeverageBracketSchema = z.object({\n bracket: z.number(),\n initialLeverage: z.number(),\n qtyCap: z.number(),\n qtyFloor: z.number(),\n maintMarginRatio: z.number(),\n cum: z.number().optional(),\n});\nexport type CoinMLeverageBracket = z.infer<typeof CoinMLeverageBracketSchema>;\nexport const CoinMLeverageBracketResponseSchema = z.array(\n z.object({\n symbol: z.string().optional(),\n pair: z.string().optional(),\n brackets: z.array(CoinMLeverageBracketSchema),\n }),\n);\n\nexport const CoinMCommissionRateSchema = z.object({\n symbol: z.string(),\n makerCommissionRate: z.string().transform(Number),\n takerCommissionRate: z.string().transform(Number),\n});\nexport type CoinMCommissionRate = z.infer<typeof CoinMCommissionRateSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport { MarketDataBase } from './MarketDataBase.js';\nimport { FundingRateHistorySchema, FundingRate, OpenInterestSchema, OpenInterest, PremiumIndexSchema, PremiumIndex } from '../types/futures.types.js';\nimport { Kline, KlineInterval, KlinesResponseSchema } from '../types/market.types.js';\nimport { CoinMOpenInterestHistEntry, CoinMOpenInterestHistSchema } from '../types/coinm.types.js';\n\nexport class CoinMMarket extends MarketDataBase {\n constructor(http?: HttpClient) {\n super(http ?? new HttpClient({ baseURL: 'https://dapi.binance.com/dapi/v1' }));\n }\n\n async continuousKlines(\n pair: string,\n contractType: 'perpetual' | 'current_quarter' | 'next_quarter',\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/continuousKlines', {\n pair,\n contractType,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async indexPriceKlines(\n pair: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/indexPriceKlines', {\n pair,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async markPriceKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/markPriceKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async premiumIndex(options?: { symbol?: string; pair?: string }): Promise<PremiumIndex[] | PremiumIndex> {\n return PremiumIndexSchema.or(PremiumIndexSchema.array()).parse(\n await this.http.get('/premiumIndex', options),\n );\n }\n\n async fundingRateHistory(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<FundingRate[]> {\n return FundingRateHistorySchema.parse(await this.http.get('/fundingRate', { symbol, ...options }));\n }\n\n async openInterest(symbol: string): Promise<OpenInterest> {\n return OpenInterestSchema.parse(await this.http.get('/openInterest', { symbol }));\n }\n\n async openInterestHist(\n pair: string,\n contractType: 'ALL' | 'CURRENT_QUARTER' | 'NEXT_QUARTER' | 'PERPETUAL',\n period: '5m' | '15m' | '30m' | '1h' | '2h' | '4h' | '6h' | '12h' | '1d',\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<CoinMOpenInterestHistEntry[]> {\n return CoinMOpenInterestHistSchema.parse(\n await this.http.get('/openInterestHist', { pair, contractType, period, ...options }),\n );\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n CoinMAccountInfo,\n CoinMAccountSchema,\n CoinMBalance,\n CoinMBalanceResponseSchema,\n CoinMCommissionRate,\n CoinMCommissionRateSchema,\n CoinMIncome,\n CoinMIncomeHistoryResponseSchema,\n CoinMLeverageBracket,\n CoinMLeverageBracketResponseSchema,\n CoinMPositionMode,\n CoinMPositionModeSchema,\n CoinMPositionRisk,\n CoinMPositionRiskResponseSchema,\n CoinMUserTrade,\n CoinMUserTradesResponseSchema,\n} from '../types/coinm.types.js';\n\nexport class CoinMAccount {\n constructor(private readonly http: HttpClient) {}\n\n async balance(): Promise<CoinMBalance[]> {\n return CoinMBalanceResponseSchema.parse(await this.http.get('/dapi/v1/balance', undefined, 'signed'));\n }\n\n async account(): Promise<CoinMAccountInfo> {\n return CoinMAccountSchema.parse(await this.http.get('/dapi/v1/account', undefined, 'signed'));\n }\n\n async positionRisk(options?: { symbol?: string; pair?: string }): Promise<CoinMPositionRisk[]> {\n return CoinMPositionRiskResponseSchema.parse(\n await this.http.get('/dapi/v1/positionRisk', options, 'signed'),\n );\n }\n\n async incomeHistory(options?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<CoinMIncome[]> {\n return CoinMIncomeHistoryResponseSchema.parse(await this.http.get('/dapi/v1/income', options, 'signed'));\n }\n\n async userTrades(options?: {\n symbol?: string;\n pair?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n fromId?: number;\n }): Promise<CoinMUserTrade[]> {\n return CoinMUserTradesResponseSchema.parse(\n await this.http.get('/dapi/v1/userTrades', options, 'signed'),\n );\n }\n\n async leverageBrackets(symbol?: string): Promise<{ symbol?: string; pair?: string; brackets: CoinMLeverageBracket[] }[]> {\n const params = symbol ? { symbol } : undefined;\n return CoinMLeverageBracketResponseSchema.parse(\n await this.http.get('/dapi/v1/leverageBracket', params, 'signed'),\n );\n }\n\n async commissionRate(symbol: string): Promise<CoinMCommissionRate> {\n return CoinMCommissionRateSchema.parse(\n await this.http.get('/dapi/v1/commissionRate', { symbol }, 'signed'),\n );\n }\n\n async positionMode(): Promise<CoinMPositionMode> {\n return CoinMPositionModeSchema.parse(\n await this.http.get('/dapi/v1/positionSide/dual', undefined, 'signed'),\n );\n }\n\n async setPositionMode(dualSidePosition: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/dapi/v1/positionSide/dual', { dualSidePosition }, 'signed');\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n CoinMCreateOrderParams,\n CoinMLeverageChange,\n CoinMLeverageChangeSchema,\n CoinMMarginTypeChange,\n CoinMMarginTypeChangeSchema,\n CoinMOrder,\n CoinMOrderResponseSchema,\n CoinMOrdersResponseSchema,\n CoinMPositionMarginChange,\n CoinMPositionMarginChangeSchema,\n} from '../types/coinm.types.js';\n\nexport class CoinMTrading {\n constructor(private readonly http: HttpClient) {}\n\n async setLeverage(symbol: string, leverage: number): Promise<CoinMLeverageChange> {\n return CoinMLeverageChangeSchema.parse(\n await this.http.post('/dapi/v1/leverage', { symbol, leverage }, 'signed'),\n );\n }\n\n async setMarginType(symbol: string, marginType: 'ISOLATED' | 'CROSSED'): Promise<CoinMMarginTypeChange> {\n return CoinMMarginTypeChangeSchema.parse(\n await this.http.post('/dapi/v1/marginType', { symbol, marginType }, 'signed'),\n );\n }\n\n async createOrder(params: CoinMCreateOrderParams): Promise<CoinMOrder> {\n return CoinMOrderResponseSchema.parse(await this.http.post('/dapi/v1/order', params, 'signed'));\n }\n\n async createTestOrder(params: CoinMCreateOrderParams): Promise<Record<string, unknown>> {\n return this.http.post('/dapi/v1/order/test', params, 'signed');\n }\n\n async getOrder(symbol: string, options?: { orderId?: number; origClientOrderId?: string }): Promise<CoinMOrder> {\n return CoinMOrderResponseSchema.parse(\n await this.http.get('/dapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOrder(symbol: string, options?: { orderId?: number; origClientOrderId?: string }): Promise<CoinMOrder> {\n return CoinMOrderResponseSchema.parse(\n await this.http.delete('/dapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelAllOpenOrders(symbol: string): Promise<Record<string, unknown>> {\n return this.http.delete('/dapi/v1/allOpenOrders', { symbol }, 'signed');\n }\n\n async getOpenOrders(symbol?: string): Promise<CoinMOrder[]> {\n const params = symbol ? { symbol } : undefined;\n return CoinMOrdersResponseSchema.parse(await this.http.get('/dapi/v1/openOrders', params, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<CoinMOrder[]> {\n return CoinMOrdersResponseSchema.parse(\n await this.http.get('/dapi/v1/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async modifyPositionMargin(symbol: string, amount: number, type: number): Promise<CoinMPositionMarginChange> {\n return CoinMPositionMarginChangeSchema.parse(\n await this.http.post('/dapi/v1/positionMargin', { symbol, amount, type }, 'signed'),\n );\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { ListenKey, ListenKeySchema } from '../types/userdata.types.js';\n\nexport class CoinMUserDataStream {\n constructor(private readonly http: HttpClient) {}\n\n async createListenKey(): Promise<ListenKey> {\n return ListenKeySchema.parse(await this.http.post('/dapi/v1/listenKey', undefined, 'apiKey'));\n }\n\n async keepAliveListenKey(): Promise<Record<string, unknown>> {\n return this.http.put('/dapi/v1/listenKey', undefined, 'apiKey');\n }\n\n async closeListenKey(): Promise<Record<string, unknown>> {\n return this.http.delete('/dapi/v1/listenKey', undefined, 'apiKey');\n }\n}\n","import { z } from 'zod';\n\nexport const MarginAssetBalanceSchema = z.object({\n asset: z.string(),\n borrowed: z.string().transform(Number),\n free: z.string().transform(Number),\n interest: z.string().transform(Number),\n locked: z.string().transform(Number),\n netAsset: z.string().transform(Number),\n});\nexport type MarginAssetBalance = z.infer<typeof MarginAssetBalanceSchema>;\n\nexport const CrossMarginAccountSchema = z\n .object({\n borrowEnabled: z.boolean(),\n marginLevel: z.string().transform(Number),\n totalAssetOfBtc: z.string().transform(Number),\n totalLiabilityOfBtc: z.string().transform(Number),\n totalNetAssetOfBtc: z.string().transform(Number),\n tradeEnabled: z.boolean(),\n transferEnabled: z.boolean(),\n accountType: z.string().optional(),\n userAssets: z.array(MarginAssetBalanceSchema),\n })\n .loose();\nexport type CrossMarginAccount = z.infer<typeof CrossMarginAccountSchema>;\n\nexport const IsolatedMarginAssetSchema = z\n .object({\n asset: z.string(),\n borrowEnabled: z.boolean(),\n borrowed: z.string().transform(Number),\n free: z.string().transform(Number),\n interest: z.string().transform(Number),\n locked: z.string().transform(Number),\n netAsset: z.string().transform(Number),\n netAssetOfBtc: z.string().transform(Number),\n repayEnabled: z.boolean(),\n totalAsset: z.string().transform(Number),\n })\n .loose();\nexport type IsolatedMarginAsset = z.infer<typeof IsolatedMarginAssetSchema>;\n\nexport const IsolatedMarginSymbolSchema = z\n .object({\n baseAsset: IsolatedMarginAssetSchema,\n quoteAsset: IsolatedMarginAssetSchema,\n symbol: z.string(),\n isolatedCreated: z.boolean().optional(),\n enabled: z.boolean(),\n marginLevel: z.string().transform(Number),\n marginLevelStatus: z.string().optional(),\n marginRatio: z.string().transform(Number).optional(),\n indexPrice: z.string().transform(Number).optional(),\n liquidatePrice: z.string().transform(Number).optional(),\n liquidateRate: z.string().transform(Number).optional(),\n tradeEnabled: z.boolean(),\n })\n .loose();\nexport type IsolatedMarginSymbol = z.infer<typeof IsolatedMarginSymbolSchema>;\n\nexport const IsolatedMarginAccountSchema = z.object({\n assets: z.array(IsolatedMarginSymbolSchema),\n totalAssetOfBtc: z.string().transform(Number).optional(),\n totalLiabilityOfBtc: z.string().transform(Number).optional(),\n totalNetAssetOfBtc: z.string().transform(Number).optional(),\n});\nexport type IsolatedMarginAccount = z.infer<typeof IsolatedMarginAccountSchema>;\n\nexport const MaxBorrowableSchema = z.object({\n amount: z.string().transform(Number),\n borrowLimit: z.string().transform(Number),\n});\nexport type MaxBorrowable = z.infer<typeof MaxBorrowableSchema>;\n\nexport const MaxTransferableSchema = z.object({\n amount: z.string().transform(Number),\n fullAmount: z.string().transform(Number).optional(),\n});\nexport type MaxTransferable = z.infer<typeof MaxTransferableSchema>;\n\nexport const BorrowRepayParamsSchema = z.object({\n asset: z.string(),\n isIsolated: z.enum(['TRUE', 'FALSE']).optional(),\n symbol: z.string().optional(),\n amount: z.union([z.string(), z.number()]),\n type: z.enum(['BORROW', 'REPAY']),\n});\nexport type BorrowRepayParams = z.infer<typeof BorrowRepayParamsSchema>;\n\nexport const BorrowRepayResultSchema = z.object({ tranId: z.number() });\nexport type BorrowRepayResult = z.infer<typeof BorrowRepayResultSchema>;\n\nexport const BorrowRepayRecordEntrySchema = z\n .object({\n isolatedSymbol: z.string().optional(),\n txId: z.number(),\n asset: z.string(),\n principal: z.string().transform(Number),\n timestamp: z.number(),\n status: z.string(),\n })\n .loose();\nexport type BorrowRepayRecordEntry = z.infer<typeof BorrowRepayRecordEntrySchema>;\n\nexport const BorrowRepayRecordResponseSchema = z.object({\n rows: z.array(BorrowRepayRecordEntrySchema),\n total: z.number(),\n});\nexport type BorrowRepayRecordResponse = z.infer<typeof BorrowRepayRecordResponseSchema>;\n\nexport const MarginTransferResultSchema = z.object({ tranId: z.number() });\nexport type MarginTransferResult = z.infer<typeof MarginTransferResultSchema>;\n\nexport const IsolatedTransferParamsSchema = z.object({\n asset: z.string(),\n symbol: z.string(),\n transFrom: z.enum(['SPOT', 'ISOLATED_MARGIN']),\n transTo: z.enum(['SPOT', 'ISOLATED_MARGIN']),\n amount: z.union([z.string(), z.number()]),\n});\nexport type IsolatedTransferParams = z.infer<typeof IsolatedTransferParamsSchema>;\n\nexport const MarginInterestHistoryEntrySchema = z\n .object({\n txId: z.number(),\n interestAccuredTime: z.number(),\n asset: z.string(),\n rawAsset: z.string().optional(),\n principal: z.string().transform(Number),\n interest: z.string().transform(Number),\n interestRate: z.string().transform(Number),\n type: z.string(),\n isolatedSymbol: z.string().optional(),\n })\n .loose();\nexport type MarginInterestHistoryEntry = z.infer<typeof MarginInterestHistoryEntrySchema>;\n\nexport const MarginInterestHistoryResponseSchema = z.object({\n rows: z.array(MarginInterestHistoryEntrySchema),\n total: z.number(),\n});\nexport type MarginInterestHistoryResponse = z.infer<typeof MarginInterestHistoryResponseSchema>;\n\nexport const MarginForceLiquidationEntrySchema = z\n .object({\n avgPrice: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n orderId: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n side: z.string(),\n symbol: z.string(),\n timeInForce: z.string(),\n isIsolated: z.boolean().optional(),\n updatedTime: z.number(),\n })\n .loose();\nexport type MarginForceLiquidationEntry = z.infer<typeof MarginForceLiquidationEntrySchema>;\n\nexport const MarginForceLiquidationResponseSchema = z.object({\n rows: z.array(MarginForceLiquidationEntrySchema),\n total: z.number(),\n});\nexport type MarginForceLiquidationResponse = z.infer<typeof MarginForceLiquidationResponseSchema>;\n\nexport const MarginPriceIndexSchema = z.object({\n calcTime: z.number(),\n price: z.string().transform(Number),\n symbol: z.string(),\n});\nexport type MarginPriceIndex = z.infer<typeof MarginPriceIndexSchema>;\n\nexport const MarginOrderSchema = z\n .object({\n symbol: z.string(),\n orderId: z.number(),\n clientOrderId: z.string(),\n isIsolated: z.boolean().optional(),\n price: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cummulativeQuoteQty: z.string().transform(Number),\n status: z.string(),\n timeInForce: z.string().optional(),\n type: z.string(),\n side: z.string(),\n transactTime: z.number().optional(),\n time: z.number().optional(),\n updateTime: z.number().optional(),\n fills: z.array(z.unknown()).optional(),\n })\n .loose();\nexport type MarginOrder = z.infer<typeof MarginOrderSchema>;\nexport const MarginOrderResponseSchema = MarginOrderSchema;\nexport const MarginOrdersResponseSchema = z.array(MarginOrderSchema);\n\nexport const MarginCreateOrderParamsSchema = z.object({\n symbol: z.string(),\n isIsolated: z.enum(['TRUE', 'FALSE']).optional(),\n side: z.enum(['BUY', 'SELL']),\n type: z.string(),\n quantity: z.union([z.string(), z.number()]).optional(),\n quoteOrderQty: z.union([z.string(), z.number()]).optional(),\n price: z.union([z.string(), z.number()]).optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n newClientOrderId: z.string().optional(),\n icebergQty: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional(),\n sideEffectType: z.enum(['NO_SIDE_EFFECT', 'MARGIN_BUY', 'AUTO_REPAY', 'AUTO_BORROW_REPAY']).optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT', 'FULL']).optional(),\n autoRepayAtCancel: z.boolean().optional(),\n});\nexport type MarginCreateOrderParams = z.infer<typeof MarginCreateOrderParamsSchema>;\n\nexport const MarginTradeSchema = z\n .object({\n symbol: z.string(),\n id: z.number(),\n orderId: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n time: z.number(),\n isBuyer: z.boolean(),\n isMaker: z.boolean(),\n isBestMatch: z.boolean().optional(),\n isIsolated: z.boolean().optional(),\n })\n .loose();\nexport type MarginTrade = z.infer<typeof MarginTradeSchema>;\nexport const MarginTradesResponseSchema = z.array(MarginTradeSchema);\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n BorrowRepayParams,\n BorrowRepayRecordResponse,\n BorrowRepayRecordResponseSchema,\n BorrowRepayResult,\n BorrowRepayResultSchema,\n CrossMarginAccount,\n CrossMarginAccountSchema,\n IsolatedMarginAccount,\n IsolatedMarginAccountSchema,\n IsolatedTransferParams,\n MarginCreateOrderParams,\n MarginForceLiquidationResponse,\n MarginForceLiquidationResponseSchema,\n MarginInterestHistoryResponse,\n MarginInterestHistoryResponseSchema,\n MarginOrder,\n MarginOrderResponseSchema,\n MarginOrdersResponseSchema,\n MarginPriceIndex,\n MarginPriceIndexSchema,\n MarginTradesResponseSchema,\n MarginTrade,\n MarginTransferResult,\n MarginTransferResultSchema,\n MaxBorrowable,\n MaxBorrowableSchema,\n MaxTransferable,\n MaxTransferableSchema,\n} from '../types/margin.types.js';\n\nexport class MarginAccount {\n constructor(private readonly http: HttpClient) {}\n\n async crossAccount(): Promise<CrossMarginAccount> {\n return CrossMarginAccountSchema.parse(await this.http.get('/sapi/v1/margin/account', undefined, 'signed'));\n }\n\n async isolatedAccount(symbols?: string[]): Promise<IsolatedMarginAccount> {\n const params = symbols?.length ? { symbols: symbols.join(',') } : undefined;\n return IsolatedMarginAccountSchema.parse(\n await this.http.get('/sapi/v1/margin/isolated/account', params, 'signed'),\n );\n }\n\n async maxBorrowable(asset: string, isolatedSymbol?: string): Promise<MaxBorrowable> {\n return MaxBorrowableSchema.parse(\n await this.http.get('/sapi/v1/margin/maxBorrowable', { asset, isolatedSymbol }, 'signed'),\n );\n }\n\n async maxTransferable(asset: string, isolatedSymbol?: string): Promise<MaxTransferable> {\n return MaxTransferableSchema.parse(\n await this.http.get('/sapi/v1/margin/maxTransferable', { asset, isolatedSymbol }, 'signed'),\n );\n }\n\n async borrowRepay(params: BorrowRepayParams): Promise<BorrowRepayResult> {\n return BorrowRepayResultSchema.parse(\n await this.http.post('/sapi/v1/margin/borrow-repay', params, 'signed'),\n );\n }\n\n async borrow(asset: string, amount: number, options?: { isIsolated?: boolean; symbol?: string }): Promise<BorrowRepayResult> {\n return this.borrowRepay({\n asset,\n amount,\n type: 'BORROW',\n isIsolated: options?.isIsolated ? 'TRUE' : undefined,\n symbol: options?.symbol,\n });\n }\n\n async repay(asset: string, amount: number, options?: { isIsolated?: boolean; symbol?: string }): Promise<BorrowRepayResult> {\n return this.borrowRepay({\n asset,\n amount,\n type: 'REPAY',\n isIsolated: options?.isIsolated ? 'TRUE' : undefined,\n symbol: options?.symbol,\n });\n }\n\n async borrowRepayRecord(\n type: 'BORROW' | 'REPAY',\n options?: { asset?: string; isolatedSymbol?: string; startTime?: number; endTime?: number; current?: number; size?: number },\n ): Promise<BorrowRepayRecordResponse> {\n return BorrowRepayRecordResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/borrow-repay', { type, ...options }, 'signed'),\n );\n }\n\n async transfer(asset: string, amount: number, type: 1 | 2): Promise<MarginTransferResult> {\n return MarginTransferResultSchema.parse(\n await this.http.post('/sapi/v1/margin/transfer', { asset, amount, type }, 'signed'),\n );\n }\n\n async isolatedTransfer(params: IsolatedTransferParams): Promise<MarginTransferResult> {\n return MarginTransferResultSchema.parse(\n await this.http.post('/sapi/v1/margin/isolated/transfer', params, 'signed'),\n );\n }\n\n async interestHistory(options?: {\n asset?: string;\n isolatedSymbol?: string;\n startTime?: number;\n endTime?: number;\n current?: number;\n size?: number;\n }): Promise<MarginInterestHistoryResponse> {\n return MarginInterestHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/interestHistory', options, 'signed'),\n );\n }\n\n async forceLiquidationRecord(options?: {\n startTime?: number;\n endTime?: number;\n isolatedSymbol?: string;\n current?: number;\n size?: number;\n }): Promise<MarginForceLiquidationResponse> {\n return MarginForceLiquidationResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/forceLiquidationRec', options, 'signed'),\n );\n }\n\n async priceIndex(symbol: string): Promise<MarginPriceIndex> {\n return MarginPriceIndexSchema.parse(await this.http.get('/sapi/v1/margin/priceIndex', { symbol }));\n }\n}\n\nexport class MarginTrading {\n constructor(private readonly http: HttpClient) {}\n\n async createOrder(params: MarginCreateOrderParams): Promise<MarginOrder> {\n return MarginOrderResponseSchema.parse(await this.http.post('/sapi/v1/margin/order', params, 'signed'));\n }\n\n async cancelOrder(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; origClientOrderId?: string; newClientOrderId?: string },\n ): Promise<MarginOrder> {\n return MarginOrderResponseSchema.parse(\n await this.http.delete('/sapi/v1/margin/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelAllOpenOrders(symbol: string, isIsolated?: 'TRUE' | 'FALSE'): Promise<MarginOrder[]> {\n return MarginOrdersResponseSchema.parse(\n await this.http.delete('/sapi/v1/margin/openOrders', { symbol, isIsolated }, 'signed'),\n );\n }\n\n async getOrder(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; origClientOrderId?: string },\n ): Promise<MarginOrder> {\n return MarginOrderResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenOrders(options?: { symbol?: string; isIsolated?: 'TRUE' | 'FALSE' }): Promise<MarginOrder[]> {\n return MarginOrdersResponseSchema.parse(await this.http.get('/sapi/v1/margin/openOrders', options, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<MarginOrder[]> {\n return MarginOrdersResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async myTrades(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; startTime?: number; endTime?: number; fromId?: number; limit?: number },\n ): Promise<MarginTrade[]> {\n return MarginTradesResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/myTrades', { symbol, ...options }, 'signed'),\n );\n }\n}\n","import { z } from 'zod';\n\nexport const TransferTypeSchema = z.enum([\n 'MAIN_UMFUTURE', 'MAIN_CMFUTURE', 'MAIN_MARGIN', 'MAIN_MINING', 'MAIN_FUNDING', 'MAIN_OPTION',\n 'UMFUTURE_MAIN', 'UMFUTURE_MARGIN', 'UMFUTURE_FUNDING',\n 'CMFUTURE_MAIN', 'CMFUTURE_MARGIN',\n 'MARGIN_MAIN', 'MARGIN_UMFUTURE', 'MARGIN_CMFUTURE', 'MARGIN_MINING', 'MARGIN_FUNDING',\n 'MINING_MAIN', 'MINING_UMFUTURE', 'MINING_MARGIN',\n 'FUNDING_MAIN', 'FUNDING_UMFUTURE', 'FUNDING_MARGIN', 'FUNDING_CMFUTURE',\n 'OPTION_MAIN', 'MAIN_OPTION_MARGIN',\n 'MAIN_PORTFOLIO_MARGIN', 'PORTFOLIO_MARGIN_MAIN',\n 'ISOLATEDMARGIN_MARGIN', 'MARGIN_ISOLATEDMARGIN', 'ISOLATEDMARGIN_ISOLATEDMARGIN',\n]);\nexport type TransferType = z.infer<typeof TransferTypeSchema>;\n\nexport const UniversalTransferParamsSchema = z.object({\n type: TransferTypeSchema,\n asset: z.string(),\n amount: z.union([z.string(), z.number()]),\n fromSymbol: z.string().optional(),\n toSymbol: z.string().optional(),\n});\nexport type UniversalTransferParams = z.infer<typeof UniversalTransferParamsSchema>;\n\nexport const UniversalTransferResultSchema = z.object({ tranId: z.number() });\nexport type UniversalTransferResult = z.infer<typeof UniversalTransferResultSchema>;\n\nexport const UniversalTransferHistoryEntrySchema = z\n .object({\n asset: z.string(),\n amount: z.string().transform(Number),\n type: z.string(),\n status: z.string(),\n tranId: z.number(),\n timestamp: z.number(),\n fromSymbol: z.string().nullable().optional(),\n toSymbol: z.string().nullable().optional(),\n })\n .loose();\nexport type UniversalTransferHistoryEntry = z.infer<typeof UniversalTransferHistoryEntrySchema>;\n\nexport const UniversalTransferHistoryResponseSchema = z.object({\n total: z.number(),\n rows: z.array(UniversalTransferHistoryEntrySchema),\n});\nexport type UniversalTransferHistoryResponse = z.infer<typeof UniversalTransferHistoryResponseSchema>;\n\nexport const FundingAssetSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n freeze: z.string().transform(Number),\n withdrawing: z.string().transform(Number),\n btcValuation: z.string().transform(Number),\n});\nexport type FundingAsset = z.infer<typeof FundingAssetSchema>;\nexport const FundingAssetsResponseSchema = z.array(FundingAssetSchema);\n\nexport const UserAssetSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n freeze: z.string().transform(Number),\n withdrawing: z.string().transform(Number),\n ipoable: z.string().transform(Number),\n btcValuation: z.string().transform(Number),\n});\nexport type UserAsset = z.infer<typeof UserAssetSchema>;\nexport const UserAssetsResponseSchema = z.array(UserAssetSchema);\n\nexport const DepositHistoryEntrySchema = z\n .object({\n id: z.string(),\n amount: z.string().transform(Number),\n coin: z.string(),\n network: z.string(),\n status: z.number(),\n address: z.string(),\n addressTag: z.string().optional(),\n txId: z.string(),\n insertTime: z.number(),\n transferType: z.number(),\n confirmTimes: z.string().optional(),\n unlockConfirm: z.union([z.string(), z.number()]).optional(),\n walletType: z.number().optional(),\n })\n .loose();\nexport type DepositHistoryEntry = z.infer<typeof DepositHistoryEntrySchema>;\nexport const DepositHistoryResponseSchema = z.array(DepositHistoryEntrySchema);\n\nexport const WithdrawHistoryEntrySchema = z\n .object({\n id: z.string(),\n amount: z.string().transform(Number),\n transactionFee: z.string().transform(Number),\n coin: z.string(),\n status: z.number(),\n address: z.string(),\n txId: z.string().optional(),\n applyTime: z.string(),\n network: z.string(),\n transferType: z.number(),\n withdrawOrderId: z.string().nullable().optional(),\n info: z.string().optional(),\n confirmNo: z.number().optional(),\n walletType: z.number().optional(),\n })\n .loose();\nexport type WithdrawHistoryEntry = z.infer<typeof WithdrawHistoryEntrySchema>;\nexport const WithdrawHistoryResponseSchema = z.array(WithdrawHistoryEntrySchema);\n\nexport const WithdrawParamsSchema = z.object({\n coin: z.string(),\n address: z.string(),\n amount: z.union([z.string(), z.number()]),\n withdrawOrderId: z.string().optional(),\n network: z.string().optional(),\n addressTag: z.string().optional(),\n transactionFeeFlag: z.boolean().optional(),\n name: z.string().optional(),\n walletType: z.number().optional(),\n});\nexport type WithdrawParams = z.infer<typeof WithdrawParamsSchema>;\n\nexport const WithdrawResultSchema = z.object({ id: z.string() });\nexport type WithdrawResult = z.infer<typeof WithdrawResultSchema>;\n\nexport const DepositAddressSchema = z.object({\n address: z.string(),\n coin: z.string(),\n tag: z.string(),\n url: z.string().optional(),\n});\nexport type DepositAddress = z.infer<typeof DepositAddressSchema>;\n\nexport const ApiKeyPermissionsSchema = z\n .object({\n ipRestrict: z.boolean(),\n createTime: z.number(),\n enableWithdrawals: z.boolean(),\n enableInternalTransfer: z.boolean(),\n enableFutures: z.boolean(),\n enableMargin: z.boolean(),\n enableSpotAndMarginTrading: z.boolean(),\n permitsUniversalTransfer: z.boolean().optional(),\n enableReading: z.boolean().optional(),\n tradingAuthorityExpirationTime: z.number().optional(),\n })\n .loose();\nexport type ApiKeyPermissions = z.infer<typeof ApiKeyPermissionsSchema>;\n\nexport const AssetDetailSchema = z.record(\n z.string(),\n z\n .object({\n minWithdrawAmount: z.string().transform(Number),\n depositStatus: z.boolean(),\n withdrawFee: z.number(),\n withdrawStatus: z.boolean(),\n depositTip: z.string().optional(),\n })\n .loose(),\n);\nexport type AssetDetail = z.infer<typeof AssetDetailSchema>;\n\nexport const DustLogEntrySchema = z\n .object({\n transId: z.number(),\n serviceChargeAmount: z.string().transform(Number),\n amount: z.string().transform(Number),\n operateTime: z.string(),\n transferedAmount: z.string().transform(Number),\n fromAsset: z.string(),\n })\n .loose();\nexport type DustLogEntry = z.infer<typeof DustLogEntrySchema>;\n\nexport const DustLogResponseSchema = z.object({\n total: z.number(),\n userAssetDribblets: z.array(\n z.object({\n operateTime: z.number(),\n totalTransferedAmount: z.string().transform(Number),\n totalServiceChargeAmount: z.string().transform(Number),\n transId: z.number(),\n userAssetDribbletDetails: z.array(DustLogEntrySchema),\n }),\n ),\n});\nexport type DustLogResponse = z.infer<typeof DustLogResponseSchema>;\n\nexport const DustConversionResultSchema = z\n .object({\n totalServiceCharge: z.string().transform(Number),\n totalTransfered: z.string().transform(Number),\n transferResult: z.array(\n z\n .object({\n amount: z.string().transform(Number),\n fromAsset: z.string(),\n operateTime: z.number(),\n serviceChargeAmount: z.string().transform(Number),\n tranId: z.number(),\n transferedAmount: z.string().transform(Number),\n })\n .loose(),\n ),\n })\n .loose();\nexport type DustConversionResult = z.infer<typeof DustConversionResultSchema>;\n\nexport const TradeFeeEntrySchema = z.object({\n symbol: z.string(),\n makerCommission: z.string().transform(Number),\n takerCommission: z.string().transform(Number),\n});\nexport type TradeFeeEntry = z.infer<typeof TradeFeeEntrySchema>;\nexport const TradeFeeResponseSchema = z.array(TradeFeeEntrySchema);\n\nexport const AccountSnapshotSchema = z\n .object({\n code: z.number(),\n msg: z.string(),\n snapshotVos: z.array(\n z\n .object({\n type: z.string(),\n updateTime: z.number(),\n data: z.record(z.string(), z.unknown()),\n })\n .loose(),\n ),\n })\n .loose();\nexport type AccountSnapshot = z.infer<typeof AccountSnapshotSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n AccountSnapshot,\n AccountSnapshotSchema,\n ApiKeyPermissions,\n ApiKeyPermissionsSchema,\n AssetDetail,\n AssetDetailSchema,\n DepositAddress,\n DepositAddressSchema,\n DepositHistoryEntry,\n DepositHistoryResponseSchema,\n DustConversionResult,\n DustConversionResultSchema,\n DustLogResponse,\n DustLogResponseSchema,\n FundingAsset,\n FundingAssetsResponseSchema,\n TradeFeeEntry,\n TradeFeeResponseSchema,\n UniversalTransferHistoryResponse,\n UniversalTransferHistoryResponseSchema,\n UniversalTransferParams,\n UniversalTransferResult,\n UniversalTransferResultSchema,\n UserAsset,\n UserAssetsResponseSchema,\n WithdrawHistoryEntry,\n WithdrawHistoryResponseSchema,\n WithdrawParams,\n WithdrawResult,\n WithdrawResultSchema,\n} from '../types/wallet.types.js';\n\nexport class Wallet {\n constructor(private readonly http: HttpClient) {}\n\n async universalTransfer(params: UniversalTransferParams): Promise<UniversalTransferResult> {\n return UniversalTransferResultSchema.parse(\n await this.http.post('/sapi/v1/asset/transfer', params, 'signed'),\n );\n }\n\n async universalTransferHistory(options: {\n type: string;\n startTime?: number;\n endTime?: number;\n current?: number;\n size?: number;\n fromSymbol?: string;\n toSymbol?: string;\n }): Promise<UniversalTransferHistoryResponse> {\n return UniversalTransferHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/asset/transfer', options, 'signed'),\n );\n }\n\n async fundingWallet(options?: { asset?: string; needBtcValuation?: boolean }): Promise<FundingAsset[]> {\n return FundingAssetsResponseSchema.parse(\n await this.http.post('/sapi/v1/asset/get-funding-asset', options, 'signed'),\n );\n }\n\n async userAsset(options?: { asset?: string; needBtcValuation?: boolean }): Promise<UserAsset[]> {\n return UserAssetsResponseSchema.parse(\n await this.http.post('/sapi/v3/asset/getUserAsset', options, 'signed'),\n );\n }\n\n async depositHistory(options?: {\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n }): Promise<DepositHistoryEntry[]> {\n return DepositHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/hisrec', options, 'signed'),\n );\n }\n\n async withdrawHistory(options?: {\n coin?: string;\n withdrawOrderId?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n }): Promise<WithdrawHistoryEntry[]> {\n return WithdrawHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/capital/withdraw/history', options, 'signed'),\n );\n }\n\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n return WithdrawResultSchema.parse(\n await this.http.post('/sapi/v1/capital/withdraw/apply', params, 'signed'),\n );\n }\n\n async depositAddress(coin: string, network?: string): Promise<DepositAddress> {\n return DepositAddressSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/address', { coin, network }, 'signed'),\n );\n }\n\n async accountSnapshot(\n type: 'SPOT' | 'MARGIN' | 'FUTURES',\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<AccountSnapshot> {\n return AccountSnapshotSchema.parse(\n await this.http.get('/sapi/v1/accountSnapshot', { type, ...options }, 'signed'),\n );\n }\n\n async apiKeyPermissions(): Promise<ApiKeyPermissions> {\n return ApiKeyPermissionsSchema.parse(\n await this.http.get('/sapi/v1/account/apiRestrictions', undefined, 'signed'),\n );\n }\n\n async assetDetail(asset?: string): Promise<AssetDetail> {\n const params = asset ? { asset } : undefined;\n return AssetDetailSchema.parse(await this.http.get('/sapi/v1/asset/assetDetail', params, 'signed'));\n }\n\n async dustLog(options?: { accountType?: 'SPOT' | 'MARGIN'; startTime?: number; endTime?: number }): Promise<DustLogResponse> {\n return DustLogResponseSchema.parse(\n await this.http.get('/sapi/v1/asset/dribblet', options, 'signed'),\n );\n }\n\n async convertDustToBnb(assets: string[], accountType?: 'SPOT' | 'MARGIN'): Promise<DustConversionResult> {\n return DustConversionResultSchema.parse(\n await this.http.post('/sapi/v1/asset/dust', { asset: assets, accountType }, 'signed'),\n );\n }\n\n async tradeFee(symbol?: string): Promise<TradeFeeEntry[]> {\n const params = symbol ? { symbol } : undefined;\n return TradeFeeResponseSchema.parse(await this.http.get('/sapi/v1/asset/tradeFee', params, 'signed'));\n }\n}\n","import { z } from 'zod';\n\nexport const SubAccountEntrySchema = z\n .object({\n email: z.string(),\n isFreeze: z.boolean(),\n createTime: z.number(),\n isManagedSubAccount: z.boolean().optional(),\n isAssetManagementSubAccount: z.boolean().optional(),\n type: z.string().optional(),\n })\n .loose();\nexport type SubAccountEntry = z.infer<typeof SubAccountEntrySchema>;\n\nexport const SubAccountListResponseSchema = z.object({\n subAccounts: z.array(SubAccountEntrySchema),\n});\nexport type SubAccountListResponse = z.infer<typeof SubAccountListResponseSchema>;\n\nexport const SubAccountStatusSchema = z\n .object({\n email: z.string(),\n isSubUserEnabled: z.boolean(),\n isUserActive: z.boolean(),\n insertTime: z.number(),\n isMarginEnabled: z.boolean(),\n isFutureEnabled: z.boolean(),\n mobile: z.number().optional(),\n })\n .loose();\nexport type SubAccountStatus = z.infer<typeof SubAccountStatusSchema>;\nexport const SubAccountStatusResponseSchema = z.array(SubAccountStatusSchema);\n\nexport const SubAccountSpotAssetSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n});\nexport type SubAccountSpotAsset = z.infer<typeof SubAccountSpotAssetSchema>;\n\nexport const SubAccountSpotAssetsResponseSchema = z.object({\n balances: z.array(SubAccountSpotAssetSchema),\n});\nexport type SubAccountSpotAssetsResponse = z.infer<typeof SubAccountSpotAssetsResponseSchema>;\n\nexport const SubAccountSpotSummaryEntrySchema = z\n .object({\n email: z.string(),\n totalAsset: z.string().transform(Number),\n })\n .loose();\nexport type SubAccountSpotSummaryEntry = z.infer<typeof SubAccountSpotSummaryEntrySchema>;\n\nexport const SubAccountSpotSummarySchema = z.object({\n totalCount: z.number(),\n masterAccountTotalAsset: z.string().transform(Number),\n spotSubUserAssetBtcVoList: z.array(SubAccountSpotSummaryEntrySchema),\n});\nexport type SubAccountSpotSummary = z.infer<typeof SubAccountSpotSummarySchema>;\n\nexport const SubAccountFuturesSummarySchema = z\n .object({\n totalCount: z.number().optional(),\n totalMarginBalanceOfBTC: z.string().transform(Number).optional(),\n totalUnrealizedProfitOfBTC: z.string().transform(Number).optional(),\n totalWalletBalanceOfBTC: z.string().transform(Number).optional(),\n subAccountList: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .loose();\nexport type SubAccountFuturesSummary = z.infer<typeof SubAccountFuturesSummarySchema>;\n\nexport const SubAccountMarginAccountSchema = z\n .object({\n email: z.string(),\n marginLevel: z.string().transform(Number),\n totalAssetOfBtc: z.string().transform(Number),\n totalLiabilityOfBtc: z.string().transform(Number),\n totalNetAssetOfBtc: z.string().transform(Number),\n marginTradeCoeffVo: z.record(z.string(), z.unknown()).optional(),\n marginUserAssetVoList: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .loose();\nexport type SubAccountMarginAccount = z.infer<typeof SubAccountMarginAccountSchema>;\n\nexport const SubAccountUniversalTransferParamsSchema = z.object({\n fromEmail: z.string().optional(),\n toEmail: z.string().optional(),\n fromAccountType: z.enum(['SPOT', 'USDT_FUTURE', 'COIN_FUTURE', 'MARGIN', 'ISOLATED_MARGIN']),\n toAccountType: z.enum(['SPOT', 'USDT_FUTURE', 'COIN_FUTURE', 'MARGIN', 'ISOLATED_MARGIN']),\n symbol: z.string().optional(),\n asset: z.string(),\n amount: z.union([z.string(), z.number()]),\n clientTranId: z.string().optional(),\n});\nexport type SubAccountUniversalTransferParams = z.infer<typeof SubAccountUniversalTransferParamsSchema>;\n\nexport const SubAccountUniversalTransferResultSchema = z.object({\n tranId: z.number(),\n clientTranId: z.string().optional(),\n});\nexport type SubAccountUniversalTransferResult = z.infer<typeof SubAccountUniversalTransferResultSchema>;\n\nexport const SubAccountUniversalTransferEntrySchema = z\n .object({\n tranId: z.number(),\n fromEmail: z.string(),\n toEmail: z.string(),\n asset: z.string(),\n amount: z.string().transform(Number),\n fromAccountType: z.string(),\n toAccountType: z.string(),\n status: z.string(),\n createTimeStamp: z.number(),\n clientTranId: z.string().optional(),\n })\n .loose();\nexport type SubAccountUniversalTransferEntry = z.infer<typeof SubAccountUniversalTransferEntrySchema>;\n\nexport const SubAccountUniversalTransferHistoryResponseSchema = z.object({\n result: z.array(SubAccountUniversalTransferEntrySchema),\n totalCount: z.number(),\n});\nexport type SubAccountUniversalTransferHistoryResponse = z.infer<\n typeof SubAccountUniversalTransferHistoryResponseSchema\n>;\n\nexport const VirtualSubAccountResultSchema = z.object({ email: z.string() });\nexport type VirtualSubAccountResult = z.infer<typeof VirtualSubAccountResultSchema>;\n\nexport const SubAccountDepositAddressSchema = z.object({\n address: z.string(),\n coin: z.string(),\n tag: z.string(),\n url: z.string().optional(),\n});\nexport type SubAccountDepositAddress = z.infer<typeof SubAccountDepositAddressSchema>;\n\nexport const SubAccountDepositHistoryEntrySchema = z\n .object({\n id: z.string(),\n amount: z.string().transform(Number),\n coin: z.string(),\n network: z.string(),\n status: z.number(),\n address: z.string(),\n txId: z.string(),\n insertTime: z.number(),\n transferType: z.number(),\n })\n .loose();\nexport type SubAccountDepositHistoryEntry = z.infer<typeof SubAccountDepositHistoryEntrySchema>;\nexport const SubAccountDepositHistoryResponseSchema = z.array(SubAccountDepositHistoryEntrySchema);\n\nexport const SubAccountEnableResultSchema = z\n .object({\n email: z.string(),\n isFuturesEnabled: z.boolean().optional(),\n isMarginEnabled: z.boolean().optional(),\n })\n .loose();\nexport type SubAccountEnableResult = z.infer<typeof SubAccountEnableResultSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n SubAccountEntry,\n SubAccountDepositAddress,\n SubAccountDepositAddressSchema,\n SubAccountDepositHistoryEntry,\n SubAccountDepositHistoryResponseSchema,\n SubAccountEnableResult,\n SubAccountEnableResultSchema,\n SubAccountFuturesSummary,\n SubAccountFuturesSummarySchema,\n SubAccountListResponseSchema,\n SubAccountMarginAccount,\n SubAccountMarginAccountSchema,\n SubAccountSpotAssetsResponse,\n SubAccountSpotAssetsResponseSchema,\n SubAccountSpotSummary,\n SubAccountSpotSummarySchema,\n SubAccountStatus,\n SubAccountStatusResponseSchema,\n SubAccountUniversalTransferHistoryResponse,\n SubAccountUniversalTransferHistoryResponseSchema,\n SubAccountUniversalTransferParams,\n SubAccountUniversalTransferResult,\n SubAccountUniversalTransferResultSchema,\n VirtualSubAccountResult,\n VirtualSubAccountResultSchema,\n} from '../types/subaccount.types.js';\n\nexport class SubAccount {\n constructor(private readonly http: HttpClient) {}\n\n async list(options?: { email?: string; isFreeze?: boolean; page?: number; limit?: number }): Promise<SubAccountEntry[]> {\n const res = await this.http.get('/sapi/v1/sub-account/list', options, 'signed');\n return SubAccountListResponseSchema.parse(res).subAccounts;\n }\n\n async status(email?: string): Promise<SubAccountStatus[]> {\n const params = email ? { email } : undefined;\n return SubAccountStatusResponseSchema.parse(\n await this.http.get('/sapi/v1/sub-account/status', params, 'signed'),\n );\n }\n\n async spotAssets(email: string): Promise<SubAccountSpotAssetsResponse> {\n return SubAccountSpotAssetsResponseSchema.parse(\n await this.http.get('/sapi/v3/sub-account/assets', { email }, 'signed'),\n );\n }\n\n async spotSummary(options?: { email?: string; page?: number; size?: number }): Promise<SubAccountSpotSummary> {\n return SubAccountSpotSummarySchema.parse(\n await this.http.get('/sapi/v1/sub-account/spotSummary', options, 'signed'),\n );\n }\n\n async futuresAccountSummary(futuresType: 1 | 2): Promise<SubAccountFuturesSummary> {\n return SubAccountFuturesSummarySchema.parse(\n await this.http.get('/sapi/v2/sub-account/futures/accountSummary', { futuresType }, 'signed'),\n );\n }\n\n async marginAccount(email: string): Promise<SubAccountMarginAccount> {\n return SubAccountMarginAccountSchema.parse(\n await this.http.get('/sapi/v1/sub-account/margin/account', { email }, 'signed'),\n );\n }\n\n async universalTransfer(params: SubAccountUniversalTransferParams): Promise<SubAccountUniversalTransferResult> {\n return SubAccountUniversalTransferResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/universalTransfer', params, 'signed'),\n );\n }\n\n async universalTransferHistory(options?: {\n fromEmail?: string;\n toEmail?: string;\n clientTranId?: string;\n startTime?: number;\n endTime?: number;\n page?: number;\n limit?: number;\n }): Promise<SubAccountUniversalTransferHistoryResponse> {\n return SubAccountUniversalTransferHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/sub-account/universalTransfer', options, 'signed'),\n );\n }\n\n async createVirtualSubAccount(subAccountString: string): Promise<VirtualSubAccountResult> {\n return VirtualSubAccountResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/virtualSubAccount', { subAccountString }, 'signed'),\n );\n }\n\n async enableFutures(email: string): Promise<SubAccountEnableResult> {\n return SubAccountEnableResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/futures/enable', { email }, 'signed'),\n );\n }\n\n async enableMargin(email: string): Promise<SubAccountEnableResult> {\n return SubAccountEnableResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/margin/enable', { email }, 'signed'),\n );\n }\n\n async depositAddress(email: string, coin: string, network?: string): Promise<SubAccountDepositAddress> {\n return SubAccountDepositAddressSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/subAddress', { email, coin, network }, 'signed'),\n );\n }\n\n async depositHistory(options: {\n email: string;\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n limit?: number;\n offset?: number;\n }): Promise<SubAccountDepositHistoryEntry[]> {\n return SubAccountDepositHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/subHisrec', options, 'signed'),\n );\n }\n}\n","import { EventEmitter } from 'node:events';\nimport WebSocket, { type RawData } from 'ws';\nimport { parseWsPayload, type WsStreamPayload } from '../types/ws.types.js';\n\nexport interface BaseWSOptions {\n baseStreamUrl: string;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n}\n\ninterface CombinedStreamMessage {\n stream: string;\n data: unknown;\n}\n\nexport class BaseWS extends EventEmitter {\n private ws: WebSocket | null = null;\n private readonly streams = new Set<string>();\n private reconnectAttempt = 0;\n private closedByUser = false;\n\n constructor(private readonly options: BaseWSOptions) {\n super();\n }\n\n subscribe(streams: string[]): void {\n streams.forEach((s) => this.streams.add(s));\n if (this.isOpen()) {\n this.send({ method: 'SUBSCRIBE', params: streams, id: Date.now() });\n } else {\n this.connect();\n }\n }\n\n unsubscribe(streams: string[]): void {\n streams.forEach((s) => this.streams.delete(s));\n if (this.isOpen()) {\n this.send({ method: 'UNSUBSCRIBE', params: streams, id: Date.now() });\n }\n }\n\n close(): void {\n this.closedByUser = true;\n this.ws?.close();\n }\n\n reconnect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n this.reconnectAttempt = 0;\n if (!this.closedByUser) this.connect();\n }\n\n resetReconnectAttempts(): void {\n this.reconnectAttempt = 0;\n }\n\n private isOpen(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private send(payload: unknown): void {\n this.ws?.send(JSON.stringify(payload));\n }\n\n private connect(): void {\n this.closedByUser = false;\n const url = `${this.options.baseStreamUrl}?streams=${[...this.streams].join('/')}`;\n this.ws = new WebSocket(url);\n\n this.ws.on('open', () => {\n this.reconnectAttempt = 0;\n this.emit('open');\n });\n\n this.ws.on('message', (raw: RawData) => {\n this.handleMessage(raw.toString());\n });\n\n this.ws.on('close', () => {\n this.emit('close');\n if (!this.closedByUser) this.scheduleReconnect();\n });\n\n this.ws.on('error', (err: Error) => {\n if (this.closedByUser) return;\n this.emit('error', err);\n });\n }\n\n private handleMessage(raw: string): void {\n let parsed: CombinedStreamMessage;\n try {\n parsed = JSON.parse(raw) as CombinedStreamMessage;\n } catch {\n return;\n }\n if (!parsed.stream || parsed.data === undefined) return;\n\n try {\n const payload: WsStreamPayload = parseWsPayload(parsed.stream, parsed.data);\n this.emit('message', parsed.stream, payload);\n this.emit(parsed.stream, payload);\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n private scheduleReconnect(): void {\n const base = this.options.reconnectDelayMs ?? 1000;\n const max = this.options.maxReconnectDelayMs ?? 30_000;\n const delay = Math.min(base * 2 ** this.reconnectAttempt, max);\n this.reconnectAttempt += 1;\n setTimeout(() => {\n if (!this.closedByUser) this.connect();\n }, delay);\n }\n}\n","import { z } from 'zod';\n\nexport const WsKlinePayloadSchema = z.object({\n e: z.literal('kline'),\n E: z.number(),\n s: z.string(),\n k: z.object({\n t: z.number(),\n T: z.number(),\n s: z.string(),\n i: z.string(),\n o: z.string().transform(Number),\n c: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n v: z.string().transform(Number),\n n: z.number(),\n x: z.boolean(),\n q: z.string().transform(Number),\n V: z.string().transform(Number),\n Q: z.string().transform(Number),\n }),\n});\nexport type WsKlinePayload = z.infer<typeof WsKlinePayloadSchema>;\n\nexport const WsAggTradePayloadSchema = z.object({\n e: z.literal('aggTrade'),\n E: z.number(),\n s: z.string(),\n a: z.number(),\n p: z.string().transform(Number),\n q: z.string().transform(Number),\n f: z.number(),\n l: z.number(),\n T: z.number(),\n m: z.boolean(),\n});\nexport type WsAggTradePayload = z.infer<typeof WsAggTradePayloadSchema>;\n\nexport const WsTradePayloadSchema = z.object({\n e: z.literal('trade'),\n E: z.number(),\n s: z.string(),\n t: z.number(),\n p: z.string().transform(Number),\n q: z.string().transform(Number),\n T: z.number(),\n m: z.boolean(),\n});\nexport type WsTradePayload = z.infer<typeof WsTradePayloadSchema>;\n\nexport const WsDepthUpdatePayloadSchema = z.object({\n e: z.literal('depthUpdate'),\n E: z.number(),\n s: z.string(),\n U: z.number(),\n u: z.number(),\n T: z.number().optional(),\n pu: z.number().optional(),\n b: z.array(z.tuple([z.string(), z.string()])),\n a: z.array(z.tuple([z.string(), z.string()])),\n});\nexport type WsDepthUpdatePayload = z.infer<typeof WsDepthUpdatePayloadSchema>;\n\nexport const WsTicker24hrPayloadSchema = z.object({\n e: z.literal('24hrTicker'),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n P: z.string().transform(Number),\n c: z.string().transform(Number),\n o: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n v: z.string().transform(Number),\n q: z.string().transform(Number),\n});\nexport type WsTicker24hrPayload = z.infer<typeof WsTicker24hrPayloadSchema>;\n\nexport const WsBookTickerPayloadSchema = z.object({\n u: z.number(),\n s: z.string(),\n b: z.string().transform(Number),\n B: z.string().transform(Number),\n a: z.string().transform(Number),\n A: z.string().transform(Number),\n});\nexport type WsBookTickerPayload = z.infer<typeof WsBookTickerPayloadSchema>;\n\nexport const WsMarkPricePayloadSchema = z.object({\n e: z.literal('markPriceUpdate'),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n i: z.string().transform(Number),\n P: z.string().transform(Number),\n r: z.string().transform(Number),\n T: z.number(),\n});\nexport type WsMarkPricePayload = z.infer<typeof WsMarkPricePayloadSchema>;\n\nexport const WsMiniTickerPayloadSchema = z.object({\n e: z.literal('24hrMiniTicker'),\n E: z.number(),\n s: z.string(),\n c: z.string().transform(Number),\n o: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n v: z.string().transform(Number),\n q: z.string().transform(Number),\n});\nexport type WsMiniTickerPayload = z.infer<typeof WsMiniTickerPayloadSchema>;\n\nexport const WsForceOrderPayloadSchema = z.object({\n e: z.literal('forceOrder'),\n E: z.number(),\n o: z.object({\n s: z.string(),\n S: z.string(),\n o: z.string(),\n f: z.string(),\n q: z.string().transform(Number),\n p: z.string().transform(Number),\n ap: z.string().transform(Number),\n X: z.string(),\n l: z.string().transform(Number),\n z: z.string().transform(Number),\n T: z.number(),\n }),\n});\nexport type WsForceOrderPayload = z.infer<typeof WsForceOrderPayloadSchema>;\n\nexport const WsCompositeIndexPayloadSchema = z.object({\n e: z.literal('compositeIndex'),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n c: z.array(\n z.object({\n b: z.string(),\n q: z.string(),\n w: z.string().transform(Number),\n p: z.string().transform(Number),\n }),\n ),\n});\nexport type WsCompositeIndexPayload = z.infer<typeof WsCompositeIndexPayloadSchema>;\n\nexport const WsAssetIndexPayloadSchema = z.object({\n e: z.literal('assetIndex'),\n E: z.number(),\n s: z.string(),\n i: z.string().transform(Number),\n b: z.string().transform(Number),\n a: z.string().transform(Number),\n});\nexport type WsAssetIndexPayload = z.infer<typeof WsAssetIndexPayloadSchema>;\n\nexport const WsRollingWindowTickerPayloadSchema = z.object({\n e: z.enum(['1hTicker', '4hTicker', '1dTicker', '7dTicker', '30dTicker']),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n P: z.string().transform(Number),\n o: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n c: z.string().transform(Number),\n v: z.string().transform(Number),\n q: z.string().transform(Number),\n O: z.number(),\n C: z.number(),\n});\nexport type WsRollingWindowTickerPayload = z.infer<typeof WsRollingWindowTickerPayloadSchema>;\n\nexport const WsSpotAvgPricePayloadSchema = z.object({\n e: z.literal('avgPrice'),\n E: z.number(),\n s: z.string(),\n i: z.string(),\n w: z.string().transform(Number),\n T: z.number(),\n});\nexport type WsSpotAvgPricePayload = z.infer<typeof WsSpotAvgPricePayloadSchema>;\n\nexport type WsStreamPayload =\n | WsKlinePayload\n | WsAggTradePayload\n | WsTradePayload\n | WsDepthUpdatePayload\n | WsTicker24hrPayload\n | WsBookTickerPayload\n | WsMarkPricePayload\n | WsMiniTickerPayload\n | WsForceOrderPayload\n | WsCompositeIndexPayload\n | WsAssetIndexPayload\n | WsRollingWindowTickerPayload\n | WsSpotAvgPricePayload;\n\nexport function parseWsPayload(streamName: string, raw: unknown): WsStreamPayload {\n if (streamName.includes('@kline_')) return WsKlinePayloadSchema.parse(raw);\n if (streamName.includes('@continuousKline_') || streamName.includes('@indexPriceKline_') || streamName.includes('@markPriceKline_')) {\n return WsKlinePayloadSchema.parse(raw);\n }\n if (streamName.includes('@aggTrade')) return WsAggTradePayloadSchema.parse(raw);\n if (streamName.includes('@trade')) return WsTradePayloadSchema.parse(raw);\n if (streamName.includes('@depth')) return WsDepthUpdatePayloadSchema.parse(raw);\n if (streamName.includes('@bookTicker')) return WsBookTickerPayloadSchema.parse(raw);\n if (streamName.includes('@markPrice')) return WsMarkPricePayloadSchema.parse(raw);\n if (streamName.includes('@miniTicker')) return WsMiniTickerPayloadSchema.parse(raw);\n if (streamName.includes('@forceOrder')) return WsForceOrderPayloadSchema.parse(raw);\n if (streamName.includes('@compositeIndex')) return WsCompositeIndexPayloadSchema.parse(raw);\n if (streamName.includes('@assetIndex')) return WsAssetIndexPayloadSchema.parse(raw);\n if (streamName.includes('@avgPrice')) return WsSpotAvgPricePayloadSchema.parse(raw);\n if (streamName.includes('@ticker_')) return WsRollingWindowTickerPayloadSchema.parse(raw);\n if (streamName.includes('@ticker')) return WsTicker24hrPayloadSchema.parse(raw);\n throw new Error(`Unknown WS stream type: ${streamName}`);\n}\n","import { BaseWS } from './BaseWS.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport type ContractType = 'perpetual' | 'current_quarter' | 'next_quarter';\nexport type MarkPriceSpeed = '1s' | '3s';\n\nexport class FuturesMarketWS extends BaseWS {\n constructor(baseStreamUrl = 'wss://fstream.binance.com/stream') {\n super({ baseStreamUrl });\n }\n\n kline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@kline_${interval}`;\n }\n\n continuousKline(symbol: string, contractType: ContractType, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@continuousKline_${contractType}_${interval}`;\n }\n\n indexPriceKline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@indexPriceKline_${interval}`;\n }\n\n markPriceKline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@markPriceKline_${interval}`;\n }\n\n aggTrade(symbol: string): string {\n return `${symbol.toLowerCase()}@aggTrade`;\n }\n\n trade(symbol: string): string {\n return `${symbol.toLowerCase()}@trade`;\n }\n\n depth(symbol: string, level: 5 | 10 | 20 = 20): string {\n return `${symbol.toLowerCase()}@depth${level}`;\n }\n\n depthDiff(symbol: string): string {\n return `${symbol.toLowerCase()}@depth`;\n }\n\n depthDiffSpeed(symbol: string, updateSpeed: '100ms' | '500ms'): string {\n return `${symbol.toLowerCase()}@depth@${updateSpeed}`;\n }\n\n ticker(symbol: string): string {\n return `${symbol.toLowerCase()}@ticker`;\n }\n\n rollingWindowTicker(symbol: string, window: '1h' | '4h' | '1d' = '1h'): string {\n return `${symbol.toLowerCase()}@ticker_${window}`;\n }\n\n allRollingWindowTickers(window: '1h' | '4h' | '1d' = '1h'): string {\n return `!ticker_${window}@arr`;\n }\n\n allMarketTickers(): string {\n return '!ticker@arr';\n }\n\n allBookTickers(): string {\n return '!bookTicker';\n }\n\n miniTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@miniTicker`;\n }\n\n allMiniTickers(): string {\n return '!miniTicker@arr';\n }\n\n markPrice(symbol: string, updateSpeed: MarkPriceSpeed = '3s'): string {\n return `${symbol.toLowerCase()}@markPrice@${updateSpeed}`;\n }\n\n allMarkPrices(): string {\n return '!markPrice@arr';\n }\n\n bookTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@bookTicker`;\n }\n\n liquidationOrder(symbol: string): string {\n return `${symbol.toLowerCase()}@forceOrder`;\n }\n\n allLiquidationOrders(): string {\n return '!forceOrder@arr';\n }\n\n compositeIndex(symbol: string): string {\n return `${symbol.toLowerCase()}@compositeIndex`;\n }\n\n assetIndex(symbol: string): string {\n return `${symbol.toLowerCase()}@assetIndex`;\n }\n\n allAssetIndices(): string {\n return '!assetIndex@arr';\n }\n}\n","import { BaseWS } from './BaseWS.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport class SpotMarketWS extends BaseWS {\n constructor(baseStreamUrl = 'wss://stream.binance.com:9443/stream') {\n super({ baseStreamUrl });\n }\n\n kline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@kline_${interval}`;\n }\n\n aggTrade(symbol: string): string {\n return `${symbol.toLowerCase()}@aggTrade`;\n }\n\n trade(symbol: string): string {\n return `${symbol.toLowerCase()}@trade`;\n }\n\n depth(symbol: string, level: 5 | 10 | 20 = 20): string {\n return `${symbol.toLowerCase()}@depth${level}`;\n }\n\n depthDiff(symbol: string): string {\n return `${symbol.toLowerCase()}@depth`;\n }\n\n depthDiffSpeed(symbol: string, updateSpeed: '100ms'): string {\n return `${symbol.toLowerCase()}@depth@${updateSpeed}`;\n }\n\n avgPrice(symbol: string): string {\n return `${symbol.toLowerCase()}@avgPrice`;\n }\n\n ticker(symbol: string): string {\n return `${symbol.toLowerCase()}@ticker`;\n }\n\n rollingWindowTicker(\n symbol: string,\n window: '1h' | '4h' | '1d' | '7d' | '30d' = '1h',\n ): string {\n return `${symbol.toLowerCase()}@ticker_${window}`;\n }\n\n allRollingWindowTickers(window: '1h' | '4h' | '1d' | '7d' | '30d' = '1h'): string {\n return `!ticker_${window}@arr`;\n }\n\n miniTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@miniTicker`;\n }\n\n allMarketTickers(): string {\n return '!ticker@arr';\n }\n\n allMiniTickers(): string {\n return '!miniTicker@arr';\n }\n\n bookTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@bookTicker`;\n }\n\n allBookTickers(): string {\n return '!bookTicker';\n }\n}\n","import { EventEmitter } from 'node:events';\nimport WebSocket, { type RawData } from 'ws';\nimport { parseSpotUserDataEvent, type SpotUserDataEvent } from '../types/spot.types.js';\n\nexport interface SpotUserWSOptions {\n baseUserUrl: string;\n getListenKey: () => string | null;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n}\n\nexport class SpotUserWS extends EventEmitter {\n private ws: WebSocket | null = null;\n private reconnectAttempt = 0;\n private closedByUser = false;\n\n constructor(private readonly options: SpotUserWSOptions) {\n super();\n }\n\n connect(): void {\n const listenKey = this.options.getListenKey();\n if (!listenKey) {\n this.emit('error', new Error('No spot listenKey available for user data stream'));\n return;\n }\n this.closedByUser = false;\n const url = `${this.options.baseUserUrl}/${listenKey}`;\n this.ws = new WebSocket(url);\n\n this.ws.on('open', () => {\n this.reconnectAttempt = 0;\n this.emit('open');\n });\n\n this.ws.on('message', (raw: RawData) => {\n this.handleMessage(raw.toString());\n });\n\n this.ws.on('close', () => {\n this.emit('close');\n if (!this.closedByUser) this.scheduleReconnect();\n });\n\n this.ws.on('error', (err: Error) => {\n this.emit('error', err);\n });\n }\n\n close(): void {\n this.closedByUser = true;\n this.ws?.close();\n }\n\n reconnect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n this.reconnectAttempt = 0;\n if (!this.closedByUser) this.connect();\n }\n\n resetReconnectAttempts(): void {\n this.reconnectAttempt = 0;\n }\n\n private handleMessage(raw: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n try {\n const event: SpotUserDataEvent = parseSpotUserDataEvent(parsed);\n this.emit(event.e, event);\n this.emit('userData', event);\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n private scheduleReconnect(): void {\n const base = this.options.reconnectDelayMs ?? 1000;\n const max = this.options.maxReconnectDelayMs ?? 30_000;\n const delay = Math.min(base * 2 ** this.reconnectAttempt, max);\n this.reconnectAttempt += 1;\n setTimeout(() => {\n if (!this.closedByUser) this.connect();\n }, delay);\n }\n}\n","import { EventEmitter } from 'node:events';\nimport WebSocket, { type RawData } from 'ws';\nimport {\n parseUserDataEvent,\n type UserDataEvent,\n} from '../types/userdata.types.js';\n\nexport interface FuturesUserWSOptions {\n baseUserUrl: string;\n getListenKey: () => string | null;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n}\n\nexport class FuturesUserWS extends EventEmitter {\n private ws: WebSocket | null = null;\n private reconnectAttempt = 0;\n private closedByUser = false;\n\n constructor(private readonly options: FuturesUserWSOptions) {\n super();\n }\n\n connect(): void {\n const listenKey = this.options.getListenKey();\n if (!listenKey) {\n this.emit('error', new Error('No listenKey available for user data stream'));\n return;\n }\n this.closedByUser = false;\n const url = `${this.options.baseUserUrl}/${listenKey}`;\n this.ws = new WebSocket(url);\n\n this.ws.on('open', () => {\n this.reconnectAttempt = 0;\n this.emit('open');\n });\n\n this.ws.on('message', (raw: RawData) => {\n this.handleMessage(raw.toString());\n });\n\n this.ws.on('close', () => {\n this.emit('close');\n if (!this.closedByUser) this.scheduleReconnect();\n });\n\n this.ws.on('error', (err: Error) => {\n this.emit('error', err);\n });\n }\n\n close(): void {\n this.closedByUser = true;\n this.ws?.close();\n }\n\n reconnect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n this.reconnectAttempt = 0;\n if (!this.closedByUser) this.connect();\n }\n\n resetReconnectAttempts(): void {\n this.reconnectAttempt = 0;\n }\n\n private handleMessage(raw: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n try {\n const event: UserDataEvent = parseUserDataEvent(parsed);\n this.emit(event.e, event);\n this.emit('userData', event);\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n private scheduleReconnect(): void {\n const base = this.options.reconnectDelayMs ?? 1000;\n const max = this.options.maxReconnectDelayMs ?? 30_000;\n const delay = Math.min(base * 2 ** this.reconnectAttempt, max);\n this.reconnectAttempt += 1;\n setTimeout(() => {\n if (!this.closedByUser) this.connect();\n }, delay);\n }\n}\n","import { BaseWS } from './BaseWS.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport type CoinMContractType = 'perpetual' | 'current_quarter' | 'next_quarter';\nexport type CoinMMarkPriceSpeed = '1s' | '3s';\n\n/**\n * COIN-M stream names mirror USD-M's naming scheme exactly, just against `dstream.binance.com`\n * and inverse-contract symbols/pairs (e.g. `btcusd_perp`, `btcusd`).\n */\nexport class CoinMMarketWS extends BaseWS {\n constructor(baseStreamUrl = 'wss://dstream.binance.com/stream') {\n super({ baseStreamUrl });\n }\n\n kline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@kline_${interval}`;\n }\n\n continuousKline(pair: string, contractType: CoinMContractType, interval: KlineInterval): string {\n return `${pair.toLowerCase()}_${contractType}@continuousKline_${interval}`;\n }\n\n indexPriceKline(pair: string, interval: KlineInterval): string {\n return `${pair.toLowerCase()}@indexPriceKline_${interval}`;\n }\n\n markPriceKline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@markPriceKline_${interval}`;\n }\n\n aggTrade(symbol: string): string {\n return `${symbol.toLowerCase()}@aggTrade`;\n }\n\n trade(symbol: string): string {\n return `${symbol.toLowerCase()}@trade`;\n }\n\n depth(symbol: string, level: 5 | 10 | 20 = 20): string {\n return `${symbol.toLowerCase()}@depth${level}`;\n }\n\n depthDiff(symbol: string): string {\n return `${symbol.toLowerCase()}@depth`;\n }\n\n depthDiffSpeed(symbol: string, updateSpeed: '100ms' | '250ms' | '500ms'): string {\n return `${symbol.toLowerCase()}@depth@${updateSpeed}`;\n }\n\n ticker(symbol: string): string {\n return `${symbol.toLowerCase()}@ticker`;\n }\n\n allMarketTickers(): string {\n return '!ticker@arr';\n }\n\n miniTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@miniTicker`;\n }\n\n allMiniTickers(): string {\n return '!miniTicker@arr';\n }\n\n bookTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@bookTicker`;\n }\n\n allBookTickers(): string {\n return '!bookTicker';\n }\n\n markPrice(symbol: string, updateSpeed: CoinMMarkPriceSpeed = '3s'): string {\n return `${symbol.toLowerCase()}@markPrice@${updateSpeed}`;\n }\n\n markPriceForPair(pair: string, updateSpeed: CoinMMarkPriceSpeed = '3s'): string {\n return `${pair.toLowerCase()}@markPrice@${updateSpeed}`;\n }\n\n liquidationOrder(symbol: string): string {\n return `${symbol.toLowerCase()}@forceOrder`;\n }\n\n allLiquidationOrders(): string {\n return '!forceOrder@arr';\n }\n}\n","import { EventEmitter } from 'node:events';\nimport WebSocket, { type RawData } from 'ws';\nimport {\n parseUserDataEvent,\n type UserDataEvent,\n} from '../types/userdata.types.js';\n\nexport interface CoinMUserWSOptions {\n baseUserUrl: string;\n getListenKey: () => string | null;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n}\n\n/**\n * COIN-M user data events (ACCOUNT_UPDATE, ORDER_TRADE_UPDATE, MARGIN_CALL) share the same\n * event shape as USD-M's, so the USD-M parser/types are reused as-is.\n */\nexport class CoinMUserWS extends EventEmitter {\n private ws: WebSocket | null = null;\n private reconnectAttempt = 0;\n private closedByUser = false;\n\n constructor(private readonly options: CoinMUserWSOptions) {\n super();\n }\n\n connect(): void {\n const listenKey = this.options.getListenKey();\n if (!listenKey) {\n this.emit('error', new Error('No listenKey available for COIN-M user data stream'));\n return;\n }\n this.closedByUser = false;\n const url = `${this.options.baseUserUrl}/${listenKey}`;\n this.ws = new WebSocket(url);\n\n this.ws.on('open', () => {\n this.reconnectAttempt = 0;\n this.emit('open');\n });\n\n this.ws.on('message', (raw: RawData) => {\n this.handleMessage(raw.toString());\n });\n\n this.ws.on('close', () => {\n this.emit('close');\n if (!this.closedByUser) this.scheduleReconnect();\n });\n\n this.ws.on('error', (err: Error) => {\n this.emit('error', err);\n });\n }\n\n close(): void {\n this.closedByUser = true;\n this.ws?.close();\n }\n\n reconnect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n this.reconnectAttempt = 0;\n if (!this.closedByUser) this.connect();\n }\n\n resetReconnectAttempts(): void {\n this.reconnectAttempt = 0;\n }\n\n private handleMessage(raw: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n try {\n const event: UserDataEvent = parseUserDataEvent(parsed);\n this.emit(event.e, event);\n this.emit('userData', event);\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n private scheduleReconnect(): void {\n const base = this.options.reconnectDelayMs ?? 1000;\n const max = this.options.maxReconnectDelayMs ?? 30_000;\n const delay = Math.min(base * 2 ** this.reconnectAttempt, max);\n this.reconnectAttempt += 1;\n setTimeout(() => {\n if (!this.closedByUser) this.connect();\n }, delay);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport WebSocket from 'ws';\nimport { NetworkError } from '../errors/index.js';\nimport type { WsApiResponse } from '../types/userdata.types.js';\nimport { Signer, type SignatureAlgorithm } from '../client/Signer.js';\n\nexport interface WsApiOptions {\n baseUrl: string;\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n recvWindow?: number;\n timeoutMs?: number;\n}\n\ninterface WsApiRequestParams {\n id?: string;\n [key: string]: unknown;\n}\n\nfunction buildQueryString(data: Record<string, unknown>): string {\n return Object.entries(data)\n .filter(([, val]) => val !== undefined && val !== null)\n .map(([key, val]) => `${key}=${encodeURIComponent(String(val))}`)\n .join('&');\n}\n\nexport class WsApi {\n private readonly signer: Signer;\n\n constructor(private readonly options: WsApiOptions) {\n this.signer = new Signer({\n algorithm: options.signatureAlgorithm,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n });\n }\n\n async request(\n method: string,\n params: WsApiRequestParams = {},\n options?: { signed?: boolean },\n ): Promise<WsApiResponse> {\n const { apiKey } = this.options;\n const signed = options?.signed ?? true;\n const { id = randomUUID(), ...methodParams } = params;\n const requestParams: Record<string, unknown> = { ...methodParams };\n\n if (signed) {\n if (!apiKey || !this.signer.canSign()) {\n throw new Error('API key and secret (or privateKey) required for signed WebSocket API requests');\n }\n requestParams.apiKey = apiKey;\n requestParams.timestamp = Date.now();\n requestParams.recvWindow = this.options.recvWindow ?? 5000;\n const queryString = buildQueryString(requestParams);\n requestParams.signature = this.signer.sign(queryString);\n }\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(this.options.baseUrl);\n const timeout = setTimeout(() => {\n ws.close();\n reject(new NetworkError(`WebSocket API request timed out: ${method}`));\n }, this.options.timeoutMs ?? 15_000);\n\n ws.on('open', () => ws.send(JSON.stringify({ id, method, params: requestParams })));\n ws.on('message', (raw: Buffer) => {\n clearTimeout(timeout);\n ws.close();\n try {\n const parsed = JSON.parse(raw.toString()) as WsApiResponse;\n if (parsed.status >= 400) {\n reject(new Error(parsed.error?.msg ?? `WebSocket API error: ${method}`));\n } else {\n resolve(parsed);\n }\n } catch (err) {\n reject(new NetworkError('Invalid WebSocket API JSON payload', err));\n }\n });\n ws.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(new NetworkError(err.message, err));\n });\n });\n }\n\n placeOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.place', params);\n }\n\n cancelOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancel', params);\n }\n\n modifyOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.modify', params);\n }\n\n placeAlgoOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('algoOrder.place', params);\n }\n\n cancelAlgoOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('algoOrder.cancel', params);\n }\n\n orderStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.status', params);\n }\n\n placeOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.place', params);\n }\n\n cancelOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.cancel', params);\n }\n\n orderListStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.status', params);\n }\n\n accountStatus(): Promise<WsApiResponse> {\n return this.request('account.status', {});\n }\n\n accountPosition(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('account.position', params);\n }\n\n userDataStreamStart(): Promise<WsApiResponse> {\n return this.request('userDataStream.start', {});\n }\n\n userDataStreamPing(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.ping', { listenKey });\n }\n\n userDataStreamStop(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.stop', { listenKey });\n }\n\n // ---- Public market data (no signature required) ----\n\n time(): Promise<WsApiResponse> {\n return this.request('time', {}, { signed: false });\n }\n\n exchangeInfo(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('exchangeInfo', params, { signed: false });\n }\n\n klines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('klines', params, { signed: false });\n }\n\n aggTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('aggTrades', params, { signed: false });\n }\n\n trades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades', params, { signed: false });\n }\n\n depth(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('depth', params, { signed: false });\n }\n\n avgPrice(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('avgPrice', params, { signed: false });\n }\n\n tickerPrice(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.price', params, { signed: false });\n }\n\n tickerBookTicker(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.bookTicker', params, { signed: false });\n }\n\n ticker24hr(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.24hr', params, { signed: false });\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport WebSocket from 'ws';\nimport { NetworkError } from '../errors/index.js';\nimport type { WsApiResponse } from '../types/userdata.types.js';\nimport { Signer, type SignatureAlgorithm } from '../client/Signer.js';\n\nexport interface SpotWsApiOptions {\n baseUrl: string;\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n recvWindow?: number;\n timeoutMs?: number;\n}\n\ninterface WsApiRequestParams {\n id?: string;\n [key: string]: unknown;\n}\n\nfunction buildQueryString(data: Record<string, unknown>): string {\n return Object.entries(data)\n .filter(([, val]) => val !== undefined && val !== null)\n .map(([key, val]) => `${key}=${encodeURIComponent(String(val))}`)\n .join('&');\n}\n\n/**\n * Spot WebSocket API (`wss://ws-api.binance.com:443/ws-api/v3`). Same request/response envelope\n * as the futures {@link WsApi}, but Spot uses its own method identifiers (`trades.recent` rather\n * than `trades`, `ticker.book` rather than `ticker.bookTicker`, etc.) — hence a separate class\n * rather than pointing WsApi at a different host.\n */\nexport class SpotWsApi {\n private readonly signer: Signer;\n\n constructor(private readonly options: SpotWsApiOptions) {\n this.signer = new Signer({\n algorithm: options.signatureAlgorithm,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n });\n }\n\n async request(\n method: string,\n params: WsApiRequestParams = {},\n options?: { signed?: boolean },\n ): Promise<WsApiResponse> {\n const { apiKey } = this.options;\n const signed = options?.signed ?? true;\n const { id = randomUUID(), ...methodParams } = params;\n const requestParams: Record<string, unknown> = { ...methodParams };\n\n if (signed) {\n if (!apiKey || !this.signer.canSign()) {\n throw new Error('API key and secret (or privateKey) required for signed WebSocket API requests');\n }\n requestParams.apiKey = apiKey;\n requestParams.timestamp = Date.now();\n requestParams.recvWindow = this.options.recvWindow ?? 5000;\n const queryString = buildQueryString(requestParams);\n requestParams.signature = this.signer.sign(queryString);\n }\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(this.options.baseUrl);\n const timeout = setTimeout(() => {\n ws.close();\n reject(new NetworkError(`WebSocket API request timed out: ${method}`));\n }, this.options.timeoutMs ?? 15_000);\n\n ws.on('open', () => ws.send(JSON.stringify({ id, method, params: requestParams })));\n ws.on('message', (raw: Buffer) => {\n clearTimeout(timeout);\n ws.close();\n try {\n const parsed = JSON.parse(raw.toString()) as WsApiResponse;\n if (parsed.status >= 400) {\n reject(new Error(parsed.error?.msg ?? `WebSocket API error: ${method}`));\n } else {\n resolve(parsed);\n }\n } catch (err) {\n reject(new NetworkError('Invalid WebSocket API JSON payload', err));\n }\n });\n ws.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(new NetworkError(err.message, err));\n });\n });\n }\n\n // ---- Trading (signed) ----\n\n placeOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.place', params);\n }\n\n testOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.test', params);\n }\n\n cancelOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancel', params);\n }\n\n cancelReplaceOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancelReplace', params);\n }\n\n orderStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.status', params);\n }\n\n openOrdersStatus(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('openOrders.status', params);\n }\n\n cancelOpenOrders(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('openOrders.cancelAll', params);\n }\n\n placeOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.place', params);\n }\n\n cancelOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.cancel', params);\n }\n\n orderListStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.status', params);\n }\n\n openOrderListsStatus(): Promise<WsApiResponse> {\n return this.request('openOrderLists.status', {});\n }\n\n // ---- Account (signed) ----\n\n accountStatus(): Promise<WsApiResponse> {\n return this.request('account.status', {});\n }\n\n accountCommission(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('account.commission', params);\n }\n\n accountRateLimitsOrders(): Promise<WsApiResponse> {\n return this.request('account.rateLimits.orders', {});\n }\n\n allOrders(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('allOrders', params);\n }\n\n allOrderLists(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('allOrderLists', params);\n }\n\n myTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('myTrades', params);\n }\n\n // ---- User data stream (managed listen keys) ----\n\n userDataStreamStart(): Promise<WsApiResponse> {\n return this.request('userDataStream.start', {});\n }\n\n userDataStreamPing(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.ping', { listenKey });\n }\n\n userDataStreamStop(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.stop', { listenKey });\n }\n\n // ---- Public market data (no signature required) ----\n\n ping(): Promise<WsApiResponse> {\n return this.request('ping', {}, { signed: false });\n }\n\n time(): Promise<WsApiResponse> {\n return this.request('time', {}, { signed: false });\n }\n\n exchangeInfo(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('exchangeInfo', params, { signed: false });\n }\n\n depth(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('depth', params, { signed: false });\n }\n\n recentTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.recent', params, { signed: false });\n }\n\n historicalTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.historical', params, { signed: false });\n }\n\n aggTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.aggregate', params, { signed: false });\n }\n\n klines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('klines', params, { signed: false });\n }\n\n uiKlines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('uiKlines', params, { signed: false });\n }\n\n avgPrice(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('avgPrice', params, { signed: false });\n }\n\n ticker24hr(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.24hr', params, { signed: false });\n }\n\n tickerTradingDay(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('ticker.tradingDay', params, { signed: false });\n }\n\n tickerPrice(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.price', params, { signed: false });\n }\n\n tickerBook(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.book', params, { signed: false });\n }\n\n ticker(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('ticker', params, { signed: false });\n }\n}\n","import type { AxiosRequestConfig } from 'axios';\nimport { HttpClient, type SignatureAlgorithm } from './HttpClient.js';\nimport type { RateLimitUsage } from './RateLimitTracker.js';\nimport { TradingPolicy, type TradingPolicyOptions } from './TradingPolicy.js';\nimport { resolveEnvironment } from './endpoints.js';\nimport { FuturesData } from '../resources/FuturesData.js';\nimport { FuturesMarket } from '../resources/FuturesMarket.js';\nimport { SpotMarket } from '../resources/SpotMarket.js';\nimport { SpotAccount, SpotTrading } from '../resources/SpotTrading.js';\nimport { SpotUserDataStream } from '../resources/SpotUserDataStream.js';\nimport { FuturesAccount } from '../resources/FuturesAccount.js';\nimport { FuturesTrading } from '../resources/FuturesTrading.js';\nimport { FuturesOps } from '../resources/FuturesOps.js';\nimport { UserDataStream } from '../resources/UserDataStream.js';\nimport { CoinMMarket } from '../resources/CoinMMarket.js';\nimport { CoinMAccount } from '../resources/CoinMAccount.js';\nimport { CoinMTrading } from '../resources/CoinMTrading.js';\nimport { CoinMUserDataStream } from '../resources/CoinMUserDataStream.js';\nimport { MarginAccount, MarginTrading } from '../resources/Margin.js';\nimport { Wallet } from '../resources/Wallet.js';\nimport { SubAccount } from '../resources/SubAccount.js';\nimport { FuturesMarketWS } from '../ws/FuturesMarketWS.js';\nimport { SpotMarketWS } from '../ws/SpotMarketWS.js';\nimport { SpotUserWS } from '../ws/SpotUserWS.js';\nimport { FuturesUserWS } from '../ws/FuturesUserWS.js';\nimport { CoinMMarketWS } from '../ws/CoinMMarketWS.js';\nimport { CoinMUserWS } from '../ws/CoinMUserWS.js';\nimport { WsApi } from '../ws/WsApi.js';\nimport { SpotWsApi } from '../ws/SpotWsApi.js';\n\nexport interface BinanceClientOptions {\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n testnet?: boolean;\n demo?: boolean;\n recvWindow?: number;\n apiBase?: string;\n wsBase?: string;\n wsUserBase?: string;\n wsApiBase?: string;\n dapiBase?: string;\n wsSpotApiBase?: string;\n wsDapiBase?: string;\n timeoutMs?: number;\n maxRetries?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitTokensPerSecond?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitMaxTokens?: number;\n /** Assumed per-minute IP weight ceiling used to preempt -1003 bans. Binance's default is 6000 for most REST hosts. */\n rateLimitWeightPerMinute?: number;\n /** Fraction of rateLimitWeightPerMinute at which requests are delayed until the next minute window. Set >=1 to disable. */\n rateLimitSafetyMargin?: number;\n retryBaseDelayMs?: number;\n retryMaxDelayMs?: number;\n /** Custom keep-alive/https agent, e.g. for corporate proxies or connection pooling. */\n httpsAgent?: AxiosRequestConfig['httpsAgent'];\n /** Axios proxy configuration. */\n proxy?: AxiosRequestConfig['proxy'];\n /**\n * Client-side guardrails for autonomous/LLM-driven callers: dry run, read-only, symbol\n * allowlist, per-order notional cap, withdrawal and transfer switches. Omit for no policy\n * (all requests permitted). Opting in denies withdrawals unless explicitly allowed.\n */\n safety?: TradingPolicyOptions;\n}\n\nexport class BinanceClient {\n readonly spot: {\n market: SpotMarket;\n account: SpotAccount;\n trading: SpotTrading;\n userStream: SpotUserDataStream;\n ws: SpotMarketWS;\n wsUser: SpotUserWS;\n wsApi: SpotWsApi;\n };\n readonly futures: {\n market: FuturesMarket;\n data: FuturesData;\n account: FuturesAccount;\n trading: FuturesTrading;\n ops: FuturesOps;\n userStream: UserDataStream;\n ws: FuturesMarketWS;\n wsUser: FuturesUserWS;\n wsApi: WsApi;\n };\n readonly coinm: {\n market: CoinMMarket;\n account: CoinMAccount;\n trading: CoinMTrading;\n userStream: CoinMUserDataStream;\n ws: CoinMMarketWS;\n wsUser: CoinMUserWS;\n };\n readonly margin: {\n account: MarginAccount;\n trading: MarginTrading;\n };\n readonly wallet: Wallet;\n readonly subaccount: SubAccount;\n /** The active guardrail policy, or undefined when no `safety` config was supplied. */\n readonly policy?: TradingPolicy;\n\n private readonly authHttp: HttpClient;\n private readonly spotHttp: HttpClient;\n private readonly dapiHttp: HttpClient;\n private readonly sapiHttp: HttpClient;\n private listenKeyValue: string | null = null;\n private keepAliveInterval: NodeJS.Timeout | null = null;\n private spotListenKeyValue: string | null = null;\n private spotKeepAliveInterval: NodeJS.Timeout | null = null;\n private coinmListenKeyValue: string | null = null;\n private coinmKeepAliveInterval: NodeJS.Timeout | null = null;\n\n static nowSeconds(): number {\n return Math.floor(Date.now() / 1000);\n }\n\n static buildPair(base: string, target: string): string {\n return `${base}${target}`.toUpperCase();\n }\n\n static parsePair(pair: string): { base: string; target: string } | null {\n const match = pair.match(/^([A-Z0-9]+)(USDT|USDC|BUSD|BTC|ETH|BNB)$/);\n if (!match) return null;\n return { base: match[1] as string, target: match[2] as string };\n }\n\n static calculateLiquidationPrice(entryPrice: number, leverage: number, side: 'buy' | 'sell', mm = 0.005): number {\n const dir = side === 'buy' ? 1 : -1;\n return dir === 1\n ? entryPrice * (1 - 1 / leverage + mm)\n : entryPrice * (1 + 1 / leverage - mm);\n }\n\n constructor(options: BinanceClientOptions = {}) {\n const { endpoints } = resolveEnvironment(options);\n this.policy = options.safety ? new TradingPolicy(options.safety) : undefined;\n const httpOptions = {\n policy: this.policy,\n apiKey: options.apiKey,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n signatureAlgorithm: options.signatureAlgorithm,\n recvWindow: options.recvWindow ?? 5000,\n timeoutMs: options.timeoutMs ?? 15_000,\n maxRetries: options.maxRetries ?? 3,\n retryBaseDelayMs: options.retryBaseDelayMs,\n retryMaxDelayMs: options.retryMaxDelayMs,\n rateLimitWeightPerMinute: options.rateLimitWeightPerMinute,\n rateLimitSafetyMargin: options.rateLimitSafetyMargin,\n httpsAgent: options.httpsAgent,\n proxy: options.proxy,\n };\n\n this.authHttp = new HttpClient({ baseURL: endpoints.restRoot, ...httpOptions });\n\n this.spotHttp = new HttpClient({ baseURL: endpoints.restSpot, ...httpOptions });\n const spotHttp = this.spotHttp;\n this.spot = {\n market: new SpotMarket(spotHttp),\n account: new SpotAccount(spotHttp),\n trading: new SpotTrading(spotHttp),\n userStream: new SpotUserDataStream(spotHttp),\n ws: new SpotMarketWS(endpoints.wsSpotMarket),\n wsUser: new SpotUserWS({\n baseUserUrl: endpoints.wsSpotUser,\n getListenKey: () => this.spotListenKeyValue,\n }),\n wsApi: new SpotWsApi({\n baseUrl: endpoints.wsSpotApi,\n apiKey: options.apiKey,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n signatureAlgorithm: options.signatureAlgorithm,\n recvWindow: options.recvWindow,\n }),\n };\n\n const futuresMarket = new FuturesMarket(\n new HttpClient({ baseURL: endpoints.restFapi, ...httpOptions }),\n endpoints.restRoot,\n );\n const futuresData = new FuturesData({\n restFapi: endpoints.restFapi,\n restFuturesData: endpoints.restFuturesData,\n ...httpOptions,\n });\n const futuresAccount = new FuturesAccount(this.authHttp);\n const futuresTrading = new FuturesTrading(this.authHttp);\n\n this.futures = {\n market: futuresMarket,\n data: futuresData,\n account: futuresAccount,\n trading: futuresTrading,\n ops: new FuturesOps(futuresMarket, futuresData, futuresAccount, futuresTrading),\n userStream: new UserDataStream(this.authHttp),\n ws: new FuturesMarketWS(endpoints.wsMarket),\n wsUser: new FuturesUserWS({\n baseUserUrl: endpoints.wsUser,\n getListenKey: () => this.listenKeyValue,\n }),\n wsApi: new WsApi({\n baseUrl: endpoints.wsApi,\n apiKey: options.apiKey,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n signatureAlgorithm: options.signatureAlgorithm,\n recvWindow: options.recvWindow,\n }),\n };\n\n this.dapiHttp = new HttpClient({ baseURL: endpoints.restDapiRoot, ...httpOptions });\n this.coinm = {\n market: new CoinMMarket(new HttpClient({ baseURL: endpoints.restDapi, ...httpOptions })),\n account: new CoinMAccount(this.dapiHttp),\n trading: new CoinMTrading(this.dapiHttp),\n userStream: new CoinMUserDataStream(this.dapiHttp),\n ws: new CoinMMarketWS(endpoints.wsDapiMarket),\n wsUser: new CoinMUserWS({\n baseUserUrl: endpoints.wsDapiUser,\n getListenKey: () => this.coinmListenKeyValue,\n }),\n };\n\n this.sapiHttp = new HttpClient({ baseURL: endpoints.restApiRoot, ...httpOptions });\n this.margin = {\n account: new MarginAccount(this.sapiHttp),\n trading: new MarginTrading(this.sapiHttp),\n };\n this.wallet = new Wallet(this.sapiHttp);\n this.subaccount = new SubAccount(this.sapiHttp);\n }\n\n /**\n * Syncs local time against each REST host's server clock and stores the offset, applied to\n * every subsequent signed request's `timestamp` param. Call this once after construction to\n * mitigate `-1021` errors caused by local clock drift.\n */\n async syncTime(): Promise<void> {\n await Promise.all([\n this.authHttp.syncTime('/fapi/v1/time'),\n this.spotHttp.syncTime('/time'),\n this.dapiHttp.syncTime('/dapi/v1/time'),\n this.sapiHttp.syncTime('/api/v3/time'),\n ]);\n }\n\n /**\n * Snapshot of the most recently observed `X-MBX-USED-WEIGHT-*` / `X-MBX-ORDER-COUNT-*`\n * response headers, per REST host. Each host tracks its own weight budget independently.\n */\n getRateLimitUsage(): {\n spot: RateLimitUsage;\n futures: RateLimitUsage;\n coinm: RateLimitUsage;\n sapi: RateLimitUsage;\n } {\n return {\n spot: this.spotHttp.getRateLimitUsage(),\n futures: this.authHttp.getRateLimitUsage(),\n coinm: this.dapiHttp.getRateLimitUsage(),\n sapi: this.sapiHttp.getRateLimitUsage(),\n };\n }\n\n async startUserStream(): Promise<string> {\n const { listenKey } = await this.futures.userStream.createListenKey();\n this.listenKeyValue = listenKey;\n this.keepAliveInterval = setInterval(() => {\n this.futures.userStream.keepAliveListenKey().catch(() => {\n /* listenKey keep-alive failures are retried on the next tick */\n });\n }, 30 * 60 * 1000);\n this.futures.wsUser.connect();\n return listenKey;\n }\n\n closeUserStream(): void {\n if (this.keepAliveInterval) clearInterval(this.keepAliveInterval);\n this.keepAliveInterval = null;\n this.futures.wsUser.close();\n this.futures.userStream.closeListenKey().catch(() => {\n /* best-effort cleanup */\n });\n this.listenKeyValue = null;\n }\n\n async startSpotUserStream(): Promise<string> {\n const { listenKey } = await this.spot.userStream.createListenKey();\n this.spotListenKeyValue = listenKey;\n this.spotKeepAliveInterval = setInterval(() => {\n this.spot.userStream.keepAliveListenKey().catch(() => {\n /* spot listenKey keep-alive failures are retried on the next tick */\n });\n }, 30 * 60 * 1000);\n this.spot.wsUser.connect();\n return listenKey;\n }\n\n closeSpotUserStream(): void {\n if (this.spotKeepAliveInterval) clearInterval(this.spotKeepAliveInterval);\n this.spotKeepAliveInterval = null;\n this.spot.wsUser.close();\n this.spot.userStream.closeListenKey().catch(() => {\n /* best-effort cleanup */\n });\n this.spotListenKeyValue = null;\n }\n\n async startCoinMUserStream(): Promise<string> {\n const { listenKey } = await this.coinm.userStream.createListenKey();\n this.coinmListenKeyValue = listenKey;\n this.coinmKeepAliveInterval = setInterval(() => {\n this.coinm.userStream.keepAliveListenKey().catch(() => {\n /* COIN-M listenKey keep-alive failures are retried on the next tick */\n });\n }, 30 * 60 * 1000);\n this.coinm.wsUser.connect();\n return listenKey;\n }\n\n closeCoinMUserStream(): void {\n if (this.coinmKeepAliveInterval) clearInterval(this.coinmKeepAliveInterval);\n this.coinmKeepAliveInterval = null;\n this.coinm.wsUser.close();\n this.coinm.userStream.closeListenKey().catch(() => {\n /* best-effort cleanup */\n });\n this.coinmListenKeyValue = null;\n }\n\n closeAllWebSockets(): void {\n this.futures.ws.close();\n this.futures.wsUser.close();\n this.spot.ws.close();\n this.spot.wsUser.close();\n this.coinm.ws.close();\n this.coinm.wsUser.close();\n this.closeUserStream();\n this.closeSpotUserStream();\n this.closeCoinMUserStream();\n }\n\n reconnectWebSocket(target: 'ws' | 'wsUser' | 'spot' | 'spotUser' | 'coinm' | 'coinmUser'): void {\n if (target === 'ws') this.futures.ws.reconnect();\n else if (target === 'wsUser') this.futures.wsUser.reconnect();\n else if (target === 'spot') this.spot.ws.reconnect();\n else if (target === 'spotUser') this.spot.wsUser.reconnect();\n else if (target === 'coinm') this.coinm.ws.reconnect();\n else this.coinm.wsUser.reconnect();\n }\n\n resetReconnectAttempts(): void {\n this.futures.ws.resetReconnectAttempts();\n this.futures.wsUser.resetReconnectAttempts();\n this.spot.ws.resetReconnectAttempts();\n this.spot.wsUser.resetReconnectAttempts();\n this.coinm.ws.resetReconnectAttempts();\n this.coinm.wsUser.resetReconnectAttempts();\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport { createFuturesToolkit } from '../tools/index.js';\n\nexport function createBinanceMcpServer(client: BinanceClient): McpServer {\n const server = new McpServer({ name: 'binance-sdk', version: '2.0.0' });\n const toolkit = createFuturesToolkit(client);\n\n toolkit.tools.forEach((tool) => {\n server.registerTool(tool.name, { description: tool.description, inputSchema: tool.inputSchema }, async (args) => ({\n content: [{ type: 'text', text: String(await tool.handler(args, { env: 'live', isSigned: true })) }],\n }));\n });\n\n registerResources(server, client);\n\n return server;\n}\n\n/**\n * Reference data exposed as MCP resources rather than tools: hosts can attach these\n * to context directly, without the model having to decide to call something first.\n */\nfunction registerResources(server: McpServer, client: BinanceClient): void {\n const json = (uri: string, data: unknown) => ({\n contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(data, null, 2) }],\n });\n\n server.registerResource(\n 'futures-symbols',\n 'binance://futures/symbols',\n {\n title: 'Futures Trading Symbols',\n description: 'Every tradeable USD-M futures symbol with its contract type and status',\n mimeType: 'application/json',\n },\n async (uri) => {\n const info = await client.futures.market.exchangeInfo();\n return json(uri.href, info.symbols);\n },\n );\n\n server.registerResource(\n 'futures-premium-index',\n 'binance://futures/premium-index',\n {\n title: 'Premium Index',\n description: 'Mark price, index price and funding rate across all USD-M pairs',\n mimeType: 'application/json',\n },\n async (uri) => json(uri.href, await client.futures.data.assetIndex()),\n );\n\n server.registerResource(\n 'spot-symbols',\n 'binance://spot/symbols',\n {\n title: 'Spot Trading Symbols',\n description: 'Every tradeable Spot symbol with its status, base/quote assets and permissions',\n mimeType: 'application/json',\n },\n async (uri) => {\n const info = await client.spot.market.exchangeInfo();\n return json(uri.href, info.symbols);\n },\n );\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst optionalSymbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional();\nconst limit = z.number().int().positive().max(1000).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\n\nexport function accountTools(client: BinanceClient): ToolDefinition[] {\n const a = client.futures.account;\n\n return [\n {\n name: 'futures_balance',\n description: 'Get futures account balances (v3): asset, wallet balance, unrealized profit, margin balance, available balance (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.balanceV3()),\n },\n {\n name: 'futures_account',\n description: 'Get full account information (v3): total wallet/margin balance, unrealized profit, available balance, assets & positions (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.accountV3()),\n },\n {\n name: 'futures_balance_v2',\n description: 'Get futures account balance (v2 legacy) per asset (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.balance()),\n },\n {\n name: 'futures_account_v2',\n description: 'Get futures account information (v2 legacy) (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.account()),\n },\n {\n name: 'futures_position_risk',\n description: 'Get current open positions (v3): symbol, side, size, entry price, mark price, liquidation price, leverage, unrealized PnL, margin (signed).',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await a.positionRiskV3(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_income_history',\n description: 'Get futures income history (realized PnL, funding fees, commissions, transfers, insurance clearing). incomeType examples: TRANSFER, REALIZED_PNL, FUNDING_FEE, COMMISSION, INSURANCE_CLEAR, REFERRAL_KICKBACK (signed).',\n inputSchema: z.object({ symbol: optionalSymbol, incomeType: z.string().optional().describe('e.g. TRANSFER, REALIZED_PNL, FUNDING_FEE, COMMISSION'), startTime, endTime, limit: limit.default(100) }),\n handler: async ({ symbol, incomeType, startTime, endTime, limit }) =>\n textResult(await a.incomeHistory({ symbol: symbol ? normalizeSymbol(symbol) : undefined, incomeType, startTime, endTime, limit: Number(limit) })),\n },\n {\n name: 'futures_user_trades',\n description: 'Get account trade list (filled trades) for a symbol with optional time range (signed).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), startTime, endTime, limit: limit.default(100), fromId: z.number().int().positive().optional() }),\n handler: async ({ symbol, startTime, endTime, limit, fromId }) =>\n textResult(await a.userTrades({ symbol: normalizeSymbol(symbol), startTime, endTime, limit: Number(limit), fromId })),\n },\n {\n name: 'futures_leverage_brackets',\n description: 'Get notional and leverage brackets for one symbol or all: tier caps, maintenance margin rate, max leverage (signed).',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await a.leverageBrackets(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_commission_rate',\n description: 'Get user commission rate (taker & maker fee) for a symbol (signed).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. ETHUSDT') }),\n handler: async ({ symbol }) => textResult(await a.commissionRate(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_multi_assets_mode',\n description: 'Get current multi-assets margin mode status (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.multiAssetsMargin()),\n },\n {\n name: 'futures_set_multi_assets_mode',\n description: 'Enable or disable multi-assets mode (signed; 7-day cooldown between toggles).',\n inputSchema: z.object({ enabled: z.boolean().describe('true to enable, false to disable') }),\n handler: async ({ enabled }) => textResult(await a.setMultiAssetsMargin(enabled)),\n },\n {\n name: 'futures_fee_burn_status',\n description: 'Get BNB fee burn status for futures trades (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.feeBurnStatus()),\n },\n {\n name: 'futures_set_fee_burn',\n description: 'Toggle BNB fee burn on futures trades (signed).',\n inputSchema: z.object({ enabled: z.boolean().describe('true to enable fee burn') }),\n handler: async ({ enabled }) => textResult(await a.setFeeBurnStatus(enabled)),\n },\n {\n name: 'futures_position_mode',\n description: 'Get current position mode: one-way (BOTH) or hedge mode (LONG/SHORT) (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.positionMode()),\n },\n {\n name: 'futures_set_position_mode',\n description: 'Change position mode: hedgeMode true = dual side (hedge), false = one-way (signed; 30-day cooldown).',\n inputSchema: z.object({ hedgeMode: z.boolean().describe('true = hedge mode, false = one-way') }),\n handler: async ({ hedgeMode }) => textResult(await a.setPositionMode(hedgeMode)),\n },\n {\n name: 'futures_api_trading_status',\n description: 'Get futures trading quantitative rules indicators and disable intervals (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.apiTradingStatus()),\n },\n {\n name: 'futures_position_margin_history',\n description: 'Get isolated position margin change history. type: 1 = add margin, 2 = reduce margin (signed).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), type: z.enum(['1', '2']).describe('1 = add margin, 2 = reduce margin'), startTime, endTime, limit: limit.default(50) }),\n handler: async ({ symbol, type, startTime, endTime, limit }) =>\n textResult(await a.positionMarginHistory({ symbol: normalizeSymbol(symbol), type: Number(type), startTime, endTime, limit: Number(limit) })),\n },\n {\n name: 'futures_rate_limit_order',\n description: 'Query the current user order rate limit usage (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.rateLimitOrder()),\n },\n {\n name: 'futures_request_order_download',\n description: 'Request a futures order-history download (async, 7-day window). Returns a downloadId (signed).',\n inputSchema: z.object({ symbol: optionalSymbol, startTime, endTime }),\n handler: async ({ symbol, startTime, endTime }) =>\n textResult(await a.requestOrderDownload({ symbol: symbol ? normalizeSymbol(symbol) : undefined, startTime, endTime })),\n },\n {\n name: 'futures_order_download_status',\n description: 'Get the futures order-history download link by downloadId (signed).',\n inputSchema: z.object({ downloadId: z.string().min(1) }),\n handler: async ({ downloadId }) => textResult(await a.getOrderDownloadStatus(downloadId)),\n },\n {\n name: 'futures_request_trade_download',\n description: 'Request a futures trade-history download (async, 7-day window). Returns a downloadId (signed).',\n inputSchema: z.object({ symbol: optionalSymbol, startTime, endTime }),\n handler: async ({ symbol, startTime, endTime }) =>\n textResult(await a.requestTradeDownload({ symbol: symbol ? normalizeSymbol(symbol) : undefined, startTime, endTime })),\n },\n {\n name: 'futures_trade_download_status',\n description: 'Get the futures trade-history download link by downloadId (signed).',\n inputSchema: z.object({ downloadId: z.string().min(1) }),\n handler: async ({ downloadId }) => textResult(await a.getTradeDownloadStatus(downloadId)),\n },\n {\n name: 'futures_account_config',\n description: 'Get futures account configuration: fee tier, trading permissions, dual-side position setting (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.accountConfig()),\n },\n {\n name: 'futures_portfolio_margin_account_info',\n description: 'Get Portfolio Margin account info for an asset: cross margin balance and liability (signed).',\n inputSchema: z.object({ asset: z.string().min(1).describe('Asset, e.g. USDT') }),\n handler: async ({ asset }) => textResult(await a.pmAccountInfo(asset)),\n },\n {\n name: 'futures_request_income_download',\n description: 'Request a futures income/transaction-history download (async). Returns a downloadId (signed).',\n inputSchema: z.object({ startTime: startTime.unwrap(), endTime: endTime.unwrap() }),\n handler: async ({ startTime, endTime }) => textResult(await a.requestIncomeDownload({ startTime, endTime })),\n },\n {\n name: 'futures_income_download_status',\n description: 'Get the futures income/transaction-history download link by downloadId (signed).',\n inputSchema: z.object({ downloadId: z.string().min(1) }),\n handler: async ({ downloadId }) => textResult(await a.getIncomeDownloadStatus(downloadId)),\n },\n ];\n}\n","import { z } from 'zod';\n\nexport interface ToolContext {\n env: 'live' | 'testnet' | 'demo';\n isSigned: boolean;\n}\n\nexport interface ToolDefinition<TInput extends z.ZodTypeAny = z.ZodTypeAny> {\n name: string;\n description: string;\n inputSchema: TInput;\n handler: (args: any, ctx: ToolContext) => Promise<unknown>;\n}\n\nexport function normalizeSymbol(value: unknown): string {\n return String(value ?? '').trim().toUpperCase();\n}\nexport function normalizeLimit(value: unknown): number {\n return Number(value);\n}\n\nexport function toJsonSchema(inputSchema: z.ZodTypeAny): Record<string, unknown> {\n return z.toJSONSchema(inputSchema, { target: 'json' });\n}\n\nexport function toOpenAITool(tool: ToolDefinition): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: toJsonSchema(tool.inputSchema),\n },\n };\n}\n\nexport function toAnthropicTool(tool: ToolDefinition): Record<string, unknown> {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: toJsonSchema(tool.inputSchema),\n };\n}\n\nexport function toMCPTool(tool: ToolDefinition): {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n} {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: toJsonSchema(tool.inputSchema),\n };\n}\n\nexport function toToolList<TInput extends z.ZodTypeAny>(\n tools: ToolDefinition<TInput>[],\n format: 'openai' | 'anthropic' | 'mcp',\n): Record<string, unknown>[] {\n const adapter =\n format === 'openai' ? toOpenAITool : format === 'anthropic' ? toAnthropicTool : toMCPTool;\n return tools.map(adapter);\n}\n\nexport function textResult(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst symbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT');\n\n/**\n * Derived tools: each one fans out over several REST endpoints and returns a\n * single answer. They exist so the model does not have to chain primitives and\n * do float arithmetic on tick/step sizes itself.\n */\nexport function derivedTools(client: BinanceClient): ToolDefinition[] {\n const ops = client.futures.ops;\n\n return [\n {\n name: 'futures_symbol_rules',\n description:\n 'Get the tradeable rules for a symbol in one call: tick size, step size, min/max quantity, market-order lot bounds and minimum notional, flattened out of exchangeInfo filters. Call this before sizing or pricing any order.',\n inputSchema: z.object({ symbol, refresh: z.boolean().default(false).describe('Bypass the 60s cache') }),\n handler: async ({ symbol: s, refresh }) => textResult(await ops.symbolRules(normalizeSymbol(s), { refresh })),\n },\n {\n name: 'futures_quantize',\n description:\n \"Round a price to the symbol's tick size and a quantity to its step size, returning exchange-ready strings. Use this instead of rounding numbers yourself — Binance rejects off-tick prices (-1111).\",\n inputSchema: z.object({\n symbol,\n price: z.number().positive().optional(),\n quantity: z.number().positive().optional(),\n marketOrder: z.boolean().default(false).describe('Use MARKET_LOT_SIZE bounds instead of LOT_SIZE'),\n }),\n handler: async ({ symbol: s, price, quantity, marketOrder }) =>\n textResult(await ops.quantize(normalizeSymbol(s), { price, quantity, marketOrder })),\n },\n {\n name: 'futures_size_position',\n description:\n 'Convert a risk budget into an exchange-ready order quantity. Given a stop price and either riskAmount (quote currency) or riskPct (percent of available balance), returns the quantity rounded down to the symbol step size, plus the notional, required margin and every constraint that failed (min notional, lot bounds, wrong-side stop). Never increases risk to satisfy a minimum — it reports instead.',\n inputSchema: z.object({\n symbol,\n side: z.enum(['BUY', 'SELL']),\n stopPrice: z.number().positive().describe('Protective stop price'),\n entryPrice: z.number().positive().optional().describe('Defaults to current mark price'),\n riskAmount: z.number().positive().optional().describe('Quote-currency amount to risk, e.g. 50 USDT'),\n riskPct: z.number().positive().max(100).optional().describe('Percent of available balance to risk (signed call)'),\n leverage: z.number().int().min(1).max(125).optional().describe('Used to report required margin'),\n marketOrder: z.boolean().default(false),\n }),\n handler: async (args) => textResult(await ops.sizePosition({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_close_position',\n description:\n 'Flatten an open position with a reduce-only market order. Reads the current position, derives the closing side from its sign, and automatically uses reduceOnly in one-way mode vs positionSide in hedge mode (Binance rejects the wrong one). Set dryRun to preview the order without sending it. Signed, destructive.',\n inputSchema: z.object({\n symbol,\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional().describe('Required when hedge mode has both sides open'),\n portion: z.number().positive().max(1).default(1).describe('Fraction of the position to close, e.g. 0.5 for half'),\n dryRun: z.boolean().default(false),\n }),\n handler: async (args) => textResult(await ops.closePosition({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_market_snapshot',\n description:\n 'One-call market picture for a symbol: 24h stats, mark/index price with funding, open interest and long/short positioning. Replaces four separate primitive calls; individual feeds degrade to an error field rather than failing the whole snapshot.',\n inputSchema: z.object({\n symbol,\n period: z.enum(['5m', '15m', '30m', '1h', '2h', '4h', '6h', '12h', '1d']).default('1h'),\n }),\n handler: async ({ symbol: s, period }) => textResult(await ops.marketSnapshot(normalizeSymbol(s), { period })),\n },\n {\n name: 'futures_account_overview',\n description:\n 'One-call account picture: funded balances, open positions only (zero-size entries filtered out), working orders, and totals for unrealized PnL and gross notional. Signed.',\n inputSchema: z.object({}),\n handler: async () => textResult(await ops.accountOverview()),\n },\n {\n name: 'futures_place_bracket_order',\n description:\n 'Place an entry order together with its protective stop-loss and optional take-profit, with all prices quantized to the symbol tick. Returns each leg separately; if a protective leg fails the response is flagged protectionComplete=false and the entry is NOT auto-cancelled (it may already have filled). Signed, destructive.',\n inputSchema: z.object({\n symbol,\n side: z.enum(['BUY', 'SELL']),\n quantity: z.union([z.string(), z.number()]),\n entryPrice: z.number().positive().optional().describe('Omit for a MARKET entry'),\n stopLossPrice: z.number().positive(),\n takeProfitPrice: z.number().positive().optional(),\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).default('MARK_PRICE'),\n }),\n handler: async (args) => textResult(await ops.placeBracketOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport { KlineIntervalSchema } from '../types/market.types.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst u = (s: z.ZodTypeAny) => s.optional();\nconst optSymbol = u(z.string().min(1)).describe('USD-M pair, e.g. BTCUSDT');\nconst limitDefault = z.number().int().positive().max(1500).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\nconst period = z.enum(['5m', '15m', '30m', '1h', '2h', '4h', '6h', '12h', '1d']).default('1h');\nconst contractType = z.enum(['perpetual', 'current_quarter', 'next_quarter']).default('perpetual');\n\nexport function marketDataTools(client: BinanceClient): ToolDefinition[] {\n const m = client.futures.market;\n const d = client.futures.data;\n\n const tools: ToolDefinition[] = [\n {\n name: 'futures_ping',\n description: 'Test connectivity to the Binance USD-M futures REST API. Returns empty object {} on success.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.ping()),\n },\n {\n name: 'futures_server_time',\n description: 'Get the current Binance USD-M futures server time in milliseconds since epoch.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.serverTime()),\n },\n {\n name: 'futures_exchange_info',\n description: 'Get exchange trading rules and symbol metadata: contract type, status, base/quote assets, price/quantity filters, tick size, step size, notional and leverage brackets, delivery dates.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.exchangeInfo()),\n },\n {\n name: 'futures_ticker_price',\n description: 'Get latest price for one symbol (v1).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.tickerPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_ticker_price_v2',\n description: 'Get latest price for one symbol, or for all symbols when symbol is omitted (v2 endpoint). Use all-symbols mode for market overviews.',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await m.tickerPriceV2(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_ticker_24hr',\n description: 'Get 24-hour rolling price change statistics for a symbol: price change %, high, low, volume, quote volume, open interest.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.ticker24hr(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_book_ticker',\n description: 'Get best bid/ask (top of book) for a single symbol (v1).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.bookTicker(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_book_ticker_v2',\n description: 'Get best bid/ask (top of book) for one symbol, or all symbols when omitted (v2 endpoint).',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await m.bookTickerV2(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_order_book',\n description: 'Get order book depth for a symbol. Limits: 5, 10, 20, 50, 100, 500, 1000.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: z.enum(['5', '10', '20', '50', '100', '500', '1000']).default('100'),\n }),\n handler: async ({ symbol, limit }) => textResult(await m.depth(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'futures_recent_trades',\n description: 'Get the most recent executed trades for a symbol (public endpoint).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: limitDefault.default(500),\n }),\n handler: async ({ symbol, limit }) => textResult(await m.trades(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'futures_historical_trades',\n description: 'Get older trades for a symbol by fromId (older than recent).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: limitDefault.default(500),\n fromId: z.number().int().positive().optional(),\n }),\n handler: async ({ symbol, limit, fromId }) =>\n textResult(await m.historicalTrades(normalizeSymbol(symbol), { limit: Number(limit), fromId })),\n },\n {\n name: 'futures_agg_trades',\n description: 'Get compressed/aggregate trades for a symbol within an optional time window. Each entry aggregates trades with the same price and side.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await m.aggTrades(normalizeSymbol(symbol), { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_klines',\n description: 'Get candlestick (OHLCV) data for a symbol. Intervals: 1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,1M. Max 1500 per request.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.klines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_continuous_klines',\n description: 'Get klines for a continuous contract (perpetual, current_quarter, next_quarter) identified by base pair (e.g. BTCUSDT).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT'),\n contractType,\n interval: KlineIntervalSchema,\n limit: limitDefault.default(500),\n startTime,\n endTime,\n }),\n handler: async ({ symbol, contractType, interval, limit, startTime, endTime }) =>\n textResult(await m.continuousKlines(normalizeSymbol(symbol), contractType, interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_index_price_klines',\n description: 'Get index price candlesticks for a pair (e.g. BTCUSDT index).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.indexPriceKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_mark_price_klines',\n description: 'Get mark price candlesticks for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.markPriceKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_trading_day_ticker',\n description: 'Get the trading-day ticker (v1: rolling window stats by symbol, including open, close, high, low, volume, closeTime).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.tradingDayTicker(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_mark_price',\n description: 'Get mark price, index price, estimated settle price, last funding rate, next funding time and interest rate for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.premiumIndex(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_funding_rate_history',\n description: 'Get historical funding rates for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), limit: limitDefault.default(100), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await d.fundingRateHistory(normalizeSymbol(symbol), { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_funding_info',\n description: 'Get funding rate configuration for all symbols with adjusted funding cap/floor or interval (e.g. under extreme volatility).',\n inputSchema: z.object({}),\n handler: async () => textResult(await d.fundingInfo()),\n },\n {\n name: 'futures_open_interest',\n description: 'Get the current total open interest for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.openInterest(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_open_interest_hist',\n description: 'Get historical open interest statistics per period.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.openInterestHist(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_top_long_short_account_ratio',\n description: 'Get top trader long/short account ratio (number of accounts) for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.topLongShortAccountRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_top_long_short_position_ratio',\n description: 'Get top trader long/short position ratio (accounts with net positions) for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.topLongShortPositionRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_global_long_short_ratio',\n description: 'Get global long/short account ratio for a symbol (all accounts).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.globalLongShortAccountRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_taker_long_short_ratio',\n description: 'Get taker buy/sell volume ratio for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.takerLongShortRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_basis',\n description: 'Get basis data (spot-futures spread, mark price - index price) for a pair and contract type.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT'),\n period,\n limit: limitDefault.default(30),\n startTime,\n endTime,\n }),\n handler: async ({ symbol, period, limit, startTime, endTime }) =>\n textResult(await d.basis(normalizeSymbol(symbol), period, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_asset_index',\n description: 'Get multi-assets mode asset index (collateral price) for one asset or all assets.',\n inputSchema: z.object({ symbol: optSymbol.describe('Asset index symbol, e.g. ADAUSD') }),\n handler: async ({ symbol }) => textResult(await d.assetIndex(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_composite_index_info',\n description: 'Get composite index symbol information (e.g. DEFIUSDT) with constituent weights.',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await d.compositeIndexInfo(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_insurance_balance',\n description: 'Get insurance fund balance snapshots for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BNBUSDT'), limit: limitDefault.default(100), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await d.insuranceFundBalance({ symbol: normalizeSymbol(symbol), limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_index_price_constituents',\n description: 'Get the index price constituents (exchange weights) for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.indexPriceConstituents(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_premium_index_klines',\n description: 'Get premium index candlesticks for a symbol (mark price premium over index price).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.premiumIndexKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_rpi_depth',\n description: 'Get the RPI (Retail Price Improvement) order book depth for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), limit: z.number().int().positive().default(1000) }),\n handler: async ({ symbol, limit }) => textResult(await m.rpiDepth(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'futures_delivery_price',\n description: 'Get historical quarterly contract settlement/delivery prices for a pair.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.deliveryPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_symbol_adl_risk',\n description: 'Get the auto-deleveraging (ADL) risk level for one symbol or all symbols on the account (signed).',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await d.symbolAdlRisk(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_adl_quantile',\n description: 'Get the position ADL (auto-deleveraging) quantile estimation for one symbol or all symbols (signed).',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await d.adlQuantile(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_force_orders',\n description: \"Get the user's force-liquidation orders (LIQUIDATION) and ADL orders for a symbol or all symbols (signed).\",\n inputSchema: z.object({\n symbol: optSymbol,\n autoCloseType: z.enum(['LIQUIDATION', 'ADL']).optional(),\n startTime,\n endTime,\n limit: limitDefault.default(50),\n }),\n handler: async ({ symbol, autoCloseType, startTime, endTime, limit }) =>\n textResult(\n await d.forceOrders({\n symbol: symbol ? normalizeSymbol(symbol) : undefined,\n autoCloseType,\n startTime,\n endTime,\n limit: Number(limit),\n }),\n ),\n },\n ];\n\n return tools;\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nexport interface PaperState {\n balance: number;\n positions: PaperPosition[];\n history: PaperEvent[];\n}\n\nexport interface PaperPosition {\n id: string;\n symbol: string;\n side: 'LONG' | 'SHORT';\n quantity: number;\n entryPrice: number;\n openedAt: string;\n}\n\nexport interface PaperEvent extends PaperPosition {\n type: 'open' | 'close';\n exitPrice?: number;\n realizedPnl?: number;\n closedAt?: string;\n}\n\nexport interface PaperContext {\n state: PaperState;\n client: BinanceClient;\n}\n\nexport function createPaperContext(client: BinanceClient, initialState: Partial<PaperState> = {}): PaperContext {\n return {\n client,\n state: { balance: initialState.balance ?? 10000, positions: initialState.positions ?? [], history: initialState.history ?? [] },\n };\n}\n\nfunction pnl(position: PaperPosition, price: number): number {\n const direction = position.side === 'LONG' ? 1 : -1;\n return (price - position.entryPrice) * position.quantity * direction;\n}\n\nexport function paperTools(ctx: PaperContext): ToolDefinition[] {\n const s = ctx.state;\n const t = ctx.client.futures.market;\n\n return [\n {\n name: 'paper_init',\n description: 'Initialize paper-trading state (reset balances, positions, history). No API keys required.',\n inputSchema: z.object({ balance: z.number().positive().default(10000).describe('Starting USDT balance') }),\n handler: async ({ balance }) => {\n s.balance = balance;\n s.positions = [];\n s.history = [];\n return textResult(s);\n },\n },\n {\n name: 'paper_balance',\n description: 'Get current paper-trading balance and open-position equity (uses live market prices if an open position exists). No API keys required.',\n inputSchema: z.object({}),\n handler: async () => textResult(s),\n },\n {\n name: 'paper_open_position',\n description: 'Open an in-memory paper position at the live ticker price (or a fixed price). No API keys required.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n side: z.enum(['LONG', 'SHORT']),\n quantity: z.number().positive(),\n price: z.number().positive().optional().describe('If omitted, uses live ticker price'),\n }),\n handler: async ({ symbol, side, quantity, price }) => {\n const sym = normalizeSymbol(symbol);\n const market = price ?? Number((await t.tickerPrice(sym)).price);\n const position: PaperPosition = { id: Date.now().toString(), symbol: sym, side, quantity, entryPrice: market, openedAt: new Date().toISOString() };\n s.positions.push(position);\n s.history.push({ type: 'open', ...position });\n return textResult(position);\n },\n },\n {\n name: 'paper_close_position',\n description: 'Close a paper position by id (or symbol) and realize PnL at the live/last price.',\n inputSchema: z.object({\n id: z.string().optional().describe('Position id from paper_open_position'),\n symbol: z.string().min(1).optional().describe('Close the position for this symbol'),\n price: z.number().positive().optional().describe('If omitted, uses live ticker price'),\n }),\n handler: async ({ id, symbol, price }) => {\n const idx = s.positions.findIndex((p) => (id ? p.id === id : normalizeSymbol(p.symbol) === normalizeSymbol(symbol ?? '')));\n if (idx === -1) throw new Error('paper position not found');\n const position = s.positions[idx];\n const market = price ?? Number((await t.tickerPrice(position.symbol)).price);\n const realizedPnl = pnl(position, market);\n s.balance += realizedPnl;\n const closed: PaperEvent = { type: 'close', ...position, exitPrice: market, realizedPnl, closedAt: new Date().toISOString() };\n s.positions.splice(idx, 1);\n s.history.push(closed);\n return textResult(closed);\n },\n },\n {\n name: 'paper_positions',\n description: 'List open paper positions with live unrealized PnL (marked to market).',\n inputSchema: z.object({}),\n handler: async () => {\n const out = await Promise.all(\n s.positions.map(async (p) => {\n const price = Number((await t.tickerPrice(p.symbol)).price);\n return { ...p, markPrice: price, unrealizedPnl: pnl(p, price) };\n }),\n );\n return textResult(out);\n },\n },\n {\n name: 'paper_history',\n description: 'List paper-trading history of open/close events with realized PnL.',\n inputSchema: z.object({}),\n handler: async () => textResult(s.history),\n },\n {\n name: 'paper_summary',\n description: 'Summarize paper-trading state: balance, open positions, trade count.',\n inputSchema: z.object({}),\n handler: async () =>\n textResult({ balance: s.balance, openPositions: s.positions.length, trades: s.history.length }),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport { KlineIntervalSchema } from '../types/market.types.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst spotSymbol = z.string().min(1).describe('Spot pair, e.g. BTCUSDT');\nconst optionalSymbol = z.string().min(1).describe('Spot pair, e.g. BTCUSDT').optional();\nconst limit = z.number().int().positive().max(1000).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\nconst side = z.enum(['BUY', 'SELL']);\n\nexport const spotOrderParamsSchema = z.object({\n symbol: spotSymbol,\n side,\n type: z.enum(['LIMIT', 'MARKET', 'LIMIT_MAKER', 'STOP_LOSS', 'STOP_LOSS_LIMIT', 'TAKE_PROFIT', 'TAKE_PROFIT_LIMIT']),\n quantity: z.union([z.string(), z.number()]).optional().describe('Base-asset quantity; omit if using quoteOrderQty'),\n quoteOrderQty: z.union([z.string(), z.number()]).optional().describe('Quote-asset quantity (e.g. spend 100 USDT on a MARKET order)'),\n price: z.union([z.string(), z.number()]).optional().describe('Required for LIMIT / STOP_LOSS_LIMIT / TAKE_PROFIT_LIMIT'),\n stopPrice: z.union([z.string(), z.number()]).optional().describe('Trigger price for STOP_LOSS / TAKE_PROFIT variants'),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional().describe('Required for LIMIT'),\n newClientOrderId: z.string().optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT', 'FULL']).optional(),\n icebergQty: z.union([z.string(), z.number()]).optional(),\n selfTradePreventionMode: z.enum(['NONE', 'EXPIRE_TAKER', 'EXPIRE_MAKER', 'EXPIRE_BOTH']).optional(),\n});\n\nexport function spotTools(client: BinanceClient): ToolDefinition[] {\n const m = client.spot.market;\n const a = client.spot.account;\n const t = client.spot.trading;\n\n const tools: ToolDefinition[] = [\n // ---- Market data (public) ----\n {\n name: 'spot_ping',\n description: 'Test connectivity to the Binance Spot REST API.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.ping()),\n },\n {\n name: 'spot_server_time',\n description: 'Get the current Binance Spot server time in ms since epoch.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.serverTime()),\n },\n {\n name: 'spot_exchange_info',\n description: 'Get Spot exchange trading rules and symbol metadata (status, base/quote assets, filters, permissions).',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.exchangeInfo()),\n },\n {\n name: 'spot_ticker_price',\n description: 'Get the latest price for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.tickerPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_ticker_24hr',\n description: 'Get 24-hour rolling price change statistics for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.ticker24hr(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_book_ticker',\n description: 'Get the best bid/ask (top of book) for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.bookTicker(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_order_book',\n description: 'Get the Spot order book depth for a symbol (limits 5/10/20/50/100/500/1000/5000).',\n inputSchema: z.object({\n symbol: spotSymbol,\n limit: z.enum(['5', '10', '20', '50', '100', '500', '1000', '5000']).default('100'),\n }),\n handler: async ({ symbol, limit }) => textResult(await m.depth(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'spot_recent_trades',\n description: 'Get the most recent executed trades for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol, limit: limit.default(500) }),\n handler: async ({ symbol, limit }) => textResult(await m.trades(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'spot_historical_trades',\n description: 'Get older Spot trades for a symbol by fromId.',\n inputSchema: z.object({ symbol: spotSymbol, limit: limit.default(500), fromId: z.number().int().positive().optional() }),\n handler: async ({ symbol, limit, fromId }) =>\n textResult(await m.historicalTrades(normalizeSymbol(symbol), { limit: Number(limit), fromId })),\n },\n {\n name: 'spot_agg_trades',\n description: 'Get compressed/aggregate Spot trades for a symbol within an optional time window.',\n inputSchema: z.object({ symbol: spotSymbol, limit: limit.default(500), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await m.aggTrades(normalizeSymbol(symbol), { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'spot_klines',\n description: 'Get Spot candlesticks (OHLCV). Intervals 1m…1M; max 1000 per request.',\n inputSchema: z.object({ symbol: spotSymbol, interval: KlineIntervalSchema, limit: limit.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.klines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'spot_ui_klines',\n description: 'Get Spot candlesticks via the optimized uiKlines endpoint (same shape as spot_klines).',\n inputSchema: z.object({ symbol: spotSymbol, interval: KlineIntervalSchema, limit: limit.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.uiKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'spot_avg_price',\n description: 'Get the current average price (5-minute rolling average) for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.avgPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_rolling_window_ticker',\n description: 'Get rolling-window price change statistics (1d/7d/30d). Omit symbol for all symbols.',\n inputSchema: z.object({\n symbol: optionalSymbol,\n windowSize: z.enum(['1d', '7d', '30d']).optional(),\n }),\n handler: async ({ symbol, windowSize }) =>\n textResult(await m.rollingWindowTicker(symbol ? normalizeSymbol(symbol) : undefined, windowSize)),\n },\n {\n name: 'spot_trading_day_ticker',\n description: 'Get the Spot trading-day ticker (open/close/high/low/volume by UTC day). Omit symbol for all symbols.',\n inputSchema: z.object({ symbol: optionalSymbol, timeZone: z.string().optional(), type: z.enum(['FULL', 'MINI']).optional() }),\n handler: async ({ symbol, timeZone, type }) =>\n textResult(await m.tradingDayTicker(symbol ? normalizeSymbol(symbol) : undefined, { timeZone, type })),\n },\n\n // ---- Account (signed) ----\n {\n name: 'spot_account',\n description: 'Get the Spot account: balances (free/locked), commissions, permissions (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.account()),\n },\n {\n name: 'spot_my_trades',\n description: 'Get the Spot account trade list (filled trades) for a symbol with optional time range (signed).',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), startTime, endTime, fromId: z.number().int().positive().optional(), limit: limit.default(500) }),\n handler: async ({ symbol, orderId, startTime, endTime, fromId, limit }) =>\n textResult(await a.myTrades(normalizeSymbol(symbol), { orderId, startTime, endTime, fromId, limit: Number(limit) })),\n },\n {\n name: 'spot_my_prevented_matches',\n description: 'Get Spot orders that were expired by the self-trade-prevention (STP) mechanism (signed).',\n inputSchema: z.object({ symbol: spotSymbol, preventedMatchId: z.number().int().positive().optional(), orderId: z.number().int().positive().optional(), limit: limit.default(500) }),\n handler: async ({ symbol, preventedMatchId, orderId, limit }) =>\n textResult(await a.myPreventedMatches(normalizeSymbol(symbol), { preventedMatchId, orderId, limit: Number(limit) })),\n },\n {\n name: 'spot_account_commission',\n description: 'Get the Spot account commission rates for a symbol (signed).',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await a.accountCommission(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_rate_limit_order',\n description: 'Query the current Spot order rate limit usage (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.rateLimitOrder()),\n },\n\n // ---- Trading (signed) ----\n {\n name: 'spot_new_order',\n description: 'Place a new Spot order. Types: LIMIT, MARKET, LIMIT_MAKER, STOP_LOSS, STOP_LOSS_LIMIT, TAKE_PROFIT, TAKE_PROFIT_LIMIT. For MARKET orders use quantity OR quoteOrderQty. Signed.',\n inputSchema: spotOrderParamsSchema,\n handler: async (args) => textResult(await t.createOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_test_order',\n description: 'Validate a Spot order without submitting it. Signed.',\n inputSchema: spotOrderParamsSchema,\n handler: async (args) => textResult(await t.testOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_get_order',\n description: 'Query a specific Spot order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.getOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'spot_cancel_order',\n description: 'Cancel a specific open Spot order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional(), newClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId, newClientOrderId }) =>\n textResult(await t.cancelOrder(normalizeSymbol(symbol), { orderId, origClientOrderId, newClientOrderId })),\n },\n {\n name: 'spot_open_orders',\n description: 'Get all current open Spot orders, for one symbol or all symbols. Signed.',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await t.getOpenOrders(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'spot_all_orders',\n description: 'Get historical Spot orders for a symbol with optional time range. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), startTime, endTime, limit }),\n handler: async ({ symbol, orderId, startTime, endTime, limit }) =>\n textResult(await t.getAllOrders(normalizeSymbol(symbol), { orderId, startTime, endTime, limit })),\n },\n {\n name: 'spot_cancel_open_orders',\n description: 'Cancel all open Spot orders for a symbol. Signed.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await t.cancelOpenOrders(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_cancel_replace_order',\n description: 'Cancel an existing Spot order and place a new one on the same symbol (cancel-replace). Signed.',\n inputSchema: z.object({\n symbol: spotSymbol,\n side,\n type: z.enum(['LIMIT', 'MARKET', 'STOP_LOSS', 'STOP_LOSS_LIMIT', 'TAKE_PROFIT', 'TAKE_PROFIT_LIMIT']),\n cancelReplaceMode: z.enum(['STOP_ON_FAILURE', 'ALLOW_FAILURE']).default('STOP_ON_FAILURE'),\n cancelOrderId: z.number().int().positive().optional(),\n cancelOrigClientOrderId: z.string().optional(),\n cancelNewClientOrderId: z.string().optional(),\n quantity: z.union([z.string(), z.number()]).optional(),\n price: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional(),\n newClientOrderId: z.string().optional(),\n }),\n handler: async (args) => textResult(await t.cancelReplaceOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_new_oco_order',\n description: 'Place a new Spot OCO (one-cancels-other) order: a stop-loss limit + a limit-maker take-profit. Signed.',\n inputSchema: z.object({\n symbol: spotSymbol,\n side,\n quantity: z.union([z.string(), z.number()]).describe('Total base-asset quantity for both legs'),\n price: z.union([z.string(), z.number()]).describe('Limit (take-profit) price'),\n stopPrice: z.union([z.string(), z.number()]).describe('Stop-loss trigger price'),\n stopLimitPrice: z.union([z.string(), z.number()]).optional().describe('Stop-loss limit price (defaults to stopPrice)'),\n stopLimitTimeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional(),\n listClientOrderId: z.string().optional(),\n limitClientOrderId: z.string().optional(),\n stopClientOrderId: z.string().optional(),\n }),\n handler: async (args) => textResult(await t.createOCOOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_cancel_oco_order',\n description: 'Cancel an entire Spot OCO order list by orderListId or listClientOrderId. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderListId: z.number().int().positive().optional(), listClientOrderId: z.string().optional(), newClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderListId, listClientOrderId, newClientOrderId }) =>\n textResult(await t.cancelOCOOrder(normalizeSymbol(symbol), { orderListId, listClientOrderId, newClientOrderId })),\n },\n {\n name: 'spot_get_oco_order',\n description: 'Query a Spot OCO order list by orderListId or listClientOrderId. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderListId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderListId, origClientOrderId }) =>\n textResult(await t.getOCOOrder(normalizeSymbol(symbol), { orderListId, origClientOrderId })),\n },\n {\n name: 'spot_open_oco_orders',\n description: 'Get all current open Spot OCO order lists. Signed.',\n inputSchema: z.object({}),\n handler: async () => textResult(await t.getOpenOCOOrders()),\n },\n {\n name: 'spot_all_oco_orders',\n description: 'Get historical Spot OCO order lists for a symbol with optional time range. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, fromId: z.number().int().positive().optional(), startTime, endTime, limit }),\n handler: async ({ symbol, fromId, startTime, endTime, limit }) =>\n textResult(await t.getAllOCOOrders(normalizeSymbol(symbol), { fromId, startTime, endTime, limit })),\n },\n {\n name: 'spot_cancel_open_oco_orders',\n description: 'Cancel all open Spot OCO order lists for a symbol. Signed.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await t.cancelOpenOCOOrders(normalizeSymbol(symbol))),\n },\n\n // ---- User data stream (signed) ----\n {\n name: 'spot_ws_start_user_stream',\n description: 'Start the Spot user data stream: creates a listenKey, connects the private WebSocket, and begins keep-alive. Emits executionReport, outboundAccountPosition, balanceUpdate, listStatus.',\n inputSchema: z.object({}),\n handler: async () => textResult({ listenKey: await client.startSpotUserStream() }),\n },\n {\n name: 'spot_ws_stop_user_stream',\n description: 'Stop the Spot user data stream: closes the private WebSocket and invalidates the listenKey.',\n inputSchema: z.object({}),\n handler: async () => {\n client.closeSpotUserStream();\n return textResult({ stopped: true });\n },\n },\n ];\n\n return tools;\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst symbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT');\nconst optionalSymbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional();\nconst limit = z.number().int().positive().max(1000).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\nconst side = z.enum(['BUY', 'SELL']);\nconst positionSide = z.enum(['BOTH', 'LONG', 'SHORT']).optional();\n\nexport const orderParamsSchema = z.object({\n symbol,\n side,\n type: z.enum(['LIMIT', 'MARKET', 'STOP', 'STOP_MARKET', 'TAKE_PROFIT', 'TAKE_PROFIT_MARKET', 'TRAILING_STOP_MARKET']),\n quantity: z.union([z.string(), z.number()]).describe('Order quantity in base asset'),\n price: z.union([z.string(), z.number()]).optional().describe('Required for LIMIT and STOP/TAKE_PROFIT (limit-triggered) types'),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n stopPrice: z.union([z.string(), z.number()]).optional().describe('Trigger price for STOP/STOP_MARKET/TAKE_PROFIT/TAKE_PROFIT_MARKET'),\n reduceOnly: z.boolean().optional().describe('true = only reduces the position, never opens'),\n positionSide,\n newClientOrderId: z.string().optional(),\n closePosition: z.boolean().optional().describe('Close the full position on trigger (mutually exclusive with quantity)'),\n newOrderRespType: z.enum(['ACK', 'RESULT']).optional(),\n priceProtect: z.boolean().optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional().describe('Trigger price basis; default CONTRACT_PRICE'),\n callbackRate: z.union([z.string(), z.number()]).optional().describe('Percent callback for TRAILING_STOP_MARKET, e.g. 0.5'),\n activationPrice: z.union([z.string(), z.number()]).optional().describe('Activation price for TRAILING_STOP_MARKET'),\n selfTradePreventionMode: z.enum(['NONE', 'EXPIRE_TAKER', 'EXPIRE_MAKER', 'EXPIRE_BOTH']).optional(),\n goodTillDate: z.number().int().optional().describe('Timestamp when a GTD order expires'),\n});\n\nexport function tradingTools(client: BinanceClient): ToolDefinition[] {\n const t = client.futures.trading;\n\n return [\n {\n name: 'futures_new_order',\n description: 'Place a new futures order. Types: LIMIT, MARKET, STOP, STOP_MARKET, TAKE_PROFIT, TAKE_PROFIT_MARKET, TRAILING_STOP_MARKET. Use STOP_MARKET as the take-profit/stop-loss trigger and LIMIT for the actual fill. Signed.',\n inputSchema: orderParamsSchema,\n handler: async (args) => textResult(await t.createOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_test_order',\n description: 'Validate a new order without submitting it. Returns 200 on success; use to validate fields and margin before real orders. Signed.',\n inputSchema: orderParamsSchema,\n handler: async (args) => textResult(await t.createTestOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_get_order',\n description: 'Query a specific order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.getOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'futures_cancel_order',\n description: 'Cancel a specific open order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.cancelOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'futures_get_open_order',\n description: 'Query a current open order (must exist in the open order book). Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.getCurrentOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'futures_open_orders',\n description: 'Get all current open orders, for one symbol or all symbols. Signed.',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await t.getOpenOrders(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_all_orders',\n description: 'Get historical orders for a symbol with optional time range (last 7 days by default). Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), startTime, endTime, limit }),\n handler: async ({ symbol, orderId, startTime, endTime, limit }) =>\n textResult(await t.getAllOrders(normalizeSymbol(symbol), { orderId, startTime, endTime, limit })),\n },\n {\n name: 'futures_cancel_all_orders',\n description: 'Cancel all open orders for a symbol. Signed.',\n inputSchema: z.object({ symbol }),\n handler: async ({ symbol }) => textResult(await t.cancelAllOpenOrders(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_modify_order',\n description: 'Modify an open order (price/quantity/stopPrice). Cannot modify when position side is BOTH and closePosition is true. Signed.',\n inputSchema: z.object({\n symbol,\n side,\n quantity: z.union([z.string(), z.number()]),\n price: z.union([z.string(), z.number()]).optional(),\n orderId: z.number().int().positive().optional(),\n origClientOrderId: z.string().optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n positionSide,\n newClientOrderId: z.string().optional(),\n }),\n handler: async (args) => textResult(await t.modifyOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_order_modify_history',\n description: 'Get order modification history for a symbol. Signed.',\n inputSchema: z.object({ symbol, startTime, endTime, limit }),\n handler: async ({ symbol, startTime, endTime, limit }) =>\n textResult(await t.getOrderModifyHistory(normalizeSymbol(symbol), { startTime, endTime, limit })),\n },\n {\n name: 'futures_batch_orders',\n description: 'Place up to 5 orders in one request (array of order objects, max 30 per minute per symbol). Signed.',\n inputSchema: z.object({ orders: z.array(orderParamsSchema).min(1).max(5) }),\n handler: async (args) => {\n const mapped = args.orders.map((o: z.infer<typeof orderParamsSchema>) => ({ ...o, symbol: normalizeSymbol(o.symbol) }));\n return textResult(await t.createBatchOrders(mapped));\n },\n },\n {\n name: 'futures_cancel_batch_orders',\n description: 'Cancel multiple orders at once (up to 10 by orderId list or client order id list). Signed.',\n inputSchema: z.object({\n symbol,\n orderIdList: z.array(z.number().int().positive()).max(10).optional(),\n origClientOrderIdList: z.array(z.string()).max(10).optional(),\n }),\n handler: async ({ symbol, orderIdList, origClientOrderIdList }) =>\n textResult(await t.cancelBatchOrders(normalizeSymbol(symbol), { orderIdList, origClientOrderIdList })),\n },\n {\n name: 'futures_set_leverage',\n description: 'Change initial leverage for a symbol (1-125, within bracket). Signed.',\n inputSchema: z.object({ symbol, leverage: z.number().int().min(1).max(125) }),\n handler: async ({ symbol, leverage }) => textResult(await t.setLeverage(normalizeSymbol(symbol), leverage)),\n },\n {\n name: 'futures_set_margin_type',\n description: 'Change margin type for a symbol: isolated or cross. Only allowed when no open position for the symbol. Signed.',\n inputSchema: z.object({ symbol, marginType: z.enum(['isolated', 'cross']) }),\n handler: async ({ symbol, marginType }) => textResult(await t.setMarginType(normalizeSymbol(symbol), marginType)),\n },\n {\n name: 'futures_modify_position_margin',\n description: 'Add or reduce isolated position margin. marginType: 1 = add margin, 2 = reduce margin. Signed.',\n inputSchema: z.object({ symbol, amount: z.number().positive(), marginType: z.enum(['1', '2']).describe('1 = add margin, 2 = reduce margin') }),\n handler: async ({ symbol, amount, marginType }) => textResult(await t.modifyPositionMargin(normalizeSymbol(symbol), amount, Number(marginType))),\n },\n {\n name: 'futures_countdown_cancel_all',\n description: 'Auto-cancel all open orders for a symbol after countdownTime ms (0 = cancel the countdown). Emergency circuit breaker. Signed.',\n inputSchema: z.object({ symbol, countdownTime: z.number().int().min(100).max(60000) }),\n handler: async ({ symbol, countdownTime }) => textResult(await t.setCountdownCancelAll(normalizeSymbol(symbol), countdownTime)),\n },\n {\n name: 'futures_new_algo_order',\n description: 'Place a conditional algo order (CONDITIONAL or VP). CONDITIONAL supports STOP_MARKET/TAKE_PROFIT_MARKET types with triggerPrice; VP is a volume-participation order with urgency and quantity. Signed.',\n inputSchema: z.object({\n algoType: z.enum(['CONDITIONAL', 'VP']),\n symbol,\n side,\n positionSide,\n type: z.enum(['STOP_MARKET', 'TAKE_PROFIT_MARKET', 'LIMIT']).describe('For CONDITIONAL: STOP_MARKET/TAKE_PROFIT_MARKET. For VP: LIMIT'),\n quantity: z.union([z.string(), z.number()]),\n triggerPrice: z.union([z.string(), z.number()]).optional().describe('Required for CONDITIONAL'),\n price: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional(),\n priceProtect: z.boolean().optional(),\n reduceOnly: z.boolean().optional(),\n closePosition: z.boolean().optional(),\n urgency: z.enum(['LOW', 'MEDIUM', 'HIGH']).optional().describe('Required for VP'),\n clientAlgoId: z.string().optional(),\n }),\n handler: async (args) =>\n textResult(await t.createAlgoOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_cancel_algo_order',\n description: 'Cancel an open algo order by algoId or clientAlgoId. Signed.',\n inputSchema: z.object({ symbol, algoId: z.number().int().positive().optional(), clientAlgoId: z.string().optional() }),\n handler: async ({ symbol, algoId, clientAlgoId }) =>\n textResult(await t.cancelAlgoOrder(normalizeSymbol(symbol), { algoId, clientAlgoId })),\n },\n {\n name: 'futures_cancel_all_algo_orders',\n description: 'Cancel all open algo orders for a symbol. Signed.',\n inputSchema: z.object({ symbol }),\n handler: async ({ symbol }) => textResult(await t.cancelAllOpenAlgoOrders(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_get_algo_order',\n description: 'Query an algo order by algoId or clientAlgoId. Signed.',\n inputSchema: z.object({ symbol, algoId: z.number().int().positive().optional(), clientAlgoId: z.string().optional() }),\n handler: async ({ symbol, algoId, clientAlgoId }) =>\n textResult(await t.getAlgoOrder(normalizeSymbol(symbol), { algoId, clientAlgoId })),\n },\n {\n name: 'futures_open_algo_orders',\n description: 'Get all current open algo orders, optionally filtered by symbol. Signed.',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await t.getOpenAlgoOrders(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_all_algo_orders',\n description: 'Get historical algo orders for a symbol with optional time range. Signed.',\n inputSchema: z.object({ symbol, startTime, endTime, limit }),\n handler: async ({ symbol, startTime, endTime, limit }) =>\n textResult(await t.getAllAlgoOrders(normalizeSymbol(symbol), { startTime, endTime, limit })),\n },\n {\n name: 'futures_convert_exchange_info',\n description: 'List asset pairs eligible for futures Convert, optionally filtered by fromAsset/toAsset.',\n inputSchema: z.object({ fromAsset: z.string().optional(), toAsset: z.string().optional() }),\n handler: async ({ fromAsset, toAsset }) => textResult(await t.convertExchangeInfo({ fromAsset, toAsset })),\n },\n {\n name: 'futures_convert_get_quote',\n description: 'Request a Convert quote between two assets (quote expires quickly; accept with futures_convert_accept_quote). Signed.',\n inputSchema: z.object({\n fromAsset: z.string().min(1),\n toAsset: z.string().min(1),\n fromAmount: z.number().positive().optional(),\n toAmount: z.number().positive().optional(),\n validTime: z.enum(['10s', '30s', '1m', '2m']).optional(),\n }),\n handler: async (args) => textResult(await t.convertGetQuote(args)),\n },\n {\n name: 'futures_convert_accept_quote',\n description: 'Accept a previously requested Convert quote by quoteId. Signed.',\n inputSchema: z.object({ quoteId: z.string().min(1) }),\n handler: async ({ quoteId }) => textResult(await t.convertAcceptQuote(quoteId)),\n },\n {\n name: 'futures_convert_order_status',\n description: 'Query the status of a Convert order by orderId or quoteId. Signed.',\n inputSchema: z.object({ orderId: z.string().optional(), quoteId: z.string().optional() }),\n handler: async ({ orderId, quoteId }) => textResult(await t.convertOrderStatus({ orderId, quoteId })),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\ninterface WsBuffer {\n subscriptions: Set<string>;\n events: { stream: string; payload: unknown; ts: number }[];\n}\n\nconst buffers = new Map<BinanceClient, WsBuffer>();\nconst MAX_BUFFER = 500;\n\nfunction bufferFor(client: BinanceClient): WsBuffer {\n let buffer = buffers.get(client);\n if (!buffer) {\n buffer = { subscriptions: new Set(), events: [] };\n buffers.set(client, buffer);\n client.futures.ws.on('message', (stream: string, payload: unknown) => {\n buffer!.events.push({ stream, payload, ts: Date.now() });\n if (buffer!.events.length > MAX_BUFFER) buffer!.events.splice(0, buffer!.events.length - MAX_BUFFER);\n });\n }\n return buffer;\n}\n\nexport function getBufferedWsEvents(client: BinanceClient, limit = 50): unknown[] {\n return bufferFor(client).events.slice(-limit);\n}\n\nexport function clearBufferedWsEvents(client: BinanceClient): void {\n bufferFor(client).events = [];\n}\n\nexport function wsTools(client: BinanceClient): ToolDefinition[] {\n const buffer = bufferFor(client);\n\n return [\n {\n name: 'futures_ws_subscribe',\n description:\n 'Subscribe to real-time market data streams. Topic format: <symbol>@<stream>, e.g. btcusdt@aggTrade, btcusdt@kline_1m, btcusdt@depth20, btcusdt@markPrice@1s, btcusdt@bookTicker, btcusdt@ticker, btcusdt@miniTicker, btcusdt@forceOrder, or all-market topics !ticker@arr, !bookTicker, !markPrice@arr, !forceOrder@arr, !miniTicker@arr. Multiple topics can be passed at once.',\n inputSchema: z.object({\n topics: z.array(z.string().min(1)).min(1).describe('Stream topics, e.g. [\"btcusdt@aggTrade\", \"btcusdt@kline_1m\"]'),\n }),\n handler: async ({ topics }) => {\n const normalized = topics.map((t: string) => t.trim().toLowerCase());\n client.futures.ws.subscribe(normalized);\n normalized.forEach((t: string) => buffer.subscriptions.add(t));\n return textResult({ subscribed: normalized, active: [...buffer.subscriptions] });\n },\n },\n {\n name: 'futures_ws_unsubscribe',\n description: 'Unsubscribe from previously subscribed market data streams.',\n inputSchema: z.object({ topics: z.array(z.string().min(1)).min(1) }),\n handler: async ({ topics }) => {\n const normalized = topics.map((t: string) => t.trim().toLowerCase());\n client.futures.ws.unsubscribe(normalized);\n normalized.forEach((t: string) => buffer.subscriptions.delete(t));\n return textResult({ unsubscribed: normalized, active: [...buffer.subscriptions] });\n },\n },\n {\n name: 'futures_ws_subscriptions',\n description: 'List the currently subscribed WebSocket market streams for this client.',\n inputSchema: z.object({}),\n handler: async () => textResult({ active: [...buffer.subscriptions] }),\n },\n {\n name: 'futures_ws_events',\n description:\n 'Read the buffered real-time payloads received since the last read for the subscribed streams (aggregate trades, klines, depth deltas, mark price, book tickers, tickers, force orders). Payloads are parsed; depth deltas must be applied to a snapshot from futures_order_book.',\n inputSchema: z.object({ limit: z.number().int().min(1).max(200).default(50) }),\n handler: async ({ limit }) => textResult(getBufferedWsEvents(client, limit)),\n },\n {\n name: 'futures_ws_clear_events',\n description: 'Clear the buffered WebSocket events so the next read only returns new payloads.',\n inputSchema: z.object({}),\n handler: async () => {\n clearBufferedWsEvents(client);\n return textResult({ cleared: true });\n },\n },\n {\n name: 'futures_ws_start_user_stream',\n description:\n 'Start the user data stream: creates a listenKey, connects the private WebSocket, and begins a 30-minute keep-alive. Emits private events (ACCOUNT_UPDATE, ORDER_TRADE_UPDATE, MARGIN_CALL, ACCOUNT_CONFIG_UPDATE, listenKeyExpired) that the application can consume from the client.',\n inputSchema: z.object({}),\n handler: async () => textResult({ listenKey: await client.startUserStream() }),\n },\n {\n name: 'futures_ws_stop_user_stream',\n description: 'Stop the user data stream: closes the private WebSocket and invalidates the listenKey.',\n inputSchema: z.object({}),\n handler: async () => {\n client.closeUserStream();\n return textResult({ stopped: true });\n },\n },\n {\n name: 'futures_ws_api_order_status',\n description: 'Query an order via the signed WebSocket API (order.status) — lower-latency alternative to futures_get_order.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n orderId: z.number().int().positive().optional(),\n origClientOrderId: z.string().optional(),\n }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await client.futures.wsApi.orderStatus({ symbol: normalizeSymbol(symbol), orderId, origClientOrderId })),\n },\n {\n name: 'futures_ws_api_account_status',\n description: 'Get account info via the signed WebSocket API (account.status).',\n inputSchema: z.object({}),\n handler: async () => textResult(await client.futures.wsApi.accountStatus()),\n },\n {\n name: 'futures_ws_api_account_position',\n description: 'Get current positions via the signed WebSocket API (account.position).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional() }),\n handler: async ({ symbol }) =>\n textResult(await client.futures.wsApi.accountPosition(symbol ? { symbol: normalizeSymbol(symbol) } : {})),\n },\n {\n name: 'futures_ws_api_user_data_stream_start',\n description: 'Create a listenKey via the signed WebSocket API (userDataStream.start) — no REST call required.',\n inputSchema: z.object({}),\n handler: async () => textResult(await client.futures.wsApi.userDataStreamStart()),\n },\n {\n name: 'futures_ws_api_user_data_stream_stop',\n description: 'Invalidate a listenKey via the signed WebSocket API (userDataStream.stop).',\n inputSchema: z.object({ listenKey: z.string().min(1) }),\n handler: async ({ listenKey }) => textResult(await client.futures.wsApi.userDataStreamStop(listenKey)),\n },\n {\n name: 'futures_ws_api_ticker_price',\n description: 'Get latest price via the unsigned WebSocket API (ticker.price); omit symbol for all symbols.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional() }),\n handler: async ({ symbol }) =>\n textResult(await client.futures.wsApi.tickerPrice(symbol ? { symbol: normalizeSymbol(symbol) } : {})),\n },\n {\n name: 'futures_ws_api_order_book',\n description: 'Get order-book depth via the unsigned WebSocket API (depth).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: z.enum(['5', '10', '20', '50', '100', '500', '1000']).optional(),\n }),\n handler: async ({ symbol, limit }) =>\n textResult(await client.futures.wsApi.depth({ symbol: normalizeSymbol(symbol), limit })),\n },\n ];\n}\n","import type { BinanceClient } from '../client/BinanceClient.js';\nimport { accountTools } from './account.tools.js';\nimport { derivedTools } from './derived.tools.js';\nimport { marketDataTools } from './market-data.tools.js';\nimport { createPaperContext, type PaperContext, paperTools } from './paper.tools.js';\nimport { spotTools } from './spot.tools.js';\nimport { tradingTools } from './trading.tools.js';\nimport { wsTools } from './ws.tools.js';\nimport type { ToolDefinition } from './types.js';\nimport { toToolList } from './types.js';\n\nexport type { ToolDefinition, ToolContext } from './types.js';\nexport { toJsonSchema, toOpenAITool, toAnthropicTool, toMCPTool, toToolList, textResult } from './types.js';\nexport { marketDataTools } from './market-data.tools.js';\nexport { accountTools } from './account.tools.js';\nexport { tradingTools } from './trading.tools.js';\nexport { spotTools } from './spot.tools.js';\nexport { derivedTools } from './derived.tools.js';\nexport { wsTools, getBufferedWsEvents, clearBufferedWsEvents } from './ws.tools.js';\nexport { createPaperContext, paperTools, type PaperState, type PaperPosition, type PaperEvent, type PaperContext } from './paper.tools.js';\n\nexport interface FuturesToolkit {\n client: BinanceClient;\n tools: ToolDefinition[];\n market: ToolDefinition[];\n account: ToolDefinition[];\n trading: ToolDefinition[];\n spot: ToolDefinition[];\n ws: ToolDefinition[];\n /** Composite tools that fan out over several endpoints. */\n derived: ToolDefinition[];\n paper: ToolDefinition[];\n paperContext: PaperContext;\n}\n\nexport function createFuturesToolkit(client: BinanceClient): FuturesToolkit {\n const market = marketDataTools(client);\n const account = accountTools(client);\n const trading = tradingTools(client);\n const spot = spotTools(client);\n const ws = wsTools(client);\n const derived = derivedTools(client);\n const paperContext = createPaperContext(client);\n const paper = paperTools(paperContext);\n return {\n client,\n tools: [...market, ...account, ...trading, ...spot, ...ws, ...derived, ...paper],\n market,\n account,\n trading,\n spot,\n ws,\n derived,\n paper,\n paperContext,\n };\n}\n\nexport function toolkitToFormats(toolkit: FuturesToolkit): {\n openai: Record<string, unknown>[];\n anthropic: Record<string, unknown>[];\n mcp: Record<string, unknown>[];\n} {\n return {\n openai: toToolList(toolkit.tools, 'openai'),\n anthropic: toToolList(toolkit.tools, 'anthropic'),\n mcp: toToolList(toolkit.tools, 'mcp'),\n };\n}\n"],"mappings":"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","names":["cryptoSign","axios","Bottleneck","num","symbol","symbol","period","limit","import_zod","http","symbol","limit","http","contractType","symbol","limit","http","symbol","import_zod","http","symbol","import_zod","http","import_zod","http","symbol","import_zod","http","symbol","symbol","symbol","period","http","import_zod","http","contractType","symbol","period","http","symbol","http","symbol","http","import_zod","http","symbol","import_zod","http","symbol","import_zod","http","import_zod","WebSocket","symbol","contractType","symbol","import_node_events","import_ws","WebSocket","import_node_events","import_ws","WebSocket","symbol","contractType","import_node_events","import_ws","WebSocket","import_node_crypto","import_ws","WebSocket","import_node_crypto","import_ws","buildQueryString","WebSocket","side","import_zod","import_zod","symbol","startTime","endTime","limit","import_zod","period","import_zod","startTime","endTime","symbol","limit","contractType","period","import_zod","symbol","side","import_zod","optionalSymbol","limit","startTime","endTime","symbol","import_zod","symbol","optionalSymbol","limit","startTime","endTime","side","import_zod","limit","symbol","http"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/index.ts","../../src/core/decimal.ts","../../src/errors/BinanceError.ts","../../src/errors/BinanceAuthError.ts","../../src/errors/BinanceApiError.ts","../../src/errors/RateLimitError.ts","../../src/errors/NetworkError.ts","../../src/errors/PolicyViolationError.ts","../../src/errors/DryRunError.ts","../../src/client/TradingPolicy.ts","../../src/risk/RiskGateway.ts","../../src/client/HttpClient.ts","../../src/registry/spot.endpoints.ts","../../src/registry/usdm.endpoints.ts","../../src/registry/coinm.endpoints.ts","../../src/registry/margin.endpoints.ts","../../src/registry/wallet.endpoints.ts","../../src/registry/subaccount.endpoints.ts","../../src/registry/endpoints.ts","../../src/contracts/index.ts","../../src/client/RateLimitTracker.ts","../../src/client/Signer.ts","../../src/client/endpoints.ts","../../src/core/events.ts","../../src/core/credentials.ts","../../src/types/ws.types.ts","../../src/ws/WsConnection.ts","../../src/core/json.ts","../../src/ws/BaseWS.ts","../../src/ws/FuturesMarketWS.ts","../../src/ws/SpotMarketWS.ts","../../src/ws/CoinMMarketWS.ts","../../src/ws/platform/ReconnectPolicy.ts","../../src/ws/platform/types.ts","../../src/ws/platform/ConnectionPool.ts","../../src/ws/platform/Heartbeat.ts","../../src/ws/platform/WsApiClient.ts","../../src/ws/platform/ProductWsApi.ts","../../src/ws/platform/RenewalController.ts","../../src/ws/platform/Subscription.ts","../../src/ws/platform/SubscriptionRegistry.ts","../../src/ws/platform/WsPlatform.ts","../../src/core/context.ts","../../src/types/margin.types.ts","../../src/resources/Margin.ts","../../src/types/wallet.types.ts","../../src/resources/Wallet.ts","../../src/types/subaccount.types.ts","../../src/resources/SubAccount.ts","../../src/types/spot.types.ts","../../src/resources/SpotTrading.ts","../../src/types/market.types.ts","../../src/resources/MarketDataBase.ts","../../src/resources/SpotMarket.ts","../../src/types/userdata.types.ts","../../src/resources/SpotUserDataStream.ts","../../src/execution/ExecutionManager.ts","../../src/execution/types.ts","../../src/execution/adapter.ts","../../src/ws/SpotUserWS.ts","../../src/ws/SpotWsApi.ts","../../src/products/spot/surface.ts","../../src/types/account.types.ts","../../src/resources/FuturesAccount.ts","../../src/types/futures.types.ts","../../src/resources/FuturesData.ts","../../src/resources/FuturesMarket.ts","../../src/types/filters.types.ts","../../src/resources/FuturesOps.ts","../../src/types/trading.types.ts","../../src/resources/FuturesTrading.ts","../../src/resources/UserDataStream.ts","../../src/ws/FuturesUserWS.ts","../../src/ws/WsApi.ts","../../src/products/usdm/namespace.ts","../../src/types/coinm.types.ts","../../src/resources/CoinMAccount.ts","../../src/resources/CoinMMarket.ts","../../src/resources/CoinMTrading.ts","../../src/resources/CoinMUserDataStream.ts","../../src/ws/CoinMUserWS.ts","../../src/products/coinm/surface.ts","../../src/execution/paper.ts","../../src/paper/models.ts","../../src/paper/PaperTradingEngine.ts","../../src/execution/AuditSink.ts","../../src/execution/Gateway.ts","../../src/state/OrderBook.ts","../../src/state/OrderBookEngine.ts","../../src/client/BinanceClient.ts","../../src/mcp/server.ts","../../src/tools/account.tools.ts","../../src/tools/types.ts","../../src/tools/derived.tools.ts","../../src/tools/execution.tools.ts","../../src/tools/trading.tools.ts","../../src/tools/market-data.tools.ts","../../src/tools/paper.tools.ts","../../src/tools/spot.tools.ts","../../src/tools/ws.tools.ts","../../src/tools/index.ts","../../src/version.ts"],"sourcesContent":["#!/usr/bin/env node\nimport http from 'node:http';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { BinanceClient } from '../client/BinanceClient.js';\nimport { createBinanceMcpServer } from './server.js';\n\nfunction clientFromEnv(): BinanceClient {\n return new BinanceClient({\n apiKey: process.env.BINANCE_API_KEY,\n apiSecret: process.env.BINANCE_API_SECRET,\n testnet: process.env.BINANCE_TESTNET === 'true' || process.env.BINANCE_ENV === 'testnet',\n demo: process.env.BINANCE_ENV === 'demo',\n });\n}\n\nasync function startStdio(): Promise<void> {\n const server = createBinanceMcpServer(clientFromEnv());\n await server.connect(new StdioServerTransport());\n}\n\nfunction startHttp(): void {\n const port = Number(process.env.PORT || process.env.MCP_PORT || 3100);\n const server = http.createServer((req, res) => {\n res.setHeader('content-type', 'application/json');\n if (req.url === '/health') {\n res.end(JSON.stringify({ ok: true, name: 'binance-sdk-mcp' }));\n return;\n }\n res.statusCode = 501;\n res.end(JSON.stringify({ error: 'Use stdio for MCP JSON-RPC. HTTP health endpoint is available at /health.' }));\n });\n server.listen(port, () => console.error(`binance-sdk MCP HTTP health server listening on ${port}`));\n}\n\nif (process.argv.includes('--http') || process.env.MCP_TRANSPORT === 'http') startHttp();\nelse startStdio().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n","/**\n * Decimal-safe financial arithmetic.\n *\n * Binance transmits every price, quantity and fee as a decimal *string* precisely\n * because binary floating point cannot represent values like `0.1` exactly. The\n * legacy SDK code converted these to `number` and did money math in IEEE-754\n * doubles, which accumulates rounding error across the exact places it matters\n * most: average fill prices, notional checks, fees and PnL.\n *\n * This module provides a small, dependency-free fixed-point decimal backed by\n * `BigInt` with a 18-digit internal scale — far finer than any Binance tick —\n * so add/sub/mul are exact for all realistic operands. Division rounds\n * half-even to the configured scale.\n */\n\nconst SCALE = 18n;\nconst SCALE_FACTOR = 10n ** SCALE;\nconst MAX_SAFE = Number.MAX_SAFE_INTEGER;\n\nexport type DecimalInput = Decimal | string | number | bigint;\n\nexport class Decimal {\n /** Scaled BigInt value (value * 10^18). */\n private readonly scaled: bigint;\n\n private constructor(scaled: bigint) {\n this.scaled = scaled;\n }\n\n static readonly ZERO = new Decimal(0n);\n static readonly ONE = new Decimal(SCALE_FACTOR);\n\n static from(value: DecimalInput): Decimal {\n if (value instanceof Decimal) return value;\n if (typeof value === 'bigint') {\n return new Decimal(value * SCALE_FACTOR);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new Error(`Decimal.from: non-finite number: ${value}`);\n if (Number.isInteger(value)) {\n return new Decimal(BigInt(value) * SCALE_FACTOR);\n }\n return Decimal.parse(value.toExponential(20));\n }\n return Decimal.parse(value);\n }\n\n private static parse(text: string): Decimal {\n const trimmed = text.trim();\n if (!/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(trimmed)) {\n throw new Error(`Decimal.from: invalid decimal string: ${text}`);\n }\n let negative = false;\n let body = trimmed;\n if (body.startsWith('+')) body = body.slice(1);\n else if (body.startsWith('-')) {\n negative = true;\n body = body.slice(1);\n }\n\n let exponent = 0;\n const expIndex = body.search(/[eE]/);\n if (expIndex >= 0) {\n exponent = Number.parseInt(body.slice(expIndex + 1), 10);\n body = body.slice(0, expIndex);\n }\n\n const dotIndex = body.indexOf('.');\n const intPart = dotIndex >= 0 ? body.slice(0, dotIndex) : body;\n const fracPart = dotIndex >= 0 ? body.slice(dotIndex + 1) : '';\n\n let digits = (intPart || '0') + fracPart;\n let pointIndex = intPart.length;\n // Apply exponent by moving the decimal point.\n pointIndex += exponent;\n\n // Normalize so the fraction has exactly SCALE digits.\n while (digits.length < pointIndex + Number(SCALE)) digits += '0';\n if (pointIndex < 0) {\n digits = '0'.repeat(-pointIndex) + digits;\n pointIndex = 0;\n }\n const keep = pointIndex + Number(SCALE);\n if (digits.length > keep) {\n // Truncate excess precision beyond SCALE (18) digits.\n digits = digits.slice(0, keep);\n }\n const scaled = (negative ? -1n : 1n) * BigInt(digits === '' ? '0' : digits);\n return new Decimal(scaled);\n }\n\n add(other: DecimalInput): Decimal {\n return new Decimal(this.scaled + Decimal.from(other).scaled);\n }\n\n sub(other: DecimalInput): Decimal {\n return new Decimal(this.scaled - Decimal.from(other).scaled);\n }\n\n /** Exact multiplication at 18-digit scale. */\n mul(other: DecimalInput): Decimal {\n return new Decimal((this.scaled * Decimal.from(other).scaled) / SCALE_FACTOR);\n }\n\n /** Division, rounded half-even at 18 digits. */\n div(other: DecimalInput): Decimal {\n const divisor = Decimal.from(other);\n if (divisor.scaled === 0n) throw new Error('Decimal.div: division by zero');\n const numerator = this.scaled * SCALE_FACTOR;\n const quotient = numerator / divisor.scaled;\n const remainder = numerator % divisor.scaled;\n const halfRemainderAbs = (remainder < 0n ? -remainder : remainder) * 2n;\n const absDivisor = divisor.scaled < 0n ? -divisor.scaled : divisor.scaled;\n if (halfRemainderAbs > absDivisor) {\n const correction = (this.scaled < 0n) !== (divisor.scaled < 0n) ? -1n : 1n;\n return new Decimal(quotient + correction);\n }\n return new Decimal(quotient);\n }\n\n neg(): Decimal {\n return new Decimal(-this.scaled);\n }\n\n abs(): Decimal {\n return new Decimal(this.scaled < 0n ? -this.scaled : this.scaled);\n }\n\n cmp(other: DecimalInput): -1 | 0 | 1 {\n const o = Decimal.from(other).scaled;\n if (this.scaled < o) return -1;\n if (this.scaled > o) return 1;\n return 0;\n }\n\n eq(other: DecimalInput): boolean {\n return this.cmp(other) === 0;\n }\n\n gt(other: DecimalInput): boolean {\n return this.cmp(other) > 0;\n }\n\n gte(other: DecimalInput): boolean {\n return this.cmp(other) >= 0;\n }\n\n lt(other: DecimalInput): boolean {\n return this.cmp(other) < 0;\n }\n\n lte(other: DecimalInput): boolean {\n return this.cmp(other) <= 0;\n }\n\n isZero(): boolean {\n return this.scaled === 0n;\n }\n\n isNegative(): boolean {\n return this.scaled < 0n;\n }\n\n isPositive(): boolean {\n return this.scaled > 0n;\n }\n\n static min(a: DecimalInput, b: DecimalInput): Decimal {\n const da = Decimal.from(a);\n return da.lte(b) ? da : Decimal.from(b);\n }\n\n static max(a: DecimalInput, b: DecimalInput): Decimal {\n const da = Decimal.from(a);\n return da.gte(b) ? da : Decimal.from(b);\n }\n\n /** Round half-even to `dp` decimal places; default 18 = no-op. */\n round(dp = 18): Decimal {\n if (dp >= 18) return this;\n if (dp < 0) throw new Error('Decimal.round: negative decimal places');\n const drop = SCALE - BigInt(dp);\n const divisor = 10n ** drop;\n const quotient = this.scaled / divisor;\n const remainder = this.scaled % divisor;\n const half = divisor / 2n;\n const absRemainder = remainder < 0n ? -remainder : remainder;\n if (absRemainder * 2n > half * 2n || (absRemainder * 2n === half * 2n && quotient % 2n !== 0n)) {\n const sign = this.scaled < 0n ? -1n : 1n;\n return new Decimal((quotient + sign) * divisor);\n }\n return new Decimal(quotient * divisor);\n }\n\n toString(): string {\n const negative = this.scaled < 0n;\n const digits = (negative ? -this.scaled : this.scaled)\n .toString()\n .padStart(Number(SCALE) + 1, '0');\n const intPart = digits.slice(0, digits.length - Number(SCALE));\n let fracPart = digits.slice(digits.length - Number(SCALE));\n // Linear trailing-zero scan (bounded by SCALE) — a `/0+$/` regex is the\n // polynomial-redos pattern on tainted inputs (CodeQL flags it).\n let fracEnd = fracPart.length;\n while (fracEnd > 0 && fracPart.charCodeAt(fracEnd - 1) === 48) fracEnd--;\n fracPart = fracPart.slice(0, fracEnd);\n const body = fracPart ? `${intPart}.${fracPart}` : intPart;\n return negative ? `-${body}` : body;\n }\n\n /** Fixed decimal places, e.g. `toFixed(2)` → `\"123.40\"`. */\n toFixed(dp: number): string {\n const rounded = this.round(dp);\n const negative = rounded.scaled < 0n;\n const digits = (negative ? -rounded.scaled : rounded.scaled)\n .toString()\n .padStart(Number(SCALE) + 1, '0');\n const intPart = digits.slice(0, digits.length - Number(SCALE));\n let fracPart = digits.slice(digits.length - Number(SCALE));\n if (dp === 0) return negative ? `-${intPart}` : intPart;\n fracPart = fracPart.slice(0, dp).padEnd(dp, '0');\n const body = `${intPart}.${fracPart}`;\n return negative ? `-${body}` : body;\n }\n\n /**\n * Lossy conversion for display/interop. Values beyond ±2^53 still convert\n * (to the nearest representable double) because Binance quantities/prices fit\n * comfortably inside the safe range; use `toString()` when exactness matters.\n */\n toNumber(): number {\n return Number(this.toString());\n }\n\n toJSON(): string {\n return this.toString();\n }\n}\n\n/** Convenience: `dec('1.5')` etc. */\nexport const dec = Decimal.from;\n\n/** Sum a list of decimal inputs. Returns Decimal.ZERO for an empty list. */\nexport function sum(values: readonly DecimalInput[]): Decimal {\n return values.reduce<Decimal>((acc, v) => acc.add(v), Decimal.ZERO);\n}\n\n/**\n * Volume-weighted average price: `sum(price_i * qty_i) / sum(qty_i)`.\n * Returns null when total quantity is zero.\n */\nexport function vwap(\n fills: readonly { price: DecimalInput; quantity: DecimalInput }[],\n): Decimal | null {\n let totalNotional = Decimal.ZERO;\n let totalQty = Decimal.ZERO;\n for (const fill of fills) {\n totalNotional = totalNotional.add(Decimal.from(fill.price).mul(fill.quantity));\n totalQty = totalQty.add(fill.quantity);\n }\n if (totalQty.isZero()) return null;\n return totalNotional.div(totalQty);\n}\n","export class BinanceError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BinanceError';\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport class BinanceAuthError extends BinanceError {\n readonly missing: 'apiKey' | 'apiSecret' | 'privateKey';\n\n constructor(missing: 'apiKey' | 'apiSecret' | 'privateKey') {\n super(`API ${missing} required for authenticated requests`);\n this.name = 'BinanceAuthError';\n this.missing = missing;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport interface BinanceApiErrorContext {\n endpoint?: string;\n method?: string;\n headers?: Record<string, string>;\n}\n\nexport class BinanceApiError extends BinanceError {\n readonly code: number;\n readonly status: number;\n readonly endpoint?: string;\n readonly method?: string;\n readonly headers?: Record<string, string>;\n\n constructor(message: string, code: number, status: number, context?: BinanceApiErrorContext) {\n super(message);\n this.name = 'BinanceApiError';\n this.code = code;\n this.status = status;\n this.endpoint = context?.endpoint;\n this.method = context?.method;\n this.headers = context?.headers;\n }\n\n /** -1003 (way too many requests) or HTTP 429/418. */\n isRateLimitError(): boolean {\n return this.code === -1003 || this.status === 429 || this.status === 418;\n }\n\n /** -1021: request timestamp outside recvWindow, usually caused by local clock drift. */\n isTimestampError(): boolean {\n return this.code === -1021;\n }\n\n /** -2010: account has insufficient balance for the requested action. */\n isInsufficientBalance(): boolean {\n return this.code === -2010;\n }\n}\n","import { BinanceApiError, type BinanceApiErrorContext } from './BinanceApiError.js';\n\nexport class RateLimitError extends BinanceApiError {\n readonly retryAfterMs?: number;\n\n constructor(\n message: string,\n code: number,\n status: number,\n retryAfterMs?: number,\n context?: BinanceApiErrorContext,\n ) {\n super(message, code, status, context);\n this.name = 'RateLimitError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport class NetworkError extends BinanceError {\n readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n this.cause = cause;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\nexport type PolicyRule =\n | 'readOnly'\n | 'symbolNotAllowed'\n | 'maxNotionalPerOrder'\n | 'notionalUndeterminable'\n | 'withdrawalsBlocked'\n | 'transfersBlocked'\n | 'blockedPath'\n | 'circuitBreaker'\n | 'maxLeverage'\n | 'maxOpenNotional'\n | 'maxDailyLoss';\n\n/**\n * Thrown when a request is refused by the client's own {@link TradingPolicy} — before it\n * ever reaches Binance. Distinct from BinanceApiError, which reports an exchange rejection.\n */\nexport class PolicyViolationError extends BinanceError {\n readonly rule: PolicyRule;\n readonly method: string;\n readonly endpoint: string;\n readonly details?: Record<string, unknown>;\n\n constructor(\n rule: PolicyRule,\n message: string,\n method: string,\n endpoint: string,\n details?: Record<string, unknown>,\n ) {\n super(`Blocked by trading policy (${rule}): ${message} [${method} ${endpoint}]`);\n this.name = 'PolicyViolationError';\n this.rule = rule;\n this.method = method;\n this.endpoint = endpoint;\n this.details = details;\n }\n}\n","import { BinanceError } from './BinanceError.js';\n\n/**\n * Thrown instead of sending a mutating request when the client is in dry-run mode.\n *\n * Dry run deliberately throws rather than returning a synthetic success payload: a fabricated\n * orderId would lead an agent to believe an order exists and then try to manage or cancel it.\n * Failing loudly — while carrying the exact request that *would* have been sent — is the only\n * safe signal. Tool layers should catch this and surface `describe()` back to the model.\n */\nexport class DryRunError extends BinanceError {\n readonly method: string;\n readonly endpoint: string;\n readonly params: Record<string, unknown>;\n\n constructor(method: string, endpoint: string, params: Record<string, unknown> = {}) {\n super(`DRY RUN — request not sent: ${method} ${endpoint} ${JSON.stringify(params)}`);\n this.name = 'DryRunError';\n this.method = method;\n this.endpoint = endpoint;\n this.params = params;\n }\n\n /** Human/LLM-readable description of the suppressed request. */\n describe(): string {\n return `Would have sent ${this.method} ${this.endpoint} with ${JSON.stringify(this.params)}`;\n }\n}\n","import { DryRunError } from '../errors/DryRunError.js';\nimport { PolicyViolationError, type PolicyRule } from '../errors/PolicyViolationError.js';\nimport type { HttpMethod } from './HttpClient.js';\n\nexport interface TradingPolicyOptions {\n /**\n * Intercept every mutating request (POST/PUT/DELETE) and throw {@link DryRunError} instead of\n * sending it. Read-only GETs still hit the network, so an agent can research freely but\n * cannot act.\n */\n dryRun?: boolean;\n /** Reject every mutating request outright. Unlike dryRun this is not a rehearsal mode. */\n readOnly?: boolean;\n /**\n * Allowlist of tradeable symbols. Any order-bearing request naming a symbol outside this\n * list is rejected. Case-insensitive.\n */\n allowedSymbols?: string[];\n /**\n * Hard cap on a single order's notional value, in quote currency. When set, an order whose\n * notional cannot be determined from its parameters (e.g. a MARKET order with no price) is\n * also rejected — an unverifiable order is not a safe order.\n */\n maxNotionalPerOrder?: number;\n /** Permit withdrawal requests. Defaults to false: opting into a policy at all denies withdrawals. */\n allowWithdrawals?: boolean;\n /** Permit account-to-account transfers. Defaults to true; set false to pin funds in place. */\n allowTransfers?: boolean;\n /** Extra path fragments to refuse, matched case-insensitively as substrings. */\n blockedPaths?: string[];\n}\n\nconst WITHDRAW_FRAGMENTS = ['/capital/withdraw/apply'];\nconst TRANSFER_FRAGMENTS = [\n '/asset/transfer',\n '/margin/transfer',\n '/margin/isolated/transfer',\n '/universaltransfer',\n '/futures/transfer',\n];\nconst MUTATING_METHODS = new Set<HttpMethod>(['POST', 'PUT', 'DELETE']);\n\nfunction toNumber(value: unknown): number | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n const num = Number(value);\n return Number.isFinite(num) ? num : undefined;\n}\n\nfunction includesFragment(path: string, fragments: string[]): boolean {\n const lower = path.toLowerCase();\n return fragments.some((fragment) => lower.includes(fragment.toLowerCase()));\n}\n\n/**\n * Client-side guardrails evaluated before a request leaves the process.\n *\n * This exists for autonomous/LLM-driven callers: a misread prompt should not be able to spend\n * the account. It is a defence-in-depth layer, not a substitute for exchange-side API-key\n * restrictions (IP allowlists, disabled withdrawals) — anything that bypasses this HttpClient\n * bypasses the policy too.\n */\nexport class TradingPolicy {\n private readonly allowedSymbols?: Set<string>;\n\n constructor(private readonly options: TradingPolicyOptions = {}) {\n if (options.allowedSymbols?.length) {\n this.allowedSymbols = new Set(options.allowedSymbols.map((s) => s.toUpperCase()));\n }\n }\n\n /** Throws {@link PolicyViolationError} or {@link DryRunError} if the request is not permitted. */\n check(method: HttpMethod, path: string, params: Record<string, unknown> = {}): void {\n if (!MUTATING_METHODS.has(method)) return;\n\n const deny = (rule: PolicyRule, message: string, details?: Record<string, unknown>): never => {\n throw new PolicyViolationError(rule, message, method, path, details);\n };\n\n if (this.options.blockedPaths?.length && includesFragment(path, this.options.blockedPaths)) {\n deny('blockedPath', 'endpoint is on the blocked-path list');\n }\n\n if (this.options.readOnly) {\n deny('readOnly', 'client is in read-only mode; mutating requests are refused');\n }\n\n if (includesFragment(path, WITHDRAW_FRAGMENTS) && this.options.allowWithdrawals !== true) {\n deny('withdrawalsBlocked', 'withdrawals are disabled; set safety.allowWithdrawals to permit them');\n }\n\n if (includesFragment(path, TRANSFER_FRAGMENTS) && this.options.allowTransfers === false) {\n deny('transfersBlocked', 'account transfers are disabled by policy');\n }\n\n this.checkSymbol(path, params, deny);\n this.checkNotional(path, params, deny);\n\n if (this.options.dryRun) {\n throw new DryRunError(method, path, params);\n }\n }\n\n private checkSymbol(\n path: string,\n params: Record<string, unknown>,\n deny: (rule: PolicyRule, message: string, details?: Record<string, unknown>) => never,\n ): void {\n if (!this.allowedSymbols) return;\n const symbol = params.symbol;\n if (typeof symbol !== 'string' || symbol === '') return;\n if (!this.allowedSymbols.has(symbol.toUpperCase())) {\n deny('symbolNotAllowed', `symbol ${symbol} is not in the allowed list`, {\n symbol,\n allowed: [...this.allowedSymbols],\n });\n }\n }\n\n private checkNotional(\n path: string,\n params: Record<string, unknown>,\n deny: (rule: PolicyRule, message: string, details?: Record<string, unknown>) => never,\n ): void {\n const max = this.options.maxNotionalPerOrder;\n if (max === undefined) return;\n if (!path.toLowerCase().includes('order')) return;\n\n const quantity = toNumber(params.quantity);\n const quoteOrderQty = toNumber(params.quoteOrderQty);\n // Only order-placing requests carry a size; cancels and queries are unaffected.\n if (quantity === undefined && quoteOrderQty === undefined) return;\n\n const price = toNumber(params.price);\n const notional = quoteOrderQty ?? (price !== undefined && quantity !== undefined ? price * quantity : undefined);\n\n if (notional === undefined) {\n deny(\n 'notionalUndeterminable',\n `cannot verify notional against the ${max} cap (no price on this order); supply a price or raise/remove maxNotionalPerOrder`,\n { quantity, maxNotionalPerOrder: max },\n );\n }\n\n if (notional > max) {\n deny('maxNotionalPerOrder', `order notional ${notional} exceeds the ${max} cap`, {\n notional,\n maxNotionalPerOrder: max,\n });\n }\n }\n}\n","import { Decimal } from '../core/decimal.js';\nimport type { EventBus } from '../core/events.js';\nimport { PolicyViolationError, type PolicyRule } from '../errors/index.js';\nimport { TradingPolicy, type TradingPolicyOptions } from '../client/TradingPolicy.js';\nimport type { HttpMethod } from '../client/HttpClient.js';\n\nexport interface RiskGatewayOptions extends TradingPolicyOptions {\n /**\n * Cap on leverage-change requests. `setLeverage` above this is rejected\n * before it reaches the exchange. (Binance's own ceiling is 125 on most\n * USD-M pairs.)\n */\n maxLeverage?: number;\n /**\n * Cap on the aggregate *tracked* open-order notional. Orders registered via\n * `registerOpenOrder` (done automatically for ExecutionManager placements\n * when the gateway is attached) count against this budget and are released\n * on terminal states.\n */\n maxOpenNotional?: number;\n /**\n * Quote-currency daily realized-loss limit. When `recordRealizedPnl` pushes\n * the day's PnL at or below `-maxDailyLoss`, the circuit breaker trips and\n * every mutating request is refused until the daily window resets or the\n * breaker is manually reset.\n */\n maxDailyLoss?: number;\n /**\n * Consecutive exchange rejections tolerated before the circuit breaker\n * trips. `recordFailure`/`recordSuccess` are fed by the execution layer.\n * Default: disabled (Infinity).\n */\n maxConsecutiveFailures?: number;\n}\n\nexport interface CircuitBreakerState {\n tripped: boolean;\n reason?: 'maxDailyLoss' | 'maxConsecutiveFailures';\n trippedAt?: number;\n detail?: string;\n}\n\nexport interface RiskStatus {\n circuitBreaker: CircuitBreakerState;\n /** Aggregate tracked open-order notional (exact decimal string). */\n openNotional: string;\n /** Day's realized PnL accumulator (exact decimal string; negative = loss). */\n dailyPnl: string;\n consecutiveFailures: number;\n /** UTC day boundary the daily counters belong to (YYYY-MM-DD). */\n day: string;\n}\n\nconst MUTATING = new Set<HttpMethod>(['POST', 'PUT', 'DELETE']);\nconst ORDER_PATH = /order/i;\n\nfunction utcDay(now = new Date()): string {\n return now.toISOString().slice(0, 10);\n}\n\nfunction toDecimal(value: unknown): Decimal | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n try {\n return Decimal.from(value as string | number);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Layered pre-trade risk gateway — a strict superset of {@link TradingPolicy}.\n *\n * TradingPolicy answers \"is this request *permitted*?\"; RiskGateway additionally\n * answers \"is the *account* in a state where trading should continue?\":\n *\n * - hard caps: leverage ceiling, aggregate open-order notional budget;\n * - a daily realized-loss kill switch;\n * - a circuit breaker that trips after a run of consecutive exchange\n * rejections (a classic symptom of a runaway agent or a desynced strategy);\n * - daily counters that roll over at the UTC day boundary.\n *\n * The gateway is a drop-in `policy` for HttpClient/BinanceClient, and the\n * execution layer feeds it state: `registerOpenOrder` / `releaseOpenOrder`\n * maintain the notional budget, `recordRealizedPnl` drives the loss limit,\n * `recordFailure` / `recordSuccess` drive the breaker.\n */\nexport class RiskGateway extends TradingPolicy {\n private readonly gatewayOptions: RiskGatewayOptions;\n private openNotional = Decimal.ZERO;\n private dailyPnl = Decimal.ZERO;\n private consecutiveFailures = 0;\n private day = utcDay();\n private breaker: CircuitBreakerState = { tripped: false };\n private readonly events?: EventBus;\n\n constructor(options: RiskGatewayOptions = {}, events?: EventBus) {\n super(options);\n this.gatewayOptions = options;\n this.events = events;\n }\n\n // ---------------------------------------------------------------------------\n // Pre-trade gate (drop-in for HttpClient's policy hook)\n // ---------------------------------------------------------------------------\n\n /** Throws when the request is not permitted or the breaker is tripped. */\n override check(method: HttpMethod, path: string, params: Record<string, unknown> = {}): void {\n if (!MUTATING.has(method)) return;\n\n this.rollDayIfNeeded();\n this.assertBreakerNotTripped(method, path);\n\n // Base guardrails (dryRun/readOnly/symbols/notional/withdrawals/blockedPaths).\n super.check(method, path, params);\n\n this.checkLeverageCap(method, path, params);\n this.checkOpenNotionalBudget(method, path, params);\n }\n\n private assertBreakerNotTripped(method: HttpMethod, path: string): void {\n if (!this.breaker.tripped) return;\n throw new PolicyViolationError(\n 'circuitBreaker',\n `circuit breaker tripped (${this.breaker.reason}: ${this.breaker.detail ?? ''}); ` +\n 'mutating requests are refused until riskStatus.resetBreaker() or the next UTC day',\n method,\n path,\n { reason: this.breaker.reason, trippedAt: this.breaker.trippedAt },\n );\n }\n\n private checkLeverageCap(\n method: HttpMethod,\n path: string,\n params: Record<string, unknown>,\n ): void {\n const max = this.gatewayOptions.maxLeverage;\n if (max === undefined) return;\n if (!path.toLowerCase().includes('leverage')) return;\n const leverage = toDecimal(params.leverage);\n if (leverage === undefined) return;\n if (leverage.gt(max)) {\n this.deny('maxLeverage', method, path, `leverage ${leverage} exceeds cap ${max}`, {\n leverage: leverage.toString(),\n maxLeverage: max,\n });\n }\n }\n\n private checkOpenNotionalBudget(\n method: HttpMethod,\n path: string,\n params: Record<string, unknown>,\n ): void {\n const max = toDecimal(this.gatewayOptions.maxOpenNotional);\n if (max === undefined) return;\n // Cancels and queries are not new exposure.\n if (method === 'DELETE' || path.toLowerCase().includes('cancel')) return;\n if (!ORDER_PATH.test(path)) return;\n\n const quantity = toDecimal(params.quantity);\n const quoteOrderQty = toDecimal(params.quoteOrderQty);\n if (quantity === undefined && quoteOrderQty === undefined) return;\n\n const price = toDecimal(params.price);\n const notional =\n quoteOrderQty ??\n (price !== undefined && quantity !== undefined ? price.mul(quantity) : undefined);\n if (notional === undefined) return; // TradingPolicy.maxNotionalPerOrder handles \"undeterminable\"\n\n const projected = this.openNotional.add(notional);\n if (projected.gt(max)) {\n this.deny(\n 'maxOpenNotional',\n method,\n path,\n `projected open notional ${projected} exceeds cap ${max}`,\n { currentOpenNotional: this.openNotional.toString(), orderNotional: notional.toString() },\n );\n }\n }\n\n private deny(\n rule: PolicyRule,\n method: HttpMethod,\n path: string,\n message: string,\n details?: Record<string, unknown>,\n ): never {\n this.emitEvent('risk.denied', { rule, method, path, message, ...details });\n throw new PolicyViolationError(rule, message, method, path, details);\n }\n\n // ---------------------------------------------------------------------------\n // State feeds from the execution layer\n // ---------------------------------------------------------------------------\n\n /** Track an order's notional against the open-order budget. */\n registerOpenOrder(notional: string | number): void {\n const value = toDecimal(notional);\n if (!value) return;\n this.openNotional = this.openNotional.add(value);\n this.emitEvent('risk.exposure.updated', {\n openNotional: this.openNotional.toString(),\n delta: value.toString(),\n });\n }\n\n /** Release an order's notional (fill/cancel/expire). */\n releaseOpenOrder(notional: string | number): void {\n const value = toDecimal(notional);\n if (!value) return;\n this.openNotional = this.openNotional.sub(value);\n this.emitEvent('risk.exposure.updated', {\n openNotional: this.openNotional.toString(),\n delta: value.neg().toString(),\n });\n }\n\n /**\n * Accumulate realized PnL. Trips the breaker when the day's loss reaches\n * `-maxDailyLoss`.\n */\n recordRealizedPnl(delta: string | number): void {\n this.rollDayIfNeeded();\n const value = toDecimal(delta);\n if (!value) return;\n this.dailyPnl = this.dailyPnl.add(value);\n this.emitEvent('risk.pnl.recorded', {\n delta: value.toString(),\n dailyPnl: this.dailyPnl.toString(),\n });\n const maxLoss = toDecimal(this.gatewayOptions.maxDailyLoss);\n if (maxLoss !== undefined && this.dailyPnl.neg().gte(maxLoss)) {\n this.trip('maxDailyLoss', `daily realized loss ${this.dailyPnl} reached limit ${maxLoss.neg()}`);\n }\n }\n\n /** Report an exchange rejection; trips the breaker past the failure cap. */\n recordFailure(detail = 'exchange rejection'): void {\n this.consecutiveFailures += 1;\n const cap = this.gatewayOptions.maxConsecutiveFailures ?? Number.POSITIVE_INFINITY;\n this.emitEvent('risk.failure.recorded', { consecutiveFailures: this.consecutiveFailures, detail });\n if (this.consecutiveFailures >= cap) {\n this.trip('maxConsecutiveFailures', `${this.consecutiveFailures} consecutive failures: ${detail}`);\n }\n }\n\n /** Report a successful exchange interaction (resets the failure streak). */\n recordSuccess(): void {\n if (this.consecutiveFailures !== 0) {\n this.consecutiveFailures = 0;\n this.emitEvent('risk.failures.reset', {});\n }\n }\n\n trip(reason: CircuitBreakerState['reason'], detail: string): void {\n if (this.breaker.tripped) return;\n this.breaker = { tripped: true, reason, detail, trippedAt: Date.now() };\n this.emitEvent('risk.circuit.tripped', { reason, detail });\n }\n\n /** Manually clear the breaker (e.g. after human review). */\n resetBreaker(): void {\n if (!this.breaker.tripped) return;\n this.breaker = { tripped: false };\n this.consecutiveFailures = 0;\n this.emitEvent('risk.circuit.reset', {});\n }\n\n /** Current risk state snapshot (all money values are exact decimal strings). */\n riskStatus(): RiskStatus {\n this.rollDayIfNeeded();\n return {\n circuitBreaker: { ...this.breaker },\n openNotional: this.openNotional.toString(),\n dailyPnl: this.dailyPnl.toString(),\n consecutiveFailures: this.consecutiveFailures,\n day: this.day,\n };\n }\n\n /** Reset the daily PnL/loss window (automatic at UTC midnight). */\n resetDaily(): void {\n this.day = utcDay();\n this.dailyPnl = Decimal.ZERO;\n if (this.breaker.reason === 'maxDailyLoss') this.resetBreaker();\n this.emitEvent('risk.day.rolled', { day: this.day });\n }\n\n private rollDayIfNeeded(): void {\n const today = utcDay();\n if (today !== this.day) this.resetDaily();\n }\n\n private emitEvent(name: string, payload: Record<string, unknown>): void {\n if (!this.events) return;\n this.events.scoped('risk').emit(name, payload);\n }\n}\n","import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';\nimport Bottleneck from 'bottleneck';\nimport { BinanceApiError, BinanceAuthError, NetworkError, RateLimitError } from '../errors/index.js';\nimport type { EventBus } from '../core/events.js';\nimport { contractFor, type HttpContractMeta } from '../contracts/index.js';\nimport { RateLimitTracker, type RateLimitUsage } from './RateLimitTracker.js';\nimport { Signer, type SignatureAlgorithm } from './Signer.js';\nimport type { TradingPolicy } from './TradingPolicy.js';\n\nexport type AuthMode = 'public' | 'apiKey' | 'signed';\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\nexport type { SignatureAlgorithm };\n\n/**\n * Retry behaviour for failed requests.\n *\n * - `strict` (default): retries only when the outcome is provably safe.\n * Unprocessed rejections (429/418), idempotent methods (GET/DELETE) and\n * explicitly whitelisted paths are retried; anything else — notably POST/PUT\n * order placement, where a timeout means the order *may already be live* —\n * fails fast so the caller can reconcile instead of double-submitting.\n * - `legacy`: retries every 5xx/network error regardless of side effects\n * (the pre-2.1 behaviour; kept as an escape hatch, not recommended).\n */\nexport type RetryPolicy = 'strict' | 'legacy';\n\nexport interface HttpClientOptions {\n baseURL: string;\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n recvWindow?: number;\n timeoutMs?: number;\n maxRetries?: number;\n minTimeMs?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitTokensPerSecond?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitMaxTokens?: number;\n /** Assumed per-minute IP weight ceiling used to preempt -1003 bans. Binance's default is 6000 for most REST hosts. */\n rateLimitWeightPerMinute?: number;\n /** Fraction of rateLimitWeightPerMinute at which requests are delayed until the next minute window. Set >=1 to disable. */\n rateLimitSafetyMargin?: number;\n retryBaseDelayMs?: number;\n retryMaxDelayMs?: number;\n retryFactor?: number;\n /** Retry strategy, see {@link RetryPolicy}. Default `strict`. */\n retryPolicy?: RetryPolicy;\n /**\n * Extra POST/PUT paths that are known-safe to retry (e.g. side-effect-free\n * endpoints specific to your usage). Matched by path prefix.\n */\n idempotentPaths?: string[];\n /** Custom keep-alive/https agent, e.g. for corporate proxies or connection pooling. */\n httpsAgent?: AxiosRequestConfig['httpsAgent'];\n /** Axios proxy configuration. */\n proxy?: AxiosRequestConfig['proxy'];\n /** Client-side guardrails evaluated before any mutating request is sent. */\n policy?: TradingPolicy;\n /** Structured request lifecycle events (`http.request.*`). */\n events?: EventBus;\n}\n\ninterface BinanceErrorBody {\n code?: number;\n msg?: string;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 418, 500, 502, 503, 504]);\nconst UNPROCESSED_STATUS = new Set([429, 418]);\n\n/**\n * POST/PUT endpoints where a retry can never duplicate a side effect.\n * (ListenKey creation is deliberately excluded: it mints a new key.)\n */\nconst IDEMPOTENT_POST_PREFIXES = ['/fapi/v1/order/test', '/api/v3/order/test', '/sapi/v1/capital/deposit/hisrec'];\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction normalizeHeaders(headers: unknown): Record<string, string> {\n const result: Record<string, string> = {};\n if (!headers || typeof headers !== 'object') return result;\n for (const [key, value] of Object.entries(headers as Record<string, unknown>)) {\n if (value !== undefined && value !== null) result[key.toLowerCase()] = String(value);\n }\n return result;\n}\n\nexport class HttpClient {\n private readonly axios: AxiosInstance;\n private readonly baseURL: string;\n private readonly limiter: Bottleneck;\n private readonly signer: Signer;\n private readonly rateLimitTracker: RateLimitTracker;\n private readonly policy?: TradingPolicy;\n private readonly apiKey?: string;\n private readonly recvWindow: number;\n private readonly timeoutMs: number;\n private readonly idempotentPaths: string[];\n private readonly events?: EventBus;\n private maxRetries: number;\n private minTimeMs: number;\n private retryBaseDelayMs: number;\n private retryMaxDelayMs: number;\n private retryFactor: number;\n /** Mutable copy of the retry policy, adjustable via configureRetry(). */\n private retryPolicy: RetryPolicy;\n private pendingRequests = 0;\n private timeOffsetMs = 0;\n private requestCounter = 0;\n\n constructor(options: HttpClientOptions) {\n this.baseURL = options.baseURL;\n this.apiKey = options.apiKey;\n this.recvWindow = options.recvWindow ?? 5000;\n this.timeoutMs = options.timeoutMs ?? 15_000;\n this.maxRetries = options.maxRetries ?? 3;\n this.minTimeMs = options.minTimeMs ?? 50;\n this.retryBaseDelayMs = options.retryBaseDelayMs ?? 1000;\n this.retryMaxDelayMs = options.retryMaxDelayMs ?? 30_000;\n this.retryFactor = options.retryFactor ?? 2;\n this.retryPolicy = options.retryPolicy ?? 'strict';\n this.idempotentPaths = [...IDEMPOTENT_POST_PREFIXES, ...(options.idempotentPaths ?? [])];\n this.events = options.events;\n this.signer = new Signer({\n algorithm: options.signatureAlgorithm,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n });\n this.rateLimitTracker = new RateLimitTracker({\n weightLimitPerMinute: options.rateLimitWeightPerMinute,\n safetyMargin: options.rateLimitSafetyMargin,\n });\n this.policy = options.policy;\n this.axios = axios.create({\n baseURL: options.baseURL,\n timeout: this.timeoutMs,\n httpsAgent: options.httpsAgent,\n proxy: options.proxy,\n });\n this.limiter = new Bottleneck({ minTime: this.minTimeMs });\n }\n\n async get<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('GET', path, params, mode);\n }\n\n async post<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('POST', path, params, mode);\n }\n\n async put<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('PUT', path, params, mode);\n }\n\n async delete<T>(path: string, params?: Record<string, unknown>, mode: AuthMode = 'public'): Promise<T> {\n return this.request<T>('DELETE', path, params, mode);\n }\n\n getRateLimiterStatus(): { minTimeMs: number; queueLength: number } {\n return { minTimeMs: this.minTimeMs, queueLength: this.pendingRequests };\n }\n\n /** Snapshot of the most recently observed `X-MBX-USED-WEIGHT-*` / `X-MBX-ORDER-COUNT-*` response headers. */\n getRateLimitUsage(): Readonly<RateLimitUsage> {\n return this.rateLimitTracker.getUsage();\n }\n\n configureRateLimiter(options: { minTimeMs?: number }): void {\n if (options.minTimeMs !== undefined) {\n this.minTimeMs = options.minTimeMs;\n this.limiter.updateSettings({ minTime: this.minTimeMs });\n }\n }\n\n getRetryConfig(): {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n factor: number;\n policy: RetryPolicy;\n } {\n return {\n maxRetries: this.maxRetries,\n baseDelayMs: this.retryBaseDelayMs,\n maxDelayMs: this.retryMaxDelayMs,\n factor: this.retryFactor,\n policy: this.retryPolicy,\n };\n }\n\n configureRetry(options: {\n maxRetries?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n policy?: RetryPolicy;\n }): void {\n if (options.maxRetries !== undefined) this.maxRetries = options.maxRetries;\n if (options.baseDelayMs !== undefined) this.retryBaseDelayMs = options.baseDelayMs;\n if (options.maxDelayMs !== undefined) this.retryMaxDelayMs = options.maxDelayMs;\n if (options.factor !== undefined) this.retryFactor = options.factor;\n if (options.policy !== undefined) this.retryPolicy = options.policy;\n }\n\n /**\n * Fetches server time from `timePath` (e.g. '/time', '/fapi/v1/time', '/dapi/v1/time') and\n * stores the offset from local time, applied to every signed request's `timestamp` param.\n * Mitigates `-1021` (timestamp outside recvWindow) errors caused by local clock drift.\n */\n async syncTime(timePath = '/time'): Promise<number> {\n const res = await this.axios.request<{ serverTime: number }>({ method: 'GET', url: timePath });\n this.timeOffsetMs = res.data.serverTime - Date.now();\n this.emitEvent('http.clock.synced', { timePath, offsetMs: this.timeOffsetMs });\n return this.timeOffsetMs;\n }\n\n getTimeOffsetMs(): number {\n return this.timeOffsetMs;\n }\n\n // ---------------------------------------------------------------------------\n // Request pipeline\n // ---------------------------------------------------------------------------\n\n private async request<T>(\n method: HttpMethod,\n path: string,\n params: Record<string, unknown> | undefined,\n mode: AuthMode,\n ): Promise<T> {\n // Evaluated before signing and before the limiter, so a refused request costs no\n // rate-limit budget and never has a signature generated for it.\n this.policy?.check(method, path, params ?? {});\n const requestId = ++this.requestCounter;\n const startedAt = Date.now();\n // Contract metadata (product/operation/security/declared weight) resolved\n // once per request and attached to every http.request.* event.\n const contract = contractFor(this.baseURL, method, path);\n this.emitEvent('http.request.start', {\n requestId,\n method,\n path,\n mode,\n product: contract?.product,\n operation: contract?.operation,\n });\n return this.limiter.schedule(async () => {\n const throttleMs = this.rateLimitTracker.getThrottleDelayMs();\n if (throttleMs > 0) await sleep(throttleMs);\n return this.requestWithRetry<T>(method, path, params, mode, 0, requestId, startedAt, contract);\n });\n }\n\n private buildHeaders(mode: AuthMode): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'binance-sdk',\n };\n if (mode !== 'public') headers['X-MBX-APIKEY'] = this.requireApiKey();\n return headers;\n }\n\n private buildUrl(\n path: string,\n params: Record<string, unknown> | undefined,\n mode: AuthMode,\n ): string {\n if (mode !== 'signed') return this.appendQuery(path, params);\n const requestData = { ...params, timestamp: Date.now() + this.timeOffsetMs, recvWindow: this.recvWindow };\n const queryString = this.buildQueryString(requestData);\n const signature = this.sign(queryString);\n return `${path}?${queryString}&signature=${signature}`;\n }\n\n private appendQuery(path: string, params: Record<string, unknown> | undefined): string {\n const queryString = this.buildQueryString(params);\n return queryString ? `${path}?${queryString}` : path;\n }\n\n private buildQueryString(params: Record<string, unknown> | undefined): string {\n if (!params) return '';\n return Object.entries(params)\n .filter(([, val]) => val !== undefined && val !== null)\n .flatMap(([key, val]) =>\n Array.isArray(val)\n ? val.map((item) => `${key}=${encodeURIComponent(String(item))}`)\n : [`${key}=${encodeURIComponent(String(val))}`],\n )\n .join('&');\n }\n\n private sign(queryString: string): string {\n if (!this.signer.canSign()) {\n throw new BinanceAuthError(this.signer.algorithm === 'HMAC' ? 'apiSecret' : 'privateKey');\n }\n return this.signer.sign(queryString);\n }\n\n private requireApiKey(): string {\n if (!this.apiKey) throw new BinanceAuthError('apiKey');\n return this.apiKey;\n }\n\n /** Transient failures worth retrying at all: 5xx/429/418, or no response. */\n private shouldRetry(err: { response?: { status?: number } }): boolean {\n if (err.response?.status !== undefined) return RETRYABLE_STATUS.has(err.response.status);\n return true;\n }\n\n /**\n * Whether a retry of `method path` is free of duplicate-side-effect risk.\n *\n * GET/DELETE are inherently idempotent. POST/PUT only when the path is\n * explicitly whitelisted (test orders, read-only SAPI queries). A network\n * error or 5xx on a real order placement is *not* retried: the request may\n * have reached the matching engine, and resubmitting could double the order.\n */\n private isRetrySafe(method: HttpMethod, path: string): boolean {\n if (method === 'GET' || method === 'DELETE') return true;\n const lower = path.toLowerCase();\n return this.idempotentPaths.some((prefix) => lower.startsWith(prefix.toLowerCase()));\n }\n\n private canRetry(method: HttpMethod, path: string, err: { response?: { status?: number } }): boolean {\n if (this.retryPolicy === 'legacy') return true;\n const status = err.response?.status;\n if (status !== undefined && UNPROCESSED_STATUS.has(status)) {\n // 429/418: the request was rejected before processing — safe for any method.\n return true;\n }\n return this.isRetrySafe(method, path);\n }\n\n private async requestWithRetry<T>(\n method: HttpMethod,\n path: string,\n params: Record<string, unknown> | undefined,\n mode: AuthMode,\n attempt: number,\n requestId: number,\n startedAt: number,\n contract?: HttpContractMeta,\n ): Promise<T> {\n // Rebuilt per attempt: a retried SIGNED request must carry a fresh\n // timestamp+signature, otherwise the retry itself fails with -1021 once\n // the original timestamp drifts outside recvWindow.\n const config: AxiosRequestConfig = {\n method,\n url: this.buildUrl(path, params, mode),\n headers: this.buildHeaders(mode),\n };\n\n this.pendingRequests += 1;\n try {\n const res = await this.axios.request<T>(config);\n this.rateLimitTracker.update(normalizeHeaders(res.headers));\n this.emitEvent('http.request.end', {\n requestId,\n method,\n path,\n status: res.status,\n latencyMs: Date.now() - startedAt,\n attempt,\n product: contract?.product,\n operation: contract?.operation,\n security: contract?.security,\n declaredWeight: contract?.declaredWeight,\n });\n return res.data;\n } catch (err) {\n if (!axios.isAxiosError(err)) {\n this.emitEvent('http.request.error', {\n requestId,\n method,\n path,\n message: 'unexpected non-axios error',\n product: contract?.product,\n operation: contract?.operation,\n });\n throw new NetworkError('Unexpected error calling Binance API', err);\n }\n const status = err.response?.status;\n const body = err.response?.data as BinanceErrorBody | undefined;\n const headers = normalizeHeaders(err.response?.headers);\n this.rateLimitTracker.update(headers);\n\n // Retry only when (a) the failure is transient (5xx/429/418 or a network\n // error) AND (b) resubmitting cannot duplicate a side effect.\n if (attempt < this.maxRetries && this.shouldRetry(err) && this.canRetry(method, path, err)) {\n const delay = this.calculateDelay(attempt);\n this.emitEvent('http.request.retry', {\n requestId,\n method,\n path,\n attempt: attempt + 1,\n delayMs: delay,\n status: status ?? null,\n reason: status !== undefined ? `http ${status}` : 'network error',\n product: contract?.product,\n operation: contract?.operation,\n });\n await sleep(delay);\n return this.requestWithRetry<T>(\n method,\n path,\n params,\n mode,\n attempt + 1,\n requestId,\n startedAt,\n contract,\n );\n }\n\n const context = { endpoint: path, method, headers, requestId };\n this.emitEvent('http.request.error', {\n requestId,\n method,\n path,\n status: status ?? null,\n code: body?.code ?? null,\n message: body?.msg ?? err.message,\n attempts: attempt + 1,\n product: contract?.product,\n operation: contract?.operation,\n security: contract?.security,\n retryableButUnsafe:\n status !== undefined && RETRYABLE_STATUS.has(status) && !this.canRetry(method, path, err)\n ? true\n : status === undefined && !this.canRetry(method, path, err),\n });\n if (status === 429 || status === 418) {\n throw new RateLimitError(\n body?.msg ?? 'Binance rate limit exceeded',\n body?.code ?? -1,\n status,\n this.parseRetryAfterMs(headers),\n context,\n );\n }\n if (status && body) {\n throw new BinanceApiError(body.msg ?? 'Binance API error', body.code ?? -1, status, context);\n }\n throw new NetworkError(err.message, err);\n } finally {\n this.pendingRequests -= 1;\n }\n }\n\n private parseRetryAfterMs(headers: Record<string, string>): number | undefined {\n const raw = headers['retry-after'];\n if (!raw) return undefined;\n const seconds = Number(raw);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n }\n\n private calculateDelay(attempt: number): number {\n const delay = Math.min(this.retryBaseDelayMs * this.retryFactor ** attempt, this.retryMaxDelayMs);\n const jitter = delay * 0.1 * (Math.random() * 2 - 1);\n return Math.max(0, delay + jitter);\n }\n\n private emitEvent(name: string, payload: Record<string, unknown>): void {\n if (!this.events) return;\n this.events.scoped('http').emit(name, payload);\n }\n}\n","import type { EndpointEntry, EndpointAuth, EndpointMethod } from './endpoints.js';\n\n/**\n * [operation, method, path, auth, implementedBy] rows for the Spot product.\n * Paths are canonical (host + version prefix included).\n */\ntype Row = [operation: string, method: EndpointMethod, path: string, auth: EndpointAuth, implementedBy: string];\n\nconst rows: Row[] = [\n // ---- Market data (MarketDataBase / SpotMarket, base https://api.binance.com/api/v3) ----\n ['market.ping', 'GET', '/api/v3/ping', 'public', 'spot.market.ping'],\n ['market.serverTime', 'GET', '/api/v3/time', 'public', 'spot.market.serverTime'],\n ['market.exchangeInfo', 'GET', '/api/v3/exchangeInfo', 'public', 'spot.market.exchangeInfo'],\n ['market.depth', 'GET', '/api/v3/depth', 'public', 'spot.market.depth'],\n ['market.trades', 'GET', '/api/v3/trades', 'public', 'spot.market.trades'],\n ['market.historicalTrades', 'GET', '/api/v3/historicalTrades', 'apiKey', 'spot.market.historicalTrades'],\n ['market.aggTrades', 'GET', '/api/v3/aggTrades', 'public', 'spot.market.aggTrades'],\n ['market.klines', 'GET', '/api/v3/klines', 'public', 'spot.market.klines'],\n ['market.uiKlines', 'GET', '/api/v3/uiKlines', 'public', 'spot.market.uiKlines'],\n ['market.avgPrice', 'GET', '/api/v3/avgPrice', 'public', 'spot.market.avgPrice'],\n ['market.ticker24hr', 'GET', '/api/v3/ticker/24hr', 'public', 'spot.market.ticker24hr'],\n ['market.tickerPrice', 'GET', '/api/v3/ticker/price', 'public', 'spot.market.tickerPrice'],\n ['market.bookTicker', 'GET', '/api/v3/ticker/bookTicker', 'public', 'spot.market.bookTicker'],\n ['market.rollingWindowTicker', 'GET', '/api/v3/ticker', 'public', 'spot.market.rollingWindowTicker'],\n ['market.tradingDayTicker', 'GET', '/api/v3/ticker/tradingDay', 'public', 'spot.market.tradingDayTicker'],\n\n // ---- Trading (SpotTrading) ----\n ['trading.createOrder', 'POST', '/api/v3/order', 'signed', 'spot.trading.createOrder'],\n ['trading.createTestOrder', 'POST', '/api/v3/order/test', 'signed', 'spot.trading.testOrder'],\n ['trading.getOrder', 'GET', '/api/v3/order', 'signed', 'spot.trading.getOrder'],\n ['trading.cancelOrder', 'DELETE', '/api/v3/order', 'signed', 'spot.trading.cancelOrder'],\n ['trading.cancelOpenOrders', 'DELETE', '/api/v3/openOrders', 'signed', 'spot.trading.cancelOpenOrders'],\n ['trading.getOpenOrders', 'GET', '/api/v3/openOrders', 'signed', 'spot.trading.getOpenOrders'],\n ['trading.getAllOrders', 'GET', '/api/v3/allOrders', 'signed', 'spot.trading.getAllOrders'],\n ['trading.cancelReplace', 'POST', '/api/v3/order/cancelReplace', 'signed', 'spot.trading.cancelReplaceOrder'],\n ['trading.createOCO', 'POST', '/api/v3/orderList/oco', 'signed', 'spot.trading.createOCOOrder'],\n ['trading.cancelOCO', 'DELETE', '/api/v3/orderList', 'signed', 'spot.trading.cancelOCOOrder'],\n ['trading.getOCO', 'GET', '/api/v3/orderList', 'signed', 'spot.trading.getOCOOrder'],\n ['trading.getOpenOCOs', 'GET', '/api/v3/openOrderLists', 'signed', 'spot.trading.getOpenOCOOrders'],\n ['trading.getAllOCOs', 'GET', '/api/v3/allOrderLists', 'signed', 'spot.trading.getAllOCOOrders'],\n ['trading.cancelOpenOCOs', 'DELETE', '/api/v3/openOrderLists', 'signed', 'spot.trading.cancelOpenOCOOrders'],\n\n // ---- Account (SpotAccount, via SpotTrading.ts exports) ----\n ['account.getAccount', 'GET', '/api/v3/account', 'signed', 'spot.trading.account'],\n ['account.myTrades', 'GET', '/api/v3/myTrades', 'signed', 'spot.trading.myTrades'],\n ['account.myPreventedMatches', 'GET', '/api/v3/myPreventedMatches', 'signed', 'spot.trading.myPreventedMatches'],\n ['account.commission', 'GET', '/api/v3/account/commission', 'signed', 'spot.trading.accountCommission'],\n ['account.orderRateLimit', 'GET', '/api/v3/rateLimit/order', 'signed', 'spot.trading.rateLimitOrder'],\n\n // ---- User data stream (SpotUserDataStream) ----\n ['userStream.create', 'POST', '/api/v3/userDataStream', 'apiKey', 'spot.userStream.createListenKey'],\n ['userStream.keepAlive', 'PUT', '/api/v3/userDataStream', 'apiKey', 'spot.userStream.keepAliveListenKey'],\n ['userStream.close', 'DELETE', '/api/v3/userDataStream', 'apiKey', 'spot.userStream.closeListenKey'],\n];\n\nexport const SPOT_ENDPOINTS: EndpointEntry[] = rows.map(\n ([operation, method, path, authentication, implementedBy]) => ({\n product: 'spot',\n operation,\n method,\n path,\n authentication,\n implementedBy,\n }),\n);\n","import type { EndpointEntry, EndpointAuth, EndpointMethod } from './endpoints.js';\n\n/**\n * [operation, method, path, auth, implementedBy] rows for USDⓈ-M Futures.\n * Market-data rows come from MarketDataBase (base https://fapi.binance.com/fapi/v1),\n * account/trading from FuturesAccount/FuturesTrading (same base), market-analytics\n * from FuturesMarket/FuturesData (fapi/v1, /fapi/v2, /fapi/v3, /futures/data).\n */\ntype Row = [operation: string, method: EndpointMethod, path: string, auth: EndpointAuth, implementedBy: string];\n\nconst rows: Row[] = [\n // ---- Market data (MarketDataBase on /fapi/v1) ----\n ['market.ping', 'GET', '/fapi/v1/ping', 'public', 'futures.market.ping'],\n ['market.serverTime', 'GET', '/fapi/v1/time', 'public', 'futures.market.serverTime'],\n ['market.exchangeInfo', 'GET', '/fapi/v1/exchangeInfo', 'public', 'futures.market.exchangeInfo'],\n ['market.depth', 'GET', '/fapi/v1/depth', 'public', 'futures.market.depth'],\n ['market.trades', 'GET', '/fapi/v1/trades', 'public', 'futures.market.trades'],\n ['market.historicalTrades', 'GET', '/fapi/v1/historicalTrades', 'apiKey', 'futures.market.historicalTrades'],\n ['market.aggTrades', 'GET', '/fapi/v1/aggTrades', 'public', 'futures.market.aggTrades'],\n ['market.klines', 'GET', '/fapi/v1/klines', 'public', 'futures.market.klines'],\n ['market.ticker24hr', 'GET', '/fapi/v1/ticker/24hr', 'public', 'futures.market.ticker24hr'],\n ['market.tickerPrice', 'GET', '/fapi/v1/ticker/price', 'public', 'futures.market.tickerPrice'],\n ['market.bookTicker', 'GET', '/fapi/v1/ticker/bookTicker', 'public', 'futures.market.bookTicker'],\n\n // ---- Market data extensions (FuturesMarket) ----\n ['market.continuousKlines', 'GET', '/fapi/v1/continuousKlines', 'public', 'futures.market.continuousKlines'],\n ['market.indexPriceKlines', 'GET', '/fapi/v1/indexPriceKlines', 'public', 'futures.market.indexPriceKlines'],\n ['market.markPriceKlines', 'GET', '/fapi/v1/markPriceKlines', 'public', 'futures.market.markPriceKlines'],\n ['market.premiumIndexKlines', 'GET', '/fapi/v1/premiumIndexKlines', 'public', 'futures.market.premiumIndexKlines'],\n ['market.rpiDepth', 'GET', '/fapi/v1/rpiDepth', 'public', 'futures.market.rpiDepth'],\n ['market.tradingDayTicker', 'GET', '/fapi/v1/tradingDayTicker', 'public', 'futures.market.tradingDayTicker'],\n ['market.tickerPriceV2', 'GET', '/fapi/v2/ticker/price', 'public', 'futures.market.tickerPriceV2'],\n ['market.bookTickerV2', 'GET', '/fapi/v2/ticker/bookTicker', 'public', 'futures.market.bookTickerV2'],\n\n // ---- Market analytics (FuturesData; fapi/v1 hosts + /futures/data hosts) ----\n ['data.fundingRateHistory', 'GET', '/fapi/v1/fundingRate', 'public', 'futures.data.fundingRateHistory'],\n ['data.premiumIndex', 'GET', '/fapi/v1/premiumIndex', 'public', 'futures.data.premiumIndex'],\n ['data.openInterest', 'GET', '/fapi/v1/openInterest', 'public', 'futures.data.openInterest'],\n ['data.openInterestHist', 'GET', '/futures/data/openInterestHist', 'public', 'futures.data.openInterestHist'],\n ['data.topLongShortAccountRatio', 'GET', '/futures/data/topLongShortAccountRatio', 'public', 'futures.data.topLongShortAccountRatio'],\n ['data.topLongShortPositionRatio', 'GET', '/futures/data/topLongShortPositionRatio', 'public', 'futures.data.topLongShortPositionRatio'],\n ['data.globalLongShortAccountRatio', 'GET', '/futures/data/globalLongShortAccountRatio', 'public', 'futures.data.globalLongShortAccountRatio'],\n ['data.takerLongShortRatio', 'GET', '/futures/data/takerlongshortRatio', 'public', 'futures.data.takerLongShortRatio'],\n ['data.basis', 'GET', '/futures/data/basis', 'public', 'futures.data.basis'],\n ['data.insuranceBalance', 'GET', '/futures/data/insuranceBalance', 'public', 'futures.data.insuranceFundBalance'],\n ['data.deliveryPrice', 'GET', '/futures/data/delivery-price', 'public', 'futures.data.deliveryPrice'],\n ['data.fundingInfo', 'GET', '/fapi/v1/fundingInfo', 'public', 'futures.data.fundingInfo'],\n ['data.assetIndex', 'GET', '/fapi/v1/assetIndex', 'public', 'futures.data.assetIndex'],\n ['data.indexInfo', 'GET', '/fapi/v1/indexInfo', 'public', 'futures.data.compositeIndexInfo'],\n ['data.adlQuantile', 'GET', '/fapi/v1/adlQuantile', 'signed', 'futures.data.adlQuantile'],\n ['data.lvtKlines', 'GET', '/fapi/v1/lvtKlines', 'public', 'futures.data.blvtInfo'],\n ['data.constituents', 'GET', '/fapi/v1/constituents', 'public', 'futures.data.indexPriceConstituents'],\n ['data.symbolConfig', 'GET', '/fapi/v1/symbolConfig', 'signed', 'futures.data.symbolConfig'],\n ['data.forceOrders', 'GET', '/fapi/v1/forceOrders', 'signed', 'futures.data.forceOrders'],\n ['data.pmExchangeInfo', 'GET', '/fapi/v1/pmExchangeInfo', 'public', 'futures.data.pmExchangeInfo'],\n ['data.delistSchedule', 'GET', '/fapi/v1/delistSchedule', 'public', 'futures.data.delistSchedule'],\n ['data.symbolAdlRisk', 'GET', '/fapi/v1/symbolAdlRisk', 'signed', 'futures.data.symbolAdlRisk'],\n\n // ---- Account (FuturesAccount) ----\n ['account.balanceV2', 'GET', '/fapi/v2/balance', 'signed', 'futures.account.balance'],\n ['account.accountV2', 'GET', '/fapi/v2/account', 'signed', 'futures.account.account'],\n ['account.positionRiskV2', 'GET', '/fapi/v2/positionRisk', 'signed', 'futures.account.positionRisk'],\n ['account.balanceV3', 'GET', '/fapi/v3/balance', 'signed', 'futures.account.balanceV3'],\n ['account.accountV3', 'GET', '/fapi/v3/account', 'signed', 'futures.account.accountV3'],\n ['account.positionRiskV3', 'GET', '/fapi/v3/positionRisk', 'signed', 'futures.account.positionRiskV3'],\n ['account.income', 'GET', '/fapi/v1/income', 'signed', 'futures.account.incomeHistory'],\n ['account.userTrades', 'GET', '/fapi/v1/userTrades', 'signed', 'futures.account.userTrades'],\n ['account.leverageBracket', 'GET', '/fapi/v1/leverageBracket', 'signed', 'futures.account.leverageBrackets'],\n ['account.commissionRate', 'GET', '/fapi/v1/commissionRate', 'signed', 'futures.account.getCommissionRate'],\n ['account.multiAssetsMargin', 'GET', '/fapi/v1/multiAssetsMargin', 'signed', 'futures.account.multiAssetsMargin'],\n ['account.setMultiAssetsMargin', 'POST', '/fapi/v1/multiAssetsMargin', 'signed', 'futures.account.setMultiAssetsMargin'],\n ['account.feeBurn', 'GET', '/fapi/v1/feeBurn', 'signed', 'futures.account.feeBurnStatus'],\n ['account.setFeeBurn', 'POST', '/fapi/v1/feeBurn', 'signed', 'futures.account.setFeeBurnStatus'],\n ['account.positionMode', 'GET', '/fapi/v1/positionSide/dual', 'signed', 'futures.account.positionMode'],\n ['account.setPositionMode', 'POST', '/fapi/v1/positionSide/dual', 'signed', 'futures.account.setPositionMode'],\n ['account.apiTradingStatus', 'GET', '/fapi/v1/apiTradingStatus', 'signed', 'futures.account.apiTradingStatus'],\n ['account.positionMarginHistory', 'GET', '/fapi/v1/positionMargin/history', 'signed', 'futures.account.getPositionMarginHistory'],\n ['account.orderRateLimit', 'GET', '/fapi/v1/rateLimit/order', 'signed', 'futures.account.rateLimitOrder'],\n ['account.accountConfig', 'GET', '/fapi/v1/accountConfig', 'signed', 'futures.account.getAccountConfig'],\n ['account.pmAccountInfo', 'GET', '/fapi/v1/pmAccountInfo', 'signed', 'futures.account.getPmAccountInfo'],\n ['account.incomeDownloadId', 'GET', '/fapi/v1/income/asyn', 'signed', 'futures.account.requestIncomeDownload'],\n ['account.incomeDownloadStatus', 'GET', '/fapi/v1/income/asyn/id', 'signed', 'futures.account.getIncomeDownloadStatus'],\n ['account.orderDownloadId', 'GET', '/fapi/v1/order/asyn', 'signed', 'futures.account.requestOrderDownload'],\n ['account.orderDownloadStatus', 'GET', '/fapi/v1/order/asyn/id', 'signed', 'futures.account.getOrderDownloadStatus'],\n ['account.tradeDownloadId', 'GET', '/fapi/v1/trade/asyn', 'signed', 'futures.account.requestTradeDownload'],\n ['account.tradeDownloadStatus', 'GET', '/fapi/v1/trade/asyn/id', 'signed', 'futures.account.getTradeDownloadStatus'],\n\n // ---- Trading (FuturesTrading) ----\n ['trading.setLeverage', 'POST', '/fapi/v1/leverage', 'signed', 'futures.trading.setLeverage'],\n ['trading.createOrder', 'POST', '/fapi/v1/order', 'signed', 'futures.trading.createOrder'],\n ['trading.createTestOrder', 'POST', '/fapi/v1/order/test', 'signed', 'futures.trading.createTestOrder'],\n ['trading.getOrder', 'GET', '/fapi/v1/order', 'signed', 'futures.trading.getOrder'],\n ['trading.cancelOrder', 'DELETE', '/fapi/v1/order', 'signed', 'futures.trading.cancelOrder'],\n ['trading.getOpenOrder', 'GET', '/fapi/v1/openOrder', 'signed', 'futures.trading.getCurrentOrder'],\n ['trading.getOpenOrders', 'GET', '/fapi/v1/openOrders', 'signed', 'futures.trading.getOpenOrders'],\n ['trading.getAllOrders', 'GET', '/fapi/v1/allOrders', 'signed', 'futures.trading.getAllOrders'],\n ['trading.cancelAllOpenOrders', 'DELETE', '/fapi/v1/allOpenOrders', 'signed', 'futures.trading.cancelAllOpenOrders'],\n ['trading.modifyOrder', 'PUT', '/fapi/v1/order', 'signed', 'futures.trading.modifyOrder'],\n ['trading.createBatchOrders', 'POST', '/fapi/v1/batchOrders', 'signed', 'futures.trading.createBatchOrders'],\n ['trading.modifyBatchOrders', 'PUT', '/fapi/v1/batchOrders', 'signed', 'futures.trading.modifyBatchOrders'],\n ['trading.cancelBatchOrders', 'DELETE', '/fapi/v1/batchOrders', 'signed', 'futures.trading.cancelBatchOrders'],\n ['trading.orderModifyHistory', 'GET', '/fapi/v1/orderAmendment', 'signed', 'futures.trading.getOrderModifyHistory'],\n ['trading.setMarginType', 'POST', '/fapi/v1/marginType', 'signed', 'futures.trading.setMarginType'],\n ['trading.modifyPositionMargin', 'POST', '/fapi/v1/positionMargin', 'signed', 'futures.trading.modifyPositionMargin'],\n ['trading.setCountdownCancelAll', 'POST', '/fapi/v1/countdownCancelAll', 'signed', 'futures.trading.setCountdownCancelAll'],\n\n // ---- Algo orders (FuturesTrading) ----\n ['trading.createAlgoOrder', 'POST', '/fapi/v1/algoOrder', 'signed', 'futures.trading.createAlgoOrder'],\n ['trading.cancelAlgoOrder', 'DELETE', '/fapi/v1/algoOrder', 'signed', 'futures.trading.cancelAlgoOrder'],\n ['trading.cancelAllOpenAlgoOrders', 'DELETE', '/fapi/v1/algoOpenOrders', 'signed', 'futures.trading.cancelAllOpenAlgoOrders'],\n ['trading.getAlgoOrder', 'GET', '/fapi/v1/algoOrder', 'signed', 'futures.trading.getAlgoOrder'],\n ['trading.getOpenAlgoOrders', 'GET', '/fapi/v1/openAlgoOrders', 'signed', 'futures.trading.getOpenAlgoOrders'],\n ['trading.getAllAlgoOrders', 'GET', '/fapi/v1/allAlgoOrders', 'signed', 'futures.trading.getAllAlgoOrders'],\n\n // ---- Convert (served from the futures host) ----\n ['convert.exchangeInfo', 'GET', '/fapi/v1/convert/exchangeInfo', 'public', 'futures.trading.convertExchangeInfo'],\n ['convert.getQuote', 'POST', '/fapi/v1/convert/getQuote', 'signed', 'futures.trading.convertGetQuote'],\n ['convert.acceptQuote', 'POST', '/fapi/v1/convert/acceptQuote', 'signed', 'futures.trading.convertAcceptQuote'],\n ['convert.orderStatus', 'GET', '/fapi/v1/convert/orderStatus', 'signed', 'futures.trading.convertOrderStatus'],\n\n // ---- User data stream (UserDataStream) ----\n ['userStream.create', 'POST', '/fapi/v1/listenKey', 'apiKey', 'futures.userStream.createListenKey'],\n ['userStream.keepAlive', 'PUT', '/fapi/v1/listenKey', 'apiKey', 'futures.userStream.keepAliveListenKey'],\n ['userStream.close', 'DELETE', '/fapi/v1/listenKey', 'apiKey', 'futures.userStream.closeListenKey'],\n];\n\nexport const USDM_ENDPOINTS: EndpointEntry[] = rows.map(\n ([operation, method, path, authentication, implementedBy]) => ({\n product: 'usdm',\n operation,\n method,\n path,\n authentication,\n implementedBy,\n }),\n);\n","import type { EndpointEntry, EndpointAuth, EndpointMethod } from './endpoints.js';\n\n/**\n * [operation, method, path, auth, implementedBy] rows for COIN-M Futures\n * (base https://dapi.binance.com/dapi/v1). Market data via CoinMMarket\n * (MarketDataBase + extensions), account via CoinMAccount, trading via\n * CoinMTrading.\n */\ntype Row = [operation: string, method: EndpointMethod, path: string, auth: EndpointAuth, implementedBy: string];\n\nconst rows: Row[] = [\n // ---- Market data (MarketDataBase on /dapi/v1) ----\n ['market.ping', 'GET', '/dapi/v1/ping', 'public', 'coinm.market.ping'],\n ['market.serverTime', 'GET', '/dapi/v1/time', 'public', 'coinm.market.serverTime'],\n ['market.exchangeInfo', 'GET', '/dapi/v1/exchangeInfo', 'public', 'coinm.market.exchangeInfo'],\n ['market.depth', 'GET', '/dapi/v1/depth', 'public', 'coinm.market.depth'],\n ['market.trades', 'GET', '/dapi/v1/trades', 'public', 'coinm.market.trades'],\n ['market.historicalTrades', 'GET', '/dapi/v1/historicalTrades', 'apiKey', 'coinm.market.historicalTrades'],\n ['market.aggTrades', 'GET', '/dapi/v1/aggTrades', 'public', 'coinm.market.aggTrades'],\n ['market.klines', 'GET', '/dapi/v1/klines', 'public', 'coinm.market.klines'],\n ['market.ticker24hr', 'GET', '/dapi/v1/ticker/24hr', 'public', 'coinm.market.ticker24hr'],\n ['market.tickerPrice', 'GET', '/dapi/v1/ticker/price', 'public', 'coinm.market.tickerPrice'],\n ['market.bookTicker', 'GET', '/dapi/v1/ticker/bookTicker', 'public', 'coinm.market.bookTicker'],\n\n // ---- Market data extensions (CoinMMarket) ----\n ['market.continuousKlines', 'GET', '/dapi/v1/continuousKlines', 'public', 'coinm.market.continuousKlines'],\n ['market.indexPriceKlines', 'GET', '/dapi/v1/indexPriceKlines', 'public', 'coinm.market.indexPriceKlines'],\n ['market.markPriceKlines', 'GET', '/dapi/v1/markPriceKlines', 'public', 'coinm.market.markPriceKlines'],\n ['market.premiumIndex', 'GET', '/dapi/v1/premiumIndex', 'public', 'coinm.market.premiumIndex'],\n ['market.fundingRateHistory', 'GET', '/dapi/v1/fundingRate', 'public', 'coinm.market.fundingRateHistory'],\n ['market.openInterest', 'GET', '/dapi/v1/openInterest', 'public', 'coinm.market.openInterest'],\n ['market.openInterestHist', 'GET', '/futures/data/openInterestHist', 'public', 'coinm.market.openInterestHist'],\n\n // ---- Account (CoinMAccount) ----\n ['account.balance', 'GET', '/dapi/v1/balance', 'signed', 'coinm.account.balance'],\n ['account.account', 'GET', '/dapi/v1/account', 'signed', 'coinm.account.account'],\n ['account.positionRisk', 'GET', '/dapi/v1/positionRisk', 'signed', 'coinm.account.positionRisk'],\n ['account.incomeHistory', 'GET', '/dapi/v1/income', 'signed', 'coinm.account.incomeHistory'],\n ['account.userTrades', 'GET', '/dapi/v1/userTrades', 'signed', 'coinm.account.userTrades'],\n ['account.leverageBrackets', 'GET', '/dapi/v1/leverageBracket', 'signed', 'coinm.account.leverageBrackets'],\n ['account.commissionRate', 'GET', '/dapi/v1/commissionRate', 'signed', 'coinm.account.commissionRate'],\n ['account.positionMode', 'GET', '/dapi/v1/positionSide/dual', 'signed', 'coinm.account.positionMode'],\n ['account.setPositionMode', 'POST', '/dapi/v1/positionSide/dual', 'signed', 'coinm.account.setPositionMode'],\n\n // ---- Trading (CoinMTrading) ----\n ['trading.setLeverage', 'POST', '/dapi/v1/leverage', 'signed', 'coinm.trading.setLeverage'],\n ['trading.setMarginType', 'POST', '/dapi/v1/marginType', 'signed', 'coinm.trading.setMarginType'],\n ['trading.createOrder', 'POST', '/dapi/v1/order', 'signed', 'coinm.trading.createOrder'],\n ['trading.createTestOrder', 'POST', '/dapi/v1/order/test', 'signed', 'coinm.trading.createTestOrder'],\n ['trading.getOrder', 'GET', '/dapi/v1/order', 'signed', 'coinm.trading.getOrder'],\n ['trading.cancelOrder', 'DELETE', '/dapi/v1/order', 'signed', 'coinm.trading.cancelOrder'],\n ['trading.cancelAllOpenOrders', 'DELETE', '/dapi/v1/allOpenOrders', 'signed', 'coinm.trading.cancelAllOpenOrders'],\n ['trading.getOpenOrders', 'GET', '/dapi/v1/openOrders', 'signed', 'coinm.trading.getOpenOrders'],\n ['trading.getAllOrders', 'GET', '/dapi/v1/allOrders', 'signed', 'coinm.trading.getAllOrders'],\n ['trading.modifyPositionMargin', 'POST', '/dapi/v1/positionMargin', 'signed', 'coinm.trading.modifyPositionMargin'],\n\n // ---- User data stream (CoinMUserDataStream) ----\n ['userStream.create', 'POST', '/dapi/v1/listenKey', 'apiKey', 'coinm.userStream.createListenKey'],\n ['userStream.keepAlive', 'PUT', '/dapi/v1/listenKey', 'apiKey', 'coinm.userStream.keepAliveListenKey'],\n ['userStream.close', 'DELETE', '/dapi/v1/listenKey', 'apiKey', 'coinm.userStream.closeListenKey'],\n];\n\nexport const COINM_ENDPOINTS: EndpointEntry[] = rows.map(\n ([operation, method, path, authentication, implementedBy]) => ({\n product: 'coinm',\n operation,\n method,\n path,\n authentication,\n implementedBy,\n }),\n);\n","import type { EndpointEntry, EndpointAuth, EndpointMethod } from './endpoints.js';\n\n/** [operation, method, path, auth, implementedBy] rows for Margin (SAPI). */\ntype Row = [operation: string, method: EndpointMethod, path: string, auth: EndpointAuth, implementedBy: string];\n\nconst rows: Row[] = [\n ['account.crossMarginAccount', 'GET', '/sapi/v1/margin/account', 'signed', 'margin.account.crossAccount'],\n ['account.isolatedMarginAccount', 'GET', '/sapi/v1/margin/isolated/account', 'signed', 'margin.account.isolatedAccount'],\n ['account.maxBorrowable', 'GET', '/sapi/v1/margin/maxBorrowable', 'signed', 'margin.account.maxBorrowable'],\n ['account.maxTransferable', 'GET', '/sapi/v1/margin/maxTransferable', 'signed', 'margin.account.maxTransferable'],\n ['borrowRepay.record', 'GET', '/sapi/v1/margin/borrow-repay', 'signed', 'margin.account.borrowRepayRecord'],\n ['account.interestHistory', 'GET', '/sapi/v1/margin/interestHistory', 'signed', 'margin.account.interestHistory'],\n ['account.forceLiquidationRecord', 'GET', '/sapi/v1/margin/forceLiquidationRec', 'signed', 'margin.account.forceLiquidationRecord'],\n ['account.priceIndex', 'GET', '/sapi/v1/margin/priceIndex', 'public', 'margin.account.priceIndex'],\n ['trading.borrowRepay', 'POST', '/sapi/v1/margin/borrow-repay', 'signed', 'margin.trading.borrowRepay'],\n ['transfer.crossMargin', 'POST', '/sapi/v1/margin/transfer', 'signed', 'margin.trading.transfer'],\n ['transfer.isolatedMargin', 'POST', '/sapi/v1/margin/isolated/transfer', 'signed', 'margin.trading.isolatedTransfer'],\n ['trading.createOrder', 'POST', '/sapi/v1/margin/order', 'signed', 'margin.trading.createOrder'],\n ['trading.cancelOrder', 'DELETE', '/sapi/v1/margin/order', 'signed', 'margin.trading.cancelOrder'],\n ['trading.cancelAllOpenOrders', 'DELETE', '/sapi/v1/margin/openOrders', 'signed', 'margin.trading.cancelAllOpenOrders'],\n ['trading.getOrder', 'GET', '/sapi/v1/margin/order', 'signed', 'margin.trading.getOrder'],\n ['trading.getOpenOrders', 'GET', '/sapi/v1/margin/openOrders', 'signed', 'margin.trading.getOpenOrders'],\n ['trading.getAllOrders', 'GET', '/sapi/v1/margin/allOrders', 'signed', 'margin.trading.getAllOrders'],\n ['trading.myTrades', 'GET', '/sapi/v1/margin/myTrades', 'signed', 'margin.trading.myTrades'],\n];\n\nexport const MARGIN_ENDPOINTS: EndpointEntry[] = rows.map(\n ([operation, method, path, authentication, implementedBy]) => ({\n product: 'margin',\n operation,\n method,\n path,\n authentication,\n implementedBy,\n }),\n);\n","import type { EndpointEntry, EndpointAuth, EndpointMethod } from './endpoints.js';\n\n/** [operation, method, path, auth, implementedBy] rows for Wallet (SAPI). */\ntype Row = [operation: string, method: EndpointMethod, path: string, auth: EndpointAuth, implementedBy: string];\n\nconst rows: Row[] = [\n ['transfer.universalTransfer', 'POST', '/sapi/v1/asset/transfer', 'signed', 'wallet.universalTransfer'],\n ['transfer.universalTransferHistory', 'GET', '/sapi/v1/asset/transfer', 'signed', 'wallet.universalTransferHistory'],\n ['account.fundingWallet', 'POST', '/sapi/v1/asset/get-funding-asset', 'signed', 'wallet.fundingWallet'],\n ['account.userAsset', 'POST', '/sapi/v3/asset/getUserAsset', 'signed', 'wallet.userAsset'],\n ['deposit.history', 'GET', '/sapi/v1/capital/deposit/hisrec', 'signed', 'wallet.depositHistory'],\n ['withdraw.history', 'GET', '/sapi/v1/capital/withdraw/history', 'signed', 'wallet.withdrawHistory'],\n ['withdraw.apply', 'POST', '/sapi/v1/capital/withdraw/apply', 'signed', 'wallet.withdraw'],\n ['deposit.address', 'GET', '/sapi/v1/capital/deposit/address', 'signed', 'wallet.depositAddress'],\n ['account.snapshot', 'GET', '/sapi/v1/accountSnapshot', 'signed', 'wallet.accountSnapshot'],\n ['account.apiKeyPermissions', 'GET', '/sapi/v1/account/apiRestrictions', 'signed', 'wallet.apiKeyPermissions'],\n ['account.assetDetail', 'GET', '/sapi/v1/asset/assetDetail', 'signed', 'wallet.assetDetail'],\n ['account.dustLog', 'GET', '/sapi/v1/asset/dribblet', 'signed', 'wallet.dustLog'],\n ['account.convertDustToBnb', 'POST', '/sapi/v1/asset/dust', 'signed', 'wallet.convertDustToBnb'],\n ['account.tradeFee', 'GET', '/sapi/v1/asset/tradeFee', 'signed', 'wallet.tradeFee'],\n];\n\nexport const WALLET_ENDPOINTS: EndpointEntry[] = rows.map(\n ([operation, method, path, authentication, implementedBy]) => ({\n product: 'wallet',\n operation,\n method,\n path,\n authentication,\n implementedBy,\n }),\n);\n","import type { EndpointEntry, EndpointAuth, EndpointMethod } from './endpoints.js';\n\n/** [operation, method, path, auth, implementedBy] rows for Sub-account (SAPI). */\ntype Row = [operation: string, method: EndpointMethod, path: string, auth: EndpointAuth, implementedBy: string];\n\nconst rows: Row[] = [\n ['subaccount.list', 'GET', '/sapi/v1/sub-account/list', 'signed', 'subaccount.list'],\n ['subaccount.status', 'GET', '/sapi/v1/sub-account/status', 'signed', 'subaccount.status'],\n ['subaccount.spotAssets', 'GET', '/sapi/v3/sub-account/assets', 'signed', 'subaccount.spotAssets'],\n ['subaccount.spotSummary', 'GET', '/sapi/v1/sub-account/spotSummary', 'signed', 'subaccount.spotSummary'],\n ['subaccount.futuresAccountSummary', 'GET', '/sapi/v2/sub-account/futures/accountSummary', 'signed', 'subaccount.futuresAccountSummary'],\n ['subaccount.marginAccount', 'GET', '/sapi/v1/sub-account/margin/account', 'signed', 'subaccount.marginAccount'],\n ['subaccount.universalTransfer', 'POST', '/sapi/v1/sub-account/universalTransfer', 'signed', 'subaccount.universalTransfer'],\n ['subaccount.universalTransferHistory', 'GET', '/sapi/v1/sub-account/universalTransfer', 'signed', 'subaccount.universalTransferHistory'],\n ['subaccount.createVirtual', 'POST', '/sapi/v1/sub-account/virtualSubAccount', 'signed', 'subaccount.createVirtualSubAccount'],\n ['subaccount.enableFutures', 'POST', '/sapi/v1/sub-account/futures/enable', 'signed', 'subaccount.enableFutures'],\n ['subaccount.enableMargin', 'POST', '/sapi/v1/sub-account/margin/enable', 'signed', 'subaccount.enableMargin'],\n ['subaccount.depositAddress', 'GET', '/sapi/v1/capital/deposit/subAddress', 'signed', 'subaccount.depositAddress'],\n ['subaccount.depositHistory', 'GET', '/sapi/v1/capital/deposit/subHisrec', 'signed', 'subaccount.depositHistory'],\n];\n\nexport const SUBACCOUNT_ENDPOINTS: EndpointEntry[] = rows.map(\n ([operation, method, path, authentication, implementedBy]) => ({\n product: 'subaccount',\n operation,\n method,\n path,\n authentication,\n implementedBy,\n }),\n);\n","/**\n * Endpoint registry — machine-readable map of every REST endpoint this SDK\n * implements, the single source of truth consumed by:\n *\n * - `docs/endpoint-map/*.md` (generated by scripts/generate-endpoint-map.ts)\n * - `llms.txt` / `llms-full.txt` (agent-facing docs, also generated)\n * - tooling/CI (coverage accounting vs. Binance's published API surface)\n *\n * Registry entries are hand-curated but mechanically *checked*: the\n * `scripts/generate-endpoint-map.ts` script greps `src/resources` for live\n * `http.<verb>(...)` calls and fails when a registered endpoint is not\n * actually implemented (or vice versa), so the map cannot drift silently.\n */\n\nexport type EndpointAuth = 'public' | 'apiKey' | 'signed';\nexport type EndpointMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\n\nexport interface EndpointEntry {\n /** Binance product family. */\n product: 'spot' | 'usdm' | 'coinm' | 'margin' | 'wallet' | 'subaccount';\n /** SDK surface implementing it, e.g. `futures.trading.createOrder`. */\n operation: string;\n method: EndpointMethod;\n path: string;\n authentication: EndpointAuth;\n /** Documented request weight where known (IP weight unless noted). */\n weight?: number;\n /** Resource class + method implementing the call. */\n implementedBy: string;\n}\n\nimport { SPOT_ENDPOINTS } from './spot.endpoints.js';\nimport { USDM_ENDPOINTS } from './usdm.endpoints.js';\nimport { COINM_ENDPOINTS } from './coinm.endpoints.js';\nimport { MARGIN_ENDPOINTS } from './margin.endpoints.js';\nimport { WALLET_ENDPOINTS } from './wallet.endpoints.js';\nimport { SUBACCOUNT_ENDPOINTS } from './subaccount.endpoints.js';\n\n/** Every implemented endpoint, across all products. */\nexport const ENDPOINT_REGISTRY: readonly EndpointEntry[] = [\n ...SPOT_ENDPOINTS,\n ...USDM_ENDPOINTS,\n ...COINM_ENDPOINTS,\n ...MARGIN_ENDPOINTS,\n ...WALLET_ENDPOINTS,\n ...SUBACCOUNT_ENDPOINTS,\n];\n\nexport interface EndpointQuery {\n product?: EndpointEntry['product'];\n method?: EndpointMethod;\n authentication?: EndpointAuth;\n pathPrefix?: string;\n}\n\nexport function listEndpoints(query: EndpointQuery = {}): readonly EndpointEntry[] {\n return ENDPOINT_REGISTRY.filter((entry) => {\n if (query.product && entry.product !== query.product) return false;\n if (query.method && entry.method !== query.method) return false;\n if (query.authentication && entry.authentication !== query.authentication) return false;\n if (query.pathPrefix && !entry.path.startsWith(query.pathPrefix)) return false;\n return true;\n });\n}\n\nexport function findEndpoint(path: string, method?: EndpointMethod): EndpointEntry | undefined {\n return ENDPOINT_REGISTRY.find(\n (entry) => entry.path === path && (method === undefined || entry.method === method),\n );\n}\n\n/** Per-product coverage counts for docs/CI. */\nexport function endpointCounts(): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const entry of ENDPOINT_REGISTRY) {\n counts[entry.product] = (counts[entry.product] ?? 0) + 1;\n }\n return counts;\n}\n","/**\n * API contract layer — the machine-readable view of the Binance REST surface\n * this SDK implements.\n *\n * The registry (src/registry) already lists every endpoint (operation, method,\n * path, authentication, implementer). This layer is the *contract* consumers\n * build on top of that list:\n *\n * - normalized **security schemes** (`none` / `apiKey` / `signature`) instead\n * of ad-hoc auth strings;\n * - **declared request weights** for the endpoints where Binance documents a\n * param-independent weight — informational only, response headers\n * (`X-MBX-USED-WEIGHT-*`) remain the source of truth for accounting;\n * - **path canonicalization** so a bare resource path (`/order`) resolves to\n * the registry's canonical form (`/api/v3/order`) using the HttpClient's\n * base URL — this is what lets the observability bus attach contract\n * metadata to every `http.request.*` event;\n * - a single query API (`getContract`, `findContract`, `listContracts`) for\n * tooling, docs generation and agent-facing surfaces.\n *\n * This is the stepping stone toward a fully generated contract layer (OpenAPI\n * spec → typed clients); the query surface below is deliberately shaped so a\n * generated implementation can replace the hand-curated backing store without\n * changing any consumer.\n */\n\nimport {\n ENDPOINT_REGISTRY,\n endpointCounts,\n findEndpoint,\n listEndpoints,\n type EndpointAuth,\n type EndpointEntry,\n type EndpointMethod,\n type EndpointQuery,\n} from '../registry/endpoints.js';\n\nexport type { EndpointAuth, EndpointEntry, EndpointMethod, EndpointQuery };\nexport { ENDPOINT_REGISTRY, endpointCounts, listEndpoints };\n\n/** Normalized security scheme an endpoint requires. */\nexport type EndpointSecurityScheme = 'none' | 'apiKey' | 'signature';\n\n/**\n * A single endpoint's contract: registry entry + normalized security scheme +\n * declared weight (where Binance documents a param-independent one).\n */\nexport interface EndpointContract extends EndpointEntry {\n security: EndpointSecurityScheme;\n /** Documented request weight where param-independent; see file docs. */\n declaredWeight?: number;\n}\n\nfunction securityOf(auth: EndpointAuth): EndpointSecurityScheme {\n switch (auth) {\n case 'public':\n return 'none';\n case 'apiKey':\n return 'apiKey';\n case 'signed':\n return 'signature';\n }\n}\n\n/**\n * Statically documented, param-independent request weights. Weight rules that\n * depend on request parameters (e.g. `depth` limit, `klines` limit) are\n * deliberately omitted — the `X-MBX-USED-WEIGHT-*` response headers tracked by\n * the RateLimitTracker are the accounting source of truth; these values exist\n * so tooling and agents can reason about request cost before sending.\n */\nconst ENDPOINT_WEIGHTS: Readonly<Record<string, number>> = {\n // Spot (api/v3)\n 'GET /api/v3/ping': 1,\n 'GET /api/v3/time': 1,\n 'GET /api/v3/exchangeInfo': 20,\n 'GET /api/v3/avgPrice': 2,\n 'GET /api/v3/ticker/price': 4,\n 'GET /api/v3/ticker/bookTicker': 4,\n 'GET /api/v3/order': 2,\n 'DELETE /api/v3/order': 2,\n 'GET /api/v3/openOrders': 6,\n 'DELETE /api/v3/openOrders': 6,\n 'GET /api/v3/myTrades': 10,\n 'GET /api/v3/account': 20,\n\n // USDⓈ-M futures (fapi/v1)\n 'GET /fapi/v1/ping': 1,\n 'GET /fapi/v1/time': 1,\n 'GET /fapi/v1/exchangeInfo': 1,\n 'GET /fapi/v1/order': 1,\n 'DELETE /fapi/v1/order': 1,\n 'GET /fapi/v1/openOrders': 1,\n 'DELETE /fapi/v1/openOrders': 1,\n 'GET /fapi/v1/allOrders': 5,\n 'GET /fapi/v1/balance': 5,\n 'GET /fapi/v1/positionRisk': 5,\n 'GET /fapi/v1/income': 10,\n 'GET /fapi/v1/trade': 5,\n\n // COIN-M futures (dapi/v1)\n 'GET /dapi/v1/ping': 1,\n 'GET /dapi/v1/time': 1,\n 'GET /dapi/v1/exchangeInfo': 1,\n 'GET /dapi/v1/order': 1,\n 'DELETE /dapi/v1/order': 1,\n 'GET /dapi/v1/balance': 5,\n 'GET /dapi/v1/positionRisk': 5,\n\n // Broker-style user-data-stream endpoints (apiKey auth)\n 'POST /fapi/v1/listenKey': 1,\n 'PUT /fapi/v1/listenKey': 1,\n 'DELETE /fapi/v1/listenKey': 1,\n 'POST /api/v3/userDataStream': 1,\n 'PUT /api/v3/userDataStream': 1,\n 'DELETE /api/v3/userDataStream': 1,\n 'POST /dapi/v1/listenKey': 1,\n 'PUT /dapi/v1/listenKey': 1,\n 'DELETE /dapi/v1/listenKey': 1,\n};\n\n/** Version prefixes that make a path canonical by itself. */\nconst CANONICAL_PREFIXES = [\n '/api/v3',\n '/fapi/v1',\n '/dapi/v1',\n '/sapi/v1',\n '/sapi/v2',\n '/sapi/v3',\n '/futures/data',\n];\n\nfunction weightOf(method: string, canonicalPath: string): number | undefined {\n return ENDPOINT_WEIGHTS[`${method} ${canonicalPath}`];\n}\n\nlet byPathMethod: Map<string, EndpointContract> | null = null;\n\nfunction registryIndex(): Map<string, EndpointContract> {\n if (byPathMethod) return byPathMethod;\n byPathMethod = new Map();\n for (const entry of ENDPOINT_REGISTRY) {\n const contract: EndpointContract = {\n ...entry,\n security: securityOf(entry.authentication),\n declaredWeight: weightOf(entry.method, entry.path),\n };\n byPathMethod.set(`${entry.method} ${entry.path}`, contract);\n }\n return byPathMethod;\n}\n\n/**\n * Resolve a resource-supplied path against an HttpClient base URL to the\n * registry's canonical path. Bare paths (`/order`) are prefixed with the base\n * URL's own path segment (`https://…/api/v3` → `/api/v3/order`); paths that\n * already carry a version prefix pass through unchanged.\n */\nexport function canonicalPath(baseURL: string, path: string): string {\n if (CANONICAL_PREFIXES.some((prefix) => path === prefix || path.startsWith(`${prefix}/`))) {\n return path;\n }\n if (!baseURL) return path;\n let basePath: string;\n try {\n basePath = new URL(baseURL).pathname;\n } catch {\n return path;\n }\n if (!basePath || basePath === '/') return path;\n return `${basePath.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}`;\n}\n\n/** Contract for a canonical path + method, or undefined when unknown. */\nexport function findContract(\n canonical: string,\n method?: EndpointMethod,\n): EndpointContract | undefined {\n const index = registryIndex();\n if (method !== undefined) {\n return index.get(`${method} ${canonical}`);\n }\n // Path-only lookup: scan for any verb at that path.\n for (const [key, contract] of index) {\n if (key.endsWith(` ${canonical}`)) return contract;\n }\n return undefined;\n}\n\n/** Contract lookup by product + operation, e.g. ('spot', 'trading.createOrder'). */\nexport function getContract(\n product: EndpointEntry['product'],\n operation: string,\n): EndpointContract | undefined {\n const entry = ENDPOINT_REGISTRY.find(\n (candidate) => candidate.product === product && candidate.operation === operation,\n );\n if (!entry) return undefined;\n return {\n ...entry,\n security: securityOf(entry.authentication),\n declaredWeight: weightOf(entry.method, entry.path),\n };\n}\n\n/** Contract metadata attached to `http.request.*` observability events. */\nexport interface HttpContractMeta {\n product: EndpointEntry['product'];\n operation: string;\n authentication: EndpointAuth;\n security: EndpointSecurityScheme;\n declaredWeight: number | undefined;\n}\n\n/**\n * Resolve the contract for a request as the HttpClient sees it: base URL +\n * method + resource path. Returns undefined for unregistered paths (e.g.\n * host-level time endpoints reused across products).\n */\nexport function contractFor(\n baseURL: string,\n method: string,\n path: string,\n): HttpContractMeta | undefined {\n const canonical = canonicalPath(baseURL, path);\n const contract = findContract(canonical, method as EndpointMethod);\n if (!contract) return undefined;\n return {\n product: contract.product,\n operation: contract.operation,\n authentication: contract.authentication,\n security: contract.security,\n declaredWeight: contract.declaredWeight,\n };\n}\n\n/** One-line human description, for logs and agent-facing docs. */\nexport function describeContract(contract: EndpointContract): string {\n const weight =\n contract.declaredWeight !== undefined ? `, weight ${contract.declaredWeight}` : '';\n return (\n `${contract.method} ${contract.path} [${contract.product}.${contract.operation}] ` +\n `auth=${contract.authentication}${weight} — implemented by ${contract.implementedBy}`\n );\n}\n\n// Re-exported for consumers that only import from the contracts layer.\nexport { findEndpoint };\n","export interface RateLimitUsage {\n /** Highest `x-mbx-used-weight-*` value seen across all interval headers on the last response. */\n usedWeight: number;\n /** Per-header-suffix used-weight snapshot, e.g. `{ '1m': 120 }`. */\n usedWeightByInterval: Record<string, number>;\n /** Per-header-suffix order-count snapshot, e.g. `{ '10s': 3, '1d': 45 }`. */\n orderCountByInterval: Record<string, number>;\n lastUpdated: number;\n}\n\nexport interface RateLimitTrackerOptions {\n /** Assumed weight-per-minute ceiling used to compute throttling delay. Binance's default IP limit is 6000 for most REST hosts. */\n weightLimitPerMinute?: number;\n /** Fraction of the weight limit at which the tracker starts delaying requests (0-1). Set >=1 to disable throttling. */\n safetyMargin?: number;\n}\n\nconst WEIGHT_HEADER = /^x-mbx-used-weight-(.+)$/i;\nconst ORDER_COUNT_HEADER = /^x-mbx-order-count-(.+)$/i;\n\n/**\n * Tracks Binance's `X-MBX-USED-WEIGHT-*` / `X-MBX-ORDER-COUNT-*` response headers so callers can\n * back off before hitting `-1003` (IP ban) instead of reacting to it after the fact.\n */\nexport class RateLimitTracker {\n private readonly weightLimitPerMinute: number;\n private readonly safetyMargin: number;\n private usage: RateLimitUsage = {\n usedWeight: 0,\n usedWeightByInterval: {},\n orderCountByInterval: {},\n lastUpdated: 0,\n };\n\n constructor(options: RateLimitTrackerOptions = {}) {\n this.weightLimitPerMinute = options.weightLimitPerMinute ?? 6000;\n this.safetyMargin = options.safetyMargin ?? 0.8;\n }\n\n update(headers: Record<string, string> | undefined): void {\n if (!headers) return;\n const usedWeightByInterval: Record<string, number> = {};\n const orderCountByInterval: Record<string, number> = {};\n\n for (const [key, value] of Object.entries(headers)) {\n const weightMatch = key.match(WEIGHT_HEADER);\n if (weightMatch?.[1]) {\n usedWeightByInterval[weightMatch[1]] = Number(value);\n continue;\n }\n const orderMatch = key.match(ORDER_COUNT_HEADER);\n if (orderMatch?.[1]) {\n orderCountByInterval[orderMatch[1]] = Number(value);\n }\n }\n\n if (Object.keys(usedWeightByInterval).length === 0 && Object.keys(orderCountByInterval).length === 0) {\n return;\n }\n\n this.usage = {\n usedWeight: Math.max(0, ...Object.values(usedWeightByInterval)),\n usedWeightByInterval,\n orderCountByInterval,\n lastUpdated: Date.now(),\n };\n }\n\n getUsage(): Readonly<RateLimitUsage> {\n return this.usage;\n }\n\n /**\n * Milliseconds a caller should wait before its next request, based on the most recently\n * observed 1-minute weight usage. Returns 0 when usage is stale or under the safety margin.\n */\n getThrottleDelayMs(): number {\n if (this.safetyMargin >= 1) return 0;\n const oneMinuteWeight = this.usage.usedWeightByInterval['1m'] ?? this.usage.usedWeight;\n if (!oneMinuteWeight) return 0;\n if (Date.now() - this.usage.lastUpdated > 60_000) return 0;\n\n const threshold = this.weightLimitPerMinute * this.safetyMargin;\n if (oneMinuteWeight < threshold) return 0;\n\n const msIntoMinute = Date.now() % 60_000;\n return 60_000 - msIntoMinute;\n }\n}\n","import { createHmac, createPrivateKey, createSign, sign as cryptoSign, type KeyObject } from 'node:crypto';\n\nexport type SignatureAlgorithm = 'HMAC' | 'ED25519' | 'RSA';\n\nexport interface SignerOptions {\n algorithm?: SignatureAlgorithm;\n /** HMAC secret string. Required when algorithm is 'HMAC' (the default). */\n apiSecret?: string;\n /** PEM-encoded private key (or raw Buffer). Required for 'ED25519' and 'RSA'. */\n privateKey?: string | Buffer;\n}\n\n/**\n * Signs Binance request payloads. HMAC-SHA256 (the classic API-secret flow) is the default;\n * Ed25519 and RSA keys — which Binance now recommends over HMAC — are signed via `privateKey`.\n */\nexport class Signer {\n readonly algorithm: SignatureAlgorithm;\n private readonly apiSecret?: string;\n private readonly privateKey?: KeyObject;\n\n constructor(options: SignerOptions) {\n this.algorithm = options.algorithm ?? (options.privateKey ? 'ED25519' : 'HMAC');\n this.apiSecret = options.apiSecret;\n if (options.privateKey) {\n this.privateKey = createPrivateKey(options.privateKey);\n }\n }\n\n canSign(): boolean {\n return this.algorithm === 'HMAC' ? Boolean(this.apiSecret) : Boolean(this.privateKey);\n }\n\n sign(payload: string): string {\n switch (this.algorithm) {\n case 'HMAC': {\n if (!this.apiSecret) throw new Error('apiSecret is required for HMAC signing');\n return createHmac('sha256', this.apiSecret).update(payload).digest('hex');\n }\n case 'ED25519': {\n if (!this.privateKey) throw new Error('privateKey is required for ED25519 signing');\n return cryptoSign(null, Buffer.from(payload), this.privateKey).toString('base64');\n }\n case 'RSA': {\n if (!this.privateKey) throw new Error('privateKey is required for RSA signing');\n return createSign('RSA-SHA256').update(payload).sign(this.privateKey, 'base64');\n }\n default: {\n const exhaustive: never = this.algorithm;\n throw new Error(`Unsupported signature algorithm: ${String(exhaustive)}`);\n }\n }\n }\n}\n","export type Environment = 'live' | 'testnet' | 'demo';\n\nexport interface Endpoints {\n restRoot: string;\n restFapi: string;\n restFuturesData: string;\n restSpot: string;\n restApiRoot: string;\n restDapiRoot: string;\n restDapi: string;\n wsMarket: string;\n wsUser: string;\n wsApi: string;\n wsSpotMarket: string;\n wsSpotUser: string;\n wsSpotApi: string;\n wsDapiMarket: string;\n wsDapiUser: string;\n}\n\nexport function resolveEnvironment(options?: {\n testnet?: boolean;\n demo?: boolean;\n apiBase?: string;\n wsBase?: string;\n wsUserBase?: string;\n wsApiBase?: string;\n dapiBase?: string;\n wsSpotApiBase?: string;\n wsDapiBase?: string;\n}): { env: Environment; endpoints: Endpoints } {\n const env: Environment = options?.demo ? 'demo' : options?.testnet ? 'testnet' : 'live';\n\n const restHost =\n options?.apiBase ??\n (env === 'demo'\n ? 'https://demo-fapi.binance.com'\n : env === 'testnet'\n ? 'https://testnet.binancefuture.com'\n : 'https://fapi.binance.com');\n\n const wsMarketHost =\n options?.wsBase ??\n (env === 'demo'\n ? 'wss://demo-fstream.binance.com/stream'\n : env === 'testnet'\n ? 'wss://fstream.binancefuture.com/stream'\n : 'wss://fstream.binance.com/stream');\n\n const wsUserHost =\n options?.wsUserBase ??\n (env === 'demo'\n ? 'wss://demo-fstream.binance.com/ws'\n : env === 'testnet'\n ? 'wss://fstream.binancefuture.com/ws'\n : 'wss://fstream.binance.com/ws');\n\n const wsApiHost =\n options?.wsApiBase ??\n (env === 'demo'\n ? 'wss://demo-fapi.binance.com/ws-fapi/v1'\n : 'wss://ws-fapi.binance.com/ws-fapi/v1');\n\n const restSpotHost =\n options?.apiBase ??\n (env === 'testnet' ? 'https://testnet.binance.vision' : 'https://api.binance.com');\n\n const wsSpotMarketHost =\n options?.wsBase ??\n (env === 'testnet' ? 'wss://testnet.binance.vision/stream' : 'wss://stream.binance.com:9443/stream');\n\n const wsSpotUserHost =\n options?.wsUserBase ??\n (env === 'testnet' ? 'wss://testnet.binance.vision/ws' : 'wss://stream.binance.com:9443/ws');\n\n // Binance has no dedicated COIN-M demo trading host, so demo mode falls back to testnet.\n const restDapiHost =\n options?.dapiBase ??\n (env === 'testnet' || env === 'demo' ? 'https://testnet.binancefuture.com' : 'https://dapi.binance.com');\n\n const wsSpotApiHost =\n options?.wsSpotApiBase ??\n (env === 'testnet' ? 'wss://testnet.binance.vision/ws-api/v3' : 'wss://ws-api.binance.com:443/ws-api/v3');\n\n // Binance has no dedicated COIN-M demo WS host either, so demo mode falls back to testnet here too.\n const wsDapiHost =\n options?.wsDapiBase ??\n (env === 'testnet' || env === 'demo' ? 'wss://dstream.binancefuture.com' : 'wss://dstream.binance.com');\n\n return {\n env,\n endpoints: {\n restRoot: restHost,\n restFapi: `${restHost}/fapi/v1`,\n restFuturesData: `${restHost}/futures/data`,\n restSpot: `${restSpotHost}/api/v3`,\n restApiRoot: restSpotHost,\n restDapiRoot: restDapiHost,\n restDapi: `${restDapiHost}/dapi/v1`,\n wsMarket: wsMarketHost,\n wsUser: wsUserHost,\n wsApi: wsApiHost,\n wsSpotMarket: wsSpotMarketHost,\n wsSpotUser: wsSpotUserHost,\n wsSpotApi: wsSpotApiHost,\n wsDapiMarket: `${wsDapiHost}/stream`,\n wsDapiUser: `${wsDapiHost}/ws`,\n },\n };\n}\n","import { EventEmitter } from 'node:events';\n\n/**\n * Structured, JSON-serializable observability events for every SDK subsystem.\n *\n * The legacy SDK had scattered ad-hoc logs and silent `catch {}` blocks; callers\n * had no way to answer \"what happened to my order\" or \"why did the WS reconnect\".\n * This bus makes the SDK's internal lifecycle a first-class observable surface\n * (a prerequisite for agent-driven trading, where the caller must be able to\n * audit every state transition).\n *\n * Design rules:\n * - every payload is a plain object safe for JSON.stringify / NDJSON export\n * - no events are emitted per market-data message (subscribe to the stream\n * itself for data; the bus carries lifecycle and control-plane events only)\n * - events are namespaced by the emitting subsystem, e.g. `http.request.end`,\n * `ws.spotUser.state`, `execution.reconciled`, `risk.denied`\n *\n * Filters:\n * - `bus.on('*', fn)` — everything\n * - `bus.on('ws.', fn)` — prefix filter (trailing dot)\n * - `bus.on('ws.state', fn)` — exact event name\n */\n\nexport interface SdkEvent {\n /** Wall-clock time the event was emitted (ms since epoch). */\n readonly ts: number;\n /** Sequence number, strictly increasing across the whole bus tree. */\n readonly seq: number;\n /** Emitting subsystem, e.g. `http`, `ws:spotMarket`, `execution`, `risk`. */\n readonly scope: string;\n /** Event name, e.g. `http.request.end`, `ws.state`, `execution.reconciled`. */\n readonly name: string;\n readonly payload: Record<string, unknown>;\n}\n\nexport type SdkEventListener = (event: Readonly<SdkEvent>) => void;\n\nexport interface EventBusOptions {\n /** Keep the last N events retrievable via `history()`; default 0 (disabled). */\n historySize?: number;\n /** Scope label; only set internally via `scoped()`. */\n scope?: string;\n}\n\ninterface Registry {\n exact: Map<string, Set<SdkEventListener>>;\n prefix: Map<string, Set<SdkEventListener>>;\n wildcard: Set<SdkEventListener>;\n history: SdkEvent[];\n seq: number;\n historySize: number;\n}\n\nexport class EventBus {\n private readonly registry: Registry;\n private readonly emitter = new EventEmitter();\n private readonly children = new Map<string, EventBus>();\n private readonly scope: string;\n\n constructor(options: EventBusOptions = {}) {\n this.scope = options.scope ?? '';\n this.registry = {\n exact: new Map(),\n prefix: new Map(),\n wildcard: new Set(),\n history: [],\n seq: 0,\n historySize: options.historySize ?? 0,\n };\n this.emitter.setMaxListeners(0);\n }\n\n private parent: EventBus | null = null;\n\n /**\n * Subscribe. `filter` may be `'*'` (all events), a trailing-dot prefix such\n * as `'ws.'` or `'execution.'`, or an exact event name like `'ws.state'`.\n */\n on(filter: string, listener: SdkEventListener): this {\n if (filter === '*' || filter === '') {\n this.registry.wildcard.add(listener);\n } else if (filter.endsWith('.')) {\n let set = this.registry.prefix.get(filter);\n if (!set) {\n set = new Set();\n this.registry.prefix.set(filter, set);\n }\n set.add(listener);\n } else {\n let set = this.registry.exact.get(filter);\n if (!set) {\n set = new Set();\n this.registry.exact.set(filter, set);\n }\n set.add(listener);\n }\n return this;\n }\n\n once(filter: string, listener: SdkEventListener): this {\n const onceWrapper: SdkEventListener = (event) => {\n this.off(filter, onceWrapper);\n listener(event);\n };\n return this.on(filter, onceWrapper);\n }\n\n off(filter: string, listener: SdkEventListener): this {\n if (filter === '*' || filter === '') {\n this.registry.wildcard.delete(listener);\n } else if (filter.endsWith('.')) {\n this.registry.prefix.get(filter)?.delete(listener);\n } else {\n this.registry.exact.get(filter)?.delete(listener);\n }\n return this;\n }\n\n /** Publish an event tagged with this bus's scope. */\n emit(name: string, payload: Record<string, unknown> = {}): void {\n const root = this.parent ?? this;\n const event: SdkEvent = {\n ts: Date.now(),\n seq: ++root.registry.seq,\n scope: this.scope,\n name,\n payload,\n };\n if (root.registry.historySize > 0) {\n root.registry.history.push(event);\n if (root.registry.history.length > root.registry.historySize) {\n root.registry.history.shift();\n }\n }\n this.publish(event);\n }\n\n private publish(event: SdkEvent): void {\n for (const listener of this.registry.exact.get(event.name) ?? []) {\n try {\n listener(event);\n } catch {\n /* listener errors must never break the publisher */\n }\n }\n for (const [prefix, listeners] of this.registry.prefix) {\n if (event.name.startsWith(prefix)) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch {\n /* ignore */\n }\n }\n }\n }\n for (const listener of this.registry.wildcard) {\n try {\n listener(event);\n } catch {\n /* ignore */\n }\n }\n if (this.parent) this.parent.publish(event);\n }\n\n /**\n * Derive a child bus whose emissions are automatically tagged with `scope`\n * and also delivered to this bus's own subscribers.\n */\n scoped(scope: string): EventBus {\n const existing = this.children.get(scope);\n if (existing) return existing;\n const child = new EventBus({ scope, historySize: this.registry.historySize });\n child.parent = this;\n this.children.set(scope, child);\n return child;\n }\n\n /** Last N events when the root bus was constructed with `historySize`. */\n history(): readonly SdkEvent[] {\n const root = this.parent ?? this;\n return [...root.registry.history];\n }\n\n clearHistory(): void {\n const root = this.parent ?? this;\n root.registry.history.length = 0;\n }\n}\n\n/** Minimal structured logger interface the SDK accepts. */\nexport interface SdkLogger {\n debug?(message: string, meta?: Record<string, unknown>): void;\n info?(message: string, meta?: Record<string, unknown>): void;\n warn?(message: string, meta?: Record<string, unknown>): void;\n error?(message: string, meta?: Record<string, unknown>): void;\n}\n\n/** Route severity by event-name suffix into any logger implementation. */\nexport function forwardEventsToLogger(bus: EventBus, logger: SdkLogger): void {\n bus.on('*', (event) => {\n const line = `[binance-sdk] ${event.scope} ${event.name}`;\n const meta = event.payload;\n const tail = event.name.split('.').pop() ?? '';\n if (tail === 'error' || tail === 'denied' || tail === 'failed') {\n logger.error?.(line, meta);\n } else if (tail === 'warn' || tail === 'reconnecting' || tail === 'stale' || tail === 'desync') {\n logger.warn?.(line, meta);\n } else {\n logger.info?.(line, meta);\n }\n });\n}\n","import type { SignatureAlgorithm } from '../client/Signer.js';\n\n/**\n * v3 credential abstraction.\n *\n * The v2 client scattered `apiKey`/`apiSecret`/`privateKey`/\n * `signatureAlgorithm` through options objects and into three separate\n * constructors (HttpClient, WsApi, SpotWsApi). v3 funnels all authentication\n * material through one object that answers the questions every subsystem\n * actually asks:\n *\n * - *can we sign at all?* (`canSign`) — market-data-only clients,\n * the paper backend and MCP read-only hosts run without keys;\n * - *which algorithm?* — HMAC (default), RSA or Ed25519, resolved once\n * instead of defaulting independently at each construction site;\n * - *is this a public-only client?* — products decide whether to throw\n * on signed calls or route them to the paper backend instead.\n *\n * This is a value object: it never performs I/O, never refreshes tokens\n * (Binance API keys do not expire), and is safe to share across every\n * product client constructed from the same {@link CoreContext}.\n */\nexport class Credentials {\n readonly apiKey?: string;\n readonly apiSecret?: string;\n readonly privateKey?: string | Buffer;\n readonly signatureAlgorithm: SignatureAlgorithm;\n\n constructor(init: {\n apiKey?: string;\n apiSecret?: string;\n privateKey?: string | Buffer;\n signatureAlgorithm?: SignatureAlgorithm;\n }) {\n this.apiKey = init.apiKey;\n this.apiSecret = init.apiSecret;\n this.privateKey = init.privateKey;\n // Same inference as HttpClient: an explicit algorithm wins; a private\n // key without one means Ed25519 (Binance's PEM convention); otherwise HMAC.\n this.signatureAlgorithm =\n init.signatureAlgorithm ?? (init.privateKey !== undefined ? 'ED25519' : 'HMAC');\n }\n\n /** True when the material needed to sign requests is present. */\n get canSign(): boolean {\n if (this.signatureAlgorithm === 'HMAC') {\n return Boolean(this.apiKey && this.apiSecret);\n }\n return Boolean(this.apiKey && this.privateKey);\n }\n\n /** True when at least an API key is present (TRADE/MARGIN endpoints). */\n get hasApiKey(): boolean {\n return Boolean(this.apiKey);\n }\n\n /**\n * The header/query credential payload, when present. Returns `undefined`\n * for fully public (market-data-only) clients so callers never send an\n * `X-MBX-APIKEY: undefined` header.\n */\n get apiKeyOrNull(): string | undefined {\n return this.apiKey;\n }\n\n /** Redacted description for logs and `execution_status`-style surfaces. */\n describe(): string {\n if (!this.hasApiKey) return 'public (no credentials)';\n return `${this.signatureAlgorithm.toLowerCase()} key ****${this.apiKey!.slice(-4)}${\n this.canSign ? '' : ' (unsigned)'\n }`;\n }\n\n static fromOptions(options: {\n apiKey?: string;\n apiSecret?: string;\n privateKey?: string | Buffer;\n signatureAlgorithm?: SignatureAlgorithm;\n }): Credentials {\n return new Credentials(options);\n }\n}\n","import { z } from 'zod';\n\nexport const WsKlinePayloadSchema = z.object({\n e: z.literal('kline'),\n E: z.number(),\n s: z.string(),\n k: z.object({\n t: z.number(),\n T: z.number(),\n s: z.string(),\n i: z.string(),\n o: z.string().transform(Number),\n c: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n v: z.string().transform(Number),\n n: z.number(),\n x: z.boolean(),\n q: z.string().transform(Number),\n V: z.string().transform(Number),\n Q: z.string().transform(Number),\n }),\n});\nexport type WsKlinePayload = z.infer<typeof WsKlinePayloadSchema>;\n\nexport const WsAggTradePayloadSchema = z.object({\n e: z.literal('aggTrade'),\n E: z.number(),\n s: z.string(),\n a: z.number(),\n p: z.string().transform(Number),\n q: z.string().transform(Number),\n f: z.number(),\n l: z.number(),\n T: z.number(),\n m: z.boolean(),\n});\nexport type WsAggTradePayload = z.infer<typeof WsAggTradePayloadSchema>;\n\nexport const WsTradePayloadSchema = z.object({\n e: z.literal('trade'),\n E: z.number(),\n s: z.string(),\n t: z.number(),\n p: z.string().transform(Number),\n q: z.string().transform(Number),\n T: z.number(),\n m: z.boolean(),\n});\nexport type WsTradePayload = z.infer<typeof WsTradePayloadSchema>;\n\nexport const WsDepthUpdatePayloadSchema = z.object({\n e: z.literal('depthUpdate'),\n E: z.number(),\n s: z.string(),\n U: z.number(),\n u: z.number(),\n T: z.number().optional(),\n pu: z.number().optional(),\n b: z.array(z.tuple([z.string(), z.string()])),\n a: z.array(z.tuple([z.string(), z.string()])),\n});\nexport type WsDepthUpdatePayload = z.infer<typeof WsDepthUpdatePayloadSchema>;\n\nexport const WsTicker24hrPayloadSchema = z.object({\n e: z.literal('24hrTicker'),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n P: z.string().transform(Number),\n c: z.string().transform(Number),\n o: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n v: z.string().transform(Number),\n q: z.string().transform(Number),\n});\nexport type WsTicker24hrPayload = z.infer<typeof WsTicker24hrPayloadSchema>;\n\nexport const WsBookTickerPayloadSchema = z.object({\n u: z.number(),\n s: z.string(),\n b: z.string().transform(Number),\n B: z.string().transform(Number),\n a: z.string().transform(Number),\n A: z.string().transform(Number),\n});\nexport type WsBookTickerPayload = z.infer<typeof WsBookTickerPayloadSchema>;\n\nexport const WsMarkPricePayloadSchema = z.object({\n e: z.literal('markPriceUpdate'),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n i: z.string().transform(Number),\n P: z.string().transform(Number),\n r: z.string().transform(Number),\n T: z.number(),\n});\nexport type WsMarkPricePayload = z.infer<typeof WsMarkPricePayloadSchema>;\n\nexport const WsMiniTickerPayloadSchema = z.object({\n e: z.literal('24hrMiniTicker'),\n E: z.number(),\n s: z.string(),\n c: z.string().transform(Number),\n o: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n v: z.string().transform(Number),\n q: z.string().transform(Number),\n});\nexport type WsMiniTickerPayload = z.infer<typeof WsMiniTickerPayloadSchema>;\n\nexport const WsForceOrderPayloadSchema = z.object({\n e: z.literal('forceOrder'),\n E: z.number(),\n o: z.object({\n s: z.string(),\n S: z.string(),\n o: z.string(),\n f: z.string(),\n q: z.string().transform(Number),\n p: z.string().transform(Number),\n ap: z.string().transform(Number),\n X: z.string(),\n l: z.string().transform(Number),\n z: z.string().transform(Number),\n T: z.number(),\n }),\n});\nexport type WsForceOrderPayload = z.infer<typeof WsForceOrderPayloadSchema>;\n\nexport const WsCompositeIndexPayloadSchema = z.object({\n e: z.literal('compositeIndex'),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n c: z.array(\n z.object({\n b: z.string(),\n q: z.string(),\n w: z.string().transform(Number),\n p: z.string().transform(Number),\n }),\n ),\n});\nexport type WsCompositeIndexPayload = z.infer<typeof WsCompositeIndexPayloadSchema>;\n\nexport const WsAssetIndexPayloadSchema = z.object({\n e: z.literal('assetIndex'),\n E: z.number(),\n s: z.string(),\n i: z.string().transform(Number),\n b: z.string().transform(Number),\n a: z.string().transform(Number),\n});\nexport type WsAssetIndexPayload = z.infer<typeof WsAssetIndexPayloadSchema>;\n\nexport const WsRollingWindowTickerPayloadSchema = z.object({\n e: z.enum(['1hTicker', '4hTicker', '1dTicker', '7dTicker', '30dTicker']),\n E: z.number(),\n s: z.string(),\n p: z.string().transform(Number),\n P: z.string().transform(Number),\n o: z.string().transform(Number),\n h: z.string().transform(Number),\n l: z.string().transform(Number),\n c: z.string().transform(Number),\n v: z.string().transform(Number),\n q: z.string().transform(Number),\n O: z.number(),\n C: z.number(),\n});\nexport type WsRollingWindowTickerPayload = z.infer<typeof WsRollingWindowTickerPayloadSchema>;\n\nexport const WsSpotAvgPricePayloadSchema = z.object({\n e: z.literal('avgPrice'),\n E: z.number(),\n s: z.string(),\n i: z.string(),\n w: z.string().transform(Number),\n T: z.number(),\n});\nexport type WsSpotAvgPricePayload = z.infer<typeof WsSpotAvgPricePayloadSchema>;\n\nexport type WsStreamPayload =\n | WsKlinePayload\n | WsAggTradePayload\n | WsTradePayload\n | WsDepthUpdatePayload\n | WsTicker24hrPayload\n | WsBookTickerPayload\n | WsMarkPricePayload\n | WsMiniTickerPayload\n | WsForceOrderPayload\n | WsCompositeIndexPayload\n | WsAssetIndexPayload\n | WsRollingWindowTickerPayload\n | WsSpotAvgPricePayload;\n\nexport function parseWsPayload(streamName: string, raw: unknown): WsStreamPayload {\n if (streamName.includes('@kline_')) return WsKlinePayloadSchema.parse(raw);\n if (streamName.includes('@continuousKline_') || streamName.includes('@indexPriceKline_') || streamName.includes('@markPriceKline_')) {\n return WsKlinePayloadSchema.parse(raw);\n }\n if (streamName.includes('@aggTrade')) return WsAggTradePayloadSchema.parse(raw);\n if (streamName.includes('@trade')) return WsTradePayloadSchema.parse(raw);\n if (streamName.includes('@depth')) return WsDepthUpdatePayloadSchema.parse(raw);\n if (streamName.includes('@bookTicker')) return WsBookTickerPayloadSchema.parse(raw);\n if (streamName.includes('@markPrice')) return WsMarkPricePayloadSchema.parse(raw);\n if (streamName.includes('@miniTicker')) return WsMiniTickerPayloadSchema.parse(raw);\n if (streamName.includes('@forceOrder')) return WsForceOrderPayloadSchema.parse(raw);\n if (streamName.includes('@compositeIndex')) return WsCompositeIndexPayloadSchema.parse(raw);\n if (streamName.includes('@assetIndex')) return WsAssetIndexPayloadSchema.parse(raw);\n if (streamName.includes('@avgPrice')) return WsSpotAvgPricePayloadSchema.parse(raw);\n if (streamName.includes('@ticker_')) return WsRollingWindowTickerPayloadSchema.parse(raw);\n if (streamName.includes('@ticker')) return WsTicker24hrPayloadSchema.parse(raw);\n throw new Error(`Unknown WS stream type: ${streamName}`);\n}\n","import { EventEmitter } from 'node:events';\nimport WebSocket from 'ws';\nimport type { EventBus } from '../core/events.js';\nimport { parseJsonLossless } from '../core/json.js';\n\n/**\n * WebSocket connection lifecycle with an explicit state machine.\n *\n * This replaces the fragile pattern previously duplicated across BaseWS and the\n * three user-stream classes, which suffered from three concrete defects:\n *\n * 1. Reconnect race: `reconnect()` closed the old socket and immediately opened\n * a new one, but the old socket's `close` handler then scheduled *another*\n * reconnect — producing duplicate concurrent connections.\n * 2. No state visibility: callers could not distinguish \"connecting\" from\n * \"reconnecting\" from \"closed by user\", so `subscribe()` during a connect\n * window created a second socket.\n * 3. No proactive rotation: Binance terminates every stream connection at the\n * 24-hour mark; the old code waited for the server to drop it, stalling all\n * market data for a full reconnect cycle every day.\n *\n * State machine:\n *\n * IDLE ──connect()──▶ CONNECTING ──open──▶ OPEN\n * │ │\n * error/close close (server)\n * ▼ ▼\n * CLOSED ◀──close()── RECONNECTING ──backoff──▶ CONNECTING\n *\n * OPEN ──rotation timer (T-23h)──▶ CONNECTING(replacement) ──open──▶ OPEN\n * (traffic switches to the replacement; the old socket is retired)\n *\n * Stale-socket protection: every socket carries a unique token. A socket's\n * events are honored only while its token is the `active` token (or the\n * `pending` replacement token during a rotation window), so a retiring socket\n * can never trigger a spurious reconnect or emit stale data after a swap.\n */\n\nexport type WsConnectionState =\n | 'IDLE'\n | 'CONNECTING'\n | 'OPEN'\n | 'RECONNECTING'\n | 'CLOSING'\n | 'CLOSED';\n\nexport interface WsConnectionOptions {\n /**\n * Produces the URL for each (re)connect attempt. Invoked per connection so\n * credentials (listenKeys) and stream lists are always current. Return null\n * to abort connecting (e.g. no listenKey yet).\n */\n buildUrl: () => string | null;\n /** Initial reconnect backoff. Default 1000ms. */\n reconnectDelayMs?: number;\n /** Backoff ceiling. Default 30000ms. */\n maxReconnectDelayMs?: number;\n /**\n * Proactive replacement window. Binance kills stream connections at 24h; we\n * rotate at 23h by default so the replacement is live *before* the server\n * drops us. 0 disables.\n */\n rotationMs?: number;\n /**\n * Liveness watchdog: when no frames (data, protocol pings or pongs) arrive\n * for this long while OPEN, the socket is considered dead and is torn down\n * into a reconnect. Binance user streams can legitimately go quiet, but the\n * server still pings them, so protocol-level activity counts. 0 disables.\n */\n staleMs?: number;\n /** Milliseconds to wait for a control-request ack before rejecting. Default 10000. */\n requestTimeoutMs?: number;\n /** Observability bus; events are published under the `ws:<name>` scope. */\n events?: EventBus;\n /** Label used in events/logs, e.g. `futuresMarket`, `spotUser`. */\n name?: string;\n /** Injectable WebSocket factory for tests. */\n socketFactory?: (url: string) => WebSocket;\n /**\n * v3 platform hook: replaces the built-in `min(base * 2^attempt, max)`\n * backoff formula with a caller-supplied policy (e.g. jittered\n * exponential). Purely additive — omit for the v2 default behavior.\n */\n computeReconnectDelay?: (attempt: number) => number;\n}\n\ninterface AckHandler {\n resolve: (result: unknown) => void;\n reject: (err: Error) => void;\n timer: NodeJS.Timeout;\n method: string;\n}\n\nconst DEFAULTS = {\n reconnectDelayMs: 1000,\n maxReconnectDelayMs: 30_000,\n rotationMs: 23 * 60 * 60 * 1000,\n staleMs: 0,\n requestTimeoutMs: 10_000,\n};\n\nexport class WsConnection extends EventEmitter {\n protected readonly wsOptions: WsConnectionOptions;\n\n private state: WsConnectionState = 'IDLE';\n private activeSocket: WebSocket | null = null;\n private pendingSocket: WebSocket | null = null;\n private tokenCounter = 0;\n private activeToken = 0;\n private pendingToken = 0;\n private reconnectAttempt = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private rotationTimer: NodeJS.Timeout | null = null;\n private livenessTimer: NodeJS.Timeout | null = null;\n private lastActivityMs = 0;\n private closedByUser = false;\n private readonly acks = new Map<number, AckHandler>();\n private nextRequestId = 1;\n private readonly events?: EventBus;\n protected readonly label: string;\n\n constructor(options: WsConnectionOptions) {\n super();\n this.wsOptions = options;\n this.label = options.name ?? 'ws';\n this.events = options.events;\n this.setMaxListeners(0);\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n getState(): WsConnectionState {\n return this.state;\n }\n\n /** Public connection label (for pools, registries and stats snapshots). */\n get name(): string {\n return this.label;\n }\n\n isOpen(): boolean {\n return this.state === 'OPEN' && this.activeSocket?.readyState === WebSocket.OPEN;\n }\n\n /** Start the connection (no-op unless IDLE/CLOSED). */\n connect(): void {\n if (this.state === 'IDLE' || this.state === 'CLOSED') {\n this.closedByUser = false;\n this.reconnectAttempt = 0;\n this.openPrimarySocket('connect');\n }\n // Any other state (CONNECTING / OPEN / RECONNECTING) is already progressing;\n // opening a second socket here is the old duplicate-connection bug.\n }\n\n /**\n * User-initiated close. Cleans up every timer and socket; no reconnect will\n * be scheduled. Safe to call repeatedly and from any state.\n */\n close(): void {\n if (this.state === 'CLOSED') return;\n this.closedByUser = true;\n this.transition('CLOSING');\n this.clearTimers();\n this.failAllAcks(new Error(`[${this.label}] connection closed`));\n this.retireSocket(this.activeSocket);\n this.retireSocket(this.pendingSocket);\n this.activeSocket = null;\n this.pendingSocket = null;\n this.activeToken = 0;\n this.pendingToken = 0;\n this.transition('CLOSED');\n this.emit('close', { initiatedBy: 'user' });\n this.emitEvent('ws.closed', { connection: this.label, initiatedBy: 'user' });\n this.onClosedByUser();\n }\n\n /** Subclass hook: user-initiated teardown completed. */\n protected onClosedByUser(): void {\n /* default: no-op */\n }\n\n /**\n * v3 platform hook: trigger a zero-gap rotation now (the same path the\n * internal 23h timer uses). Returns true when a rotation was started,\n * false when it is not applicable — not OPEN, or a replacement is already\n * in flight. Centralized renewal schedulers (RenewalController) call this\n * so rotation timing is observable and staggered pool-wide.\n */\n rotateNow(): boolean {\n if (this.state !== 'OPEN' || this.closedByUser) return false;\n if (this.pendingSocket) return false; // already rotating\n this.rotate();\n return true;\n }\n\n /**\n * Force an immediate replacement connection. Safe from any live state: the\n * current socket (if any) is retired as stale so its close event cannot\n * trigger a duplicate reconnect.\n */\n reconnect(): void {\n if (this.state === 'CLOSED') {\n this.connect();\n return;\n }\n if (this.closedByUser) return;\n this.clearTimers();\n this.reconnectAttempt = 0;\n this.retireSocket(this.pendingSocket);\n this.pendingSocket = null;\n this.pendingToken = 0;\n this.retireSocket(this.activeSocket);\n this.activeSocket = null;\n this.activeToken = 0;\n this.openPrimarySocket('reconnect');\n }\n\n resetReconnectAttempts(): void {\n this.reconnectAttempt = 0;\n }\n\n getReconnectAttempt(): number {\n return this.reconnectAttempt;\n }\n\n /** Resolves once the connection reaches OPEN; rejects on terminal failure. */\n waitForOpen(timeoutMs = 30_000): Promise<void> {\n if (this.isOpen()) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`[${this.label}] timed out waiting for OPEN (state=${this.state})`));\n }, timeoutMs);\n const onState = (to: WsConnectionState) => {\n if (to === 'OPEN') {\n cleanup();\n resolve();\n } else if (to === 'CLOSED') {\n cleanup();\n reject(new Error(`[${this.label}] connection closed before OPEN`));\n }\n };\n const onUserClose = (): void => {\n cleanup();\n reject(new Error(`[${this.label}] connection closed`));\n };\n const cleanup = (): void => {\n clearTimeout(timer);\n this.off('state', onState);\n this.off('close', onUserClose);\n };\n this.on('state', onState);\n this.on('close', onUserClose);\n });\n }\n\n /**\n * Send a raw string when OPEN. Returns false (and queues nothing) if the\n * connection is not currently open — callers decide whether to retry.\n */\n sendRaw(data: string): boolean {\n if (!this.isOpen() || !this.activeSocket) return false;\n this.activeSocket.send(data);\n return true;\n }\n\n /**\n * Send a control request (`SUBSCRIBE`, `UNSUBSCRIBE`, `LIST_SUBSCRIPTIONS`)\n * and await its ack envelope `{result, id}`. Replies are parsed with\n * large-integer preservation.\n */\n request(method: string, params?: string[]): Promise<unknown> {\n if (!this.isOpen()) {\n return Promise.reject(\n new Error(`[${this.label}] not OPEN (state=${this.state}); cannot ${method}`),\n );\n }\n const id = this.nextRequestId++;\n const timeoutMs = this.wsOptions.requestTimeoutMs ?? DEFAULTS.requestTimeoutMs;\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.acks.delete(id);\n reject(new Error(`[${this.label}] ${method} ack timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n this.acks.set(id, { resolve, reject, timer, method });\n this.sendRaw(JSON.stringify({ method, params: params ?? [], id }));\n });\n }\n\n /** Milliseconds since the last inbound frame (data, ping or pong). */\n msSinceLastActivity(): number {\n return this.lastActivityMs === 0 ? Number.POSITIVE_INFINITY : Date.now() - this.lastActivityMs;\n }\n\n // ---------------------------------------------------------------------------\n // Socket plumbing\n // ---------------------------------------------------------------------------\n\n private openPrimarySocket(reason: 'connect' | 'reconnect'): void {\n const url = this.wsOptions.buildUrl();\n if (url === null) {\n this.emit('error', new Error(`[${this.label}] no URL available (missing credentials?)`));\n this.emitEvent('ws.connect.failed', { reason, cause: 'no-url' });\n return;\n }\n const token = ++this.tokenCounter;\n this.activeToken = token;\n this.pendingToken = 0;\n const socket = this.createSocket(url, token, { purpose: reason });\n this.activeSocket = socket;\n this.transition('CONNECTING');\n this.emitEvent('ws.connecting', { reason, token, url: redactUrl(url) });\n }\n\n private createSocket(\n url: string,\n token: number,\n opts: { purpose: 'connect' | 'reconnect' | 'rotation' },\n ): WebSocket {\n const factory = this.wsOptions.socketFactory ?? ((u: string) => new WebSocket(u));\n const socket = factory(url);\n\n const isAuthorized = (): boolean =>\n token === this.activeToken || token === this.pendingToken;\n\n socket.on('open', () => {\n if (!isAuthorized()) return;\n if (opts.purpose === 'rotation') {\n // Rotation succeeded: swap traffic to the replacement, retire the old.\n this.retireSocket(this.activeSocket);\n this.activeSocket = socket;\n this.activeToken = token;\n this.pendingToken = 0;\n this.pendingSocket = null;\n this.reconnectAttempt = 0;\n this.lastActivityMs = Date.now();\n this.transition('OPEN');\n this.emit('rotated');\n this.emitEvent('ws.rotated', { connection: this.label });\n this.startRotationTimer();\n this.startLivenessTimer();\n return;\n }\n\n this.activeSocket = socket;\n this.activeToken = token;\n this.pendingToken = 0;\n this.pendingSocket = null;\n this.reconnectAttempt = 0;\n this.lastActivityMs = Date.now();\n this.transition('OPEN');\n this.emit('open');\n this.emitEvent('ws.open', { connection: this.label, token, reason: opts.purpose });\n this.startRotationTimer();\n this.startLivenessTimer();\n });\n\n const noteActivity = (): void => {\n if (!isAuthorized()) return;\n this.lastActivityMs = Date.now();\n };\n socket.on('message', (raw: unknown) => {\n if (!isAuthorized()) return;\n noteActivity();\n const text = typeof raw === 'string' ? raw : (raw as { toString(): string }).toString();\n this.handleRawMessage(text);\n });\n // Protocol-level pings/pongs also prove the connection is alive.\n socket.on('ping', noteActivity);\n socket.on('pong', noteActivity);\n\n socket.on('error', (err: Error) => {\n if (!isAuthorized()) return;\n this.emit('error', err);\n this.emitEvent('ws.error', {\n connection: this.label,\n phase: opts.purpose,\n message: err.message,\n });\n // 'ws' emits 'close' after 'error'; reconnection is driven from 'close'.\n });\n\n socket.on('close', (code: number, reason: Buffer) => {\n if (token === this.pendingToken) {\n // Failed rotation replacement: the active connection may still be fine.\n // Keep it carrying traffic and schedule another rotation attempt.\n this.pendingToken = 0;\n this.pendingSocket = null;\n this.emitEvent('ws.rotation.failed', { code, reason: reason.toString() });\n this.emit('rotationFailed', { code, reason: reason.toString() });\n this.startRotationTimer();\n return;\n }\n if (token !== this.activeToken) return; // retired socket: ignore\n\n this.emitEvent('ws.closed', {\n connection: this.label,\n code,\n reason: reason.toString(),\n });\n if (this.closedByUser) {\n this.transition('CLOSED');\n this.emit('close', { code, reason: reason.toString(), initiatedBy: 'user' });\n return;\n }\n this.emit('close', { code, reason: reason.toString() });\n this.scheduleReconnect();\n });\n\n return socket;\n }\n\n /**\n * Proactive 24h-safe renewal: open a replacement while the old connection\n * still carries traffic, then switch over without a data gap. The old socket\n * stays authorized until the replacement is fully open.\n */\n private rotate(): void {\n const url = this.wsOptions.buildUrl();\n if (url === null) {\n this.emitEvent('ws.rotation.skipped', { cause: 'no-url' });\n return;\n }\n this.emitEvent('ws.rotation.started', { connection: this.label });\n const token = ++this.tokenCounter;\n this.pendingToken = token;\n this.pendingSocket = this.createSocket(url, token, { purpose: 'rotation' });\n }\n\n /**\n * Marks a socket as retired: future events from it are ignored via the token\n * guards. Closes gracefully, terminating after a grace period so a hung TCP\n * close cannot pin the event loop open. Termination is defensive: the `ws`\n * library throws when terminating a socket that never finished establishing\n * (e.g. close() racing an in-flight connect) — that throw is noise here.\n */\n private retireSocket(socket: WebSocket | null): void {\n if (!socket) return;\n removeAllListeners(socket);\n // Terminating a socket that never finished establishing asynchronously\n // emits 'error' (\"WebSocket was closed before the connection was\n // established\") — with its listeners just removed, that would escape as\n // an uncaught exception. Attach a swallow-listener first.\n socket.on('error', () => {\n /* retired socket: teardown noise */\n });\n if (socket.readyState === WebSocket.OPEN) {\n socket.close(1000, 'client-rotating');\n const forced = setTimeout(() => {\n if (socket.readyState !== WebSocket.CLOSED) {\n try {\n socket.terminate();\n } catch {\n /* already gone */\n }\n }\n }, 5_000);\n forced.unref?.();\n } else if (\n socket.readyState === WebSocket.CONNECTING ||\n socket.readyState === WebSocket.CLOSING\n ) {\n try {\n socket.terminate();\n } catch {\n /* the ws library throws on terminate-before-established; the socket is dead either way */\n }\n }\n }\n\n private scheduleReconnect(): void {\n if (this.state === 'CLOSED' || this.closedByUser) return;\n if (this.reconnectTimer) return; // already scheduled\n\n this.clearTimers();\n const computeDelay = this.wsOptions.computeReconnectDelay;\n let delay: number;\n if (computeDelay) {\n delay = Math.max(0, computeDelay(this.reconnectAttempt));\n } else {\n const base = this.wsOptions.reconnectDelayMs ?? DEFAULTS.reconnectDelayMs;\n const max = this.wsOptions.maxReconnectDelayMs ?? DEFAULTS.maxReconnectDelayMs;\n delay = Math.min(base * 2 ** this.reconnectAttempt, max);\n }\n this.reconnectAttempt += 1;\n this.transition('RECONNECTING');\n this.emit('reconnecting', this.reconnectAttempt, delay);\n this.emitEvent('ws.reconnecting', {\n connection: this.label,\n attempt: this.reconnectAttempt,\n delayMs: delay,\n });\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.closedByUser && this.state !== 'CLOSED') {\n this.openPrimarySocket('reconnect');\n }\n }, delay);\n this.reconnectTimer.unref?.();\n }\n\n private startRotationTimer(): void {\n const rotationMs = this.wsOptions.rotationMs ?? DEFAULTS.rotationMs;\n if (rotationMs <= 0) return;\n this.rotationTimer = setTimeout(() => {\n this.rotationTimer = null;\n if (this.state !== 'OPEN' || this.closedByUser) return;\n if (this.pendingSocket) return; // rotation already in flight\n this.rotate();\n }, rotationMs);\n this.rotationTimer.unref?.();\n }\n\n private startLivenessTimer(): void {\n const staleMs = this.wsOptions.staleMs ?? DEFAULTS.staleMs;\n if (staleMs <= 0) return;\n this.livenessTimer = setInterval(() => {\n if (this.state !== 'OPEN') return;\n if (Date.now() - this.lastActivityMs > staleMs) {\n const quietMs = Date.now() - this.lastActivityMs;\n this.emitEvent('ws.stale', { connection: this.label, quietMs, staleMs });\n this.emit('stale', quietMs);\n // Terminate (not graceful close): don't wait on a dead network path.\n this.reconnect();\n }\n }, Math.max(Math.min(staleMs / 2, 30_000), 1_000));\n this.livenessTimer.unref?.();\n }\n\n private clearTimers(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.rotationTimer) {\n clearTimeout(this.rotationTimer);\n this.rotationTimer = null;\n }\n if (this.livenessTimer) {\n clearInterval(this.livenessTimer);\n this.livenessTimer = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Message handling hooks\n // ---------------------------------------------------------------------------\n\n /** Subclass hook: receive each inbound frame as raw text. */\n protected handleRawMessage(text: string): void {\n this.emit('rawMessage', text);\n }\n\n /**\n * Parse + dispatch a control ack envelope `{result, id}`. Returns true when\n * the frame was an ack consumed by a pending `request()` call.\n */\n protected dispatchAck(parsed: unknown): boolean {\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n !('stream' in (parsed as Record<string, unknown>)) &&\n 'id' in (parsed as Record<string, unknown>) &&\n 'result' in (parsed as Record<string, unknown>)\n ) {\n const { id, result, error } = parsed as {\n id: number;\n result?: unknown;\n error?: unknown;\n };\n const handler = this.acks.get(id);\n if (handler) {\n this.acks.delete(id);\n clearTimeout(handler.timer);\n if (error) {\n handler.reject(\n new Error(`[${this.label}] ${handler.method} rejected: ${JSON.stringify(error)}`),\n );\n } else {\n handler.resolve(result);\n }\n return true;\n }\n }\n return false;\n }\n\n private failAllAcks(err: Error): void {\n for (const handler of this.acks.values()) {\n clearTimeout(handler.timer);\n handler.reject(err);\n }\n this.acks.clear();\n }\n\n /** Lossless parse helper for subclasses. */\n protected parseFrame(text: string): unknown {\n try {\n return parseJsonLossless(text);\n } catch {\n return undefined;\n }\n }\n\n // ---------------------------------------------------------------------------\n\n private transition(to: WsConnectionState): void {\n const from = this.state;\n if (from === to) return;\n this.state = to;\n this.emit('state', to, from);\n this.emitEvent('ws.state', { from, to, connection: this.label });\n }\n\n protected emitEvent(name: string, payload: Record<string, unknown>): void {\n if (!this.events) return;\n this.events.scoped(`ws:${this.label}`).emit(name, payload);\n }\n}\n\nfunction removeAllListeners(socket: WebSocket): void {\n socket.removeAllListeners('open');\n socket.removeAllListeners('message');\n socket.removeAllListeners('ping');\n socket.removeAllListeners('pong');\n socket.removeAllListeners('error');\n socket.removeAllListeners('close');\n}\n\nfunction redactUrl(url: string): string {\n // Hide listenKey path segments from logs/events.\n return url.replace(/\\/[0-9a-f-]{20,}/i, '/<redacted>');\n}\n","/**\n * Lossless JSON parsing for Binance payloads.\n *\n * `JSON.parse` coerces every integer to a JS double, silently corrupting values\n * above Number.MAX_SAFE_INTEGER (2^53 - 1). Binance identifiers (orderId,\n * tradeId, updateId, transaction IDs) are the classic casualties: two distinct\n * exchange IDs can compare equal after parsing.\n *\n * `parseJsonLossless` pre-passes the raw text and quotes any integer literal\n * whose magnitude exceeds the safe range, so oversized IDs surface as decimal\n * *strings* instead of silently-corrupted numbers. Values within the safe range\n * keep their original type, which keeps all existing Zod schemas valid.\n */\n\nconst MAX_SAFE_BIG = 9007199254740991n; // 2^53 - 1\nconst MIN_SAFE_BIG = -9007199254740991n;\n\n/**\n * Matches integer JSON literals (object values *and* array elements, since\n * Binance sends klines as arrays) with 16+ digits — the conservative pre-filter;\n * the precise safe-range check is done with BigInt on the candidate afterwards.\n */\nconst LARGE_INT_PATTERN = /([:,\\[]\\s*)(-?\\d{16,})(\\s*[},\\]])/g;\n\nexport function parseJsonLossless(text: string): unknown {\n const patched = text.replace(LARGE_INT_PATTERN, (match, prefix, digits, tail) => {\n // Compare with BigInt: Number(digits) may itself round, which would make an\n // unsafe literal deceptively \"safe\" (e.g. 10000000000000001 -> 1e16).\n const numeric = BigInt(digits);\n if (numeric <= MAX_SAFE_BIG && numeric >= MIN_SAFE_BIG) return match;\n return `${prefix}\"${digits}\"${tail}`;\n });\n return JSON.parse(patched);\n}\n\n/** Type-safe wrapper for callers that know the payload shape. */\nexport function parseJsonLosslessAs<T>(text: string): T {\n return parseJsonLossless(text) as T;\n}\n\n/**\n * Deep-walks a parsed payload converting long integer *strings* back into\n * numbers only when they are safe — useful when the caller wants uniform\n * `number` types for fields that are practically always small.\n */\nexport function normalizeIntStrings<T>(value: T): T {\n if (typeof value === 'string' && /^-?\\d{16,}$/.test(value)) {\n const numeric = Number(value);\n if (Number.isSafeInteger(numeric)) return numeric as unknown as T;\n return value;\n }\n if (Array.isArray(value)) return value.map((item) => normalizeIntStrings(item)) as unknown as T;\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n out[key] = normalizeIntStrings(item);\n }\n return out as unknown as T;\n }\n return value;\n}\n","import type { EventBus } from '../core/events.js';\nimport { parseWsPayload, type WsStreamPayload } from '../types/ws.types.js';\nimport { WsConnection, type WsConnectionOptions, type WsConnectionState } from './WsConnection.js';\n\nexport { type WsConnectionState };\n\nexport interface BaseWSOptions extends Omit<WsConnectionOptions, 'buildUrl'> {\n baseStreamUrl: string;\n /** Initial stream names, applied on first connect. */\n streams?: string[];\n}\n\ninterface CombinedStreamMessage {\n stream?: string;\n data?: unknown;\n result?: unknown;\n id?: number;\n}\n\ninterface ConfirmationWaiter {\n streams: Set<string>;\n resolve: () => void;\n reject: (err: Error) => void;\n timer: NodeJS.Timeout;\n}\n\n/**\n * Combined-stream market data websocket: the SDK's public market surface.\n *\n * Built on {@link WsConnection}, which supplies the lifecycle state machine,\n * race-free reconnection and proactive 24h-safe rotation. This class adds the\n * Binance live-subscription protocol on top:\n *\n * - `subscribe()` returns a Promise that resolves only after the server has\n * *acknowledged* the subscription (previously fire-and-forget, so strict\n * callers could silently miss data).\n * - After every (re)connect and rotation the live subscription set is\n * verified with `LIST_SUBSCRIPTIONS` and repaired — reconnect storms no\n * longer leave silently-dropped streams.\n * - Every message is additionally re-emitted as `raw` (losslessly parsed with\n * large-integer preservation), so unknown or new Binance stream types can be\n * consumed without waiting for a typed schema.\n */\nexport class BaseWS extends WsConnection {\n private readonly baseStreamUrl: string;\n /** Desired subscription state — what the caller asked for. */\n private readonly desired = new Set<string>();\n /** Confirmed on the *current* connection; reset on every reconnect/rotation. */\n private readonly confirmed = new Set<string>();\n private resyncPromise: Promise<void> | null = null;\n private readonly confirmationWaiters: ConfirmationWaiter[] = [];\n\n constructor(options: BaseWSOptions) {\n const { baseStreamUrl, streams, ...connectionOptions } = options;\n super({\n ...connectionOptions,\n name: connectionOptions.name ?? 'market',\n buildUrl: () => this.buildStreamUrl(),\n });\n this.baseStreamUrl = baseStreamUrl;\n for (const stream of streams ?? []) this.desired.add(stream);\n\n // Re-establish subscriptions after every successful (re)connect/rotation.\n const reestablish = (): void => {\n this.confirmed.clear();\n void this.resynchronize();\n };\n this.on('open', reestablish);\n this.on('rotated', reestablish);\n }\n\n /**\n * Subscribe to streams. The returned promise resolves once the server has\n * acknowledged the streams on the current connection. When the connection is\n * down, the streams are queued as desired state and the promise resolves once\n * a connection opens and confirms them (use {@link waitForOpen} to await the\n * connection itself). Legacy callers that ignore the return value keep\n * working unchanged.\n */\n subscribe(streams: string[]): Promise<void> {\n // Fire-and-forget guard: legacy callers ignore this promise, so a rejection\n // here must never become an unhandled process crash (Node terminates on\n // unhandled rejections by default). The guard marks the promise handled;\n // awaiting callers still observe the rejection, and the failure surfaces as\n // a `ws.subscribe.rejected` event instead of a crashed process.\n return this.guardFireAndForget(this.subscribeConfirmed(streams), 'ws.subscribe.rejected');\n }\n\n private async subscribeConfirmed(streams: string[]): Promise<void> {\n if (!streams.length) return;\n const wanted = streams.filter((stream) => !this.desired.has(stream));\n for (const stream of streams) this.desired.add(stream);\n\n if (this.getState() === 'IDLE' || this.getState() === 'CLOSED') {\n this.connect();\n }\n\n if (this.isOpen()) {\n const pending = wanted.filter((stream) => !this.confirmed.has(stream));\n if (pending.length) await this.sendSubscribe(pending);\n this.settleConfirmationWaiters();\n return;\n }\n\n // Connecting/reconnecting: resolve when the post-open resync confirms.\n await new Promise<void>((resolve, reject) => {\n const timeoutMs = this.wsOptions.requestTimeoutMs ?? 30_000;\n const waiter: ConfirmationWaiter = {\n streams: new Set(streams),\n resolve: () => {\n clearTimeout(timer);\n this.removeWaiter(waiter);\n resolve();\n },\n reject: (err: Error) => {\n clearTimeout(timer);\n this.removeWaiter(waiter);\n reject(err);\n },\n timer: null as unknown as NodeJS.Timeout,\n };\n const timer = setTimeout(() => {\n waiter.reject(\n new Error(`[${this.label}] subscribe not confirmed within ${timeoutMs}ms`),\n );\n }, timeoutMs);\n waiter.timer = timer;\n this.confirmationWaiters.push(waiter);\n });\n }\n\n /**\n * Unsubscribe from streams. Resolves once the server acks the removal when\n * connected; when not connected the streams are simply dropped from the\n * desired state, so they will not be re-established on the next reconnect.\n */\n unsubscribe(streams: string[]): Promise<void> {\n return this.guardFireAndForget(this.unsubscribeConfirmed(streams), 'ws.unsubscribe.rejected');\n }\n\n private async unsubscribeConfirmed(streams: string[]): Promise<void> {\n if (!streams.length) return;\n for (const stream of streams) {\n this.desired.delete(stream);\n this.confirmed.delete(stream);\n }\n if (!this.isOpen()) return;\n try {\n await this.request('UNSUBSCRIBE', streams);\n this.emitEvent('ws.unsubscribed', { streams });\n } catch (err) {\n // Desired state is already updated (the source of truth for the next\n // resync); surface the ack failure to this caller only.\n this.emitEvent('ws.unsubscribe.rejected', { streams, message: (err as Error).message });\n throw err;\n }\n }\n\n /** Desired stream names (copy). */\n getSubscribedStreams(): string[] {\n return [...this.desired];\n }\n\n /** Streams the server confirmed on the current connection. */\n getConfirmedStreams(): string[] {\n return [...this.confirmed];\n }\n\n /** Ask the server which streams are actually active on this connection. */\n async listServerSubscriptions(): Promise<string[]> {\n const result = await this.request('LIST_SUBSCRIPTIONS');\n return Array.isArray(result) ? (result as string[]) : [];\n }\n\n /**\n * Bring the live connection's subscriptions in line with the desired set.\n * Runs automatically after every open/rotation; exposed for manual repair.\n */\n resynchronize(): Promise<void> {\n if (!this.isOpen()) return Promise.resolve();\n if (this.resyncPromise) return this.resyncPromise;\n\n this.resyncPromise = this.doResynchronize().finally(() => {\n this.resyncPromise = null;\n });\n return this.resyncPromise;\n }\n\n private async doResynchronize(): Promise<void> {\n let server: string[] = [];\n try {\n server = await this.listServerSubscriptions();\n } catch {\n // LIST_SUBSCRIPTIONS unavailable: fall back to blind SUBSCRIBE below.\n }\n const serverSet = new Set(server);\n const missing = [...this.desired].filter((stream) => !serverSet.has(stream));\n const extra = [...serverSet].filter((stream) => !this.desired.has(stream));\n\n if (missing.length) {\n try {\n await this.request('SUBSCRIBE', missing);\n this.emitEvent('ws.subscribed', { streams: missing, via: 'resync' });\n } catch {\n /* waiters time out; resync is best-effort */\n }\n }\n if (extra.length) {\n try {\n await this.request('UNSUBSCRIBE', extra);\n this.emitEvent('ws.unsubscribed', { streams: extra, via: 'resync' });\n } catch {\n /* best-effort */\n }\n }\n\n this.confirmed.clear();\n for (const stream of this.desired) {\n // Streams the server already had, plus anything we just (re)subscribed.\n if (serverSet.has(stream) || missing.includes(stream)) this.confirmed.add(stream);\n }\n this.settleConfirmationWaiters();\n this.emitEvent('ws.resynced', {\n desired: this.desired.size,\n server: server.length,\n repaired: missing.length,\n removed: extra.length,\n });\n }\n\n private async sendSubscribe(streams: string[]): Promise<void> {\n await this.request('SUBSCRIBE', streams);\n for (const stream of streams) this.confirmed.add(stream);\n this.emitEvent('ws.subscribed', { streams });\n this.settleConfirmationWaiters();\n }\n\n private settleConfirmationWaiters(): void {\n for (const waiter of [...this.confirmationWaiters]) {\n const satisfied = [...waiter.streams].every(\n (stream) => this.confirmed.has(stream) || !this.desired.has(stream),\n );\n if (satisfied) waiter.resolve();\n }\n }\n\n private removeWaiter(waiter: ConfirmationWaiter): void {\n const index = this.confirmationWaiters.indexOf(waiter);\n if (index >= 0) this.confirmationWaiters.splice(index, 1);\n }\n\n /**\n * Attach an internal no-op catch to the promise so a rejection can never be\n * *unhandled* (which terminates the process), then return the original\n * promise: awaiting callers still see the rejection. The failure is\n * republished as an observability event so it is not silently lost.\n */\n private guardFireAndForget(promise: Promise<void>, eventName: string): Promise<void> {\n void promise.catch((err: Error) => {\n this.emitEvent(eventName, { connection: this.label, message: err.message });\n });\n return promise;\n }\n\n private buildStreamUrl(): string | null {\n if (!this.desired.size) {\n // Bare connection (no streams yet) — the server accepts this and control\n // requests still work; streams arrive via SUBSCRIBE.\n return this.baseStreamUrl;\n }\n return `${this.baseStreamUrl}?streams=${[...this.desired].join('/')}`;\n }\n\n protected override handleRawMessage(text: string): void {\n const parsed = this.parseFrame(text) as CombinedStreamMessage | undefined;\n if (parsed === undefined) return;\n\n if (this.dispatchAck(parsed)) return;\n\n if (typeof parsed.stream === 'string' && parsed.data !== undefined) {\n const stream = parsed.stream;\n const raw = parsed.data;\n // Lossless view of every message — including stream types the typed\n // parser does not yet know about.\n this.emit('raw', stream, raw);\n try {\n const payload: WsStreamPayload = parseWsPayload(stream, raw);\n this.emit('message', stream, payload);\n this.emit(stream, payload);\n } catch (err) {\n this.emit('error', err);\n }\n }\n }\n\n /** Fail queued subscribers when the connection definitively goes down. */\n protected override onClosedByUser(): void {\n for (const waiter of [...this.confirmationWaiters]) {\n waiter.reject(new Error(`[${this.label}] connection closed before subscribe confirmed`));\n }\n this.confirmationWaiters.length = 0;\n }\n}\n","import { BaseWS, type BaseWSOptions } from './BaseWS.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport type ContractType = 'perpetual' | 'current_quarter' | 'next_quarter';\nexport type MarkPriceSpeed = '1s' | '3s';\n\nexport class FuturesMarketWS extends BaseWS {\n constructor(baseStreamUrl = 'wss://fstream.binance.com/stream', options?: Omit<BaseWSOptions, 'baseStreamUrl'>) {\n super({ baseStreamUrl, ...options, name: options?.name ?? 'futuresMarket' });\n }\n\n kline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@kline_${interval}`;\n }\n\n continuousKline(symbol: string, contractType: ContractType, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@continuousKline_${contractType}_${interval}`;\n }\n\n indexPriceKline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@indexPriceKline_${interval}`;\n }\n\n markPriceKline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@markPriceKline_${interval}`;\n }\n\n aggTrade(symbol: string): string {\n return `${symbol.toLowerCase()}@aggTrade`;\n }\n\n trade(symbol: string): string {\n return `${symbol.toLowerCase()}@trade`;\n }\n\n depth(symbol: string, level: 5 | 10 | 20 = 20): string {\n return `${symbol.toLowerCase()}@depth${level}`;\n }\n\n depthDiff(symbol: string): string {\n return `${symbol.toLowerCase()}@depth`;\n }\n\n depthDiffSpeed(symbol: string, updateSpeed: '100ms' | '500ms'): string {\n return `${symbol.toLowerCase()}@depth@${updateSpeed}`;\n }\n\n ticker(symbol: string): string {\n return `${symbol.toLowerCase()}@ticker`;\n }\n\n rollingWindowTicker(symbol: string, window: '1h' | '4h' | '1d' = '1h'): string {\n return `${symbol.toLowerCase()}@ticker_${window}`;\n }\n\n allRollingWindowTickers(window: '1h' | '4h' | '1d' = '1h'): string {\n return `!ticker_${window}@arr`;\n }\n\n allMarketTickers(): string {\n return '!ticker@arr';\n }\n\n allBookTickers(): string {\n return '!bookTicker';\n }\n\n miniTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@miniTicker`;\n }\n\n allMiniTickers(): string {\n return '!miniTicker@arr';\n }\n\n markPrice(symbol: string, updateSpeed: MarkPriceSpeed = '3s'): string {\n return `${symbol.toLowerCase()}@markPrice@${updateSpeed}`;\n }\n\n allMarkPrices(): string {\n return '!markPrice@arr';\n }\n\n bookTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@bookTicker`;\n }\n\n liquidationOrder(symbol: string): string {\n return `${symbol.toLowerCase()}@forceOrder`;\n }\n\n allLiquidationOrders(): string {\n return '!forceOrder@arr';\n }\n\n compositeIndex(symbol: string): string {\n return `${symbol.toLowerCase()}@compositeIndex`;\n }\n\n assetIndex(symbol: string): string {\n return `${symbol.toLowerCase()}@assetIndex`;\n }\n\n allAssetIndices(): string {\n return '!assetIndex@arr';\n }\n}\n","import { BaseWS, type BaseWSOptions } from './BaseWS.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport class SpotMarketWS extends BaseWS {\n constructor(baseStreamUrl = 'wss://stream.binance.com:9443/stream', options?: Omit<BaseWSOptions, 'baseStreamUrl'>) {\n super({ baseStreamUrl, ...options, name: options?.name ?? 'spotMarket' });\n }\n\n kline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@kline_${interval}`;\n }\n\n aggTrade(symbol: string): string {\n return `${symbol.toLowerCase()}@aggTrade`;\n }\n\n trade(symbol: string): string {\n return `${symbol.toLowerCase()}@trade`;\n }\n\n depth(symbol: string, level: 5 | 10 | 20 = 20): string {\n return `${symbol.toLowerCase()}@depth${level}`;\n }\n\n depthDiff(symbol: string): string {\n return `${symbol.toLowerCase()}@depth`;\n }\n\n depthDiffSpeed(symbol: string, updateSpeed: '100ms'): string {\n return `${symbol.toLowerCase()}@depth@${updateSpeed}`;\n }\n\n avgPrice(symbol: string): string {\n return `${symbol.toLowerCase()}@avgPrice`;\n }\n\n ticker(symbol: string): string {\n return `${symbol.toLowerCase()}@ticker`;\n }\n\n rollingWindowTicker(\n symbol: string,\n window: '1h' | '4h' | '1d' | '7d' | '30d' = '1h',\n ): string {\n return `${symbol.toLowerCase()}@ticker_${window}`;\n }\n\n allRollingWindowTickers(window: '1h' | '4h' | '1d' | '7d' | '30d' = '1h'): string {\n return `!ticker_${window}@arr`;\n }\n\n miniTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@miniTicker`;\n }\n\n allMarketTickers(): string {\n return '!ticker@arr';\n }\n\n allMiniTickers(): string {\n return '!miniTicker@arr';\n }\n\n bookTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@bookTicker`;\n }\n\n allBookTickers(): string {\n return '!bookTicker';\n }\n}\n","import { BaseWS, type BaseWSOptions } from './BaseWS.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport type CoinMContractType = 'perpetual' | 'current_quarter' | 'next_quarter';\nexport type CoinMMarkPriceSpeed = '1s' | '3s';\n\n/**\n * COIN-M stream names mirror USD-M's naming scheme exactly, just against `dstream.binance.com`\n * and inverse-contract symbols/pairs (e.g. `btcusd_perp`, `btcusd`).\n */\nexport class CoinMMarketWS extends BaseWS {\n constructor(baseStreamUrl = 'wss://dstream.binance.com/stream', options?: Omit<BaseWSOptions, 'baseStreamUrl'>) {\n super({ baseStreamUrl, ...options, name: options?.name ?? 'coinmMarket' });\n }\n\n kline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@kline_${interval}`;\n }\n\n continuousKline(pair: string, contractType: CoinMContractType, interval: KlineInterval): string {\n return `${pair.toLowerCase()}_${contractType}@continuousKline_${interval}`;\n }\n\n indexPriceKline(pair: string, interval: KlineInterval): string {\n return `${pair.toLowerCase()}@indexPriceKline_${interval}`;\n }\n\n markPriceKline(symbol: string, interval: KlineInterval): string {\n return `${symbol.toLowerCase()}@markPriceKline_${interval}`;\n }\n\n aggTrade(symbol: string): string {\n return `${symbol.toLowerCase()}@aggTrade`;\n }\n\n trade(symbol: string): string {\n return `${symbol.toLowerCase()}@trade`;\n }\n\n depth(symbol: string, level: 5 | 10 | 20 = 20): string {\n return `${symbol.toLowerCase()}@depth${level}`;\n }\n\n depthDiff(symbol: string): string {\n return `${symbol.toLowerCase()}@depth`;\n }\n\n depthDiffSpeed(symbol: string, updateSpeed: '100ms' | '250ms' | '500ms'): string {\n return `${symbol.toLowerCase()}@depth@${updateSpeed}`;\n }\n\n ticker(symbol: string): string {\n return `${symbol.toLowerCase()}@ticker`;\n }\n\n allMarketTickers(): string {\n return '!ticker@arr';\n }\n\n miniTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@miniTicker`;\n }\n\n allMiniTickers(): string {\n return '!miniTicker@arr';\n }\n\n bookTicker(symbol: string): string {\n return `${symbol.toLowerCase()}@bookTicker`;\n }\n\n allBookTickers(): string {\n return '!bookTicker';\n }\n\n markPrice(symbol: string, updateSpeed: CoinMMarkPriceSpeed = '3s'): string {\n return `${symbol.toLowerCase()}@markPrice@${updateSpeed}`;\n }\n\n markPriceForPair(pair: string, updateSpeed: CoinMMarkPriceSpeed = '3s'): string {\n return `${pair.toLowerCase()}@markPrice@${updateSpeed}`;\n }\n\n liquidationOrder(symbol: string): string {\n return `${symbol.toLowerCase()}@forceOrder`;\n }\n\n allLiquidationOrders(): string {\n return '!forceOrder@arr';\n }\n}\n","import type { ReconnectPolicy } from './types.js';\n\n/**\n * Reconnect backoff strategies.\n *\n * v2's {@link WsConnection} hard-coded `min(base * 2^attempt, max)`. The\n * platform keeps that as the default shape but makes it pluggable and adds\n * jitter: a reconnect storm (e.g. Binance restarting an edge) hits every\n * connection at once, and deterministic identical delays make the herd\n * collide on every subsequent attempt too. *Equal jitter* — half fixed, half\n * random — keeps the first retry responsive while decorrelating the herd.\n */\n\nexport interface ExponentialBackoffOptions {\n /** First-attempt delay. Default 1000ms. */\n baseMs?: number;\n /** Ceiling. Default 30000ms. */\n maxMs?: number;\n /** Random decorrelation; defaults on. Disable for deterministic tests. */\n jitter?: boolean;\n /** Injectable randomness for tests; must return [0, 1). */\n random?: () => number;\n}\n\n/**\n * Exponential backoff with equal jitter (default policy):\n * `raw = min(base * 2^attempt, max)`; returned delay is\n * `raw/2 + random() * raw/2` — always ≥ raw/2, ≤ raw.\n */\nexport function exponentialBackoff(options: ExponentialBackoffOptions = {}): ReconnectPolicy {\n const base = options.baseMs ?? 1_000;\n const max = options.maxMs ?? 30_000;\n const jitter = options.jitter ?? true;\n const random = options.random ?? Math.random;\n return {\n delayForMs(attempt: number): number {\n const raw = Math.min(base * 2 ** Math.max(0, attempt), max);\n if (!jitter) return raw;\n return Math.floor(raw / 2 + random() * (raw / 2));\n },\n };\n}\n\n/** Constant delay — reconnects at a fixed cadence regardless of attempt. */\nexport function fixedBackoff(delayMs: number): ReconnectPolicy {\n const clamped = Math.max(0, delayMs);\n return { delayForMs: () => clamped };\n}\n\n/** Linear backoff: `base * (attempt + 1)`, capped at `maxMs`. */\nexport function linearBackoff(options: { baseMs?: number; maxMs?: number } = {}): ReconnectPolicy {\n const base = options.baseMs ?? 1_000;\n const max = options.maxMs ?? 30_000;\n return {\n delayForMs(attempt: number): number {\n return Math.min(base * (Math.max(0, attempt) + 1), max);\n },\n };\n}\n","/**\n * v3 WebSocket platform — shared types.\n *\n * Milestone 2 turns the per-class WS plumbing of v2 (each product namespace\n * building its own sockets, callers juggling raw EventEmitter surfaces) into\n * a platform: one place where connections are pooled, subscriptions are\n * refcounted objects, liveness/renewal are centrally scheduled, and the WS\n * API becomes a persistent promise-oriented client.\n */\n\n/** Market-stream families the platform pools. Grows with product migration. */\nexport type WsFamily = 'usdm' | 'spot' | 'coinm';\n\n/** Consumer-visible lifecycle of a {@link Subscription}. */\nexport type SubscriptionState = 'pending' | 'live' | 'closed';\n\n/** Per-family Binance connection limits (documented server behavior). */\nexport interface WsFamilyLimits {\n /** Maximum streams one combined-stream connection may carry. */\n maxStreamsPerConnection: number;\n /** Default cap on pooled connections for the family. */\n defaultMaxConnections: number;\n}\n\n/** Documented Binance limits per market-stream family. */\nexport const WS_FAMILY_LIMITS: Record<WsFamily, WsFamilyLimits> = {\n // USDⓈ-M combined streams: 200 per connection (Binance futures docs).\n usdm: { maxStreamsPerConnection: 200, defaultMaxConnections: 10 },\n // Spot combined streams: 1024 per connection (Binance spot docs).\n spot: { maxStreamsPerConnection: 1024, defaultMaxConnections: 4 },\n // COIN-M combined streams: 200 per connection (Binance coin-m docs).\n coinm: { maxStreamsPerConnection: 200, defaultMaxConnections: 10 },\n};\n\n/**\n * Platform-wide defaults. Renewal rotates connections at 23h (one hour before\n * Binance's 24h kill) with jitter so a pool never rotates in a herd; the\n * heartbeat treats a connection as dead after 10 minutes of total silence\n * (the server pings every 3 minutes, so three missed pings means the network\n * path is gone).\n */\nexport const WS_PLATFORM_DEFAULTS = {\n /** Proactive renewal window (Binance kills stream connections at 24h). */\n rotationMs: 23 * 60 * 60 * 1000,\n /** Per-connection renewal jitter window, decorrelates pool rotations. */\n renewalJitterMs: 10 * 60 * 1000,\n /** Pool-level liveness: silence threshold that triggers a reconnect. */\n staleMs: 10 * 60 * 1000,\n /** Heartbeat sampling interval. */\n heartbeatIntervalMs: 30_000,\n /** Renewals that may overlap across the whole platform. */\n maxConcurrentRenewals: 1,\n /** Default confirm timeout for subscriptions and WS API requests. */\n requestTimeoutMs: 10_000,\n /** Default reconnect backoff bounds. */\n reconnectBaseDelayMs: 1_000,\n reconnectMaxDelayMs: 30_000,\n} as const;\n\n/** Reconnect backoff strategy — see {@link ReconnectPolicy}. */\nexport interface ReconnectPolicy {\n /** Delay in milliseconds before reconnect attempt `attempt` (0-based). */\n delayForMs(attempt: number): number;\n}\n\n/** Structural state snapshot of one pooled connection. */\nexport interface WsConnectionStats {\n /** Pool-assigned name, e.g. `usdmMarket[0]`. */\n name: string;\n family: WsFamily;\n /** Raw connection state machine value. */\n state: string;\n /** Streams the caller asked for on this connection. */\n desiredStreams: number;\n /** Streams the server confirmed on the current socket. */\n confirmedStreams: number;\n /** Current reconnect backoff attempt, 0 while healthy. */\n reconnectAttempt: number;\n /** Milliseconds since the last inbound frame (data, ping or pong). */\n msSinceLastActivity: number;\n /** Epoch-ms of the next scheduled renewal, when centrally managed. */\n nextRenewalAt: number | null;\n}\n\n/** Aggregate platform snapshot — cheap, no I/O. */\nexport interface WsPlatformStats {\n families: Partial<Record<WsFamily, { connections: WsConnectionStats[]; activeStreams: number }>>;\n wsApi: { name: string; state: string; pendingRequests: number }[];\n}\n\n/** Options for family-scoped subscription calls. */\nexport interface SubscribeOptions {\n /** How long to wait for the server to confirm the streams. Default 10s. */\n confirmTimeoutMs?: number;\n}\n","import WebSocket from 'ws';\nimport type { EventBus } from '../../core/events.js';\nimport { BaseWS } from '../BaseWS.js';\nimport { FuturesMarketWS } from '../FuturesMarketWS.js';\nimport { SpotMarketWS } from '../SpotMarketWS.js';\nimport { CoinMMarketWS } from '../CoinMMarketWS.js';\nimport { exponentialBackoff } from './ReconnectPolicy.js';\nimport { WS_FAMILY_LIMITS, type ReconnectPolicy, type WsConnectionStats, type WsFamily } from './types.js';\n\n/** The pooled connection classes the platform already ships per family. */\nexport type PooledConnection = FuturesMarketWS | SpotMarketWS | CoinMMarketWS;\n\nexport interface FamilyConnectionPoolOptions {\n family: WsFamily;\n /** Combined-stream base URL for the family (from core.endpoints). */\n baseStreamUrl: string;\n /** Cap on pooled connections; default is the family's documented default. */\n maxConnections?: number;\n /** Reconnect backoff; default jittered exponential. */\n reconnectPolicy?: ReconnectPolicy;\n /** Observability bus. */\n events?: EventBus;\n /** Injectable WebSocket factory for tests. */\n socketFactory?: (url: string) => WebSocket;\n /** Control-request ack timeout. Default 10s. */\n requestTimeoutMs?: number;\n /**\n * Called exactly once per created connection so the platform can wire\n * heartbeat liveness and centralized renewal (the pool itself never\n * schedules timers beyond the connection's own reconnect backoff).\n */\n onConnection?: (name: string, conn: PooledConnection) => void;\n}\n\n/**\n * Capacity-aware connection pool for one market-stream family.\n *\n * Binance documents a per-connection stream ceiling (200 for futures, 1024\n * for spot); the pool packs streams onto the least-loaded connection with\n * capacity and opens another connection (up to `maxConnections`) when every\n * existing one is full — so a 500-stream workload spreads across 3 USDⓈ-M\n * connections automatically instead of failing server-side.\n *\n * Pool-managed connections:\n * - disable the built-in 23h rotation timer (renewal is centralized in\n * {@link RenewalController} for stagger and observability);\n * - disable the built-in liveness watchdog (pool-level {@link WsHeartbeat}\n * uses one timer for all connections);\n * - use the platform reconnect policy (jittered backoff, so a pool-wide\n * outage does not retry in lockstep).\n */\nexport class FamilyConnectionPool {\n readonly family: WsFamily;\n private readonly baseStreamUrl: string;\n private readonly maxConnections: number;\n private readonly maxStreamsPerConnection: number;\n private readonly events?: EventBus;\n private readonly socketFactory?: (url: string) => WebSocket;\n private readonly requestTimeoutMs: number;\n private readonly onConnection?: (name: string, conn: PooledConnection) => void;\n private readonly createConnection: () => PooledConnection;\n private readonly pool: PooledConnection[] = [];\n\n constructor(options: FamilyConnectionPoolOptions) {\n this.family = options.family;\n this.baseStreamUrl = options.baseStreamUrl;\n this.maxConnections = options.maxConnections ?? WS_FAMILY_LIMITS[options.family].defaultMaxConnections;\n this.maxStreamsPerConnection = WS_FAMILY_LIMITS[options.family].maxStreamsPerConnection;\n this.events = options.events;\n this.socketFactory = options.socketFactory;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 10_000;\n this.onConnection = options.onConnection;\n\n const reconnectPolicy = options.reconnectPolicy ?? exponentialBackoff();\n const family = options.family;\n const buildOptions = {\n events: options.events,\n socketFactory: options.socketFactory,\n requestTimeoutMs: this.requestTimeoutMs,\n // Platform-owned lifecycles:\n rotationMs: 0, // RenewalController schedules renewal\n staleMs: 0, // WsHeartbeat owns liveness\n computeReconnectDelay: (attempt: number) => reconnectPolicy.delayForMs(attempt),\n };\n\n switch (family) {\n case 'usdm':\n this.createConnection = () => new FuturesMarketWS(this.baseStreamUrl, { ...buildOptions, name: this.nextName() });\n break;\n case 'spot':\n this.createConnection = () => new SpotMarketWS(this.baseStreamUrl, { ...buildOptions, name: this.nextName() });\n break;\n case 'coinm':\n this.createConnection = () => new CoinMMarketWS(this.baseStreamUrl, { ...buildOptions, name: this.nextName() });\n break;\n }\n }\n\n /**\n * Pick the connection that should carry `newStreams` — the least-loaded one\n * with capacity, or a newly created one. Creates never perform I/O: the\n * returned connection connects lazily on first `subscribe()`.\n *\n * Throws when every connection is at the documented stream ceiling and the\n * `maxConnections` cap is reached — the caller is over the family's\n * capacity and must raise the cap.\n */\n selectOrCreate(newStreams: readonly string[]): PooledConnection {\n if (newStreams.length > 0) {\n let candidate: PooledConnection | null = null;\n let candidateLoad = Number.POSITIVE_INFINITY;\n for (const conn of this.pool) {\n const load = conn.getSubscribedStreams().length;\n if (load + newStreams.length <= this.maxStreamsPerConnection && load < candidateLoad) {\n candidate = conn;\n candidateLoad = load;\n }\n }\n if (candidate) return candidate;\n }\n if (this.pool.length >= this.maxConnections) {\n throw new Error(\n `[${this.family}] connection pool exhausted: ${this.pool.length}/${this.maxConnections} connections at ` +\n `${this.maxStreamsPerConnection} streams each. Raise the ws platform's maxConnections for this family.`,\n );\n }\n const conn = this.createConnection();\n this.pool.push(conn);\n this.onConnection?.(conn.name, conn);\n this.events?.emit('ws.pool.connection.created', {\n family: this.family,\n name: conn.name,\n connections: this.pool.length,\n });\n return conn;\n }\n\n /** Live pooled connections (copy). */\n connections(): PooledConnection[] {\n return [...this.pool];\n }\n\n /** Number of pooled connections. */\n size(): number {\n return this.pool.length;\n }\n\n /** Structural snapshot (cheap, no I/O). */\n stats(): WsConnectionStats[] {\n return this.pool.map((conn) => ({\n name: conn.name,\n family: this.family,\n state: conn.getState(),\n desiredStreams: conn.getSubscribedStreams().length,\n confirmedStreams: conn.getConfirmedStreams().length,\n reconnectAttempt: conn.getReconnectAttempt(),\n msSinceLastActivity: conn.msSinceLastActivity(),\n nextRenewalAt: null, // filled in by the platform (RenewalController owns this)\n }));\n }\n\n /** Close every pooled connection. Safe repeatedly. */\n closeAll(): void {\n for (const conn of this.pool) conn.close();\n this.pool.length = 0;\n }\n\n /** Next pool-assigned connection name, e.g. `usdmMarket[3]`. */\n private nextName(): string {\n return `${this.family}Market[${this.pool.length}]`;\n }\n}\n","import type { EventBus } from '../../core/events.js';\n\n/**\n * Minimal connection surface the heartbeat needs — implemented by\n * {@link WsConnection} and satisfiable by test stubs.\n */\nexport interface HeartbeatWatch {\n /** Connection label for events. */\n name?: string;\n getState(): string;\n /** ms since the last inbound frame; Infinity when never opened. */\n msSinceLastActivity(): number;\n /** Tear down into the reconnect path. */\n reconnect(): void;\n}\n\nexport interface WsHeartbeatOptions {\n /** Silence threshold that declares a connection dead. Default 10 min. */\n staleMs?: number;\n /** Sampling interval. Default 30s. */\n intervalMs?: number;\n /** Observability bus. */\n events?: EventBus;\n /** Injectable clock for tests. */\n now?: () => number;\n /** Injectable timer for tests (returns an unref-able handle). */\n setInterval?: (fn: () => void, ms: number) => { unref?: () => void };\n}\n\n/**\n * Pool-level liveness watchdog with a *single* timer.\n *\n * `WsConnection` already supports per-connection `staleMs`, but v3 platforms\n * watch dozens of sockets; one tick beats N setInterval handles, and the\n * judgment (server pings every 3 minutes → 10 minutes of total silence means\n * the path is dead) lives in exactly one place. Protocol-level activity\n * (pings/pongs) counts as liveness via `msSinceLastActivity`.\n *\n * When a connection goes stale the heartbeat does not wait for TCP to notice:\n * it calls `reconnect()` (terminate + fresh socket), which is the correct\n * response to a half-open path.\n */\nexport class WsHeartbeat {\n private readonly staleMs: number;\n private readonly intervalMs: number;\n private readonly events?: EventBus;\n private readonly now: () => number;\n private readonly timerFn: (fn: () => void, ms: number) => { unref?: () => void };\n private readonly watched = new Map<string, { conn: HeartbeatWatch; name: string }>();\n private timer: { unref?: () => void } | null = null;\n\n constructor(options: WsHeartbeatOptions = {}) {\n this.staleMs = options.staleMs ?? 10 * 60 * 1000;\n this.intervalMs = options.intervalMs ?? Math.max(Math.min(this.staleMs / 2, 30_000), 1_000);\n this.events = options.events;\n this.now = options.now ?? Date.now;\n this.timerFn = options.setInterval ?? ((fn, ms) => setInterval(fn, ms) as unknown as { unref?: () => void });\n }\n\n /** Start watching a connection under a stable key. */\n watch(key: string, conn: HeartbeatWatch): void {\n this.watched.set(key, { conn, name: conn.name ?? key });\n this.ensureTicking();\n }\n\n /** Stop watching (connection closed or pooled away). */\n unwatch(key: string): void {\n this.watched.delete(key);\n if (this.watched.size === 0) this.stop();\n }\n\n /** True when currently watched. */\n isWatching(key: string): boolean {\n return this.watched.has(key);\n }\n\n /** Number of watched connections. */\n size(): number {\n return this.watched.size;\n }\n\n /** Run one check immediately (also the interval body). */\n check(): { stale: string[] } {\n const stale: string[] = [];\n for (const [key, { conn, name }] of this.watched) {\n if (conn.getState() !== 'OPEN') continue;\n const quiet = conn.msSinceLastActivity();\n if (quiet > this.staleMs) {\n stale.push(name);\n this.events?.emit('ws.heartbeat.stale', {\n connection: name,\n quietMs: quiet === Number.POSITIVE_INFINITY ? null : Math.floor(quiet),\n staleMs: this.staleMs,\n });\n // Terminate-and-replace; a dead path must not be waited on.\n conn.reconnect();\n void key;\n }\n }\n return { stale };\n }\n\n start(): void {\n this.ensureTicking();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer as unknown as NodeJS.Timeout);\n this.timer = null;\n }\n }\n\n private ensureTicking(): void {\n if (this.timer || this.watched.size === 0) return;\n this.timer = this.timerFn(() => this.check(), this.intervalMs);\n this.timer.unref?.();\n }\n}\n","import { EventEmitter } from 'node:events';\nimport WebSocket from 'ws';\nimport { randomUUID } from 'node:crypto';\nimport { NetworkError } from '../../errors/index.js';\nimport type { WsApiResponse } from '../../types/userdata.types.js';\nimport { Signer, type SignatureAlgorithm } from '../../client/Signer.js';\nimport type { EventBus } from '../../core/events.js';\nimport { exponentialBackoff } from './ReconnectPolicy.js';\nimport { WS_PLATFORM_DEFAULTS, type ReconnectPolicy } from './types.js';\n\nexport interface WsApiClientOptions {\n /** WS API endpoint, e.g. `wss://ws-fapi.binance.com/ws-fapi/v1`. */\n baseUrl: string;\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key; overrides HMAC when set. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n recvWindow?: number;\n /** Per-request response timeout. Default 15s (transport parity). */\n requestTimeoutMs?: number;\n /** Reconnect backoff; default jittered exponential 1s→30s. */\n reconnectPolicy?: ReconnectPolicy;\n /** Observability bus. */\n events?: EventBus;\n /** Label for events/logs, e.g. `wsApiUsdm`. */\n name?: string;\n /** Injectable WebSocket factory for tests. */\n socketFactory?: (url: string) => WebSocket;\n /** Injectable delay for tests (reconnect backoff). */\n delay?: (ms: number) => Promise<void>;\n}\n\ninterface PendingRequest {\n resolve: (response: WsApiResponse) => void;\n reject: (err: Error) => void;\n timer: NodeJS.Timeout;\n method: string;\n}\n\nexport type WsApiClientState = 'IDLE' | 'CONNECTING' | 'OPEN' | 'RECONNECTING' | 'CLOSED';\n\nexport interface WsRequestOptions {\n /** Sign the request (apiKey + timestamp + recvWindow + signature). Default true. */\n signed?: boolean;\n}\n\n/**\n * Persistent, multiplexed WebSocket API client.\n *\n * v2's {@link WsApi} opened a *socket per request* — an order burst of 20\n * meant 20 connects, 20 TLS handshakes and 20 server-side teardowns. The v3\n * platform client keeps **one** connection per endpoint alive and routes\n * concurrent requests over it by correlation id:\n *\n * ```ts\n * const api = client.ws.api.usdm;\n * const [order, status] = await Promise.all([\n * api.placeOrder({ symbol: 'BTCUSDT', side: 'BUY', ... }),\n * api.accountStatus(),\n * ]); // both ride the same socket\n * ```\n *\n * Semantics:\n * - **REST-style promises** — every call resolves with the server's\n * response envelope or rejects with a typed error; no frames to juggle.\n * - **Auto-connect** — the first request opens the connection; subsequent\n * requests wait for OPEN when a reconnect is in flight (within their own\n * timeout).\n * - **Reconnect with backoff** — a dropped connection reconnects\n * automatically; requests that were in flight when it dropped reject\n * with a retryable {@link NetworkError} (the caller decides whether to\n * re-send — WS API requests are not idempotent-by-default).\n * - **Multiplexing** — responses are routed to their caller by `id`, so\n * concurrent calls never cross wires.\n */\nexport class WsApiClient extends EventEmitter {\n protected readonly options: WsApiClientOptions;\n protected readonly label: string;\n private readonly signer: Signer;\n private readonly reconnectPolicy: ReconnectPolicy;\n private readonly delay: (ms: number) => Promise<void>;\n\n private socket: WebSocket | null = null;\n private state: WsApiClientState = 'IDLE';\n private closedByUser = false;\n private reconnectAttempt = 0;\n private openWaiters: { resolve: () => void; reject: (err: Error) => void }[] = [];\n private readonly pending = new Map<string, PendingRequest>();\n\n constructor(options: WsApiClientOptions) {\n super();\n this.options = options;\n this.label = options.name ?? 'wsApi';\n this.signer = new Signer({\n algorithm: options.signatureAlgorithm,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n });\n this.reconnectPolicy = options.reconnectPolicy ?? exponentialBackoff();\n this.delay = options.delay ?? ((ms) => new Promise<void>((resolve) => setTimeout(resolve, ms)));\n this.setMaxListeners(0);\n }\n\n /** Current connection state. */\n getState(): string {\n return this.state;\n }\n\n /** Public client label (for stats snapshots and events). */\n get name(): string {\n return this.label;\n }\n\n /** Requests awaiting a response right now. */\n pendingCount(): number {\n return this.pending.size;\n }\n\n /**\n * Issue one WS API method call and resolve with the server's response.\n * The request rides the persistent connection (opening it if needed).\n * Signed requests without credentials reject (never throw sync).\n */\n async request(\n method: string,\n params: Record<string, unknown> = {},\n options: WsRequestOptions = {},\n ): Promise<WsApiResponse> {\n const signed = options.signed ?? true;\n const requestParams = this.buildParams(method, params, signed);\n const id = typeof requestParams.id === 'string' ? requestParams.id : randomUUID();\n\n const promise = this.sendAndWait(method, requestParams, id);\n // Fire-and-forget guard: an ignored rejection must never kill the process.\n void promise.catch(() => {\n /* failures are emitted as events in sendAndWait */\n });\n return promise;\n }\n\n /** User-initiated teardown; pending requests are failed, no reconnect. */\n close(): void {\n this.closedByUser = true;\n this.failAllPending(new NetworkError(`[${this.label}] client closed`));\n this.failOpenWaiters(new Error(`[${this.label}] client closed`));\n if (this.socket) {\n this.removeSocketListeners(this.socket);\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.close(1000, 'client-closing');\n } else if (this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.terminate();\n }\n this.socket = null;\n }\n this.transition('CLOSED');\n this.emit('close');\n this.emitEvent('ws.api.closed', {});\n }\n\n // -------------------------------------------------------------------------\n // Internals\n // -------------------------------------------------------------------------\n\n private buildParams(\n method: string,\n params: Record<string, unknown>,\n signed: boolean,\n ): Record<string, unknown> {\n const requestParams: Record<string, unknown> = { ...params };\n if (!signed) return requestParams;\n\n const { apiKey } = this.options;\n if (!apiKey || !this.signer.canSign()) {\n throw new Error(\n `[${this.label}] API key and secret (or privateKey) required for signed WS API request: ${method}`,\n );\n }\n requestParams.apiKey = apiKey;\n requestParams.timestamp = Date.now();\n requestParams.recvWindow = this.options.recvWindow ?? 5000;\n const queryString = buildQueryString(requestParams);\n requestParams.signature = this.signer.sign(queryString);\n return requestParams;\n }\n\n private async sendAndWait(\n method: string,\n requestParams: Record<string, unknown>,\n id: string,\n ): Promise<WsApiResponse> {\n const timeoutMs = this.options.requestTimeoutMs ?? 15_000;\n\n // Ensure the connection is OPEN (auto-connect / wait out reconnect).\n await this.ensureOpen(timeoutMs);\n\n return new Promise<WsApiResponse>((resolve, reject) => {\n const socket = this.socket;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n // Raced a drop between ensureOpen and the send: fail as retryable\n // network error rather than letting ws throw a raw sync error.\n reject(new NetworkError(`[${this.label}] connection lost before ${method} was sent`));\n return;\n }\n const timer = setTimeout(() => {\n this.pending.delete(id);\n const err = new NetworkError(`[${this.label}] ${method} timed out after ${timeoutMs}ms`);\n this.emitEvent('ws.api.timeout', { method, id, timeoutMs });\n reject(err);\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer, method });\n\n socket.send(JSON.stringify({ id, method, params: requestParams }));\n this.emitEvent('ws.api.request.sent', { method, id, signed: 'apiKey' in requestParams });\n });\n }\n\n private ensureOpen(timeoutMs: number): Promise<void> {\n if (this.state === 'OPEN' && this.socket?.readyState === WebSocket.OPEN) return Promise.resolve();\n if (this.closedByUser || this.state === 'CLOSED') {\n return Promise.reject(new Error(`[${this.label}] client is closed`));\n }\n\n if (this.state === 'IDLE' || this.state === 'RECONNECTING') {\n if (this.state === 'IDLE') this.openSocket('connect');\n // fall through: wait for OPEN\n } else if (this.state === 'CONNECTING') {\n // already opening; wait\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n const waiterIndex = this.openWaiters.findIndex((w) => w.resolve === resolve);\n if (waiterIndex >= 0) this.openWaiters.splice(waiterIndex, 1);\n reject(new Error(`[${this.label}] connection not OPEN within ${timeoutMs}ms (state=${this.state})`));\n }, timeoutMs);\n const waiter = {\n resolve: () => {\n clearTimeout(timer);\n resolve();\n },\n reject: (err: Error) => {\n clearTimeout(timer);\n reject(err);\n },\n };\n this.openWaiters.push(waiter);\n });\n }\n\n private openSocket(reason: 'connect' | 'reconnect'): void {\n const factory = this.options.socketFactory ?? ((url: string) => new WebSocket(url));\n const socket = factory(this.options.baseUrl);\n this.socket = socket;\n this.transition('CONNECTING');\n this.emitEvent('ws.api.connecting', { reason, url: this.options.baseUrl });\n\n socket.on('open', () => {\n if (this.socket !== socket) return;\n this.reconnectAttempt = 0;\n this.transition('OPEN');\n this.emit('open');\n this.emitEvent('ws.api.open', { reason });\n const waiters = [...this.openWaiters];\n this.openWaiters.length = 0;\n for (const waiter of waiters) waiter.resolve();\n });\n\n socket.on('message', (raw: unknown) => {\n if (this.socket !== socket) return;\n const text = typeof raw === 'string' ? raw : (raw as { toString(): string }).toString();\n this.handleMessage(text);\n });\n\n socket.on('error', (err: Error) => {\n if (this.socket !== socket) return;\n this.emit('error', err);\n this.emitEvent('ws.api.error', { message: err.message, state: this.state });\n // 'ws' emits 'close' after 'error'; reconnect is driven from 'close'.\n });\n\n socket.on('close', (code: number, reason: Buffer) => {\n if (this.socket !== socket) return;\n this.emitEvent('ws.api.closed', { code, reason: reason.toString(), initiatedBy: this.closedByUser ? 'user' : 'server' });\n if (this.closedByUser) {\n this.transition('CLOSED');\n this.failAllPending(new NetworkError(`[${this.label}] connection closed`));\n this.failOpenWaiters(new Error(`[${this.label}] connection closed`));\n return;\n }\n // In-flight requests cannot be assumed delivered — fail them as\n // retryable network errors; the caller decides whether to re-send.\n this.failAllPending(new NetworkError(`[${this.label}] connection dropped during request`));\n this.scheduleReconnect();\n });\n }\n\n private scheduleReconnect(): void {\n if (this.closedByUser) return;\n this.transition('RECONNECTING');\n const delayMs = this.reconnectPolicy.delayForMs(this.reconnectAttempt);\n this.reconnectAttempt += 1;\n this.emit('reconnecting', this.reconnectAttempt, delayMs);\n this.emitEvent('ws.api.reconnecting', { attempt: this.reconnectAttempt, delayMs });\n\n void this.delay(delayMs).then(() => {\n if (this.closedByUser || this.state === 'CLOSED') return;\n this.openSocket('reconnect');\n });\n }\n\n private handleMessage(text: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n this.emitEvent('ws.api.parse.error', { preview: text.slice(0, 80) });\n return;\n }\n if (parsed === null || typeof parsed !== 'object' || !('id' in parsed)) {\n return; // not a response envelope (WS API responses always carry id)\n }\n const response = parsed as WsApiResponse;\n const handler = this.pending.get(response.id);\n if (!handler) return;\n this.pending.delete(response.id);\n clearTimeout(handler.timer);\n\n if (response.status >= 400) {\n const message = response.error?.msg ?? `[${this.label}] WS API error ${response.status} (${handler.method})`;\n this.emitEvent('ws.api.request.failed', {\n method: handler.method,\n id: response.id,\n status: response.status,\n message,\n });\n handler.reject(new Error(message));\n return;\n }\n this.emitEvent('ws.api.response', { method: handler.method, id: response.id, status: response.status });\n handler.resolve(response);\n }\n\n private failAllPending(err: Error): void {\n for (const handler of this.pending.values()) {\n clearTimeout(handler.timer);\n handler.reject(err);\n }\n this.pending.clear();\n }\n\n private failOpenWaiters(err: Error): void {\n const waiters = [...this.openWaiters];\n this.openWaiters.length = 0;\n for (const waiter of waiters) waiter.reject(err);\n }\n\n private removeSocketListeners(socket: WebSocket): void {\n socket.removeAllListeners('open');\n socket.removeAllListeners('message');\n socket.removeAllListeners('error');\n socket.removeAllListeners('close');\n }\n\n private transition(to: WsApiClientState): void {\n const from = this.state;\n if (from === to) return;\n this.state = to;\n this.emit('state', to, from);\n this.emitEvent('ws.api.state', { from, to });\n }\n\n private emitEvent(name: string, payload: Record<string, unknown>): void {\n this.options.events?.scoped(`ws:${this.label}`).emit(name, payload);\n }\n}\n\nfunction buildQueryString(data: Record<string, unknown>): string {\n return Object.entries(data)\n .filter(([, val]) => val !== undefined && val !== null)\n .map(([key, val]) => `${key}=${encodeURIComponent(String(val))}`)\n .join('&');\n}\n","import { WsApiClient, type WsApiClientOptions, type WsRequestOptions } from './WsApiClient.js';\nimport type { WsApiResponse } from '../../types/userdata.types.js';\n\n/**\n * Persistent WS API client for the USDⓈ-M futures endpoint\n * (`wss://ws-fapi.binance.com/ws-fapi/v1`).\n *\n * Method surface mirrors v2's per-request {@link WsApi} one-to-one, so\n * migrating is a constructor swap — but every call now rides one persistent\n * multiplexed socket instead of opening its own.\n */\nexport class FuturesWsApiClient extends WsApiClient {\n placeOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.place', params);\n }\n\n cancelOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancel', params);\n }\n\n modifyOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.modify', params);\n }\n\n placeAlgoOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('algoOrder.place', params);\n }\n\n cancelAlgoOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('algoOrder.cancel', params);\n }\n\n orderStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.status', params);\n }\n\n placeOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.place', params);\n }\n\n cancelOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.cancel', params);\n }\n\n orderListStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.status', params);\n }\n\n accountStatus(): Promise<WsApiResponse> {\n return this.request('account.status', {});\n }\n\n accountPosition(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('account.position', params);\n }\n\n userDataStreamStart(): Promise<WsApiResponse> {\n return this.request('userDataStream.start', {});\n }\n\n userDataStreamPing(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.ping', { listenKey });\n }\n\n userDataStreamStop(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.stop', { listenKey });\n }\n\n // ---- Public market data (no signature) ----\n\n time(): Promise<WsApiResponse> {\n return this.request('time', {}, { signed: false });\n }\n\n exchangeInfo(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('exchangeInfo', params, { signed: false });\n }\n\n klines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('klines', params, { signed: false });\n }\n\n aggTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('aggTrades', params, { signed: false });\n }\n\n trades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades', params, { signed: false });\n }\n\n depth(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('depth', params, { signed: false });\n }\n\n avgPrice(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('avgPrice', params, { signed: false });\n }\n\n tickerPrice(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.price', params, { signed: false });\n }\n\n tickerBookTicker(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.bookTicker', params, { signed: false });\n }\n\n ticker24hr(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.24hr', params, { signed: false });\n }\n}\n\n/**\n * Persistent WS API client for the spot endpoint\n * (`wss://ws-api.binance.com:443/ws-api/v3`). Same persistent-socket,\n * multiplexed semantics; spot method names mirror v2's {@link SpotWsApi}.\n */\nexport class SpotWsApiClient extends WsApiClient {\n // ---- Trading ----\n\n placeOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.place', params);\n }\n\n testOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.test', params);\n }\n\n cancelOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancel', params);\n }\n\n cancelReplaceOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancelReplace', params);\n }\n\n orderStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.status', params);\n }\n\n openOrders(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('openOrders.status', params);\n }\n\n cancelAllOpenOrders(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('openOrders.cancelAll', params);\n }\n\n placeOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.place', params);\n }\n\n cancelOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.cancel', params);\n }\n\n orderListStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.status', params);\n }\n\n openOrderListsStatus(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('openOrderLists.status', params);\n }\n\n allOrders(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('allOrders', params);\n }\n\n allOrderLists(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('allOrderLists', params);\n }\n\n myTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('myTrades', params);\n }\n\n // ---- Account ----\n\n accountStatus(): Promise<WsApiResponse> {\n return this.request('account.status', {});\n }\n\n accountBalances(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('account.balance', params);\n }\n\n accountCommission(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('account.commission', params);\n }\n\n orderRateLimits(): Promise<WsApiResponse> {\n return this.request('account.rateLimits.orders', {});\n }\n\n // ---- User data streams ----\n\n userDataStreamStart(): Promise<WsApiResponse> {\n return this.request('userDataStream.start', {});\n }\n\n userDataStreamPing(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.ping', { listenKey });\n }\n\n userDataStreamStop(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.stop', { listenKey });\n }\n\n // ---- Public market data (no signature) ----\n\n ping(): Promise<WsApiResponse> {\n return this.request('ping', {}, { signed: false });\n }\n\n time(): Promise<WsApiResponse> {\n return this.request('time', {}, { signed: false });\n }\n\n exchangeInfo(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('exchangeInfo', params, { signed: false });\n }\n\n depth(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('depth', params, { signed: false });\n }\n\n recentTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.recent', params, { signed: false });\n }\n\n historicalTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.historical', params, { signed: false });\n }\n\n aggregateTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.aggregate', params, { signed: false });\n }\n\n klines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('klines', params, { signed: false });\n }\n\n uiKlines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('uiKlines', params, { signed: false });\n }\n}\n\nexport type { WsApiClientOptions, WsRequestOptions };\n","import type { EventBus } from '../../core/events.js';\nimport { WS_PLATFORM_DEFAULTS } from './types.js';\n\n/**\n * Minimal connection surface the renewal controller needs — implemented by\n * {@link WsConnection} (an EventEmitter) and satisfiable by test stubs.\n *\n * Zero-gap rotation is transparent in the state machine: the connection stays\n * OPEN while the replacement connects, so completion is signalled by the\n * `rotated` / `rotationFailed` emitter events, not by state transitions.\n */\nexport interface RenewableConnection {\n on(event: 'state', listener: (to: string, from: string) => void): unknown;\n on(event: 'rotated', listener: () => void): unknown;\n on(event: 'rotationFailed', listener: (info: { code: number; reason: string }) => void): unknown;\n off(event: 'state', listener: (to: string, from: string) => void): unknown;\n off(event: 'rotated', listener: () => void): unknown;\n off(event: 'rotationFailed', listener: (info: { code: number; reason: string }) => void): unknown;\n getState(): string;\n /** Attempt a zero-gap rotation; false when not applicable. */\n rotateNow(): boolean;\n}\n\nexport interface RenewalControllerOptions {\n /**\n * Renewal window. Binance kills stream connections at 24h; the platform\n * rotates at 23h so the replacement carries traffic *before* the drop.\n * Default 23h.\n */\n rotationMs?: number;\n /**\n * Per-connection jitter (uniform [0, jitterMs)). Two connections opened in\n * the same millisecond would otherwise renew in the same millisecond — a\n * synchronized herd. Default 10 min.\n */\n jitterMs?: number;\n /**\n * Platform-wide cap on simultaneous renewals; the default 1 serializes\n * rotations so a pool of N connections renews one at a time.\n */\n maxConcurrent?: number;\n /** Observability bus. */\n events?: EventBus;\n /** Injectable randomness for tests; must return [0, 1). */\n random?: () => number;\n /** Injectable timer for tests. */\n setTimeout?: (fn: () => void, ms: number) => { unref?: () => void };\n /** Postponement/retry interval. Default 30s. */\n retryMs?: number;\n}\n\ninterface Tracked {\n name: string;\n conn: RenewableConnection;\n nextRenewalAt: number | null;\n timer: { unref?: () => void } | null;\n rotating: boolean;\n onState: (to: string, from: string) => void;\n onRotated: () => void;\n onRotationFailed: (info: { code: number; reason: string }) => void;\n}\n\n/**\n * Centralized, staggered 24h-safe renewal sequencing.\n *\n * `WsConnection` has a built-in 23h rotation timer; pool-managed connections\n * disable it (`rotationMs: 0`) and defer to this controller because:\n *\n * - **Decorrelation** — every connection gets a uniform jitter on top of the\n * 23h window, so a pool created at boot rotates across a spread, not a\n * synchronized herd.\n * - **Concurrency cap** — at most `maxConcurrent` rotations platform-wide;\n * a herd forced to serialize is a blip, not an event.\n * - **Observability** — `nextRenewalAt(name)` and `ws.renewal.*` events make\n * the rotation schedule inspectable instead of a hidden timer per socket.\n *\n * Renewals are zero-gap: the connection swaps sockets internally (traffic\n * keeps flowing on the old one until the replacement is open).\n */\nexport class RenewalController {\n private readonly rotationMs: number;\n private readonly jitterMs: number;\n private readonly maxConcurrent: number;\n private readonly events?: EventBus;\n private readonly random: () => number;\n private readonly setTimeoutFn: (fn: () => void, ms: number) => { unref?: () => void };\n private readonly retryMs: number;\n private readonly tracked = new Map<string, Tracked>();\n\n constructor(options: RenewalControllerOptions = {}) {\n this.rotationMs = options.rotationMs ?? WS_PLATFORM_DEFAULTS.rotationMs;\n this.jitterMs = options.jitterMs ?? WS_PLATFORM_DEFAULTS.renewalJitterMs;\n this.maxConcurrent = Math.max(1, options.maxConcurrent ?? WS_PLATFORM_DEFAULTS.maxConcurrentRenewals);\n this.events = options.events;\n this.random = options.random ?? Math.random;\n this.setTimeoutFn =\n options.setTimeout ?? ((fn, ms) => setTimeout(fn, ms) as unknown as { unref?: () => void });\n this.retryMs = options.retryMs ?? 30_000;\n }\n\n /**\n * Start centrally managing renewal for a connection. Scheduling anchors on\n * the connection reaching OPEN (or immediately, if already open), so a\n * tracked-but-not-yet-connected socket does not burn its rotation window.\n */\n track(name: string, conn: RenewableConnection): void {\n if (this.tracked.has(name)) return;\n const tracked: Tracked = {\n name,\n conn,\n nextRenewalAt: null,\n timer: null,\n rotating: false,\n onState: (to) => {\n if (to === 'OPEN') this.scheduleRenewal(tracked);\n },\n onRotated: () => {\n // Zero-gap swap completed: the new socket carries traffic. Re-anchor\n // the next window from now.\n tracked.rotating = false;\n this.scheduleRenewal(tracked);\n },\n onRotationFailed: () => {\n // Replacement refused/died; the old socket still carries traffic.\n // Clear the in-flight flag and retry after a short postpone.\n tracked.rotating = false;\n if (tracked.timer) {\n clearTimeout(tracked.timer as unknown as NodeJS.Timeout);\n tracked.timer = null;\n }\n tracked.nextRenewalAt = Date.now() + this.retryMs;\n tracked.timer = this.setTimeoutFn(() => {\n tracked.timer = null;\n this.fireRenewal(tracked);\n }, this.retryMs);\n tracked.timer.unref?.();\n },\n };\n this.tracked.set(name, tracked);\n conn.on('state', tracked.onState);\n conn.on('rotated', tracked.onRotated);\n conn.on('rotationFailed', tracked.onRotationFailed);\n if (conn.getState() === 'OPEN') this.scheduleRenewal(tracked);\n }\n\n /** Stop managing a connection; safe to call for unknown names. */\n untrack(name: string): void {\n const tracked = this.tracked.get(name);\n if (!tracked) return;\n if (tracked.timer) clearTimeout(tracked.timer as unknown as NodeJS.Timeout);\n tracked.conn.off('state', tracked.onState);\n tracked.conn.off('rotated', tracked.onRotated);\n tracked.conn.off('rotationFailed', tracked.onRotationFailed);\n this.tracked.delete(name);\n }\n\n /** Epoch-ms of the next scheduled renewal, or null when idle/closed. */\n nextRenewalAt(name: string): number | null {\n return this.tracked.get(name)?.nextRenewalAt ?? null;\n }\n\n /** True while a renewal is in flight for this connection. */\n isRenewing(name: string): boolean {\n return this.tracked.get(name)?.rotating ?? false;\n }\n\n /** Number of centrally managed connections. */\n size(): number {\n return this.tracked.size;\n }\n\n /** Stop managing everything. */\n close(): void {\n for (const name of [...this.tracked.keys()]) this.untrack(name);\n }\n\n private scheduleRenewal(tracked: Tracked): void {\n if (tracked.timer) {\n clearTimeout(tracked.timer as unknown as NodeJS.Timeout);\n tracked.timer = null;\n }\n const jitter = this.jitterMs > 0 ? Math.floor(this.random() * this.jitterMs) : 0;\n const delay = this.rotationMs + jitter;\n tracked.nextRenewalAt = Date.now() + delay;\n tracked.rotating = false;\n\n tracked.timer = this.setTimeoutFn(() => {\n tracked.timer = null;\n this.fireRenewal(tracked);\n }, delay);\n tracked.timer.unref?.();\n }\n\n private fireRenewal(tracked: Tracked): void {\n tracked.nextRenewalAt = null;\n if (tracked.conn.getState() !== 'OPEN') {\n // Not carrying traffic — nothing to renew; the OPEN state listener will\n // schedule a fresh window when it (re)connects.\n tracked.rotating = false;\n return;\n }\n const inFlight = this.countInFlight();\n if (inFlight >= this.maxConcurrent) {\n this.events?.emit('ws.renewal.postponed', {\n connection: tracked.name,\n reason: 'concurrency',\n retryInMs: this.retryMs,\n });\n tracked.timer = this.setTimeoutFn(() => {\n tracked.timer = null;\n this.fireRenewal(tracked);\n }, this.retryMs);\n tracked.timer.unref?.();\n return;\n }\n\n tracked.rotating = true;\n const started = tracked.conn.rotateNow();\n this.events?.emit('ws.renewal.started', { connection: tracked.name, started });\n if (!started) {\n // Rotation not applicable (already in flight, or the connection raced\n // to a non-OPEN state); reschedule the window and try again.\n tracked.rotating = false;\n this.scheduleRenewal(tracked);\n return;\n }\n // Completion arrives as `rotated` (swap done) or `rotationFailed`\n // (replacement refused) — both handled by the tracked listeners.\n }\n\n private countInFlight(): number {\n let count = 0;\n for (const tracked of this.tracked.values()) if (tracked.rotating) count += 1;\n return count;\n }\n}\n","import { EventEmitter } from 'node:events';\nimport type { WsStreamPayload } from '../../types/ws.types.js';\nimport type { SubscriptionState } from './types.js';\n\n/**\n * A single market-data stream as a first-class consumer object.\n *\n * v2's WS surface was connection-centric: callers held a `FuturesMarketWS`\n * and juggled stream names against its EventEmitter. v3 inverts the\n * relationship — the caller holds a {@link Subscription} and the platform\n * decides which pooled connection carries it:\n *\n * ```ts\n * const sub = await client.ws.usdm.subscribe('btcusdt@aggTrade');\n * sub.on('message', (payload) => console.log(payload.p));\n * sub.on('state', (s) => console.log(s)); // pending → live → …\n * await sub.waitForReady();\n * sub.close(); // refcounted; server sees UNSUBSCRIBE\n * ```\n *\n * Semantics:\n * - `state` is `'pending'` while unconfirmed (including during reconnects),\n * `'live'` when the server is currently delivering the stream, `'closed'`\n * after `close()` (terminal).\n * - Multiple subscriptions to the same stream each get their own object and\n * full fan-out; the server-level subscription is refcounted — the last\n * `close()` triggers the protocol UNSUBSCRIBE.\n * - Reconnects are transparent: state cycles pending → live while the\n * platform repairs the connection and re-confirms the stream.\n */\nexport class Subscription extends EventEmitter {\n /** Stream name, e.g. `btcusdt@aggTrade`. */\n readonly stream: string;\n /** Pool-assigned connection label carrying this stream. */\n readonly connection: string;\n\n private stateValue: SubscriptionState = 'pending';\n private closed = false;\n private readonly onClose?: () => void;\n\n constructor(stream: string, connection: string, onClose?: () => void) {\n super();\n this.stream = stream;\n this.connection = connection;\n this.onClose = onClose;\n this.setMaxListeners(0);\n }\n\n /** Current consumer-visible state. */\n get state(): SubscriptionState {\n return this.stateValue;\n }\n\n /** True while the server is delivering this stream on the live connection. */\n get isLive(): boolean {\n return this.stateValue === 'live';\n }\n\n /**\n * Resolve when the stream goes live (first confirmation or post-reconnect\n * repair). Rejects on timeout or terminal close. Safe to call repeatedly.\n */\n waitForReady(timeoutMs = 30_000): Promise<void> {\n if (this.stateValue === 'live') return Promise.resolve();\n if (this.closed) return Promise.reject(new Error(`subscription ${this.stream} is closed`));\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`subscription ${this.stream} not live within ${timeoutMs}ms (state=${this.stateValue})`));\n }, timeoutMs);\n const onState = (to: SubscriptionState): void => {\n if (to === 'live') {\n cleanup();\n resolve();\n } else if (to === 'closed') {\n cleanup();\n reject(new Error(`subscription ${this.stream} closed before live`));\n }\n };\n const cleanup = (): void => {\n clearTimeout(timer);\n this.off('state', onState);\n };\n this.on('state', onState);\n });\n }\n\n /** Internal: platform confirmed the stream on the current connection. */\n /** @internal */\n markLive(): void {\n if (this.closed) return;\n if (this.stateValue !== 'live') {\n this.stateValue = 'live';\n this.emit('state', 'live');\n }\n }\n\n /** Internal: connection dropped; awaiting repair. */\n /** @internal */\n markPending(reason: string): void {\n if (this.closed) return;\n if (this.stateValue !== 'pending') {\n this.stateValue = 'pending';\n this.emit('state', 'pending');\n this.emit('interrupted', reason);\n }\n }\n\n /** Internal: deliver one parsed payload (already losslessly parsed). */\n /** @internal */\n dispatch(payload: WsStreamPayload): void {\n if (this.closed) return;\n this.emit('message', payload);\n }\n\n /** Internal: deliver the lossless raw view of one frame. */\n /** @internal */\n dispatchRaw(raw: unknown): void {\n if (this.closed) return;\n this.emit('raw', raw);\n }\n\n /**\n * Close this subscription. Idempotent; refcounted — the server-level\n * UNSUBSCRIBE fires only when the last subscriber for the stream closes.\n * Closing detaches the subscription from its registry (release hook).\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.stateValue = 'closed';\n this.emit('state', 'closed');\n this.emit('close');\n this.onClose?.();\n this.removeAllListeners();\n }\n}\n","import type { EventBus } from '../../core/events.js';\nimport type { WsStreamPayload } from '../../types/ws.types.js';\nimport type { PooledConnection } from './ConnectionPool.js';\nimport { FamilyConnectionPool } from './ConnectionPool.js';\nimport { Subscription } from './Subscription.js';\nimport { WS_PLATFORM_DEFAULTS, type SubscribeOptions } from './types.js';\n\ninterface StreamMapping {\n conn: PooledConnection;\n subs: Set<Subscription>;\n}\n\n/**\n * Stream-level routing over one family's connection pool.\n *\n * Responsibilities:\n *\n * - **Refcounting** — N `Subscription` objects for one stream name share a\n * single server-level subscription; the last `close()` issues the protocol\n * UNSUBSCRIBE.\n * - **Fan-out** — one `message` listener per pooled connection dispatches\n * frames to every live subscription for that stream (parsed payload plus\n * lossless raw view).\n * - **Reconnect transparency** — when a pooled connection drops, its\n * subscriptions flip to `pending`; after the connection's own repair\n * (reconnect or rotation, followed by its resynchronize pass) the registry\n * re-marks every server-confirmed stream `live`.\n *\n * The registry never subscribes the same stream on two connections of the\n * same family — a stream maps to exactly one connection while it has\n * subscribers.\n */\nexport class FamilySubscriptionRegistry {\n private readonly pool: FamilyConnectionPool;\n private readonly events?: EventBus;\n private readonly confirmTimeoutMs: number;\n private readonly mappings = new Map<string, StreamMapping>();\n /** Connections whose dispatch listeners are attached (bounded by pool cap). */\n private readonly attached = new Set<PooledConnection>();\n\n constructor(options: {\n pool: FamilyConnectionPool;\n events?: EventBus;\n requestTimeoutMs?: number;\n }) {\n this.pool = options.pool;\n this.events = options.events;\n this.confirmTimeoutMs = options.requestTimeoutMs ?? WS_PLATFORM_DEFAULTS.requestTimeoutMs;\n }\n\n /**\n * Acquire a subscription for one stream, confirming it server-side. When\n * the stream already has subscribers this is a pure fan-out join (no I/O).\n *\n * Rejects when confirmation does not arrive within `confirmTimeoutMs`;\n * the subscription stays registered in that case — it flips to `live` via\n * the reconnect/repair path and remains reachable through\n * {@link FamilySubscriptionRegistry.getSubscription}.\n */\n acquire(stream: string, options: SubscribeOptions = {}): Promise<Subscription> {\n const promise = this.doAcquire(stream, options);\n // Fire-and-forget guard: callers that ignore the returned promise must\n // never produce an unhandled rejection (Node terminates on those). The\n // failure is already republished as `ws.subscribe.rejected`.\n void promise.catch(() => {\n /* handled via observability event */\n });\n return promise;\n }\n\n private async doAcquire(stream: string, options: SubscribeOptions): Promise<Subscription> {\n const existing = this.mappings.get(stream);\n if (existing) {\n const sub = new Subscription(stream, existing.conn.name, () => this.release(sub));\n existing.subs.add(sub);\n if (existing.conn.getConfirmedStreams().includes(stream)) sub.markLive();\n return sub;\n }\n\n const conn = this.pool.selectOrCreate([stream]);\n this.attach(conn);\n\n const mapping: StreamMapping = { conn, subs: new Set() };\n this.mappings.set(stream, mapping);\n const sub = new Subscription(stream, conn.name, () => this.release(sub));\n mapping.subs.add(sub);\n\n // The subscription is registered BEFORE the ack: frames that race the\n // confirmation are still dispatched, never dropped.\n const timeoutMs = options.confirmTimeoutMs ?? this.confirmTimeoutMs;\n try {\n await withTimeout(\n conn.subscribe([stream]),\n timeoutMs,\n `stream ${stream} not confirmed within ${timeoutMs}ms`,\n );\n sub.markLive();\n } catch (err) {\n // Keep the registration (desired state already recorded on the\n // connection; its repair path will confirm). Surface the failure.\n this.events?.emit('ws.subscribe.rejected', {\n stream,\n connection: conn.name,\n message: (err as Error).message,\n });\n throw err;\n }\n return sub;\n }\n\n /**\n * Release a subscription (refcount down). The last release for a stream\n * removes the mapping and issues the protocol UNSSUBSCRIBE (best-effort —\n * desired state is already dropped, so reconnects will not resurrect it).\n * Invoked automatically by {@link Subscription.close}.\n */\n release(subscription: Subscription): void {\n const mapping = this.mappings.get(subscription.stream);\n if (!mapping) return;\n mapping.subs.delete(subscription);\n if (mapping.subs.size > 0) return;\n\n this.mappings.delete(subscription.stream);\n const { conn } = mapping;\n const stream = subscription.stream;\n this.events?.emit('ws.subscription.released', { stream, connection: conn.name });\n // Desired state is the source of truth; UNSUBSCRIBE is best-effort.\n void conn.unsubscribe([stream]).catch((err: Error) => {\n this.events?.emit('ws.unsubscribe.rejected', {\n stream,\n connection: conn.name,\n message: err.message,\n });\n });\n }\n\n /** Active subscription object for a stream, if one is registered. */\n getSubscription(stream: string): Subscription | undefined {\n const mapping = this.mappings.get(stream);\n if (!mapping) return undefined;\n return [...mapping.subs][0];\n }\n\n /** Streams with at least one live subscription. */\n activeStreams(): string[] {\n return [...this.mappings.keys()];\n }\n\n /** Registry snapshot: streams per connection. */\n stats(): { streams: number; connections: number } {\n const connections = new Set<string>();\n for (const mapping of this.mappings.values()) connections.add(mapping.conn.name);\n return { streams: this.mappings.size, connections: connections.size };\n }\n\n /** Close every subscription (platform teardown). */\n closeAll(): void {\n for (const [stream, mapping] of [...this.mappings]) {\n for (const sub of [...mapping.subs]) {\n sub.close();\n }\n this.mappings.delete(stream);\n }\n }\n\n // -------------------------------------------------------------------------\n // Connection wiring\n // -------------------------------------------------------------------------\n\n private attach(conn: PooledConnection): void {\n if (this.attached.has(conn)) return;\n this.attached.add(conn);\n\n conn.on('message', (stream: string, payload: WsStreamPayload) => {\n const mapping = this.mappings.get(stream);\n if (!mapping || mapping.conn !== conn) return;\n for (const sub of mapping.subs) sub.dispatch(payload);\n });\n conn.on('raw', (stream: string, raw: unknown) => {\n const mapping = this.mappings.get(stream);\n if (!mapping || mapping.conn !== conn) return;\n for (const sub of mapping.subs) sub.dispatchRaw(raw);\n });\n conn.on('state', (to: string) => {\n if (to === 'RECONNECTING' || to === 'CONNECTING') {\n this.markConnectionPending(conn, to);\n }\n });\n const repair = (): void => {\n // BaseWS re-establishes desired subscriptions after open/rotation; its\n // resynchronize() returns the in-flight repair promise.\n void conn\n .resynchronize()\n .then(() => this.refreshConfirmed(conn))\n .catch(() => {\n /* repair is best-effort; state stays pending and retries on next open */\n });\n };\n conn.on('open', repair);\n conn.on('rotated', repair);\n }\n\n private markConnectionPending(conn: PooledConnection, reason: string): void {\n for (const mapping of this.mappings.values()) {\n if (mapping.conn !== conn) continue;\n for (const sub of mapping.subs) sub.markPending(reason);\n }\n }\n\n private refreshConfirmed(conn: PooledConnection): void {\n const confirmed = new Set(conn.getConfirmedStreams());\n for (const [stream, mapping] of this.mappings) {\n if (mapping.conn !== conn) continue;\n if (confirmed.has(stream)) {\n for (const sub of mapping.subs) sub.markLive();\n }\n }\n }\n}\n\nfunction withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(message)), timeoutMs);\n timer.unref?.();\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n}\n","import type WebSocket from 'ws';\nimport type { CoreContext } from '../../core/context.js';\nimport type { Credentials } from '../../core/credentials.js';\nimport type { EventBus } from '../../core/events.js';\nimport { FamilyConnectionPool } from './ConnectionPool.js';\nimport { WsHeartbeat } from './Heartbeat.js';\nimport { FuturesWsApiClient, SpotWsApiClient } from './ProductWsApi.js';\nimport { RenewalController } from './RenewalController.js';\nimport { exponentialBackoff } from './ReconnectPolicy.js';\nimport { FamilySubscriptionRegistry } from './SubscriptionRegistry.js';\nimport { Subscription } from './Subscription.js';\nimport {\n WS_FAMILY_LIMITS,\n WS_PLATFORM_DEFAULTS,\n type ReconnectPolicy,\n type SubscribeOptions,\n type WsConnectionStats,\n type WsFamily,\n type WsPlatformStats,\n} from './types.js';\n\nexport interface WsPlatformOptions {\n /** Per-family connection caps (keys optional; unset uses family defaults). */\n maxConnections?: Partial<Record<WsFamily, number>>;\n /** Platform-wide reconnect backoff; default jittered exponential. */\n reconnectPolicy?: ReconnectPolicy;\n /** Silence threshold for liveness. Default 10 min. */\n staleMs?: number;\n /** Renewal window + jitter (defaults 23h ± 10 min). */\n rotationMs?: number;\n renewalJitterMs?: number;\n /** Max simultaneous renewals platform-wide. Default 1. */\n maxConcurrentRenewals?: number;\n /** Control-request/confirm timeout. Default 10s. */\n requestTimeoutMs?: number;\n /** Injectable WebSocket factory for tests. */\n socketFactory?: (url: string) => WebSocket;\n /** Injectable delay for WS API reconnect tests. */\n wsApiDelay?: (ms: number) => Promise<void>;\n}\n\n/** Per-family consumer surface: pooled subscriptions with objects. */\nexport interface WsFamilyStreams {\n /**\n * Subscribe to one stream. Returns a confirmed `Subscription` object —\n * see {@link Subscription} for the consumer API.\n */\n subscribe(stream: string, options?: SubscribeOptions): Promise<Subscription>;\n /**\n * Subscribe to a list of streams; accepts stream-name builders like\n * `client.ws.usdm.subscribe([futuresWs.aggTrade('BTCUSDT'), futuresWs.kline('BTCUSDT', '1m')])`.\n */\n subscribe(streams: string[], options?: SubscribeOptions): Promise<Subscription[]>;\n /** Active subscription object for a stream, if registered. */\n getSubscription(stream: string): Subscription | undefined;\n /** Streams with at least one live subscription. */\n activeStreams(): string[];\n /** Family pool snapshot. */\n stats(): { connections: WsConnectionStats[]; activeStreams: number };\n}\n\n/** The WS API surface: persistent multiplexed promise-oriented clients. */\nexport interface WsApiSurface {\n /** USDⓈ-M futures WS API (`ws-fapi/v1`). */\n usdm: FuturesWsApiClient;\n /** Spot WS API (`ws-api/v3`). */\n spot: SpotWsApiClient;\n}\n\n/**\n * v3 WebSocket platform — pools, subscriptions, liveness, renewal and the\n * persistent WS API in one closure-shared runtime.\n *\n * ```ts\n * const client = new BinanceClient({ apiKey, apiSecret });\n * const sub = await client.ws.usdm.subscribe('btcusdt@aggTrade');\n * sub.on('message', (payload) => …);\n *\n * const [fills] = await Promise.all([\n * client.ws.api.usdm.accountStatus(), // one persistent socket\n * ]);\n * client.ws.stats(); // per-connection pool snapshot\n * client.ws.close(); // everything\n * ```\n *\n * The platform is a *consumer* of the shared {@link CoreContext}: it reads\n * endpoints, credentials, events and transport tuning from it, and shares\n * the same observability stream as REST traffic (`ws.*` events).\n */\nexport class WsPlatform {\n readonly usdm: WsFamilyStreams;\n readonly spot: WsFamilyStreams;\n readonly coinm: WsFamilyStreams;\n readonly api: WsApiSurface;\n\n private readonly heartbeat: WsHeartbeat;\n private readonly renewal: RenewalController;\n private readonly pools = new Map<WsFamily, FamilyConnectionPool>();\n private readonly registries = new Map<WsFamily, FamilySubscriptionRegistry>();\n private readonly events: EventBus;\n\n constructor(options: {\n core: Pick<CoreContext, 'endpoints' | 'credentials' | 'events' | 'transport'>;\n platform?: WsPlatformOptions;\n }) {\n const { core } = options;\n const platform = options.platform ?? {};\n this.events = core.events;\n const reconnectPolicy = platform.reconnectPolicy ?? exponentialBackoff();\n const requestTimeoutMs = platform.requestTimeoutMs ?? WS_PLATFORM_DEFAULTS.requestTimeoutMs;\n\n this.heartbeat = new WsHeartbeat({\n staleMs: platform.staleMs,\n events: this.events,\n });\n this.renewal = new RenewalController({\n rotationMs: platform.rotationMs,\n jitterMs: platform.renewalJitterMs,\n maxConcurrent: platform.maxConcurrentRenewals,\n events: this.events,\n });\n\n const wire = (family: WsFamily, baseStreamUrl: string): WsFamilyStreams => {\n const pool = new FamilyConnectionPool({\n family,\n baseStreamUrl,\n maxConnections: platform.maxConnections?.[family],\n reconnectPolicy,\n events: this.events,\n socketFactory: platform.socketFactory,\n requestTimeoutMs,\n onConnection: (name, conn) => {\n this.heartbeat.watch(name, conn);\n this.renewal.track(name, conn);\n },\n });\n const registry = new FamilySubscriptionRegistry({\n pool,\n events: this.events,\n requestTimeoutMs,\n });\n this.pools.set(family, pool);\n this.registries.set(family, registry);\n\n const subscribeImpl = (\n streamOrStreams: string | string[],\n subscribeOptions?: SubscribeOptions,\n ): Promise<Subscription> | Promise<Subscription[]> => {\n if (typeof streamOrStreams === 'string') {\n return registry.acquire(streamOrStreams, subscribeOptions);\n }\n return Promise.all(\n streamOrStreams.map((stream) => registry.acquire(stream, subscribeOptions)),\n );\n };\n\n const streams: WsFamilyStreams = {\n // Correlated single/array returns need one narrowing cast (a known\n // TypeScript limitation for overloaded implementations).\n subscribe: subscribeImpl as WsFamilyStreams['subscribe'],\n getSubscription: (stream) => registry.getSubscription(stream),\n activeStreams: () => registry.activeStreams(),\n stats: () => ({\n connections: this.decorateStats(pool.stats()),\n activeStreams: registry.activeStreams().length,\n }),\n };\n return streams;\n };\n\n this.usdm = wire('usdm', core.endpoints.wsMarket);\n this.spot = wire('spot', core.endpoints.wsSpotMarket);\n this.coinm = wire('coinm', core.endpoints.wsDapiMarket);\n\n const creds: Pick<\n Credentials,\n 'apiKey' | 'apiSecret' | 'privateKey' | 'signatureAlgorithm'\n > = core.credentials;\n const apiCommon = {\n apiKey: creds.apiKey,\n apiSecret: creds.apiSecret,\n privateKey: creds.privateKey,\n signatureAlgorithm: creds.signatureAlgorithm,\n recvWindow: core.transport.recvWindow,\n requestTimeoutMs: core.transport.timeoutMs,\n reconnectPolicy,\n events: this.events,\n socketFactory: platform.socketFactory,\n delay: platform.wsApiDelay,\n };\n this.api = {\n usdm: new FuturesWsApiClient({ ...apiCommon, baseUrl: core.endpoints.wsApi, name: 'wsApiUsdm' }),\n spot: new SpotWsApiClient({ ...apiCommon, baseUrl: core.endpoints.wsSpotApi, name: 'wsApiSpot' }),\n };\n }\n\n /** Aggregate snapshot across families and WS API clients (cheap, no I/O). */\n stats(): WsPlatformStats {\n const families: WsPlatformStats['families'] = {};\n for (const [family, registry] of this.registries) {\n const pool = this.pools.get(family);\n if (!pool) continue;\n families[family] = {\n connections: this.decorateStats(pool.stats()),\n activeStreams: registry.activeStreams().length,\n };\n }\n return {\n families,\n wsApi: [this.api.usdm, this.api.spot].map((client) => ({\n name: client.name,\n state: client.getState(),\n pendingRequests: client.pendingCount(),\n })),\n };\n }\n\n /** True when any pooled connection or WS API client is active. */\n hasActivity(): boolean {\n for (const pool of this.pools.values()) if (pool.size() > 0) return true;\n for (const client of [this.api.usdm, this.api.spot]) {\n if (client.getState() !== 'IDLE' && client.getState() !== 'CLOSED') return true;\n }\n return false;\n }\n\n /** Close everything: subscriptions, pooled connections, WS API clients. */\n close(): void {\n for (const registry of this.registries.values()) registry.closeAll();\n for (const pool of this.pools.values()) pool.closeAll();\n this.api.usdm.close();\n this.api.spot.close();\n this.renewal.close();\n this.heartbeat.stop();\n this.events.emit('ws.platform.closed', {});\n }\n\n /** Fill renewal deadlines into pool stats (RenewalController owns them). */\n private decorateStats(stats: WsConnectionStats[]): WsConnectionStats[] {\n return stats.map((entry) => ({\n ...entry,\n nextRenewalAt: this.renewal.nextRenewalAt(entry.name),\n }));\n }\n}\n\n/**\n * Build the platform from a core context. Kept as a factory (not a getter on\n * the context's public type) so the context stays free of platform imports\n * while still exposing the lazily-built instance via `core.ws`.\n */\nexport function createWsPlatform(\n core: Pick<CoreContext, 'endpoints' | 'credentials' | 'events' | 'transport'>,\n platform?: WsPlatformOptions,\n): WsPlatform {\n return new WsPlatform({ core, platform });\n}\n\n/** Documented per-family stream ceilings (for callers sizing pools). */\nexport function familyLimits(family: WsFamily): { maxStreamsPerConnection: number; defaultMaxConnections: number } {\n return WS_FAMILY_LIMITS[family];\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { TradingPolicy } from '../client/TradingPolicy.js';\nimport type { RateLimitUsage } from '../client/RateLimitTracker.js';\nimport { resolveEnvironment, type Endpoints, type Environment } from '../client/endpoints.js';\nimport type { BinanceClientOptions } from '../client/BinanceClient.js';\nimport { EventBus } from './events.js';\nimport { RiskGateway } from '../risk/RiskGateway.js';\nimport { Credentials } from './credentials.js';\nimport { createWsPlatform, type WsPlatform, type WsPlatformOptions } from '../ws/platform/WsPlatform.js';\n\n/**\n * The REST hosts a {@link CoreContext} can serve. Each host gets exactly one\n * cached `HttpClient` (its own weight budget and clock offset), created on\n * first use — a spot-only client never builds the futures transports.\n */\nexport type RestHost = 'fapiRoot' | 'fapi' | 'spot' | 'apiRoot' | 'dapiRoot' | 'dapi';\n\n/** Transport tuning shared by every host client. */\nexport interface CoreTransportOptions {\n recvWindow: number;\n timeoutMs: number;\n maxRetries: number;\n retryBaseDelayMs?: number;\n retryMaxDelayMs?: number;\n rateLimitWeightPerMinute?: number;\n rateLimitSafetyMargin?: number;\n /** Custom keep-alive/https agent, e.g. corporate proxies or connection pooling. */\n httpsAgent?: ConstructorParameters<typeof HttpClient>[0]['httpsAgent'];\n /** Axios proxy configuration. */\n proxy?: ConstructorParameters<typeof HttpClient>[0]['proxy'];\n}\n\nconst HOST_URL: Record<RestHost, (e: Endpoints) => string> = {\n fapiRoot: (e) => e.restRoot,\n fapi: (e) => e.restFapi,\n spot: (e) => e.restSpot,\n apiRoot: (e) => e.restApiRoot,\n dapiRoot: (e) => e.restDapiRoot,\n dapi: (e) => e.restDapi,\n};\n\n/**\n * v3 core context: the shared runtime every product client is constructed\n * from — one transport pool, one credential set, one observability bus, one\n * policy chain.\n *\n * The v2 `BinanceClient` built these inline in its constructor and handed\n * raw pieces to each product namespace. v3 makes the bundle explicit so\n * products (USDM first, then Spot/COIN-M/…) are plug-ins over the same\n * runtime rather than parallel copies of infrastructure:\n *\n * ```ts\n * const core = new CoreContext({ apiKey, apiSecret });\n * const usdm = new USDMClient(core); // full USDⓈ-M surface\n * await core.syncTime(); // every host's clock offset\n * ```\n *\n * Nothing here performs network I/O at construction: HttpClients, WS\n * managers and product namespaces are all lazy, so a market-data-only\n * caller pays for exactly the sockets it opens.\n */\nexport class CoreContext {\n /** 'live' | 'testnet' | 'demo'. */\n readonly env: Environment;\n /** Resolved REST/WS URLs for the environment. */\n readonly endpoints: Endpoints;\n /** Authentication material (never I/O). */\n readonly credentials: Credentials;\n /** Structured observability bus (`http.*`, `ws.*`, `execution.*`, `risk.*`). */\n readonly events: EventBus;\n /** The active guardrail policy, when `safety` was configured. */\n readonly policy?: TradingPolicy;\n /** Retry/timeout/rate-limit tuning shared by every host transport. */\n readonly transport: CoreTransportOptions;\n\n private readonly httpClients = new Map<RestHost, HttpClient>();\n private wsPlatformValue: WsPlatform | undefined;\n private readonly wsPlatformOptions?: WsPlatformOptions;\n\n constructor(options: BinanceClientOptions & { wsPlatform?: WsPlatformOptions } = {}) {\n const { wsPlatform, ...clientOptions } = options;\n this.wsPlatformOptions = wsPlatform;\n const { env, endpoints } = resolveEnvironment(clientOptions);\n this.env = env;\n this.endpoints = endpoints;\n this.events = (clientOptions.events as EventBus) ?? new EventBus();\n this.credentials = Credentials.fromOptions(clientOptions);\n const riskGateway = clientOptions.safety ? new RiskGateway(clientOptions.safety, this.events) : undefined;\n this.policy = riskGateway ?? (clientOptions.safety ? new TradingPolicy(clientOptions.safety) : undefined);\n this.transport = {\n recvWindow: clientOptions.recvWindow ?? 5000,\n timeoutMs: clientOptions.timeoutMs ?? 15_000,\n maxRetries: clientOptions.maxRetries ?? 3,\n retryBaseDelayMs: clientOptions.retryBaseDelayMs,\n retryMaxDelayMs: clientOptions.retryMaxDelayMs,\n rateLimitWeightPerMinute: clientOptions.rateLimitWeightPerMinute,\n rateLimitSafetyMargin: clientOptions.rateLimitSafetyMargin,\n httpsAgent: clientOptions.httpsAgent,\n proxy: clientOptions.proxy,\n };\n }\n\n /**\n * The v3 WebSocket platform: pooled market-stream connections with\n * subscription objects, central liveness/renewal, and persistent WS API\n * clients. Lazily built on first access — a REST-only caller never pays\n * for it. One platform per context: every product client and the facade\n * share the same connection pools.\n *\n * ```ts\n * const sub = await core.ws.usdm.subscribe('btcusdt@aggTrade');\n * sub.on('message', (payload) => …);\n * ```\n */\n get ws(): WsPlatform {\n if (!this.wsPlatformValue) {\n this.wsPlatformValue = createWsPlatform(this, this.wsPlatformOptions);\n }\n return this.wsPlatformValue;\n }\n\n /** True when the WS platform has been constructed (cheap, no I/O). */\n hasWs(): boolean {\n return this.wsPlatformValue !== undefined;\n }\n\n /** Close the WS platform (subscriptions, pools, WS API clients). No-op when never built. */\n closeWebSockets(): void {\n this.wsPlatformValue?.close();\n }\n\n /**\n * The cached `HttpClient` for a REST host. First access constructs it with\n * the context's credentials, policy, events and transport options; later\n * calls return the same instance (same weight budget, same clock offset).\n */\n http(host: RestHost): HttpClient {\n let client = this.httpClients.get(host);\n if (!client) {\n client = new HttpClient({\n baseURL: HOST_URL[host](this.endpoints),\n apiKey: this.credentials.apiKey,\n apiSecret: this.credentials.apiSecret,\n privateKey: this.credentials.privateKey,\n signatureAlgorithm: this.credentials.signatureAlgorithm,\n policy: this.policy,\n events: this.events,\n recvWindow: this.transport.recvWindow,\n timeoutMs: this.transport.timeoutMs,\n maxRetries: this.transport.maxRetries,\n retryBaseDelayMs: this.transport.retryBaseDelayMs,\n retryMaxDelayMs: this.transport.retryMaxDelayMs,\n rateLimitWeightPerMinute: this.transport.rateLimitWeightPerMinute,\n rateLimitSafetyMargin: this.transport.rateLimitSafetyMargin,\n httpsAgent: this.transport.httpsAgent,\n proxy: this.transport.proxy,\n });\n this.httpClients.set(host, client);\n }\n return client;\n }\n\n /** True when the given host's transport has been constructed. */\n hasHttp(host: RestHost): boolean {\n return this.httpClients.has(host);\n }\n\n /**\n * Weight/order-count usage snapshots for every *constructed* host — cheap\n * (no I/O), and unconstructed hosts are simply absent rather than forced\n * into existence by an observability read.\n */\n httpUsage(): Partial<Record<RestHost, RateLimitUsage>> {\n const usage: Partial<Record<RestHost, RateLimitUsage>> = {};\n for (const [host, client] of this.httpClients) usage[host] = client.getRateLimitUsage();\n return usage;\n }\n\n /**\n * Sync local time against every REST host's server clock (fapi, spot, dapi\n * and sapi roots) and store the offsets for subsequent signed requests.\n * Mitigates `-1021` errors from local clock drift.\n */\n async syncTime(): Promise<void> {\n await Promise.all([\n this.http('fapiRoot').syncTime('/fapi/v1/time'),\n this.http('spot').syncTime('/time'),\n this.http('dapiRoot').syncTime('/dapi/v1/time'),\n this.http('apiRoot').syncTime('/api/v3/time'),\n ]);\n }\n\n /** Close is a no-op for REST transports; WS lifecycle lives in products. */\n describe(): string {\n return `CoreContext(${this.env}, ${this.credentials.describe()}, hosts: [${[...this.httpClients.keys()].join(', ')}])`;\n }\n}\n","import { z } from 'zod';\n\nexport const MarginAssetBalanceSchema = z.object({\n asset: z.string(),\n borrowed: z.string().transform(Number),\n free: z.string().transform(Number),\n interest: z.string().transform(Number),\n locked: z.string().transform(Number),\n netAsset: z.string().transform(Number),\n});\nexport type MarginAssetBalance = z.infer<typeof MarginAssetBalanceSchema>;\n\nexport const CrossMarginAccountSchema = z\n .object({\n borrowEnabled: z.boolean(),\n marginLevel: z.string().transform(Number),\n totalAssetOfBtc: z.string().transform(Number),\n totalLiabilityOfBtc: z.string().transform(Number),\n totalNetAssetOfBtc: z.string().transform(Number),\n tradeEnabled: z.boolean(),\n transferEnabled: z.boolean(),\n accountType: z.string().optional(),\n userAssets: z.array(MarginAssetBalanceSchema),\n })\n .loose();\nexport type CrossMarginAccount = z.infer<typeof CrossMarginAccountSchema>;\n\nexport const IsolatedMarginAssetSchema = z\n .object({\n asset: z.string(),\n borrowEnabled: z.boolean(),\n borrowed: z.string().transform(Number),\n free: z.string().transform(Number),\n interest: z.string().transform(Number),\n locked: z.string().transform(Number),\n netAsset: z.string().transform(Number),\n netAssetOfBtc: z.string().transform(Number),\n repayEnabled: z.boolean(),\n totalAsset: z.string().transform(Number),\n })\n .loose();\nexport type IsolatedMarginAsset = z.infer<typeof IsolatedMarginAssetSchema>;\n\nexport const IsolatedMarginSymbolSchema = z\n .object({\n baseAsset: IsolatedMarginAssetSchema,\n quoteAsset: IsolatedMarginAssetSchema,\n symbol: z.string(),\n isolatedCreated: z.boolean().optional(),\n enabled: z.boolean(),\n marginLevel: z.string().transform(Number),\n marginLevelStatus: z.string().optional(),\n marginRatio: z.string().transform(Number).optional(),\n indexPrice: z.string().transform(Number).optional(),\n liquidatePrice: z.string().transform(Number).optional(),\n liquidateRate: z.string().transform(Number).optional(),\n tradeEnabled: z.boolean(),\n })\n .loose();\nexport type IsolatedMarginSymbol = z.infer<typeof IsolatedMarginSymbolSchema>;\n\nexport const IsolatedMarginAccountSchema = z.object({\n assets: z.array(IsolatedMarginSymbolSchema),\n totalAssetOfBtc: z.string().transform(Number).optional(),\n totalLiabilityOfBtc: z.string().transform(Number).optional(),\n totalNetAssetOfBtc: z.string().transform(Number).optional(),\n});\nexport type IsolatedMarginAccount = z.infer<typeof IsolatedMarginAccountSchema>;\n\nexport const MaxBorrowableSchema = z.object({\n amount: z.string().transform(Number),\n borrowLimit: z.string().transform(Number),\n});\nexport type MaxBorrowable = z.infer<typeof MaxBorrowableSchema>;\n\nexport const MaxTransferableSchema = z.object({\n amount: z.string().transform(Number),\n fullAmount: z.string().transform(Number).optional(),\n});\nexport type MaxTransferable = z.infer<typeof MaxTransferableSchema>;\n\nexport const BorrowRepayParamsSchema = z.object({\n asset: z.string(),\n isIsolated: z.enum(['TRUE', 'FALSE']).optional(),\n symbol: z.string().optional(),\n amount: z.union([z.string(), z.number()]),\n type: z.enum(['BORROW', 'REPAY']),\n});\nexport type BorrowRepayParams = z.infer<typeof BorrowRepayParamsSchema>;\n\nexport const BorrowRepayResultSchema = z.object({ tranId: z.number() });\nexport type BorrowRepayResult = z.infer<typeof BorrowRepayResultSchema>;\n\nexport const BorrowRepayRecordEntrySchema = z\n .object({\n isolatedSymbol: z.string().optional(),\n txId: z.number(),\n asset: z.string(),\n principal: z.string().transform(Number),\n timestamp: z.number(),\n status: z.string(),\n })\n .loose();\nexport type BorrowRepayRecordEntry = z.infer<typeof BorrowRepayRecordEntrySchema>;\n\nexport const BorrowRepayRecordResponseSchema = z.object({\n rows: z.array(BorrowRepayRecordEntrySchema),\n total: z.number(),\n});\nexport type BorrowRepayRecordResponse = z.infer<typeof BorrowRepayRecordResponseSchema>;\n\nexport const MarginTransferResultSchema = z.object({ tranId: z.number() });\nexport type MarginTransferResult = z.infer<typeof MarginTransferResultSchema>;\n\nexport const IsolatedTransferParamsSchema = z.object({\n asset: z.string(),\n symbol: z.string(),\n transFrom: z.enum(['SPOT', 'ISOLATED_MARGIN']),\n transTo: z.enum(['SPOT', 'ISOLATED_MARGIN']),\n amount: z.union([z.string(), z.number()]),\n});\nexport type IsolatedTransferParams = z.infer<typeof IsolatedTransferParamsSchema>;\n\nexport const MarginInterestHistoryEntrySchema = z\n .object({\n txId: z.number(),\n interestAccuredTime: z.number(),\n asset: z.string(),\n rawAsset: z.string().optional(),\n principal: z.string().transform(Number),\n interest: z.string().transform(Number),\n interestRate: z.string().transform(Number),\n type: z.string(),\n isolatedSymbol: z.string().optional(),\n })\n .loose();\nexport type MarginInterestHistoryEntry = z.infer<typeof MarginInterestHistoryEntrySchema>;\n\nexport const MarginInterestHistoryResponseSchema = z.object({\n rows: z.array(MarginInterestHistoryEntrySchema),\n total: z.number(),\n});\nexport type MarginInterestHistoryResponse = z.infer<typeof MarginInterestHistoryResponseSchema>;\n\nexport const MarginForceLiquidationEntrySchema = z\n .object({\n avgPrice: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n orderId: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n side: z.string(),\n symbol: z.string(),\n timeInForce: z.string(),\n isIsolated: z.boolean().optional(),\n updatedTime: z.number(),\n })\n .loose();\nexport type MarginForceLiquidationEntry = z.infer<typeof MarginForceLiquidationEntrySchema>;\n\nexport const MarginForceLiquidationResponseSchema = z.object({\n rows: z.array(MarginForceLiquidationEntrySchema),\n total: z.number(),\n});\nexport type MarginForceLiquidationResponse = z.infer<typeof MarginForceLiquidationResponseSchema>;\n\nexport const MarginPriceIndexSchema = z.object({\n calcTime: z.number(),\n price: z.string().transform(Number),\n symbol: z.string(),\n});\nexport type MarginPriceIndex = z.infer<typeof MarginPriceIndexSchema>;\n\nexport const MarginOrderSchema = z\n .object({\n symbol: z.string(),\n orderId: z.number(),\n clientOrderId: z.string(),\n isIsolated: z.boolean().optional(),\n price: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cummulativeQuoteQty: z.string().transform(Number),\n status: z.string(),\n timeInForce: z.string().optional(),\n type: z.string(),\n side: z.string(),\n transactTime: z.number().optional(),\n time: z.number().optional(),\n updateTime: z.number().optional(),\n fills: z.array(z.unknown()).optional(),\n })\n .loose();\nexport type MarginOrder = z.infer<typeof MarginOrderSchema>;\nexport const MarginOrderResponseSchema = MarginOrderSchema;\nexport const MarginOrdersResponseSchema = z.array(MarginOrderSchema);\n\nexport const MarginCreateOrderParamsSchema = z.object({\n symbol: z.string(),\n isIsolated: z.enum(['TRUE', 'FALSE']).optional(),\n side: z.enum(['BUY', 'SELL']),\n type: z.string(),\n quantity: z.union([z.string(), z.number()]).optional(),\n quoteOrderQty: z.union([z.string(), z.number()]).optional(),\n price: z.union([z.string(), z.number()]).optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n newClientOrderId: z.string().optional(),\n icebergQty: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional(),\n sideEffectType: z.enum(['NO_SIDE_EFFECT', 'MARGIN_BUY', 'AUTO_REPAY', 'AUTO_BORROW_REPAY']).optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT', 'FULL']).optional(),\n autoRepayAtCancel: z.boolean().optional(),\n});\nexport type MarginCreateOrderParams = z.infer<typeof MarginCreateOrderParamsSchema>;\n\nexport const MarginTradeSchema = z\n .object({\n symbol: z.string(),\n id: z.number(),\n orderId: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n time: z.number(),\n isBuyer: z.boolean(),\n isMaker: z.boolean(),\n isBestMatch: z.boolean().optional(),\n isIsolated: z.boolean().optional(),\n })\n .loose();\nexport type MarginTrade = z.infer<typeof MarginTradeSchema>;\nexport const MarginTradesResponseSchema = z.array(MarginTradeSchema);\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n BorrowRepayParams,\n BorrowRepayRecordResponse,\n BorrowRepayRecordResponseSchema,\n BorrowRepayResult,\n BorrowRepayResultSchema,\n CrossMarginAccount,\n CrossMarginAccountSchema,\n IsolatedMarginAccount,\n IsolatedMarginAccountSchema,\n IsolatedTransferParams,\n MarginCreateOrderParams,\n MarginForceLiquidationResponse,\n MarginForceLiquidationResponseSchema,\n MarginInterestHistoryResponse,\n MarginInterestHistoryResponseSchema,\n MarginOrder,\n MarginOrderResponseSchema,\n MarginOrdersResponseSchema,\n MarginPriceIndex,\n MarginPriceIndexSchema,\n MarginTradesResponseSchema,\n MarginTrade,\n MarginTransferResult,\n MarginTransferResultSchema,\n MaxBorrowable,\n MaxBorrowableSchema,\n MaxTransferable,\n MaxTransferableSchema,\n} from '../types/margin.types.js';\n\nexport class MarginAccount {\n constructor(private readonly http: HttpClient) {}\n\n async crossAccount(): Promise<CrossMarginAccount> {\n return CrossMarginAccountSchema.parse(await this.http.get('/sapi/v1/margin/account', undefined, 'signed'));\n }\n\n async isolatedAccount(symbols?: string[]): Promise<IsolatedMarginAccount> {\n const params = symbols?.length ? { symbols: symbols.join(',') } : undefined;\n return IsolatedMarginAccountSchema.parse(\n await this.http.get('/sapi/v1/margin/isolated/account', params, 'signed'),\n );\n }\n\n async maxBorrowable(asset: string, isolatedSymbol?: string): Promise<MaxBorrowable> {\n return MaxBorrowableSchema.parse(\n await this.http.get('/sapi/v1/margin/maxBorrowable', { asset, isolatedSymbol }, 'signed'),\n );\n }\n\n async maxTransferable(asset: string, isolatedSymbol?: string): Promise<MaxTransferable> {\n return MaxTransferableSchema.parse(\n await this.http.get('/sapi/v1/margin/maxTransferable', { asset, isolatedSymbol }, 'signed'),\n );\n }\n\n async borrowRepay(params: BorrowRepayParams): Promise<BorrowRepayResult> {\n return BorrowRepayResultSchema.parse(\n await this.http.post('/sapi/v1/margin/borrow-repay', params, 'signed'),\n );\n }\n\n async borrow(asset: string, amount: number, options?: { isIsolated?: boolean; symbol?: string }): Promise<BorrowRepayResult> {\n return this.borrowRepay({\n asset,\n amount,\n type: 'BORROW',\n isIsolated: options?.isIsolated ? 'TRUE' : undefined,\n symbol: options?.symbol,\n });\n }\n\n async repay(asset: string, amount: number, options?: { isIsolated?: boolean; symbol?: string }): Promise<BorrowRepayResult> {\n return this.borrowRepay({\n asset,\n amount,\n type: 'REPAY',\n isIsolated: options?.isIsolated ? 'TRUE' : undefined,\n symbol: options?.symbol,\n });\n }\n\n async borrowRepayRecord(\n type: 'BORROW' | 'REPAY',\n options?: { asset?: string; isolatedSymbol?: string; startTime?: number; endTime?: number; current?: number; size?: number },\n ): Promise<BorrowRepayRecordResponse> {\n return BorrowRepayRecordResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/borrow-repay', { type, ...options }, 'signed'),\n );\n }\n\n async transfer(asset: string, amount: number, type: 1 | 2): Promise<MarginTransferResult> {\n return MarginTransferResultSchema.parse(\n await this.http.post('/sapi/v1/margin/transfer', { asset, amount, type }, 'signed'),\n );\n }\n\n async isolatedTransfer(params: IsolatedTransferParams): Promise<MarginTransferResult> {\n return MarginTransferResultSchema.parse(\n await this.http.post('/sapi/v1/margin/isolated/transfer', params, 'signed'),\n );\n }\n\n async interestHistory(options?: {\n asset?: string;\n isolatedSymbol?: string;\n startTime?: number;\n endTime?: number;\n current?: number;\n size?: number;\n }): Promise<MarginInterestHistoryResponse> {\n return MarginInterestHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/interestHistory', options, 'signed'),\n );\n }\n\n async forceLiquidationRecord(options?: {\n startTime?: number;\n endTime?: number;\n isolatedSymbol?: string;\n current?: number;\n size?: number;\n }): Promise<MarginForceLiquidationResponse> {\n return MarginForceLiquidationResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/forceLiquidationRec', options, 'signed'),\n );\n }\n\n async priceIndex(symbol: string): Promise<MarginPriceIndex> {\n return MarginPriceIndexSchema.parse(await this.http.get('/sapi/v1/margin/priceIndex', { symbol }));\n }\n}\n\nexport class MarginTrading {\n constructor(private readonly http: HttpClient) {}\n\n async createOrder(params: MarginCreateOrderParams): Promise<MarginOrder> {\n return MarginOrderResponseSchema.parse(await this.http.post('/sapi/v1/margin/order', params, 'signed'));\n }\n\n async cancelOrder(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; origClientOrderId?: string; newClientOrderId?: string },\n ): Promise<MarginOrder> {\n return MarginOrderResponseSchema.parse(\n await this.http.delete('/sapi/v1/margin/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelAllOpenOrders(symbol: string, isIsolated?: 'TRUE' | 'FALSE'): Promise<MarginOrder[]> {\n return MarginOrdersResponseSchema.parse(\n await this.http.delete('/sapi/v1/margin/openOrders', { symbol, isIsolated }, 'signed'),\n );\n }\n\n async getOrder(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; origClientOrderId?: string },\n ): Promise<MarginOrder> {\n return MarginOrderResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenOrders(options?: { symbol?: string; isIsolated?: 'TRUE' | 'FALSE' }): Promise<MarginOrder[]> {\n return MarginOrdersResponseSchema.parse(await this.http.get('/sapi/v1/margin/openOrders', options, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<MarginOrder[]> {\n return MarginOrdersResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async myTrades(\n symbol: string,\n options?: { isIsolated?: 'TRUE' | 'FALSE'; orderId?: number; startTime?: number; endTime?: number; fromId?: number; limit?: number },\n ): Promise<MarginTrade[]> {\n return MarginTradesResponseSchema.parse(\n await this.http.get('/sapi/v1/margin/myTrades', { symbol, ...options }, 'signed'),\n );\n }\n}\n","import { z } from 'zod';\n\nexport const TransferTypeSchema = z.enum([\n 'MAIN_UMFUTURE', 'MAIN_CMFUTURE', 'MAIN_MARGIN', 'MAIN_MINING', 'MAIN_FUNDING', 'MAIN_OPTION',\n 'UMFUTURE_MAIN', 'UMFUTURE_MARGIN', 'UMFUTURE_FUNDING',\n 'CMFUTURE_MAIN', 'CMFUTURE_MARGIN',\n 'MARGIN_MAIN', 'MARGIN_UMFUTURE', 'MARGIN_CMFUTURE', 'MARGIN_MINING', 'MARGIN_FUNDING',\n 'MINING_MAIN', 'MINING_UMFUTURE', 'MINING_MARGIN',\n 'FUNDING_MAIN', 'FUNDING_UMFUTURE', 'FUNDING_MARGIN', 'FUNDING_CMFUTURE',\n 'OPTION_MAIN', 'MAIN_OPTION_MARGIN',\n 'MAIN_PORTFOLIO_MARGIN', 'PORTFOLIO_MARGIN_MAIN',\n 'ISOLATEDMARGIN_MARGIN', 'MARGIN_ISOLATEDMARGIN', 'ISOLATEDMARGIN_ISOLATEDMARGIN',\n]);\nexport type TransferType = z.infer<typeof TransferTypeSchema>;\n\nexport const UniversalTransferParamsSchema = z.object({\n type: TransferTypeSchema,\n asset: z.string(),\n amount: z.union([z.string(), z.number()]),\n fromSymbol: z.string().optional(),\n toSymbol: z.string().optional(),\n});\nexport type UniversalTransferParams = z.infer<typeof UniversalTransferParamsSchema>;\n\nexport const UniversalTransferResultSchema = z.object({ tranId: z.number() });\nexport type UniversalTransferResult = z.infer<typeof UniversalTransferResultSchema>;\n\nexport const UniversalTransferHistoryEntrySchema = z\n .object({\n asset: z.string(),\n amount: z.string().transform(Number),\n type: z.string(),\n status: z.string(),\n tranId: z.number(),\n timestamp: z.number(),\n fromSymbol: z.string().nullable().optional(),\n toSymbol: z.string().nullable().optional(),\n })\n .loose();\nexport type UniversalTransferHistoryEntry = z.infer<typeof UniversalTransferHistoryEntrySchema>;\n\nexport const UniversalTransferHistoryResponseSchema = z.object({\n total: z.number(),\n rows: z.array(UniversalTransferHistoryEntrySchema),\n});\nexport type UniversalTransferHistoryResponse = z.infer<typeof UniversalTransferHistoryResponseSchema>;\n\nexport const FundingAssetSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n freeze: z.string().transform(Number),\n withdrawing: z.string().transform(Number),\n btcValuation: z.string().transform(Number),\n});\nexport type FundingAsset = z.infer<typeof FundingAssetSchema>;\nexport const FundingAssetsResponseSchema = z.array(FundingAssetSchema);\n\nexport const UserAssetSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n freeze: z.string().transform(Number),\n withdrawing: z.string().transform(Number),\n ipoable: z.string().transform(Number),\n btcValuation: z.string().transform(Number),\n});\nexport type UserAsset = z.infer<typeof UserAssetSchema>;\nexport const UserAssetsResponseSchema = z.array(UserAssetSchema);\n\nexport const DepositHistoryEntrySchema = z\n .object({\n id: z.string(),\n amount: z.string().transform(Number),\n coin: z.string(),\n network: z.string(),\n status: z.number(),\n address: z.string(),\n addressTag: z.string().optional(),\n txId: z.string(),\n insertTime: z.number(),\n transferType: z.number(),\n confirmTimes: z.string().optional(),\n unlockConfirm: z.union([z.string(), z.number()]).optional(),\n walletType: z.number().optional(),\n })\n .loose();\nexport type DepositHistoryEntry = z.infer<typeof DepositHistoryEntrySchema>;\nexport const DepositHistoryResponseSchema = z.array(DepositHistoryEntrySchema);\n\nexport const WithdrawHistoryEntrySchema = z\n .object({\n id: z.string(),\n amount: z.string().transform(Number),\n transactionFee: z.string().transform(Number),\n coin: z.string(),\n status: z.number(),\n address: z.string(),\n txId: z.string().optional(),\n applyTime: z.string(),\n network: z.string(),\n transferType: z.number(),\n withdrawOrderId: z.string().nullable().optional(),\n info: z.string().optional(),\n confirmNo: z.number().optional(),\n walletType: z.number().optional(),\n })\n .loose();\nexport type WithdrawHistoryEntry = z.infer<typeof WithdrawHistoryEntrySchema>;\nexport const WithdrawHistoryResponseSchema = z.array(WithdrawHistoryEntrySchema);\n\nexport const WithdrawParamsSchema = z.object({\n coin: z.string(),\n address: z.string(),\n amount: z.union([z.string(), z.number()]),\n withdrawOrderId: z.string().optional(),\n network: z.string().optional(),\n addressTag: z.string().optional(),\n transactionFeeFlag: z.boolean().optional(),\n name: z.string().optional(),\n walletType: z.number().optional(),\n});\nexport type WithdrawParams = z.infer<typeof WithdrawParamsSchema>;\n\nexport const WithdrawResultSchema = z.object({ id: z.string() });\nexport type WithdrawResult = z.infer<typeof WithdrawResultSchema>;\n\nexport const DepositAddressSchema = z.object({\n address: z.string(),\n coin: z.string(),\n tag: z.string(),\n url: z.string().optional(),\n});\nexport type DepositAddress = z.infer<typeof DepositAddressSchema>;\n\nexport const ApiKeyPermissionsSchema = z\n .object({\n ipRestrict: z.boolean(),\n createTime: z.number(),\n enableWithdrawals: z.boolean(),\n enableInternalTransfer: z.boolean(),\n enableFutures: z.boolean(),\n enableMargin: z.boolean(),\n enableSpotAndMarginTrading: z.boolean(),\n permitsUniversalTransfer: z.boolean().optional(),\n enableReading: z.boolean().optional(),\n tradingAuthorityExpirationTime: z.number().optional(),\n })\n .loose();\nexport type ApiKeyPermissions = z.infer<typeof ApiKeyPermissionsSchema>;\n\nexport const AssetDetailSchema = z.record(\n z.string(),\n z\n .object({\n minWithdrawAmount: z.string().transform(Number),\n depositStatus: z.boolean(),\n withdrawFee: z.number(),\n withdrawStatus: z.boolean(),\n depositTip: z.string().optional(),\n })\n .loose(),\n);\nexport type AssetDetail = z.infer<typeof AssetDetailSchema>;\n\nexport const DustLogEntrySchema = z\n .object({\n transId: z.number(),\n serviceChargeAmount: z.string().transform(Number),\n amount: z.string().transform(Number),\n operateTime: z.string(),\n transferedAmount: z.string().transform(Number),\n fromAsset: z.string(),\n })\n .loose();\nexport type DustLogEntry = z.infer<typeof DustLogEntrySchema>;\n\nexport const DustLogResponseSchema = z.object({\n total: z.number(),\n userAssetDribblets: z.array(\n z.object({\n operateTime: z.number(),\n totalTransferedAmount: z.string().transform(Number),\n totalServiceChargeAmount: z.string().transform(Number),\n transId: z.number(),\n userAssetDribbletDetails: z.array(DustLogEntrySchema),\n }),\n ),\n});\nexport type DustLogResponse = z.infer<typeof DustLogResponseSchema>;\n\nexport const DustConversionResultSchema = z\n .object({\n totalServiceCharge: z.string().transform(Number),\n totalTransfered: z.string().transform(Number),\n transferResult: z.array(\n z\n .object({\n amount: z.string().transform(Number),\n fromAsset: z.string(),\n operateTime: z.number(),\n serviceChargeAmount: z.string().transform(Number),\n tranId: z.number(),\n transferedAmount: z.string().transform(Number),\n })\n .loose(),\n ),\n })\n .loose();\nexport type DustConversionResult = z.infer<typeof DustConversionResultSchema>;\n\nexport const TradeFeeEntrySchema = z.object({\n symbol: z.string(),\n makerCommission: z.string().transform(Number),\n takerCommission: z.string().transform(Number),\n});\nexport type TradeFeeEntry = z.infer<typeof TradeFeeEntrySchema>;\nexport const TradeFeeResponseSchema = z.array(TradeFeeEntrySchema);\n\nexport const AccountSnapshotSchema = z\n .object({\n code: z.number(),\n msg: z.string(),\n snapshotVos: z.array(\n z\n .object({\n type: z.string(),\n updateTime: z.number(),\n data: z.record(z.string(), z.unknown()),\n })\n .loose(),\n ),\n })\n .loose();\nexport type AccountSnapshot = z.infer<typeof AccountSnapshotSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n AccountSnapshot,\n AccountSnapshotSchema,\n ApiKeyPermissions,\n ApiKeyPermissionsSchema,\n AssetDetail,\n AssetDetailSchema,\n DepositAddress,\n DepositAddressSchema,\n DepositHistoryEntry,\n DepositHistoryResponseSchema,\n DustConversionResult,\n DustConversionResultSchema,\n DustLogResponse,\n DustLogResponseSchema,\n FundingAsset,\n FundingAssetsResponseSchema,\n TradeFeeEntry,\n TradeFeeResponseSchema,\n UniversalTransferHistoryResponse,\n UniversalTransferHistoryResponseSchema,\n UniversalTransferParams,\n UniversalTransferResult,\n UniversalTransferResultSchema,\n UserAsset,\n UserAssetsResponseSchema,\n WithdrawHistoryEntry,\n WithdrawHistoryResponseSchema,\n WithdrawParams,\n WithdrawResult,\n WithdrawResultSchema,\n} from '../types/wallet.types.js';\n\nexport class Wallet {\n constructor(private readonly http: HttpClient) {}\n\n async universalTransfer(params: UniversalTransferParams): Promise<UniversalTransferResult> {\n return UniversalTransferResultSchema.parse(\n await this.http.post('/sapi/v1/asset/transfer', params, 'signed'),\n );\n }\n\n async universalTransferHistory(options: {\n type: string;\n startTime?: number;\n endTime?: number;\n current?: number;\n size?: number;\n fromSymbol?: string;\n toSymbol?: string;\n }): Promise<UniversalTransferHistoryResponse> {\n return UniversalTransferHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/asset/transfer', options, 'signed'),\n );\n }\n\n async fundingWallet(options?: { asset?: string; needBtcValuation?: boolean }): Promise<FundingAsset[]> {\n return FundingAssetsResponseSchema.parse(\n await this.http.post('/sapi/v1/asset/get-funding-asset', options, 'signed'),\n );\n }\n\n async userAsset(options?: { asset?: string; needBtcValuation?: boolean }): Promise<UserAsset[]> {\n return UserAssetsResponseSchema.parse(\n await this.http.post('/sapi/v3/asset/getUserAsset', options, 'signed'),\n );\n }\n\n async depositHistory(options?: {\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n }): Promise<DepositHistoryEntry[]> {\n return DepositHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/hisrec', options, 'signed'),\n );\n }\n\n async withdrawHistory(options?: {\n coin?: string;\n withdrawOrderId?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n }): Promise<WithdrawHistoryEntry[]> {\n return WithdrawHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/capital/withdraw/history', options, 'signed'),\n );\n }\n\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n return WithdrawResultSchema.parse(\n await this.http.post('/sapi/v1/capital/withdraw/apply', params, 'signed'),\n );\n }\n\n async depositAddress(coin: string, network?: string): Promise<DepositAddress> {\n return DepositAddressSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/address', { coin, network }, 'signed'),\n );\n }\n\n async accountSnapshot(\n type: 'SPOT' | 'MARGIN' | 'FUTURES',\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<AccountSnapshot> {\n return AccountSnapshotSchema.parse(\n await this.http.get('/sapi/v1/accountSnapshot', { type, ...options }, 'signed'),\n );\n }\n\n async apiKeyPermissions(): Promise<ApiKeyPermissions> {\n return ApiKeyPermissionsSchema.parse(\n await this.http.get('/sapi/v1/account/apiRestrictions', undefined, 'signed'),\n );\n }\n\n async assetDetail(asset?: string): Promise<AssetDetail> {\n const params = asset ? { asset } : undefined;\n return AssetDetailSchema.parse(await this.http.get('/sapi/v1/asset/assetDetail', params, 'signed'));\n }\n\n async dustLog(options?: { accountType?: 'SPOT' | 'MARGIN'; startTime?: number; endTime?: number }): Promise<DustLogResponse> {\n return DustLogResponseSchema.parse(\n await this.http.get('/sapi/v1/asset/dribblet', options, 'signed'),\n );\n }\n\n async convertDustToBnb(assets: string[], accountType?: 'SPOT' | 'MARGIN'): Promise<DustConversionResult> {\n return DustConversionResultSchema.parse(\n await this.http.post('/sapi/v1/asset/dust', { asset: assets, accountType }, 'signed'),\n );\n }\n\n async tradeFee(symbol?: string): Promise<TradeFeeEntry[]> {\n const params = symbol ? { symbol } : undefined;\n return TradeFeeResponseSchema.parse(await this.http.get('/sapi/v1/asset/tradeFee', params, 'signed'));\n }\n}\n","import { z } from 'zod';\n\nexport const SubAccountEntrySchema = z\n .object({\n email: z.string(),\n isFreeze: z.boolean(),\n createTime: z.number(),\n isManagedSubAccount: z.boolean().optional(),\n isAssetManagementSubAccount: z.boolean().optional(),\n type: z.string().optional(),\n })\n .loose();\nexport type SubAccountEntry = z.infer<typeof SubAccountEntrySchema>;\n\nexport const SubAccountListResponseSchema = z.object({\n subAccounts: z.array(SubAccountEntrySchema),\n});\nexport type SubAccountListResponse = z.infer<typeof SubAccountListResponseSchema>;\n\nexport const SubAccountStatusSchema = z\n .object({\n email: z.string(),\n isSubUserEnabled: z.boolean(),\n isUserActive: z.boolean(),\n insertTime: z.number(),\n isMarginEnabled: z.boolean(),\n isFutureEnabled: z.boolean(),\n mobile: z.number().optional(),\n })\n .loose();\nexport type SubAccountStatus = z.infer<typeof SubAccountStatusSchema>;\nexport const SubAccountStatusResponseSchema = z.array(SubAccountStatusSchema);\n\nexport const SubAccountSpotAssetSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n});\nexport type SubAccountSpotAsset = z.infer<typeof SubAccountSpotAssetSchema>;\n\nexport const SubAccountSpotAssetsResponseSchema = z.object({\n balances: z.array(SubAccountSpotAssetSchema),\n});\nexport type SubAccountSpotAssetsResponse = z.infer<typeof SubAccountSpotAssetsResponseSchema>;\n\nexport const SubAccountSpotSummaryEntrySchema = z\n .object({\n email: z.string(),\n totalAsset: z.string().transform(Number),\n })\n .loose();\nexport type SubAccountSpotSummaryEntry = z.infer<typeof SubAccountSpotSummaryEntrySchema>;\n\nexport const SubAccountSpotSummarySchema = z.object({\n totalCount: z.number(),\n masterAccountTotalAsset: z.string().transform(Number),\n spotSubUserAssetBtcVoList: z.array(SubAccountSpotSummaryEntrySchema),\n});\nexport type SubAccountSpotSummary = z.infer<typeof SubAccountSpotSummarySchema>;\n\nexport const SubAccountFuturesSummarySchema = z\n .object({\n totalCount: z.number().optional(),\n totalMarginBalanceOfBTC: z.string().transform(Number).optional(),\n totalUnrealizedProfitOfBTC: z.string().transform(Number).optional(),\n totalWalletBalanceOfBTC: z.string().transform(Number).optional(),\n subAccountList: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .loose();\nexport type SubAccountFuturesSummary = z.infer<typeof SubAccountFuturesSummarySchema>;\n\nexport const SubAccountMarginAccountSchema = z\n .object({\n email: z.string(),\n marginLevel: z.string().transform(Number),\n totalAssetOfBtc: z.string().transform(Number),\n totalLiabilityOfBtc: z.string().transform(Number),\n totalNetAssetOfBtc: z.string().transform(Number),\n marginTradeCoeffVo: z.record(z.string(), z.unknown()).optional(),\n marginUserAssetVoList: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .loose();\nexport type SubAccountMarginAccount = z.infer<typeof SubAccountMarginAccountSchema>;\n\nexport const SubAccountUniversalTransferParamsSchema = z.object({\n fromEmail: z.string().optional(),\n toEmail: z.string().optional(),\n fromAccountType: z.enum(['SPOT', 'USDT_FUTURE', 'COIN_FUTURE', 'MARGIN', 'ISOLATED_MARGIN']),\n toAccountType: z.enum(['SPOT', 'USDT_FUTURE', 'COIN_FUTURE', 'MARGIN', 'ISOLATED_MARGIN']),\n symbol: z.string().optional(),\n asset: z.string(),\n amount: z.union([z.string(), z.number()]),\n clientTranId: z.string().optional(),\n});\nexport type SubAccountUniversalTransferParams = z.infer<typeof SubAccountUniversalTransferParamsSchema>;\n\nexport const SubAccountUniversalTransferResultSchema = z.object({\n tranId: z.number(),\n clientTranId: z.string().optional(),\n});\nexport type SubAccountUniversalTransferResult = z.infer<typeof SubAccountUniversalTransferResultSchema>;\n\nexport const SubAccountUniversalTransferEntrySchema = z\n .object({\n tranId: z.number(),\n fromEmail: z.string(),\n toEmail: z.string(),\n asset: z.string(),\n amount: z.string().transform(Number),\n fromAccountType: z.string(),\n toAccountType: z.string(),\n status: z.string(),\n createTimeStamp: z.number(),\n clientTranId: z.string().optional(),\n })\n .loose();\nexport type SubAccountUniversalTransferEntry = z.infer<typeof SubAccountUniversalTransferEntrySchema>;\n\nexport const SubAccountUniversalTransferHistoryResponseSchema = z.object({\n result: z.array(SubAccountUniversalTransferEntrySchema),\n totalCount: z.number(),\n});\nexport type SubAccountUniversalTransferHistoryResponse = z.infer<\n typeof SubAccountUniversalTransferHistoryResponseSchema\n>;\n\nexport const VirtualSubAccountResultSchema = z.object({ email: z.string() });\nexport type VirtualSubAccountResult = z.infer<typeof VirtualSubAccountResultSchema>;\n\nexport const SubAccountDepositAddressSchema = z.object({\n address: z.string(),\n coin: z.string(),\n tag: z.string(),\n url: z.string().optional(),\n});\nexport type SubAccountDepositAddress = z.infer<typeof SubAccountDepositAddressSchema>;\n\nexport const SubAccountDepositHistoryEntrySchema = z\n .object({\n id: z.string(),\n amount: z.string().transform(Number),\n coin: z.string(),\n network: z.string(),\n status: z.number(),\n address: z.string(),\n txId: z.string(),\n insertTime: z.number(),\n transferType: z.number(),\n })\n .loose();\nexport type SubAccountDepositHistoryEntry = z.infer<typeof SubAccountDepositHistoryEntrySchema>;\nexport const SubAccountDepositHistoryResponseSchema = z.array(SubAccountDepositHistoryEntrySchema);\n\nexport const SubAccountEnableResultSchema = z\n .object({\n email: z.string(),\n isFuturesEnabled: z.boolean().optional(),\n isMarginEnabled: z.boolean().optional(),\n })\n .loose();\nexport type SubAccountEnableResult = z.infer<typeof SubAccountEnableResultSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n SubAccountEntry,\n SubAccountDepositAddress,\n SubAccountDepositAddressSchema,\n SubAccountDepositHistoryEntry,\n SubAccountDepositHistoryResponseSchema,\n SubAccountEnableResult,\n SubAccountEnableResultSchema,\n SubAccountFuturesSummary,\n SubAccountFuturesSummarySchema,\n SubAccountListResponseSchema,\n SubAccountMarginAccount,\n SubAccountMarginAccountSchema,\n SubAccountSpotAssetsResponse,\n SubAccountSpotAssetsResponseSchema,\n SubAccountSpotSummary,\n SubAccountSpotSummarySchema,\n SubAccountStatus,\n SubAccountStatusResponseSchema,\n SubAccountUniversalTransferHistoryResponse,\n SubAccountUniversalTransferHistoryResponseSchema,\n SubAccountUniversalTransferParams,\n SubAccountUniversalTransferResult,\n SubAccountUniversalTransferResultSchema,\n VirtualSubAccountResult,\n VirtualSubAccountResultSchema,\n} from '../types/subaccount.types.js';\n\nexport class SubAccount {\n constructor(private readonly http: HttpClient) {}\n\n async list(options?: { email?: string; isFreeze?: boolean; page?: number; limit?: number }): Promise<SubAccountEntry[]> {\n const res = await this.http.get('/sapi/v1/sub-account/list', options, 'signed');\n return SubAccountListResponseSchema.parse(res).subAccounts;\n }\n\n async status(email?: string): Promise<SubAccountStatus[]> {\n const params = email ? { email } : undefined;\n return SubAccountStatusResponseSchema.parse(\n await this.http.get('/sapi/v1/sub-account/status', params, 'signed'),\n );\n }\n\n async spotAssets(email: string): Promise<SubAccountSpotAssetsResponse> {\n return SubAccountSpotAssetsResponseSchema.parse(\n await this.http.get('/sapi/v3/sub-account/assets', { email }, 'signed'),\n );\n }\n\n async spotSummary(options?: { email?: string; page?: number; size?: number }): Promise<SubAccountSpotSummary> {\n return SubAccountSpotSummarySchema.parse(\n await this.http.get('/sapi/v1/sub-account/spotSummary', options, 'signed'),\n );\n }\n\n async futuresAccountSummary(futuresType: 1 | 2): Promise<SubAccountFuturesSummary> {\n return SubAccountFuturesSummarySchema.parse(\n await this.http.get('/sapi/v2/sub-account/futures/accountSummary', { futuresType }, 'signed'),\n );\n }\n\n async marginAccount(email: string): Promise<SubAccountMarginAccount> {\n return SubAccountMarginAccountSchema.parse(\n await this.http.get('/sapi/v1/sub-account/margin/account', { email }, 'signed'),\n );\n }\n\n async universalTransfer(params: SubAccountUniversalTransferParams): Promise<SubAccountUniversalTransferResult> {\n return SubAccountUniversalTransferResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/universalTransfer', params, 'signed'),\n );\n }\n\n async universalTransferHistory(options?: {\n fromEmail?: string;\n toEmail?: string;\n clientTranId?: string;\n startTime?: number;\n endTime?: number;\n page?: number;\n limit?: number;\n }): Promise<SubAccountUniversalTransferHistoryResponse> {\n return SubAccountUniversalTransferHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/sub-account/universalTransfer', options, 'signed'),\n );\n }\n\n async createVirtualSubAccount(subAccountString: string): Promise<VirtualSubAccountResult> {\n return VirtualSubAccountResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/virtualSubAccount', { subAccountString }, 'signed'),\n );\n }\n\n async enableFutures(email: string): Promise<SubAccountEnableResult> {\n return SubAccountEnableResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/futures/enable', { email }, 'signed'),\n );\n }\n\n async enableMargin(email: string): Promise<SubAccountEnableResult> {\n return SubAccountEnableResultSchema.parse(\n await this.http.post('/sapi/v1/sub-account/margin/enable', { email }, 'signed'),\n );\n }\n\n async depositAddress(email: string, coin: string, network?: string): Promise<SubAccountDepositAddress> {\n return SubAccountDepositAddressSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/subAddress', { email, coin, network }, 'signed'),\n );\n }\n\n async depositHistory(options: {\n email: string;\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n limit?: number;\n offset?: number;\n }): Promise<SubAccountDepositHistoryEntry[]> {\n return SubAccountDepositHistoryResponseSchema.parse(\n await this.http.get('/sapi/v1/capital/deposit/subHisrec', options, 'signed'),\n );\n }\n}\n","import { z } from 'zod';\n\n// ---- Spot order / OCO / trade ----\n\nexport const SpotOrderSchema = z\n .object({\n symbol: z.string(),\n orderId: z.number(),\n clientOrderId: z.string(),\n status: z.string(),\n side: z.string(),\n type: z.string(),\n timeInForce: z.string().optional(),\n price: z.string().transform(Number).optional(),\n origQty: z.string().transform(Number).optional(),\n executedQty: z.string().transform(Number).optional(),\n cummulativeQuoteQty: z.string().transform(Number).optional(),\n stopPrice: z.string().transform(Number).optional(),\n icebergQty: z.string().transform(Number).optional(),\n originalQuoteOrderQty: z.string().transform(Number).optional(),\n transactTime: z.number().optional(),\n workingTime: z.number().optional(),\n orderListId: z.number().optional(),\n selfTradePreventionMode: z.string().optional(),\n fills: z.array(z.unknown()).optional(),\n })\n .loose();\nexport type SpotOrder = z.infer<typeof SpotOrderSchema>;\nexport const SpotOrderResponseSchema = SpotOrderSchema;\nexport const SpotOrdersResponseSchema = z.array(SpotOrderSchema);\n\nexport const SpotOCOOrderAckSchema = z\n .object({\n orderListId: z.number(),\n contingencyType: z.string(),\n listStatusType: z.string(),\n listOrderStatus: z.string(),\n listClientOrderId: z.string(),\n transactionTime: z.number(),\n symbol: z.string(),\n orders: z.array(SpotOrderSchema),\n orderReports: z.array(z.unknown()).optional(),\n })\n .loose();\nexport type SpotOCOOrderAck = z.infer<typeof SpotOCOOrderAckSchema>;\nexport const SpotOCOOrderAckResponseSchema = SpotOCOOrderAckSchema;\nexport const SpotOCOOrdersResponseSchema = z.array(SpotOCOOrderAckSchema);\n\nexport const SpotTradeSchema = z\n .object({\n symbol: z.string(),\n id: z.number(),\n orderId: z.number(),\n orderListId: z.number().optional(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n time: z.number(),\n isBuyer: z.boolean(),\n isMaker: z.boolean(),\n isBestMatch: z.boolean(),\n })\n .loose();\nexport type SpotTrade = z.infer<typeof SpotTradeSchema>;\nexport const SpotTradesResponseSchema = z.array(SpotTradeSchema);\n\n// ---- Spot account ----\n\nexport const SpotBalanceSchema = z.object({\n asset: z.string(),\n free: z.string().transform(Number),\n locked: z.string().transform(Number),\n});\nexport type SpotBalance = z.infer<typeof SpotBalanceSchema>;\n\nexport const SpotAccountSchema = z\n .object({\n makerCommission: z.number(),\n takerCommission: z.number(),\n buyerCommission: z.number(),\n sellerCommission: z.number(),\n canTrade: z.boolean(),\n canWithdraw: z.boolean(),\n canDeposit: z.boolean(),\n updateTime: z.number().optional(),\n accountType: z.string().optional(),\n balances: z.array(SpotBalanceSchema),\n permissions: z.array(z.string()).optional(),\n })\n .loose();\nexport type SpotAccountInfo = z.infer<typeof SpotAccountSchema>;\n\n// ---- Spot user data stream events (listenKey stream) ----\n\nexport const SpotExecutionReportSchema = z.object({ e: z.literal('executionReport') }).loose();\nexport type SpotExecutionReport = z.infer<typeof SpotExecutionReportSchema>;\n\nexport const SpotOutboundAccountPositionSchema = z\n .object({ e: z.literal('outboundAccountPosition') })\n .loose();\nexport type SpotOutboundAccountPosition = z.infer<typeof SpotOutboundAccountPositionSchema>;\n\nexport const SpotBalanceUpdateSchema = z.object({ e: z.literal('balanceUpdate') }).loose();\nexport type SpotBalanceUpdate = z.infer<typeof SpotBalanceUpdateSchema>;\n\nexport const SpotListStatusSchema = z.object({ e: z.literal('listStatus') }).loose();\nexport type SpotListStatus = z.infer<typeof SpotListStatusSchema>;\n\nexport type SpotUserDataEvent =\n | SpotExecutionReport\n | SpotOutboundAccountPosition\n | SpotBalanceUpdate\n | SpotListStatus;\n\nexport function parseSpotUserDataEvent(raw: unknown): SpotUserDataEvent {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Invalid spot user-data payload');\n }\n const eventType = (raw as { e?: string }).e;\n if (eventType === 'executionReport') return SpotExecutionReportSchema.parse(raw);\n if (eventType === 'outboundAccountPosition') return SpotOutboundAccountPositionSchema.parse(raw);\n if (eventType === 'balanceUpdate') return SpotBalanceUpdateSchema.parse(raw);\n if (eventType === 'listStatus') return SpotListStatusSchema.parse(raw);\n throw new Error(`Unknown spot user-data event type: ${eventType}`);\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n SpotAccountInfo,\n SpotAccountSchema,\n SpotOCOOrderAck,\n SpotOCOOrderAckResponseSchema,\n SpotOCOOrdersResponseSchema,\n SpotOrder,\n SpotOrderSchema,\n SpotOrdersResponseSchema,\n SpotTrade,\n SpotTradesResponseSchema,\n} from '../types/spot.types.js';\n\nexport class SpotTrading {\n constructor(private readonly http: HttpClient) {}\n\n async createOrder(params: Record<string, unknown>): Promise<SpotOrder> {\n return SpotOrderSchema.parse(await this.http.post('/order', params, 'signed'));\n }\n\n async testOrder(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.http.post('/order/test', params, 'signed');\n }\n\n async getOrder(symbol: string, options?: { orderId?: number; origClientOrderId?: string }): Promise<SpotOrder> {\n return SpotOrderSchema.parse(\n await this.http.get('/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string; newClientOrderId?: string },\n ): Promise<SpotOrder> {\n return SpotOrderSchema.parse(\n await this.http.delete('/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOpenOrders(symbol: string): Promise<SpotOrder[]> {\n return SpotOrdersResponseSchema.parse(\n await this.http.delete('/openOrders', { symbol }, 'signed'),\n );\n }\n\n async getOpenOrders(symbol?: string): Promise<SpotOrder[]> {\n const params = symbol ? { symbol } : {};\n return SpotOrdersResponseSchema.parse(await this.http.get('/openOrders', params, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<SpotOrder[]> {\n return SpotOrdersResponseSchema.parse(\n await this.http.get('/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelReplaceOrder(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.http.post('/order/cancelReplace', params, 'signed');\n }\n\n // ---- OCO order lists ----\n\n async createOCOOrder(params: Record<string, unknown>): Promise<SpotOCOOrderAck> {\n return SpotOCOOrderAckResponseSchema.parse(\n await this.http.post('/orderList', params, 'signed'),\n );\n }\n\n async cancelOCOOrder(\n symbol: string,\n options?: { orderListId?: number; listClientOrderId?: string; newClientOrderId?: string },\n ): Promise<SpotOCOOrderAck> {\n return SpotOCOOrderAckResponseSchema.parse(\n await this.http.delete('/orderList', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOCOOrder(\n symbol: string,\n options?: { orderListId?: number; origClientOrderId?: string },\n ): Promise<SpotOCOOrderAck> {\n return SpotOCOOrderAckResponseSchema.parse(\n await this.http.get('/orderList', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenOCOOrders(): Promise<SpotOCOOrderAck[]> {\n return SpotOCOOrdersResponseSchema.parse(\n await this.http.get('/openOrderLists', undefined, 'signed'),\n );\n }\n\n async getAllOCOOrders(\n symbol: string,\n options?: { fromId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<SpotOCOOrderAck[]> {\n return SpotOCOOrdersResponseSchema.parse(\n await this.http.get('/allOrderLists', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOpenOCOOrders(symbol: string): Promise<SpotOCOOrderAck[]> {\n return SpotOCOOrdersResponseSchema.parse(\n await this.http.delete('/openOrderLists', { symbol }, 'signed'),\n );\n }\n}\n\nexport class SpotAccount {\n constructor(private readonly http: HttpClient) {}\n\n async account(): Promise<SpotAccountInfo> {\n return SpotAccountSchema.parse(await this.http.get('/account', undefined, 'signed'));\n }\n\n async myTrades(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; fromId?: number; limit?: number },\n ): Promise<SpotTrade[]> {\n return SpotTradesResponseSchema.parse(\n await this.http.get('/myTrades', { symbol, ...options }, 'signed'),\n );\n }\n\n async myPreventedMatches(\n symbol: string,\n options?: {\n preventedMatchId?: number;\n orderId?: number;\n fromPreventedMatchId?: number;\n limit?: number;\n },\n ): Promise<unknown[]> {\n return this.http.get('/myPreventedMatches', { symbol, ...options }, 'signed');\n }\n\n async accountCommission(symbol: string): Promise<Record<string, unknown>> {\n return this.http.get('/account/commission', { symbol }, 'signed');\n }\n\n async rateLimitOrder(): Promise<unknown[]> {\n return this.http.get('/rateLimit/order', undefined, 'signed');\n }\n}\n","import { z } from 'zod';\n\nexport const KlineIntervalSchema = z.enum([\n '1m', '3m', '5m', '15m', '30m',\n '1h', '2h', '4h', '6h', '8h', '12h',\n '1d', '3d', '1w', '1M',\n]);\nexport type KlineInterval = z.infer<typeof KlineIntervalSchema>;\n\nconst RawKlineSchema = z.tuple([\n z.number(), z.string(), z.string(), z.string(), z.string(), z.string(),\n z.number(), z.string(), z.number(), z.string(), z.string(), z.string(),\n]);\n\nexport const KlineSchema = RawKlineSchema.transform(\n ([openTime, open, high, low, close, volume, closeTime, quoteAssetVolume, trades, takerBuyBaseVolume, takerBuyQuoteVolume]) => ({\n openTime,\n open: Number(open),\n high: Number(high),\n low: Number(low),\n close: Number(close),\n volume: Number(volume),\n closeTime,\n quoteAssetVolume: Number(quoteAssetVolume),\n trades,\n takerBuyBaseVolume: Number(takerBuyBaseVolume),\n takerBuyQuoteVolume: Number(takerBuyQuoteVolume),\n }),\n);\nexport type Kline = z.infer<typeof KlineSchema>;\nexport const KlinesResponseSchema = z.array(KlineSchema);\n\nexport const TickerPriceSchema = z.object({\n symbol: z.string(),\n price: z.string().transform(Number),\n time: z.number().optional(),\n});\nexport type TickerPrice = z.infer<typeof TickerPriceSchema>;\n\nexport const Ticker24hrSchema = z.object({\n symbol: z.string(),\n priceChange: z.string().transform(Number),\n priceChangePercent: z.string().transform(Number),\n weightedAvgPrice: z.string().transform(Number),\n lastPrice: z.string().transform(Number),\n lastQty: z.string().transform(Number),\n openPrice: z.string().transform(Number),\n highPrice: z.string().transform(Number),\n lowPrice: z.string().transform(Number),\n volume: z.string().transform(Number),\n quoteVolume: z.string().transform(Number),\n openTime: z.number(),\n closeTime: z.number(),\n firstId: z.number(),\n lastId: z.number(),\n count: z.number(),\n});\nexport type Ticker24hr = z.infer<typeof Ticker24hrSchema>;\n\nexport const BookTickerSchema = z.object({\n symbol: z.string(),\n bidPrice: z.string().transform(Number),\n bidQty: z.string().transform(Number),\n askPrice: z.string().transform(Number),\n askQty: z.string().transform(Number),\n time: z.number().optional(),\n});\nexport type BookTicker = z.infer<typeof BookTickerSchema>;\n\nconst DepthLevelSchema = z\n .tuple([z.string(), z.string()])\n .transform(([price, qty]) => ({ price: Number(price), qty: Number(qty) }));\n\nexport const DepthSnapshotSchema = z.object({\n lastUpdateId: z.number(),\n bids: z.array(DepthLevelSchema),\n asks: z.array(DepthLevelSchema),\n});\nexport type DepthSnapshot = z.infer<typeof DepthSnapshotSchema>;\n\nexport const TradeSchema = z.object({\n id: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n time: z.number(),\n isBuyerMaker: z.boolean(),\n});\nexport type Trade = z.infer<typeof TradeSchema>;\nexport const TradesResponseSchema = z.array(TradeSchema);\n\nexport const AggTradeSchema = z.object({\n a: z.number(),\n p: z.string().transform(Number),\n q: z.string().transform(Number),\n f: z.number(),\n l: z.number(),\n T: z.number(),\n m: z.boolean(),\n});\nexport type AggTrade = z.infer<typeof AggTradeSchema>;\nexport const AggTradesResponseSchema = z.array(AggTradeSchema);\n\nexport const AvgPriceSchema = z.object({\n mins: z.number(),\n price: z.string().transform(Number),\n});\nexport type AvgPrice = z.infer<typeof AvgPriceSchema>;\n\nexport const ExchangeSymbolSchema = z\n .object({\n symbol: z.string(),\n status: z.string(),\n baseAsset: z.string(),\n quoteAsset: z.string(),\n })\n .loose();\nexport type ExchangeSymbol = z.infer<typeof ExchangeSymbolSchema>;\n\nexport const ExchangeInfoSchema = z\n .object({\n timezone: z.string(),\n serverTime: z.number(),\n symbols: z.array(ExchangeSymbolSchema),\n })\n .loose();\nexport type ExchangeInfo = z.infer<typeof ExchangeInfoSchema>;\n","import type { HttpClient } from '../client/HttpClient.js';\nimport {\n AggTrade,\n AggTradesResponseSchema,\n BookTicker,\n BookTickerSchema,\n DepthSnapshot,\n DepthSnapshotSchema,\n ExchangeInfo,\n ExchangeInfoSchema,\n Kline,\n KlineInterval,\n KlinesResponseSchema,\n Ticker24hr,\n Ticker24hrSchema,\n TickerPrice,\n TickerPriceSchema,\n Trade,\n TradesResponseSchema,\n} from '../types/market.types.js';\n\nexport class MarketDataBase {\n constructor(protected readonly http: HttpClient) {}\n\n async exchangeInfo(): Promise<ExchangeInfo> {\n return ExchangeInfoSchema.parse(await this.http.get('/exchangeInfo'));\n }\n\n async ping(): Promise<Record<string, unknown>> {\n return this.http.get('/ping');\n }\n\n async serverTime(): Promise<{ serverTime: number }> {\n return this.http.get('/time');\n }\n\n async historicalTrades(symbol: string, options?: { fromId?: number; limit?: number }): Promise<Trade[]> {\n const data = await this.http.get('/historicalTrades', {\n symbol,\n fromId: options?.fromId,\n limit: options?.limit ?? 500,\n });\n return TradesResponseSchema.parse(data);\n }\n\n async klines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/klines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async tickerPrice(symbol: string): Promise<TickerPrice> {\n return TickerPriceSchema.parse(await this.http.get('/ticker/price', { symbol }));\n }\n\n async ticker24hr(symbol: string): Promise<Ticker24hr> {\n return Ticker24hrSchema.parse(await this.http.get('/ticker/24hr', { symbol }));\n }\n\n async bookTicker(symbol: string): Promise<BookTicker> {\n return BookTickerSchema.parse(await this.http.get('/ticker/bookTicker', { symbol }));\n }\n\n async depth(symbol: string, limit = 100): Promise<DepthSnapshot> {\n return DepthSnapshotSchema.parse(await this.http.get('/depth', { symbol, limit }));\n }\n\n async trades(symbol: string, limit = 500): Promise<Trade[]> {\n return TradesResponseSchema.parse(await this.http.get('/trades', { symbol, limit }));\n }\n\n async aggTrades(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<AggTrade[]> {\n const data = await this.http.get('/aggTrades', {\n symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return AggTradesResponseSchema.parse(data);\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { MarketDataBase } from './MarketDataBase.js';\nimport { AvgPrice, AvgPriceSchema, Kline, KlineInterval, KlinesResponseSchema } from '../types/market.types.js';\n\nexport class SpotMarket extends MarketDataBase {\n constructor(http?: HttpClient) {\n super(http ?? new HttpClient({ baseURL: 'https://api.binance.com/api/v3' }));\n }\n\n async avgPrice(symbol: string): Promise<AvgPrice> {\n return AvgPriceSchema.parse(await this.http.get('/avgPrice', { symbol }));\n }\n\n /** Optimized klines endpoint (`/uiKlines`) with the same response shape as `/klines`. */\n async uiKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/uiKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n /** Rolling window ticker (`/ticker`). Omit `symbol` for all symbols. */\n async rollingWindowTicker(\n symbol?: string,\n windowSize?: '1d' | '7d' | '30d',\n ): Promise<unknown[] | unknown> {\n const params = { symbol, windowSize };\n return this.http.get('/ticker', params);\n }\n\n /** Trading-day ticker (`/ticker/tradingDay`). Omit `symbol` for all symbols. */\n async tradingDayTicker(\n symbol?: string,\n options?: { timeZone?: string; type?: 'FULL' | 'MINI' },\n ): Promise<unknown[] | unknown> {\n return this.http.get('/ticker/tradingDay', { symbol, ...options });\n }\n}\n","import { z } from 'zod';\n\nexport const ListenKeySchema = z.object({\n listenKey: z.string(),\n});\nexport type ListenKey = z.infer<typeof ListenKeySchema>;\n\nexport const UserDataAccountUpdateSchema = z.object({\n e: z.literal('ACCOUNT_UPDATE'),\n E: z.number(),\n T: z.number(),\n a: z.object({\n m: z.string().transform(Number),\n B: z.array(\n z.object({\n a: z.string(),\n wb: z.string().transform(Number),\n cw: z.string().transform(Number),\n bc: z.string().transform(Number),\n }),\n ),\n P: z.array(\n z.object({\n s: z.string(),\n pa: z.string().transform(Number),\n ep: z.string().transform(Number),\n cr: z.string().transform(Number),\n up: z.string().transform(Number),\n mt: z.string(),\n iw: z.string().transform(Number).optional(),\n ps: z.string(),\n }),\n ),\n }),\n});\nexport type UserDataAccountUpdate = z.infer<typeof UserDataAccountUpdateSchema>;\n\nexport const UserDataOrderTradeUpdateSchema = z.object({\n e: z.literal('ORDER_TRADE_UPDATE'),\n E: z.number(),\n T: z.number(),\n o: z.object({\n s: z.string(),\n c: z.string(),\n i: z.number(),\n S: z.string(),\n o: z.string(),\n f: z.string(),\n q: z.string().transform(Number),\n p: z.string().transform(Number),\n ap: z.string().transform(Number),\n sp: z.string().transform(Number),\n x: z.string(),\n X: z.string(),\n l: z.string().transform(Number),\n z: z.string().transform(Number),\n L: z.string().transform(Number),\n n: z.string().transform(Number),\n N: z.string(),\n T: z.number(),\n t: z.number(),\n b: z.string().transform(Number),\n a: z.string().transform(Number),\n m: z.boolean(),\n R: z.boolean(),\n wt: z.string(),\n ot: z.string(),\n ps: z.string(),\n cp: z.boolean().optional(),\n AP: z.string().transform(Number).optional(),\n cr: z.string().transform(Number).optional(),\n rp: z.string().transform(Number).optional(),\n }),\n});\nexport type UserDataOrderTradeUpdate = z.infer<typeof UserDataOrderTradeUpdateSchema>;\n\nexport const UserDataMarginCallSchema = z.object({\n e: z.literal('MARGIN_CALL'),\n E: z.number(),\n cw: z.string().transform(Number),\n p: z.array(\n z.object({\n s: z.string(),\n ps: z.string(),\n pa: z.string().transform(Number),\n mt: z.string(),\n iw: z.string().transform(Number),\n mp: z.string().transform(Number),\n up: z.string().transform(Number),\n mm: z.string().transform(Number),\n }),\n ),\n});\nexport type UserDataMarginCall = z.infer<typeof UserDataMarginCallSchema>;\n\nexport type UserDataEvent = UserDataAccountUpdate | UserDataOrderTradeUpdate | UserDataMarginCall;\n\nexport function parseUserDataEvent(raw: unknown): UserDataEvent {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Invalid user-data payload');\n }\n const eventType = (raw as { e?: string }).e;\n if (eventType === 'ACCOUNT_UPDATE') return UserDataAccountUpdateSchema.parse(raw);\n if (eventType === 'ORDER_TRADE_UPDATE') return UserDataOrderTradeUpdateSchema.parse(raw);\n if (eventType === 'MARGIN_CALL') return UserDataMarginCallSchema.parse(raw);\n throw new Error(`Unknown user-data event type: ${eventType}`);\n}\n\nexport const WsApiResponseSchema = z.object({\n id: z.string(),\n status: z.number(),\n result: z.unknown(),\n error: z\n .object({\n code: z.number(),\n msg: z.string(),\n })\n .optional(),\n});\nexport type WsApiResponse = z.infer<typeof WsApiResponseSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport { ListenKey, ListenKeySchema } from '../types/userdata.types.js';\n\nexport class SpotUserDataStream {\n constructor(private readonly http: HttpClient) {}\n\n async createListenKey(): Promise<ListenKey> {\n return ListenKeySchema.parse(await this.http.post('/userDataStream', undefined, 'apiKey'));\n }\n\n async keepAliveListenKey(): Promise<Record<string, unknown>> {\n return this.http.put('/userDataStream', undefined, 'apiKey');\n }\n\n async closeListenKey(): Promise<Record<string, unknown>> {\n return this.http.delete('/userDataStream', undefined, 'apiKey');\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { EventBus } from '../core/events.js';\nimport { Decimal } from '../core/decimal.js';\nimport { BinanceApiError, NetworkError } from '../errors/index.js';\nimport type { CreateOrderParams } from '../types/trading.types.js';\nimport type { FuturesTrading } from '../resources/FuturesTrading.js';\nimport type {\n Execution,\n ExecutionFill,\n ExecutionManagerOptions,\n ReconciliationState,\n} from './types.js';\nimport { ExecutionUnknownError } from './types.js';\nimport type { RiskGateway } from '../risk/RiskGateway.js';\nimport {\n FuturesExecutionAdapter,\n isExecutionAdapter,\n type ExecutionAdapter,\n type ExecutionReportShape,\n type OrderShape,\n type UserStreamLike,\n} from './adapter.js';\n\ninterface PlaceOrderIntent extends CreateOrderParams {\n /** Idempotency key; reused across retries of the same intent. */\n intentId?: string;\n}\n\nconst CLIENT_ORDER_ID_MAX = 36;\n\n/**\n * Idempotent order placement with automatic reconciliation.\n *\n * The legacy path — `trading.createOrder()` through the retrying HttpClient —\n * had two production-critical holes:\n *\n * 1. A timeout on POST /fapi/v1/order left the caller with an exception and\n * *no idea* whether the order existed. Retrying blindly could double the\n * position; not retrying could lose the trade entirely.\n * 2. Callers who did generate their own `newClientOrderId` had to implement\n * reconciliation by hand — every one of them, every time.\n *\n * ExecutionManager closes both:\n *\n * - every order gets a deterministic `newClientOrderId` (derived from the\n * intent id), so the exchange itself becomes the idempotency guard;\n * - on an ambiguous failure (timeout / connection reset / 5xx), the manager\n * polls `GET /fapi/v1/order?origClientOrderId=…`:\n * found → execution is recovered and returned (`reconciled`);\n * -2013 → the order never reached the engine → one safe resubmission\n * with the *same* clientOrderId;\n * still ambiguous → {@link ExecutionUnknownError} carrying the intent,\n * never a silent guess;\n * - duplicate submissions of the same intent return the original execution.\n *\n * Product specifics (field names, user-stream shapes, error semantics) live in\n * an {@link ExecutionAdapter}: USDⓈ-M and Spot route through live adapters,\n * and the paper simulator through `PaperExecutionAdapter` — one execution\n * envelope, one reconciliation matrix, three backends. Constructing with a raw\n * `FuturesTrading` (the pre-2.2 form) auto-wraps it in the USDⓈ-M adapter.\n *\n * When a user-data stream is attached (`setUserStream`), execution reports\n * stream live state (fills, average price, status) into the ledger.\n */\nexport class ExecutionManager {\n private readonly adapter: ExecutionAdapter;\n private readonly options: Required<Pick<ExecutionManagerOptions, 'clientOrderIdPrefix' | 'reconcileMaxAttempts' | 'reconcilePollDelayMs' | 'maxLedgerSize'>>;\n private readonly events?: EventBus;\n private readonly riskGateway?: RiskGateway;\n /** Executions already counted toward open exposure in the risk gateway. */\n private readonly riskRegistered = new WeakSet<Execution>();\n /** Executions whose exposure has been released (terminal). */\n private readonly riskReleased = new WeakSet<Execution>();\n\n /** intentId → Execution (most recent state). */\n private readonly ledger = new Map<string, Execution>();\n /** clientOrderId → intentId. */\n private readonly byClientOrderId = new Map<string, string>();\n /** clientOrderId → in-flight placement promise (dedup). */\n private readonly inFlight = new Map<string, Promise<Execution>>();\n\n constructor(\n tradingOrAdapter: FuturesTrading | ExecutionAdapter,\n options: ExecutionManagerOptions = {},\n ) {\n this.adapter = isExecutionAdapter(tradingOrAdapter)\n ? tradingOrAdapter\n : new FuturesExecutionAdapter(tradingOrAdapter);\n this.adapter.onReport(this.onExecutionReport);\n this.options = {\n clientOrderIdPrefix: options.clientOrderIdPrefix ?? 'nbsdk',\n reconcileMaxAttempts: options.reconcileMaxAttempts ?? 3,\n reconcilePollDelayMs: options.reconcilePollDelayMs ?? 400,\n maxLedgerSize: options.maxLedgerSize ?? 1000,\n };\n this.events = options.events;\n this.riskGateway = options.riskGateway;\n }\n\n /** Product this manager executes against (from its adapter). */\n get product(): string {\n return this.adapter.product;\n }\n\n /**\n * Feed execution reports into the ledger so executions track live fill\n * state without extra REST polling. Accepts the product's user-data stream\n * (futures `ORDER_TRADE_UPDATE`, spot `executionReport`); the adapter\n * normalizes the shape.\n */\n setUserStream(ws: UserStreamLike | null): void {\n this.adapter.setUserStream(ws);\n }\n\n /**\n * Idempotently place an order. Returns the execution envelope — either the\n * exchange's synchronous acknowledgement or a reconciled state recovered\n * after an ambiguous transport failure.\n */\n async placeOrder(params: PlaceOrderIntent): Promise<Execution> {\n const intentId = params.intentId ?? randomUUID();\n const clientOrderId = params.newClientOrderId ?? this.deriveClientOrderId(intentId);\n\n const existing = this.getExecution(intentId);\n if (existing) return existing;\n\n const inFlight = this.inFlight.get(clientOrderId);\n if (inFlight) return inFlight;\n\n const submission: CreateOrderParams = { ...params, newClientOrderId: clientOrderId };\n // The intent id must not leak into the exchange payload.\n delete (submission as PlaceOrderIntent).intentId;\n\n const promise = this.submitWithReconciliation(submission, intentId).finally(() => {\n this.inFlight.delete(clientOrderId);\n });\n this.inFlight.set(clientOrderId, promise);\n return promise;\n }\n\n /**\n * Cancel an order idempotently: ambiguous failures are reconciled by\n * checking whether the order actually left the book.\n */\n async cancelOrder(\n symbol: string,\n options: { orderId?: number; origClientOrderId?: string; intentId?: string } = {},\n ): Promise<Execution> {\n const intentId = options.intentId ?? randomUUID();\n const prior = this.ledger.get(intentId);\n if (prior) return prior;\n\n this.emit('execution.cancel.submitted', { intentId, symbol, ...options });\n try {\n const raw = await this.adapter.cancelOrder(symbol, {\n orderId: options.orderId,\n origClientOrderId: options.origClientOrderId,\n });\n const execution = this.recordFromOrder(raw, intentId, 'acked', {\n requestedQuantity: null,\n requestedPrice: null,\n });\n this.emit('execution.cancel.acked', { intentId, status: execution.status });\n return execution;\n } catch (err) {\n if (err instanceof BinanceApiError && (err.code === -2011 || err.code === -2013)) {\n // -2011: unknown order (already gone) — the desired end state.\n // -2013: order does not exist.\n const execution: Execution = {\n intentId,\n clientOrderId: options.origClientOrderId ?? '',\n symbol,\n side: '',\n type: 'CANCEL',\n status: 'CANCELED',\n requestedQuantity: null,\n requestedPrice: null,\n executedQuantity: '0',\n cumulativeQuoteQuantity: '0',\n averagePrice: null,\n fills: [],\n reconciliationState: 'reconciled',\n submittedAt: Date.now(),\n updatedAt: Date.now(),\n raw: { code: err.code, msg: err.message },\n };\n this.record(execution);\n this.emit('execution.cancel.reconciled', { intentId, code: err.code });\n return execution;\n }\n if (!(err instanceof NetworkError)) throw err;\n // Ambiguous: did the cancel land? Ask the book.\n try {\n const raw = await this.adapter.fetchOrder(symbol, {\n origClientOrderId: options.origClientOrderId,\n orderId: options.orderId,\n });\n const shape = this.adapter.toOrderShape(raw);\n const canceled = isTerminalCanceled(shape.status);\n const execution = this.recordFromOrder(\n raw,\n intentId,\n canceled ? 'reconciled' : 'unknown',\n { requestedQuantity: null, requestedPrice: null },\n );\n this.emit('execution.cancel.reconciled', { intentId, status: shape.status });\n return execution;\n } catch {\n throw err;\n }\n }\n }\n\n /**\n * Force a reconciliation pass for a previously submitted intent (e.g. after\n * an {@link ExecutionUnknownError}).\n */\n async reconcile(intentId: string): Promise<Execution> {\n const execution = this.ledger.get(intentId);\n if (!execution) throw new Error(`No execution recorded for intent ${intentId}`);\n const raw = await this.adapter.fetchOrder(execution.symbol, {\n origClientOrderId: execution.clientOrderId,\n });\n return this.recordFromOrder(raw, intentId, 'reconciled', {\n requestedQuantity: execution.requestedQuantity,\n requestedPrice: execution.requestedPrice,\n });\n }\n\n getExecution(intentId: string): Execution | undefined {\n const execution = this.ledger.get(intentId);\n return execution ? { ...execution, fills: [...execution.fills] } : undefined;\n }\n\n getExecutionByClientOrderId(clientOrderId: string): Execution | undefined {\n const intentId = this.byClientOrderId.get(clientOrderId);\n return intentId ? this.getExecution(intentId) : undefined;\n }\n\n listExecutions(): Execution[] {\n return [...this.ledger.values()].map((e) => ({ ...e, fills: [...e.fills] }));\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private deriveClientOrderId(intentId: string): string {\n const suffix = intentId.replace(/-/g, '').slice(0, 24);\n const id = `${this.options.clientOrderIdPrefix}-${suffix}`;\n if (id.length > CLIENT_ORDER_ID_MAX) return id.slice(0, CLIENT_ORDER_ID_MAX);\n return id;\n }\n\n private async submitWithReconciliation(\n submission: CreateOrderParams,\n intentId: string,\n ): Promise<Execution> {\n const submittedAt = Date.now();\n this.emit('execution.submitted', {\n intentId,\n symbol: submission.symbol,\n side: submission.side,\n type: submission.type,\n });\n\n // Up to two submissions: the second only happens when reconciliation\n // proved the first never reached the engine (-2013), so it cannot double.\n for (let submissionIndex = 0; submissionIndex < 2; submissionIndex += 1) {\n let response: Record<string, unknown>;\n try {\n response = await this.adapter.createOrder(submission);\n } catch (err) {\n if (err instanceof BinanceApiError) {\n // Definitive exchange rejection.\n const execution: Execution = {\n intentId,\n clientOrderId: submission.newClientOrderId as string,\n symbol: submission.symbol,\n side: submission.side,\n type: submission.type,\n status: 'REJECTED',\n requestedQuantity: decimalOrNull(submission.quantity),\n requestedPrice: decimalOrNull(submission.price),\n executedQuantity: '0',\n cumulativeQuoteQuantity: '0',\n averagePrice: null,\n fills: [],\n reconciliationState: 'rejected',\n submittedAt,\n updatedAt: Date.now(),\n raw: { code: err.code, msg: err.message },\n };\n this.record(execution);\n this.emit('execution.rejected', { intentId, code: err.code, message: err.message });\n throw err;\n }\n if (!(err instanceof NetworkError)) throw err;\n\n // Ambiguous outcome — reconcile by clientOrderId.\n const recovered = await this.recoverByClientOrderId(submission, intentId, submittedAt);\n if (recovered) return recovered;\n if (submissionIndex === 0) {\n // Reconciliation says the order does not exist: safe to resubmit\n // once with the identical clientOrderId.\n this.emit('execution.retry', { intentId, reason: 'order-not-found-after-transport-error' });\n continue;\n }\n const unknown = new ExecutionUnknownError(\n `Order outcome could not be determined for intent ${intentId} ` +\n `(clientOrderId=${submission.newClientOrderId}); reconcile() manually`,\n {\n intentId,\n clientOrderId: submission.newClientOrderId as string,\n symbol: submission.symbol,\n side: submission.side,\n type: submission.type,\n submittedAt,\n },\n this.options.reconcileMaxAttempts,\n );\n this.record({\n intentId,\n clientOrderId: submission.newClientOrderId as string,\n symbol: submission.symbol,\n side: submission.side,\n type: submission.type,\n status: 'UNKNOWN',\n requestedQuantity: decimalOrNull(submission.quantity),\n requestedPrice: decimalOrNull(submission.price),\n executedQuantity: '0',\n cumulativeQuoteQuantity: '0',\n averagePrice: null,\n fills: [],\n reconciliationState: 'unknown',\n submittedAt,\n updatedAt: Date.now(),\n raw: { error: err.message },\n });\n throw unknown;\n }\n\n // Synchronous ack.\n const execution = this.executionFromResponse(response, submission, intentId, submittedAt, 'acked');\n this.record(execution);\n this.emit('execution.acked', {\n intentId,\n exchangeOrderId: execution.exchangeOrderId,\n status: execution.status,\n });\n return execution;\n }\n // Unreachable: the loop either returns or throws.\n throw new Error('unreachable');\n }\n\n /**\n * After an ambiguous transport failure, poll REST for the order.\n * Returns the recovered execution, or null when the exchange reports\n * the order does not exist (safe to resubmit).\n */\n private async recoverByClientOrderId(\n submission: CreateOrderParams,\n intentId: string,\n submittedAt: number,\n ): Promise<Execution | null> {\n const symbol = submission.symbol;\n const clientOrderId = submission.newClientOrderId as string;\n for (let attempt = 1; attempt <= this.options.reconcileMaxAttempts; attempt += 1) {\n await this.delay(this.options.reconcilePollDelayMs * attempt);\n this.emit('execution.reconcile.attempt', { intentId, attempt });\n try {\n const raw = await this.adapter.fetchOrder(symbol, { origClientOrderId: clientOrderId });\n const execution = this.recordFromOrder(\n raw,\n intentId,\n 'reconciled',\n {\n requestedQuantity: decimalOrNull(submission.quantity),\n requestedPrice: decimalOrNull(submission.price),\n },\n submittedAt,\n );\n this.emit('execution.reconciled', {\n intentId,\n exchangeOrderId: execution.exchangeOrderId,\n status: execution.status,\n });\n return execution;\n } catch (err) {\n if (err instanceof BinanceApiError && err.code === -2013) {\n // Order does not exist: the submission never reached the engine.\n return null;\n }\n // Query itself failed; keep polling while attempts remain.\n }\n }\n // Could not determine existence either way — the ambiguous case the\n // caller must never auto-resubmit through. Record and surface it.\n this.record({\n intentId,\n clientOrderId,\n symbol: submission.symbol,\n side: submission.side,\n type: submission.type,\n status: 'UNKNOWN',\n requestedQuantity: decimalOrNull(submission.quantity),\n requestedPrice: decimalOrNull(submission.price),\n executedQuantity: '0',\n cumulativeQuoteQuantity: '0',\n averagePrice: null,\n fills: [],\n reconciliationState: 'unknown',\n submittedAt,\n updatedAt: Date.now(),\n raw: { reconciliationAttempts: this.options.reconcileMaxAttempts },\n });\n throw new ExecutionUnknownError(\n `Order outcome could not be determined for intent ${intentId} (clientOrderId=${clientOrderId}); ` +\n `${this.options.reconcileMaxAttempts} reconciliation attempts failed`,\n {\n intentId,\n clientOrderId,\n symbol: submission.symbol,\n side: submission.side,\n type: submission.type,\n submittedAt,\n },\n this.options.reconcileMaxAttempts,\n );\n }\n\n private executionFromResponse(\n response: Record<string, unknown>,\n submission: CreateOrderParams,\n intentId: string,\n submittedAt: number,\n state: ReconciliationState,\n ): Execution {\n const shape = this.adapter.toOrderShape(response);\n const executedQty = Decimal.from(shape.executedQty);\n const cumQuote = Decimal.from(shape.cumQuote);\n return {\n intentId,\n clientOrderId: shape.clientOrderId || (submission.newClientOrderId as string),\n exchangeOrderId: shape.orderId,\n symbol: shape.symbol,\n side: shape.side,\n type: shape.type,\n status: shape.status,\n requestedQuantity: decimalOrNull(submission.quantity),\n requestedPrice: decimalOrNull(submission.price),\n executedQuantity: shape.executedQty,\n cumulativeQuoteQuantity: shape.cumQuote,\n averagePrice: averagePrice(executedQty, cumQuote, shape.avgPrice),\n fills: shape.fills,\n reconciliationState: state,\n submittedAt,\n updatedAt: shape.updateTime,\n raw: response,\n };\n }\n\n private recordFromOrder(\n raw: Record<string, unknown>,\n intentId: string,\n state: ReconciliationState,\n requested: { requestedQuantity: string | null; requestedPrice: string | null },\n submittedAt = Date.now(),\n ): Execution {\n const shape = this.adapter.toOrderShape(raw);\n const executedQty = Decimal.from(shape.executedQty);\n const cumQuote = Decimal.from(shape.cumQuote);\n const execution: Execution = {\n intentId,\n clientOrderId: shape.clientOrderId,\n exchangeOrderId: shape.orderId,\n symbol: shape.symbol,\n side: shape.side,\n type: shape.type,\n status: shape.status,\n requestedQuantity: requested.requestedQuantity,\n requestedPrice: requested.requestedPrice,\n executedQuantity: shape.executedQty,\n cumulativeQuoteQuantity: shape.cumQuote,\n averagePrice: averagePrice(executedQty, cumQuote, shape.avgPrice),\n fills: shape.fills,\n reconciliationState: state,\n submittedAt,\n updatedAt: shape.updateTime,\n raw,\n };\n this.record(execution);\n return execution;\n }\n\n private record(execution: Execution): void {\n this.ledger.set(execution.intentId, execution);\n this.byClientOrderId.set(execution.clientOrderId, execution.intentId);\n if (this.ledger.size > this.options.maxLedgerSize) {\n const oldest = this.ledger.keys().next().value;\n if (oldest !== undefined) this.ledger.delete(oldest);\n }\n this.updateRiskGateway(execution);\n }\n\n /** Feed exposure/failure state into the attached risk gateway. */\n private updateRiskGateway(execution: Execution): void {\n const risk = this.riskGateway;\n if (!risk) return;\n\n if (execution.reconciliationState === 'rejected' || execution.status === 'REJECTED') {\n risk.recordFailure(`order rejected (${execution.status})`);\n return;\n }\n risk.recordSuccess();\n\n const notional = notionalOf(execution);\n if (notional === null) return;\n if (isTerminal(execution.status)) {\n if (!this.riskReleased.has(execution)) {\n this.riskReleased.add(execution);\n risk.releaseOpenOrder(notional);\n }\n } else if (!this.riskRegistered.has(execution)) {\n this.riskRegistered.add(execution);\n risk.registerOpenOrder(notional);\n }\n }\n\n /** Normalized execution reports (from the adapter) update the ledger live. */\n private readonly onExecutionReport = (report: ExecutionReportShape): void => {\n const clientOrderId = report.clientOrderId;\n if (!clientOrderId) return;\n const intentId = this.byClientOrderId.get(clientOrderId);\n if (!intentId) return;\n const execution = this.ledger.get(intentId);\n if (!execution) return;\n\n if (report.status) execution.status = report.status;\n if (execution.exchangeOrderId === undefined && report.orderId !== undefined) {\n execution.exchangeOrderId = report.orderId;\n }\n\n const lastQty = report.lastQty;\n if (lastQty !== undefined && lastQty !== '0' && lastQty !== '') {\n execution.fills.push({\n price: report.lastPrice ?? '0',\n quantity: lastQty,\n commission:\n report.commission !== undefined && report.commission !== '0'\n ? report.commission\n : undefined,\n commissionAsset: report.commissionAsset || undefined,\n tradeId: report.tradeId,\n });\n }\n\n const executedQty = Decimal.from(report.executedQty ?? execution.executedQuantity);\n const cumQuote =\n report.cumQuote !== undefined\n ? Decimal.from(report.cumQuote)\n : executedQty.mul(report.avgPrice ?? '0');\n execution.executedQuantity = executedQty.toString();\n if (!execution.fills.length) {\n execution.averagePrice =\n averagePrice(executedQty, cumQuote, report.avgPrice ?? '0') ?? execution.averagePrice;\n } else {\n execution.averagePrice = weightedAverage(execution.fills);\n }\n execution.updatedAt = Date.now();\n this.emit('execution.updated', {\n intentId,\n status: execution.status,\n executedQuantity: execution.executedQuantity,\n });\n };\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private emit(name: string, payload: Record<string, unknown>): void {\n if (!this.events) return;\n this.events.scoped('execution').emit(name, payload);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction decimalOrNull(value: string | number | undefined): string | null {\n if (value === undefined) return null;\n return Decimal.from(value).toString();\n}\n\nfunction averagePrice(\n executedQty: Decimal,\n cumQuote: Decimal,\n fallback: string | number | undefined,\n): string | null {\n if (!executedQty.isZero()) {\n const computed = cumQuote.div(executedQty);\n if (!computed.isZero()) return computed.toString();\n }\n if (fallback === undefined || fallback === '') return null;\n const parsed = Decimal.from(fallback);\n return parsed.isZero() ? null : parsed.toString();\n}\n\nfunction weightedAverage(fills: ExecutionFill[]): string | null {\n let notional = Decimal.ZERO;\n let qty = Decimal.ZERO;\n for (const fill of fills) {\n notional = notional.add(Decimal.from(fill.price).mul(fill.quantity));\n qty = qty.add(fill.quantity);\n }\n if (qty.isZero()) return null;\n return notional.div(qty).toString();\n}\n\nfunction isTerminalCanceled(status: string): boolean {\n return status === 'CANCELED' || status === 'EXPIRED' || status === 'CANCELED_EXPIRED';\n}\n\nfunction isTerminal(status: string): boolean {\n return (\n status === 'FILLED' ||\n status === 'CANCELED' ||\n status === 'EXPIRED' ||\n status === 'REJECTED' ||\n status === 'PARTIALLY_CANCELED'\n );\n}\n\n/** Notional estimate: executed quote value, falling back to requested. */\nfunction notionalOf(execution: Execution): string | null {\n const cumQuote = Decimal.from(execution.cumulativeQuoteQuantity);\n if (!cumQuote.isZero()) return cumQuote.toString();\n if (execution.requestedPrice !== null && execution.requestedQuantity !== null) {\n return Decimal.from(execution.requestedPrice).mul(execution.requestedQuantity).toString();\n }\n return null;\n}\n","import type { EventBus } from '../core/events.js';\n\n/**\n * Typed execution envelope.\n *\n * Raw Binance order responses mix decimal strings, numbers and ACK/RESULT\n * shapes, and tell you nothing about *which intent* produced them or whether\n * the response was confirmed, recovered by reconciliation, or left ambiguous.\n * The execution envelope is the domain layer above the raw exchange model:\n * every quantity and price is an exact decimal *string* (see `core/decimal`),\n * and the lifecycle of the intent is explicit.\n */\n\n/** How the final state of this execution was established. */\nexport type ReconciliationState =\n /** The exchange's synchronous response confirmed the order. */\n | 'acked'\n /** A network/timeout error hid the outcome; REST lookup recovered the truth. */\n | 'reconciled'\n /** The exchange definitively rejected the request; no order exists. */\n | 'rejected'\n /** Outcome could not be determined; manual reconciliation required. */\n | 'unknown';\n\nexport interface ExecutionFill {\n /** Exact decimal string. */\n price: string;\n quantity: string;\n commission?: string;\n commissionAsset?: string;\n /** Trade id, when available. */\n tradeId?: number;\n}\n\nexport interface Execution {\n /** Caller-supplied or generated idempotency key for this intent. */\n intentId: string;\n /** The `newClientOrderId` sent to the exchange — the reconciliation key. */\n clientOrderId: string;\n /** Exchange-assigned id once known. */\n exchangeOrderId?: number;\n symbol: string;\n side: string;\n type: string;\n status: string;\n /** Exact decimal string, or null when the order is quote-sized only. */\n requestedQuantity: string | null;\n requestedPrice: string | null;\n executedQuantity: string;\n cumulativeQuoteQuantity: string;\n /** Volume-weighted average fill price (exact decimal string) or null. */\n averagePrice: string | null;\n fills: ExecutionFill[];\n reconciliationState: ReconciliationState;\n /** Epoch ms when the intent was accepted locally. */\n submittedAt: number;\n /** Epoch ms of the last state change. */\n updatedAt: number;\n /** Last raw exchange payload, for auditing/forwarding. */\n raw: Record<string, unknown>;\n}\n\nimport type { RiskGateway } from '../risk/RiskGateway.js';\n\nexport interface ExecutionManagerOptions {\n /** Prefix for generated client order ids (max 36 chars total, Binance rule). */\n clientOrderIdPrefix?: string;\n /** Rest queries per reconciliation attempt. Default 3. */\n reconcileMaxAttempts?: number;\n /** Delay between reconciliation polls. Default 400ms. */\n reconcilePollDelayMs?: number;\n /** Observability events under the `execution` scope. */\n events?: EventBus;\n /** Optional risk gateway fed exposure/failure state by the manager. */\n riskGateway?: RiskGateway;\n /**\n * Capacity limit for the retained execution ledger; oldest intents are\n * evicted. Default 1000.\n */\n maxLedgerSize?: number;\n}\n\n/** Thrown when an order's outcome cannot be determined after reconciliation. */\nexport class ExecutionUnknownError extends Error {\n constructor(\n message: string,\n readonly execution: Pick<\n Execution,\n 'intentId' | 'clientOrderId' | 'symbol' | 'side' | 'type' | 'submittedAt'\n >,\n readonly attempts: number,\n ) {\n super(message);\n this.name = 'ExecutionUnknownError';\n }\n}\n","import { Decimal } from '../core/decimal.js';\nimport type { CreateOrderParams } from '../types/trading.types.js';\nimport type { FuturesTrading } from '../resources/FuturesTrading.js';\nimport type { SpotTrading } from '../resources/SpotTrading.js';\nimport type { ExecutionFill } from './types.js';\n\n/**\n * Product adapter for {@link ExecutionManager}.\n *\n * The manager owns the *policy* of reliable execution — idempotency keys,\n * in-flight dedup, the reconciliation matrix, the ledger, risk feed-through.\n * Everything product-specific (which REST calls to make, which response fields\n * mean what, which user-stream event carries fills) lives behind this\n * interface, so USDⓈ-M, Spot and the paper simulator share one identical\n * execution semantics:\n *\n * ```ts\n * const execution = await client.spot.execution.placeOrder({ ... });\n * // same Execution envelope as client.futures.execution / paper\n * ```\n */\n\n/** Normalized order shape: every price/quantity an exact decimal string. */\nexport interface OrderShape {\n orderId?: number;\n clientOrderId: string;\n symbol: string;\n side: string;\n type: string;\n status: string;\n executedQty: string;\n cumQuote: string;\n avgPrice: string;\n updateTime: number;\n fills: ExecutionFill[];\n}\n\n/** Normalized user-stream execution report (fills/status progression). */\nexport interface ExecutionReportShape {\n clientOrderId: string;\n orderId?: number;\n status: string;\n /** Last fill price / quantity, when this report carries a trade. */\n lastPrice?: string;\n lastQty?: string;\n commission?: string;\n commissionAsset?: string;\n /** Cumulative executed quantity, when the stream reports it. */\n executedQty?: string;\n /** Cumulative quote volume, when the stream reports it. */\n cumQuote?: string;\n /** Average fill price, when the stream reports it. */\n avgPrice?: string;\n tradeId?: number;\n /**\n * Order context the report carries, when its source knows it (the paper\n * adapter always does). Consumers that translate reports into user-stream\n * frames (the v3 paper session) need it; the execution manager ignores it.\n */\n symbol?: string;\n /** Order side ('BUY' | 'SELL'), when known. */\n side?: string;\n /** Original order type ('MARKET' | 'LIMIT' | …), when known. */\n orderType?: string;\n /** Requested quantity, when known. */\n originalQty?: string;\n}\n\n/** Key that identifies an order for get/cancel reconciliation. */\nexport interface OrderKey {\n orderId?: number;\n origClientOrderId?: string;\n}\n\n/** Minimal user-stream surface both the spot and futures WS classes satisfy. */\nexport interface UserStreamLike {\n on(event: 'userData', listener: (event: unknown) => void): unknown;\n off(event: 'userData', listener: (event: unknown) => void): unknown;\n}\n\nexport interface ExecutionAdapter {\n /** Product label used in events and errors. */\n readonly product: string;\n /** Submit an order; resolves with the raw exchange (or simulator) response. */\n createOrder(submission: CreateOrderParams): Promise<Record<string, unknown>>;\n /** Fetch an order by key; rejects with BinanceApiError -2013 when absent. */\n fetchOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>>;\n /** Cancel an order by key. */\n cancelOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>>;\n /** Normalize a create/fetch/cancel response into decimal-string form. */\n toOrderShape(raw: Record<string, unknown>): OrderShape;\n /** Attach (or detach) the product's user data stream. */\n setUserStream(ws: UserStreamLike | null): void;\n /** Register a listener for normalized execution reports. */\n onReport(handler: (report: ExecutionReportShape) => void): void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction str(value: unknown): string {\n if (value === undefined || value === null) return '0';\n return String(value);\n}\n\nfunction numOr(value: unknown, fallback: number): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction rawFills(raw: Record<string, unknown>): ExecutionFill[] {\n const fills = raw.fills;\n if (!Array.isArray(fills)) return [];\n const result: ExecutionFill[] = [];\n for (const fill of fills) {\n if (!fill || typeof fill !== 'object') continue;\n const record = fill as Record<string, unknown>;\n if (record.price === undefined || record.qty === undefined) continue;\n result.push({\n price: Decimal.from(record.price as string | number).toString(),\n quantity: Decimal.from(record.qty as string | number).toString(),\n commission:\n record.commission !== undefined\n ? Decimal.from(record.commission as string | number).toString()\n : undefined,\n commissionAsset:\n typeof record.commissionAsset === 'string' ? record.commissionAsset : undefined,\n });\n }\n return result;\n}\n\nfunction reportFrom(\n raw: Record<string, unknown>,\n fields: {\n clientOrderId: string;\n orderId: string;\n status: string;\n lastPrice: string;\n lastQty: string;\n commission: string;\n commissionAsset: string;\n executedQty: string;\n cumQuote?: string;\n avgPrice: string;\n tradeId: string;\n },\n): ExecutionReportShape | null {\n const clientOrderId = raw[fields.clientOrderId];\n if (clientOrderId === undefined || clientOrderId === null || clientOrderId === '') return null;\n const report: ExecutionReportShape = {\n clientOrderId: String(clientOrderId),\n status: String(raw[fields.status] ?? ''),\n };\n if (raw[fields.orderId] !== undefined) report.orderId = numOr(raw[fields.orderId], 0);\n if (raw[fields.lastPrice] !== undefined) report.lastPrice = String(raw[fields.lastPrice]);\n if (raw[fields.lastQty] !== undefined) report.lastQty = String(raw[fields.lastQty]);\n if (raw[fields.commission] !== undefined) report.commission = String(raw[fields.commission]);\n if (raw[fields.commissionAsset] !== undefined)\n report.commissionAsset = String(raw[fields.commissionAsset]);\n if (raw[fields.executedQty] !== undefined) report.executedQty = String(raw[fields.executedQty]);\n if (raw[fields.avgPrice] !== undefined && String(raw[fields.avgPrice]) !== '')\n report.avgPrice = String(raw[fields.avgPrice]);\n if (fields.cumQuote && raw[fields.cumQuote] !== undefined)\n report.cumQuote = String(raw[fields.cumQuote]);\n if (raw[fields.tradeId] !== undefined) report.tradeId = numOr(raw[fields.tradeId], 0);\n return report;\n}\n\n/** The userData listener signature both adapters share. */\ntype UserDataListener = (event: unknown) => void;\n\n// ---------------------------------------------------------------------------\n// USDⓈ-M futures adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Binance USDⓈ-M (fapi) execution adapter: order field names (`cumQuote`,\n * `avgPrice`), `ORDER_TRADE_UPDATE` report shape, and -2011/-2013 semantics.\n */\nexport class FuturesExecutionAdapter implements ExecutionAdapter {\n readonly product = 'usdm';\n private reportHandler: ((report: ExecutionReportShape) => void) | null = null;\n private userDataListener: UserDataListener | null = null;\n private userStream: UserStreamLike | null = null;\n\n constructor(private readonly trading: FuturesTrading) {}\n\n async createOrder(submission: CreateOrderParams): Promise<Record<string, unknown>> {\n return (await this.trading.createOrder(submission)) as unknown as Record<string, unknown>;\n }\n\n async fetchOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>> {\n return (await this.trading.getOrder(symbol, {\n orderId: key.orderId,\n origClientOrderId: key.origClientOrderId,\n })) as unknown as Record<string, unknown>;\n }\n\n async cancelOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>> {\n return (await this.trading.cancelOrder(symbol, {\n orderId: key.orderId,\n origClientOrderId: key.origClientOrderId,\n })) as unknown as Record<string, unknown>;\n }\n\n toOrderShape(raw: Record<string, unknown>): OrderShape {\n return {\n orderId: raw.orderId !== undefined ? numOr(raw.orderId, 0) : undefined,\n clientOrderId: String(raw.clientOrderId ?? ''),\n symbol: String(raw.symbol ?? ''),\n side: String(raw.side ?? ''),\n type: String(raw.type ?? ''),\n status: String(raw.status ?? ''),\n executedQty: str(raw.executedQty),\n cumQuote: str(raw.cumQuote),\n avgPrice: str(raw.avgPrice),\n updateTime: raw.updateTime !== undefined ? numOr(raw.updateTime, Date.now()) : Date.now(),\n fills: rawFills(raw),\n };\n }\n\n setUserStream(ws: UserStreamLike | null): void {\n if (this.userStream && this.userDataListener) {\n this.userStream.off('userData', this.userDataListener);\n }\n this.userStream = ws;\n if (ws && this.userDataListener) {\n ws.on('userData', this.userDataListener);\n }\n }\n\n onReport(handler: (report: ExecutionReportShape) => void): void {\n this.reportHandler = handler;\n this.userDataListener = (event: unknown): void => {\n if (\n event === null ||\n typeof event !== 'object' ||\n (event as { e?: string }).e !== 'ORDER_TRADE_UPDATE'\n ) {\n return;\n }\n const order = (event as { o?: Record<string, unknown> }).o;\n if (!order || typeof order !== 'object') return;\n const report = reportFrom(order, {\n clientOrderId: 'c',\n orderId: 'i',\n status: 'X',\n lastPrice: 'L',\n lastQty: 'l',\n commission: 'n',\n commissionAsset: 'N',\n executedQty: 'z',\n avgPrice: 'ap',\n tradeId: 't',\n });\n if (report) this.reportHandler?.(report);\n };\n // Late registration (manager attaches after construction): wire now.\n if (this.userStream && this.userDataListener) {\n this.userStream.on('userData', this.userDataListener);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Spot adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Binance spot (api/v3) execution adapter: `cummulativeQuoteQty` field name,\n * `executionReport` user-stream shape (fills report `Z` cumulative quote), and\n * the same -2011/-2013 error semantics.\n */\nexport class SpotExecutionAdapter implements ExecutionAdapter {\n readonly product = 'spot';\n private reportHandler: ((report: ExecutionReportShape) => void) | null = null;\n private userDataListener: UserDataListener | null = null;\n private userStream: UserStreamLike | null = null;\n\n constructor(private readonly trading: SpotTrading) {}\n\n async createOrder(submission: CreateOrderParams): Promise<Record<string, unknown>> {\n return (await this.trading.createOrder(\n submission as unknown as Record<string, unknown>,\n )) as unknown as Record<string, unknown>;\n }\n\n async fetchOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>> {\n return (await this.trading.getOrder(symbol, {\n orderId: key.orderId,\n origClientOrderId: key.origClientOrderId,\n })) as unknown as Record<string, unknown>;\n }\n\n async cancelOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>> {\n return (await this.trading.cancelOrder(symbol, {\n orderId: key.orderId,\n origClientOrderId: key.origClientOrderId,\n })) as unknown as Record<string, unknown>;\n }\n\n toOrderShape(raw: Record<string, unknown>): OrderShape {\n // Spot orders carry cummulativeQuoteQty (not cumQuote) and may omit\n // avgPrice entirely (computed as quote/qty when filled).\n const executedQty = str(raw.executedQty);\n const cumQuote = raw.cummulativeQuoteQty !== undefined ? str(raw.cummulativeQuoteQty) : str(raw.cumQuote);\n let avgPrice = str(raw.avgPrice);\n if (raw.avgPrice === undefined) {\n const qty = Decimal.from(executedQty);\n if (!qty.isZero() && raw.cummulativeQuoteQty !== undefined) {\n avgPrice = Decimal.from(cumQuote).div(qty).toString();\n }\n }\n return {\n orderId: raw.orderId !== undefined ? numOr(raw.orderId, 0) : undefined,\n clientOrderId: String(raw.clientOrderId ?? ''),\n symbol: String(raw.symbol ?? ''),\n side: String(raw.side ?? ''),\n type: String(raw.type ?? ''),\n status: String(raw.status ?? ''),\n executedQty,\n cumQuote,\n avgPrice,\n updateTime:\n raw.transactTime !== undefined\n ? numOr(raw.transactTime, Date.now())\n : raw.workingTime !== undefined\n ? numOr(raw.workingTime, Date.now())\n : raw.updateTime !== undefined\n ? numOr(raw.updateTime, Date.now())\n : Date.now(),\n fills: rawFills(raw),\n };\n }\n\n setUserStream(ws: UserStreamLike | null): void {\n if (this.userStream && this.userDataListener) {\n this.userStream.off('userData', this.userDataListener);\n }\n this.userStream = ws;\n if (ws && this.userDataListener) {\n ws.on('userData', this.userDataListener);\n }\n }\n\n onReport(handler: (report: ExecutionReportShape) => void): void {\n this.reportHandler = handler;\n this.userDataListener = (event: unknown): void => {\n if (\n event === null ||\n typeof event !== 'object' ||\n (event as { e?: string }).e !== 'executionReport'\n ) {\n return;\n }\n const report = reportFrom(event as Record<string, unknown>, {\n clientOrderId: 'c',\n orderId: 'i',\n status: 'X',\n lastPrice: 'L',\n lastQty: 'l',\n commission: 'n',\n commissionAsset: 'N',\n executedQty: 'z',\n cumQuote: 'Z',\n avgPrice: 'ap',\n tradeId: 't',\n });\n if (report) this.reportHandler?.(report);\n };\n if (this.userStream && this.userDataListener) {\n this.userStream.on('userData', this.userDataListener);\n }\n }\n}\n\n/** Structural test: does this object already implement the adapter interface? */\nexport function isExecutionAdapter(candidate: unknown): candidate is ExecutionAdapter {\n return (\n typeof candidate === 'object' &&\n candidate !== null &&\n 'toOrderShape' in candidate &&\n 'fetchOrder' in candidate &&\n 'createOrder' in candidate\n );\n}\n","import type { WsConnectionOptions, WsConnectionState } from './WsConnection.js';\nimport { WsConnection } from './WsConnection.js';\nimport { parseSpotUserDataEvent, type SpotUserDataEvent } from '../types/spot.types.js';\n\nexport { type WsConnectionState };\n\nexport interface SpotUserWSOptions extends Omit<WsConnectionOptions, 'buildUrl'> {\n baseUserUrl: string;\n getListenKey: () => string | null;\n}\n\n/**\n * Spot user-data stream.\n *\n * Refactored onto {@link WsConnection}: race-free reconnection, explicit\n * lifecycle states, and proactive rotation before Binance's 24h stream limit.\n */\nexport class SpotUserWS extends WsConnection {\n private readonly getListenKey: () => string | null;\n\n constructor(options: SpotUserWSOptions) {\n const { baseUserUrl, getListenKey, ...connectionOptions } = options;\n super({\n ...connectionOptions,\n name: connectionOptions.name ?? 'spotUser',\n buildUrl: () => {\n const listenKey = getListenKey();\n return listenKey ? `${baseUserUrl}/${listenKey}` : null;\n },\n });\n this.getListenKey = getListenKey;\n }\n\n /**\n * Start (or restart) the user-data stream. Emits the historical `error`\n * event when no listenKey is available yet, matching the legacy contract.\n */\n override connect(): void {\n if (!this.getListenKey()) {\n this.emit('error', new Error('No spot listenKey available for user data stream'));\n return;\n }\n super.connect();\n }\n\n protected override handleRawMessage(text: string): void {\n const parsed = this.parseFrame(text);\n if (parsed === undefined) return;\n try {\n const event: SpotUserDataEvent = parseSpotUserDataEvent(parsed);\n this.emit(event.e, event);\n this.emit('userData', event);\n } catch (err) {\n this.emit('error', err);\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport WebSocket from 'ws';\nimport { NetworkError } from '../errors/index.js';\nimport type { WsApiResponse } from '../types/userdata.types.js';\nimport { Signer, type SignatureAlgorithm } from '../client/Signer.js';\n\nexport interface SpotWsApiOptions {\n baseUrl: string;\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n recvWindow?: number;\n timeoutMs?: number;\n}\n\ninterface WsApiRequestParams {\n id?: string;\n [key: string]: unknown;\n}\n\nfunction buildQueryString(data: Record<string, unknown>): string {\n return Object.entries(data)\n .filter(([, val]) => val !== undefined && val !== null)\n .map(([key, val]) => `${key}=${encodeURIComponent(String(val))}`)\n .join('&');\n}\n\n/**\n * Spot WebSocket API (`wss://ws-api.binance.com:443/ws-api/v3`). Same request/response envelope\n * as the futures {@link WsApi}, but Spot uses its own method identifiers (`trades.recent` rather\n * than `trades`, `ticker.book` rather than `ticker.bookTicker`, etc.) — hence a separate class\n * rather than pointing WsApi at a different host.\n */\nexport class SpotWsApi {\n private readonly signer: Signer;\n\n constructor(private readonly options: SpotWsApiOptions) {\n this.signer = new Signer({\n algorithm: options.signatureAlgorithm,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n });\n }\n\n async request(\n method: string,\n params: WsApiRequestParams = {},\n options?: { signed?: boolean },\n ): Promise<WsApiResponse> {\n const { apiKey } = this.options;\n const signed = options?.signed ?? true;\n const { id = randomUUID(), ...methodParams } = params;\n const requestParams: Record<string, unknown> = { ...methodParams };\n\n if (signed) {\n if (!apiKey || !this.signer.canSign()) {\n throw new Error('API key and secret (or privateKey) required for signed WebSocket API requests');\n }\n requestParams.apiKey = apiKey;\n requestParams.timestamp = Date.now();\n requestParams.recvWindow = this.options.recvWindow ?? 5000;\n const queryString = buildQueryString(requestParams);\n requestParams.signature = this.signer.sign(queryString);\n }\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(this.options.baseUrl);\n const timeout = setTimeout(() => {\n ws.close();\n reject(new NetworkError(`WebSocket API request timed out: ${method}`));\n }, this.options.timeoutMs ?? 15_000);\n\n ws.on('open', () => ws.send(JSON.stringify({ id, method, params: requestParams })));\n ws.on('message', (raw: Buffer) => {\n clearTimeout(timeout);\n ws.close();\n try {\n const parsed = JSON.parse(raw.toString()) as WsApiResponse;\n if (parsed.status >= 400) {\n reject(new Error(parsed.error?.msg ?? `WebSocket API error: ${method}`));\n } else {\n resolve(parsed);\n }\n } catch (err) {\n reject(new NetworkError('Invalid WebSocket API JSON payload', err));\n }\n });\n ws.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(new NetworkError(err.message, err));\n });\n });\n }\n\n // ---- Trading (signed) ----\n\n placeOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.place', params);\n }\n\n testOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.test', params);\n }\n\n cancelOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancel', params);\n }\n\n cancelReplaceOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancelReplace', params);\n }\n\n orderStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.status', params);\n }\n\n openOrdersStatus(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('openOrders.status', params);\n }\n\n cancelOpenOrders(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('openOrders.cancelAll', params);\n }\n\n placeOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.place', params);\n }\n\n cancelOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.cancel', params);\n }\n\n orderListStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.status', params);\n }\n\n openOrderListsStatus(): Promise<WsApiResponse> {\n return this.request('openOrderLists.status', {});\n }\n\n // ---- Account (signed) ----\n\n accountStatus(): Promise<WsApiResponse> {\n return this.request('account.status', {});\n }\n\n accountCommission(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('account.commission', params);\n }\n\n accountRateLimitsOrders(): Promise<WsApiResponse> {\n return this.request('account.rateLimits.orders', {});\n }\n\n allOrders(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('allOrders', params);\n }\n\n allOrderLists(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('allOrderLists', params);\n }\n\n myTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('myTrades', params);\n }\n\n // ---- User data stream (managed listen keys) ----\n\n userDataStreamStart(): Promise<WsApiResponse> {\n return this.request('userDataStream.start', {});\n }\n\n userDataStreamPing(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.ping', { listenKey });\n }\n\n userDataStreamStop(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.stop', { listenKey });\n }\n\n // ---- Public market data (no signature required) ----\n\n ping(): Promise<WsApiResponse> {\n return this.request('ping', {}, { signed: false });\n }\n\n time(): Promise<WsApiResponse> {\n return this.request('time', {}, { signed: false });\n }\n\n exchangeInfo(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('exchangeInfo', params, { signed: false });\n }\n\n depth(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('depth', params, { signed: false });\n }\n\n recentTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.recent', params, { signed: false });\n }\n\n historicalTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.historical', params, { signed: false });\n }\n\n aggTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades.aggregate', params, { signed: false });\n }\n\n klines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('klines', params, { signed: false });\n }\n\n uiKlines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('uiKlines', params, { signed: false });\n }\n\n avgPrice(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('avgPrice', params, { signed: false });\n }\n\n ticker24hr(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.24hr', params, { signed: false });\n }\n\n tickerTradingDay(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('ticker.tradingDay', params, { signed: false });\n }\n\n tickerPrice(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.price', params, { signed: false });\n }\n\n tickerBook(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.book', params, { signed: false });\n }\n\n ticker(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('ticker', params, { signed: false });\n }\n}\n","import type { CoreContext } from '../../core/context.js';\nimport { RiskGateway } from '../../risk/RiskGateway.js';\nimport { SpotAccount, SpotTrading } from '../../resources/SpotTrading.js';\nimport { SpotMarket } from '../../resources/SpotMarket.js';\nimport { SpotUserDataStream } from '../../resources/SpotUserDataStream.js';\nimport { ExecutionManager } from '../../execution/ExecutionManager.js';\nimport { SpotExecutionAdapter } from '../../execution/adapter.js';\nimport { SpotMarketWS } from '../../ws/SpotMarketWS.js';\nimport { SpotUserWS } from '../../ws/SpotUserWS.js';\nimport { SpotWsApi } from '../../ws/SpotWsApi.js';\n\n/**\n * The raw Spot product surface — no cross-product aliases. Exposed directly\n * as `client.spot` and wrapped by the standalone v3 Spot client.\n */\nexport interface SpotSurface {\n market: SpotMarket;\n account: SpotAccount;\n trading: SpotTrading;\n /** Idempotent spot order placement with transport-failure reconciliation. */\n execution: ExecutionManager;\n userStream: SpotUserDataStream;\n ws: SpotMarketWS;\n wsUser: SpotUserWS;\n wsApi: SpotWsApi;\n}\n\n/** Shared Spot wiring (single construction path, same pattern as USDⓈ-M). */\nexport function buildSpotSurface(core: CoreContext, getListenKey: () => string | null): SpotSurface {\n const events = core.events;\n const riskGateway = core.policy instanceof RiskGateway ? core.policy : undefined;\n const credentials = core.credentials;\n const spotHttp = core.http('spot');\n\n const spotTrading = new SpotTrading(spotHttp);\n return {\n market: new SpotMarket(spotHttp),\n account: new SpotAccount(spotHttp),\n trading: spotTrading,\n execution: new ExecutionManager(new SpotExecutionAdapter(spotTrading), {\n events,\n riskGateway,\n }),\n userStream: new SpotUserDataStream(spotHttp),\n ws: new SpotMarketWS(core.endpoints.wsSpotMarket, { events }),\n wsUser: new SpotUserWS({\n baseUserUrl: core.endpoints.wsSpotUser,\n getListenKey,\n events,\n }),\n wsApi: new SpotWsApi({\n baseUrl: core.endpoints.wsSpotApi,\n apiKey: credentials.apiKey,\n apiSecret: credentials.apiSecret,\n privateKey: credentials.privateKey,\n signatureAlgorithm: credentials.signatureAlgorithm,\n recvWindow: core.transport.recvWindow,\n }),\n };\n}\n","import { z } from 'zod';\n\nexport const BalanceSchema = z.object({\n accountAlias: z.string(),\n asset: z.string(),\n balance: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n marginAvailable: z.boolean(),\n updateTime: z.number(),\n});\nexport type Balance = z.infer<typeof BalanceSchema>;\nexport const BalancesResponseSchema = z.array(BalanceSchema);\n\nexport const PositionRiskSchema = z.object({\n symbol: z.string(),\n positionAmt: z.string().transform(Number),\n entryPrice: z.string().transform(Number),\n markPrice: z.string().transform(Number),\n unRealizedProfit: z.string().transform(Number),\n liquidationPrice: z.string().transform(Number),\n leverage: z.string().transform(Number),\n marginType: z.enum(['isolated', 'cross']),\n positionSide: z.string(),\n isolatedWallet: z.string().transform(Number).optional(),\n isolatedMargin: z.string().transform(Number).optional(),\n notional: z.string().transform(Number),\n updateTime: z.number().optional(),\n});\nexport type PositionRisk = z.infer<typeof PositionRiskSchema>;\nexport const PositionRiskResponseSchema = z.array(PositionRiskSchema);\n\nexport const AccountAssetSchema = z.object({\n asset: z.string(),\n walletBalance: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n marginBalance: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n marginAvailable: z.boolean().optional(),\n updateTime: z.number(),\n});\nexport type AccountAsset = z.infer<typeof AccountAssetSchema>;\n\nexport const AccountPositionSchema = z.object({\n symbol: z.string(),\n positionAmt: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n leverage: z.string().transform(Number),\n isolated: z.boolean(),\n entryPrice: z.string().transform(Number),\n positionSide: z.string(),\n positionNotional: z.string().transform(Number),\n isolatedWallet: z.string().transform(Number).optional(),\n isolatedMargin: z.string().transform(Number).optional(),\n notional: z.string().transform(Number).optional(),\n});\nexport type AccountPosition = z.infer<typeof AccountPositionSchema>;\n\nexport const AccountSchema = z.object({\n feeTier: z.number(),\n canTrade: z.boolean(),\n canDeposit: z.boolean(),\n canWithdraw: z.boolean(),\n updateTime: z.number(),\n totalInitialMargin: z.string().transform(Number),\n totalMaintMargin: z.string().transform(Number),\n totalWalletBalance: z.string().transform(Number),\n totalUnrealizedProfit: z.string().transform(Number),\n totalMarginBalance: z.string().transform(Number),\n totalPositionInitialMargin: z.string().transform(Number),\n totalOpenOrderInitialMargin: z.string().transform(Number),\n totalCrossWalletBalance: z.string().transform(Number),\n totalCrossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n assets: z.array(AccountAssetSchema),\n positions: z.array(AccountPositionSchema),\n});\nexport type Account = z.infer<typeof AccountSchema>;\n\nexport const IncomeSchema = z.object({\n symbol: z.string().optional(),\n incomeType: z.string(),\n income: z.string().transform(Number),\n asset: z.string(),\n time: z.number(),\n info: z.string().optional(),\n tranId: z.number(),\n tradeId: z.string().optional(),\n});\nexport type Income = z.infer<typeof IncomeSchema>;\nexport const IncomeHistoryResponseSchema = z.array(IncomeSchema);\n\nexport const UserTradeSchema = z.object({\n buyer: z.boolean(),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n id: z.number(),\n maker: z.boolean(),\n orderId: z.number(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n quoteQty: z.string().transform(Number),\n realizedPnl: z.string().transform(Number),\n side: z.string(),\n positionSide: z.string(),\n symbol: z.string(),\n time: z.number(),\n});\nexport type UserTrade = z.infer<typeof UserTradeSchema>;\nexport const UserTradesResponseSchema = z.array(UserTradeSchema);\n\nexport const CommissionRateSchema = z.object({\n symbol: z.string(),\n makerCommissionRate: z.string().transform(Number),\n takerCommissionRate: z.string().transform(Number),\n});\nexport type CommissionRate = z.infer<typeof CommissionRateSchema>;\n\nexport const LeverageBracketSchema = z.object({\n symbol: z.string().optional(),\n bracketNotional: z.string().transform(Number).optional(),\n bracket: z.number().optional(),\n maxLeverage: z.number().optional(),\n maintMarginRatio: z.string().transform(Number).optional(),\n cum: z.string().transform(Number).optional(),\n});\nexport type LeverageBracket = z.infer<typeof LeverageBracketSchema>;\nexport const LeverageBracketResponseSchema = z.array(\n z.object({\n symbol: z.string(),\n brackets: z.array(LeverageBracketSchema),\n }),\n);\n\nexport const PositionModeSchema = z.object({\n dualSidePosition: z.boolean(),\n});\nexport type PositionMode = z.infer<typeof PositionModeSchema>;\n\nexport const MultiAssetsMarginSchema = z.object({\n multiAssetsMargin: z.boolean(),\n});\nexport type MultiAssetsMargin = z.infer<typeof MultiAssetsMarginSchema>;\n\nexport const FeeBurnStatusSchema = z.object({\n feeBurn: z.boolean(),\n});\nexport type FeeBurnStatus = z.infer<typeof FeeBurnStatusSchema>;\n\nexport const PositionMarginHistoryEntrySchema = z.object({\n amount: z.string().transform(Number),\n asset: z.string(),\n symbol: z.string(),\n time: z.number(),\n type: z.number(),\n positionSide: z.string(),\n});\nexport type PositionMarginHistoryEntry = z.infer<typeof PositionMarginHistoryEntrySchema>;\nexport const PositionMarginHistorySchema = z.array(PositionMarginHistoryEntrySchema);\n\nexport const ApiTradingStatusSchema = z.object({\n isLocked: z.boolean(),\n plannedRecoverTime: z.number(),\n updateTime: z.number(),\n triggerCondition: z.record(z.string(), z.number()).optional(),\n indicators: z.record(z.string(), z.unknown()).optional(),\n});\nexport type ApiTradingStatus = z.infer<typeof ApiTradingStatusSchema>;\n\nexport const RateLimitOrderSchema = z.object({\n rateLimitType: z.string(),\n interval: z.string(),\n intervalNum: z.number(),\n limit: z.number(),\n count: z.number(),\n});\nexport type RateLimitOrder = z.infer<typeof RateLimitOrderSchema>;\nexport const RateLimitOrderResponseSchema = z.array(RateLimitOrderSchema);\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n Account,\n AccountSchema,\n ApiTradingStatus,\n ApiTradingStatusSchema,\n Balance,\n BalancesResponseSchema,\n CommissionRate,\n CommissionRateSchema,\n FeeBurnStatus,\n FeeBurnStatusSchema,\n Income,\n IncomeHistoryResponseSchema,\n LeverageBracket,\n LeverageBracketResponseSchema,\n MultiAssetsMargin,\n MultiAssetsMarginSchema,\n PositionMarginHistoryEntry,\n PositionMarginHistorySchema,\n PositionMode,\n PositionModeSchema,\n PositionRisk,\n PositionRiskResponseSchema,\n RateLimitOrder,\n RateLimitOrderResponseSchema,\n UserTrade,\n UserTradesResponseSchema,\n} from '../types/account.types.js';\n\nexport class FuturesAccount {\n constructor(private readonly http: HttpClient) {}\n\n async balance(): Promise<Balance[]> {\n return BalancesResponseSchema.parse(await this.http.get('/fapi/v2/balance', undefined, 'signed'));\n }\n\n async account(): Promise<Account> {\n return AccountSchema.parse(await this.http.get('/fapi/v2/account', undefined, 'signed'));\n }\n\n async positionRisk(symbol?: string): Promise<PositionRisk[]> {\n const params = symbol ? { symbol } : {};\n return PositionRiskResponseSchema.parse(await this.http.get('/fapi/v2/positionRisk', params, 'signed'));\n }\n\n async balanceV3(): Promise<Balance[]> {\n return BalancesResponseSchema.parse(await this.http.get('/fapi/v3/balance', undefined, 'signed'));\n }\n\n async accountV3(): Promise<Account> {\n return AccountSchema.parse(await this.http.get('/fapi/v3/account', undefined, 'signed'));\n }\n\n async positionRiskV3(symbol?: string): Promise<PositionRisk[]> {\n const params = symbol ? { symbol } : {};\n return PositionRiskResponseSchema.parse(await this.http.get('/fapi/v3/positionRisk', params, 'signed'));\n }\n\n async incomeHistory(options?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<Income[]> {\n const params = {\n symbol: options?.symbol,\n incomeType: options?.incomeType,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n };\n return IncomeHistoryResponseSchema.parse(await this.http.get('/fapi/v1/income', params, 'signed'));\n }\n\n async userTrades(options?: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n fromId?: number;\n }): Promise<UserTrade[]> {\n const params = {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n fromId: options?.fromId,\n };\n return UserTradesResponseSchema.parse(await this.http.get('/fapi/v1/userTrades', params, 'signed'));\n }\n\n async leverageBrackets(symbol?: string): Promise<{ symbol: string; brackets: LeverageBracket[] }[]> {\n const params = symbol ? { symbol } : {};\n return LeverageBracketResponseSchema.parse(await this.http.get('/fapi/v1/leverageBracket', params, 'signed'));\n }\n\n async commissionRate(symbol: string): Promise<CommissionRate> {\n return CommissionRateSchema.parse(await this.http.get('/fapi/v1/commissionRate', { symbol }, 'signed'));\n }\n\n async multiAssetsMargin(): Promise<MultiAssetsMargin> {\n return MultiAssetsMarginSchema.parse(await this.http.get('/fapi/v1/multiAssetsMargin', undefined, 'signed'));\n }\n\n async setMultiAssetsMargin(multiAssetsMargin: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/multiAssetsMargin', { multiAssetsMargin }, 'signed');\n }\n\n async feeBurnStatus(): Promise<FeeBurnStatus> {\n return FeeBurnStatusSchema.parse(await this.http.get('/fapi/v1/feeBurn', undefined, 'signed'));\n }\n\n async setFeeBurnStatus(feeBurn: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/feeBurn', { feeBurn }, 'signed');\n }\n\n async positionMode(): Promise<PositionMode> {\n return PositionModeSchema.parse(await this.http.get('/fapi/v1/positionSide/dual', undefined, 'signed'));\n }\n\n async setPositionMode(dualSidePosition: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/positionSide/dual', { dualSidePosition }, 'signed');\n }\n\n async apiTradingStatus(): Promise<ApiTradingStatus> {\n return ApiTradingStatusSchema.parse(await this.http.get('/fapi/v1/apiTradingStatus', undefined, 'signed'));\n }\n\n async positionMarginHistory(options?: {\n symbol: string;\n type?: number;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<PositionMarginHistoryEntry[]> {\n const params = {\n symbol: options?.symbol,\n type: options?.type,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n };\n return PositionMarginHistorySchema.parse(await this.http.get('/fapi/v1/positionMargin/history', params, 'signed'));\n }\n\n async rateLimitOrder(): Promise<RateLimitOrder[]> {\n return RateLimitOrderResponseSchema.parse(await this.http.get('/fapi/v1/rateLimit/order', undefined, 'signed'));\n }\n\n async accountConfig(): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/accountConfig', undefined, 'signed');\n }\n\n async pmAccountInfo(asset: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/pmAccountInfo', { asset }, 'signed');\n }\n\n async requestIncomeDownload(options: { startTime: number; endTime: number }): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/income/asyn', options, 'signed');\n }\n\n async getIncomeDownloadStatus(downloadId: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/income/asyn/id', { downloadId }, 'signed');\n }\n\n async requestOrderDownload(options?: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n }): Promise<Record<string, unknown>> {\n const params = {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n };\n return this.http.get('/fapi/v1/order/asyn', params, 'signed');\n }\n\n async getOrderDownloadStatus(downloadId: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/order/asyn/id', { downloadId }, 'signed');\n }\n\n async requestTradeDownload(options?: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n }): Promise<Record<string, unknown>> {\n const params = {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n };\n return this.http.get('/fapi/v1/trade/asyn', params, 'signed');\n }\n\n async getTradeDownloadStatus(downloadId: string): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/trade/asyn/id', { downloadId }, 'signed');\n }\n}\n","import { z } from 'zod';\n\nexport const FundingRateSchema = z.object({\n symbol: z.string(),\n fundingTime: z.number(),\n fundingRate: z.string().transform(Number),\n markPrice: z.string().transform(Number).optional(),\n});\nexport type FundingRate = z.infer<typeof FundingRateSchema>;\nexport const FundingRateHistorySchema = z.array(FundingRateSchema);\n\nexport const PremiumIndexSchema = z.object({\n symbol: z.string(),\n markPrice: z.string().transform(Number),\n indexPrice: z.string().transform(Number),\n estimatedSettlePrice: z.string().transform(Number),\n lastFundingRate: z.string().transform(Number),\n nextFundingTime: z.number(),\n interestRate: z.string().transform(Number),\n time: z.number(),\n});\nexport type PremiumIndex = z.infer<typeof PremiumIndexSchema>;\n\nexport const OpenInterestSchema = z.object({\n symbol: z.string(),\n openInterest: z.string().transform(Number),\n time: z.number(),\n});\nexport type OpenInterest = z.infer<typeof OpenInterestSchema>;\n\nexport const OpenInterestHistEntrySchema = z.object({\n symbol: z.string(),\n sumOpenInterest: z.string().transform(Number),\n sumOpenInterestValue: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type OpenInterestHistEntry = z.infer<typeof OpenInterestHistEntrySchema>;\nexport const OpenInterestHistSchema = z.array(OpenInterestHistEntrySchema);\n\nexport const LongShortRatioEntrySchema = z.object({\n symbol: z.string(),\n longShortRatio: z.string().transform(Number),\n longAccount: z.string().transform(Number),\n shortAccount: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type LongShortRatioEntry = z.infer<typeof LongShortRatioEntrySchema>;\nexport const LongShortRatioSchema = z.array(LongShortRatioEntrySchema);\n\nexport const TakerLongShortRatioEntrySchema = z.object({\n buySellRatio: z.string().transform(Number),\n buyVol: z.string().transform(Number),\n sellVol: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type TakerLongShortRatioEntry = z.infer<typeof TakerLongShortRatioEntrySchema>;\nexport const TakerLongShortRatioSchema = z.array(TakerLongShortRatioEntrySchema);\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n FundingRate,\n FundingRateHistorySchema,\n LongShortRatioEntry,\n LongShortRatioSchema,\n OpenInterest,\n OpenInterestHistEntry,\n OpenInterestHistSchema,\n OpenInterestSchema,\n PremiumIndex,\n PremiumIndexSchema,\n TakerLongShortRatioEntry,\n TakerLongShortRatioSchema,\n} from '../types/futures.types.js';\nimport type { KlineInterval } from '../types/market.types.js';\n\nexport interface FuturesDataEndpoints {\n restFapi?: string;\n restFuturesData?: string;\n apiKey?: string;\n apiSecret?: string;\n recvWindow?: number;\n timeoutMs?: number;\n maxRetries?: number;\n retryBaseDelayMs?: number;\n retryMaxDelayMs?: number;\n}\n\nexport class FuturesData {\n private readonly http: HttpClient;\n private readonly dataHttp: HttpClient;\n\n constructor(endpoints?: FuturesDataEndpoints) {\n const { restFapi, restFuturesData, ...httpOptions } = endpoints ?? {};\n this.http = new HttpClient({ baseURL: restFapi ?? 'https://fapi.binance.com/fapi/v1', ...httpOptions });\n this.dataHttp = new HttpClient({\n baseURL: restFuturesData ?? 'https://fapi.binance.com/futures/data',\n ...httpOptions,\n });\n }\n\n async fundingRateHistory(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<FundingRate[]> {\n const data = await this.http.get('/fundingRate', {\n symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 100,\n });\n return FundingRateHistorySchema.parse(data);\n }\n\n async premiumIndex(symbol: string): Promise<PremiumIndex> {\n return PremiumIndexSchema.parse(await this.http.get('/premiumIndex', { symbol }));\n }\n\n async openInterest(symbol: string): Promise<OpenInterest> {\n return OpenInterestSchema.parse(await this.http.get('/openInterest', { symbol }));\n }\n\n async openInterestHist(symbol: string, period: string, limit = 30): Promise<OpenInterestHistEntry[]> {\n const data = await this.dataHttp.get('/openInterestHist', { symbol, period, limit });\n return OpenInterestHistSchema.parse(data);\n }\n\n async topLongShortAccountRatio(symbol: string, period: string, limit = 30): Promise<LongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/topLongShortAccountRatio', { symbol, period, limit });\n return LongShortRatioSchema.parse(data);\n }\n\n async topLongShortPositionRatio(symbol: string, period: string, limit = 30): Promise<LongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/topLongShortPositionRatio', { symbol, period, limit });\n return LongShortRatioSchema.parse(data);\n }\n\n async globalLongShortAccountRatio(symbol: string, period: string, limit = 30): Promise<LongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/globalLongShortAccountRatio', { symbol, period, limit });\n return LongShortRatioSchema.parse(data);\n }\n\n async takerLongShortRatio(symbol: string, period: string, limit = 30): Promise<TakerLongShortRatioEntry[]> {\n const data = await this.dataHttp.get('/takerlongshortRatio', { symbol, period, limit });\n return TakerLongShortRatioSchema.parse(data);\n }\n\n async basis(\n symbol: string,\n period: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<unknown[]> {\n return this.dataHttp.get('/basis', {\n symbol,\n period,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n });\n }\n\n async fundingInfo(): Promise<unknown[]> {\n return this.http.get('/fundingInfo');\n }\n\n async assetIndex(symbol?: string): Promise<unknown[] | unknown> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/assetIndex', params);\n }\n\n async compositeIndexInfo(symbol?: string): Promise<unknown> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/indexInfo', params);\n }\n\n async adlQuantile(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/adlQuantile', params, 'signed');\n }\n\n async blvtInfo(\n tokenName: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<unknown[]> {\n return this.http.get('/lvtKlines', {\n tokenName,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n });\n }\n\n async indexPriceConstituents(symbol: string): Promise<unknown> {\n return this.http.get('/constituents', { symbol });\n }\n\n async symbolConfig(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/symbolConfig', params, 'signed');\n }\n\n async forceOrders(options?: {\n symbol?: string;\n autoCloseType?: 'LIQUIDATION' | 'ADL';\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<unknown[]> {\n return this.http.get(\n '/forceOrders',\n {\n symbol: options?.symbol,\n autoCloseType: options?.autoCloseType,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n },\n 'signed',\n );\n }\n\n async insuranceFundBalance(options?: { symbol?: string; startTime?: number; endTime?: number; limit?: number }): Promise<unknown[]> {\n return this.dataHttp.get('/insuranceBalance', {\n symbol: options?.symbol,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit,\n });\n }\n\n async pmExchangeInfo(): Promise<unknown> {\n return this.http.get('/pmExchangeInfo');\n }\n\n async delistSchedule(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/delistSchedule', params);\n }\n\n async symbolAdlRisk(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/symbolAdlRisk', params, 'signed');\n }\n\n async deliveryPrice(pair: string): Promise<{ deliveryTime: number; deliveryPrice: number }[]> {\n return this.dataHttp.get('/delivery-price', { pair });\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { MarketDataBase } from './MarketDataBase.js';\nimport {\n Kline,\n KlinesResponseSchema,\n KlineInterval,\n TickerPrice,\n TickerPriceSchema,\n BookTicker,\n BookTickerSchema,\n DepthSnapshot,\n DepthSnapshotSchema,\n ExchangeInfo,\n ExchangeInfoSchema,\n} from '../types/market.types.js';\n\nexport class FuturesMarket extends MarketDataBase {\n private readonly rootHttp: HttpClient;\n\n constructor(http?: HttpClient, restRoot?: string) {\n super(http ?? new HttpClient({ baseURL: 'https://fapi.binance.com/fapi/v1' }));\n this.rootHttp = new HttpClient({ baseURL: restRoot ?? 'https://fapi.binance.com' });\n }\n\n async continuousKlines(\n pair: string,\n contractType: 'perpetual' | 'current_quarter' | 'next_quarter',\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/continuousKlines', {\n pair,\n contractType,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async indexPriceKlines(\n pair: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/indexPriceKlines', {\n pair,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async markPriceKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/markPriceKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async premiumIndexKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/premiumIndexKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async rpiDepth(symbol: string, limit = 1000): Promise<DepthSnapshot> {\n return DepthSnapshotSchema.parse(await this.http.get('/rpiDepth', { symbol, limit }));\n }\n\n async tradingDayTicker(symbol?: string): Promise<unknown[]> {\n const params = symbol ? { symbol } : {};\n return this.http.get('/tradingDayTicker', params);\n }\n\n async tickerPriceV2(symbol?: string): Promise<TickerPrice[] | TickerPrice> {\n const params = symbol ? { symbol } : {};\n return TickerPriceSchema.parse(await this.rootHttp.get('/fapi/v2/ticker/price', params));\n }\n\n async bookTickerV2(symbol?: string): Promise<BookTicker[] | BookTicker> {\n const params = symbol ? { symbol } : {};\n return BookTickerSchema.parse(await this.rootHttp.get('/fapi/v2/ticker/bookTicker', params));\n }\n\n async instrumentDetails(symbol: string): Promise<ExchangeInfo['symbols'][number]> {\n const info = await ExchangeInfoSchema.parse(await this.http.get('/exchangeInfo'));\n const details = info.symbols.find((s) => s.symbol === symbol);\n if (!details) throw new Error(`Instrument ${symbol} not found`);\n return details;\n }\n}\n","import type { ExchangeSymbol } from './market.types.js';\n\n/**\n * Symbol trading rules, flattened out of the loose `filters` array that\n * `/fapi/v1/exchangeInfo` returns. Callers need these to round prices and\n * quantities before sending an order — Binance rejects anything that does not\n * sit exactly on a tick/step boundary (-1111) or that falls under the minimum\n * notional (-4164).\n */\nexport interface SymbolRules {\n symbol: string;\n status: string;\n baseAsset: string;\n quoteAsset: string;\n /** Tick the price must sit on, e.g. 0.10 for BTCUSDT. */\n tickSize: number;\n tickDecimals: number;\n /** Step the quantity must sit on for limit orders, e.g. 0.001 for BTCUSDT. */\n stepSize: number;\n stepDecimals: number;\n minQty: number;\n maxQty: number;\n /** MARKET orders carry their own LOT_SIZE, usually with a lower max. */\n marketStepSize: number;\n marketStepDecimals: number;\n marketMinQty: number;\n marketMaxQty: number;\n /** MIN_NOTIONAL — on USD-M futures the field is `notional`, not `minNotional`. */\n minNotional: number;\n}\n\ninterface RawFilter {\n filterType?: unknown;\n [key: string]: unknown;\n}\n\nfunction filtersOf(symbol: ExchangeSymbol): RawFilter[] {\n const raw = (symbol as unknown as Record<string, unknown>).filters;\n return Array.isArray(raw) ? (raw as RawFilter[]) : [];\n}\n\nfunction filterOf(symbol: ExchangeSymbol, filterType: string): RawFilter | undefined {\n return filtersOf(symbol).find((f) => f.filterType === filterType);\n}\n\nfunction num(value: unknown, fallback: number): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\n/**\n * Decimal places implied by a step string, e.g. \"0.00100000\" -> 3, \"1\" -> 0.\n * Derived from the string rather than the number so that a step like 0.0000001\n * never picks up an exponent representation.\n */\nexport function stepDecimals(step: string | number): number {\n const text = typeof step === 'number' ? step.toFixed(12) : String(step).trim();\n // Bound the scan: filter strings are short, but the parser is fed arbitrary\n // exchange payloads, so nothing here should be super-linear in input size.\n if (text.length > 64) {\n return stepDecimals(text.slice(0, 64));\n }\n const dot = text.indexOf('.');\n if (dot === -1) return 0;\n // Linear trailing-zero scan. A `/0+$/` regex is quadratic on adversarial\n // inputs (e.g. \"0a0a0a0…\") — the flagged polynomial-ReDoS pattern.\n let end = text.length;\n while (end > dot + 1 && text.charCodeAt(end - 1) === 48) end--;\n return end - (dot + 1);\n}\n\n/** Format a value at a fixed precision, which is what should be sent to Binance. */\nexport function formatToDecimals(value: number, decimals: number): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Round down onto a step boundary. Used for quantities, where rounding up would\n * silently take on more risk than the caller asked for. The epsilon absorbs\n * binary-float error so that e.g. 0.3 / 0.1 = 2.9999999999999996 still floors to 3.\n */\nexport function floorToStep(value: number, step: number, decimals = stepDecimals(step)): number {\n if (!(step > 0)) return value;\n const steps = Math.floor(value / step + 1e-9);\n return Number((steps * step).toFixed(decimals));\n}\n\n/** Round to the nearest step boundary. Used for prices, where direction is not a risk. */\nexport function roundToStep(value: number, step: number, decimals = stepDecimals(step)): number {\n if (!(step > 0)) return value;\n const steps = Math.round(value / step);\n return Number((steps * step).toFixed(decimals));\n}\n\n/** Flatten one `exchangeInfo.symbols[]` entry into typed trading rules. */\nexport function symbolRulesFrom(symbol: ExchangeSymbol): SymbolRules {\n const raw = symbol as unknown as Record<string, unknown>;\n const price = filterOf(symbol, 'PRICE_FILTER');\n const lot = filterOf(symbol, 'LOT_SIZE');\n const marketLot = filterOf(symbol, 'MARKET_LOT_SIZE');\n const notional = filterOf(symbol, 'MIN_NOTIONAL');\n\n const tickSizeRaw = price?.tickSize ?? 10 ** -num(raw.pricePrecision, 2);\n const stepSizeRaw = lot?.stepSize ?? 10 ** -num(raw.quantityPrecision, 3);\n const marketStepRaw = marketLot?.stepSize ?? stepSizeRaw;\n\n return {\n symbol: symbol.symbol,\n status: symbol.status,\n baseAsset: symbol.baseAsset,\n quoteAsset: symbol.quoteAsset,\n tickSize: num(tickSizeRaw, 0.01),\n tickDecimals: stepDecimals(tickSizeRaw as string | number),\n stepSize: num(stepSizeRaw, 0.001),\n stepDecimals: stepDecimals(stepSizeRaw as string | number),\n minQty: num(lot?.minQty, 0),\n maxQty: num(lot?.maxQty, Number.POSITIVE_INFINITY),\n marketStepSize: num(marketStepRaw, 0.001),\n marketStepDecimals: stepDecimals(marketStepRaw as string | number),\n marketMinQty: num(marketLot?.minQty, num(lot?.minQty, 0)),\n marketMaxQty: num(marketLot?.maxQty, num(lot?.maxQty, Number.POSITIVE_INFINITY)),\n minNotional: num(notional?.notional, 0),\n };\n}\n","import type { FuturesAccount } from './FuturesAccount.js';\nimport type { FuturesData } from './FuturesData.js';\nimport type { FuturesMarket } from './FuturesMarket.js';\nimport type { FuturesTrading } from './FuturesTrading.js';\nimport type { PositionRisk } from '../types/account.types.js';\nimport {\n floorToStep,\n formatToDecimals,\n roundToStep,\n symbolRulesFrom,\n type SymbolRules,\n} from '../types/filters.types.js';\n\nexport interface SizePositionParams {\n symbol: string;\n side: 'BUY' | 'SELL';\n stopPrice: number;\n entryPrice?: number;\n riskAmount?: number;\n riskPct?: number;\n leverage?: number;\n marketOrder?: boolean;\n}\n\nexport interface PositionSizing {\n ok: boolean;\n reasons: string[];\n symbol: string;\n side: 'BUY' | 'SELL';\n entryPrice: number;\n stopPrice: number;\n riskPerUnit: number;\n riskAmount: number;\n rawQuantity: number;\n quantity: number;\n /** Pass this to createOrder — a string avoids float round-tripping. */\n quantityStr: string;\n notional: number;\n minNotional: number;\n leverage: number;\n requiredMargin: number;\n availableBalance?: number;\n rules: SymbolRules;\n}\n\nexport interface ClosePositionParams {\n symbol: string;\n positionSide?: 'BOTH' | 'LONG' | 'SHORT';\n /** Fraction of the position to close, 0 < portion <= 1. Defaults to the whole position. */\n portion?: number;\n dryRun?: boolean;\n}\n\nexport interface BracketOrderParams {\n symbol: string;\n side: 'BUY' | 'SELL';\n quantity: number | string;\n entryPrice?: number;\n stopLossPrice: number;\n takeProfitPrice?: number;\n positionSide?: 'BOTH' | 'LONG' | 'SHORT';\n workingType?: 'MARK_PRICE' | 'CONTRACT_PRICE';\n}\n\nconst RULES_TTL_MS = 60_000;\n\n/**\n * Composite operations layered over the single-endpoint resources.\n *\n * Everything here fans out over `FuturesMarket` / `FuturesData` / `FuturesAccount` /\n * `FuturesTrading` directly. It deliberately does not call the LLM tool handlers,\n * which return formatted JSON strings — composing at this layer keeps typed values\n * typed and avoids a parse/stringify round-trip per step.\n */\nexport class FuturesOps {\n private rulesCache = new Map<string, { rules: SymbolRules; at: number }>();\n\n constructor(\n private readonly market: FuturesMarket,\n private readonly data: FuturesData,\n private readonly account: FuturesAccount,\n private readonly trading: FuturesTrading,\n ) {}\n\n /** Typed tick/step/notional rules for a symbol, cached briefly (exchangeInfo is a large payload). */\n async symbolRules(symbol: string, options?: { refresh?: boolean }): Promise<SymbolRules> {\n const key = symbol.toUpperCase();\n const cached = this.rulesCache.get(key);\n if (!options?.refresh && cached && Date.now() - cached.at < RULES_TTL_MS) return cached.rules;\n\n const details = await this.market.instrumentDetails(key);\n const rules = symbolRulesFrom(details);\n this.rulesCache.set(key, { rules, at: Date.now() });\n return rules;\n }\n\n /** Round a price to the symbol's tick and a quantity to its step, ready to send. */\n async quantize(\n symbol: string,\n values: { price?: number; quantity?: number; marketOrder?: boolean },\n ): Promise<{ price?: string; quantity?: string; rules: SymbolRules }> {\n const rules = await this.symbolRules(symbol);\n const step = values.marketOrder ? rules.marketStepSize : rules.stepSize;\n const stepDp = values.marketOrder ? rules.marketStepDecimals : rules.stepDecimals;\n return {\n price:\n values.price === undefined\n ? undefined\n : formatToDecimals(roundToStep(values.price, rules.tickSize, rules.tickDecimals), rules.tickDecimals),\n quantity:\n values.quantity === undefined\n ? undefined\n : formatToDecimals(floorToStep(values.quantity, step, stepDp), stepDp),\n rules,\n };\n }\n\n /**\n * Risk-based position sizing. Converts \"risk N quote units between entry and stop\"\n * into a quantity that satisfies the symbol's step size, lot bounds and min notional,\n * and reports every constraint it could not satisfy instead of silently adjusting risk.\n */\n async sizePosition(params: SizePositionParams): Promise<PositionSizing> {\n const symbol = params.symbol.toUpperCase();\n const reasons: string[] = [];\n\n if ((params.riskAmount === undefined) === (params.riskPct === undefined)) {\n throw new Error('Provide exactly one of riskAmount or riskPct');\n }\n\n const rules = await this.symbolRules(symbol);\n const entryPrice = params.entryPrice ?? (await this.data.premiumIndex(symbol)).markPrice;\n\n let availableBalance: number | undefined;\n let riskAmount = params.riskAmount ?? 0;\n if (params.riskPct !== undefined) {\n const balances = await this.account.balanceV3();\n availableBalance = balances.find((b) => b.asset === rules.quoteAsset)?.availableBalance ?? 0;\n riskAmount = availableBalance * (params.riskPct / 100);\n }\n\n const riskPerUnit = Math.abs(entryPrice - params.stopPrice);\n const stopOnCorrectSide =\n params.side === 'BUY' ? params.stopPrice < entryPrice : params.stopPrice > entryPrice;\n if (!stopOnCorrectSide) {\n reasons.push(\n `stopPrice ${params.stopPrice} is on the wrong side of entry ${entryPrice} for a ${params.side}`,\n );\n }\n if (riskPerUnit <= 0) reasons.push('stopPrice equals entryPrice, risk per unit is zero');\n\n const step = params.marketOrder ? rules.marketStepSize : rules.stepSize;\n const stepDp = params.marketOrder ? rules.marketStepDecimals : rules.stepDecimals;\n const minQty = params.marketOrder ? rules.marketMinQty : rules.minQty;\n const maxQty = params.marketOrder ? rules.marketMaxQty : rules.maxQty;\n\n const rawQuantity = riskPerUnit > 0 ? riskAmount / riskPerUnit : 0;\n let quantity = floorToStep(rawQuantity, step, stepDp);\n\n if (quantity > maxQty) {\n reasons.push(`quantity ${quantity} exceeds maxQty ${maxQty}, clamped`);\n quantity = floorToStep(maxQty, step, stepDp);\n }\n if (quantity < minQty) {\n reasons.push(`quantity ${quantity} is below minQty ${minQty} for this symbol`);\n }\n\n const notional = quantity * entryPrice;\n if (rules.minNotional > 0 && notional < rules.minNotional) {\n reasons.push(\n `notional ${notional.toFixed(2)} is below the ${rules.minNotional} minimum; ` +\n `raising risk or widening the stop is required (this tool will not increase risk for you)`,\n );\n }\n if (rules.status !== 'TRADING') reasons.push(`symbol status is ${rules.status}, not TRADING`);\n\n const leverage = params.leverage ?? 1;\n const requiredMargin = notional / leverage;\n if (availableBalance !== undefined && requiredMargin > availableBalance) {\n reasons.push(\n `required margin ${requiredMargin.toFixed(2)} exceeds available balance ${availableBalance.toFixed(2)}`,\n );\n }\n\n return {\n ok: reasons.length === 0 && quantity > 0,\n reasons,\n symbol,\n side: params.side,\n entryPrice,\n stopPrice: params.stopPrice,\n riskPerUnit,\n riskAmount,\n rawQuantity,\n quantity,\n quantityStr: formatToDecimals(quantity, stepDp),\n notional,\n minNotional: rules.minNotional,\n leverage,\n requiredMargin,\n availableBalance,\n rules,\n };\n }\n\n /**\n * Flatten an open position with a reduce-only market order.\n *\n * Picks the closing side from the sign of `positionAmt` and, critically, chooses\n * between `reduceOnly` and `positionSide`: Binance rejects `reduceOnly` in hedge\n * mode, and rejects a LONG/SHORT `positionSide` in one-way mode.\n */\n async closePosition(params: ClosePositionParams): Promise<{\n closed: boolean;\n reason?: string;\n position?: PositionRisk;\n order?: unknown;\n request?: Record<string, unknown>;\n }> {\n const symbol = params.symbol.toUpperCase();\n const portion = params.portion ?? 1;\n if (!(portion > 0 && portion <= 1)) throw new Error('portion must be within (0, 1]');\n\n const positions = await this.account.positionRiskV3(symbol);\n const open = positions.filter(\n (p) =>\n p.positionAmt !== 0 &&\n (params.positionSide === undefined || p.positionSide === params.positionSide),\n );\n\n if (open.length === 0) return { closed: false, reason: `no open position on ${symbol}` };\n if (open.length > 1) {\n return {\n closed: false,\n reason: `${open.length} positions open on ${symbol} (hedge mode); pass positionSide to pick one`,\n };\n }\n\n const position = open[0] as PositionRisk;\n const rules = await this.symbolRules(symbol);\n const quantity = floorToStep(\n Math.abs(position.positionAmt) * portion,\n rules.marketStepSize,\n rules.marketStepDecimals,\n );\n if (quantity <= 0) {\n return { closed: false, reason: 'closing quantity rounds to zero at this symbol step size', position };\n }\n\n const hedgeMode = position.positionSide !== 'BOTH';\n const request: Record<string, unknown> = {\n symbol,\n side: position.positionAmt > 0 ? 'SELL' : 'BUY',\n type: 'MARKET',\n quantity: formatToDecimals(quantity, rules.marketStepDecimals),\n ...(hedgeMode ? { positionSide: position.positionSide } : { reduceOnly: true }),\n };\n\n if (params.dryRun) return { closed: false, reason: 'dryRun', position, request };\n\n const order = await this.trading.createOrder(request as never);\n return { closed: true, position, order, request };\n }\n\n /**\n * One-call market picture: 24h stats, mark/index and funding, open interest and\n * positioning. Uses allSettled so a single unavailable feed degrades one field\n * instead of failing the whole snapshot.\n */\n async marketSnapshot(\n symbol: string,\n options?: { period?: string },\n ): Promise<Record<string, unknown>> {\n const s = symbol.toUpperCase();\n const period = options?.period ?? '1h';\n const [ticker, premium, openInterest, longShort] = await Promise.allSettled([\n this.market.ticker24hr(s),\n this.data.premiumIndex(s),\n this.data.openInterest(s),\n this.data.globalLongShortAccountRatio(s, period, 1),\n ]);\n\n const settled = <T>(r: PromiseSettledResult<T>): unknown =>\n r.status === 'fulfilled' ? r.value : { error: String((r as PromiseRejectedResult).reason) };\n\n return {\n symbol: s,\n asOf: Date.now(),\n ticker24hr: settled(ticker),\n markPrice: settled(premium),\n openInterest: settled(openInterest),\n longShortAccountRatio: settled(longShort),\n };\n }\n\n /** Balances, open positions and working orders in one call, with the noise filtered out. */\n async accountOverview(): Promise<Record<string, unknown>> {\n const [balances, positions, openOrders] = await Promise.allSettled([\n this.account.balanceV3(),\n this.account.positionRiskV3(),\n this.trading.getOpenOrders(),\n ]);\n\n const fundedBalances =\n balances.status === 'fulfilled' ? balances.value.filter((b) => b.balance !== 0) : [];\n const openPositions =\n positions.status === 'fulfilled' ? positions.value.filter((p) => p.positionAmt !== 0) : [];\n\n return {\n asOf: Date.now(),\n balances: balances.status === 'fulfilled' ? fundedBalances : { error: String(balances.reason) },\n positions: positions.status === 'fulfilled' ? openPositions : { error: String(positions.reason) },\n openOrders: openOrders.status === 'fulfilled' ? openOrders.value : { error: String(openOrders.reason) },\n totals:\n positions.status === 'fulfilled'\n ? {\n openPositionCount: openPositions.length,\n unrealizedPnl: openPositions.reduce((sum, p) => sum + p.unRealizedProfit, 0),\n grossNotional: openPositions.reduce((sum, p) => sum + Math.abs(p.notional), 0),\n }\n : undefined,\n };\n }\n\n /**\n * Entry order plus its protective stop-loss and optional take-profit, with every\n * price quantized to the symbol tick.\n *\n * The protective legs are placed after the entry is accepted. If a protective leg\n * fails, the failure is reported per-leg rather than unwound: the entry may already\n * have filled, so cancelling it is not a safe automatic recovery.\n */\n async placeBracketOrder(params: BracketOrderParams): Promise<Record<string, unknown>> {\n const symbol = params.symbol.toUpperCase();\n const rules = await this.symbolRules(symbol);\n const tick = (p: number): string =>\n formatToDecimals(roundToStep(p, rules.tickSize, rules.tickDecimals), rules.tickDecimals);\n\n const quantity = formatToDecimals(\n floorToStep(Number(params.quantity), rules.stepSize, rules.stepDecimals),\n rules.stepDecimals,\n );\n if (Number(quantity) <= 0) throw new Error('quantity rounds to zero at this symbol step size');\n\n const exitSide = params.side === 'BUY' ? 'SELL' : 'BUY';\n const hedgeMode = params.positionSide !== undefined && params.positionSide !== 'BOTH';\n const sideFields = hedgeMode ? { positionSide: params.positionSide } : { reduceOnly: true };\n const workingType = params.workingType ?? 'MARK_PRICE';\n\n const entry = await this.trading.createOrder({\n symbol,\n side: params.side,\n type: params.entryPrice === undefined ? 'MARKET' : 'LIMIT',\n quantity,\n ...(params.entryPrice === undefined\n ? {}\n : { price: tick(params.entryPrice), timeInForce: 'GTC' as const }),\n ...(hedgeMode ? { positionSide: params.positionSide } : {}),\n });\n\n const protective = await Promise.allSettled([\n this.trading.createOrder({\n symbol,\n side: exitSide,\n type: 'STOP_MARKET',\n quantity,\n stopPrice: tick(params.stopLossPrice),\n workingType,\n ...sideFields,\n } as never),\n ...(params.takeProfitPrice === undefined\n ? []\n : [\n this.trading.createOrder({\n symbol,\n side: exitSide,\n type: 'TAKE_PROFIT_MARKET',\n quantity,\n stopPrice: tick(params.takeProfitPrice),\n workingType,\n ...sideFields,\n } as never),\n ]),\n ]);\n\n const [stopLoss, takeProfit] = protective;\n const leg = (r?: PromiseSettledResult<unknown>): unknown =>\n r === undefined\n ? undefined\n : r.status === 'fulfilled'\n ? r.value\n : { error: String((r as PromiseRejectedResult).reason) };\n\n const failures = protective.filter((r) => r.status === 'rejected').length;\n return {\n symbol,\n quantity,\n entry,\n stopLoss: leg(stopLoss),\n takeProfit: leg(takeProfit),\n protectionComplete: failures === 0,\n ...(failures > 0\n ? {\n warning:\n 'Entry was submitted but at least one protective order failed. The position may be ' +\n 'unprotected — review and place the missing leg manually.',\n }\n : {}),\n };\n }\n}\n","import { z } from 'zod';\n\nexport const OrderSchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumQuote: z.string().transform(Number),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n stopPrice: z.string().transform(Number).optional(),\n closePosition: z.boolean().optional(),\n timeInForce: z.string().optional(),\n origType: z.string().optional(),\n time: z.number(),\n updateTime: z.number(),\n workingType: z.string().optional(),\n priceProtect: z.boolean().optional(),\n});\nexport type Order = z.infer<typeof OrderSchema>;\nexport const OrderResponseSchema = OrderSchema;\nexport const OrdersResponseSchema = z.array(OrderSchema);\n\nexport const CreateOrderParamsSchema = z.object({\n symbol: z.string(),\n side: z.enum(['BUY', 'SELL']),\n type: z.string(),\n quantity: z.union([z.string(), z.number()]).optional(),\n price: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX', 'GTD']).optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n reduceOnly: z.boolean().optional(),\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional(),\n newClientOrderId: z.string().optional(),\n closePosition: z.boolean().optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT']).optional(),\n priceProtect: z.boolean().optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional(),\n callbackRate: z.union([z.string(), z.number()]).optional(),\n activationPrice: z.union([z.string(), z.number()]).optional(),\n selfTradePreventionMode: z.enum(['NONE', 'EXPIRE_TAKER', 'EXPIRE_MAKER', 'EXPIRE_BOTH']).optional(),\n goodTillDate: z.number().optional(),\n});\nexport type CreateOrderParams = z.infer<typeof CreateOrderParamsSchema>;\n\nexport const ModifyOrderParamsSchema = CreateOrderParamsSchema.extend({\n orderId: z.number().optional(),\n origClientOrderId: z.string().optional(),\n origType: z.string().optional(),\n});\nexport type ModifyOrderParams = z.infer<typeof ModifyOrderParamsSchema>;\n\nexport const AlgoOrderSchema = z.object({\n algoId: z.number(),\n symbol: z.string(),\n side: z.string(),\n positionSide: z.string(),\n totalQty: z.string().transform(Number).optional(),\n executedQty: z.string().transform(Number).optional(),\n executedAmt: z.string().transform(Number).optional(),\n avgPrice: z.string().transform(Number).optional(),\n clientAlgoId: z.string().optional(),\n bookTime: z.number().optional(),\n endTime: z.number().optional(),\n algoStatus: z.string().optional(),\n algoType: z.string().optional(),\n urgency: z.string().optional(),\n});\nexport type AlgoOrder = z.infer<typeof AlgoOrderSchema>;\nexport const AlgoOrderResponseSchema = AlgoOrderSchema;\nexport const AlgoOrdersResponseSchema = z.array(AlgoOrderSchema);\n\nexport const BatchOrdersItemSchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumQuote: z.string().transform(Number),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n time: z.number(),\n updateTime: z.number(),\n});\nexport type BatchOrdersItem = z.infer<typeof BatchOrdersItemSchema>;\nexport const BatchOrdersResponseSchema = z.array(BatchOrdersItemSchema);\n\nexport const OrderModifyHistoryEntrySchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumQuote: z.string().transform(Number),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n origType: z.string().optional(),\n stopPrice: z.string().transform(Number).optional(),\n updateTime: z.number(),\n});\nexport type OrderModifyHistoryEntry = z.infer<typeof OrderModifyHistoryEntrySchema>;\nexport const OrderModifyHistorySchema = z.array(OrderModifyHistoryEntrySchema);\n\nexport const LeverageChangeSchema = z.object({\n leverage: z.number(),\n maxNotionalValue: z.union([z.string(), z.number()]),\n symbol: z.string(),\n});\nexport type LeverageChange = z.infer<typeof LeverageChangeSchema>;\n\nexport const MarginTypeChangeSchema = z.object({\n code: z.number(),\n msg: z.string(),\n});\nexport type MarginTypeChange = z.infer<typeof MarginTypeChangeSchema>;\n\nexport const PositionMarginChangeSchema = z.object({\n amount: z.number(),\n code: z.number(),\n msg: z.string(),\n type: z.number(),\n});\nexport type PositionMarginChange = z.infer<typeof PositionMarginChangeSchema>;\n\nexport const CountdownCancelAllSchema = z.object({\n symbol: z.string(),\n countdownTime: z.number(),\n});\nexport type CountdownCancelAll = z.infer<typeof CountdownCancelAllSchema>;\n\nexport const NewOrderAckSchema = z.object({\n orderId: z.number(),\n symbol: z.string(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string(),\n avgPrice: z.string(),\n origQty: z.string(),\n executedQty: z.string(),\n cumQuote: z.string(),\n type: z.string(),\n reduceOnly: z.boolean(),\n side: z.string(),\n positionSide: z.string(),\n timeInForce: z.string().optional(),\n time: z.number(),\n updateTime: z.number(),\n workingType: z.string().optional(),\n origType: z.string().optional(),\n closePosition: z.boolean().optional(),\n});\nexport type NewOrderAck = z.infer<typeof NewOrderAckSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n AlgoOrder,\n AlgoOrderResponseSchema,\n AlgoOrdersResponseSchema,\n BatchOrdersItem,\n BatchOrdersResponseSchema,\n CountdownCancelAll,\n CountdownCancelAllSchema,\n CreateOrderParams,\n LeverageChange,\n LeverageChangeSchema,\n MarginTypeChange,\n MarginTypeChangeSchema,\n ModifyOrderParams,\n NewOrderAck,\n NewOrderAckSchema,\n Order,\n OrderModifyHistoryEntry,\n OrderModifyHistorySchema,\n OrderResponseSchema,\n OrdersResponseSchema,\n PositionMarginChange,\n PositionMarginChangeSchema,\n} from '../types/trading.types.js';\n\nexport class FuturesTrading {\n constructor(private readonly http: HttpClient) {}\n\n async setLeverage(symbol: string, leverage: number): Promise<LeverageChange> {\n return LeverageChangeSchema.parse(\n await this.http.post('/fapi/v1/leverage', { symbol, leverage }, 'signed'),\n );\n }\n\n /**\n * Place an order. The response schema depends on `newOrderRespType`:\n * `ACK` (the default) yields {@link NewOrderAck}; `RESULT` yields the full\n * {@link Order} shape. Parsing follows the requested mode so RESULT\n * responses are not silently truncated into the ACK schema.\n */\n async createOrder(params: CreateOrderParams): Promise<NewOrderAck | Order> {\n const raw = await this.http.post('/fapi/v1/order', params, 'signed');\n if (params.newOrderRespType === 'RESULT') {\n return OrderResponseSchema.parse(raw);\n }\n return NewOrderAckSchema.parse(raw);\n }\n\n async createTestOrder(params: CreateOrderParams): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/order/test', params, 'signed');\n }\n\n async getOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string },\n ): Promise<Order> {\n return OrderResponseSchema.parse(\n await this.http.get('/fapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string },\n ): Promise<Order> {\n return OrderResponseSchema.parse(\n await this.http.delete('/fapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async getCurrentOrder(\n symbol: string,\n options?: { orderId?: number; origClientOrderId?: string },\n ): Promise<Order> {\n return OrderResponseSchema.parse(\n await this.http.get('/fapi/v1/openOrder', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenOrders(symbol?: string): Promise<Order[]> {\n const params = symbol ? { symbol } : {};\n return OrdersResponseSchema.parse(await this.http.get('/fapi/v1/openOrders', params, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<Order[]> {\n return OrdersResponseSchema.parse(\n await this.http.get('/fapi/v1/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelAllOpenOrders(symbol: string): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/allOpenOrders', { symbol }, 'signed');\n }\n\n async modifyOrder(params: ModifyOrderParams): Promise<Order> {\n return OrderResponseSchema.parse(await this.http.put('/fapi/v1/order', params, 'signed'));\n }\n\n async createAlgoOrder(params: Record<string, unknown>): Promise<AlgoOrder> {\n return AlgoOrderResponseSchema.parse(await this.http.post('/fapi/v1/algoOrder', params, 'signed'));\n }\n\n async cancelAlgoOrder(\n symbol: string,\n options?: { algoId?: number; clientAlgoId?: string },\n ): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/algoOrder', { symbol, ...options }, 'signed');\n }\n\n async cancelAllOpenAlgoOrders(symbol: string): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/algoOpenOrders', { symbol }, 'signed');\n }\n\n async getAlgoOrder(\n symbol: string,\n options?: { algoId?: number; clientAlgoId?: string },\n ): Promise<AlgoOrder> {\n return AlgoOrderResponseSchema.parse(\n await this.http.get('/fapi/v1/algoOrder', { symbol, ...options }, 'signed'),\n );\n }\n\n async getOpenAlgoOrders(symbol?: string): Promise<AlgoOrder[]> {\n const params = symbol ? { symbol } : {};\n return AlgoOrdersResponseSchema.parse(await this.http.get('/fapi/v1/openAlgoOrders', params, 'signed'));\n }\n\n async getAllAlgoOrders(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<AlgoOrder[]> {\n return AlgoOrdersResponseSchema.parse(\n await this.http.get('/fapi/v1/allAlgoOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async createBatchOrders(batchOrders: CreateOrderParams[]): Promise<BatchOrdersItem[]> {\n return BatchOrdersResponseSchema.parse(\n await this.http.post('/fapi/v1/batchOrders', { batchOrders: JSON.stringify(batchOrders) }, 'signed'),\n );\n }\n\n async modifyBatchOrders(batchOrders: ModifyOrderParams[]): Promise<BatchOrdersItem[]> {\n return BatchOrdersResponseSchema.parse(\n await this.http.put('/fapi/v1/batchOrders', { batchOrders: JSON.stringify(batchOrders) }, 'signed'),\n );\n }\n\n async cancelBatchOrders(\n symbol: string,\n options?: { orderIdList?: number[]; origClientOrderIdList?: string[] },\n ): Promise<BatchOrdersItem[]> {\n const params: Record<string, unknown> = { symbol };\n if (options?.orderIdList?.length) params.orderIdList = JSON.stringify(options.orderIdList);\n if (options?.origClientOrderIdList?.length) {\n params.origClientOrderIdList = JSON.stringify(options.origClientOrderIdList);\n }\n return BatchOrdersResponseSchema.parse(await this.http.delete('/fapi/v1/batchOrders', params, 'signed'));\n }\n\n async getOrderModifyHistory(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<OrderModifyHistoryEntry[]> {\n return OrderModifyHistorySchema.parse(\n await this.http.get('/fapi/v1/orderAmendment', { symbol, ...options }, 'signed'),\n );\n }\n\n async setMarginType(symbol: string, marginType: 'isolated' | 'cross'): Promise<MarginTypeChange> {\n return MarginTypeChangeSchema.parse(\n await this.http.post('/fapi/v1/marginType', { symbol, marginType }, 'signed'),\n );\n }\n\n async modifyPositionMargin(symbol: string, amount: number, type: number): Promise<PositionMarginChange> {\n return PositionMarginChangeSchema.parse(\n await this.http.post('/fapi/v1/positionMargin', { symbol, amount, type }, 'signed'),\n );\n }\n\n async setCountdownCancelAll(symbol: string, countdownTime: number): Promise<CountdownCancelAll> {\n return CountdownCancelAllSchema.parse(\n await this.http.post('/fapi/v1/countdownCancelAll', { symbol, countdownTime }, 'signed'),\n );\n }\n\n async convertExchangeInfo(options?: { fromAsset?: string; toAsset?: string }): Promise<unknown[]> {\n return this.http.get('/fapi/v1/convert/exchangeInfo', options);\n }\n\n async convertGetQuote(params: {\n fromAsset: string;\n toAsset: string;\n fromAmount?: number;\n toAmount?: number;\n validTime?: '10s' | '30s' | '1m' | '2m';\n }): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/convert/getQuote', params, 'signed');\n }\n\n async convertAcceptQuote(quoteId: string): Promise<Record<string, unknown>> {\n return this.http.post('/fapi/v1/convert/acceptQuote', { quoteId }, 'signed');\n }\n\n async convertOrderStatus(options: { orderId?: string; quoteId?: string }): Promise<Record<string, unknown>> {\n return this.http.get('/fapi/v1/convert/orderStatus', options, 'signed');\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { ListenKey, ListenKeySchema } from '../types/userdata.types.js';\n\nexport class UserDataStream {\n constructor(private readonly http: HttpClient) {}\n\n async createListenKey(): Promise<ListenKey> {\n return ListenKeySchema.parse(await this.http.post('/fapi/v1/listenKey', undefined, 'apiKey'));\n }\n\n async keepAliveListenKey(): Promise<Record<string, unknown>> {\n return this.http.put('/fapi/v1/listenKey', undefined, 'apiKey');\n }\n\n async closeListenKey(): Promise<Record<string, unknown>> {\n return this.http.delete('/fapi/v1/listenKey', undefined, 'apiKey');\n }\n}\n","import type { EventBus } from '../core/events.js';\nimport type { WsConnectionOptions, WsConnectionState } from './WsConnection.js';\nimport { WsConnection } from './WsConnection.js';\nimport { parseUserDataEvent, type UserDataEvent } from '../types/userdata.types.js';\n\nexport { type WsConnectionState };\n\nexport interface FuturesUserWSOptions extends Omit<WsConnectionOptions, 'buildUrl'> {\n baseUserUrl: string;\n getListenKey: () => string | null;\n}\n\n/**\n * USD-M futures user-data stream.\n *\n * Refactored onto {@link WsConnection}: the listenKey URL is rebuilt on every\n * (re)connect, reconnects are race-free, the lifecycle is an explicit state\n * machine, and the connection is proactively rotated before Binance's 24h\n * stream limit (with the same listenKey, per Binance docs).\n */\nexport class FuturesUserWS extends WsConnection {\n private readonly getListenKey: () => string | null;\n private readonly baseUserUrl: string;\n\n constructor(options: FuturesUserWSOptions) {\n const { baseUserUrl, getListenKey, ...connectionOptions } = options;\n super({\n ...connectionOptions,\n name: connectionOptions.name ?? 'futuresUser',\n buildUrl: () => {\n const listenKey = getListenKey();\n return listenKey ? `${baseUserUrl}/${listenKey}` : null;\n },\n });\n this.baseUserUrl = baseUserUrl;\n this.getListenKey = getListenKey;\n }\n\n /**\n * Start (or restart) the user-data stream. Emits the historical `error`\n * event when no listenKey is available yet, matching the legacy contract.\n */\n override connect(): void {\n if (!this.getListenKey()) {\n this.emit('error', new Error('No listenKey available for user data stream'));\n return;\n }\n super.connect();\n }\n\n protected override handleRawMessage(text: string): void {\n const parsed = this.parseFrame(text);\n if (parsed === undefined) return;\n try {\n const event: UserDataEvent = parseUserDataEvent(parsed);\n this.emit(event.e, event);\n this.emit('userData', event);\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n /** The user-data stream base URL this instance was configured with. */\n getUserStreamBase(): string {\n return this.baseUserUrl;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport WebSocket from 'ws';\nimport { NetworkError } from '../errors/index.js';\nimport type { WsApiResponse } from '../types/userdata.types.js';\nimport { Signer, type SignatureAlgorithm } from '../client/Signer.js';\n\nexport interface WsApiOptions {\n baseUrl: string;\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n recvWindow?: number;\n timeoutMs?: number;\n}\n\ninterface WsApiRequestParams {\n id?: string;\n [key: string]: unknown;\n}\n\nfunction buildQueryString(data: Record<string, unknown>): string {\n return Object.entries(data)\n .filter(([, val]) => val !== undefined && val !== null)\n .map(([key, val]) => `${key}=${encodeURIComponent(String(val))}`)\n .join('&');\n}\n\nexport class WsApi {\n private readonly signer: Signer;\n\n constructor(private readonly options: WsApiOptions) {\n this.signer = new Signer({\n algorithm: options.signatureAlgorithm,\n apiSecret: options.apiSecret,\n privateKey: options.privateKey,\n });\n }\n\n async request(\n method: string,\n params: WsApiRequestParams = {},\n options?: { signed?: boolean },\n ): Promise<WsApiResponse> {\n const { apiKey } = this.options;\n const signed = options?.signed ?? true;\n const { id = randomUUID(), ...methodParams } = params;\n const requestParams: Record<string, unknown> = { ...methodParams };\n\n if (signed) {\n if (!apiKey || !this.signer.canSign()) {\n throw new Error('API key and secret (or privateKey) required for signed WebSocket API requests');\n }\n requestParams.apiKey = apiKey;\n requestParams.timestamp = Date.now();\n requestParams.recvWindow = this.options.recvWindow ?? 5000;\n const queryString = buildQueryString(requestParams);\n requestParams.signature = this.signer.sign(queryString);\n }\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(this.options.baseUrl);\n const timeout = setTimeout(() => {\n ws.close();\n reject(new NetworkError(`WebSocket API request timed out: ${method}`));\n }, this.options.timeoutMs ?? 15_000);\n\n ws.on('open', () => ws.send(JSON.stringify({ id, method, params: requestParams })));\n ws.on('message', (raw: Buffer) => {\n clearTimeout(timeout);\n ws.close();\n try {\n const parsed = JSON.parse(raw.toString()) as WsApiResponse;\n if (parsed.status >= 400) {\n reject(new Error(parsed.error?.msg ?? `WebSocket API error: ${method}`));\n } else {\n resolve(parsed);\n }\n } catch (err) {\n reject(new NetworkError('Invalid WebSocket API JSON payload', err));\n }\n });\n ws.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(new NetworkError(err.message, err));\n });\n });\n }\n\n placeOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.place', params);\n }\n\n cancelOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.cancel', params);\n }\n\n modifyOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.modify', params);\n }\n\n placeAlgoOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('algoOrder.place', params);\n }\n\n cancelAlgoOrder(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('algoOrder.cancel', params);\n }\n\n orderStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('order.status', params);\n }\n\n placeOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.place', params);\n }\n\n cancelOrderList(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.cancel', params);\n }\n\n orderListStatus(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('orderList.status', params);\n }\n\n accountStatus(): Promise<WsApiResponse> {\n return this.request('account.status', {});\n }\n\n accountPosition(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('account.position', params);\n }\n\n userDataStreamStart(): Promise<WsApiResponse> {\n return this.request('userDataStream.start', {});\n }\n\n userDataStreamPing(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.ping', { listenKey });\n }\n\n userDataStreamStop(listenKey: string): Promise<WsApiResponse> {\n return this.request('userDataStream.stop', { listenKey });\n }\n\n // ---- Public market data (no signature required) ----\n\n time(): Promise<WsApiResponse> {\n return this.request('time', {}, { signed: false });\n }\n\n exchangeInfo(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('exchangeInfo', params, { signed: false });\n }\n\n klines(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('klines', params, { signed: false });\n }\n\n aggTrades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('aggTrades', params, { signed: false });\n }\n\n trades(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('trades', params, { signed: false });\n }\n\n depth(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('depth', params, { signed: false });\n }\n\n avgPrice(params: Record<string, unknown>): Promise<WsApiResponse> {\n return this.request('avgPrice', params, { signed: false });\n }\n\n tickerPrice(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.price', params, { signed: false });\n }\n\n tickerBookTicker(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.bookTicker', params, { signed: false });\n }\n\n ticker24hr(params: Record<string, unknown> = {}): Promise<WsApiResponse> {\n return this.request('ticker.24hr', params, { signed: false });\n }\n}\n","import type { CoreContext } from '../../core/context.js';\nimport { RiskGateway } from '../../risk/RiskGateway.js';\nimport { FuturesAccount } from '../../resources/FuturesAccount.js';\nimport { FuturesData } from '../../resources/FuturesData.js';\nimport { FuturesMarket } from '../../resources/FuturesMarket.js';\nimport { FuturesOps } from '../../resources/FuturesOps.js';\nimport { FuturesTrading } from '../../resources/FuturesTrading.js';\nimport { UserDataStream } from '../../resources/UserDataStream.js';\nimport { ExecutionManager } from '../../execution/ExecutionManager.js';\nimport { FuturesMarketWS } from '../../ws/FuturesMarketWS.js';\nimport { FuturesUserWS } from '../../ws/FuturesUserWS.js';\nimport { WsApi } from '../../ws/WsApi.js';\nimport type { CoinMSurface } from '../coinm/surface.js';\n\n/**\n * The raw USDⓈ-M product surface — every capability, no cross-product\n * aliases. This is what the standalone {@link USDMClient} exposes and what\n * the multi-product `BinanceClient.futures` facade wraps (adding the\n * ergonomic `futures.usdm` / `futures.coinm` aliases).\n */\nexport interface UsdmSurface {\n market: FuturesMarket;\n data: FuturesData;\n account: FuturesAccount;\n trading: FuturesTrading;\n ops: FuturesOps;\n /** Idempotent order placement with transport-failure reconciliation. */\n execution: ExecutionManager;\n userStream: UserDataStream;\n ws: FuturesMarketWS;\n wsUser: FuturesUserWS;\n wsApi: WsApi;\n}\n\n/**\n * Shared USDⓈ-M wiring — the single construction path for the product\n * surface, used by both the multi-product `BinanceClient` facade and the\n * standalone v3 {@link USDMClient}. One wiring means one behavior: ledger\n * prefixes, event names, WS URLs and adapter choices cannot drift between\n * the two entry points.\n */\nexport function buildUsdmSurface(core: CoreContext, getListenKey: () => string | null): UsdmSurface {\n const events = core.events;\n const riskGateway = core.policy instanceof RiskGateway ? core.policy : undefined;\n const credentials = core.credentials;\n\n const futuresMarket = new FuturesMarket(core.http('fapi'), core.endpoints.restRoot);\n const futuresData = new FuturesData({\n restFapi: core.endpoints.restFapi,\n restFuturesData: core.endpoints.restFuturesData,\n apiKey: credentials.apiKey,\n apiSecret: credentials.apiSecret,\n recvWindow: core.transport.recvWindow,\n timeoutMs: core.transport.timeoutMs,\n maxRetries: core.transport.maxRetries,\n retryBaseDelayMs: core.transport.retryBaseDelayMs,\n retryMaxDelayMs: core.transport.retryMaxDelayMs,\n });\n const futuresAccount = new FuturesAccount(core.http('fapiRoot'));\n const futuresTrading = new FuturesTrading(core.http('fapiRoot'));\n\n return {\n market: futuresMarket,\n data: futuresData,\n account: futuresAccount,\n trading: futuresTrading,\n ops: new FuturesOps(futuresMarket, futuresData, futuresAccount, futuresTrading),\n execution: new ExecutionManager(futuresTrading, { events, riskGateway }),\n userStream: new UserDataStream(core.http('fapiRoot')),\n ws: new FuturesMarketWS(core.endpoints.wsMarket, { events }),\n wsUser: new FuturesUserWS({\n baseUserUrl: core.endpoints.wsUser,\n getListenKey,\n events,\n }),\n wsApi: new WsApi({\n baseUrl: core.endpoints.wsApi,\n apiKey: credentials.apiKey,\n apiSecret: credentials.apiSecret,\n privateKey: credentials.privateKey,\n signatureAlgorithm: credentials.signatureAlgorithm,\n recvWindow: core.transport.recvWindow,\n }),\n };\n}\n\n/** The facade type: USDⓈ-M surface plus the ergonomic cross-product aliases. */\nexport type FuturesNamespace = UsdmSurface & {\n /** Ergonomic alias for the USDⓈ-M surface (same objects as `client.futures`). */\n readonly usdm: FuturesNamespace;\n /** Ergonomic alias for the COIN-M surface (same objects as `client.coinm`). */\n readonly coinm: CoinMSurface;\n};\n","import { z } from 'zod';\n\nexport const CoinMBalanceSchema = z.object({\n accountAlias: z.string(),\n asset: z.string(),\n balance: z.string().transform(Number),\n withdrawAvailable: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n updateTime: z.number(),\n});\nexport type CoinMBalance = z.infer<typeof CoinMBalanceSchema>;\nexport const CoinMBalanceResponseSchema = z.array(CoinMBalanceSchema);\n\nexport const CoinMPositionRiskSchema = z\n .object({\n symbol: z.string(),\n pair: z.string().optional(),\n positionAmt: z.string().transform(Number),\n entryPrice: z.string().transform(Number),\n markPrice: z.string().transform(Number),\n unRealizedProfit: z.string().transform(Number),\n liquidationPrice: z.string().transform(Number),\n leverage: z.string().transform(Number),\n maxQty: z.string().transform(Number).optional(),\n marginType: z.enum(['isolated', 'cross']),\n isolatedMargin: z.string().transform(Number).optional(),\n isAutoAddMargin: z.union([z.string(), z.boolean()]).optional(),\n positionSide: z.string(),\n notionalValue: z.string().transform(Number).optional(),\n breakEvenPrice: z.string().transform(Number).optional(),\n updateTime: z.number().optional(),\n })\n .loose();\nexport type CoinMPositionRisk = z.infer<typeof CoinMPositionRiskSchema>;\nexport const CoinMPositionRiskResponseSchema = z.array(CoinMPositionRiskSchema);\n\nexport const CoinMAccountAssetSchema = z\n .object({\n asset: z.string(),\n walletBalance: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n marginBalance: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n maxWithdrawAmount: z.string().transform(Number),\n crossWalletBalance: z.string().transform(Number),\n crossUnPnl: z.string().transform(Number),\n availableBalance: z.string().transform(Number),\n updateTime: z.number(),\n })\n .loose();\nexport type CoinMAccountAsset = z.infer<typeof CoinMAccountAssetSchema>;\n\nexport const CoinMAccountPositionSchema = z\n .object({\n symbol: z.string(),\n positionAmt: z.string().transform(Number),\n initialMargin: z.string().transform(Number),\n maintMargin: z.string().transform(Number),\n unrealizedProfit: z.string().transform(Number),\n positionInitialMargin: z.string().transform(Number),\n openOrderInitialMargin: z.string().transform(Number),\n leverage: z.string().transform(Number),\n isolated: z.boolean(),\n positionSide: z.string(),\n entryPrice: z.string().transform(Number),\n maxQty: z.string().transform(Number).optional(),\n updateTime: z.number().optional(),\n })\n .loose();\nexport type CoinMAccountPosition = z.infer<typeof CoinMAccountPositionSchema>;\n\nexport const CoinMAccountSchema = z\n .object({\n canDeposit: z.boolean(),\n canTrade: z.boolean(),\n canWithdraw: z.boolean(),\n feeTier: z.number(),\n updateTime: z.number(),\n assets: z.array(CoinMAccountAssetSchema),\n positions: z.array(CoinMAccountPositionSchema),\n })\n .loose();\nexport type CoinMAccountInfo = z.infer<typeof CoinMAccountSchema>;\n\nexport const CoinMOrderSchema = z\n .object({\n orderId: z.number(),\n symbol: z.string(),\n pair: z.string().optional(),\n status: z.string(),\n clientOrderId: z.string(),\n price: z.string().transform(Number),\n avgPrice: z.string().transform(Number),\n origQty: z.string().transform(Number),\n executedQty: z.string().transform(Number),\n cumBase: z.string().transform(Number).optional(),\n type: z.string(),\n reduceOnly: z.boolean(),\n closePosition: z.boolean().optional(),\n side: z.string(),\n positionSide: z.string(),\n stopPrice: z.string().transform(Number).optional(),\n workingType: z.string().optional(),\n priceProtect: z.boolean().optional(),\n origType: z.string().optional(),\n timeInForce: z.string().optional(),\n activatePrice: z.string().transform(Number).optional(),\n priceRate: z.string().transform(Number).optional(),\n time: z.number(),\n updateTime: z.number(),\n })\n .loose();\nexport type CoinMOrder = z.infer<typeof CoinMOrderSchema>;\nexport const CoinMOrderResponseSchema = CoinMOrderSchema;\nexport const CoinMOrdersResponseSchema = z.array(CoinMOrderSchema);\n\nexport const CoinMCreateOrderParamsSchema = z.object({\n symbol: z.string(),\n side: z.enum(['BUY', 'SELL']),\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional(),\n type: z.string(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n quantity: z.union([z.string(), z.number()]).optional(),\n reduceOnly: z.boolean().optional(),\n price: z.union([z.string(), z.number()]).optional(),\n newClientOrderId: z.string().optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n closePosition: z.boolean().optional(),\n activationPrice: z.union([z.string(), z.number()]).optional(),\n callbackRate: z.union([z.string(), z.number()]).optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional(),\n priceProtect: z.boolean().optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT']).optional(),\n});\nexport type CoinMCreateOrderParams = z.infer<typeof CoinMCreateOrderParamsSchema>;\n\nexport const CoinMLeverageChangeSchema = z.object({\n leverage: z.number(),\n maxQty: z.string().transform(Number),\n symbol: z.string(),\n});\nexport type CoinMLeverageChange = z.infer<typeof CoinMLeverageChangeSchema>;\n\nexport const CoinMMarginTypeChangeSchema = z.object({ code: z.number(), msg: z.string() });\nexport type CoinMMarginTypeChange = z.infer<typeof CoinMMarginTypeChangeSchema>;\n\nexport const CoinMPositionMarginChangeSchema = z.object({\n amount: z.number(),\n code: z.number(),\n msg: z.string(),\n type: z.number(),\n});\nexport type CoinMPositionMarginChange = z.infer<typeof CoinMPositionMarginChangeSchema>;\n\nexport const CoinMIncomeSchema = z\n .object({\n symbol: z.string().optional(),\n incomeType: z.string(),\n income: z.string().transform(Number),\n asset: z.string(),\n info: z.string().optional(),\n time: z.number(),\n tranId: z.number(),\n tradeId: z.string().optional(),\n })\n .loose();\nexport type CoinMIncome = z.infer<typeof CoinMIncomeSchema>;\nexport const CoinMIncomeHistoryResponseSchema = z.array(CoinMIncomeSchema);\n\nexport const CoinMUserTradeSchema = z\n .object({\n symbol: z.string(),\n id: z.number(),\n orderId: z.number(),\n pair: z.string().optional(),\n side: z.string(),\n price: z.string().transform(Number),\n qty: z.string().transform(Number),\n realizedPnl: z.string().transform(Number),\n marginAsset: z.string().optional(),\n baseQty: z.string().transform(Number).optional(),\n commission: z.string().transform(Number),\n commissionAsset: z.string(),\n time: z.number(),\n positionSide: z.string(),\n buyer: z.boolean(),\n maker: z.boolean(),\n })\n .loose();\nexport type CoinMUserTrade = z.infer<typeof CoinMUserTradeSchema>;\nexport const CoinMUserTradesResponseSchema = z.array(CoinMUserTradeSchema);\n\nexport const CoinMOpenInterestHistEntrySchema = z.object({\n pair: z.string(),\n contractType: z.string(),\n sumOpenInterest: z.string().transform(Number),\n sumOpenInterestValue: z.string().transform(Number),\n timestamp: z.number(),\n});\nexport type CoinMOpenInterestHistEntry = z.infer<typeof CoinMOpenInterestHistEntrySchema>;\nexport const CoinMOpenInterestHistSchema = z.array(CoinMOpenInterestHistEntrySchema);\n\nexport const CoinMPositionModeSchema = z.object({ dualSidePosition: z.boolean() });\nexport type CoinMPositionMode = z.infer<typeof CoinMPositionModeSchema>;\n\nexport const CoinMLeverageBracketSchema = z.object({\n bracket: z.number(),\n initialLeverage: z.number(),\n qtyCap: z.number(),\n qtyFloor: z.number(),\n maintMarginRatio: z.number(),\n cum: z.number().optional(),\n});\nexport type CoinMLeverageBracket = z.infer<typeof CoinMLeverageBracketSchema>;\nexport const CoinMLeverageBracketResponseSchema = z.array(\n z.object({\n symbol: z.string().optional(),\n pair: z.string().optional(),\n brackets: z.array(CoinMLeverageBracketSchema),\n }),\n);\n\nexport const CoinMCommissionRateSchema = z.object({\n symbol: z.string(),\n makerCommissionRate: z.string().transform(Number),\n takerCommissionRate: z.string().transform(Number),\n});\nexport type CoinMCommissionRate = z.infer<typeof CoinMCommissionRateSchema>;\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n CoinMAccountInfo,\n CoinMAccountSchema,\n CoinMBalance,\n CoinMBalanceResponseSchema,\n CoinMCommissionRate,\n CoinMCommissionRateSchema,\n CoinMIncome,\n CoinMIncomeHistoryResponseSchema,\n CoinMLeverageBracket,\n CoinMLeverageBracketResponseSchema,\n CoinMPositionMode,\n CoinMPositionModeSchema,\n CoinMPositionRisk,\n CoinMPositionRiskResponseSchema,\n CoinMUserTrade,\n CoinMUserTradesResponseSchema,\n} from '../types/coinm.types.js';\n\nexport class CoinMAccount {\n constructor(private readonly http: HttpClient) {}\n\n async balance(): Promise<CoinMBalance[]> {\n return CoinMBalanceResponseSchema.parse(await this.http.get('/dapi/v1/balance', undefined, 'signed'));\n }\n\n async account(): Promise<CoinMAccountInfo> {\n return CoinMAccountSchema.parse(await this.http.get('/dapi/v1/account', undefined, 'signed'));\n }\n\n async positionRisk(options?: { symbol?: string; pair?: string }): Promise<CoinMPositionRisk[]> {\n return CoinMPositionRiskResponseSchema.parse(\n await this.http.get('/dapi/v1/positionRisk', options, 'signed'),\n );\n }\n\n async incomeHistory(options?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<CoinMIncome[]> {\n return CoinMIncomeHistoryResponseSchema.parse(await this.http.get('/dapi/v1/income', options, 'signed'));\n }\n\n async userTrades(options?: {\n symbol?: string;\n pair?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n fromId?: number;\n }): Promise<CoinMUserTrade[]> {\n return CoinMUserTradesResponseSchema.parse(\n await this.http.get('/dapi/v1/userTrades', options, 'signed'),\n );\n }\n\n async leverageBrackets(symbol?: string): Promise<{ symbol?: string; pair?: string; brackets: CoinMLeverageBracket[] }[]> {\n const params = symbol ? { symbol } : undefined;\n return CoinMLeverageBracketResponseSchema.parse(\n await this.http.get('/dapi/v1/leverageBracket', params, 'signed'),\n );\n }\n\n async commissionRate(symbol: string): Promise<CoinMCommissionRate> {\n return CoinMCommissionRateSchema.parse(\n await this.http.get('/dapi/v1/commissionRate', { symbol }, 'signed'),\n );\n }\n\n async positionMode(): Promise<CoinMPositionMode> {\n return CoinMPositionModeSchema.parse(\n await this.http.get('/dapi/v1/positionSide/dual', undefined, 'signed'),\n );\n }\n\n async setPositionMode(dualSidePosition: boolean): Promise<Record<string, unknown>> {\n return this.http.post('/dapi/v1/positionSide/dual', { dualSidePosition }, 'signed');\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { MarketDataBase } from './MarketDataBase.js';\nimport { FundingRateHistorySchema, FundingRate, OpenInterestSchema, OpenInterest, PremiumIndexSchema, PremiumIndex } from '../types/futures.types.js';\nimport { Kline, KlineInterval, KlinesResponseSchema } from '../types/market.types.js';\nimport { CoinMOpenInterestHistEntry, CoinMOpenInterestHistSchema } from '../types/coinm.types.js';\n\nexport class CoinMMarket extends MarketDataBase {\n constructor(http?: HttpClient) {\n super(http ?? new HttpClient({ baseURL: 'https://dapi.binance.com/dapi/v1' }));\n }\n\n async continuousKlines(\n pair: string,\n contractType: 'perpetual' | 'current_quarter' | 'next_quarter',\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/continuousKlines', {\n pair,\n contractType,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async indexPriceKlines(\n pair: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/indexPriceKlines', {\n pair,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async markPriceKlines(\n symbol: string,\n interval: KlineInterval,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<Kline[]> {\n const data = await this.http.get('/markPriceKlines', {\n symbol,\n interval,\n startTime: options?.startTime,\n endTime: options?.endTime,\n limit: options?.limit ?? 500,\n });\n return KlinesResponseSchema.parse(data);\n }\n\n async premiumIndex(options?: { symbol?: string; pair?: string }): Promise<PremiumIndex[] | PremiumIndex> {\n return PremiumIndexSchema.or(PremiumIndexSchema.array()).parse(\n await this.http.get('/premiumIndex', options),\n );\n }\n\n async fundingRateHistory(\n symbol: string,\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<FundingRate[]> {\n return FundingRateHistorySchema.parse(await this.http.get('/fundingRate', { symbol, ...options }));\n }\n\n async openInterest(symbol: string): Promise<OpenInterest> {\n return OpenInterestSchema.parse(await this.http.get('/openInterest', { symbol }));\n }\n\n async openInterestHist(\n pair: string,\n contractType: 'ALL' | 'CURRENT_QUARTER' | 'NEXT_QUARTER' | 'PERPETUAL',\n period: '5m' | '15m' | '30m' | '1h' | '2h' | '4h' | '6h' | '12h' | '1d',\n options?: { startTime?: number; endTime?: number; limit?: number },\n ): Promise<CoinMOpenInterestHistEntry[]> {\n return CoinMOpenInterestHistSchema.parse(\n await this.http.get('/openInterestHist', { pair, contractType, period, ...options }),\n );\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport {\n CoinMCreateOrderParams,\n CoinMLeverageChange,\n CoinMLeverageChangeSchema,\n CoinMMarginTypeChange,\n CoinMMarginTypeChangeSchema,\n CoinMOrder,\n CoinMOrderResponseSchema,\n CoinMOrdersResponseSchema,\n CoinMPositionMarginChange,\n CoinMPositionMarginChangeSchema,\n} from '../types/coinm.types.js';\n\nexport class CoinMTrading {\n constructor(private readonly http: HttpClient) {}\n\n async setLeverage(symbol: string, leverage: number): Promise<CoinMLeverageChange> {\n return CoinMLeverageChangeSchema.parse(\n await this.http.post('/dapi/v1/leverage', { symbol, leverage }, 'signed'),\n );\n }\n\n async setMarginType(symbol: string, marginType: 'ISOLATED' | 'CROSSED'): Promise<CoinMMarginTypeChange> {\n return CoinMMarginTypeChangeSchema.parse(\n await this.http.post('/dapi/v1/marginType', { symbol, marginType }, 'signed'),\n );\n }\n\n async createOrder(params: CoinMCreateOrderParams): Promise<CoinMOrder> {\n return CoinMOrderResponseSchema.parse(await this.http.post('/dapi/v1/order', params, 'signed'));\n }\n\n async createTestOrder(params: CoinMCreateOrderParams): Promise<Record<string, unknown>> {\n return this.http.post('/dapi/v1/order/test', params, 'signed');\n }\n\n async getOrder(symbol: string, options?: { orderId?: number; origClientOrderId?: string }): Promise<CoinMOrder> {\n return CoinMOrderResponseSchema.parse(\n await this.http.get('/dapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelOrder(symbol: string, options?: { orderId?: number; origClientOrderId?: string }): Promise<CoinMOrder> {\n return CoinMOrderResponseSchema.parse(\n await this.http.delete('/dapi/v1/order', { symbol, ...options }, 'signed'),\n );\n }\n\n async cancelAllOpenOrders(symbol: string): Promise<Record<string, unknown>> {\n return this.http.delete('/dapi/v1/allOpenOrders', { symbol }, 'signed');\n }\n\n async getOpenOrders(symbol?: string): Promise<CoinMOrder[]> {\n const params = symbol ? { symbol } : undefined;\n return CoinMOrdersResponseSchema.parse(await this.http.get('/dapi/v1/openOrders', params, 'signed'));\n }\n\n async getAllOrders(\n symbol: string,\n options?: { orderId?: number; startTime?: number; endTime?: number; limit?: number },\n ): Promise<CoinMOrder[]> {\n return CoinMOrdersResponseSchema.parse(\n await this.http.get('/dapi/v1/allOrders', { symbol, ...options }, 'signed'),\n );\n }\n\n async modifyPositionMargin(symbol: string, amount: number, type: number): Promise<CoinMPositionMarginChange> {\n return CoinMPositionMarginChangeSchema.parse(\n await this.http.post('/dapi/v1/positionMargin', { symbol, amount, type }, 'signed'),\n );\n }\n}\n","import { HttpClient } from '../client/HttpClient.js';\nimport { ListenKey, ListenKeySchema } from '../types/userdata.types.js';\n\nexport class CoinMUserDataStream {\n constructor(private readonly http: HttpClient) {}\n\n async createListenKey(): Promise<ListenKey> {\n return ListenKeySchema.parse(await this.http.post('/dapi/v1/listenKey', undefined, 'apiKey'));\n }\n\n async keepAliveListenKey(): Promise<Record<string, unknown>> {\n return this.http.put('/dapi/v1/listenKey', undefined, 'apiKey');\n }\n\n async closeListenKey(): Promise<Record<string, unknown>> {\n return this.http.delete('/dapi/v1/listenKey', undefined, 'apiKey');\n }\n}\n","import type { WsConnectionOptions, WsConnectionState } from './WsConnection.js';\nimport { WsConnection } from './WsConnection.js';\nimport {\n parseUserDataEvent,\n type UserDataEvent,\n} from '../types/userdata.types.js';\n\nexport { type WsConnectionState };\n\nexport interface CoinMUserWSOptions extends Omit<WsConnectionOptions, 'buildUrl'> {\n baseUserUrl: string;\n getListenKey: () => string | null;\n}\n\n/**\n * COIN-M user data events (ACCOUNT_UPDATE, ORDER_TRADE_UPDATE, MARGIN_CALL) share the same\n * event shape as USD-M's, so the USD-M parser/types are reused as-is.\n *\n * Refactored onto {@link WsConnection}: race-free reconnection, explicit\n * lifecycle states, and proactive rotation before Binance's 24h stream limit.\n */\nexport class CoinMUserWS extends WsConnection {\n private readonly getListenKey: () => string | null;\n\n constructor(options: CoinMUserWSOptions) {\n const { baseUserUrl, getListenKey, ...connectionOptions } = options;\n super({\n ...connectionOptions,\n name: connectionOptions.name ?? 'coinmUser',\n buildUrl: () => {\n const listenKey = getListenKey();\n return listenKey ? `${baseUserUrl}/${listenKey}` : null;\n },\n });\n this.getListenKey = getListenKey;\n }\n\n /**\n * Start (or restart) the user-data stream. Emits the historical `error`\n * event when no listenKey is available yet, matching the legacy contract.\n */\n override connect(): void {\n if (!this.getListenKey()) {\n this.emit('error', new Error('No COIN-M listenKey available for user data stream'));\n return;\n }\n super.connect();\n }\n\n protected override handleRawMessage(text: string): void {\n const parsed = this.parseFrame(text);\n if (parsed === undefined) return;\n try {\n const event: UserDataEvent = parseUserDataEvent(parsed);\n this.emit(event.e, event);\n this.emit('userData', event);\n } catch (err) {\n this.emit('error', err);\n }\n }\n}\n","import type { CoreContext } from '../../core/context.js';\nimport { CoinMAccount } from '../../resources/CoinMAccount.js';\nimport { CoinMMarket } from '../../resources/CoinMMarket.js';\nimport { CoinMTrading } from '../../resources/CoinMTrading.js';\nimport { CoinMUserDataStream } from '../../resources/CoinMUserDataStream.js';\nimport { CoinMMarketWS } from '../../ws/CoinMMarketWS.js';\nimport { CoinMUserWS } from '../../ws/CoinMUserWS.js';\n\n/**\n * The raw COIN-M product surface — no cross-product aliases. Exposed\n * directly as `client.coinm`, aliased from `client.futures.coinm`, and\n * wrapped by the standalone v3 COIN-M client.\n */\nexport interface CoinMSurface {\n market: CoinMMarket;\n account: CoinMAccount;\n trading: CoinMTrading;\n userStream: CoinMUserDataStream;\n ws: CoinMMarketWS;\n wsUser: CoinMUserWS;\n}\n\n/** Shared COIN-M wiring (single construction path, same as USDⓈ-M). */\nexport function buildCoinmSurface(core: CoreContext, getListenKey: () => string | null): CoinMSurface {\n return {\n market: new CoinMMarket(core.http('dapi')),\n account: new CoinMAccount(core.http('dapiRoot')),\n trading: new CoinMTrading(core.http('dapiRoot')),\n userStream: new CoinMUserDataStream(core.http('dapiRoot')),\n ws: new CoinMMarketWS(core.endpoints.wsDapiMarket, { events: core.events }),\n wsUser: new CoinMUserWS({\n baseUserUrl: core.endpoints.wsDapiUser,\n getListenKey,\n events: core.events,\n }),\n };\n}\n","import { BinanceApiError } from '../errors/index.js';\nimport type { PaperTradingEngine } from '../paper/PaperTradingEngine.js';\nimport type { CreateOrderParams } from '../types/trading.types.js';\nimport type { ExecutionAdapter, ExecutionReportShape, OrderKey, OrderShape, UserStreamLike } from './adapter.js';\nimport { isExecutionAdapter } from './adapter.js';\n\n/**\n * Paper execution backend: routes orders through the local\n * {@link PaperTradingEngine} simulator instead of the exchange, behind the\n * exact same {@link ExecutionAdapter} interface the live products use.\n *\n * The point is *identical semantics*: `placeOrder` returns the same\n * `Execution` envelope, `reconcile()` runs the same matrix, fetches of\n * unknown orders fail with the same `-2013` Binance error the exchange would\n * return, and fills stream in as execution reports just like a user-data\n * stream would deliver them. Code written against the paper backend can be\n * switched to live by changing one configuration value.\n *\n * The simulator fills instantly (per its execution model), so:\n * - `createOrder` resolves with the fill already booked;\n * - `fetchOrder` replays the stored record (reconciliation succeeds);\n * - `cancelOrder` mirrors the exchange's `-2011` for orders no longer on\n * the book, which the ExecutionManager reconciles into a terminal\n * CANCELED execution — the same path live takes.\n */\nexport class PaperExecutionAdapter implements ExecutionAdapter {\n readonly product = 'paper';\n /** clientOrderId → raw order record, the simulator's \"matching engine\" view. */\n private readonly orders = new Map<string, Record<string, unknown>>();\n /**\n * Report listeners. Paper backends routinely have several consumers — the\n * execution manager's ledger *and* (v3) the platform's paper session that\n * translates fills into user-stream frames — so `onReport` fans out to\n * every registered listener instead of replacing the previous one.\n */\n private readonly reportHandlers = new Set<(report: ExecutionReportShape) => void>();\n\n constructor(\n private readonly engine: PaperTradingEngine,\n private readonly options: { commissionAsset?: string } = {},\n ) {}\n\n /** The underlying simulator (account, positions, order history). */\n get simulator(): PaperTradingEngine {\n return this.engine;\n }\n\n async createOrder(submission: CreateOrderParams): Promise<Record<string, unknown>> {\n const clientOrderId = submission.newClientOrderId;\n if (!clientOrderId) {\n throw new BinanceApiError(\n 'Paper execution requires newClientOrderId (the reconciliation key)',\n -1102,\n 400,\n {},\n );\n }\n const type = String(submission.type ?? 'MARKET').toUpperCase();\n if (type !== 'MARKET' && type !== 'LIMIT') {\n throw new BinanceApiError(\n `Paper execution supports MARKET and LIMIT orders (got ${type})`,\n -1116,\n 400,\n {},\n );\n }\n const quantity = Number(submission.quantity);\n if (!Number.isFinite(quantity) || quantity <= 0) {\n throw new BinanceApiError('Quantity must be a positive number', -1013, 400, {});\n }\n const price = submission.price !== undefined ? Number(submission.price) : undefined;\n if (type === 'LIMIT' && (!Number.isFinite(price) || (price ?? 0) <= 0)) {\n throw new BinanceApiError('Limit orders require a positive price', -1013, 400, {});\n }\n\n let paperOrder;\n try {\n paperOrder = await this.engine.placeOrder({\n symbol: String(submission.symbol),\n side: String(submission.side).toUpperCase() as 'BUY' | 'SELL',\n type: type as 'MARKET' | 'LIMIT',\n quantity,\n price,\n });\n } catch (err) {\n // Rejections (insufficient balance, model rejection) surface as exchange\n // rejections so the manager records them identically.\n throw new BinanceApiError((err as Error).message, -2019, 400, {});\n }\n\n const filledQty = paperOrder.filledQuantity;\n const avgPrice = paperOrder.avgFillPrice;\n const cumQuote = filledQty * avgPrice;\n const raw: Record<string, unknown> = {\n orderId: paperOrder.orderId,\n clientOrderId,\n symbol: paperOrder.symbol,\n side: submission.side,\n type,\n status: paperOrder.status,\n executedQty: String(filledQty),\n cumQuote: String(cumQuote),\n avgPrice: String(avgPrice),\n updateTime: paperOrder.createdAt,\n fills: [\n {\n price: String(avgPrice),\n qty: String(filledQty),\n commission:\n paperOrder.commission !== undefined ? String(paperOrder.commission) : undefined,\n commissionAsset: paperOrder.commission !== undefined ? this.options.commissionAsset ?? 'USDT' : undefined,\n },\n ],\n paper: true,\n };\n this.orders.set(clientOrderId, raw);\n\n // Deliver the fill as an execution report — the same shape a live\n // user-data stream would emit, so streaming consumers see fills without\n // knowing which backend produced them. Every registered listener sees it.\n // The order context fields (symbol/side/type/qty) let the v3 paper session\n // translate the report into a faithful user-stream frame.\n const report: ExecutionReportShape = {\n clientOrderId,\n orderId: paperOrder.orderId,\n status: paperOrder.status,\n lastPrice: String(avgPrice),\n lastQty: String(filledQty),\n commission: paperOrder.commission !== undefined ? String(paperOrder.commission) : '0',\n commissionAsset: this.options.commissionAsset ?? 'USDT',\n executedQty: String(filledQty),\n cumQuote: String(cumQuote),\n avgPrice: String(avgPrice),\n symbol: paperOrder.symbol,\n side: String(submission.side).toUpperCase(),\n orderType: type,\n originalQty: String(quantity),\n };\n for (const handler of this.reportHandlers) handler(report);\n\n return raw;\n }\n\n async fetchOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>> {\n const id = key.origClientOrderId ?? '';\n const raw = this.orders.get(id);\n if (!raw || String(raw.symbol) !== symbol.toUpperCase()) {\n // Identical to the exchange: -2013 order does not exist.\n throw new BinanceApiError('Order does not exist', -2013, 400, {});\n }\n return { ...raw };\n }\n\n /**\n * Every order record the simulator holds, client-order-id keyed — the\n * authoritative \"REST view\" a paper-mode reconciliation pass folds into the\n * v3 platform's order tracker (live reconciliation reads `/openOrders`).\n */\n listOrderRecords(): Record<string, unknown>[] {\n return [...this.orders.values()].map((raw) => ({ ...raw }));\n }\n\n async cancelOrder(symbol: string, key: OrderKey): Promise<Record<string, unknown>> {\n const id = key.origClientOrderId ?? '';\n const raw = this.orders.get(id);\n if (!raw || String(raw.symbol) !== symbol.toUpperCase()) {\n throw new BinanceApiError('Unknown order sent', -2011, 400, {});\n }\n // Simulator fills instantly: the order is never resting on a book, so a\n // cancel mirrors the exchange's -2011 for already-terminal orders.\n throw new BinanceApiError('Unknown order sent', -2011, 400, {});\n }\n\n toOrderShape(raw: Record<string, unknown>): OrderShape {\n return {\n orderId: raw.orderId !== undefined ? Number(raw.orderId) : undefined,\n clientOrderId: String(raw.clientOrderId ?? ''),\n symbol: String(raw.symbol ?? ''),\n side: String(raw.side ?? ''),\n type: String(raw.type ?? ''),\n status: String(raw.status ?? ''),\n executedQty: String(raw.executedQty ?? '0'),\n cumQuote: String(raw.cumQuote ?? '0'),\n avgPrice: String(raw.avgPrice ?? '0'),\n updateTime: raw.updateTime !== undefined ? Number(raw.updateTime) : Date.now(),\n fills: Array.isArray(raw.fills)\n ? (raw.fills as Array<Record<string, unknown>>).map((fill) => ({\n price: String(fill.price ?? '0'),\n quantity: String(fill.qty ?? '0'),\n commission: fill.commission !== undefined ? String(fill.commission) : undefined,\n commissionAsset:\n fill.commissionAsset !== undefined ? String(fill.commissionAsset) : undefined,\n }))\n : [],\n };\n }\n\n /** Paper has no user-data stream; attach is a no-op. */\n setUserStream(_ws: UserStreamLike | null): void {\n /* no user stream in the simulator */\n }\n\n /** Register a report listener; every listener fires for every fill (additive). */\n onReport(handler: (report: ExecutionReportShape) => void): void {\n this.reportHandlers.add(handler);\n }\n}\n\n// Re-exported so callers importing from the paper module get the guard too.\nexport { isExecutionAdapter };\n","/**\n * Pluggable paper-execution semantics.\n *\n * The legacy PaperTradingEngine filled every order instantly at the live mark\n * with zero fees — optimistic to the point of misleading: any strategy\n * validated against it overstates fills, ignores slippage on size, and never\n * sees taker fees. These models let the engine approximate reality in layers:\n *\n * InstantFillModel — legacy behaviour (default)\n * SlippageModel — fills walk through liquidity at a fixed bps penalty\n * PartialFillModel — random/varying fill ratios with remainder resting\n * OrderBookModel — VWAP fills against real local-book liquidity\n * LatencyModel — delays fills by a fixed/jittered window\n * CompositeModel — chains any of the above\n *\n * Fee accounting is separate (FeeModel) so it composes with any execution model.\n */\n\nexport interface ExecutionContext {\n symbol: string;\n side: 'BUY' | 'SELL';\n type: 'MARKET' | 'LIMIT';\n /** Requested quantity (base units). */\n quantity: number;\n /** Limit price for LIMIT orders. */\n limitPrice?: number;\n /** Current mark/last price observed at submission. */\n marketPrice: number;\n}\n\nexport interface ExecutionQuote {\n /** Effective per-unit fill price. */\n fillPrice: number;\n /** Quantity actually filled in this event (≤ requested). */\n filledQuantity: number;\n status: 'FILLED' | 'PARTIALLY_FILLED' | 'REJECTED';\n reason?: string;\n}\n\nexport interface ExecutionModel {\n quote(ctx: ExecutionContext): ExecutionQuote | Promise<ExecutionQuote>;\n}\n\n/** Legacy semantics: everything fills, instantly, at the mark (or limit). */\nexport class InstantFillModel implements ExecutionModel {\n quote(ctx: ExecutionContext): ExecutionQuote {\n const fillPrice = ctx.type === 'MARKET' ? ctx.marketPrice : (ctx.limitPrice as number);\n return { fillPrice, filledQuantity: ctx.quantity, status: 'FILLED' };\n }\n}\n\n/**\n * Market-impact approximation: fills execute `bps` worse than the reference\n * price (BUY pays up, SELL hits down). 10 bps = 0.1%.\n */\nexport class SlippageModel implements ExecutionModel {\n constructor(private readonly bps: number, private readonly inner: ExecutionModel = new InstantFillModel()) {}\n\n async quote(ctx: ExecutionContext): Promise<ExecutionQuote> {\n const base = await this.inner.quote(ctx);\n const slipFactor = 1 + (ctx.side === 'BUY' ? 1 : -1) * (this.bps / 10_000);\n return { ...base, fillPrice: base.fillPrice * slipFactor };\n }\n}\n\n/**\n * Partial fills: each order fills `ratio(ctx)` of its quantity; the unfilled\n * remainder is reported as PARTIALLY_FILLED (callers decide to re-submit).\n * `ratio` defaults to uniform random in [0.6, 1.0].\n */\nexport class PartialFillModel implements ExecutionModel {\n constructor(\n private readonly ratio: (ctx: ExecutionContext) => number = () => 0.6 + Math.random() * 0.4,\n private readonly inner: ExecutionModel = new InstantFillModel(),\n ) {}\n\n async quote(ctx: ExecutionContext): Promise<ExecutionQuote> {\n const base = await this.inner.quote(ctx);\n const ratio = Math.min(1, Math.max(0, this.ratio(ctx)));\n const filledQuantity = base.filledQuantity * ratio;\n return {\n ...base,\n filledQuantity,\n status: filledQuantity >= ctx.quantity ? 'FILLED' : 'PARTIALLY_FILLED',\n reason: filledQuantity < ctx.quantity ? 'liquidity exhausted at fill price' : undefined,\n };\n }\n}\n\n/** Book snapshot the OrderBookModel consumes (e.g. from state/OrderBook). */\nexport interface BookView {\n bids: Array<{ price: string | number; quantity: string | number }>;\n asks: Array<{ price: string | number; quantity: string | number }>;\n}\n\n/**\n * Fills walk real book liquidity: a BUY consumes ask levels (cheapest first)\n * until the quantity is satisfied; the fill price is the size-weighted VWAP\n * of consumed levels. Books are injected so the model works offline (replay,\n * tests) or against the live local OrderBook.\n */\nexport class OrderBookModel implements ExecutionModel {\n constructor(private readonly getBook: (symbol: string) => BookView | null) {}\n\n quote(ctx: ExecutionContext): ExecutionQuote {\n const book = this.getBook(ctx.symbol);\n if (!book || !book.asks.length || !book.bids.length) {\n return {\n fillPrice: ctx.type === 'MARKET' ? ctx.marketPrice : (ctx.limitPrice as number),\n filledQuantity: ctx.quantity,\n status: 'FILLED',\n reason: 'no book available; fell back to mark fill',\n };\n }\n\n const levels =\n ctx.side === 'BUY'\n ? book.asks.map((l) => ({ price: Number(l.price), quantity: Number(l.quantity) })).sort((a, b) => a.price - b.price)\n : book.bids.map((l) => ({ price: Number(l.price), quantity: Number(l.quantity) })).sort((a, b) => b.price - a.price);\n\n let remaining = ctx.quantity;\n let notional = 0;\n let filled = 0;\n for (const level of levels) {\n if (remaining <= 0) break;\n const take = Math.min(remaining, level.quantity);\n notional += take * level.price;\n filled += take;\n remaining -= take;\n }\n\n if (filled === 0) {\n return { fillPrice: ctx.marketPrice, filledQuantity: 0, status: 'REJECTED', reason: 'empty book side' };\n }\n\n const vwapPrice = notional / filled;\n // LIMIT orders never fill through their limit price.\n if (ctx.type === 'LIMIT' && ctx.limitPrice !== undefined) {\n const crosses =\n ctx.side === 'BUY' ? vwapPrice <= ctx.limitPrice : vwapPrice >= ctx.limitPrice;\n if (!crosses) {\n return {\n fillPrice: ctx.limitPrice,\n filledQuantity: 0,\n status: 'REJECTED',\n reason: 'book does not cross limit price',\n };\n }\n }\n\n return {\n fillPrice: vwapPrice,\n filledQuantity: filled,\n status: filled >= ctx.quantity ? 'FILLED' : 'PARTIALLY_FILLED',\n reason: filled < ctx.quantity ? 'book liquidity exhausted' : undefined,\n };\n }\n}\n\n/** Delays quotes by `delayMs(ctx)` — models round-trip/latency risk. */\nexport class LatencyModel implements ExecutionModel {\n constructor(\n private readonly delayMs: (ctx: ExecutionContext) => number = () => 250,\n private readonly inner: ExecutionModel = new InstantFillModel(),\n ) {}\n\n async quote(ctx: ExecutionContext): Promise<ExecutionQuote> {\n await new Promise((resolve) => setTimeout(resolve, Math.max(0, this.delayMs(ctx))));\n return this.inner.quote(ctx);\n }\n}\n\n/**\n * Compose models as a sequential pipeline (e.g. Slippage → PartialFill): each\n * stage sees the previous stage's fill price as its reference price, so a\n * partial fill quotes against the slipped price, not the raw mark. The\n * filled quantity can only shrink as it flows downstream.\n */\nexport class CompositeModel implements ExecutionModel {\n constructor(private readonly models: ExecutionModel[]) {}\n\n async quote(ctx: ExecutionContext): Promise<ExecutionQuote> {\n let current: ExecutionQuote = {\n fillPrice: ctx.type === 'MARKET' ? ctx.marketPrice : (ctx.limitPrice as number),\n filledQuantity: ctx.quantity,\n status: 'FILLED',\n };\n for (const model of this.models) {\n const stageCtx: ExecutionContext = {\n ...ctx,\n marketPrice: current.fillPrice,\n limitPrice: ctx.limitPrice ?? current.fillPrice,\n };\n const stage = await model.quote(stageCtx);\n current = {\n ...stage,\n filledQuantity: Math.min(stage.filledQuantity, ctx.quantity),\n };\n }\n return current;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Fees\n// ---------------------------------------------------------------------------\n\nexport interface FeeQuote {\n /** Commission in quote currency (USDⓈ-M convention). */\n commission: number;\n /** Applies at the taker or maker rate. */\n tier: 'taker' | 'maker';\n}\n\nexport interface FeeModel {\n compute(quote: ExecutionQuote, ctx: ExecutionContext): FeeQuote;\n}\n\n/**\n * Flat bps fee schedule. MARKET orders are takers; LIMIT fills are treated as\n * makers. Binance's regular USDⓈ-M taker/maker default is 5 bps / 2 bps\n * (0.05% / 0.02%) — pass your own schedule to match your VIP tier or BNB\n * discount.\n */\nexport class TakerMakerFeeModel implements FeeModel {\n constructor(\n private readonly takerBps: number,\n private readonly makerBps: number,\n ) {}\n\n compute(quote: ExecutionQuote, ctx: ExecutionContext): FeeQuote {\n const tier: 'taker' | 'maker' = ctx.type === 'MARKET' ? 'taker' : 'maker';\n const bps = tier === 'taker' ? this.takerBps : this.makerBps;\n return { commission: quote.fillPrice * quote.filledQuantity * (bps / 10_000), tier };\n }\n}\n\n/** Binance regular-tier defaults: 5 bps taker / 2 bps maker. */\nexport class BinanceUsdmFeeModel extends TakerMakerFeeModel {\n constructor(takerBps = 5, makerBps = 2) {\n super(takerBps, makerBps);\n }\n}\n","import { FuturesMarket } from '../resources/FuturesMarket.js';\nimport {\n InstantFillModel,\n type ExecutionContext,\n type ExecutionModel,\n type ExecutionQuote,\n type FeeModel,\n} from './models.js';\n\nexport type PaperPositionSide = 'LONG' | 'SHORT' | 'NONE';\n\nexport interface PaperPosition {\n symbol: string;\n side: PaperPositionSide;\n entryPrice: number;\n quantity: number;\n leverage: number;\n /** Margin currently allocated to this position, released proportionally as it is reduced. */\n margin: number;\n unrealizedPnl: number;\n openedAt: number;\n}\n\nexport interface PaperOrder {\n orderId: number;\n symbol: string;\n side: 'BUY' | 'SELL';\n type: 'MARKET' | 'LIMIT';\n quantity: number;\n price: number;\n status: 'FILLED' | 'PARTIALLY_FILLED';\n filledQuantity: number;\n avgFillPrice: number;\n /** Realized PnL booked by this order, if it reduced or closed a position. */\n realizedPnl: number;\n /** Commission charged by the configured FeeModel (quote currency). */\n commission?: number;\n createdAt: number;\n}\n\nexport interface PaperAccount {\n /** Wallet balance: starts at initialBalance and moves only with realized PnL. */\n balance: number;\n /** Wallet balance minus margin currently locked in open positions. */\n availableBalance: number;\n /** balance + unrealized PnL. */\n totalWalletBalance: number;\n realizedPnl: number;\n unrealizedPnl: number;\n positions: Record<string, PaperPosition>;\n orders: PaperOrder[];\n}\n\nexport interface PaperTradingOptions {\n initialBalance?: number;\n /** Injectable so tests and offline callers can supply their own price source. */\n market?: FuturesMarket;\n /**\n * Fill semantics (slippage, partial fills, book walking, latency).\n * Defaults to the legacy instant-fill behaviour.\n */\n executionModel?: ExecutionModel;\n /** Fee schedule; defaults to zero fees (legacy behaviour). */\n feeModel?: FeeModel;\n}\n\nfunction emptyPosition(symbol: string): PaperPosition {\n return {\n symbol,\n side: 'NONE',\n entryPrice: 0,\n quantity: 0,\n leverage: 1,\n margin: 0,\n unrealizedPnl: 0,\n openedAt: 0,\n };\n}\n\n/**\n * In-memory simulator for USD-M futures fills. Prices come from the live public\n * market endpoints; nothing is ever sent to the exchange.\n *\n * Accounting model: `balance` moves only on realized PnL. Opening a position locks\n * `notional / leverage` of margin out of `availableBalance`; reducing it releases\n * that margin pro-rata and books the realized PnL. Fill semantics default to\n * instant fills at the current mark (MARKET) or limit price (LIMIT); configure\n * `executionModel`/`feeModel` for slippage, partial fills, book walking, latency\n * and commission — see `paper/models.ts`.\n */\nexport class PaperTradingEngine {\n private readonly account: PaperAccount;\n private readonly market: FuturesMarket;\n private readonly executionModel: ExecutionModel;\n private readonly feeModel?: FeeModel;\n private orderIdCounter = 1_000_000;\n\n constructor(options: PaperTradingOptions = {}) {\n this.market = options.market ?? new FuturesMarket();\n this.executionModel = options.executionModel ?? new InstantFillModel();\n this.feeModel = options.feeModel;\n const initialBalance = options.initialBalance ?? 10_000;\n this.account = {\n balance: initialBalance,\n availableBalance: initialBalance,\n totalWalletBalance: initialBalance,\n realizedPnl: 0,\n unrealizedPnl: 0,\n positions: {},\n orders: [],\n };\n }\n\n /** Current mark price for any tradeable symbol. */\n async getMarketPrice(symbol: string): Promise<number> {\n // `price` is already numeric — TickerPriceSchema transforms it on parse.\n return (await this.market.tickerPrice(symbol.toUpperCase())).price;\n }\n\n private positionFor(symbol: string): PaperPosition {\n const existing = this.account.positions[symbol];\n if (existing) return existing;\n const created = emptyPosition(symbol);\n this.account.positions[symbol] = created;\n return created;\n }\n\n async placeOrder(params: {\n symbol: string;\n side: 'BUY' | 'SELL';\n type: 'MARKET' | 'LIMIT';\n quantity: number;\n price?: number;\n leverage?: number;\n }): Promise<PaperOrder> {\n const symbol = params.symbol.toUpperCase();\n const { side, type, quantity } = params;\n const leverage = params.leverage ?? 1;\n\n if (!(quantity > 0)) throw new Error('Quantity must be positive');\n if (leverage < 1 || leverage > 125) throw new Error('Leverage must be 1-125');\n if (type === 'LIMIT' && !(params.price! > 0)) throw new Error('Price required for LIMIT orders');\n\n const marketPrice = await this.getMarketPrice(symbol);\n const context: ExecutionContext = {\n symbol,\n side,\n type,\n quantity,\n limitPrice: type === 'LIMIT' ? params.price : undefined,\n marketPrice,\n };\n const quote: ExecutionQuote = await this.executionModel.quote(context);\n if (quote.status === 'REJECTED') {\n throw new Error(`Order rejected by execution model: ${quote.reason ?? 'no fill'}`);\n }\n const filledQuantity = quote.filledQuantity;\n if (!(filledQuantity > 0)) throw new Error('Execution model produced zero fill quantity');\n const fillPrice = quote.fillPrice;\n\n const position = this.positionFor(symbol);\n const opposing =\n (side === 'SELL' && position.side === 'LONG') || (side === 'BUY' && position.side === 'SHORT');\n\n // Only the quantity that opens or extends exposure consumes new margin.\n const openingQty = opposing ? Math.max(0, filledQuantity - position.quantity) : filledQuantity;\n const requiredMargin = (openingQty * fillPrice) / leverage;\n if (requiredMargin > this.account.availableBalance + 1e-9) {\n throw new Error(\n `Insufficient balance. Required: ${requiredMargin.toFixed(2)}, ` +\n `Available: ${this.account.availableBalance.toFixed(2)}`,\n );\n }\n\n let realizedPnl = this.applyFill(position, side, filledQuantity, fillPrice, leverage);\n let commission = 0;\n if (this.feeModel) {\n commission = this.feeModel.compute(quote, context).commission;\n this.account.balance -= commission;\n this.account.realizedPnl -= commission;\n realizedPnl -= commission;\n }\n this.markToMarket(symbol, marketPrice);\n this.recomputeTotals();\n\n const order: PaperOrder = {\n orderId: ++this.orderIdCounter,\n symbol,\n side,\n type,\n quantity,\n price: fillPrice,\n status: quote.status === 'FILLED' ? 'FILLED' : 'PARTIALLY_FILLED',\n filledQuantity,\n avgFillPrice: fillPrice,\n realizedPnl,\n commission: commission > 0 ? commission : undefined,\n createdAt: Date.now(),\n };\n this.account.orders.push(order);\n return order;\n }\n\n /**\n * Apply a fill to a position, returning the realized PnL it booked.\n * Handles extend, partial reduce, full close, and a flip through zero.\n */\n private applyFill(\n position: PaperPosition,\n side: 'BUY' | 'SELL',\n quantity: number,\n fillPrice: number,\n leverage: number,\n ): number {\n const incoming: PaperPositionSide = side === 'BUY' ? 'LONG' : 'SHORT';\n\n if (position.side === 'NONE' || position.quantity === 0) {\n this.openExposure(position, incoming, quantity, fillPrice, leverage);\n return 0;\n }\n\n if (position.side === incoming) {\n this.openExposure(position, incoming, quantity, fillPrice, leverage);\n return 0;\n }\n\n // Opposing fill: reduce first, then flip any remainder onto the other side.\n const closeQty = Math.min(quantity, position.quantity);\n const realized = this.reduceExposure(position, closeQty, fillPrice);\n const remainder = quantity - closeQty;\n if (remainder > 0) this.openExposure(position, incoming, remainder, fillPrice, leverage);\n return realized;\n }\n\n private openExposure(\n position: PaperPosition,\n side: PaperPositionSide,\n quantity: number,\n fillPrice: number,\n leverage: number,\n ): void {\n const previousQty = position.quantity;\n const totalQty = previousQty + quantity;\n position.entryPrice =\n totalQty > 0 ? (position.entryPrice * previousQty + fillPrice * quantity) / totalQty : fillPrice;\n position.quantity = totalQty;\n position.side = side;\n position.leverage = leverage;\n if (previousQty === 0) position.openedAt = Date.now();\n\n const margin = (quantity * fillPrice) / leverage;\n position.margin += margin;\n this.account.availableBalance -= margin;\n }\n\n /** Reduce a position, releasing margin pro-rata and booking realized PnL. */\n private reduceExposure(position: PaperPosition, closeQty: number, fillPrice: number): number {\n const direction = position.side === 'LONG' ? 1 : -1;\n const realized = (fillPrice - position.entryPrice) * closeQty * direction;\n\n const releasedMargin = position.quantity > 0 ? position.margin * (closeQty / position.quantity) : 0;\n position.margin -= releasedMargin;\n position.quantity -= closeQty;\n\n this.account.balance += realized;\n this.account.realizedPnl += realized;\n this.account.availableBalance += releasedMargin + realized;\n\n if (position.quantity <= 1e-12) {\n position.quantity = 0;\n position.side = 'NONE';\n position.entryPrice = 0;\n position.unrealizedPnl = 0;\n // Guard against float drift leaving a sliver of margin locked forever.\n this.account.availableBalance += position.margin;\n position.margin = 0;\n }\n return realized;\n }\n\n private markToMarket(symbol: string, price: number): void {\n const position = this.account.positions[symbol];\n if (!position || position.side === 'NONE' || position.quantity === 0) {\n if (position) position.unrealizedPnl = 0;\n return;\n }\n const direction = position.side === 'LONG' ? 1 : -1;\n position.unrealizedPnl = (price - position.entryPrice) * position.quantity * direction;\n }\n\n private recomputeTotals(): void {\n this.account.unrealizedPnl = Object.values(this.account.positions).reduce(\n (sum, p) => sum + p.unrealizedPnl,\n 0,\n );\n this.account.totalWalletBalance = this.account.balance + this.account.unrealizedPnl;\n }\n\n /** Refresh unrealized PnL for every open position against live prices. */\n async updatePositions(): Promise<void> {\n const open = Object.values(this.account.positions).filter((p) => p.side !== 'NONE');\n await Promise.all(\n open.map(async (position) => {\n try {\n this.markToMarket(position.symbol, await this.getMarketPrice(position.symbol));\n } catch {\n // Leave the last known mark in place if the price feed is unavailable.\n }\n }),\n );\n this.recomputeTotals();\n }\n\n getAccountInfo(): PaperAccount {\n return {\n ...this.account,\n positions: this.getAllPositions(),\n orders: [...this.account.orders],\n };\n }\n\n getPosition(symbol: string): PaperPosition | undefined {\n const position = this.account.positions[symbol.toUpperCase()];\n return position ? { ...position } : undefined;\n }\n\n getAllPositions(): Record<string, PaperPosition> {\n return Object.fromEntries(\n Object.entries(this.account.positions).map(([symbol, p]) => [symbol, { ...p }]),\n );\n }\n\n /** Open positions only — the zero-size entries left behind by closed trades are filtered out. */\n getOpenPositions(): PaperPosition[] {\n return Object.values(this.account.positions)\n .filter((p) => p.side !== 'NONE')\n .map((p) => ({ ...p }));\n }\n\n getOrderHistory(symbol?: string): PaperOrder[] {\n const orders = symbol\n ? this.account.orders.filter((o) => o.symbol === symbol.toUpperCase())\n : this.account.orders;\n return [...orders];\n }\n}\n","import type { Execution, ReconciliationState } from './types.js';\nimport type { ExecutionBackend } from './Gateway.js';\n\n/**\n * The action an audit record describes. Every state transition in the\n * execution gateway emits exactly one record — placements, cancellations,\n * reconciliations, and terminal-state updates from the user-data stream.\n */\nexport type AuditAction =\n | 'place'\n | 'cancel'\n | 'reconcile'\n | 'update'\n | 'reject'\n | 'unknown';\n\n/**\n * Outcome of the action, normalized from {@link ReconciliationState} plus\n * a 'pending' state for in-flight calls and 'transport-error' for\n * ambiguous network failures the gateway swallowed.\n */\nexport type AuditOutcome =\n | 'acked'\n | 'reconciled'\n | 'rejected'\n | 'unknown'\n | 'pending'\n | 'transport-error';\n\n/**\n * One immutable audit record. Serializes cleanly to JSON\n * (`ts` is epoch ms, every decimal stays an exact string).\n *\n * Records are append-only: an audit sink never mutates or deletes a\n * record. A live order that fills incrementally produces a sequence of\n * records with the same `intentId` / `clientOrderId`, each describing the\n * state transition that happened.\n */\nexport interface AuditRecord {\n /** Epoch ms when the audited action completed (or was attempted). */\n readonly ts: number;\n /** What happened. */\n readonly action: AuditAction;\n /** Normalized outcome. */\n readonly outcome: AuditOutcome;\n /** Which backend the action ran against. */\n readonly backend: ExecutionBackend;\n /** Caller-supplied idempotency key. */\n readonly intentId: string;\n /** The newClientOrderId the exchange saw. */\n readonly clientOrderId: string;\n /** Exchange-assigned id once known. */\n readonly exchangeOrderId?: number;\n readonly symbol: string;\n readonly side: string;\n readonly type: string;\n /** Order status as reported by the exchange / simulator. */\n readonly status: string;\n /** Exact decimal string, or null when the order is quote-sized only. */\n readonly requestedQuantity: string | null;\n readonly requestedPrice: string | null;\n /** Exact decimal string of executed quantity at the time of the record. */\n readonly executedQuantity: string;\n readonly cumulativeQuoteQuantity: string;\n readonly averagePrice: string | null;\n readonly reconciliationState: ReconciliationState;\n /**\n * Optional human-readable note — e.g. why a reconciliation was forced,\n * why a transport error was swallowed, why the order was resubmitted.\n */\n readonly note?: string;\n}\n\n/**\n * Append-only audit sink for execution actions.\n *\n * The gateway calls {@link AuditSink.record} for every placeOrder /\n * cancelOrder / reconcile / live-update transition. Implementations\n * decide where the records land: in-memory ring buffer (default,\n * inspectable from tests), a writable stream, an S3-style object store,\n * a SIEM collector, etc.\n *\n * The contract is deliberately tiny: implementations MUST be safe to\n * call from the synchronous post-action path of the gateway (i.e. the\n * record call itself may not throw — a failing audit sink must not\n * break trading).\n */\nexport interface AuditSink {\n /** Append a record. Must not throw; on failure, implementations log and swallow. */\n record(record: AuditRecord): void;\n /**\n * Optional: iterate over retained records (in order). In-memory\n * implementations support this; sinks that stream to external stores\n * may return an empty iterator.\n */\n records?(): Iterable<AuditRecord>;\n /** Optional: clear retained records (mainly for tests). */\n clear?(): void;\n}\n\n/** Build a normalized audit record from an execution envelope. */\nexport function auditRecordFromExecution(\n execution: Execution,\n action: AuditAction,\n outcome: AuditOutcome,\n backend: ExecutionBackend,\n note?: string,\n): AuditRecord {\n return {\n ts: execution.updatedAt,\n action,\n outcome,\n backend,\n intentId: execution.intentId,\n clientOrderId: execution.clientOrderId,\n exchangeOrderId: execution.exchangeOrderId,\n symbol: execution.symbol,\n side: execution.side,\n type: execution.type,\n status: execution.status,\n requestedQuantity: execution.requestedQuantity,\n requestedPrice: execution.requestedPrice,\n executedQuantity: execution.executedQuantity,\n cumulativeQuoteQuantity: execution.cumulativeQuoteQuantity,\n averagePrice: execution.averagePrice,\n reconciliationState: execution.reconciliationState,\n note,\n };\n}\n\n/**\n * Default in-memory audit sink: a capped ring buffer (default 10_000\n * records) that never blocks the caller and never throws. Useful for\n * inspection in tests and for short-running CLI sessions; production\n * deployments that need durable audit should swap in a stream-backed\n * sink via {@link ExecutionGatewayOptions.audit}.\n */\nexport class InMemoryAuditSink implements AuditSink {\n private readonly buffer: AuditRecord[] = [];\n private readonly capacity: number;\n\n constructor(capacity = 10_000) {\n this.capacity = capacity;\n }\n\n record(record: AuditRecord): void {\n try {\n this.buffer.push(record);\n if (this.buffer.length > this.capacity) {\n this.buffer.shift();\n }\n } catch {\n // Audit must never break trading. Swallow.\n }\n }\n\n records(): Iterable<AuditRecord> {\n return this.buffer.slice();\n }\n\n clear(): void {\n this.buffer.length = 0;\n }\n\n /** Number of retained records. Safe to call from the trading path. */\n get size(): number {\n try {\n return this.buffer.length;\n } catch {\n return 0;\n }\n }\n}\n\n/**\n * Audit sink that fans out to one or more child sinks — e.g. the\n * in-memory ring buffer for inspection AND a stream sink for durable\n * persistence. Children are called in registration order; a throwing\n * child does not stop later children (the failing child is skipped on\n * that record).\n */\nexport class FanOutAuditSink implements AuditSink {\n private readonly children: AuditSink[];\n\n constructor(children: AuditSink[]) {\n this.children = children;\n }\n\n record(record: AuditRecord): void {\n for (const child of this.children) {\n try {\n child.record(record);\n } catch {\n // Skip a failing child; audit must not break trading.\n }\n }\n }\n\n records(): Iterable<AuditRecord> {\n // Merge in registration order; de-dup by ts+intentId+action+outcome.\n const seen = new Set<string>();\n const merged: AuditRecord[] = [];\n for (const child of this.children) {\n if (!child.records) continue;\n for (const r of child.records()) {\n const key = `${r.ts}|${r.intentId}|${r.action}|${r.outcome}`;\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(r);\n }\n }\n return merged;\n }\n\n clear(): void {\n for (const child of this.children) {\n try {\n child.clear?.();\n } catch {\n // Best-effort.\n }\n }\n }\n}\n\n/**\n * Stream-backed audit sink: writes one JSON line per record to a\n * Node.js WritableStream. Buffering and backpressure follow the\n * stream's own semantics. Errors on the stream are logged and\n * swallowed (a closed stream does not break trading).\n *\n * Mainly used as the durable leg of a {@link FanOutAuditSink}:\n *\n * ```ts\n * import { createWriteStream } from 'node:fs';\n * const file = createWriteStream('audit.ndjson', { flags: 'a' });\n * const sink = new FanOutAuditSink([\n * new InMemoryAuditSink(),\n * new StreamAuditSink(file),\n * ]);\n * const gateway = client.createExecutionGateway({ audit: sink });\n * ```\n */\nexport class StreamAuditSink implements AuditSink {\n private readonly stream: NodeJS.WritableStream;\n private readonly serializer: (record: AuditRecord) => string;\n\n constructor(\n stream: NodeJS.WritableStream,\n serializer: (record: AuditRecord) => string = (r) => JSON.stringify(r),\n ) {\n this.stream = stream;\n this.serializer = serializer;\n }\n\n record(record: AuditRecord): void {\n try {\n const line = `${this.serializer(record)}\\n`;\n const w = this.stream as { write?(chunk: string): boolean };\n if (typeof w.write === 'function') {\n w.write(line);\n }\n } catch {\n // Swallow — see contract.\n }\n }\n}\n","import { PaperTradingEngine } from '../paper/PaperTradingEngine.js';\nimport { ExecutionManager } from './ExecutionManager.js';\nimport { PaperExecutionAdapter } from './paper.js';\nimport type { Execution } from './types.js';\nimport {\n InMemoryAuditSink,\n auditRecordFromExecution,\n type AuditAction,\n type AuditOutcome,\n type AuditRecord,\n type AuditSink,\n} from './AuditSink.js';\n\n/** Where an order routed through the gateway executes. */\nexport type ExecutionBackend = 'live' | 'paper';\n\nexport interface ExecutionGatewayOptions {\n /** The live (exchange-backed) execution manager. */\n live: ExecutionManager;\n /**\n * Paper simulator engine the paper backend routes through. When omitted a\n * fresh engine (10,000 quote balance, instant fills) is created.\n */\n paperEngine?: PaperTradingEngine;\n /** Backend used when a call does not specify one. Default 'live'. */\n defaultBackend?: ExecutionBackend;\n /**\n * Append-only audit sink for execution actions (M6). When omitted, an\n * {@link InMemoryAuditSink} (10_000-record ring buffer) is constructed\n * for inspection via {@link ExecutionGateway.audit}. A throwing sink is\n * never allowed to break trading — the gateway swallows record failures.\n */\n audit?: AuditSink;\n}\n\nexport interface PlaceOrderOptions {\n backend?: ExecutionBackend;\n}\n\n/**\n * Routes orders to the live exchange or the paper simulator behind one\n * interface, so strategy code never branches on backend:\n *\n * ```ts\n * const gateway = client.createExecutionGateway({ defaultBackend: 'paper' });\n * await gateway.placeOrder({ symbol: 'BTCUSDT', side: 'BUY', type: 'MARKET', quantity: 0.01 });\n * await gateway.placeOrder({ ...order }, { backend: 'live' }); // one live order\n * gateway.paperEngine.getAccountInfo(); // inspect the simulation\n * ```\n *\n * Both backends return the identical {@link Execution} envelope and maintain\n * independent ledgers; `listExecutions('paper')` never mixes with live orders.\n */\nexport class ExecutionGateway {\n readonly live: ExecutionManager;\n readonly paper: ExecutionManager;\n private readonly paperAdapter: PaperExecutionAdapter;\n private readonly defaultBackend: ExecutionBackend;\n private readonly auditSink: AuditSink;\n\n constructor(options: ExecutionGatewayOptions) {\n this.live = options.live;\n const engine = options.paperEngine ?? new PaperTradingEngine();\n this.paperAdapter = new PaperExecutionAdapter(engine);\n this.paper = new ExecutionManager(this.paperAdapter, {\n clientOrderIdPrefix: 'paper',\n });\n this.defaultBackend = options.defaultBackend ?? 'live';\n this.auditSink = options.audit ?? new InMemoryAuditSink();\n }\n\n /** The paper simulator engine (account, positions, order history). */\n get paperEngine(): PaperTradingEngine {\n return this.paperAdapter.simulator;\n }\n\n /** Backend used when a call does not specify one. */\n get backend(): ExecutionBackend {\n return this.defaultBackend;\n }\n\n /**\n * The audit sink this gateway writes execution records to. M6: every\n * placeOrder / cancelOrder / reconcile emits exactly one record, plus\n * one per transport-error swallow (recovered via reconciliation).\n */\n get audit(): AuditSink {\n return this.auditSink;\n }\n\n private resolve(backend?: ExecutionBackend): ExecutionManager {\n return (backend ?? this.defaultBackend) === 'paper' ? this.paper : this.live;\n }\n\n /** Idempotent order placement on the chosen backend. */\n async placeOrder(\n params: Parameters<ExecutionManager['placeOrder']>[0],\n options: PlaceOrderOptions = {},\n ): Promise<Execution> {\n const backend = options.backend ?? this.defaultBackend;\n try {\n const execution = await this.resolve(backend).placeOrder(params);\n this.recordAudit(execution, 'place', mapOutcome(execution.reconciliationState), backend);\n return execution;\n } catch (err) {\n // The manager either recorded a REJECTED execution in its ledger, or\n // threw ExecutionUnknownError carrying the in-flight execution.\n const execution = extractExecutionFromError(err) ?? syntheticExecution(params, options, 'place');\n this.recordAudit(\n execution,\n 'place',\n err instanceof Error && err.name === 'ExecutionUnknownError' ? 'unknown' : 'transport-error',\n backend,\n err instanceof Error ? err.message : String(err),\n );\n throw err;\n }\n }\n\n /** Idempotent cancel on the chosen backend. */\n async cancelOrder(\n symbol: string,\n options: Parameters<ExecutionManager['cancelOrder']>[1] & PlaceOrderOptions = {},\n ): Promise<Execution> {\n const { backend, ...cancelOptions } = options;\n const resolvedBackend = backend ?? this.defaultBackend;\n try {\n const execution = await this.resolve(resolvedBackend).cancelOrder(symbol, cancelOptions);\n this.recordAudit(\n execution,\n 'cancel',\n mapOutcome(execution.reconciliationState),\n resolvedBackend,\n );\n return execution;\n } catch (err) {\n const execution = syntheticCancel(symbol, options);\n this.recordAudit(\n execution,\n 'cancel',\n err instanceof Error && err.name === 'ExecutionUnknownError' ? 'unknown' : 'transport-error',\n resolvedBackend,\n err instanceof Error ? err.message : String(err),\n );\n throw err;\n }\n }\n\n /** Force a reconciliation pass for an intent on a backend. */\n async reconcile(intentId: string, backend?: ExecutionBackend): Promise<Execution> {\n const resolvedBackend = backend ?? this.defaultBackend;\n try {\n const execution = await this.resolve(resolvedBackend).reconcile(intentId);\n this.recordAudit(execution, 'reconcile', 'reconciled', resolvedBackend);\n return execution;\n } catch (err) {\n const execution = this.getExecution(intentId, resolvedBackend) ?? syntheticReconcile(intentId);\n this.recordAudit(\n execution,\n 'reconcile',\n 'unknown',\n resolvedBackend,\n err instanceof Error ? err.message : String(err),\n );\n throw err;\n }\n }\n\n private recordAudit(\n execution: Execution,\n action: AuditAction,\n outcome: AuditOutcome,\n backend: ExecutionBackend,\n note?: string,\n ): void {\n let record: AuditRecord;\n try {\n record = auditRecordFromExecution(execution, action, outcome, backend, note);\n } catch {\n // Building the record itself failed — never break trading.\n return;\n }\n try {\n this.auditSink.record(record);\n } catch {\n // A failing audit sink must not break trading. Swallow.\n }\n }\n\n getExecution(intentId: string, backend?: ExecutionBackend): Execution | undefined {\n return this.resolve(backend).getExecution(intentId);\n }\n\n listExecutions(backend?: ExecutionBackend): Execution[] {\n return this.resolve(backend).listExecutions();\n }\n\n /** Scoped view of one backend, for callers that prefer a direct manager. */\n use(backend: ExecutionBackend): ExecutionManager {\n return this.resolve(backend);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Audit helpers\n// ---------------------------------------------------------------------------\n\nfunction mapOutcome(state: Execution['reconciliationState']): AuditOutcome {\n switch (state) {\n case 'acked':\n return 'acked';\n case 'reconciled':\n return 'reconciled';\n case 'rejected':\n return 'rejected';\n case 'unknown':\n return 'unknown';\n }\n}\n\n/**\n * Extract an Execution envelope from an error thrown by ExecutionManager\n * — ExecutionUnknownError carries the in-flight shape. Used to give the\n * audit record a real intentId/clientOrderId/symbol even on the failure\n * path.\n */\nfunction extractExecutionFromError(err: unknown): Execution | undefined {\n if (!(err instanceof Error)) return undefined;\n const exec = (err as { execution?: Execution }).execution;\n return exec;\n}\n\n/** Build a minimal Execution envelope from the placeOrder params. */\nfunction syntheticExecution(\n params: Parameters<ExecutionManager['placeOrder']>[0],\n _options: PlaceOrderOptions,\n _action: AuditAction,\n): Execution {\n const now = Date.now();\n return {\n intentId: params.intentId ?? '',\n clientOrderId: params.newClientOrderId ?? '',\n symbol: params.symbol,\n side: params.side,\n type: params.type,\n status: 'UNKNOWN',\n requestedQuantity: params.quantity !== undefined ? String(params.quantity) : null,\n requestedPrice: params.price !== undefined ? String(params.price) : null,\n executedQuantity: '0',\n cumulativeQuoteQuantity: '0',\n averagePrice: null,\n fills: [],\n reconciliationState: 'unknown',\n submittedAt: now,\n updatedAt: now,\n raw: {},\n };\n}\n\nfunction syntheticCancel(\n symbol: string,\n options: Parameters<ExecutionManager['cancelOrder']>[1] & PlaceOrderOptions,\n): Execution {\n const now = Date.now();\n return {\n intentId: options.intentId ?? '',\n clientOrderId: options.origClientOrderId ?? '',\n symbol,\n side: '',\n type: 'CANCEL',\n status: 'UNKNOWN',\n requestedQuantity: null,\n requestedPrice: null,\n executedQuantity: '0',\n cumulativeQuoteQuantity: '0',\n averagePrice: null,\n fills: [],\n reconciliationState: 'unknown',\n submittedAt: now,\n updatedAt: now,\n raw: {},\n };\n}\n\nfunction syntheticReconcile(intentId: string): Execution {\n const now = Date.now();\n return {\n intentId,\n clientOrderId: '',\n symbol: '',\n side: '',\n type: '',\n status: 'UNKNOWN',\n requestedQuantity: null,\n requestedPrice: null,\n executedQuantity: '0',\n cumulativeQuoteQuantity: '0',\n averagePrice: null,\n fills: [],\n reconciliationState: 'unknown',\n submittedAt: now,\n updatedAt: now,\n raw: {},\n };\n}\n","import { Decimal, type DecimalInput } from '../core/decimal.js';\n\n/**\n * Local L2 order-book state: REST snapshot + diff-depth stream → live book.\n *\n * The legacy SDK streamed `@depth` updates but threw them away — callers who\n * needed book state had to poll REST. This engine maintains the canonical\n * algorithm locally:\n *\n * 1. subscribe to `<symbol>@depth@100ms|500ms`\n * 2. fetch a REST depth snapshot\n * 3. apply every diff whose event ids bracket the snapshot's `lastUpdateId`\n * 4. detect gaps (via `pu` / sequence discontinuities) and demand a resync\n *\n * All arithmetic (spread, microprice, imbalance, VWAP) runs on exact decimals.\n */\n\n/** Raw Binance level tuple: [price, quantity]. */\nexport type RawLevel = readonly [string, string] | { price: DecimalInput; qty: DecimalInput };\n\nexport interface BookSnapshotInput {\n lastUpdateId: number;\n bids: readonly RawLevel[];\n asks: readonly RawLevel[];\n}\n\nexport interface DiffInput {\n /** First update id in this event. */\n U: number;\n /** Final update id in this event (inclusive). */\n u: number;\n /** Previous final update id (Binance futures). */\n pu?: number;\n bids: readonly RawLevel[];\n asks: readonly RawLevel[];\n}\n\nexport interface BookLevel {\n price: string;\n quantity: string;\n}\n\nexport interface OrderBookMetrics {\n bestBid: string | null;\n bestAsk: string | null;\n midPrice: string | null;\n /** ask − bid (null when the book is one-sided). */\n spread: string | null;\n /** Spread in basis points of mid. */\n spreadBps: number | null;\n microprice: string | null;\n /** Total bid/ask quantity within `depthPct` of mid (quote-agnostic, base units). */\n bidDepth: string;\n askDepth: string;\n /**\n * Order-flow imbalance proxy: (bidDepth − askDepth) / (bidDepth + askDepth)\n * within the measurement window; −1..1.\n */\n imbalance: number | null;\n levelCount: { bids: number; asks: number };\n lastUpdateId: number | null;\n synced: boolean;\n}\n\ninterface InternalLevel {\n price: Decimal;\n quantity: Decimal;\n}\n\nfunction toLevel(raw: RawLevel): { price: Decimal; quantity: Decimal } {\n if ('price' in raw) {\n return { price: Decimal.from(raw.price), quantity: Decimal.from(raw.qty) };\n }\n return { price: Decimal.from(raw[0]), quantity: Decimal.from(raw[1]) };\n}\n\n/**\n * One symbol's live book. Levels are kept sorted (bids descending, asks\n * ascending) with binary-search insertion so queries stay O(log n) per level.\n */\nexport class OrderBook {\n private bids: InternalLevel[] = [];\n private asks: InternalLevel[] = [];\n private lastUpdateId: number | null = null;\n private synced = false;\n /** Set when a gap is detected; cleared by the next snapshot. */\n private desynced = false;\n\n constructor(readonly symbol: string) {}\n\n get isSynced(): boolean {\n return this.synced && !this.desynced;\n }\n\n getLastUpdateId(): number | null {\n return this.lastUpdateId;\n }\n\n applySnapshot(snapshot: BookSnapshotInput): void {\n this.bids = snapshot.bids\n .map(toLevel)\n .filter((level) => level.quantity.isPositive())\n .sort((a, b) => b.price.cmp(a.price));\n this.asks = snapshot.asks\n .map(toLevel)\n .filter((level) => level.quantity.isPositive())\n .sort((a, b) => a.price.cmp(b.price));\n this.lastUpdateId = snapshot.lastUpdateId;\n this.desynced = false;\n this.synced = true;\n }\n\n /**\n * Apply a diff event. Returns `false` when a sequence gap was detected —\n * the caller must fetch a fresh snapshot (the diff is dropped either way).\n */\n applyDiff(diff: DiffInput): boolean {\n if (!this.synced) return false;\n\n // Futures: pu must equal our previous final update id.\n if (diff.pu !== undefined && this.lastUpdateId !== null && diff.pu !== this.lastUpdateId) {\n this.desynced = true;\n return false;\n }\n // Entirely stale event.\n if (this.lastUpdateId !== null && diff.u <= this.lastUpdateId) return true;\n // Gap: we missed at least one diff since the snapshot/last event.\n if (this.lastUpdateId !== null && diff.U > this.lastUpdateId + 1) {\n this.desynced = true;\n return false;\n }\n\n this.applySide(this.bids, diff.bids, /* descending= */ true);\n this.applySide(this.asks, diff.asks, /* descending= */ false);\n this.lastUpdateId = diff.u;\n return true;\n }\n\n private applySide(levels: InternalLevel[], updates: readonly RawLevel[], descending: boolean): void {\n for (const raw of updates) {\n const { price, quantity } = toLevel(raw);\n const index = findIndex(levels, price, descending);\n if (quantity.isZero()) {\n if (index >= 0) levels.splice(index, 1);\n continue;\n }\n if (index >= 0) {\n levels[index] = { price, quantity };\n } else {\n const insertionPoint = ~index;\n levels.splice(insertionPoint, 0, { price, quantity });\n }\n }\n }\n\n bestBid(): BookLevel | null {\n return this.bids.length\n ? { price: this.bids[0].price.toString(), quantity: this.bids[0].quantity.toString() }\n : null;\n }\n\n bestAsk(): BookLevel | null {\n return this.asks.length\n ? { price: this.asks[0].price.toString(), quantity: this.asks[0].quantity.toString() }\n : null;\n }\n\n midPrice(): string | null {\n const bid = this.bestBid();\n const ask = this.bestAsk();\n if (!bid || !ask) return null;\n return Decimal.from(bid.price).add(ask.price).div(2).toString();\n }\n\n /** Size-weighted fair price — leans toward the side with more resting size. */\n microprice(): string | null {\n const bid = this.bestBid();\n const ask = this.bestAsk();\n if (!bid || !ask) return null;\n const bidQty = Decimal.from(bid.quantity);\n const askQty = Decimal.from(ask.quantity);\n const total = bidQty.add(askQty);\n if (total.isZero()) return this.midPrice();\n const bidPrice = Decimal.from(bid.price);\n const askPrice = Decimal.from(ask.price);\n return bidPrice.mul(askQty).add(askPrice.mul(bidQty)).div(total).toString();\n }\n\n getBids(limit = 20): BookLevel[] {\n return this.bids\n .slice(0, limit)\n .map((level) => ({ price: level.price.toString(), quantity: level.quantity.toString() }));\n }\n\n getAsks(limit = 20): BookLevel[] {\n return this.asks\n .slice(0, limit)\n .map((level) => ({ price: level.price.toString(), quantity: level.quantity.toString() }));\n }\n\n /** Cumulative quantity on one side within `withinPct` percent of mid. */\n depthWithinPct(side: 'bids' | 'asks', withinPct: number): string {\n const mid = this.midPrice();\n if (mid === null) return '0';\n const levels = side === 'bids' ? this.bids : this.asks;\n const threshold = Decimal.from(mid).mul(1 - withinPct / 100);\n let total = Decimal.ZERO;\n for (const level of levels) {\n const inRange =\n side === 'bids' ? level.price.gte(threshold) : level.price.lte(Decimal.from(mid).mul(1 + withinPct / 100));\n if (!inRange) break;\n total = total.add(level.quantity);\n }\n return total.toString();\n }\n\n /** VWAP of the top `levels` resting orders on one side (size-weighted). */\n vwap(side: 'bids' | 'asks', levels = 5): string | null {\n const book = side === 'bids' ? this.bids.slice(0, levels) : this.asks.slice(0, levels);\n if (!book.length) return null;\n let notional = Decimal.ZERO;\n let qty = Decimal.ZERO;\n for (const level of book) {\n notional = notional.add(level.price.mul(level.quantity));\n qty = qty.add(level.quantity);\n }\n if (qty.isZero()) return null;\n return notional.div(qty).toString();\n }\n\n /** Composite snapshot of derived analytics. */\n metrics(depthPct = 0.5): OrderBookMetrics {\n const bid = this.bestBid();\n const ask = this.bestAsk();\n const mid = this.midPrice();\n const spread =\n bid && ask ? Decimal.from(ask.price).sub(bid.price).toString() : null;\n const spreadBps =\n spread !== null && mid !== null && Decimal.from(mid).isPositive()\n ? (Decimal.from(spread).div(mid).toNumber() * 10_000)\n : null;\n const bidDepth = this.depthWithinPct('bids', depthPct);\n const askDepth = this.depthWithinPct('asks', depthPct);\n const bidDepthD = Decimal.from(bidDepth);\n const askDepthD = Decimal.from(askDepth);\n const totalDepth = bidDepthD.add(askDepthD);\n const imbalance = totalDepth.isZero()\n ? null\n : bidDepthD.sub(askDepthD).div(totalDepth).toNumber();\n return {\n bestBid: bid?.price ?? null,\n bestAsk: ask?.price ?? null,\n midPrice: mid,\n spread,\n spreadBps,\n microprice: this.microprice(),\n bidDepth,\n askDepth,\n imbalance,\n levelCount: { bids: this.bids.length, asks: this.asks.length },\n lastUpdateId: this.lastUpdateId,\n synced: this.isSynced,\n };\n }\n}\n\n/**\n * Binary search on a sorted side. Returns the index of an exact price match,\n * or the bitwise-complement of the insertion point.\n */\nfunction findIndex(\n levels: readonly InternalLevel[],\n price: Decimal,\n descending: boolean,\n): number {\n let low = 0;\n let high = levels.length - 1;\n while (low <= high) {\n const mid = (low + high) >> 1;\n const comparison = levels[mid].price.cmp(price);\n const adjusted = descending ? -comparison : comparison;\n if (adjusted === 0) return mid;\n if (adjusted < 0) low = mid + 1;\n else high = mid - 1;\n }\n return ~low;\n}\n","import type { EventBus } from '../core/events.js';\nimport type { BaseWS } from '../ws/BaseWS.js';\nimport { OrderBook, type BookSnapshotInput, type OrderBookMetrics, type RawLevel } from './OrderBook.js';\n\nexport interface OrderBookEngineOptions {\n /** Market websocket whose combined stream carries the depth diffs. */\n ws: BaseWS;\n /**\n * Fetch a REST depth snapshot for a symbol. Return raw string levels when\n * possible (exactness); numeric pairs are accepted too.\n */\n fetchSnapshot: (symbol: string) => Promise<BookSnapshotInput>;\n /** Diff update speed: `@depth@100ms` (default) or `@depth@500ms`. */\n updateSpeed?: '100ms' | '500ms';\n /** Observability events under the `orderBook` scope. */\n events?: EventBus;\n /** Backoff between resync attempts after a desync. Default 1000ms. */\n resyncDelayMs?: number;\n}\n\ninterface RawDepthFrame {\n stream?: string;\n data?: {\n e?: string;\n E?: number;\n s?: string;\n U?: number;\n u?: number;\n pu?: number;\n b?: unknown;\n a?: unknown;\n };\n}\n\nconst DIFF_EVENT = 'depthUpdate';\n\n/**\n * Multi-symbol local book manager: subscribes to diff streams, seeds books\n * from REST snapshots, applies diffs in order, and self-heals desyncs.\n *\n * Canonical usage:\n *\n * ```ts\n * const engine = client.futures.createOrderBookEngine();\n * await engine.subscribe('BTCUSDT');\n * engine.metrics('BTCUSDT'); // best bid/ask, spread, imbalance, microprice…\n * ```\n */\nexport class OrderBookEngine {\n private readonly books = new Map<string, OrderBook>();\n private readonly resyncing = new Set<string>();\n private readonly ws: BaseWS;\n private readonly fetchSnapshot: (symbol: string) => Promise<BookSnapshotInput>;\n private readonly updateSpeed: '100ms' | '500ms';\n private readonly events?: EventBus;\n private readonly resyncDelayMs: number;\n private readonly messageHandler: (stream: string, payload: unknown) => void;\n\n constructor(options: OrderBookEngineOptions) {\n this.ws = options.ws;\n this.fetchSnapshot = options.fetchSnapshot;\n this.updateSpeed = options.updateSpeed ?? '100ms';\n this.events = options.events;\n this.resyncDelayMs = options.resyncDelayMs ?? 1000;\n\n this.messageHandler = (stream, payload) => this.onStreamMessage(stream, payload);\n this.ws.on('message', this.messageHandler);\n }\n\n /**\n * Start maintaining a local book for `symbol`. Returns once the snapshot is\n * seeded and the diff stream is live.\n */\n async subscribe(symbol: string): Promise<OrderBook> {\n const upper = symbol.toUpperCase();\n if (!this.books.has(upper)) {\n this.books.set(upper, new OrderBook(upper));\n }\n await this.ws.subscribe([`${upper.toLowerCase()}@depth@${this.updateSpeed}`]);\n if (!this.books.get(upper)?.isSynced) {\n await this.resync(upper);\n }\n return this.books.get(upper) as OrderBook;\n }\n\n async unsubscribe(symbol: string): Promise<void> {\n const upper = symbol.toUpperCase();\n this.books.delete(upper);\n await this.ws.unsubscribe([`${upper.toLowerCase()}@depth@${this.updateSpeed}`]);\n }\n\n getBook(symbol: string): OrderBook | undefined {\n return this.books.get(symbol.toUpperCase());\n }\n\n metrics(symbol: string, depthPct?: number): OrderBookMetrics | undefined {\n return this.getBook(symbol)?.metrics(depthPct);\n }\n\n symbols(): string[] {\n return [...this.books.keys()];\n }\n\n /** Detach from the websocket (does not close it). */\n destroy(): void {\n this.ws.off('message', this.messageHandler);\n this.books.clear();\n }\n\n // ---------------------------------------------------------------------------\n\n private onStreamMessage(stream: string, payload: unknown): void {\n if (!stream.includes('@depth')) return;\n const frame = payload as RawDepthFrame['data'];\n if (!frame || frame.e !== DIFF_EVENT) return;\n const symbol = (frame.s ?? stream.split('@')[0]).toUpperCase();\n const book = this.books.get(symbol);\n if (!book) return;\n\n const diff = {\n U: frame.U as number,\n u: frame.u as number,\n pu: frame.pu,\n bids: (frame.b ?? []) as readonly RawLevel[],\n asks: (frame.a ?? []) as readonly RawLevel[],\n };\n\n const applied = book.applyDiff(diff);\n if (!applied) {\n this.emitEvent('orderBook.desync', { symbol, lastUpdateId: book.getLastUpdateId() });\n void this.scheduleResync(symbol);\n }\n }\n\n private async scheduleResync(symbol: string): Promise<void> {\n if (this.resyncing.has(symbol)) return;\n this.resyncing.add(symbol);\n try {\n await new Promise((resolve) => setTimeout(resolve, this.resyncDelayMs));\n await this.resync(symbol);\n } finally {\n this.resyncing.delete(symbol);\n }\n }\n\n private async resync(symbol: string): Promise<void> {\n const book = this.books.get(symbol);\n if (!book) return;\n try {\n const snapshot = await this.fetchSnapshot(symbol);\n book.applySnapshot(snapshot);\n this.emitEvent('orderBook.synced', {\n symbol,\n lastUpdateId: snapshot.lastUpdateId,\n bids: snapshot.bids.length,\n asks: snapshot.asks.length,\n });\n } catch (err) {\n this.emitEvent('orderBook.sync.failed', {\n symbol,\n message: (err as Error).message,\n });\n }\n }\n\n private emitEvent(name: string, payload: Record<string, unknown>): void {\n if (!this.events) return;\n this.events.scoped('orderBook').emit(name, payload);\n }\n}\n","import type { AxiosRequestConfig } from 'axios';\nimport { HttpClient, type SignatureAlgorithm } from './HttpClient.js';\nimport type { RateLimitUsage } from './RateLimitTracker.js';\nimport { TradingPolicy, type TradingPolicyOptions } from './TradingPolicy.js';\nimport { RiskGateway, type RiskGatewayOptions } from '../risk/RiskGateway.js';\nimport { EventBus } from '../core/events.js';\nimport { CoreContext } from '../core/context.js';\nimport type { WsPlatform, WsPlatformOptions } from '../ws/platform/WsPlatform.js';\nimport { resolveEnvironment } from './endpoints.js';\nimport { MarginAccount, MarginTrading } from '../resources/Margin.js';\nimport { Wallet } from '../resources/Wallet.js';\nimport { SubAccount } from '../resources/SubAccount.js';\nimport { buildSpotSurface, type SpotSurface } from '../products/spot/surface.js';\nimport {\n buildUsdmSurface,\n type FuturesNamespace,\n type UsdmSurface,\n} from '../products/usdm/namespace.js';\nimport { buildCoinmSurface, type CoinMSurface } from '../products/coinm/surface.js';\nimport { ExecutionManager } from '../execution/ExecutionManager.js';\nimport { PaperExecutionAdapter } from '../execution/paper.js';\nimport { ExecutionGateway, type ExecutionBackend } from '../execution/Gateway.js';\nimport type { AuditSink } from '../execution/AuditSink.js';\nimport { PaperTradingEngine, type PaperTradingOptions } from '../paper/PaperTradingEngine.js';\n\nimport { OrderBookEngine } from '../state/OrderBookEngine.js';\nimport type { OrderBook } from '../state/OrderBook.js';\n\nexport interface BinanceClientOptions {\n apiKey?: string;\n apiSecret?: string;\n /** PEM-encoded Ed25519 or RSA private key. When set, requests are signed with it instead of HMAC. */\n privateKey?: string | Buffer;\n /** Defaults to 'ED25519' when privateKey is set, otherwise 'HMAC'. */\n signatureAlgorithm?: SignatureAlgorithm;\n testnet?: boolean;\n demo?: boolean;\n recvWindow?: number;\n apiBase?: string;\n wsBase?: string;\n wsUserBase?: string;\n wsApiBase?: string;\n dapiBase?: string;\n wsSpotApiBase?: string;\n wsDapiBase?: string;\n timeoutMs?: number;\n maxRetries?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitTokensPerSecond?: number;\n /** @deprecated unused; superseded by header-based tracking (rateLimitWeightPerMinute/rateLimitSafetyMargin). */\n rateLimitMaxTokens?: number;\n /** Assumed per-minute IP weight ceiling used to preempt -1003 bans. Binance's default is 6000 for most REST hosts. */\n rateLimitWeightPerMinute?: number;\n /** Fraction of rateLimitWeightPerMinute at which requests are delayed until the next minute window. Set >=1 to disable. */\n rateLimitSafetyMargin?: number;\n retryBaseDelayMs?: number;\n retryMaxDelayMs?: number;\n /** Custom keep-alive/https agent, e.g. for corporate proxies or connection pooling. */\n httpsAgent?: AxiosRequestConfig['httpsAgent'];\n /** Axios proxy configuration. */\n proxy?: AxiosRequestConfig['proxy'];\n /**\n * Client-side guardrails for autonomous/LLM-driven callers: dry run, read-only, symbol\n * allowlist, per-order notional cap, leverage/exposure/daily-loss limits, circuit breaker,\n * withdrawal and transfer switches. Omit for no policy (all requests permitted).\n * Opting in denies withdrawals unless explicitly allowed.\n *\n * Superset of the v2.0 `TradingPolicyOptions` — a full {@link RiskGateway} is\n * constructed, and it is also fed by `futures.execution`.\n */\n safety?: RiskGatewayOptions;\n /**\n * Bring your own observability bus; when omitted a fresh internal one is\n * created and exposed as `client.events`.\n */\n events?: EventBus;\n /**\n * v3 WebSocket platform tuning: per-family connection caps, renewal and\n * heartbeat windows, reconnect policy. The platform itself is lazily built\n * on first `client.ws` access.\n */\n wsPlatform?: WsPlatformOptions;\n}\n\nexport interface MarginNamespace {\n account: MarginAccount;\n trading: MarginTrading;\n}\n\nexport class BinanceClient {\n /**\n * v3 shared runtime: one transport pool, one credential set, one\n * observability bus, one policy chain. Every product namespace below is\n * lazily constructed from this context and cached — identity is stable\n * (`client.futures.execution === client.futures.execution`), and a\n * namespace is never built until first accessed.\n */\n readonly core: CoreContext;\n\n get spot(): SpotSurface {\n return this.cached('spot', () => buildSpotSurface(this.core, () => this.spotListenKeyValue));\n }\n\n get futures(): FuturesNamespace {\n return this.cached('futures', () =>\n this.attachAliases(\n buildUsdmSurface(this.core, () => this.listenKeyValue),\n ),\n );\n }\n\n get coinm(): CoinMSurface {\n return this.cached('coinm', () =>\n buildCoinmSurface(this.core, () => this.coinmListenKeyValue),\n );\n }\n\n get margin(): MarginNamespace {\n return this.cached('margin', () => ({\n account: new MarginAccount(this.core.http('apiRoot')),\n trading: new MarginTrading(this.core.http('apiRoot')),\n }));\n }\n\n get wallet(): Wallet {\n return this.cached('wallet', () => new Wallet(this.core.http('apiRoot')));\n }\n\n get subaccount(): SubAccount {\n return this.cached('subaccount', () => new SubAccount(this.core.http('apiRoot')));\n }\n\n /**\n * The v3 WebSocket platform: pooled connections per product family with\n * refcounted `Subscription` objects, central liveness/renewal, and\n * persistent multiplexed WS API clients — all sharing the core's\n * credentials and observability bus.\n *\n * ```ts\n * const sub = await client.ws.usdm.subscribe('btcusdt@aggTrade');\n * sub.on('message', (tick) => console.log(tick.p));\n * await client.ws.api.usdm.accountStatus(); // one persistent socket\n * ```\n */\n get ws(): WsPlatform {\n return this.core.ws;\n }\n\n /** The active guardrail policy, or undefined when no `safety` config was supplied. */\n get policy(): TradingPolicy | undefined {\n return this.core.policy;\n }\n\n /** Structured observability bus: `http.*`, `ws.*`, `execution.*`, `risk.*` events. */\n get events(): EventBus {\n return this.core.events;\n }\n\n /** Product-oriented view: spot / futures.usdm / futures.coinm / margin / wallet / subaccount. */\n get products(): {\n spot: SpotSurface;\n usdm: FuturesNamespace;\n coinm: CoinMSurface;\n margin: MarginNamespace;\n wallet: Wallet;\n subaccount: SubAccount;\n } {\n return {\n spot: this.spot,\n usdm: this.futures.usdm,\n coinm: this.futures.coinm,\n margin: this.margin,\n wallet: this.wallet,\n subaccount: this.subaccount,\n };\n }\n\n private readonly namespaces = new Map<string, unknown>();\n private listenKeyValue: string | null = null;\n private keepAliveInterval: NodeJS.Timeout | null = null;\n private spotListenKeyValue: string | null = null;\n private spotKeepAliveInterval: NodeJS.Timeout | null = null;\n private coinmListenKeyValue: string | null = null;\n private coinmKeepAliveInterval: NodeJS.Timeout | null = null;\n\n static nowSeconds(): number {\n return Math.floor(Date.now() / 1000);\n }\n\n static buildPair(base: string, target: string): string {\n return `${base}${target}`.toUpperCase();\n }\n\n static parsePair(pair: string): { base: string; target: string } | null {\n const match = pair.match(/^([A-Z0-9]+)(USDT|USDC|BUSD|BTC|ETH|BNB)$/);\n if (!match) return null;\n return { base: match[1] as string, target: match[2] as string };\n }\n\n static calculateLiquidationPrice(entryPrice: number, leverage: number, side: 'buy' | 'sell', mm = 0.005): number {\n const dir = side === 'buy' ? 1 : -1;\n return dir === 1\n ? entryPrice * (1 - 1 / leverage + mm)\n : entryPrice * (1 + 1 / leverage - mm);\n }\n\n constructor(options: BinanceClientOptions = {}) {\n this.core = new CoreContext(options);\n }\n /** Build-once cache for lazy product namespaces. */\n private cached<T>(key: string, build: () => T): T {\n let value = this.namespaces.get(key) as T | undefined;\n if (value === undefined) {\n value = build();\n this.namespaces.set(key, value);\n }\n return value;\n }\n\n /** Attach the ergonomic `futures.usdm` / `futures.coinm` aliases to the USDⓈ-M surface. */\n private attachAliases(usdm: UsdmSurface): FuturesNamespace {\n const withAliases = {\n ...usdm,\n usdm: null as unknown as FuturesNamespace,\n coinm: this.coinm,\n };\n withAliases.usdm = withAliases;\n return withAliases;\n }\n\n /**\n * Syncs local time against each REST host's server clock and stores the offset, applied to\n * every subsequent signed request's `timestamp` param. Call this once after construction to\n * mitigate `-1021` errors caused by local clock drift.\n */\n async syncTime(): Promise<void> {\n await Promise.all([\n this.core.http('fapiRoot').syncTime('/fapi/v1/time'),\n this.core.http('spot').syncTime('/time'),\n this.core.http('dapiRoot').syncTime('/dapi/v1/time'),\n this.core.http('apiRoot').syncTime('/api/v3/time'),\n ]);\n }\n\n /**\n * Snapshot of the most recently observed `X-MBX-USED-WEIGHT-*` / `X-MBX-ORDER-COUNT-*`\n * response headers, per REST host. Each host tracks its own weight budget independently.\n */\n getRateLimitUsage(): {\n spot: RateLimitUsage;\n futures: RateLimitUsage;\n coinm: RateLimitUsage;\n sapi: RateLimitUsage;\n } {\n return {\n spot: this.core.http('spot').getRateLimitUsage(),\n futures: this.core.http('fapiRoot').getRateLimitUsage(),\n coinm: this.core.http('dapiRoot').getRateLimitUsage(),\n sapi: this.core.http('apiRoot').getRateLimitUsage(),\n };\n }\n\n async startUserStream(): Promise<string> {\n const { listenKey } = await this.futures.userStream.createListenKey();\n this.listenKeyValue = listenKey;\n this.keepAliveInterval = setInterval(() => {\n this.futures.userStream.keepAliveListenKey().catch(() => {\n /* listenKey keep-alive failures are retried on the next tick */\n });\n }, 30 * 60 * 1000);\n this.futures.wsUser.connect();\n return listenKey;\n }\n\n closeUserStream(): void {\n if (this.keepAliveInterval) clearInterval(this.keepAliveInterval);\n this.keepAliveInterval = null;\n this.futures.wsUser.close();\n this.futures.userStream.closeListenKey().catch(() => {\n /* best-effort cleanup */\n });\n this.listenKeyValue = null;\n }\n\n async startSpotUserStream(): Promise<string> {\n const { listenKey } = await this.spot.userStream.createListenKey();\n this.spotListenKeyValue = listenKey;\n this.spotKeepAliveInterval = setInterval(() => {\n this.spot.userStream.keepAliveListenKey().catch(() => {\n /* spot listenKey keep-alive failures are retried on the next tick */\n });\n }, 30 * 60 * 1000);\n this.spot.wsUser.connect();\n return listenKey;\n }\n\n closeSpotUserStream(): void {\n if (this.spotKeepAliveInterval) clearInterval(this.spotKeepAliveInterval);\n this.spotKeepAliveInterval = null;\n this.spot.wsUser.close();\n this.spot.userStream.closeListenKey().catch(() => {\n /* best-effort cleanup */\n });\n this.spotListenKeyValue = null;\n }\n\n async startCoinMUserStream(): Promise<string> {\n const { listenKey } = await this.coinm.userStream.createListenKey();\n this.coinmListenKeyValue = listenKey;\n this.coinmKeepAliveInterval = setInterval(() => {\n this.coinm.userStream.keepAliveListenKey().catch(() => {\n /* COIN-M listenKey keep-alive failures are retried on the next tick */\n });\n }, 30 * 60 * 1000);\n this.coinm.wsUser.connect();\n return listenKey;\n }\n\n closeCoinMUserStream(): void {\n if (this.coinmKeepAliveInterval) clearInterval(this.coinmKeepAliveInterval);\n this.coinmKeepAliveInterval = null;\n this.coinm.wsUser.close();\n this.coinm.userStream.closeListenKey().catch(() => {\n /* best-effort cleanup */\n });\n this.coinmListenKeyValue = null;\n }\n\n /**\n * Local L2 order-book engine on the futures market stream + REST snapshots:\n * best bid/ask, spread, microprice, imbalance, VWAP — all decimal-exact.\n *\n * ```ts\n * const books = client.createFuturesOrderBookEngine();\n * const btc = await books.subscribe('BTCUSDT');\n * btc.metrics(); // { bestBid, bestAsk, spread, imbalance, microprice, ... }\n * ```\n */\n createFuturesOrderBookEngine(options?: {\n updateSpeed?: '100ms' | '500ms';\n resyncDelayMs?: number;\n }): OrderBookEngine {\n return new OrderBookEngine({\n ws: this.futures.ws,\n fetchSnapshot: async (symbol) => {\n const snapshot = await this.futures.market.depth(symbol.toUpperCase(), 1000);\n // Re-stringify: the typed schema converts to numbers; the book engine\n // accepts numeric pairs but prefers exact strings.\n return {\n lastUpdateId: snapshot.lastUpdateId,\n bids: snapshot.bids.map((level) => [String(level.price), String(level.qty)] as [string, string]),\n asks: snapshot.asks.map((level) => [String(level.price), String(level.qty)] as [string, string]),\n };\n },\n events: this.events,\n ...options,\n });\n }\n\n /** Local L2 book for a futures symbol (sugar over createFuturesOrderBookEngine). */\n async subscribeFuturesOrderBook(symbol: string, options?: { updateSpeed?: '100ms' | '500ms' }): Promise<OrderBook> {\n const engine = this.createFuturesOrderBookEngine(options);\n return engine.subscribe(symbol);\n }\n\n /**\n * Paper trading as a first-class execution backend.\n *\n * Returns an {@link ExecutionManager} whose orders route through a local\n * {@link PaperTradingEngine} simulator — the same `Execution` envelope, the\n * same idempotency and reconciliation semantics as the live manager, zero\n * exchange traffic.\n *\n * ```ts\n * const paper = client.createPaperExecutionManager({ initialBalance: 50_000 });\n * const execution = await paper.placeOrder({\n * symbol: 'BTCUSDT', side: 'BUY', type: 'MARKET', quantity: 0.01,\n * });\n * ```\n */\n createPaperExecutionManager(options: PaperTradingOptions = {}): ExecutionManager {\n return new ExecutionManager(new PaperExecutionAdapter(new PaperTradingEngine(options)), {\n clientOrderIdPrefix: 'paper',\n events: this.events,\n });\n }\n\n /**\n * Execution gateway: route orders to the live exchange or the paper\n * simulator through one interface, with independent ledgers per backend.\n *\n * ```ts\n * const gateway = client.createExecutionGateway({ defaultBackend: 'paper' });\n * await gateway.placeOrder({ symbol: 'BTCUSDT', ... }); // paper\n * await gateway.placeOrder({ ...order }, { backend: 'live' }); // live\n * gateway.paperEngine.getAccountInfo(); // simulation state\n * ```\n */\n createExecutionGateway(\n options: { paper?: PaperTradingOptions; defaultBackend?: ExecutionBackend; audit?: AuditSink } = {},\n ): ExecutionGateway {\n return new ExecutionGateway({\n live: this.futures.execution,\n paperEngine: new PaperTradingEngine(options.paper),\n defaultBackend: options.defaultBackend,\n audit: options.audit,\n });\n }\n\n /** Snapshot of the active risk gateway's state, when `safety` was configured. */\n getRiskStatus(): ReturnType<RiskGateway['riskStatus']> | undefined {\n return this.policy instanceof RiskGateway ? this.policy.riskStatus() : undefined;\n }\n\n closeAllWebSockets(): void {\n this.core.closeWebSockets(); // platform pools/WS API (no-op when never built)\n this.futures.ws.close();\n this.futures.wsUser.close();\n this.spot.ws.close();\n this.spot.wsUser.close();\n this.coinm.ws.close();\n this.coinm.wsUser.close();\n this.closeUserStream();\n this.closeSpotUserStream();\n this.closeCoinMUserStream();\n }\n\n reconnectWebSocket(target: 'ws' | 'wsUser' | 'spot' | 'spotUser' | 'coinm' | 'coinmUser'): void {\n if (target === 'ws') this.futures.ws.reconnect();\n else if (target === 'wsUser') this.futures.wsUser.reconnect();\n else if (target === 'spot') this.spot.ws.reconnect();\n else if (target === 'spotUser') this.spot.wsUser.reconnect();\n else if (target === 'coinm') this.coinm.ws.reconnect();\n else this.coinm.wsUser.reconnect();\n }\n\n resetReconnectAttempts(): void {\n this.futures.ws.resetReconnectAttempts();\n this.futures.wsUser.resetReconnectAttempts();\n this.spot.ws.resetReconnectAttempts();\n this.spot.wsUser.resetReconnectAttempts();\n this.coinm.ws.resetReconnectAttempts();\n this.coinm.wsUser.resetReconnectAttempts();\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport { createFuturesToolkit, type FuturesToolkitOptions } from '../tools/index.js';\nimport { VERSION } from '../version.js';\n\n/**\n * MCP server over the toolkit. Pass `toolkit: { executionBackend: 'paper' }`\n * to route every order tool through the simulator — safe to expose to any\n * host without API-key trading risk.\n */\nexport function createBinanceMcpServer(client: BinanceClient, options: FuturesToolkitOptions = {}): McpServer {\n const server = new McpServer({ name: 'binance-sdk', version: VERSION });\n const toolkit = createFuturesToolkit(client, options);\n\n toolkit.tools.forEach((tool) => {\n server.registerTool(tool.name, { description: tool.description, inputSchema: tool.inputSchema }, async (args) => ({\n content: [{ type: 'text', text: String(await tool.handler(args, { env: 'live', isSigned: true })) }],\n }));\n });\n\n registerResources(server, client);\n\n return server;\n}\n\n/**\n * Reference data exposed as MCP resources rather than tools: hosts can attach these\n * to context directly, without the model having to decide to call something first.\n */\nfunction registerResources(server: McpServer, client: BinanceClient): void {\n const json = (uri: string, data: unknown) => ({\n contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(data, null, 2) }],\n });\n\n server.registerResource(\n 'futures-symbols',\n 'binance://futures/symbols',\n {\n title: 'Futures Trading Symbols',\n description: 'Every tradeable USD-M futures symbol with its contract type and status',\n mimeType: 'application/json',\n },\n async (uri) => {\n const info = await client.futures.market.exchangeInfo();\n return json(uri.href, info.symbols);\n },\n );\n\n server.registerResource(\n 'futures-premium-index',\n 'binance://futures/premium-index',\n {\n title: 'Premium Index',\n description: 'Mark price, index price and funding rate across all USD-M pairs',\n mimeType: 'application/json',\n },\n async (uri) => json(uri.href, await client.futures.data.assetIndex()),\n );\n\n server.registerResource(\n 'spot-symbols',\n 'binance://spot/symbols',\n {\n title: 'Spot Trading Symbols',\n description: 'Every tradeable Spot symbol with its status, base/quote assets and permissions',\n mimeType: 'application/json',\n },\n async (uri) => {\n const info = await client.spot.market.exchangeInfo();\n return json(uri.href, info.symbols);\n },\n );\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst optionalSymbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional();\nconst limit = z.number().int().positive().max(1000).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\n\nexport function accountTools(client: BinanceClient): ToolDefinition[] {\n const a = client.futures.account;\n\n return [\n {\n name: 'futures_balance',\n description: 'Get futures account balances (v3): asset, wallet balance, unrealized profit, margin balance, available balance (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.balanceV3()),\n },\n {\n name: 'futures_account',\n description: 'Get full account information (v3): total wallet/margin balance, unrealized profit, available balance, assets & positions (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.accountV3()),\n },\n {\n name: 'futures_balance_v2',\n description: 'Get futures account balance (v2 legacy) per asset (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.balance()),\n },\n {\n name: 'futures_account_v2',\n description: 'Get futures account information (v2 legacy) (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.account()),\n },\n {\n name: 'futures_position_risk',\n description: 'Get current open positions (v3): symbol, side, size, entry price, mark price, liquidation price, leverage, unrealized PnL, margin (signed).',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await a.positionRiskV3(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_income_history',\n description: 'Get futures income history (realized PnL, funding fees, commissions, transfers, insurance clearing). incomeType examples: TRANSFER, REALIZED_PNL, FUNDING_FEE, COMMISSION, INSURANCE_CLEAR, REFERRAL_KICKBACK (signed).',\n inputSchema: z.object({ symbol: optionalSymbol, incomeType: z.string().optional().describe('e.g. TRANSFER, REALIZED_PNL, FUNDING_FEE, COMMISSION'), startTime, endTime, limit: limit.default(100) }),\n handler: async ({ symbol, incomeType, startTime, endTime, limit }) =>\n textResult(await a.incomeHistory({ symbol: symbol ? normalizeSymbol(symbol) : undefined, incomeType, startTime, endTime, limit: Number(limit) })),\n },\n {\n name: 'futures_user_trades',\n description: 'Get account trade list (filled trades) for a symbol with optional time range (signed).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), startTime, endTime, limit: limit.default(100), fromId: z.number().int().positive().optional() }),\n handler: async ({ symbol, startTime, endTime, limit, fromId }) =>\n textResult(await a.userTrades({ symbol: normalizeSymbol(symbol), startTime, endTime, limit: Number(limit), fromId })),\n },\n {\n name: 'futures_leverage_brackets',\n description: 'Get notional and leverage brackets for one symbol or all: tier caps, maintenance margin rate, max leverage (signed).',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await a.leverageBrackets(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_commission_rate',\n description: 'Get user commission rate (taker & maker fee) for a symbol (signed).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. ETHUSDT') }),\n handler: async ({ symbol }) => textResult(await a.commissionRate(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_multi_assets_mode',\n description: 'Get current multi-assets margin mode status (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.multiAssetsMargin()),\n },\n {\n name: 'futures_set_multi_assets_mode',\n description: 'Enable or disable multi-assets mode (signed; 7-day cooldown between toggles).',\n inputSchema: z.object({ enabled: z.boolean().describe('true to enable, false to disable') }),\n handler: async ({ enabled }) => textResult(await a.setMultiAssetsMargin(enabled)),\n },\n {\n name: 'futures_fee_burn_status',\n description: 'Get BNB fee burn status for futures trades (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.feeBurnStatus()),\n },\n {\n name: 'futures_set_fee_burn',\n description: 'Toggle BNB fee burn on futures trades (signed).',\n inputSchema: z.object({ enabled: z.boolean().describe('true to enable fee burn') }),\n handler: async ({ enabled }) => textResult(await a.setFeeBurnStatus(enabled)),\n },\n {\n name: 'futures_position_mode',\n description: 'Get current position mode: one-way (BOTH) or hedge mode (LONG/SHORT) (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.positionMode()),\n },\n {\n name: 'futures_set_position_mode',\n description: 'Change position mode: hedgeMode true = dual side (hedge), false = one-way (signed; 30-day cooldown).',\n inputSchema: z.object({ hedgeMode: z.boolean().describe('true = hedge mode, false = one-way') }),\n handler: async ({ hedgeMode }) => textResult(await a.setPositionMode(hedgeMode)),\n },\n {\n name: 'futures_api_trading_status',\n description: 'Get futures trading quantitative rules indicators and disable intervals (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.apiTradingStatus()),\n },\n {\n name: 'futures_position_margin_history',\n description: 'Get isolated position margin change history. type: 1 = add margin, 2 = reduce margin (signed).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), type: z.enum(['1', '2']).describe('1 = add margin, 2 = reduce margin'), startTime, endTime, limit: limit.default(50) }),\n handler: async ({ symbol, type, startTime, endTime, limit }) =>\n textResult(await a.positionMarginHistory({ symbol: normalizeSymbol(symbol), type: Number(type), startTime, endTime, limit: Number(limit) })),\n },\n {\n name: 'futures_rate_limit_order',\n description: 'Query the current user order rate limit usage (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.rateLimitOrder()),\n },\n {\n name: 'futures_request_order_download',\n description: 'Request a futures order-history download (async, 7-day window). Returns a downloadId (signed).',\n inputSchema: z.object({ symbol: optionalSymbol, startTime, endTime }),\n handler: async ({ symbol, startTime, endTime }) =>\n textResult(await a.requestOrderDownload({ symbol: symbol ? normalizeSymbol(symbol) : undefined, startTime, endTime })),\n },\n {\n name: 'futures_order_download_status',\n description: 'Get the futures order-history download link by downloadId (signed).',\n inputSchema: z.object({ downloadId: z.string().min(1) }),\n handler: async ({ downloadId }) => textResult(await a.getOrderDownloadStatus(downloadId)),\n },\n {\n name: 'futures_request_trade_download',\n description: 'Request a futures trade-history download (async, 7-day window). Returns a downloadId (signed).',\n inputSchema: z.object({ symbol: optionalSymbol, startTime, endTime }),\n handler: async ({ symbol, startTime, endTime }) =>\n textResult(await a.requestTradeDownload({ symbol: symbol ? normalizeSymbol(symbol) : undefined, startTime, endTime })),\n },\n {\n name: 'futures_trade_download_status',\n description: 'Get the futures trade-history download link by downloadId (signed).',\n inputSchema: z.object({ downloadId: z.string().min(1) }),\n handler: async ({ downloadId }) => textResult(await a.getTradeDownloadStatus(downloadId)),\n },\n {\n name: 'futures_account_config',\n description: 'Get futures account configuration: fee tier, trading permissions, dual-side position setting (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.accountConfig()),\n },\n {\n name: 'futures_portfolio_margin_account_info',\n description: 'Get Portfolio Margin account info for an asset: cross margin balance and liability (signed).',\n inputSchema: z.object({ asset: z.string().min(1).describe('Asset, e.g. USDT') }),\n handler: async ({ asset }) => textResult(await a.pmAccountInfo(asset)),\n },\n {\n name: 'futures_request_income_download',\n description: 'Request a futures income/transaction-history download (async). Returns a downloadId (signed).',\n inputSchema: z.object({ startTime: startTime.unwrap(), endTime: endTime.unwrap() }),\n handler: async ({ startTime, endTime }) => textResult(await a.requestIncomeDownload({ startTime, endTime })),\n },\n {\n name: 'futures_income_download_status',\n description: 'Get the futures income/transaction-history download link by downloadId (signed).',\n inputSchema: z.object({ downloadId: z.string().min(1) }),\n handler: async ({ downloadId }) => textResult(await a.getIncomeDownloadStatus(downloadId)),\n },\n ];\n}\n","import { z } from 'zod';\n\nexport interface ToolContext {\n env: 'live' | 'testnet' | 'demo';\n isSigned: boolean;\n}\n\nexport interface ToolDefinition<TInput extends z.ZodTypeAny = z.ZodTypeAny> {\n name: string;\n description: string;\n inputSchema: TInput;\n handler: (args: any, ctx: ToolContext) => Promise<unknown>;\n}\n\nexport function normalizeSymbol(value: unknown): string {\n return String(value ?? '').trim().toUpperCase();\n}\nexport function normalizeLimit(value: unknown): number {\n return Number(value);\n}\n\nexport function toJsonSchema(inputSchema: z.ZodTypeAny): Record<string, unknown> {\n return z.toJSONSchema(inputSchema, { target: 'json' });\n}\n\nexport function toOpenAITool(tool: ToolDefinition): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: toJsonSchema(tool.inputSchema),\n },\n };\n}\n\nexport function toAnthropicTool(tool: ToolDefinition): Record<string, unknown> {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: toJsonSchema(tool.inputSchema),\n };\n}\n\nexport function toMCPTool(tool: ToolDefinition): {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n} {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: toJsonSchema(tool.inputSchema),\n };\n}\n\nexport function toToolList<TInput extends z.ZodTypeAny>(\n tools: ToolDefinition<TInput>[],\n format: 'openai' | 'anthropic' | 'mcp',\n): Record<string, unknown>[] {\n const adapter =\n format === 'openai' ? toOpenAITool : format === 'anthropic' ? toAnthropicTool : toMCPTool;\n return tools.map(adapter);\n}\n\nexport function textResult(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst symbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT');\n\n/**\n * Derived tools: each one fans out over several REST endpoints and returns a\n * single answer. They exist so the model does not have to chain primitives and\n * do float arithmetic on tick/step sizes itself.\n */\nexport function derivedTools(client: BinanceClient): ToolDefinition[] {\n const ops = client.futures.ops;\n\n return [\n {\n name: 'futures_symbol_rules',\n description:\n 'Get the tradeable rules for a symbol in one call: tick size, step size, min/max quantity, market-order lot bounds and minimum notional, flattened out of exchangeInfo filters. Call this before sizing or pricing any order.',\n inputSchema: z.object({ symbol, refresh: z.boolean().default(false).describe('Bypass the 60s cache') }),\n handler: async ({ symbol: s, refresh }) => textResult(await ops.symbolRules(normalizeSymbol(s), { refresh })),\n },\n {\n name: 'futures_quantize',\n description:\n \"Round a price to the symbol's tick size and a quantity to its step size, returning exchange-ready strings. Use this instead of rounding numbers yourself — Binance rejects off-tick prices (-1111).\",\n inputSchema: z.object({\n symbol,\n price: z.number().positive().optional(),\n quantity: z.number().positive().optional(),\n marketOrder: z.boolean().default(false).describe('Use MARKET_LOT_SIZE bounds instead of LOT_SIZE'),\n }),\n handler: async ({ symbol: s, price, quantity, marketOrder }) =>\n textResult(await ops.quantize(normalizeSymbol(s), { price, quantity, marketOrder })),\n },\n {\n name: 'futures_size_position',\n description:\n 'Convert a risk budget into an exchange-ready order quantity. Given a stop price and either riskAmount (quote currency) or riskPct (percent of available balance), returns the quantity rounded down to the symbol step size, plus the notional, required margin and every constraint that failed (min notional, lot bounds, wrong-side stop). Never increases risk to satisfy a minimum — it reports instead.',\n inputSchema: z.object({\n symbol,\n side: z.enum(['BUY', 'SELL']),\n stopPrice: z.number().positive().describe('Protective stop price'),\n entryPrice: z.number().positive().optional().describe('Defaults to current mark price'),\n riskAmount: z.number().positive().optional().describe('Quote-currency amount to risk, e.g. 50 USDT'),\n riskPct: z.number().positive().max(100).optional().describe('Percent of available balance to risk (signed call)'),\n leverage: z.number().int().min(1).max(125).optional().describe('Used to report required margin'),\n marketOrder: z.boolean().default(false),\n }),\n handler: async (args) => textResult(await ops.sizePosition({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_close_position',\n description:\n 'Flatten an open position with a reduce-only market order. Reads the current position, derives the closing side from its sign, and automatically uses reduceOnly in one-way mode vs positionSide in hedge mode (Binance rejects the wrong one). Set dryRun to preview the order without sending it. Signed, destructive.',\n inputSchema: z.object({\n symbol,\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional().describe('Required when hedge mode has both sides open'),\n portion: z.number().positive().max(1).default(1).describe('Fraction of the position to close, e.g. 0.5 for half'),\n dryRun: z.boolean().default(false),\n }),\n handler: async (args) => textResult(await ops.closePosition({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_market_snapshot',\n description:\n 'One-call market picture for a symbol: 24h stats, mark/index price with funding, open interest and long/short positioning. Replaces four separate primitive calls; individual feeds degrade to an error field rather than failing the whole snapshot.',\n inputSchema: z.object({\n symbol,\n period: z.enum(['5m', '15m', '30m', '1h', '2h', '4h', '6h', '12h', '1d']).default('1h'),\n }),\n handler: async ({ symbol: s, period }) => textResult(await ops.marketSnapshot(normalizeSymbol(s), { period })),\n },\n {\n name: 'futures_account_overview',\n description:\n 'One-call account picture: funded balances, open positions only (zero-size entries filtered out), working orders, and totals for unrealized PnL and gross notional. Signed.',\n inputSchema: z.object({}),\n handler: async () => textResult(await ops.accountOverview()),\n },\n {\n name: 'futures_place_bracket_order',\n description:\n 'Place an entry order together with its protective stop-loss and optional take-profit, with all prices quantized to the symbol tick. Returns each leg separately; if a protective leg fails the response is flagged protectionComplete=false and the entry is NOT auto-cancelled (it may already have filled). Signed, destructive.',\n inputSchema: z.object({\n symbol,\n side: z.enum(['BUY', 'SELL']),\n quantity: z.union([z.string(), z.number()]),\n entryPrice: z.number().positive().optional().describe('Omit for a MARKET entry'),\n stopLossPrice: z.number().positive(),\n takeProfitPrice: z.number().positive().optional(),\n positionSide: z.enum(['BOTH', 'LONG', 'SHORT']).optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).default('MARK_PRICE'),\n }),\n handler: async (args) => textResult(await ops.placeBracketOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ExecutionGateway } from '../execution/Gateway.js';\nimport type { ExecutionBackend } from '../execution/Gateway.js';\nimport { orderParamsSchema } from './trading.tools.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\n/**\n * Agent-native execution surface: the toolkit's order tools routed through\n * the {@link ExecutionGateway} instead of the raw REST layer.\n *\n * What MCP/agent callers gain over `futures_new_order`:\n *\n * - **backend routing** — every tool takes `backend: 'live' | 'paper'`, so a\n * single toolkit serves test automation (paper) and real trading (live)\n * without any code change; the gateway's `defaultBackend` decides what an\n * unspecified call does;\n * - **idempotency** — `intentId` makes retries safe: a duplicate submission\n * of the same intent returns the original execution instead of a second\n * order (the exchange-matching double-spend footgun);\n * - **reconciliation** — timeouts and connection resets are recovered by\n * REST lookup, never guessed at;\n * - **identical envelopes** — paper and live return the same `Execution`\n * shape with exact decimal strings, so downstream parsing is uniform.\n */\n\nconst backend = z\n .enum(['live', 'paper'])\n .optional()\n .describe(\"Execution backend for this call; default is the gateway's default backend\");\n\nconst intentId = z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Idempotency key. Re-submitting the same intentId returns the original execution instead of placing a second order. Recommended for any retry loop.',\n );\n\nexport function executionTools(gateway: ExecutionGateway, client?: BinanceClient): ToolDefinition[] {\n return [\n {\n name: 'execution_place_order',\n description:\n 'Place an order through the execution gateway: idempotent (retry with the same intentId returns the original execution), reconciled on ambiguous failures, and routable to the live exchange or the paper simulator via `backend`. Paper orders need no API keys. MARKET and LIMIT types supported on paper.',\n inputSchema: orderParamsSchema.extend({ intentId, backend }),\n handler: async (args) => {\n const { intentId: intent, backend: route } = args;\n return textResult(\n await gateway.placeOrder(\n { ...args, intentId: intent, symbol: normalizeSymbol(args.symbol) },\n { backend: route },\n ),\n );\n },\n },\n {\n name: 'execution_cancel_order',\n description:\n 'Cancel an order idempotently by exchange orderId, clientOrderId, or the intentId from execution_place_order. Cancels of already-gone orders resolve to a terminal CANCELED execution (never a thrown -2011).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n orderId: z.number().int().positive().optional().describe('Exchange order id'),\n origClientOrderId: z.string().optional().describe('Client order id (the reconciliation key)'),\n intentId,\n backend,\n }),\n handler: async ({ symbol, orderId, origClientOrderId, intentId: intent, backend: route }) =>\n textResult(\n await gateway.cancelOrder(\n normalizeSymbol(symbol),\n { orderId, origClientOrderId, intentId: intent, backend: route },\n ),\n ),\n },\n {\n name: 'execution_get_order',\n description:\n 'Fetch an execution from the ledger by its intentId. When `backend` is omitted both ledgers are searched (paper first), so callers do not need to remember where an intent ran.',\n inputSchema: z.object({ intentId: z.string().min(1), backend }),\n handler: async ({ intentId: intent, backend: route }) => {\n const execution = route\n ? gateway.getExecution(intent, route)\n : gateway.getExecution(intent, 'paper') ?? gateway.getExecution(intent, 'live');\n if (!execution) throw new Error(`No execution for intentId ${intent}`);\n return textResult(execution);\n },\n },\n {\n name: 'execution_list_orders',\n description:\n 'List the execution ledger (most recent first) for a backend. Each entry carries status, fills, and reconciliation state. Paper and live ledgers are independent.',\n inputSchema: z.object({ backend }),\n handler: async ({ backend: route }) => textResult(gateway.listExecutions(route)),\n },\n {\n name: 'execution_reconcile_order',\n description:\n 'Force a reconciliation pass for an intent whose outcome is unknown (e.g. after a timeout). Recovers the true state from the exchange (live) or simulator (paper) instead of guessing.',\n inputSchema: z.object({ intentId: z.string().min(1), backend }),\n handler: async ({ intentId: intent, backend: route }) =>\n textResult(await gateway.reconcile(intent, route)),\n },\n {\n name: 'execution_status',\n description:\n 'Snapshot of the execution environment: default backend, risk-gateway state (when a trading policy is configured), and the paper simulator account (balance, positions, unrealized PnL). Read-only, never places orders.',\n inputSchema: z.object({}),\n handler: async () => {\n const risk = client?.getRiskStatus?.();\n const paper = gateway.paperEngine.getAccountInfo();\n return textResult({\n defaultBackend: gateway.backend,\n risk: risk ?? null,\n paper: {\n balance: paper.balance,\n availableBalance: paper.availableBalance,\n totalWalletBalance: paper.totalWalletBalance,\n unrealizedPnl: paper.unrealizedPnl,\n realizedPnl: paper.realizedPnl,\n positions: Object.values(paper.positions).filter((p) => p.quantity > 0),\n orderCount: paper.orders.length,\n },\n });\n },\n },\n ];\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst symbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT');\nconst optionalSymbol = z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional();\nconst limit = z.number().int().positive().max(1000).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\nconst side = z.enum(['BUY', 'SELL']);\nconst positionSide = z.enum(['BOTH', 'LONG', 'SHORT']).optional();\n\nexport const orderParamsSchema = z.object({\n symbol,\n side,\n type: z.enum(['LIMIT', 'MARKET', 'STOP', 'STOP_MARKET', 'TAKE_PROFIT', 'TAKE_PROFIT_MARKET', 'TRAILING_STOP_MARKET']),\n quantity: z.union([z.string(), z.number()]).describe('Order quantity in base asset'),\n price: z.union([z.string(), z.number()]).optional().describe('Required for LIMIT and STOP/TAKE_PROFIT (limit-triggered) types'),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n stopPrice: z.union([z.string(), z.number()]).optional().describe('Trigger price for STOP/STOP_MARKET/TAKE_PROFIT/TAKE_PROFIT_MARKET'),\n reduceOnly: z.boolean().optional().describe('true = only reduces the position, never opens'),\n positionSide,\n newClientOrderId: z.string().optional(),\n closePosition: z.boolean().optional().describe('Close the full position on trigger (mutually exclusive with quantity)'),\n newOrderRespType: z.enum(['ACK', 'RESULT']).optional(),\n priceProtect: z.boolean().optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional().describe('Trigger price basis; default CONTRACT_PRICE'),\n callbackRate: z.union([z.string(), z.number()]).optional().describe('Percent callback for TRAILING_STOP_MARKET, e.g. 0.5'),\n activationPrice: z.union([z.string(), z.number()]).optional().describe('Activation price for TRAILING_STOP_MARKET'),\n selfTradePreventionMode: z.enum(['NONE', 'EXPIRE_TAKER', 'EXPIRE_MAKER', 'EXPIRE_BOTH']).optional(),\n goodTillDate: z.number().int().optional().describe('Timestamp when a GTD order expires'),\n});\n\nexport function tradingTools(client: BinanceClient): ToolDefinition[] {\n const t = client.futures.trading;\n\n return [\n {\n name: 'futures_new_order',\n description: 'Place a new futures order. Types: LIMIT, MARKET, STOP, STOP_MARKET, TAKE_PROFIT, TAKE_PROFIT_MARKET, TRAILING_STOP_MARKET. Use STOP_MARKET as the take-profit/stop-loss trigger and LIMIT for the actual fill. Signed.',\n inputSchema: orderParamsSchema,\n handler: async (args) => textResult(await t.createOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_test_order',\n description: 'Validate a new order without submitting it. Returns 200 on success; use to validate fields and margin before real orders. Signed.',\n inputSchema: orderParamsSchema,\n handler: async (args) => textResult(await t.createTestOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_get_order',\n description: 'Query a specific order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.getOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'futures_cancel_order',\n description: 'Cancel a specific open order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.cancelOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'futures_get_open_order',\n description: 'Query a current open order (must exist in the open order book). Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.getCurrentOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'futures_open_orders',\n description: 'Get all current open orders, for one symbol or all symbols. Signed.',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await t.getOpenOrders(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_all_orders',\n description: 'Get historical orders for a symbol with optional time range (last 7 days by default). Signed.',\n inputSchema: z.object({ symbol, orderId: z.number().int().positive().optional(), startTime, endTime, limit }),\n handler: async ({ symbol, orderId, startTime, endTime, limit }) =>\n textResult(await t.getAllOrders(normalizeSymbol(symbol), { orderId, startTime, endTime, limit })),\n },\n {\n name: 'futures_cancel_all_orders',\n description: 'Cancel all open orders for a symbol. Signed.',\n inputSchema: z.object({ symbol }),\n handler: async ({ symbol }) => textResult(await t.cancelAllOpenOrders(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_modify_order',\n description: 'Modify an open order (price/quantity/stopPrice). Cannot modify when position side is BOTH and closePosition is true. Signed.',\n inputSchema: z.object({\n symbol,\n side,\n quantity: z.union([z.string(), z.number()]),\n price: z.union([z.string(), z.number()]).optional(),\n orderId: z.number().int().positive().optional(),\n origClientOrderId: z.string().optional(),\n stopPrice: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n positionSide,\n newClientOrderId: z.string().optional(),\n }),\n handler: async (args) => textResult(await t.modifyOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_order_modify_history',\n description: 'Get order modification history for a symbol. Signed.',\n inputSchema: z.object({ symbol, startTime, endTime, limit }),\n handler: async ({ symbol, startTime, endTime, limit }) =>\n textResult(await t.getOrderModifyHistory(normalizeSymbol(symbol), { startTime, endTime, limit })),\n },\n {\n name: 'futures_batch_orders',\n description: 'Place up to 5 orders in one request (array of order objects, max 30 per minute per symbol). Signed.',\n inputSchema: z.object({ orders: z.array(orderParamsSchema).min(1).max(5) }),\n handler: async (args) => {\n const mapped = args.orders.map((o: z.infer<typeof orderParamsSchema>) => ({ ...o, symbol: normalizeSymbol(o.symbol) }));\n return textResult(await t.createBatchOrders(mapped));\n },\n },\n {\n name: 'futures_cancel_batch_orders',\n description: 'Cancel multiple orders at once (up to 10 by orderId list or client order id list). Signed.',\n inputSchema: z.object({\n symbol,\n orderIdList: z.array(z.number().int().positive()).max(10).optional(),\n origClientOrderIdList: z.array(z.string()).max(10).optional(),\n }),\n handler: async ({ symbol, orderIdList, origClientOrderIdList }) =>\n textResult(await t.cancelBatchOrders(normalizeSymbol(symbol), { orderIdList, origClientOrderIdList })),\n },\n {\n name: 'futures_set_leverage',\n description: 'Change initial leverage for a symbol (1-125, within bracket). Signed.',\n inputSchema: z.object({ symbol, leverage: z.number().int().min(1).max(125) }),\n handler: async ({ symbol, leverage }) => textResult(await t.setLeverage(normalizeSymbol(symbol), leverage)),\n },\n {\n name: 'futures_set_margin_type',\n description: 'Change margin type for a symbol: isolated or cross. Only allowed when no open position for the symbol. Signed.',\n inputSchema: z.object({ symbol, marginType: z.enum(['isolated', 'cross']) }),\n handler: async ({ symbol, marginType }) => textResult(await t.setMarginType(normalizeSymbol(symbol), marginType)),\n },\n {\n name: 'futures_modify_position_margin',\n description: 'Add or reduce isolated position margin. marginType: 1 = add margin, 2 = reduce margin. Signed.',\n inputSchema: z.object({ symbol, amount: z.number().positive(), marginType: z.enum(['1', '2']).describe('1 = add margin, 2 = reduce margin') }),\n handler: async ({ symbol, amount, marginType }) => textResult(await t.modifyPositionMargin(normalizeSymbol(symbol), amount, Number(marginType))),\n },\n {\n name: 'futures_countdown_cancel_all',\n description: 'Auto-cancel all open orders for a symbol after countdownTime ms (0 = cancel the countdown). Emergency circuit breaker. Signed.',\n inputSchema: z.object({ symbol, countdownTime: z.number().int().min(100).max(60000) }),\n handler: async ({ symbol, countdownTime }) => textResult(await t.setCountdownCancelAll(normalizeSymbol(symbol), countdownTime)),\n },\n {\n name: 'futures_new_algo_order',\n description: 'Place a conditional algo order (CONDITIONAL or VP). CONDITIONAL supports STOP_MARKET/TAKE_PROFIT_MARKET types with triggerPrice; VP is a volume-participation order with urgency and quantity. Signed.',\n inputSchema: z.object({\n algoType: z.enum(['CONDITIONAL', 'VP']),\n symbol,\n side,\n positionSide,\n type: z.enum(['STOP_MARKET', 'TAKE_PROFIT_MARKET', 'LIMIT']).describe('For CONDITIONAL: STOP_MARKET/TAKE_PROFIT_MARKET. For VP: LIMIT'),\n quantity: z.union([z.string(), z.number()]),\n triggerPrice: z.union([z.string(), z.number()]).optional().describe('Required for CONDITIONAL'),\n price: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK', 'GTX']).optional(),\n workingType: z.enum(['MARK_PRICE', 'CONTRACT_PRICE']).optional(),\n priceProtect: z.boolean().optional(),\n reduceOnly: z.boolean().optional(),\n closePosition: z.boolean().optional(),\n urgency: z.enum(['LOW', 'MEDIUM', 'HIGH']).optional().describe('Required for VP'),\n clientAlgoId: z.string().optional(),\n }),\n handler: async (args) =>\n textResult(await t.createAlgoOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'futures_cancel_algo_order',\n description: 'Cancel an open algo order by algoId or clientAlgoId. Signed.',\n inputSchema: z.object({ symbol, algoId: z.number().int().positive().optional(), clientAlgoId: z.string().optional() }),\n handler: async ({ symbol, algoId, clientAlgoId }) =>\n textResult(await t.cancelAlgoOrder(normalizeSymbol(symbol), { algoId, clientAlgoId })),\n },\n {\n name: 'futures_cancel_all_algo_orders',\n description: 'Cancel all open algo orders for a symbol. Signed.',\n inputSchema: z.object({ symbol }),\n handler: async ({ symbol }) => textResult(await t.cancelAllOpenAlgoOrders(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_get_algo_order',\n description: 'Query an algo order by algoId or clientAlgoId. Signed.',\n inputSchema: z.object({ symbol, algoId: z.number().int().positive().optional(), clientAlgoId: z.string().optional() }),\n handler: async ({ symbol, algoId, clientAlgoId }) =>\n textResult(await t.getAlgoOrder(normalizeSymbol(symbol), { algoId, clientAlgoId })),\n },\n {\n name: 'futures_open_algo_orders',\n description: 'Get all current open algo orders, optionally filtered by symbol. Signed.',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await t.getOpenAlgoOrders(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_all_algo_orders',\n description: 'Get historical algo orders for a symbol with optional time range. Signed.',\n inputSchema: z.object({ symbol, startTime, endTime, limit }),\n handler: async ({ symbol, startTime, endTime, limit }) =>\n textResult(await t.getAllAlgoOrders(normalizeSymbol(symbol), { startTime, endTime, limit })),\n },\n {\n name: 'futures_convert_exchange_info',\n description: 'List asset pairs eligible for futures Convert, optionally filtered by fromAsset/toAsset.',\n inputSchema: z.object({ fromAsset: z.string().optional(), toAsset: z.string().optional() }),\n handler: async ({ fromAsset, toAsset }) => textResult(await t.convertExchangeInfo({ fromAsset, toAsset })),\n },\n {\n name: 'futures_convert_get_quote',\n description: 'Request a Convert quote between two assets (quote expires quickly; accept with futures_convert_accept_quote). Signed.',\n inputSchema: z.object({\n fromAsset: z.string().min(1),\n toAsset: z.string().min(1),\n fromAmount: z.number().positive().optional(),\n toAmount: z.number().positive().optional(),\n validTime: z.enum(['10s', '30s', '1m', '2m']).optional(),\n }),\n handler: async (args) => textResult(await t.convertGetQuote(args)),\n },\n {\n name: 'futures_convert_accept_quote',\n description: 'Accept a previously requested Convert quote by quoteId. Signed.',\n inputSchema: z.object({ quoteId: z.string().min(1) }),\n handler: async ({ quoteId }) => textResult(await t.convertAcceptQuote(quoteId)),\n },\n {\n name: 'futures_convert_order_status',\n description: 'Query the status of a Convert order by orderId or quoteId. Signed.',\n inputSchema: z.object({ orderId: z.string().optional(), quoteId: z.string().optional() }),\n handler: async ({ orderId, quoteId }) => textResult(await t.convertOrderStatus({ orderId, quoteId })),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport { KlineIntervalSchema } from '../types/market.types.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst u = (s: z.ZodTypeAny) => s.optional();\nconst optSymbol = u(z.string().min(1)).describe('USD-M pair, e.g. BTCUSDT');\nconst limitDefault = z.number().int().positive().max(1500).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\nconst period = z.enum(['5m', '15m', '30m', '1h', '2h', '4h', '6h', '12h', '1d']).default('1h');\nconst contractType = z.enum(['perpetual', 'current_quarter', 'next_quarter']).default('perpetual');\n\nexport function marketDataTools(client: BinanceClient): ToolDefinition[] {\n const m = client.futures.market;\n const d = client.futures.data;\n\n const tools: ToolDefinition[] = [\n {\n name: 'futures_ping',\n description: 'Test connectivity to the Binance USD-M futures REST API. Returns empty object {} on success.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.ping()),\n },\n {\n name: 'futures_server_time',\n description: 'Get the current Binance USD-M futures server time in milliseconds since epoch.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.serverTime()),\n },\n {\n name: 'futures_exchange_info',\n description: 'Get exchange trading rules and symbol metadata: contract type, status, base/quote assets, price/quantity filters, tick size, step size, notional and leverage brackets, delivery dates.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.exchangeInfo()),\n },\n {\n name: 'futures_ticker_price',\n description: 'Get latest price for one symbol (v1).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.tickerPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_ticker_price_v2',\n description: 'Get latest price for one symbol, or for all symbols when symbol is omitted (v2 endpoint). Use all-symbols mode for market overviews.',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await m.tickerPriceV2(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_ticker_24hr',\n description: 'Get 24-hour rolling price change statistics for a symbol: price change %, high, low, volume, quote volume, open interest.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.ticker24hr(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_book_ticker',\n description: 'Get best bid/ask (top of book) for a single symbol (v1).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.bookTicker(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_book_ticker_v2',\n description: 'Get best bid/ask (top of book) for one symbol, or all symbols when omitted (v2 endpoint).',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await m.bookTickerV2(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_order_book',\n description: 'Get order book depth for a symbol. Limits: 5, 10, 20, 50, 100, 500, 1000.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: z.enum(['5', '10', '20', '50', '100', '500', '1000']).default('100'),\n }),\n handler: async ({ symbol, limit }) => textResult(await m.depth(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'futures_recent_trades',\n description: 'Get the most recent executed trades for a symbol (public endpoint).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: limitDefault.default(500),\n }),\n handler: async ({ symbol, limit }) => textResult(await m.trades(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'futures_historical_trades',\n description: 'Get older trades for a symbol by fromId (older than recent).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: limitDefault.default(500),\n fromId: z.number().int().positive().optional(),\n }),\n handler: async ({ symbol, limit, fromId }) =>\n textResult(await m.historicalTrades(normalizeSymbol(symbol), { limit: Number(limit), fromId })),\n },\n {\n name: 'futures_agg_trades',\n description: 'Get compressed/aggregate trades for a symbol within an optional time window. Each entry aggregates trades with the same price and side.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await m.aggTrades(normalizeSymbol(symbol), { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_klines',\n description: 'Get candlestick (OHLCV) data for a symbol. Intervals: 1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,1M. Max 1500 per request.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.klines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_continuous_klines',\n description: 'Get klines for a continuous contract (perpetual, current_quarter, next_quarter) identified by base pair (e.g. BTCUSDT).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT'),\n contractType,\n interval: KlineIntervalSchema,\n limit: limitDefault.default(500),\n startTime,\n endTime,\n }),\n handler: async ({ symbol, contractType, interval, limit, startTime, endTime }) =>\n textResult(await m.continuousKlines(normalizeSymbol(symbol), contractType, interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_index_price_klines',\n description: 'Get index price candlesticks for a pair (e.g. BTCUSDT index).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.indexPriceKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_mark_price_klines',\n description: 'Get mark price candlesticks for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.markPriceKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_trading_day_ticker',\n description: 'Get the trading-day ticker (v1: rolling window stats by symbol, including open, close, high, low, volume, closeTime).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await m.tradingDayTicker(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_mark_price',\n description: 'Get mark price, index price, estimated settle price, last funding rate, next funding time and interest rate for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.premiumIndex(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_funding_rate_history',\n description: 'Get historical funding rates for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), limit: limitDefault.default(100), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await d.fundingRateHistory(normalizeSymbol(symbol), { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_funding_info',\n description: 'Get funding rate configuration for all symbols with adjusted funding cap/floor or interval (e.g. under extreme volatility).',\n inputSchema: z.object({}),\n handler: async () => textResult(await d.fundingInfo()),\n },\n {\n name: 'futures_open_interest',\n description: 'Get the current total open interest for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.openInterest(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_open_interest_hist',\n description: 'Get historical open interest statistics per period.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.openInterestHist(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_top_long_short_account_ratio',\n description: 'Get top trader long/short account ratio (number of accounts) for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.topLongShortAccountRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_top_long_short_position_ratio',\n description: 'Get top trader long/short position ratio (accounts with net positions) for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.topLongShortPositionRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_global_long_short_ratio',\n description: 'Get global long/short account ratio for a symbol (all accounts).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.globalLongShortAccountRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_taker_long_short_ratio',\n description: 'Get taker buy/sell volume ratio for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), period, limit: limitDefault.default(30) }),\n handler: async ({ symbol, period, limit }) => textResult(await d.takerLongShortRatio(normalizeSymbol(symbol), period, Number(limit))),\n },\n {\n name: 'futures_basis',\n description: 'Get basis data (spot-futures spread, mark price - index price) for a pair and contract type.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT'),\n period,\n limit: limitDefault.default(30),\n startTime,\n endTime,\n }),\n handler: async ({ symbol, period, limit, startTime, endTime }) =>\n textResult(await d.basis(normalizeSymbol(symbol), period, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_asset_index',\n description: 'Get multi-assets mode asset index (collateral price) for one asset or all assets.',\n inputSchema: z.object({ symbol: optSymbol.describe('Asset index symbol, e.g. ADAUSD') }),\n handler: async ({ symbol }) => textResult(await d.assetIndex(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_composite_index_info',\n description: 'Get composite index symbol information (e.g. DEFIUSDT) with constituent weights.',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await d.compositeIndexInfo(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_insurance_balance',\n description: 'Get insurance fund balance snapshots for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BNBUSDT'), limit: limitDefault.default(100), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await d.insuranceFundBalance({ symbol: normalizeSymbol(symbol), limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_index_price_constituents',\n description: 'Get the index price constituents (exchange weights) for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.indexPriceConstituents(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_premium_index_klines',\n description: 'Get premium index candlesticks for a symbol (mark price premium over index price).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), interval: KlineIntervalSchema, limit: limitDefault.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.premiumIndexKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'futures_rpi_depth',\n description: 'Get the RPI (Retail Price Improvement) order book depth for a symbol.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'), limit: z.number().int().positive().default(1000) }),\n handler: async ({ symbol, limit }) => textResult(await m.rpiDepth(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'futures_delivery_price',\n description: 'Get historical quarterly contract settlement/delivery prices for a pair.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('Base pair, e.g. BTCUSDT') }),\n handler: async ({ symbol }) => textResult(await d.deliveryPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'futures_symbol_adl_risk',\n description: 'Get the auto-deleveraging (ADL) risk level for one symbol or all symbols on the account (signed).',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await d.symbolAdlRisk(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_adl_quantile',\n description: 'Get the position ADL (auto-deleveraging) quantile estimation for one symbol or all symbols (signed).',\n inputSchema: z.object({ symbol: optSymbol }),\n handler: async ({ symbol }) => textResult(await d.adlQuantile(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'futures_force_orders',\n description: \"Get the user's force-liquidation orders (LIQUIDATION) and ADL orders for a symbol or all symbols (signed).\",\n inputSchema: z.object({\n symbol: optSymbol,\n autoCloseType: z.enum(['LIQUIDATION', 'ADL']).optional(),\n startTime,\n endTime,\n limit: limitDefault.default(50),\n }),\n handler: async ({ symbol, autoCloseType, startTime, endTime, limit }) =>\n textResult(\n await d.forceOrders({\n symbol: symbol ? normalizeSymbol(symbol) : undefined,\n autoCloseType,\n startTime,\n endTime,\n limit: Number(limit),\n }),\n ),\n },\n ];\n\n return tools;\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nexport interface PaperState {\n balance: number;\n positions: PaperPosition[];\n history: PaperEvent[];\n}\n\nexport interface PaperPosition {\n id: string;\n symbol: string;\n side: 'LONG' | 'SHORT';\n quantity: number;\n entryPrice: number;\n openedAt: string;\n}\n\nexport interface PaperEvent extends PaperPosition {\n type: 'open' | 'close';\n exitPrice?: number;\n realizedPnl?: number;\n closedAt?: string;\n}\n\nexport interface PaperContext {\n state: PaperState;\n client: BinanceClient;\n}\n\nexport function createPaperContext(client: BinanceClient, initialState: Partial<PaperState> = {}): PaperContext {\n return {\n client,\n state: { balance: initialState.balance ?? 10000, positions: initialState.positions ?? [], history: initialState.history ?? [] },\n };\n}\n\nfunction pnl(position: PaperPosition, price: number): number {\n const direction = position.side === 'LONG' ? 1 : -1;\n return (price - position.entryPrice) * position.quantity * direction;\n}\n\nexport function paperTools(ctx: PaperContext): ToolDefinition[] {\n const s = ctx.state;\n const t = ctx.client.futures.market;\n\n return [\n {\n name: 'paper_init',\n description: 'Initialize paper-trading state (reset balances, positions, history). No API keys required.',\n inputSchema: z.object({ balance: z.number().positive().default(10000).describe('Starting USDT balance') }),\n handler: async ({ balance }) => {\n s.balance = balance;\n s.positions = [];\n s.history = [];\n return textResult(s);\n },\n },\n {\n name: 'paper_balance',\n description: 'Get current paper-trading balance and open-position equity (uses live market prices if an open position exists). No API keys required.',\n inputSchema: z.object({}),\n handler: async () => textResult(s),\n },\n {\n name: 'paper_open_position',\n description: 'Open an in-memory paper position at the live ticker price (or a fixed price). No API keys required.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n side: z.enum(['LONG', 'SHORT']),\n quantity: z.number().positive(),\n price: z.number().positive().optional().describe('If omitted, uses live ticker price'),\n }),\n handler: async ({ symbol, side, quantity, price }) => {\n const sym = normalizeSymbol(symbol);\n const market = price ?? Number((await t.tickerPrice(sym)).price);\n const position: PaperPosition = { id: Date.now().toString(), symbol: sym, side, quantity, entryPrice: market, openedAt: new Date().toISOString() };\n s.positions.push(position);\n s.history.push({ type: 'open', ...position });\n return textResult(position);\n },\n },\n {\n name: 'paper_close_position',\n description: 'Close a paper position by id (or symbol) and realize PnL at the live/last price.',\n inputSchema: z.object({\n id: z.string().optional().describe('Position id from paper_open_position'),\n symbol: z.string().min(1).optional().describe('Close the position for this symbol'),\n price: z.number().positive().optional().describe('If omitted, uses live ticker price'),\n }),\n handler: async ({ id, symbol, price }) => {\n const idx = s.positions.findIndex((p) => (id ? p.id === id : normalizeSymbol(p.symbol) === normalizeSymbol(symbol ?? '')));\n if (idx === -1) throw new Error('paper position not found');\n const position = s.positions[idx];\n const market = price ?? Number((await t.tickerPrice(position.symbol)).price);\n const realizedPnl = pnl(position, market);\n s.balance += realizedPnl;\n const closed: PaperEvent = { type: 'close', ...position, exitPrice: market, realizedPnl, closedAt: new Date().toISOString() };\n s.positions.splice(idx, 1);\n s.history.push(closed);\n return textResult(closed);\n },\n },\n {\n name: 'paper_positions',\n description: 'List open paper positions with live unrealized PnL (marked to market).',\n inputSchema: z.object({}),\n handler: async () => {\n const out = await Promise.all(\n s.positions.map(async (p) => {\n const price = Number((await t.tickerPrice(p.symbol)).price);\n return { ...p, markPrice: price, unrealizedPnl: pnl(p, price) };\n }),\n );\n return textResult(out);\n },\n },\n {\n name: 'paper_history',\n description: 'List paper-trading history of open/close events with realized PnL.',\n inputSchema: z.object({}),\n handler: async () => textResult(s.history),\n },\n {\n name: 'paper_summary',\n description: 'Summarize paper-trading state: balance, open positions, trade count.',\n inputSchema: z.object({}),\n handler: async () =>\n textResult({ balance: s.balance, openPositions: s.positions.length, trades: s.history.length }),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport { KlineIntervalSchema } from '../types/market.types.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\nconst spotSymbol = z.string().min(1).describe('Spot pair, e.g. BTCUSDT');\nconst optionalSymbol = z.string().min(1).describe('Spot pair, e.g. BTCUSDT').optional();\nconst limit = z.number().int().positive().max(1000).default(100);\nconst startTime = z.number().int().positive().optional();\nconst endTime = z.number().int().positive().optional();\nconst side = z.enum(['BUY', 'SELL']);\n\nexport const spotOrderParamsSchema = z.object({\n symbol: spotSymbol,\n side,\n type: z.enum(['LIMIT', 'MARKET', 'LIMIT_MAKER', 'STOP_LOSS', 'STOP_LOSS_LIMIT', 'TAKE_PROFIT', 'TAKE_PROFIT_LIMIT']),\n quantity: z.union([z.string(), z.number()]).optional().describe('Base-asset quantity; omit if using quoteOrderQty'),\n quoteOrderQty: z.union([z.string(), z.number()]).optional().describe('Quote-asset quantity (e.g. spend 100 USDT on a MARKET order)'),\n price: z.union([z.string(), z.number()]).optional().describe('Required for LIMIT / STOP_LOSS_LIMIT / TAKE_PROFIT_LIMIT'),\n stopPrice: z.union([z.string(), z.number()]).optional().describe('Trigger price for STOP_LOSS / TAKE_PROFIT variants'),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional().describe('Required for LIMIT'),\n newClientOrderId: z.string().optional(),\n newOrderRespType: z.enum(['ACK', 'RESULT', 'FULL']).optional(),\n icebergQty: z.union([z.string(), z.number()]).optional(),\n selfTradePreventionMode: z.enum(['NONE', 'EXPIRE_TAKER', 'EXPIRE_MAKER', 'EXPIRE_BOTH']).optional(),\n});\n\nexport function spotTools(client: BinanceClient): ToolDefinition[] {\n const m = client.spot.market;\n const a = client.spot.account;\n const t = client.spot.trading;\n\n const tools: ToolDefinition[] = [\n // ---- Market data (public) ----\n {\n name: 'spot_ping',\n description: 'Test connectivity to the Binance Spot REST API.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.ping()),\n },\n {\n name: 'spot_server_time',\n description: 'Get the current Binance Spot server time in ms since epoch.',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.serverTime()),\n },\n {\n name: 'spot_exchange_info',\n description: 'Get Spot exchange trading rules and symbol metadata (status, base/quote assets, filters, permissions).',\n inputSchema: z.object({}),\n handler: async () => textResult(await m.exchangeInfo()),\n },\n {\n name: 'spot_ticker_price',\n description: 'Get the latest price for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.tickerPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_ticker_24hr',\n description: 'Get 24-hour rolling price change statistics for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.ticker24hr(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_book_ticker',\n description: 'Get the best bid/ask (top of book) for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.bookTicker(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_order_book',\n description: 'Get the Spot order book depth for a symbol (limits 5/10/20/50/100/500/1000/5000).',\n inputSchema: z.object({\n symbol: spotSymbol,\n limit: z.enum(['5', '10', '20', '50', '100', '500', '1000', '5000']).default('100'),\n }),\n handler: async ({ symbol, limit }) => textResult(await m.depth(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'spot_recent_trades',\n description: 'Get the most recent executed trades for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol, limit: limit.default(500) }),\n handler: async ({ symbol, limit }) => textResult(await m.trades(normalizeSymbol(symbol), Number(limit))),\n },\n {\n name: 'spot_historical_trades',\n description: 'Get older Spot trades for a symbol by fromId.',\n inputSchema: z.object({ symbol: spotSymbol, limit: limit.default(500), fromId: z.number().int().positive().optional() }),\n handler: async ({ symbol, limit, fromId }) =>\n textResult(await m.historicalTrades(normalizeSymbol(symbol), { limit: Number(limit), fromId })),\n },\n {\n name: 'spot_agg_trades',\n description: 'Get compressed/aggregate Spot trades for a symbol within an optional time window.',\n inputSchema: z.object({ symbol: spotSymbol, limit: limit.default(500), startTime, endTime }),\n handler: async ({ symbol, limit, startTime, endTime }) =>\n textResult(await m.aggTrades(normalizeSymbol(symbol), { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'spot_klines',\n description: 'Get Spot candlesticks (OHLCV). Intervals 1m…1M; max 1000 per request.',\n inputSchema: z.object({ symbol: spotSymbol, interval: KlineIntervalSchema, limit: limit.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.klines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'spot_ui_klines',\n description: 'Get Spot candlesticks via the optimized uiKlines endpoint (same shape as spot_klines).',\n inputSchema: z.object({ symbol: spotSymbol, interval: KlineIntervalSchema, limit: limit.default(500), startTime, endTime }),\n handler: async ({ symbol, interval, limit, startTime, endTime }) =>\n textResult(await m.uiKlines(normalizeSymbol(symbol), interval, { limit: Number(limit), startTime, endTime })),\n },\n {\n name: 'spot_avg_price',\n description: 'Get the current average price (5-minute rolling average) for a Spot symbol.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await m.avgPrice(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_rolling_window_ticker',\n description: 'Get rolling-window price change statistics (1d/7d/30d). Omit symbol for all symbols.',\n inputSchema: z.object({\n symbol: optionalSymbol,\n windowSize: z.enum(['1d', '7d', '30d']).optional(),\n }),\n handler: async ({ symbol, windowSize }) =>\n textResult(await m.rollingWindowTicker(symbol ? normalizeSymbol(symbol) : undefined, windowSize)),\n },\n {\n name: 'spot_trading_day_ticker',\n description: 'Get the Spot trading-day ticker (open/close/high/low/volume by UTC day). Omit symbol for all symbols.',\n inputSchema: z.object({ symbol: optionalSymbol, timeZone: z.string().optional(), type: z.enum(['FULL', 'MINI']).optional() }),\n handler: async ({ symbol, timeZone, type }) =>\n textResult(await m.tradingDayTicker(symbol ? normalizeSymbol(symbol) : undefined, { timeZone, type })),\n },\n\n // ---- Account (signed) ----\n {\n name: 'spot_account',\n description: 'Get the Spot account: balances (free/locked), commissions, permissions (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.account()),\n },\n {\n name: 'spot_my_trades',\n description: 'Get the Spot account trade list (filled trades) for a symbol with optional time range (signed).',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), startTime, endTime, fromId: z.number().int().positive().optional(), limit: limit.default(500) }),\n handler: async ({ symbol, orderId, startTime, endTime, fromId, limit }) =>\n textResult(await a.myTrades(normalizeSymbol(symbol), { orderId, startTime, endTime, fromId, limit: Number(limit) })),\n },\n {\n name: 'spot_my_prevented_matches',\n description: 'Get Spot orders that were expired by the self-trade-prevention (STP) mechanism (signed).',\n inputSchema: z.object({ symbol: spotSymbol, preventedMatchId: z.number().int().positive().optional(), orderId: z.number().int().positive().optional(), limit: limit.default(500) }),\n handler: async ({ symbol, preventedMatchId, orderId, limit }) =>\n textResult(await a.myPreventedMatches(normalizeSymbol(symbol), { preventedMatchId, orderId, limit: Number(limit) })),\n },\n {\n name: 'spot_account_commission',\n description: 'Get the Spot account commission rates for a symbol (signed).',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await a.accountCommission(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_rate_limit_order',\n description: 'Query the current Spot order rate limit usage (signed).',\n inputSchema: z.object({}),\n handler: async () => textResult(await a.rateLimitOrder()),\n },\n\n // ---- Trading (signed) ----\n {\n name: 'spot_new_order',\n description: 'Place a new Spot order. Types: LIMIT, MARKET, LIMIT_MAKER, STOP_LOSS, STOP_LOSS_LIMIT, TAKE_PROFIT, TAKE_PROFIT_LIMIT. For MARKET orders use quantity OR quoteOrderQty. Signed.',\n inputSchema: spotOrderParamsSchema,\n handler: async (args) => textResult(await t.createOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_test_order',\n description: 'Validate a Spot order without submitting it. Signed.',\n inputSchema: spotOrderParamsSchema,\n handler: async (args) => textResult(await t.testOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_get_order',\n description: 'Query a specific Spot order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await t.getOrder(normalizeSymbol(symbol), { orderId, origClientOrderId })),\n },\n {\n name: 'spot_cancel_order',\n description: 'Cancel a specific open Spot order by orderId or client order id. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), origClientOrderId: z.string().optional(), newClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderId, origClientOrderId, newClientOrderId }) =>\n textResult(await t.cancelOrder(normalizeSymbol(symbol), { orderId, origClientOrderId, newClientOrderId })),\n },\n {\n name: 'spot_open_orders',\n description: 'Get all current open Spot orders, for one symbol or all symbols. Signed.',\n inputSchema: z.object({ symbol: optionalSymbol }),\n handler: async ({ symbol }) => textResult(await t.getOpenOrders(symbol ? normalizeSymbol(symbol) : undefined)),\n },\n {\n name: 'spot_all_orders',\n description: 'Get historical Spot orders for a symbol with optional time range. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderId: z.number().int().positive().optional(), startTime, endTime, limit }),\n handler: async ({ symbol, orderId, startTime, endTime, limit }) =>\n textResult(await t.getAllOrders(normalizeSymbol(symbol), { orderId, startTime, endTime, limit })),\n },\n {\n name: 'spot_cancel_open_orders',\n description: 'Cancel all open Spot orders for a symbol. Signed.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await t.cancelOpenOrders(normalizeSymbol(symbol))),\n },\n {\n name: 'spot_cancel_replace_order',\n description: 'Cancel an existing Spot order and place a new one on the same symbol (cancel-replace). Signed.',\n inputSchema: z.object({\n symbol: spotSymbol,\n side,\n type: z.enum(['LIMIT', 'MARKET', 'STOP_LOSS', 'STOP_LOSS_LIMIT', 'TAKE_PROFIT', 'TAKE_PROFIT_LIMIT']),\n cancelReplaceMode: z.enum(['STOP_ON_FAILURE', 'ALLOW_FAILURE']).default('STOP_ON_FAILURE'),\n cancelOrderId: z.number().int().positive().optional(),\n cancelOrigClientOrderId: z.string().optional(),\n cancelNewClientOrderId: z.string().optional(),\n quantity: z.union([z.string(), z.number()]).optional(),\n price: z.union([z.string(), z.number()]).optional(),\n timeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional(),\n newClientOrderId: z.string().optional(),\n }),\n handler: async (args) => textResult(await t.cancelReplaceOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_new_oco_order',\n description: 'Place a new Spot OCO (one-cancels-other) order: a stop-loss limit + a limit-maker take-profit. Signed.',\n inputSchema: z.object({\n symbol: spotSymbol,\n side,\n quantity: z.union([z.string(), z.number()]).describe('Total base-asset quantity for both legs'),\n price: z.union([z.string(), z.number()]).describe('Limit (take-profit) price'),\n stopPrice: z.union([z.string(), z.number()]).describe('Stop-loss trigger price'),\n stopLimitPrice: z.union([z.string(), z.number()]).optional().describe('Stop-loss limit price (defaults to stopPrice)'),\n stopLimitTimeInForce: z.enum(['GTC', 'IOC', 'FOK']).optional(),\n listClientOrderId: z.string().optional(),\n limitClientOrderId: z.string().optional(),\n stopClientOrderId: z.string().optional(),\n }),\n handler: async (args) => textResult(await t.createOCOOrder({ ...args, symbol: normalizeSymbol(args.symbol) })),\n },\n {\n name: 'spot_cancel_oco_order',\n description: 'Cancel an entire Spot OCO order list by orderListId or listClientOrderId. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderListId: z.number().int().positive().optional(), listClientOrderId: z.string().optional(), newClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderListId, listClientOrderId, newClientOrderId }) =>\n textResult(await t.cancelOCOOrder(normalizeSymbol(symbol), { orderListId, listClientOrderId, newClientOrderId })),\n },\n {\n name: 'spot_get_oco_order',\n description: 'Query a Spot OCO order list by orderListId or listClientOrderId. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, orderListId: z.number().int().positive().optional(), origClientOrderId: z.string().optional() }),\n handler: async ({ symbol, orderListId, origClientOrderId }) =>\n textResult(await t.getOCOOrder(normalizeSymbol(symbol), { orderListId, origClientOrderId })),\n },\n {\n name: 'spot_open_oco_orders',\n description: 'Get all current open Spot OCO order lists. Signed.',\n inputSchema: z.object({}),\n handler: async () => textResult(await t.getOpenOCOOrders()),\n },\n {\n name: 'spot_all_oco_orders',\n description: 'Get historical Spot OCO order lists for a symbol with optional time range. Signed.',\n inputSchema: z.object({ symbol: spotSymbol, fromId: z.number().int().positive().optional(), startTime, endTime, limit }),\n handler: async ({ symbol, fromId, startTime, endTime, limit }) =>\n textResult(await t.getAllOCOOrders(normalizeSymbol(symbol), { fromId, startTime, endTime, limit })),\n },\n {\n name: 'spot_cancel_open_oco_orders',\n description: 'Cancel all open Spot OCO order lists for a symbol. Signed.',\n inputSchema: z.object({ symbol: spotSymbol }),\n handler: async ({ symbol }) => textResult(await t.cancelOpenOCOOrders(normalizeSymbol(symbol))),\n },\n\n // ---- User data stream (signed) ----\n {\n name: 'spot_ws_start_user_stream',\n description: 'Start the Spot user data stream: creates a listenKey, connects the private WebSocket, and begins keep-alive. Emits executionReport, outboundAccountPosition, balanceUpdate, listStatus.',\n inputSchema: z.object({}),\n handler: async () => textResult({ listenKey: await client.startSpotUserStream() }),\n },\n {\n name: 'spot_ws_stop_user_stream',\n description: 'Stop the Spot user data stream: closes the private WebSocket and invalidates the listenKey.',\n inputSchema: z.object({}),\n handler: async () => {\n client.closeSpotUserStream();\n return textResult({ stopped: true });\n },\n },\n ];\n\n return tools;\n}\n","import { z } from 'zod';\nimport type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ToolDefinition } from './types.js';\nimport { textResult, normalizeSymbol } from './types.js';\n\ninterface WsBuffer {\n subscriptions: Set<string>;\n events: { stream: string; payload: unknown; ts: number }[];\n}\n\nconst buffers = new Map<BinanceClient, WsBuffer>();\nconst MAX_BUFFER = 500;\n\nfunction bufferFor(client: BinanceClient): WsBuffer {\n let buffer = buffers.get(client);\n if (!buffer) {\n buffer = { subscriptions: new Set(), events: [] };\n buffers.set(client, buffer);\n client.futures.ws.on('message', (stream: string, payload: unknown) => {\n buffer!.events.push({ stream, payload, ts: Date.now() });\n if (buffer!.events.length > MAX_BUFFER) buffer!.events.splice(0, buffer!.events.length - MAX_BUFFER);\n });\n }\n return buffer;\n}\n\nexport function getBufferedWsEvents(client: BinanceClient, limit = 50): unknown[] {\n return bufferFor(client).events.slice(-limit);\n}\n\nexport function clearBufferedWsEvents(client: BinanceClient): void {\n bufferFor(client).events = [];\n}\n\nexport function wsTools(client: BinanceClient): ToolDefinition[] {\n const buffer = bufferFor(client);\n\n return [\n {\n name: 'futures_ws_subscribe',\n description:\n 'Subscribe to real-time market data streams. Topic format: <symbol>@<stream>, e.g. btcusdt@aggTrade, btcusdt@kline_1m, btcusdt@depth20, btcusdt@markPrice@1s, btcusdt@bookTicker, btcusdt@ticker, btcusdt@miniTicker, btcusdt@forceOrder, or all-market topics !ticker@arr, !bookTicker, !markPrice@arr, !forceOrder@arr, !miniTicker@arr. Multiple topics can be passed at once.',\n inputSchema: z.object({\n topics: z.array(z.string().min(1)).min(1).describe('Stream topics, e.g. [\"btcusdt@aggTrade\", \"btcusdt@kline_1m\"]'),\n }),\n handler: async ({ topics }) => {\n const normalized = topics.map((t: string) => t.trim().toLowerCase());\n client.futures.ws.subscribe(normalized);\n normalized.forEach((t: string) => buffer.subscriptions.add(t));\n return textResult({ subscribed: normalized, active: [...buffer.subscriptions] });\n },\n },\n {\n name: 'futures_ws_unsubscribe',\n description: 'Unsubscribe from previously subscribed market data streams.',\n inputSchema: z.object({ topics: z.array(z.string().min(1)).min(1) }),\n handler: async ({ topics }) => {\n const normalized = topics.map((t: string) => t.trim().toLowerCase());\n client.futures.ws.unsubscribe(normalized);\n normalized.forEach((t: string) => buffer.subscriptions.delete(t));\n return textResult({ unsubscribed: normalized, active: [...buffer.subscriptions] });\n },\n },\n {\n name: 'futures_ws_subscriptions',\n description: 'List the currently subscribed WebSocket market streams for this client.',\n inputSchema: z.object({}),\n handler: async () => textResult({ active: [...buffer.subscriptions] }),\n },\n {\n name: 'futures_ws_events',\n description:\n 'Read the buffered real-time payloads received since the last read for the subscribed streams (aggregate trades, klines, depth deltas, mark price, book tickers, tickers, force orders). Payloads are parsed; depth deltas must be applied to a snapshot from futures_order_book.',\n inputSchema: z.object({ limit: z.number().int().min(1).max(200).default(50) }),\n handler: async ({ limit }) => textResult(getBufferedWsEvents(client, limit)),\n },\n {\n name: 'futures_ws_clear_events',\n description: 'Clear the buffered WebSocket events so the next read only returns new payloads.',\n inputSchema: z.object({}),\n handler: async () => {\n clearBufferedWsEvents(client);\n return textResult({ cleared: true });\n },\n },\n {\n name: 'futures_ws_start_user_stream',\n description:\n 'Start the user data stream: creates a listenKey, connects the private WebSocket, and begins a 30-minute keep-alive. Emits private events (ACCOUNT_UPDATE, ORDER_TRADE_UPDATE, MARGIN_CALL, ACCOUNT_CONFIG_UPDATE, listenKeyExpired) that the application can consume from the client.',\n inputSchema: z.object({}),\n handler: async () => textResult({ listenKey: await client.startUserStream() }),\n },\n {\n name: 'futures_ws_stop_user_stream',\n description: 'Stop the user data stream: closes the private WebSocket and invalidates the listenKey.',\n inputSchema: z.object({}),\n handler: async () => {\n client.closeUserStream();\n return textResult({ stopped: true });\n },\n },\n {\n name: 'futures_ws_api_order_status',\n description: 'Query an order via the signed WebSocket API (order.status) — lower-latency alternative to futures_get_order.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n orderId: z.number().int().positive().optional(),\n origClientOrderId: z.string().optional(),\n }),\n handler: async ({ symbol, orderId, origClientOrderId }) =>\n textResult(await client.futures.wsApi.orderStatus({ symbol: normalizeSymbol(symbol), orderId, origClientOrderId })),\n },\n {\n name: 'futures_ws_api_account_status',\n description: 'Get account info via the signed WebSocket API (account.status).',\n inputSchema: z.object({}),\n handler: async () => textResult(await client.futures.wsApi.accountStatus()),\n },\n {\n name: 'futures_ws_api_account_position',\n description: 'Get current positions via the signed WebSocket API (account.position).',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional() }),\n handler: async ({ symbol }) =>\n textResult(await client.futures.wsApi.accountPosition(symbol ? { symbol: normalizeSymbol(symbol) } : {})),\n },\n {\n name: 'futures_ws_api_user_data_stream_start',\n description: 'Create a listenKey via the signed WebSocket API (userDataStream.start) — no REST call required.',\n inputSchema: z.object({}),\n handler: async () => textResult(await client.futures.wsApi.userDataStreamStart()),\n },\n {\n name: 'futures_ws_api_user_data_stream_stop',\n description: 'Invalidate a listenKey via the signed WebSocket API (userDataStream.stop).',\n inputSchema: z.object({ listenKey: z.string().min(1) }),\n handler: async ({ listenKey }) => textResult(await client.futures.wsApi.userDataStreamStop(listenKey)),\n },\n {\n name: 'futures_ws_api_ticker_price',\n description: 'Get latest price via the unsigned WebSocket API (ticker.price); omit symbol for all symbols.',\n inputSchema: z.object({ symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT').optional() }),\n handler: async ({ symbol }) =>\n textResult(await client.futures.wsApi.tickerPrice(symbol ? { symbol: normalizeSymbol(symbol) } : {})),\n },\n {\n name: 'futures_ws_api_order_book',\n description: 'Get order-book depth via the unsigned WebSocket API (depth).',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('USD-M pair, e.g. BTCUSDT'),\n limit: z.enum(['5', '10', '20', '50', '100', '500', '1000']).optional(),\n }),\n handler: async ({ symbol, limit }) =>\n textResult(await client.futures.wsApi.depth({ symbol: normalizeSymbol(symbol), limit })),\n },\n ];\n}\n","import type { BinanceClient } from '../client/BinanceClient.js';\nimport type { ExecutionBackend } from '../execution/Gateway.js';\nimport type { PaperTradingOptions } from '../paper/PaperTradingEngine.js';\nimport { accountTools } from './account.tools.js';\nimport { derivedTools } from './derived.tools.js';\nimport { executionTools } from './execution.tools.js';\nimport { marketDataTools } from './market-data.tools.js';\nimport { createPaperContext, type PaperContext, paperTools } from './paper.tools.js';\nimport { spotTools } from './spot.tools.js';\nimport { tradingTools } from './trading.tools.js';\nimport { wsTools } from './ws.tools.js';\nimport type { ToolDefinition } from './types.js';\nimport { toToolList } from './types.js';\n\nexport type { ToolDefinition, ToolContext } from './types.js';\nexport { toJsonSchema, toOpenAITool, toAnthropicTool, toMCPTool, toToolList, textResult } from './types.js';\nexport { marketDataTools } from './market-data.tools.js';\nexport { accountTools } from './account.tools.js';\nexport { tradingTools } from './trading.tools.js';\nexport { executionTools } from './execution.tools.js';\nexport { spotTools } from './spot.tools.js';\nexport { derivedTools } from './derived.tools.js';\nexport { wsTools, getBufferedWsEvents, clearBufferedWsEvents } from './ws.tools.js';\nexport { createPaperContext, paperTools, type PaperState, type PaperPosition, type PaperEvent, type PaperContext } from './paper.tools.js';\n\nexport interface FuturesToolkitOptions {\n /**\n * Backend the execution tools use when a call does not specify one.\n * Default 'live'. Set 'paper' to run the whole toolkit against the\n * simulator (no API keys required, public market data only).\n */\n executionBackend?: ExecutionBackend;\n /** Simulator configuration for the paper backend (start balance, models). */\n paper?: PaperTradingOptions;\n}\n\nexport interface FuturesToolkit {\n client: BinanceClient;\n tools: ToolDefinition[];\n market: ToolDefinition[];\n account: ToolDefinition[];\n trading: ToolDefinition[];\n spot: ToolDefinition[];\n ws: ToolDefinition[];\n /** Composite tools that fan out over several endpoints. */\n derived: ToolDefinition[];\n paper: ToolDefinition[];\n paperContext: PaperContext;\n /** Idempotent, reconciling, backend-routed order tools (v2.3). */\n execution: ToolDefinition[];\n /** The gateway the execution tools route through. */\n gateway: import('../execution/Gateway.js').ExecutionGateway;\n}\n\nexport function createFuturesToolkit(client: BinanceClient, options: FuturesToolkitOptions = {}): FuturesToolkit {\n const market = marketDataTools(client);\n const account = accountTools(client);\n const trading = tradingTools(client);\n const spot = spotTools(client);\n const ws = wsTools(client);\n const derived = derivedTools(client);\n const paperContext = createPaperContext(client);\n const paper = paperTools(paperContext);\n const gateway = client.createExecutionGateway({\n paper: options.paper,\n defaultBackend: options.executionBackend,\n });\n const execution = executionTools(gateway, client);\n return {\n client,\n tools: [...market, ...account, ...trading, ...spot, ...ws, ...derived, ...paper, ...execution],\n market,\n account,\n trading,\n spot,\n ws,\n derived,\n paper,\n paperContext,\n execution,\n gateway,\n };\n}\n\nexport function toolkitToFormats(toolkit: FuturesToolkit): {\n openai: Record<string, unknown>[];\n anthropic: Record<string, unknown>[];\n mcp: Record<string, unknown>[];\n} {\n return {\n openai: toToolList(toolkit.tools, 'openai'),\n anthropic: toToolList(toolkit.tools, 'anthropic'),\n mcp: toToolList(toolkit.tools, 'mcp'),\n };\n}\n","/**\n * Single source of truth for the package version string.\n *\n * Read by:\n * - {@link ./index.js} — re-exports as the public `VERSION` constant.\n * - {@link ../mcp/server.js} — the MCP server identifies itself with this\n * value when negotiating with hosts (was previously hard-coded as\n * `'2.0.0'`, which drifted from `package.json`).\n *\n * Update in lockstep with the `version` field in `package.json` and the\n * `[Unreleased]` / latest release section in `CHANGELOG.md`.\n */\nexport const VERSION = '3.0.0';\n"],"mappings":"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","names":["num","symbol","rows","rows","rows","rows","rows","canonicalPath","cryptoSign","axios","Bottleneck","import_node_events","WebSocket","u","symbol","contractType","symbol","symbol","contractType","conn","import_node_events","import_ws","import_node_crypto","WebSocket","reason","import_node_events","sub","import_zod","http","symbol","import_zod","http","symbol","import_zod","http","import_zod","http","symbol","import_zod","http","symbol","limit","http","symbol","import_zod","http","import_node_crypto","symbol","intentId","symbol","execution","import_node_crypto","import_ws","buildQueryString","WebSocket","import_zod","http","symbol","import_zod","symbol","period","limit","http","contractType","symbol","limit","symbol","symbol","period","import_zod","http","symbol","http","import_node_crypto","import_ws","buildQueryString","WebSocket","import_zod","http","symbol","http","contractType","symbol","period","http","symbol","http","symbol","symbol","side","backend","backend","symbol","intentId","symbol","limit","side","symbol","side","symbol","import_zod","import_zod","symbol","startTime","endTime","limit","import_zod","period","import_zod","import_zod","symbol","optionalSymbol","limit","startTime","endTime","symbol","import_zod","startTime","endTime","symbol","limit","contractType","period","import_zod","symbol","side","import_zod","optionalSymbol","limit","startTime","endTime","side","symbol","import_zod","limit","symbol","http"]}
|