@catalyst-team/poly-sdk 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +665 -807
- package/README.zh-CN.md +645 -342
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.js +267 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.js +6 -3
- package/dist/__tests__/integration/data-api.integration.test.js.map +1 -1
- package/dist/__tests__/integration/market-service.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/market-service.integration.test.js +173 -0
- package/dist/__tests__/integration/market-service.integration.test.js.map +1 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
- package/dist/__tests__/integration/trading-service.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/trading-service.integration.test.js +58 -0
- package/dist/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/clients/clob-api.d.ts +73 -0
- package/dist/clients/clob-api.d.ts.map +1 -1
- package/dist/clients/clob-api.js +60 -0
- package/dist/clients/clob-api.js.map +1 -1
- package/dist/clients/ctf-client.d.ts +6 -4
- package/dist/clients/ctf-client.d.ts.map +1 -1
- package/dist/clients/ctf-client.js.map +1 -1
- package/dist/clients/data-api.d.ts +333 -15
- package/dist/clients/data-api.d.ts.map +1 -1
- package/dist/clients/data-api.js +398 -26
- package/dist/clients/data-api.js.map +1 -1
- package/dist/clients/gamma-api.d.ts +5 -0
- package/dist/clients/gamma-api.d.ts.map +1 -1
- package/dist/clients/gamma-api.js +2 -0
- package/dist/clients/gamma-api.js.map +1 -1
- package/dist/clients/subgraph.d.ts +196 -0
- package/dist/clients/subgraph.d.ts.map +1 -0
- package/dist/clients/subgraph.js +332 -0
- package/dist/clients/subgraph.js.map +1 -0
- package/dist/clients/websocket-manager.d.ts +3 -0
- package/dist/clients/websocket-manager.d.ts.map +1 -1
- package/dist/clients/websocket-manager.js +10 -3
- package/dist/clients/websocket-manager.js.map +1 -1
- package/dist/core/cache.d.ts +3 -0
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +5 -0
- package/dist/core/cache.js.map +1 -1
- package/dist/core/errors.d.ts +2 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +2 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/rate-limiter.d.ts +3 -1
- package/dist/core/rate-limiter.d.ts.map +1 -1
- package/dist/core/rate-limiter.js +12 -0
- package/dist/core/rate-limiter.js.map +1 -1
- package/dist/core/types.d.ts +205 -13
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +30 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/types.test.d.ts +7 -0
- package/dist/core/types.test.d.ts.map +1 -0
- package/dist/core/types.test.js +122 -0
- package/dist/core/types.test.js.map +1 -0
- package/dist/index.d.ts +84 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -132
- package/dist/index.js.map +1 -1
- 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/services/arbitrage-service.d.ts +3 -2
- package/dist/services/arbitrage-service.d.ts.map +1 -1
- package/dist/services/arbitrage-service.js +71 -43
- package/dist/services/arbitrage-service.js.map +1 -1
- package/dist/services/binance-service.d.ts +154 -0
- package/dist/services/binance-service.d.ts.map +1 -0
- package/dist/services/binance-service.js +266 -0
- package/dist/services/binance-service.js.map +1 -0
- package/dist/services/dip-arb-service.d.ts +209 -0
- package/dist/services/dip-arb-service.d.ts.map +1 -0
- package/dist/services/dip-arb-service.js +1602 -0
- package/dist/services/dip-arb-service.js.map +1 -0
- package/dist/services/dip-arb-types.d.ts +553 -0
- package/dist/services/dip-arb-types.d.ts.map +1 -0
- package/dist/services/dip-arb-types.js +164 -0
- package/dist/services/dip-arb-types.js.map +1 -0
- package/dist/services/market-service.d.ts +267 -8
- package/dist/services/market-service.d.ts.map +1 -1
- package/dist/services/market-service.js +771 -42
- package/dist/services/market-service.js.map +1 -1
- package/dist/services/onchain-service.d.ts +309 -0
- package/dist/services/onchain-service.d.ts.map +1 -0
- package/dist/services/onchain-service.js +417 -0
- package/dist/services/onchain-service.js.map +1 -0
- package/dist/services/realtime-service-v2.d.ts +362 -0
- package/dist/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/services/realtime-service-v2.js +858 -0
- package/dist/services/realtime-service-v2.js.map +1 -0
- package/dist/services/realtime-service.d.ts +17 -17
- package/dist/services/realtime-service.d.ts.map +1 -1
- package/dist/services/realtime-service.js +91 -59
- package/dist/services/realtime-service.js.map +1 -1
- package/dist/services/smart-money-service.d.ts +352 -0
- package/dist/services/smart-money-service.d.ts.map +1 -0
- package/dist/services/smart-money-service.js +582 -0
- package/dist/services/smart-money-service.js.map +1 -0
- package/dist/services/trading-service.d.ts +177 -0
- package/dist/services/trading-service.d.ts.map +1 -0
- package/dist/services/trading-service.js +422 -0
- package/dist/services/trading-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +225 -3
- package/dist/services/wallet-service.d.ts.map +1 -1
- package/dist/services/wallet-service.js +511 -3
- package/dist/services/wallet-service.js.map +1 -1
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -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 +267 -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 +11 -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 +260 -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 +17 -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 +234 -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 +9 -0
- package/dist/src/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/data-api.integration.test.js +164 -0
- package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts +9 -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 +170 -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 +10 -0
- package/dist/src/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/market-service.integration.test.js +180 -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 +10 -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 +307 -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 +10 -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 +58 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +92 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +143 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/clients/bridge-client.d.ts +388 -0
- package/dist/src/clients/bridge-client.d.ts.map +1 -0
- package/dist/src/clients/bridge-client.js +587 -0
- package/dist/src/clients/bridge-client.js.map +1 -0
- package/dist/src/clients/ctf-client.d.ts +475 -0
- package/dist/src/clients/ctf-client.d.ts.map +1 -0
- package/dist/src/clients/ctf-client.js +915 -0
- package/dist/src/clients/ctf-client.js.map +1 -0
- package/dist/src/clients/data-api.d.ts +452 -0
- package/dist/src/clients/data-api.d.ts.map +1 -0
- package/dist/src/clients/data-api.js +637 -0
- package/dist/src/clients/data-api.js.map +1 -0
- package/dist/src/clients/gamma-api.d.ts +421 -0
- package/dist/src/clients/gamma-api.d.ts.map +1 -0
- package/dist/src/clients/gamma-api.js +359 -0
- package/dist/src/clients/gamma-api.js.map +1 -0
- package/dist/src/clients/subgraph.d.ts +196 -0
- package/dist/src/clients/subgraph.d.ts.map +1 -0
- package/dist/src/clients/subgraph.js +332 -0
- package/dist/src/clients/subgraph.js.map +1 -0
- package/dist/src/core/cache-adapter-bridge.d.ts +36 -0
- package/dist/src/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/src/core/cache-adapter-bridge.js +81 -0
- package/dist/src/core/cache-adapter-bridge.js.map +1 -0
- package/dist/src/core/cache.d.ts +43 -0
- package/dist/src/core/cache.d.ts.map +1 -0
- package/dist/src/core/cache.js +76 -0
- package/dist/src/core/cache.js.map +1 -0
- package/dist/src/core/errors.d.ts +39 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js +86 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/rate-limiter.d.ts +33 -0
- package/dist/src/core/rate-limiter.d.ts.map +1 -0
- package/dist/src/core/rate-limiter.js +82 -0
- package/dist/src/core/rate-limiter.js.map +1 -0
- package/dist/src/core/types.d.ts +506 -0
- 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 +7 -0
- package/dist/src/core/types.test.d.ts.map +1 -0
- package/dist/src/core/types.test.js +122 -0
- package/dist/src/core/types.test.js.map +1 -0
- package/dist/src/core/unified-cache.d.ts +63 -0
- package/dist/src/core/unified-cache.d.ts.map +1 -0
- package/dist/src/core/unified-cache.js +114 -0
- package/dist/src/core/unified-cache.js.map +1 -0
- package/dist/src/index.d.ts +159 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +262 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/arbitrage-service.d.ts +409 -0
- package/dist/src/services/arbitrage-service.d.ts.map +1 -0
- package/dist/src/services/arbitrage-service.js +1450 -0
- package/dist/src/services/arbitrage-service.js.map +1 -0
- package/dist/src/services/authorization-service.d.ts +97 -0
- package/dist/src/services/authorization-service.d.ts.map +1 -0
- package/dist/src/services/authorization-service.js +279 -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 +370 -0
- package/dist/src/services/market-service.d.ts.map +1 -0
- package/dist/src/services/market-service.js +1200 -0
- package/dist/src/services/market-service.js.map +1 -0
- package/dist/src/services/onchain-service.d.ts +309 -0
- package/dist/src/services/onchain-service.d.ts.map +1 -0
- package/dist/src/services/onchain-service.js +417 -0
- package/dist/src/services/onchain-service.js.map +1 -0
- package/dist/src/services/realtime-service-v2.d.ts +367 -0
- package/dist/src/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/src/services/realtime-service-v2.js +876 -0
- package/dist/src/services/realtime-service-v2.js.map +1 -0
- package/dist/src/services/smart-money-service.d.ts +352 -0
- package/dist/src/services/smart-money-service.d.ts.map +1 -0
- package/dist/src/services/smart-money-service.js +582 -0
- package/dist/src/services/smart-money-service.js.map +1 -0
- package/dist/src/services/swap-service.d.ts +217 -0
- package/dist/src/services/swap-service.d.ts.map +1 -0
- package/dist/src/services/swap-service.js +695 -0
- package/dist/src/services/swap-service.js.map +1 -0
- package/dist/src/services/trading-service.d.ts +177 -0
- package/dist/src/services/trading-service.d.ts.map +1 -0
- package/dist/src/services/trading-service.js +422 -0
- package/dist/src/services/trading-service.js.map +1 -0
- package/dist/src/services/wallet-service.d.ts +316 -0
- package/dist/src/services/wallet-service.d.ts.map +1 -0
- package/dist/src/services/wallet-service.js +681 -0
- package/dist/src/services/wallet-service.js.map +1 -0
- package/dist/src/utils/price-utils.d.ts +153 -0
- package/dist/src/utils/price-utils.d.ts.map +1 -0
- package/dist/src/utils/price-utils.js +236 -0
- package/dist/src/utils/price-utils.js.map +1 -0
- package/dist/src/utils/price-utils.test.d.ts +5 -0
- package/dist/src/utils/price-utils.test.d.ts.map +1 -0
- package/dist/src/utils/price-utils.test.js +192 -0
- package/dist/src/utils/price-utils.test.js.map +1 -0
- package/dist/utils/price-utils.test.d.ts +5 -0
- package/dist/utils/price-utils.test.d.ts.map +1 -0
- package/dist/utils/price-utils.test.js +192 -0
- package/dist/utils/price-utils.test.js.map +1 -0
- package/package.json +6 -5
- package/README.en.md +0 -502
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @catalyst-team/poly-sdk
|
|
3
|
+
*
|
|
4
|
+
* Unified SDK for Polymarket APIs
|
|
5
|
+
* - Data API (positions, activity, trades, leaderboard)
|
|
6
|
+
* - Gamma API (markets, events, trending)
|
|
7
|
+
* - CLOB API (orderbook, market info, trading)
|
|
8
|
+
* - Services (WalletService, MarketService)
|
|
9
|
+
*/
|
|
10
|
+
// Core infrastructure
|
|
11
|
+
export { RateLimiter, ApiType } from './core/rate-limiter.js';
|
|
12
|
+
export { Cache, CACHE_TTL } from './core/cache.js';
|
|
13
|
+
export { PolymarketError, ErrorCode, withRetry } from './core/errors.js';
|
|
14
|
+
export * from './core/types.js';
|
|
15
|
+
export { createUnifiedCache } from './core/unified-cache.js';
|
|
16
|
+
// API Clients
|
|
17
|
+
export { DataApiClient } from './clients/data-api.js';
|
|
18
|
+
export { GammaApiClient } from './clients/gamma-api.js';
|
|
19
|
+
// ClobApiClient has been removed - use TradingService instead
|
|
20
|
+
// TradingService provides getMarket(), getProcessedOrderbook(), etc.
|
|
21
|
+
// Subgraph Client (on-chain data via Goldsky)
|
|
22
|
+
export { SubgraphClient, SUBGRAPH_ENDPOINTS } from './clients/subgraph.js';
|
|
23
|
+
// Services
|
|
24
|
+
export { WalletService } from './services/wallet-service.js';
|
|
25
|
+
export { MarketService, getIntervalMs as getIntervalMsService } from './services/market-service.js';
|
|
26
|
+
// Real-time (V2 - using official @polymarket/real-time-data-client)
|
|
27
|
+
export { RealtimeServiceV2 } from './services/realtime-service-v2.js';
|
|
28
|
+
// RealtimeService (legacy) has been removed - use RealtimeServiceV2 instead
|
|
29
|
+
// ArbitrageService (Real-time arbitrage detection, execution, rebalancing, and settlement)
|
|
30
|
+
export { ArbitrageService } from './services/arbitrage-service.js';
|
|
31
|
+
// SmartMoneyService - Smart Money detection and Copy Trading
|
|
32
|
+
export { SmartMoneyService } from './services/smart-money-service.js';
|
|
33
|
+
// DipArbService - Dip Arbitrage for 15m/5m UP/DOWN markets
|
|
34
|
+
export { DipArbService } from './services/dip-arb-service.js';
|
|
35
|
+
// BinanceService - BTC/ETH/SOL K-line data from Binance
|
|
36
|
+
export { BinanceService } from './services/binance-service.js';
|
|
37
|
+
// TradingService - Unified trading and market data
|
|
38
|
+
export { TradingService, POLYGON_MAINNET, POLYGON_AMOY,
|
|
39
|
+
// Polymarket order minimum requirements
|
|
40
|
+
MIN_ORDER_VALUE_USDC, MIN_ORDER_SIZE_SHARES, } from './services/trading-service.js';
|
|
41
|
+
// TradingClient (legacy) has been removed - use TradingService instead
|
|
42
|
+
// TradingService provides all trading functionality with proper type exports
|
|
43
|
+
// CTF (Conditional Token Framework)
|
|
44
|
+
// NOTE: USDC_CONTRACT is USDC.e (bridged), required for Polymarket CTF
|
|
45
|
+
// NATIVE_USDC_CONTRACT is native USDC, NOT compatible with CTF
|
|
46
|
+
export { CTFClient, CTF_CONTRACT, USDC_CONTRACT, // USDC.e (0x2791...) - Required for CTF
|
|
47
|
+
NATIVE_USDC_CONTRACT, // Native USDC (0x3c49...) - NOT for CTF
|
|
48
|
+
NEG_RISK_CTF_EXCHANGE, NEG_RISK_ADAPTER, USDC_DECIMALS, calculateConditionId, parseUsdc, formatUsdc, } from './clients/ctf-client.js';
|
|
49
|
+
export { RevertReason } from './clients/ctf-client.js';
|
|
50
|
+
// Bridge (Cross-chain Deposits)
|
|
51
|
+
export { BridgeClient, SUPPORTED_CHAINS, BRIDGE_TOKENS, estimateBridgeOutput, getExplorerUrl, depositUsdc, swapAndDeposit, getSupportedDepositTokens, } from './clients/bridge-client.js';
|
|
52
|
+
// Swap Service (DEX swaps on Polygon)
|
|
53
|
+
export { SwapService, QUICKSWAP_ROUTER, POLYGON_TOKENS, TOKEN_DECIMALS, } from './services/swap-service.js';
|
|
54
|
+
// Authorization (ERC20/ERC1155 Approvals)
|
|
55
|
+
export { AuthorizationService } from './services/authorization-service.js';
|
|
56
|
+
// OnchainService (Unified on-chain operations: CTF + Authorization + Swaps)
|
|
57
|
+
export { OnchainService } from './services/onchain-service.js';
|
|
58
|
+
// Price Utilities
|
|
59
|
+
export { roundPrice, roundSize, validatePrice, validateSize, calculateBuyAmount, calculateSellPayout, calculateSharesForAmount, calculateSpread, calculateMidpoint, formatPrice, formatUSDC, calculatePnL, checkArbitrage, getEffectivePrices, ROUNDING_CONFIG, } from './utils/price-utils.js';
|
|
60
|
+
// NOTE: MCP tools have been moved to @catalyst-team/poly-mcp package
|
|
61
|
+
// See packages/poly-mcp/
|
|
62
|
+
// ===== Main SDK Class =====
|
|
63
|
+
import { RateLimiter } from './core/rate-limiter.js';
|
|
64
|
+
import { DataApiClient } from './clients/data-api.js';
|
|
65
|
+
import { GammaApiClient } from './clients/gamma-api.js';
|
|
66
|
+
import { SubgraphClient } from './clients/subgraph.js';
|
|
67
|
+
import { WalletService } from './services/wallet-service.js';
|
|
68
|
+
import { MarketService } from './services/market-service.js';
|
|
69
|
+
import { TradingService } from './services/trading-service.js';
|
|
70
|
+
import { RealtimeServiceV2 } from './services/realtime-service-v2.js';
|
|
71
|
+
import { SmartMoneyService } from './services/smart-money-service.js';
|
|
72
|
+
import { BinanceService } from './services/binance-service.js';
|
|
73
|
+
import { DipArbService } from './services/dip-arb-service.js';
|
|
74
|
+
import { createUnifiedCache } from './core/unified-cache.js';
|
|
75
|
+
export class PolymarketSDK {
|
|
76
|
+
// Infrastructure
|
|
77
|
+
rateLimiter;
|
|
78
|
+
cache;
|
|
79
|
+
// API Clients
|
|
80
|
+
dataApi;
|
|
81
|
+
gammaApi;
|
|
82
|
+
tradingService;
|
|
83
|
+
subgraph;
|
|
84
|
+
// Services
|
|
85
|
+
wallets;
|
|
86
|
+
markets;
|
|
87
|
+
realtime;
|
|
88
|
+
smartMoney;
|
|
89
|
+
binance;
|
|
90
|
+
dipArb;
|
|
91
|
+
// Initialization state
|
|
92
|
+
_initialized = false;
|
|
93
|
+
constructor(config = {}) {
|
|
94
|
+
// Initialize infrastructure
|
|
95
|
+
this.rateLimiter = new RateLimiter();
|
|
96
|
+
// Create unified cache (supports both legacy Cache and CacheAdapter)
|
|
97
|
+
this.cache = createUnifiedCache(config.cache);
|
|
98
|
+
// Initialize API clients
|
|
99
|
+
this.dataApi = new DataApiClient(this.rateLimiter, this.cache);
|
|
100
|
+
this.gammaApi = new GammaApiClient(this.rateLimiter, this.cache);
|
|
101
|
+
// TradingService requires a private key - use provided key or dummy key for read-only
|
|
102
|
+
const privateKey = config.privateKey || '0x' + '1'.repeat(64);
|
|
103
|
+
this.tradingService = new TradingService(this.rateLimiter, this.cache, {
|
|
104
|
+
privateKey,
|
|
105
|
+
chainId: config.chainId,
|
|
106
|
+
credentials: config.creds,
|
|
107
|
+
});
|
|
108
|
+
this.subgraph = new SubgraphClient(this.rateLimiter, this.cache);
|
|
109
|
+
// Initialize services
|
|
110
|
+
this.wallets = new WalletService(this.dataApi, this.subgraph, this.cache);
|
|
111
|
+
this.binance = new BinanceService(this.rateLimiter, this.cache);
|
|
112
|
+
this.markets = new MarketService(this.gammaApi, this.dataApi, this.rateLimiter, this.cache, undefined, this.binance);
|
|
113
|
+
this.realtime = new RealtimeServiceV2();
|
|
114
|
+
this.smartMoney = new SmartMoneyService(this.wallets, this.realtime, this.tradingService);
|
|
115
|
+
// Initialize DipArbService
|
|
116
|
+
this.dipArb = new DipArbService(this.realtime, this.tradingService, this.markets, config.privateKey, config.chainId);
|
|
117
|
+
}
|
|
118
|
+
// ===== Static Factory Methods =====
|
|
119
|
+
/**
|
|
120
|
+
* Create and initialize SDK in one call
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const sdk = await PolymarketSDK.create({ privateKey: '...' });
|
|
125
|
+
* // Ready to trade and track smart money
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
static async create(config = {}) {
|
|
129
|
+
const sdk = new PolymarketSDK(config);
|
|
130
|
+
await sdk.start();
|
|
131
|
+
return sdk;
|
|
132
|
+
}
|
|
133
|
+
// ===== Lifecycle Methods =====
|
|
134
|
+
/**
|
|
135
|
+
* Initialize the SDK (required for trading operations)
|
|
136
|
+
*/
|
|
137
|
+
async initialize() {
|
|
138
|
+
if (this._initialized)
|
|
139
|
+
return;
|
|
140
|
+
await this.tradingService.initialize();
|
|
141
|
+
this._initialized = true;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if SDK is initialized
|
|
145
|
+
*/
|
|
146
|
+
isInitialized() {
|
|
147
|
+
return this._initialized;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Start SDK - initialize trading + connect WebSocket
|
|
151
|
+
*
|
|
152
|
+
* One method to do everything:
|
|
153
|
+
* - Initialize trading service (derive API credentials)
|
|
154
|
+
* - Connect WebSocket
|
|
155
|
+
* - Wait for connection
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const sdk = new PolymarketSDK({ privateKey: '...' });
|
|
160
|
+
* await sdk.start();
|
|
161
|
+
* // Ready to use
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
async start(options = {}) {
|
|
165
|
+
await this.initialize();
|
|
166
|
+
this.connect();
|
|
167
|
+
await this.waitForConnection(options.timeout ?? 10000);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Connect to realtime WebSocket (required for smart money tracking)
|
|
171
|
+
*/
|
|
172
|
+
connect() {
|
|
173
|
+
this.realtime.connect();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Wait for WebSocket connection
|
|
177
|
+
*/
|
|
178
|
+
async waitForConnection(timeoutMs = 10000) {
|
|
179
|
+
// Already connected
|
|
180
|
+
if (this.realtime.isConnected?.()) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
return new Promise((resolve, reject) => {
|
|
184
|
+
const timeout = setTimeout(() => reject(new Error('Connection timeout')), timeoutMs);
|
|
185
|
+
this.realtime.once('connected', () => {
|
|
186
|
+
clearTimeout(timeout);
|
|
187
|
+
resolve();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Stop SDK - disconnect all services and clean up
|
|
193
|
+
*/
|
|
194
|
+
stop() {
|
|
195
|
+
this.dipArb.stop();
|
|
196
|
+
this.smartMoney.disconnect();
|
|
197
|
+
this.realtime.disconnect();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Disconnect all services and clean up
|
|
201
|
+
* @deprecated Use stop() instead
|
|
202
|
+
*/
|
|
203
|
+
disconnect() {
|
|
204
|
+
this.stop();
|
|
205
|
+
}
|
|
206
|
+
// ===== Unified Market Access =====
|
|
207
|
+
/**
|
|
208
|
+
* Get market by slug or condition ID
|
|
209
|
+
* Delegates to MarketService which handles merging Gamma and CLOB data
|
|
210
|
+
*/
|
|
211
|
+
async getMarket(identifier) {
|
|
212
|
+
return this.markets.getMarket(identifier);
|
|
213
|
+
}
|
|
214
|
+
// ===== Orderbook Analysis =====
|
|
215
|
+
/**
|
|
216
|
+
* Get processed orderbook with analytics
|
|
217
|
+
*/
|
|
218
|
+
async getOrderbook(conditionId) {
|
|
219
|
+
return this.markets.getProcessedOrderbook(conditionId);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Detect arbitrage opportunity
|
|
223
|
+
*
|
|
224
|
+
* 使用有效价格计算套利机会(正确考虑镜像订单)
|
|
225
|
+
* 详细文档见: docs/01-polymarket-orderbook-arbitrage.md
|
|
226
|
+
*/
|
|
227
|
+
async detectArbitrage(conditionId, threshold = 0.005) {
|
|
228
|
+
const orderbook = await this.getOrderbook(conditionId);
|
|
229
|
+
const { effectivePrices, longArbProfit, shortArbProfit } = orderbook.summary;
|
|
230
|
+
if (longArbProfit > threshold) {
|
|
231
|
+
return {
|
|
232
|
+
type: 'long',
|
|
233
|
+
profit: longArbProfit,
|
|
234
|
+
action: `Buy YES @ ${effectivePrices.effectiveBuyYes.toFixed(4)} + Buy NO @ ${effectivePrices.effectiveBuyNo.toFixed(4)}, merge for 1 USDC`,
|
|
235
|
+
expectedProfit: longArbProfit,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (shortArbProfit > threshold) {
|
|
239
|
+
return {
|
|
240
|
+
type: 'short',
|
|
241
|
+
profit: shortArbProfit,
|
|
242
|
+
action: `Split 1 USDC, Sell YES @ ${effectivePrices.effectiveSellYes.toFixed(4)} + Sell NO @ ${effectivePrices.effectiveSellNo.toFixed(4)}`,
|
|
243
|
+
expectedProfit: shortArbProfit,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
// ===== Cache Management =====
|
|
249
|
+
/**
|
|
250
|
+
* Clear all cached data
|
|
251
|
+
*/
|
|
252
|
+
clearCache() {
|
|
253
|
+
this.cache.clear();
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Invalidate cache for a specific market
|
|
257
|
+
*/
|
|
258
|
+
invalidateMarketCache(conditionId) {
|
|
259
|
+
this.cache.invalidate(conditionId);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzE,cAAc,iBAAiB,CAAC;AAIhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAwBtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAOxD,8DAA8D;AAC9D,qEAAqE;AAErE,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsB3E,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAiB7D,OAAO,EAAE,aAAa,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpG,oEAAoE;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AA0BtE,4EAA4E;AAE5E,2FAA2F;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAsBnE,6DAA6D;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAgBtE,2DAA2D;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAwB9D,wDAAwD;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAQ/D,mDAAmD;AACnD,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY;AACZ,wCAAwC;AACxC,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AA2BvC,uEAAuE;AACvE,6EAA6E;AAE7E,oCAAoC;AACpC,uEAAuE;AACvE,+DAA+D;AAC/D,OAAO,EACL,SAAS,EACT,YAAY,EACZ,aAAa,EAAY,wCAAwC;AACjE,oBAAoB,EAAK,wCAAwC;AACjE,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,UAAU,GACX,MAAM,yBAAyB,CAAC;AAYjC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,gCAAgC;AAChC,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,cAAc,EACd,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AAapC,sCAAsC;AACtC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,4BAA4B,CAAC;AASpC,0CAA0C;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAS3E,4EAA4E;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAO/D,kBAAkB;AAClB,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,qEAAqE;AACrE,yBAAyB;AAEzB,6BAA6B;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,yBAAyB,CAAC;AAKhF,MAAM,OAAO,aAAa;IACxB,iBAAiB;IACT,WAAW,CAAc;IACzB,KAAK,CAAe;IAE5B,cAAc;IACE,OAAO,CAAgB;IACvB,QAAQ,CAAiB;IACzB,cAAc,CAAiB;IAC/B,QAAQ,CAAiB;IAEzC,WAAW;IACK,OAAO,CAAgB;IACvB,OAAO,CAAgB;IACvB,QAAQ,CAAoB;IAC5B,UAAU,CAAoB;IAC9B,OAAO,CAAiB;IACxB,MAAM,CAAgB;IAEtC,uBAAuB;IACf,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,SAA8B,EAAE;QAC1C,4BAA4B;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QAErC,qEAAqE;QACrE,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9C,yBAAyB;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjE,sFAAsF;QACtF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE;YACrE,UAAU;YACV,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,KAAK;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjE,sBAAsB;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACrH,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CACrC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,cAAc,CACpB,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAC7B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,EACZ,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,OAAO,CACf,CAAC;IACJ,CAAC;IAED,qCAAqC;IAErC;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAA8B,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,gCAAgC;IAEhC;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK,CAAC,UAAgC,EAAE;QAC5C,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,YAAoB,KAAK;QAC/C,oBAAoB;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBACnC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,oCAAoC;IAEpC;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,iCAAiC;IAEjC;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,WAAmB;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACnB,WAAmB,EACnB,SAAS,GAAG,KAAK;QAEjB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;QAE7E,IAAI,aAAa,GAAG,SAAS,EAAE,CAAC;YAC9B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;gBACrB,MAAM,EAAE,aAAa,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB;gBAC3I,cAAc,EAAE,aAAa;aAC9B,CAAC;QACJ,CAAC;QAED,IAAI,cAAc,GAAG,SAAS,EAAE,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,cAAc;gBACtB,MAAM,EAAE,4BAA4B,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC3I,cAAc,EAAE,cAAc;aAC/B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAE/B;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,WAAmB;QACvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArbitrageService - Real-time Arbitrage Detection and Execution
|
|
3
|
+
*
|
|
4
|
+
* Uses WebSocket for real-time orderbook monitoring and automatically
|
|
5
|
+
* detects arbitrage opportunities in Polymarket binary markets.
|
|
6
|
+
*
|
|
7
|
+
* Strategy:
|
|
8
|
+
* - Long Arb: Buy YES + NO (effective cost < $1) → Merge → $1 USDC
|
|
9
|
+
* - Short Arb: Sell pre-held YES + NO tokens (effective revenue > $1)
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Real-time orderbook monitoring via WebSocket
|
|
13
|
+
* - Automatic arbitrage detection using effective prices
|
|
14
|
+
* - Configurable profit threshold and trade sizes
|
|
15
|
+
* - Auto-execute mode or event-based manual mode
|
|
16
|
+
* - Balance tracking and position management
|
|
17
|
+
*
|
|
18
|
+
* Based on: scripts/arb/faze-bo3-arb.ts
|
|
19
|
+
* Docs: docs/arbitrage.md
|
|
20
|
+
*/
|
|
21
|
+
import { EventEmitter } from 'events';
|
|
22
|
+
export interface ArbitrageMarketConfig {
|
|
23
|
+
/** Market name for logging */
|
|
24
|
+
name: string;
|
|
25
|
+
/** Condition ID */
|
|
26
|
+
conditionId: string;
|
|
27
|
+
/** YES token ID from CLOB API */
|
|
28
|
+
yesTokenId: string;
|
|
29
|
+
/** NO token ID from CLOB API */
|
|
30
|
+
noTokenId: string;
|
|
31
|
+
/** Outcome names [YES, NO] */
|
|
32
|
+
outcomes?: [string, string];
|
|
33
|
+
}
|
|
34
|
+
export interface ArbitrageServiceConfig {
|
|
35
|
+
/** Private key for trading (optional for monitor-only mode) */
|
|
36
|
+
privateKey?: string;
|
|
37
|
+
/** RPC URL for CTF operations */
|
|
38
|
+
rpcUrl?: string;
|
|
39
|
+
/** Minimum profit threshold (default: 0.005 = 0.5%) */
|
|
40
|
+
profitThreshold?: number;
|
|
41
|
+
/** Minimum trade size in USDC (default: 5) */
|
|
42
|
+
minTradeSize?: number;
|
|
43
|
+
/** Maximum single trade size in USDC (default: 100) */
|
|
44
|
+
maxTradeSize?: number;
|
|
45
|
+
/** Minimum token reserve for short arb (default: 10) */
|
|
46
|
+
minTokenReserve?: number;
|
|
47
|
+
/** Auto-execute mode (default: false) */
|
|
48
|
+
autoExecute?: boolean;
|
|
49
|
+
/** Enable logging (default: true) */
|
|
50
|
+
enableLogging?: boolean;
|
|
51
|
+
/** Cooldown between executions in ms (default: 5000) */
|
|
52
|
+
executionCooldown?: number;
|
|
53
|
+
/** Enable auto-rebalancing (default: false) */
|
|
54
|
+
enableRebalancer?: boolean;
|
|
55
|
+
/** Minimum USDC ratio 0-1 (default: 0.2 = 20%) - Split if below */
|
|
56
|
+
minUsdcRatio?: number;
|
|
57
|
+
/** Maximum USDC ratio 0-1 (default: 0.8 = 80%) - Merge if above */
|
|
58
|
+
maxUsdcRatio?: number;
|
|
59
|
+
/** Target USDC ratio when rebalancing (default: 0.5 = 50%) */
|
|
60
|
+
targetUsdcRatio?: number;
|
|
61
|
+
/** Max YES/NO imbalance before auto-fix (default: 5 tokens) */
|
|
62
|
+
imbalanceThreshold?: number;
|
|
63
|
+
/** Rebalance check interval in ms (default: 10000) */
|
|
64
|
+
rebalanceInterval?: number;
|
|
65
|
+
/** Minimum cooldown between rebalance actions in ms (default: 30000) */
|
|
66
|
+
rebalanceCooldown?: number;
|
|
67
|
+
/** Size safety factor 0-1 (default: 0.8) - use only 80% of orderbook depth to prevent partial fills */
|
|
68
|
+
sizeSafetyFactor?: number;
|
|
69
|
+
/** Auto-fix imbalance after failed execution (default: true) */
|
|
70
|
+
autoFixImbalance?: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface RebalanceAction {
|
|
73
|
+
type: 'split' | 'merge' | 'sell_yes' | 'sell_no' | 'none';
|
|
74
|
+
amount: number;
|
|
75
|
+
reason: string;
|
|
76
|
+
priority: number;
|
|
77
|
+
}
|
|
78
|
+
export interface RebalanceResult {
|
|
79
|
+
success: boolean;
|
|
80
|
+
action: RebalanceAction;
|
|
81
|
+
txHash?: string;
|
|
82
|
+
error?: string;
|
|
83
|
+
}
|
|
84
|
+
export interface SettleResult {
|
|
85
|
+
market: ArbitrageMarketConfig;
|
|
86
|
+
yesBalance: number;
|
|
87
|
+
noBalance: number;
|
|
88
|
+
pairedTokens: number;
|
|
89
|
+
unpairedYes: number;
|
|
90
|
+
unpairedNo: number;
|
|
91
|
+
merged: boolean;
|
|
92
|
+
mergeAmount?: number;
|
|
93
|
+
mergeTxHash?: string;
|
|
94
|
+
usdcRecovered?: number;
|
|
95
|
+
error?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface ClearPositionResult {
|
|
98
|
+
market: ArbitrageMarketConfig;
|
|
99
|
+
marketStatus: 'active' | 'resolved' | 'unknown';
|
|
100
|
+
yesBalance: number;
|
|
101
|
+
noBalance: number;
|
|
102
|
+
actions: ClearAction[];
|
|
103
|
+
totalUsdcRecovered: number;
|
|
104
|
+
success: boolean;
|
|
105
|
+
error?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface ClearAction {
|
|
108
|
+
type: 'merge' | 'sell_yes' | 'sell_no' | 'redeem';
|
|
109
|
+
amount: number;
|
|
110
|
+
usdcResult: number;
|
|
111
|
+
txHash?: string;
|
|
112
|
+
success: boolean;
|
|
113
|
+
error?: string;
|
|
114
|
+
}
|
|
115
|
+
export interface ScanCriteria {
|
|
116
|
+
/** Minimum 24h volume in USDC (default: 1000) */
|
|
117
|
+
minVolume24h?: number;
|
|
118
|
+
/** Maximum 24h volume (optional) */
|
|
119
|
+
maxVolume24h?: number;
|
|
120
|
+
/** Keywords to filter markets (optional) */
|
|
121
|
+
keywords?: string[];
|
|
122
|
+
/** Maximum number of markets to scan (default: 100) */
|
|
123
|
+
limit?: number;
|
|
124
|
+
}
|
|
125
|
+
export interface ScanResult {
|
|
126
|
+
/** Market config ready to use with start() */
|
|
127
|
+
market: ArbitrageMarketConfig;
|
|
128
|
+
/** Best arbitrage type */
|
|
129
|
+
arbType: 'long' | 'short' | 'none';
|
|
130
|
+
/** Profit rate (e.g., 0.01 = 1%) */
|
|
131
|
+
profitRate: number;
|
|
132
|
+
/** Profit percentage */
|
|
133
|
+
profitPercent: number;
|
|
134
|
+
/** Effective prices */
|
|
135
|
+
effectivePrices: {
|
|
136
|
+
buyYes: number;
|
|
137
|
+
buyNo: number;
|
|
138
|
+
sellYes: number;
|
|
139
|
+
sellNo: number;
|
|
140
|
+
longCost: number;
|
|
141
|
+
shortRevenue: number;
|
|
142
|
+
};
|
|
143
|
+
/** 24h volume */
|
|
144
|
+
volume24h: number;
|
|
145
|
+
/** Available size on orderbook */
|
|
146
|
+
availableSize: number;
|
|
147
|
+
/** Score 0-100 */
|
|
148
|
+
score: number;
|
|
149
|
+
/** Description */
|
|
150
|
+
description: string;
|
|
151
|
+
}
|
|
152
|
+
export interface OrderbookState {
|
|
153
|
+
yesBids: Array<{
|
|
154
|
+
price: number;
|
|
155
|
+
size: number;
|
|
156
|
+
}>;
|
|
157
|
+
yesAsks: Array<{
|
|
158
|
+
price: number;
|
|
159
|
+
size: number;
|
|
160
|
+
}>;
|
|
161
|
+
noBids: Array<{
|
|
162
|
+
price: number;
|
|
163
|
+
size: number;
|
|
164
|
+
}>;
|
|
165
|
+
noAsks: Array<{
|
|
166
|
+
price: number;
|
|
167
|
+
size: number;
|
|
168
|
+
}>;
|
|
169
|
+
lastUpdate: number;
|
|
170
|
+
}
|
|
171
|
+
export interface BalanceState {
|
|
172
|
+
usdc: number;
|
|
173
|
+
yesTokens: number;
|
|
174
|
+
noTokens: number;
|
|
175
|
+
lastUpdate: number;
|
|
176
|
+
}
|
|
177
|
+
export interface ArbitrageOpportunity {
|
|
178
|
+
type: 'long' | 'short';
|
|
179
|
+
/** Profit rate (0.01 = 1%) */
|
|
180
|
+
profitRate: number;
|
|
181
|
+
/** Profit in percentage */
|
|
182
|
+
profitPercent: number;
|
|
183
|
+
/** Effective buy/sell prices */
|
|
184
|
+
effectivePrices: {
|
|
185
|
+
buyYes: number;
|
|
186
|
+
buyNo: number;
|
|
187
|
+
sellYes: number;
|
|
188
|
+
sellNo: number;
|
|
189
|
+
};
|
|
190
|
+
/** Maximum executable size based on orderbook depth */
|
|
191
|
+
maxOrderbookSize: number;
|
|
192
|
+
/** Maximum executable size based on balance */
|
|
193
|
+
maxBalanceSize: number;
|
|
194
|
+
/** Recommended trade size */
|
|
195
|
+
recommendedSize: number;
|
|
196
|
+
/** Estimated profit in USDC */
|
|
197
|
+
estimatedProfit: number;
|
|
198
|
+
/** Description */
|
|
199
|
+
description: string;
|
|
200
|
+
/** Timestamp */
|
|
201
|
+
timestamp: number;
|
|
202
|
+
}
|
|
203
|
+
export interface ArbitrageExecutionResult {
|
|
204
|
+
success: boolean;
|
|
205
|
+
type: 'long' | 'short';
|
|
206
|
+
size: number;
|
|
207
|
+
profit: number;
|
|
208
|
+
txHashes: string[];
|
|
209
|
+
error?: string;
|
|
210
|
+
executionTimeMs: number;
|
|
211
|
+
}
|
|
212
|
+
export interface ArbitrageServiceEvents {
|
|
213
|
+
opportunity: (opportunity: ArbitrageOpportunity) => void;
|
|
214
|
+
execution: (result: ArbitrageExecutionResult) => void;
|
|
215
|
+
balanceUpdate: (balance: BalanceState) => void;
|
|
216
|
+
orderbookUpdate: (orderbook: OrderbookState) => void;
|
|
217
|
+
rebalance: (result: RebalanceResult) => void;
|
|
218
|
+
settle: (result: SettleResult) => void;
|
|
219
|
+
error: (error: Error) => void;
|
|
220
|
+
started: (market: ArbitrageMarketConfig) => void;
|
|
221
|
+
stopped: () => void;
|
|
222
|
+
}
|
|
223
|
+
export declare class ArbitrageService extends EventEmitter {
|
|
224
|
+
private realtimeService;
|
|
225
|
+
private marketSubscription;
|
|
226
|
+
private ctf;
|
|
227
|
+
private tradingService;
|
|
228
|
+
private rateLimiter;
|
|
229
|
+
private market;
|
|
230
|
+
private config;
|
|
231
|
+
private orderbook;
|
|
232
|
+
private balance;
|
|
233
|
+
private isExecuting;
|
|
234
|
+
private lastExecutionTime;
|
|
235
|
+
private lastRebalanceTime;
|
|
236
|
+
private balanceUpdateInterval;
|
|
237
|
+
private rebalanceInterval;
|
|
238
|
+
private isRunning;
|
|
239
|
+
private totalCapital;
|
|
240
|
+
private stats;
|
|
241
|
+
constructor(config?: ArbitrageServiceConfig);
|
|
242
|
+
/**
|
|
243
|
+
* Start monitoring a market for arbitrage opportunities
|
|
244
|
+
*/
|
|
245
|
+
start(market: ArbitrageMarketConfig): Promise<void>;
|
|
246
|
+
/**
|
|
247
|
+
* Stop monitoring
|
|
248
|
+
*/
|
|
249
|
+
stop(): Promise<void>;
|
|
250
|
+
/**
|
|
251
|
+
* Get current orderbook state
|
|
252
|
+
*/
|
|
253
|
+
getOrderbook(): OrderbookState;
|
|
254
|
+
/**
|
|
255
|
+
* Get current balance state
|
|
256
|
+
*/
|
|
257
|
+
getBalance(): BalanceState;
|
|
258
|
+
/**
|
|
259
|
+
* Get statistics
|
|
260
|
+
*/
|
|
261
|
+
getStats(): {
|
|
262
|
+
runningTimeMs: number;
|
|
263
|
+
opportunitiesDetected: number;
|
|
264
|
+
executionsAttempted: number;
|
|
265
|
+
executionsSucceeded: number;
|
|
266
|
+
totalProfit: number;
|
|
267
|
+
startTime: number;
|
|
268
|
+
};
|
|
269
|
+
/**
|
|
270
|
+
* Check for arbitrage opportunity based on current orderbook
|
|
271
|
+
*/
|
|
272
|
+
checkOpportunity(): ArbitrageOpportunity | null;
|
|
273
|
+
/**
|
|
274
|
+
* Manually execute an arbitrage opportunity
|
|
275
|
+
*/
|
|
276
|
+
execute(opportunity: ArbitrageOpportunity): Promise<ArbitrageExecutionResult>;
|
|
277
|
+
/**
|
|
278
|
+
* Calculate recommended rebalance action based on current state
|
|
279
|
+
*/
|
|
280
|
+
calculateRebalanceAction(): RebalanceAction;
|
|
281
|
+
/**
|
|
282
|
+
* Execute a rebalance action
|
|
283
|
+
*/
|
|
284
|
+
rebalance(action?: RebalanceAction): Promise<RebalanceResult>;
|
|
285
|
+
/**
|
|
286
|
+
* Settle a market position - merge paired tokens to recover USDC
|
|
287
|
+
* @param market Market to settle (defaults to current market)
|
|
288
|
+
* @param execute If true, execute the merge. If false, just return info.
|
|
289
|
+
*/
|
|
290
|
+
settlePosition(market?: ArbitrageMarketConfig, execute?: boolean): Promise<SettleResult>;
|
|
291
|
+
/**
|
|
292
|
+
* Settle multiple markets at once
|
|
293
|
+
*/
|
|
294
|
+
settleMultiple(markets: ArbitrageMarketConfig[], execute?: boolean): Promise<SettleResult[]>;
|
|
295
|
+
/**
|
|
296
|
+
* Clear all positions in a market using the best strategy
|
|
297
|
+
*
|
|
298
|
+
* Strategy:
|
|
299
|
+
* - Active market: Merge paired tokens → Sell remaining unpaired tokens
|
|
300
|
+
* - Resolved market: Redeem winning tokens
|
|
301
|
+
*
|
|
302
|
+
* @param market Market to clear positions from
|
|
303
|
+
* @param execute If true, execute the clearing. If false, just return info.
|
|
304
|
+
* @returns Result with all actions taken
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* ```typescript
|
|
308
|
+
* const service = new ArbitrageService({ privateKey: '0x...' });
|
|
309
|
+
*
|
|
310
|
+
* // View clearing plan
|
|
311
|
+
* const plan = await service.clearPositions(market, false);
|
|
312
|
+
* console.log(`Will recover: $${plan.totalUsdcRecovered}`);
|
|
313
|
+
*
|
|
314
|
+
* // Execute clearing
|
|
315
|
+
* const result = await service.clearPositions(market, true);
|
|
316
|
+
* ```
|
|
317
|
+
*/
|
|
318
|
+
clearPositions(market: ArbitrageMarketConfig, execute?: boolean): Promise<ClearPositionResult>;
|
|
319
|
+
/**
|
|
320
|
+
* Clear positions from multiple markets
|
|
321
|
+
*
|
|
322
|
+
* @param markets Markets to clear
|
|
323
|
+
* @param execute If true, execute clearing
|
|
324
|
+
* @returns Results for all markets
|
|
325
|
+
*/
|
|
326
|
+
clearAllPositions(markets: ArbitrageMarketConfig[], execute?: boolean): Promise<ClearPositionResult[]>;
|
|
327
|
+
private handleBookUpdate;
|
|
328
|
+
private checkAndHandleOpportunity;
|
|
329
|
+
private checkAndRebalance;
|
|
330
|
+
/**
|
|
331
|
+
* Fix YES/NO imbalance immediately after partial execution
|
|
332
|
+
* This is critical when one side of a parallel order fails
|
|
333
|
+
*/
|
|
334
|
+
private fixImbalanceIfNeeded;
|
|
335
|
+
private updateBalance;
|
|
336
|
+
private executeLongArb;
|
|
337
|
+
private executeShortArb;
|
|
338
|
+
private log;
|
|
339
|
+
/**
|
|
340
|
+
* Scan markets for arbitrage opportunities
|
|
341
|
+
*
|
|
342
|
+
* @param criteria Filter criteria for markets
|
|
343
|
+
* @param minProfit Minimum profit threshold (default: 0.005 = 0.5%)
|
|
344
|
+
* @returns Array of scan results sorted by profit
|
|
345
|
+
*
|
|
346
|
+
* @example
|
|
347
|
+
* ```typescript
|
|
348
|
+
* const service = new ArbitrageService({ privateKey: '0x...' });
|
|
349
|
+
*
|
|
350
|
+
* // Scan markets with at least $5000 volume
|
|
351
|
+
* const results = await service.scanMarkets({ minVolume24h: 5000 }, 0.005);
|
|
352
|
+
*
|
|
353
|
+
* // Start arbitraging the best opportunity
|
|
354
|
+
* if (results.length > 0 && results[0].arbType !== 'none') {
|
|
355
|
+
* await service.start(results[0].market);
|
|
356
|
+
* }
|
|
357
|
+
* ```
|
|
358
|
+
*/
|
|
359
|
+
scanMarkets(criteria?: ScanCriteria, minProfit?: number): Promise<ScanResult[]>;
|
|
360
|
+
/**
|
|
361
|
+
* Quick scan for best arbitrage opportunities
|
|
362
|
+
*
|
|
363
|
+
* @param minProfit Minimum profit threshold (default: 0.005 = 0.5%)
|
|
364
|
+
* @param limit Maximum number of results to return (default: 10)
|
|
365
|
+
* @returns Top arbitrage opportunities
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* ```typescript
|
|
369
|
+
* const service = new ArbitrageService({ privateKey: '0x...' });
|
|
370
|
+
*
|
|
371
|
+
* // Find best arbitrage opportunities
|
|
372
|
+
* const top = await service.quickScan(0.005, 5);
|
|
373
|
+
*
|
|
374
|
+
* // Print results
|
|
375
|
+
* for (const r of top) {
|
|
376
|
+
* console.log(`${r.market.name}: ${r.arbType} +${r.profitPercent.toFixed(2)}%`);
|
|
377
|
+
* }
|
|
378
|
+
*
|
|
379
|
+
* // Start the best one
|
|
380
|
+
* if (top.length > 0) {
|
|
381
|
+
* await service.start(top[0].market);
|
|
382
|
+
* }
|
|
383
|
+
* ```
|
|
384
|
+
*/
|
|
385
|
+
quickScan(minProfit?: number, limit?: number): Promise<ScanResult[]>;
|
|
386
|
+
/**
|
|
387
|
+
* Find and start arbitraging the best opportunity
|
|
388
|
+
*
|
|
389
|
+
* @param minProfit Minimum profit threshold (default: 0.005 = 0.5%)
|
|
390
|
+
* @returns The scan result that was started, or null if none found
|
|
391
|
+
*
|
|
392
|
+
* @example
|
|
393
|
+
* ```typescript
|
|
394
|
+
* const service = new ArbitrageService({
|
|
395
|
+
* privateKey: '0x...',
|
|
396
|
+
* autoExecute: true,
|
|
397
|
+
* profitThreshold: 0.005,
|
|
398
|
+
* });
|
|
399
|
+
*
|
|
400
|
+
* // Find and start the best opportunity
|
|
401
|
+
* const started = await service.findAndStart(0.005);
|
|
402
|
+
* if (started) {
|
|
403
|
+
* console.log(`Started: ${started.market.name} (+${started.profitPercent.toFixed(2)}%)`);
|
|
404
|
+
* }
|
|
405
|
+
* ```
|
|
406
|
+
*/
|
|
407
|
+
findAndStart(minProfit?: number): Promise<ScanResult | null>;
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=arbitrage-service.d.ts.map
|