@catalyst-team/poly-sdk 0.3.0 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -1
- package/README.zh-CN.md +2 -0
- package/dist/scripts/dip-arb/auto-trade.d.ts +20 -0
- package/dist/scripts/dip-arb/auto-trade.d.ts.map +1 -0
- package/dist/scripts/dip-arb/auto-trade.js +373 -0
- package/dist/scripts/dip-arb/auto-trade.js.map +1 -0
- package/dist/scripts/dip-arb/example-basic.d.ts +30 -0
- package/dist/scripts/dip-arb/example-basic.d.ts.map +1 -0
- package/dist/scripts/dip-arb/example-basic.js +222 -0
- package/dist/scripts/dip-arb/example-basic.js.map +1 -0
- package/dist/scripts/dip-arb/redeem-positions.d.ts +11 -0
- package/dist/scripts/dip-arb/redeem-positions.d.ts.map +1 -0
- package/dist/scripts/dip-arb/redeem-positions.js +201 -0
- package/dist/scripts/dip-arb/redeem-positions.js.map +1 -0
- package/dist/scripts/dip-arb/scan-markets.d.ts +6 -0
- package/dist/scripts/dip-arb/scan-markets.d.ts.map +1 -0
- package/dist/scripts/dip-arb/scan-markets.js +73 -0
- package/dist/scripts/dip-arb/scan-markets.js.map +1 -0
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/{__tests__ → src/__tests__}/integration/data-api.integration.test.js +21 -18
- package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/{__tests__ → src/__tests__}/integration/market-service.integration.test.js +7 -0
- package/dist/src/__tests__/integration/market-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/catalyst/catalyst-query-service.d.ts +109 -0
- package/dist/src/catalyst/catalyst-query-service.d.ts.map +1 -0
- package/dist/src/catalyst/catalyst-query-service.js +141 -0
- package/dist/src/catalyst/catalyst-query-service.js.map +1 -0
- package/dist/src/catalyst/catalyst-realtime-service.d.ts +40 -0
- package/dist/src/catalyst/catalyst-realtime-service.d.ts.map +1 -0
- package/dist/src/catalyst/catalyst-realtime-service.js +125 -0
- package/dist/src/catalyst/catalyst-realtime-service.js.map +1 -0
- package/dist/src/catalyst/index.d.ts +4 -0
- package/dist/src/catalyst/index.d.ts.map +1 -0
- package/dist/src/catalyst/index.js +4 -0
- package/dist/src/catalyst/index.js.map +1 -0
- package/dist/src/catalyst/types.d.ts +178 -0
- package/dist/src/catalyst/types.d.ts.map +1 -0
- package/dist/src/catalyst/types.js +2 -0
- package/dist/src/catalyst/types.js.map +1 -0
- package/dist/src/clients/bridge-client.d.ts.map +1 -0
- package/dist/src/clients/bridge-client.js.map +1 -0
- package/dist/{clients → src/clients}/ctf-client.d.ts +6 -4
- package/dist/src/clients/ctf-client.d.ts.map +1 -0
- package/dist/src/clients/ctf-client.js.map +1 -0
- package/dist/{clients → src/clients}/data-api.d.ts +94 -20
- package/dist/src/clients/data-api.d.ts.map +1 -0
- package/dist/{clients → src/clients}/data-api.js +119 -52
- package/dist/src/clients/data-api.js.map +1 -0
- package/dist/{clients → src/clients}/gamma-api.d.ts +74 -0
- package/dist/src/clients/gamma-api.d.ts.map +1 -0
- package/dist/{clients → src/clients}/gamma-api.js +7 -0
- package/dist/src/clients/gamma-api.js.map +1 -0
- package/dist/src/clients/subgraph.d.ts.map +1 -0
- package/dist/src/clients/subgraph.js.map +1 -0
- package/dist/src/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/src/core/cache-adapter-bridge.js.map +1 -0
- package/dist/{core → src/core}/cache.d.ts +2 -0
- package/dist/src/core/cache.d.ts.map +1 -0
- package/dist/{core → src/core}/cache.js +4 -0
- package/dist/src/core/cache.js.map +1 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/{core → src/core}/rate-limiter.d.ts +2 -1
- package/dist/src/core/rate-limiter.d.ts.map +1 -0
- package/dist/{core → src/core}/rate-limiter.js +7 -0
- package/dist/src/core/rate-limiter.js.map +1 -0
- package/dist/{core → src/core}/types.d.ts +105 -1
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +49 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/types.test.d.ts.map +1 -0
- package/dist/src/core/types.test.js.map +1 -0
- package/dist/src/core/unified-cache.d.ts.map +1 -0
- package/dist/src/core/unified-cache.js.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +24 -5
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +38 -4
- package/dist/src/index.js.map +1 -0
- package/dist/src/insider-scan/index.d.ts +3 -0
- package/dist/src/insider-scan/index.d.ts.map +1 -0
- package/dist/src/insider-scan/index.js +3 -0
- package/dist/src/insider-scan/index.js.map +1 -0
- package/dist/src/insider-scan/insider-scan-service.d.ts +63 -0
- package/dist/src/insider-scan/insider-scan-service.d.ts.map +1 -0
- package/dist/src/insider-scan/insider-scan-service.js +153 -0
- package/dist/src/insider-scan/insider-scan-service.js.map +1 -0
- package/dist/src/insider-scan/types.d.ts +205 -0
- package/dist/src/insider-scan/types.d.ts.map +1 -0
- package/dist/src/insider-scan/types.js +7 -0
- package/dist/src/insider-scan/types.js.map +1 -0
- package/dist/src/services/arbitrage-service.d.ts.map +1 -0
- package/dist/{services → src/services}/arbitrage-service.js +14 -4
- package/dist/src/services/arbitrage-service.js.map +1 -0
- package/dist/src/services/authorization-service.d.ts.map +1 -0
- package/dist/src/services/authorization-service.js.map +1 -0
- package/dist/src/services/binance-service.d.ts +154 -0
- package/dist/src/services/binance-service.d.ts.map +1 -0
- package/dist/src/services/binance-service.js +266 -0
- package/dist/src/services/binance-service.js.map +1 -0
- package/dist/src/services/dip-arb-service.d.ts +245 -0
- package/dist/src/services/dip-arb-service.d.ts.map +1 -0
- package/dist/src/services/dip-arb-service.js +1865 -0
- package/dist/src/services/dip-arb-service.js.map +1 -0
- package/dist/src/services/dip-arb-types.d.ts +553 -0
- package/dist/src/services/dip-arb-types.d.ts.map +1 -0
- package/dist/src/services/dip-arb-types.js +164 -0
- package/dist/src/services/dip-arb-types.js.map +1 -0
- package/dist/src/services/market-service.d.ts +431 -0
- package/dist/src/services/market-service.d.ts.map +1 -0
- package/dist/{services → src/services}/market-service.js +501 -17
- package/dist/src/services/market-service.js.map +1 -0
- package/dist/{services → src/services}/onchain-service.d.ts +10 -2
- package/dist/src/services/onchain-service.d.ts.map +1 -0
- package/dist/{services → src/services}/onchain-service.js +8 -0
- package/dist/src/services/onchain-service.js.map +1 -0
- package/dist/{services → src/services}/realtime-service-v2.d.ts +6 -0
- package/dist/src/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/{services → src/services}/realtime-service-v2.js +44 -8
- package/dist/src/services/realtime-service-v2.js.map +1 -0
- package/dist/src/services/smart-money-service.d.ts +769 -0
- package/dist/src/services/smart-money-service.d.ts.map +1 -0
- package/dist/src/services/smart-money-service.js +1448 -0
- package/dist/src/services/smart-money-service.js.map +1 -0
- package/dist/src/services/swap-service.d.ts.map +1 -0
- package/dist/src/services/swap-service.js.map +1 -0
- package/dist/{services → src/services}/trading-service.d.ts +26 -0
- package/dist/src/services/trading-service.d.ts.map +1 -0
- package/dist/{services → src/services}/trading-service.js +72 -1
- package/dist/src/services/trading-service.js.map +1 -0
- package/dist/{services → src/services}/wallet-service.d.ts +81 -4
- package/dist/src/services/wallet-service.d.ts.map +1 -0
- package/dist/{services → src/services}/wallet-service.js +126 -8
- package/dist/src/services/wallet-service.js.map +1 -0
- package/dist/src/signal/index.d.ts +8 -0
- package/dist/src/signal/index.d.ts.map +1 -0
- package/dist/src/signal/index.js +7 -0
- package/dist/src/signal/index.js.map +1 -0
- package/dist/src/signal/signal-service.d.ts +89 -0
- package/dist/src/signal/signal-service.d.ts.map +1 -0
- package/dist/src/signal/signal-service.js +226 -0
- package/dist/src/signal/signal-service.js.map +1 -0
- package/dist/src/signal/types.d.ts +280 -0
- package/dist/src/signal/types.d.ts.map +1 -0
- package/dist/src/signal/types.js +7 -0
- package/dist/src/signal/types.js.map +1 -0
- package/dist/src/utils/price-utils.d.ts.map +1 -0
- package/dist/src/utils/price-utils.js.map +1 -0
- package/dist/src/utils/price-utils.test.d.ts.map +1 -0
- package/dist/src/utils/price-utils.test.js.map +1 -0
- package/dist/src/wallet-report/index.d.ts +3 -0
- package/dist/src/wallet-report/index.d.ts.map +1 -0
- package/dist/src/wallet-report/index.js +3 -0
- package/dist/src/wallet-report/index.js.map +1 -0
- package/dist/src/wallet-report/types.d.ts +187 -0
- package/dist/src/wallet-report/types.d.ts.map +1 -0
- package/dist/src/wallet-report/types.js +7 -0
- package/dist/src/wallet-report/types.js.map +1 -0
- package/dist/src/wallet-report/wallet-report-service.d.ts +91 -0
- package/dist/src/wallet-report/wallet-report-service.d.ts.map +1 -0
- package/dist/src/wallet-report/wallet-report-service.js +208 -0
- package/dist/src/wallet-report/wallet-report-service.js.map +1 -0
- package/dist/src/wallets/hot-wallet-service.d.ts +162 -0
- package/dist/src/wallets/hot-wallet-service.d.ts.map +1 -0
- package/dist/src/wallets/hot-wallet-service.js +251 -0
- package/dist/src/wallets/hot-wallet-service.js.map +1 -0
- package/dist/src/wallets/index.d.ts +15 -0
- package/dist/src/wallets/index.d.ts.map +1 -0
- package/dist/src/wallets/index.js +26 -0
- package/dist/src/wallets/index.js.map +1 -0
- package/package.json +7 -7
- package/dist/__tests__/clob-api.test.d.ts +0 -5
- package/dist/__tests__/clob-api.test.d.ts.map +0 -1
- package/dist/__tests__/clob-api.test.js +0 -240
- package/dist/__tests__/clob-api.test.js.map +0 -1
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +0 -1
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/bridge-client.integration.test.js.map +0 -1
- package/dist/__tests__/integration/clob-api.integration.test.d.ts +0 -13
- package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/clob-api.integration.test.js +0 -170
- package/dist/__tests__/integration/clob-api.integration.test.js.map +0 -1
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/ctf-client.integration.test.js.map +0 -1
- package/dist/__tests__/integration/data-api.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/data-api.integration.test.js.map +0 -1
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/gamma-api.integration.test.js.map +0 -1
- package/dist/__tests__/integration/market-service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/market-service.integration.test.js.map +0 -1
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +0 -1
- package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/trading-service.integration.test.js.map +0 -1
- package/dist/__tests__/test-utils.d.ts.map +0 -1
- package/dist/__tests__/test-utils.js.map +0 -1
- package/dist/clients/bridge-client.d.ts.map +0 -1
- package/dist/clients/bridge-client.js.map +0 -1
- package/dist/clients/clob-api.d.ts +0 -391
- package/dist/clients/clob-api.d.ts.map +0 -1
- package/dist/clients/clob-api.js +0 -448
- package/dist/clients/clob-api.js.map +0 -1
- package/dist/clients/ctf-client.d.ts.map +0 -1
- package/dist/clients/ctf-client.js.map +0 -1
- package/dist/clients/data-api.d.ts.map +0 -1
- package/dist/clients/data-api.js.map +0 -1
- package/dist/clients/gamma-api.d.ts.map +0 -1
- package/dist/clients/gamma-api.js.map +0 -1
- package/dist/clients/subgraph.d.ts.map +0 -1
- package/dist/clients/subgraph.js.map +0 -1
- package/dist/clients/trading-client.d.ts +0 -252
- package/dist/clients/trading-client.d.ts.map +0 -1
- package/dist/clients/trading-client.js +0 -543
- package/dist/clients/trading-client.js.map +0 -1
- package/dist/clients/websocket-manager.d.ts +0 -103
- package/dist/clients/websocket-manager.d.ts.map +0 -1
- package/dist/clients/websocket-manager.js +0 -200
- package/dist/clients/websocket-manager.js.map +0 -1
- package/dist/core/cache-adapter-bridge.d.ts.map +0 -1
- package/dist/core/cache-adapter-bridge.js.map +0 -1
- package/dist/core/cache.d.ts.map +0 -1
- package/dist/core/cache.js.map +0 -1
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js.map +0 -1
- package/dist/core/rate-limiter.d.ts.map +0 -1
- package/dist/core/rate-limiter.js.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -19
- package/dist/core/types.js.map +0 -1
- package/dist/core/types.test.d.ts.map +0 -1
- package/dist/core/types.test.js.map +0 -1
- package/dist/core/unified-cache.d.ts.map +0 -1
- package/dist/core/unified-cache.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/services/arbitrage-service.d.ts.map +0 -1
- package/dist/services/arbitrage-service.js.map +0 -1
- package/dist/services/authorization-service.d.ts.map +0 -1
- package/dist/services/authorization-service.js.map +0 -1
- package/dist/services/market-service.d.ts +0 -208
- package/dist/services/market-service.d.ts.map +0 -1
- package/dist/services/market-service.js.map +0 -1
- package/dist/services/onchain-service.d.ts.map +0 -1
- package/dist/services/onchain-service.js.map +0 -1
- package/dist/services/realtime-service-v2.d.ts.map +0 -1
- package/dist/services/realtime-service-v2.js.map +0 -1
- package/dist/services/realtime-service.d.ts +0 -82
- package/dist/services/realtime-service.d.ts.map +0 -1
- package/dist/services/realtime-service.js +0 -182
- package/dist/services/realtime-service.js.map +0 -1
- package/dist/services/smart-money-service.d.ts +0 -196
- package/dist/services/smart-money-service.d.ts.map +0 -1
- package/dist/services/smart-money-service.js +0 -358
- package/dist/services/smart-money-service.js.map +0 -1
- package/dist/services/swap-service.d.ts.map +0 -1
- package/dist/services/swap-service.js.map +0 -1
- package/dist/services/trading-service.d.ts.map +0 -1
- package/dist/services/trading-service.js.map +0 -1
- package/dist/services/wallet-service.d.ts.map +0 -1
- package/dist/services/wallet-service.js.map +0 -1
- package/dist/utils/price-utils.d.ts.map +0 -1
- package/dist/utils/price-utils.js.map +0 -1
- package/dist/utils/price-utils.test.d.ts.map +0 -1
- package/dist/utils/price-utils.test.js.map +0 -1
- /package/dist/{__tests__ → src/__tests__}/integration/arbitrage-service.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/arbitrage-service.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/bridge-client.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/bridge-client.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/ctf-client.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/ctf-client.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/data-api.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/gamma-api.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/gamma-api.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/market-service.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/realtime-service-v2.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/realtime-service-v2.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/trading-service.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/trading-service.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/test-utils.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/test-utils.js +0 -0
- /package/dist/{clients → src/clients}/bridge-client.d.ts +0 -0
- /package/dist/{clients → src/clients}/bridge-client.js +0 -0
- /package/dist/{clients → src/clients}/ctf-client.js +0 -0
- /package/dist/{clients → src/clients}/subgraph.d.ts +0 -0
- /package/dist/{clients → src/clients}/subgraph.js +0 -0
- /package/dist/{core → src/core}/cache-adapter-bridge.d.ts +0 -0
- /package/dist/{core → src/core}/cache-adapter-bridge.js +0 -0
- /package/dist/{core → src/core}/errors.d.ts +0 -0
- /package/dist/{core → src/core}/errors.js +0 -0
- /package/dist/{core → src/core}/types.test.d.ts +0 -0
- /package/dist/{core → src/core}/types.test.js +0 -0
- /package/dist/{core → src/core}/unified-cache.d.ts +0 -0
- /package/dist/{core → src/core}/unified-cache.js +0 -0
- /package/dist/{services → src/services}/arbitrage-service.d.ts +0 -0
- /package/dist/{services → src/services}/authorization-service.d.ts +0 -0
- /package/dist/{services → src/services}/authorization-service.js +0 -0
- /package/dist/{services → src/services}/swap-service.d.ts +0 -0
- /package/dist/{services → src/services}/swap-service.js +0 -0
- /package/dist/{utils → src/utils}/price-utils.d.ts +0 -0
- /package/dist/{utils → src/utils}/price-utils.js +0 -0
- /package/dist/{utils → src/utils}/price-utils.test.d.ts +0 -0
- /package/dist/{utils → src/utils}/price-utils.test.js +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binance Service
|
|
3
|
+
*
|
|
4
|
+
* Provides BTC/ETH/SOL K-line data from Binance public API.
|
|
5
|
+
* Used for:
|
|
6
|
+
* - Token vs underlying price correlation analysis
|
|
7
|
+
* - Price prediction for UP/DOWN markets
|
|
8
|
+
* - Backtesting strategies
|
|
9
|
+
*
|
|
10
|
+
* API Reference: https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-data
|
|
11
|
+
*/
|
|
12
|
+
import { RateLimiter } from '../core/rate-limiter.js';
|
|
13
|
+
import type { UnifiedCache } from '../core/unified-cache.js';
|
|
14
|
+
/**
|
|
15
|
+
* Binance K-Line (OHLCV) data
|
|
16
|
+
*/
|
|
17
|
+
export interface BinanceKLine {
|
|
18
|
+
/** Open time (Unix ms) */
|
|
19
|
+
timestamp: number;
|
|
20
|
+
/** Open price */
|
|
21
|
+
open: number;
|
|
22
|
+
/** High price */
|
|
23
|
+
high: number;
|
|
24
|
+
/** Low price */
|
|
25
|
+
low: number;
|
|
26
|
+
/** Close price */
|
|
27
|
+
close: number;
|
|
28
|
+
/** Base asset volume */
|
|
29
|
+
volume: number;
|
|
30
|
+
/** Close time (Unix ms) */
|
|
31
|
+
closeTime: number;
|
|
32
|
+
/** Quote asset volume */
|
|
33
|
+
quoteVolume: number;
|
|
34
|
+
/** Number of trades */
|
|
35
|
+
trades: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Supported Binance trading pairs
|
|
39
|
+
*/
|
|
40
|
+
export type BinanceSymbol = 'BTCUSDT' | 'ETHUSDT' | 'SOLUSDT';
|
|
41
|
+
/**
|
|
42
|
+
* Supported K-line intervals
|
|
43
|
+
*/
|
|
44
|
+
export type BinanceInterval = '1m' | '5m' | '15m' | '30m' | '1h' | '4h' | '1d';
|
|
45
|
+
/**
|
|
46
|
+
* Options for getKLines
|
|
47
|
+
*/
|
|
48
|
+
export interface BinanceKLineOptions {
|
|
49
|
+
/** Start time (Unix ms) */
|
|
50
|
+
startTime?: number;
|
|
51
|
+
/** End time (Unix ms) */
|
|
52
|
+
endTime?: number;
|
|
53
|
+
/** Number of candles (default 500, max 1000) */
|
|
54
|
+
limit?: number;
|
|
55
|
+
}
|
|
56
|
+
export declare class BinanceService {
|
|
57
|
+
private rateLimiter;
|
|
58
|
+
private cache;
|
|
59
|
+
constructor(rateLimiter: RateLimiter, cache: UnifiedCache);
|
|
60
|
+
/**
|
|
61
|
+
* Get K-lines (candlestick data) for a symbol
|
|
62
|
+
*
|
|
63
|
+
* @param symbol - Trading pair (BTCUSDT, ETHUSDT, SOLUSDT)
|
|
64
|
+
* @param interval - K-line interval
|
|
65
|
+
* @param options - Optional parameters
|
|
66
|
+
* @returns Array of K-line candles
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const klines = await binanceService.getKLines('BTCUSDT', '1h', { limit: 100 });
|
|
71
|
+
* console.log(`Latest close: ${klines[klines.length - 1].close}`);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
getKLines(symbol: BinanceSymbol, interval: BinanceInterval, options?: BinanceKLineOptions): Promise<BinanceKLine[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Get current price for a symbol
|
|
77
|
+
*
|
|
78
|
+
* @param symbol - Trading pair (BTCUSDT, ETHUSDT, SOLUSDT)
|
|
79
|
+
* @returns Current price
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const price = await binanceService.getPrice('BTCUSDT');
|
|
84
|
+
* console.log(`BTC price: $${price}`);
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
getPrice(symbol: BinanceSymbol): Promise<number>;
|
|
88
|
+
/**
|
|
89
|
+
* Get price at a specific timestamp (nearest candle close)
|
|
90
|
+
*
|
|
91
|
+
* Uses the 1-minute candle that contains the timestamp and returns
|
|
92
|
+
* the close price of that candle.
|
|
93
|
+
*
|
|
94
|
+
* @param symbol - Trading pair (BTCUSDT, ETHUSDT, SOLUSDT)
|
|
95
|
+
* @param timestamp - Unix timestamp in milliseconds
|
|
96
|
+
* @returns Price at the given timestamp
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* // Get BTC price 1 hour ago
|
|
101
|
+
* const oneHourAgo = Date.now() - 60 * 60 * 1000;
|
|
102
|
+
* const price = await binanceService.getPriceAt('BTCUSDT', oneHourAgo);
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
getPriceAt(symbol: BinanceSymbol, timestamp: number): Promise<number>;
|
|
106
|
+
/**
|
|
107
|
+
* Get multiple prices at once
|
|
108
|
+
*
|
|
109
|
+
* @param symbols - Array of trading pairs
|
|
110
|
+
* @returns Map of symbol to price
|
|
111
|
+
*/
|
|
112
|
+
getPrices(symbols: BinanceSymbol[]): Promise<Map<BinanceSymbol, number>>;
|
|
113
|
+
/**
|
|
114
|
+
* Get price change over a time period
|
|
115
|
+
*
|
|
116
|
+
* @param symbol - Trading pair
|
|
117
|
+
* @param startTime - Start time (Unix ms)
|
|
118
|
+
* @param endTime - End time (Unix ms, defaults to now)
|
|
119
|
+
* @returns Price change percentage
|
|
120
|
+
*/
|
|
121
|
+
getPriceChange(symbol: BinanceSymbol, startTime: number, endTime?: number): Promise<{
|
|
122
|
+
startPrice: number;
|
|
123
|
+
endPrice: number;
|
|
124
|
+
changePercent: number;
|
|
125
|
+
}>;
|
|
126
|
+
private validateSymbol;
|
|
127
|
+
private validateInterval;
|
|
128
|
+
private buildKLineCacheKey;
|
|
129
|
+
private buildKLinesUrl;
|
|
130
|
+
/**
|
|
131
|
+
* Parse Binance K-line array response
|
|
132
|
+
*
|
|
133
|
+
* Binance returns K-lines as arrays:
|
|
134
|
+
* [
|
|
135
|
+
* [
|
|
136
|
+
* 1499040000000, // Open time
|
|
137
|
+
* "0.01634000", // Open
|
|
138
|
+
* "0.80000000", // High
|
|
139
|
+
* "0.01575800", // Low
|
|
140
|
+
* "0.01577100", // Close
|
|
141
|
+
* "148976.11427815", // Volume
|
|
142
|
+
* 1499644799999, // Close time
|
|
143
|
+
* "2434.19055334", // Quote asset volume
|
|
144
|
+
* 308, // Number of trades
|
|
145
|
+
* "1756.87402397", // Taker buy base asset volume
|
|
146
|
+
* "28.46694368", // Taker buy quote asset volume
|
|
147
|
+
* "17928899.62484339" // Ignore
|
|
148
|
+
* ]
|
|
149
|
+
* ]
|
|
150
|
+
*/
|
|
151
|
+
private parseKLines;
|
|
152
|
+
private handleApiError;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=binance-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binance-service.d.ts","sourceRoot":"","sources":["../../../src/services/binance-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAW,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQ7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiCD,qBAAa,cAAc;IAEvB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,KAAK;gBADL,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,YAAY;IAG7B;;;;;;;;;;;;;OAaG;IACG,SAAS,CACb,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,eAAe,EACzB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,YAAY,EAAE,CAAC;IA6B1B;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBtD;;;;;;;;;;;;;;;;OAgBG;IACG,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB3E;;;;;OAKG;IACG,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAW9E;;;;;;;OAOG;IACG,cAAc,CAClB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IA0B3E,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,cAAc;IAuBtB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,WAAW;YAcL,cAAc;CAoC7B"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binance Service
|
|
3
|
+
*
|
|
4
|
+
* Provides BTC/ETH/SOL K-line data from Binance public API.
|
|
5
|
+
* Used for:
|
|
6
|
+
* - Token vs underlying price correlation analysis
|
|
7
|
+
* - Price prediction for UP/DOWN markets
|
|
8
|
+
* - Backtesting strategies
|
|
9
|
+
*
|
|
10
|
+
* API Reference: https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-data
|
|
11
|
+
*/
|
|
12
|
+
import { ApiType } from '../core/rate-limiter.js';
|
|
13
|
+
import { CACHE_TTL } from '../core/cache.js';
|
|
14
|
+
import { PolymarketError, ErrorCode } from '../core/errors.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Constants
|
|
17
|
+
// ============================================================================
|
|
18
|
+
const BINANCE_BASE_URL = 'https://api.binance.com';
|
|
19
|
+
const BINANCE_KLINES_ENDPOINT = '/api/v3/klines';
|
|
20
|
+
const BINANCE_PRICE_ENDPOINT = '/api/v3/ticker/price';
|
|
21
|
+
const DEFAULT_LIMIT = 500;
|
|
22
|
+
const MAX_LIMIT = 1000;
|
|
23
|
+
// Valid symbols
|
|
24
|
+
const VALID_SYMBOLS = new Set(['BTCUSDT', 'ETHUSDT', 'SOLUSDT']);
|
|
25
|
+
// Valid intervals
|
|
26
|
+
const VALID_INTERVALS = new Set([
|
|
27
|
+
'1m', '5m', '15m', '30m', '1h', '4h', '1d',
|
|
28
|
+
]);
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// BinanceService Implementation
|
|
31
|
+
// ============================================================================
|
|
32
|
+
export class BinanceService {
|
|
33
|
+
rateLimiter;
|
|
34
|
+
cache;
|
|
35
|
+
constructor(rateLimiter, cache) {
|
|
36
|
+
this.rateLimiter = rateLimiter;
|
|
37
|
+
this.cache = cache;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get K-lines (candlestick data) for a symbol
|
|
41
|
+
*
|
|
42
|
+
* @param symbol - Trading pair (BTCUSDT, ETHUSDT, SOLUSDT)
|
|
43
|
+
* @param interval - K-line interval
|
|
44
|
+
* @param options - Optional parameters
|
|
45
|
+
* @returns Array of K-line candles
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const klines = await binanceService.getKLines('BTCUSDT', '1h', { limit: 100 });
|
|
50
|
+
* console.log(`Latest close: ${klines[klines.length - 1].close}`);
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
async getKLines(symbol, interval, options) {
|
|
54
|
+
// Validate inputs
|
|
55
|
+
this.validateSymbol(symbol);
|
|
56
|
+
this.validateInterval(interval);
|
|
57
|
+
const limit = Math.min(options?.limit ?? DEFAULT_LIMIT, MAX_LIMIT);
|
|
58
|
+
// Build cache key
|
|
59
|
+
const cacheKey = this.buildKLineCacheKey(symbol, interval, options);
|
|
60
|
+
return this.cache.getOrSet(cacheKey, CACHE_TTL.BINANCE_KLINE, async () => {
|
|
61
|
+
return this.rateLimiter.execute(ApiType.BINANCE, async () => {
|
|
62
|
+
const url = this.buildKLinesUrl(symbol, interval, {
|
|
63
|
+
...options,
|
|
64
|
+
limit,
|
|
65
|
+
});
|
|
66
|
+
const response = await fetch(url);
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
await this.handleApiError(response);
|
|
69
|
+
}
|
|
70
|
+
const data = await response.json();
|
|
71
|
+
return this.parseKLines(data);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get current price for a symbol
|
|
77
|
+
*
|
|
78
|
+
* @param symbol - Trading pair (BTCUSDT, ETHUSDT, SOLUSDT)
|
|
79
|
+
* @returns Current price
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const price = await binanceService.getPrice('BTCUSDT');
|
|
84
|
+
* console.log(`BTC price: $${price}`);
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
async getPrice(symbol) {
|
|
88
|
+
this.validateSymbol(symbol);
|
|
89
|
+
const cacheKey = `binance:price:${symbol}`;
|
|
90
|
+
return this.cache.getOrSet(cacheKey, CACHE_TTL.BINANCE_PRICE, async () => {
|
|
91
|
+
return this.rateLimiter.execute(ApiType.BINANCE, async () => {
|
|
92
|
+
const url = `${BINANCE_BASE_URL}${BINANCE_PRICE_ENDPOINT}?symbol=${symbol}`;
|
|
93
|
+
const response = await fetch(url);
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
await this.handleApiError(response);
|
|
96
|
+
}
|
|
97
|
+
const data = await response.json();
|
|
98
|
+
return parseFloat(data.price);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get price at a specific timestamp (nearest candle close)
|
|
104
|
+
*
|
|
105
|
+
* Uses the 1-minute candle that contains the timestamp and returns
|
|
106
|
+
* the close price of that candle.
|
|
107
|
+
*
|
|
108
|
+
* @param symbol - Trading pair (BTCUSDT, ETHUSDT, SOLUSDT)
|
|
109
|
+
* @param timestamp - Unix timestamp in milliseconds
|
|
110
|
+
* @returns Price at the given timestamp
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* // Get BTC price 1 hour ago
|
|
115
|
+
* const oneHourAgo = Date.now() - 60 * 60 * 1000;
|
|
116
|
+
* const price = await binanceService.getPriceAt('BTCUSDT', oneHourAgo);
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
async getPriceAt(symbol, timestamp) {
|
|
120
|
+
this.validateSymbol(symbol);
|
|
121
|
+
// Fetch a single 1-minute candle at the specified time
|
|
122
|
+
const klines = await this.getKLines(symbol, '1m', {
|
|
123
|
+
startTime: timestamp,
|
|
124
|
+
limit: 1,
|
|
125
|
+
});
|
|
126
|
+
if (klines.length === 0) {
|
|
127
|
+
throw new PolymarketError(ErrorCode.INVALID_RESPONSE, `No price data available for ${symbol} at timestamp ${timestamp}`);
|
|
128
|
+
}
|
|
129
|
+
return klines[0].close;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get multiple prices at once
|
|
133
|
+
*
|
|
134
|
+
* @param symbols - Array of trading pairs
|
|
135
|
+
* @returns Map of symbol to price
|
|
136
|
+
*/
|
|
137
|
+
async getPrices(symbols) {
|
|
138
|
+
const prices = await Promise.all(symbols.map(async (symbol) => {
|
|
139
|
+
const price = await this.getPrice(symbol);
|
|
140
|
+
return [symbol, price];
|
|
141
|
+
}));
|
|
142
|
+
return new Map(prices);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get price change over a time period
|
|
146
|
+
*
|
|
147
|
+
* @param symbol - Trading pair
|
|
148
|
+
* @param startTime - Start time (Unix ms)
|
|
149
|
+
* @param endTime - End time (Unix ms, defaults to now)
|
|
150
|
+
* @returns Price change percentage
|
|
151
|
+
*/
|
|
152
|
+
async getPriceChange(symbol, startTime, endTime) {
|
|
153
|
+
const [startKlines, endKlines] = await Promise.all([
|
|
154
|
+
this.getKLines(symbol, '1m', { startTime, limit: 1 }),
|
|
155
|
+
endTime
|
|
156
|
+
? this.getKLines(symbol, '1m', { startTime: endTime, limit: 1 })
|
|
157
|
+
: Promise.resolve([]),
|
|
158
|
+
]);
|
|
159
|
+
const startPrice = startKlines[0]?.close;
|
|
160
|
+
if (!startPrice) {
|
|
161
|
+
throw new PolymarketError(ErrorCode.INVALID_RESPONSE, `No price data for ${symbol} at ${startTime}`);
|
|
162
|
+
}
|
|
163
|
+
const endPrice = endKlines[0]?.close ?? (await this.getPrice(symbol));
|
|
164
|
+
const changePercent = ((endPrice - startPrice) / startPrice) * 100;
|
|
165
|
+
return { startPrice, endPrice, changePercent };
|
|
166
|
+
}
|
|
167
|
+
// ============================================================================
|
|
168
|
+
// Private Methods
|
|
169
|
+
// ============================================================================
|
|
170
|
+
validateSymbol(symbol) {
|
|
171
|
+
if (!VALID_SYMBOLS.has(symbol)) {
|
|
172
|
+
throw new PolymarketError(ErrorCode.INVALID_CONFIG, `Invalid symbol: ${symbol}. Supported: ${[...VALID_SYMBOLS].join(', ')}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
validateInterval(interval) {
|
|
176
|
+
if (!VALID_INTERVALS.has(interval)) {
|
|
177
|
+
throw new PolymarketError(ErrorCode.INVALID_CONFIG, `Invalid interval: ${interval}. Supported: ${[...VALID_INTERVALS].join(', ')}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
buildKLineCacheKey(symbol, interval, options) {
|
|
181
|
+
const parts = ['binance', 'klines', symbol, interval];
|
|
182
|
+
if (options?.startTime) {
|
|
183
|
+
parts.push(`start:${options.startTime}`);
|
|
184
|
+
}
|
|
185
|
+
if (options?.endTime) {
|
|
186
|
+
parts.push(`end:${options.endTime}`);
|
|
187
|
+
}
|
|
188
|
+
if (options?.limit) {
|
|
189
|
+
parts.push(`limit:${options.limit}`);
|
|
190
|
+
}
|
|
191
|
+
return parts.join(':');
|
|
192
|
+
}
|
|
193
|
+
buildKLinesUrl(symbol, interval, options) {
|
|
194
|
+
const params = new URLSearchParams({
|
|
195
|
+
symbol,
|
|
196
|
+
interval,
|
|
197
|
+
});
|
|
198
|
+
if (options?.startTime) {
|
|
199
|
+
params.set('startTime', options.startTime.toString());
|
|
200
|
+
}
|
|
201
|
+
if (options?.endTime) {
|
|
202
|
+
params.set('endTime', options.endTime.toString());
|
|
203
|
+
}
|
|
204
|
+
if (options?.limit) {
|
|
205
|
+
params.set('limit', options.limit.toString());
|
|
206
|
+
}
|
|
207
|
+
return `${BINANCE_BASE_URL}${BINANCE_KLINES_ENDPOINT}?${params.toString()}`;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Parse Binance K-line array response
|
|
211
|
+
*
|
|
212
|
+
* Binance returns K-lines as arrays:
|
|
213
|
+
* [
|
|
214
|
+
* [
|
|
215
|
+
* 1499040000000, // Open time
|
|
216
|
+
* "0.01634000", // Open
|
|
217
|
+
* "0.80000000", // High
|
|
218
|
+
* "0.01575800", // Low
|
|
219
|
+
* "0.01577100", // Close
|
|
220
|
+
* "148976.11427815", // Volume
|
|
221
|
+
* 1499644799999, // Close time
|
|
222
|
+
* "2434.19055334", // Quote asset volume
|
|
223
|
+
* 308, // Number of trades
|
|
224
|
+
* "1756.87402397", // Taker buy base asset volume
|
|
225
|
+
* "28.46694368", // Taker buy quote asset volume
|
|
226
|
+
* "17928899.62484339" // Ignore
|
|
227
|
+
* ]
|
|
228
|
+
* ]
|
|
229
|
+
*/
|
|
230
|
+
parseKLines(data) {
|
|
231
|
+
return data.map((kline) => ({
|
|
232
|
+
timestamp: kline[0],
|
|
233
|
+
open: parseFloat(kline[1]),
|
|
234
|
+
high: parseFloat(kline[2]),
|
|
235
|
+
low: parseFloat(kline[3]),
|
|
236
|
+
close: parseFloat(kline[4]),
|
|
237
|
+
volume: parseFloat(kline[5]),
|
|
238
|
+
closeTime: kline[6],
|
|
239
|
+
quoteVolume: parseFloat(kline[7]),
|
|
240
|
+
trades: kline[8],
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
async handleApiError(response) {
|
|
244
|
+
let errorBody = null;
|
|
245
|
+
try {
|
|
246
|
+
errorBody = await response.json();
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// Failed to parse error body
|
|
250
|
+
}
|
|
251
|
+
const message = errorBody?.msg || `Binance API error: HTTP ${response.status}`;
|
|
252
|
+
// Handle rate limiting
|
|
253
|
+
if (response.status === 429 || errorBody?.code === -1015) {
|
|
254
|
+
throw new PolymarketError(ErrorCode.RATE_LIMITED, message, true // retryable
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
// Handle invalid symbol/parameters
|
|
258
|
+
if (errorBody?.code === -1121 || errorBody?.code === -1100) {
|
|
259
|
+
throw new PolymarketError(ErrorCode.INVALID_CONFIG, message, false);
|
|
260
|
+
}
|
|
261
|
+
// Generic API error
|
|
262
|
+
throw new PolymarketError(ErrorCode.API_ERROR, message, response.status >= 500 // retryable for server errors
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=binance-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binance-service.js","sourceRoot":"","sources":["../../../src/services/binance-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DipArbService - Dip Arbitrage Service
|
|
3
|
+
*
|
|
4
|
+
* 暴跌套利服务 - 针对 Polymarket 15分钟/5分钟 UP/DOWN 市场
|
|
5
|
+
*
|
|
6
|
+
* 策略原理:
|
|
7
|
+
* 1. 每个市场有一个 "price to beat"(开盘时的 Chainlink 价格)
|
|
8
|
+
* 2. 结算规则:
|
|
9
|
+
* - UP 赢:结束时价格 >= price to beat
|
|
10
|
+
* - DOWN 赢:结束时价格 < price to beat
|
|
11
|
+
*
|
|
12
|
+
* 3. 套利流程:
|
|
13
|
+
* - Leg1:检测暴跌 → 买入暴跌侧
|
|
14
|
+
* - Leg2:等待对冲条件 → 买入另一侧
|
|
15
|
+
* - 利润:总成本 < $1 时获得无风险利润
|
|
16
|
+
*
|
|
17
|
+
* 使用示例:
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const sdk = await PolymarketSDK.create({ privateKey: '...' });
|
|
20
|
+
*
|
|
21
|
+
* // 自动找到并启动
|
|
22
|
+
* await sdk.dipArb.findAndStart({ coin: 'BTC' });
|
|
23
|
+
*
|
|
24
|
+
* // 监听信号
|
|
25
|
+
* sdk.dipArb.on('signal', (signal) => {
|
|
26
|
+
* console.log(`Signal: ${signal.type} ${signal.side}`);
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import { EventEmitter } from 'events';
|
|
31
|
+
import { RealtimeServiceV2 } from './realtime-service-v2.js';
|
|
32
|
+
import { TradingService } from './trading-service.js';
|
|
33
|
+
import { MarketService } from './market-service.js';
|
|
34
|
+
import { type DipArbServiceConfig, type DipArbConfigInternal, type DipArbMarketConfig, type DipArbRoundState, type DipArbStats, type DipArbLeg1Signal, type DipArbLeg2Signal, type DipArbExecutionResult, type DipArbScanOptions, type DipArbFindAndStartOptions, type DipArbAutoRotateConfig, type DipArbSettleResult, type DipArbPendingRedemption } from './dip-arb-types.js';
|
|
35
|
+
export declare class DipArbService extends EventEmitter {
|
|
36
|
+
private realtimeService;
|
|
37
|
+
private tradingService;
|
|
38
|
+
private marketService;
|
|
39
|
+
private ctf;
|
|
40
|
+
private config;
|
|
41
|
+
private autoRotateConfig;
|
|
42
|
+
private market;
|
|
43
|
+
private currentRound;
|
|
44
|
+
private isRunning;
|
|
45
|
+
private isExecuting;
|
|
46
|
+
private lastExecutionTime;
|
|
47
|
+
private stats;
|
|
48
|
+
private marketSubscription;
|
|
49
|
+
private chainlinkSubscription;
|
|
50
|
+
private rotateCheckInterval;
|
|
51
|
+
private nextMarket;
|
|
52
|
+
private pendingRedemptions;
|
|
53
|
+
private redeemCheckInterval;
|
|
54
|
+
private upAsks;
|
|
55
|
+
private downAsks;
|
|
56
|
+
private priceHistory;
|
|
57
|
+
private readonly MAX_HISTORY_LENGTH;
|
|
58
|
+
private currentUnderlyingPrice;
|
|
59
|
+
private leg1SignalEmitted;
|
|
60
|
+
private lastOrderbookLogTime;
|
|
61
|
+
private readonly ORDERBOOK_LOG_INTERVAL_MS;
|
|
62
|
+
private orderbookBuffer;
|
|
63
|
+
private readonly ORDERBOOK_BUFFER_SIZE;
|
|
64
|
+
constructor(realtimeService: RealtimeServiceV2, tradingService: TradingService | null, marketService: MarketService, privateKey?: string, chainId?: number);
|
|
65
|
+
/**
|
|
66
|
+
* Update configuration
|
|
67
|
+
*/
|
|
68
|
+
updateConfig(config: Partial<DipArbServiceConfig>): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get current configuration
|
|
71
|
+
*/
|
|
72
|
+
getConfig(): DipArbConfigInternal;
|
|
73
|
+
/**
|
|
74
|
+
* Scan for upcoming UP/DOWN markets
|
|
75
|
+
*
|
|
76
|
+
* Uses MarketService.scanCryptoShortTermMarkets()
|
|
77
|
+
*/
|
|
78
|
+
scanUpcomingMarkets(options?: DipArbScanOptions): Promise<DipArbMarketConfig[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Find the best market and start monitoring
|
|
81
|
+
*/
|
|
82
|
+
findAndStart(options?: DipArbFindAndStartOptions): Promise<DipArbMarketConfig | null>;
|
|
83
|
+
/**
|
|
84
|
+
* Start monitoring a market
|
|
85
|
+
*/
|
|
86
|
+
start(market: DipArbMarketConfig): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* ✅ FIX: Scan and merge existing UP/DOWN pairs at startup
|
|
89
|
+
*
|
|
90
|
+
* When the service starts or rotates to a new market, check if there are
|
|
91
|
+
* existing UP + DOWN token pairs from previous sessions and merge them.
|
|
92
|
+
*/
|
|
93
|
+
private scanAndMergeExistingPairs;
|
|
94
|
+
/**
|
|
95
|
+
* Stop monitoring
|
|
96
|
+
*/
|
|
97
|
+
stop(): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Check if service is running
|
|
100
|
+
*/
|
|
101
|
+
isActive(): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Get current market
|
|
104
|
+
*/
|
|
105
|
+
getMarket(): DipArbMarketConfig | null;
|
|
106
|
+
/**
|
|
107
|
+
* Get statistics
|
|
108
|
+
*/
|
|
109
|
+
getStats(): DipArbStats;
|
|
110
|
+
/**
|
|
111
|
+
* Get current round state
|
|
112
|
+
*/
|
|
113
|
+
getCurrentRound(): DipArbRoundState | null;
|
|
114
|
+
/**
|
|
115
|
+
* Get current price to beat
|
|
116
|
+
*/
|
|
117
|
+
getPriceToBeat(): number | null;
|
|
118
|
+
/**
|
|
119
|
+
* Execute Leg1 trade
|
|
120
|
+
*/
|
|
121
|
+
executeLeg1(signal: DipArbLeg1Signal): Promise<DipArbExecutionResult>;
|
|
122
|
+
/**
|
|
123
|
+
* Execute Leg2 trade
|
|
124
|
+
*/
|
|
125
|
+
executeLeg2(signal: DipArbLeg2Signal): Promise<DipArbExecutionResult>;
|
|
126
|
+
/**
|
|
127
|
+
* Merge UP + DOWN tokens to USDC.e
|
|
128
|
+
*
|
|
129
|
+
* Uses mergeByTokenIds with Polymarket token IDs for correct CLOB market handling.
|
|
130
|
+
* This locks in profit immediately after Leg2 completes.
|
|
131
|
+
*/
|
|
132
|
+
merge(): Promise<DipArbExecutionResult>;
|
|
133
|
+
private handleOrderbookUpdate;
|
|
134
|
+
/**
|
|
135
|
+
* Record current prices to history buffer for sliding window detection
|
|
136
|
+
*/
|
|
137
|
+
private recordPriceHistory;
|
|
138
|
+
/**
|
|
139
|
+
* Get price from N milliseconds ago for sliding window detection
|
|
140
|
+
*
|
|
141
|
+
* @param side - 'UP' or 'DOWN'
|
|
142
|
+
* @param msAgo - Milliseconds ago (e.g., 3000 for 3 seconds)
|
|
143
|
+
* @returns Price from that time, or null if not available
|
|
144
|
+
*/
|
|
145
|
+
private getPriceFromHistory;
|
|
146
|
+
private handleChainlinkPriceUpdate;
|
|
147
|
+
private checkAndStartNewRound;
|
|
148
|
+
/**
|
|
149
|
+
* Emergency exit Leg1 position when Leg2 times out
|
|
150
|
+
* Sells the Leg1 tokens at market price to avoid unhedged exposure
|
|
151
|
+
*/
|
|
152
|
+
private emergencyExitLeg1;
|
|
153
|
+
private detectSignal;
|
|
154
|
+
private detectLeg1Signal;
|
|
155
|
+
private createLeg1Signal;
|
|
156
|
+
private detectLeg2Signal;
|
|
157
|
+
private validateSignalProfitability;
|
|
158
|
+
private handleSignal;
|
|
159
|
+
/**
|
|
160
|
+
* Configure and enable auto-rotate
|
|
161
|
+
*
|
|
162
|
+
* Auto-rotate 会自动:
|
|
163
|
+
* 1. 监控当前市场到期时间
|
|
164
|
+
* 2. 在市场结束前预加载下一个市场
|
|
165
|
+
* 3. 市场结束时自动结算(redeem 或 sell)
|
|
166
|
+
* 4. 无缝切换到下一个 15m 市场
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* sdk.dipArb.enableAutoRotate({
|
|
171
|
+
* underlyings: ['BTC', 'ETH'],
|
|
172
|
+
* duration: '15m',
|
|
173
|
+
* autoSettle: true,
|
|
174
|
+
* settleStrategy: 'redeem',
|
|
175
|
+
* });
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
enableAutoRotate(config?: Partial<DipArbAutoRotateConfig>): void;
|
|
179
|
+
/**
|
|
180
|
+
* ✅ FIX: Scan for existing redeemable positions and add them to the queue
|
|
181
|
+
*
|
|
182
|
+
* This is called when auto-rotate is enabled to recover any positions
|
|
183
|
+
* from previous sessions that can be redeemed.
|
|
184
|
+
*/
|
|
185
|
+
private scanAndQueueRedeemablePositions;
|
|
186
|
+
/**
|
|
187
|
+
* Disable auto-rotate
|
|
188
|
+
*/
|
|
189
|
+
disableAutoRotate(): void;
|
|
190
|
+
/**
|
|
191
|
+
* Get auto-rotate configuration
|
|
192
|
+
*/
|
|
193
|
+
getAutoRotateConfig(): Required<DipArbAutoRotateConfig>;
|
|
194
|
+
/**
|
|
195
|
+
* Manually settle current position
|
|
196
|
+
*
|
|
197
|
+
* 结算策略:
|
|
198
|
+
* - 'redeem': 等待市场结算后 redeem(需要等待结算完成)
|
|
199
|
+
* - 'sell': 直接卖出 token(更快但可能有滑点)
|
|
200
|
+
*/
|
|
201
|
+
settle(strategy?: 'redeem' | 'sell'): Promise<DipArbSettleResult>;
|
|
202
|
+
/**
|
|
203
|
+
* Manually rotate to next market
|
|
204
|
+
*/
|
|
205
|
+
rotateToNextMarket(): Promise<DipArbMarketConfig | null>;
|
|
206
|
+
private startRotateCheck;
|
|
207
|
+
private stopRotateCheck;
|
|
208
|
+
private startRedeemCheck;
|
|
209
|
+
private stopRedeemCheck;
|
|
210
|
+
/**
|
|
211
|
+
* Add a position to pending redemption queue
|
|
212
|
+
*/
|
|
213
|
+
private addPendingRedemption;
|
|
214
|
+
/**
|
|
215
|
+
* Process all pending redemptions
|
|
216
|
+
* Called periodically by redeemCheckInterval
|
|
217
|
+
*/
|
|
218
|
+
private processPendingRedemptions;
|
|
219
|
+
/**
|
|
220
|
+
* Get pending redemptions (for debugging/monitoring)
|
|
221
|
+
*/
|
|
222
|
+
getPendingRedemptions(): DipArbPendingRedemption[];
|
|
223
|
+
private checkRotation;
|
|
224
|
+
private findNextMarket;
|
|
225
|
+
private settleByRedeem;
|
|
226
|
+
private settleBySell;
|
|
227
|
+
/**
|
|
228
|
+
* Update orderbook buffer for smart logging
|
|
229
|
+
* Keeps last 5 seconds of orderbook data
|
|
230
|
+
*/
|
|
231
|
+
private updateOrderbookBuffer;
|
|
232
|
+
/**
|
|
233
|
+
* Log orderbook summary at intervals (every 10 seconds)
|
|
234
|
+
* Reduces log noise from ~10 logs/sec to 1 log/10sec
|
|
235
|
+
*/
|
|
236
|
+
private maybeLogOrderbookSummary;
|
|
237
|
+
/**
|
|
238
|
+
* Log orderbook buffer around a signal/trade
|
|
239
|
+
* Called when signal is detected to capture market context
|
|
240
|
+
*/
|
|
241
|
+
private logOrderbookContext;
|
|
242
|
+
private log;
|
|
243
|
+
}
|
|
244
|
+
export * from './dip-arb-types.js';
|
|
245
|
+
//# sourceMappingURL=dip-arb-service.d.ts.map
|