@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.
Files changed (277) hide show
  1. package/README.md +665 -807
  2. package/README.zh-CN.md +645 -342
  3. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
  4. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/integration/arbitrage-service.integration.test.js +267 -0
  6. package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
  7. package/dist/__tests__/integration/data-api.integration.test.js +6 -3
  8. package/dist/__tests__/integration/data-api.integration.test.js.map +1 -1
  9. package/dist/__tests__/integration/market-service.integration.test.d.ts +10 -0
  10. package/dist/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/integration/market-service.integration.test.js +173 -0
  12. package/dist/__tests__/integration/market-service.integration.test.js.map +1 -0
  13. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
  14. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
  15. package/dist/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
  16. package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
  17. package/dist/__tests__/integration/trading-service.integration.test.d.ts +10 -0
  18. package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
  19. package/dist/__tests__/integration/trading-service.integration.test.js +58 -0
  20. package/dist/__tests__/integration/trading-service.integration.test.js.map +1 -0
  21. package/dist/clients/clob-api.d.ts +73 -0
  22. package/dist/clients/clob-api.d.ts.map +1 -1
  23. package/dist/clients/clob-api.js +60 -0
  24. package/dist/clients/clob-api.js.map +1 -1
  25. package/dist/clients/ctf-client.d.ts +6 -4
  26. package/dist/clients/ctf-client.d.ts.map +1 -1
  27. package/dist/clients/ctf-client.js.map +1 -1
  28. package/dist/clients/data-api.d.ts +333 -15
  29. package/dist/clients/data-api.d.ts.map +1 -1
  30. package/dist/clients/data-api.js +398 -26
  31. package/dist/clients/data-api.js.map +1 -1
  32. package/dist/clients/gamma-api.d.ts +5 -0
  33. package/dist/clients/gamma-api.d.ts.map +1 -1
  34. package/dist/clients/gamma-api.js +2 -0
  35. package/dist/clients/gamma-api.js.map +1 -1
  36. package/dist/clients/subgraph.d.ts +196 -0
  37. package/dist/clients/subgraph.d.ts.map +1 -0
  38. package/dist/clients/subgraph.js +332 -0
  39. package/dist/clients/subgraph.js.map +1 -0
  40. package/dist/clients/websocket-manager.d.ts +3 -0
  41. package/dist/clients/websocket-manager.d.ts.map +1 -1
  42. package/dist/clients/websocket-manager.js +10 -3
  43. package/dist/clients/websocket-manager.js.map +1 -1
  44. package/dist/core/cache.d.ts +3 -0
  45. package/dist/core/cache.d.ts.map +1 -1
  46. package/dist/core/cache.js +5 -0
  47. package/dist/core/cache.js.map +1 -1
  48. package/dist/core/errors.d.ts +2 -1
  49. package/dist/core/errors.d.ts.map +1 -1
  50. package/dist/core/errors.js +2 -0
  51. package/dist/core/errors.js.map +1 -1
  52. package/dist/core/rate-limiter.d.ts +3 -1
  53. package/dist/core/rate-limiter.d.ts.map +1 -1
  54. package/dist/core/rate-limiter.js +12 -0
  55. package/dist/core/rate-limiter.js.map +1 -1
  56. package/dist/core/types.d.ts +205 -13
  57. package/dist/core/types.d.ts.map +1 -1
  58. package/dist/core/types.js +30 -0
  59. package/dist/core/types.js.map +1 -1
  60. package/dist/core/types.test.d.ts +7 -0
  61. package/dist/core/types.test.d.ts.map +1 -0
  62. package/dist/core/types.test.js +122 -0
  63. package/dist/core/types.test.js.map +1 -0
  64. package/dist/index.d.ts +84 -18
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +139 -132
  67. package/dist/index.js.map +1 -1
  68. package/dist/scripts/dip-arb/auto-trade.d.ts +20 -0
  69. package/dist/scripts/dip-arb/auto-trade.d.ts.map +1 -0
  70. package/dist/scripts/dip-arb/auto-trade.js +373 -0
  71. package/dist/scripts/dip-arb/auto-trade.js.map +1 -0
  72. package/dist/scripts/dip-arb/example-basic.d.ts +30 -0
  73. package/dist/scripts/dip-arb/example-basic.d.ts.map +1 -0
  74. package/dist/scripts/dip-arb/example-basic.js +222 -0
  75. package/dist/scripts/dip-arb/example-basic.js.map +1 -0
  76. package/dist/scripts/dip-arb/redeem-positions.d.ts +11 -0
  77. package/dist/scripts/dip-arb/redeem-positions.d.ts.map +1 -0
  78. package/dist/scripts/dip-arb/redeem-positions.js +201 -0
  79. package/dist/scripts/dip-arb/redeem-positions.js.map +1 -0
  80. package/dist/scripts/dip-arb/scan-markets.d.ts +6 -0
  81. package/dist/scripts/dip-arb/scan-markets.d.ts.map +1 -0
  82. package/dist/scripts/dip-arb/scan-markets.js +73 -0
  83. package/dist/scripts/dip-arb/scan-markets.js.map +1 -0
  84. package/dist/services/arbitrage-service.d.ts +3 -2
  85. package/dist/services/arbitrage-service.d.ts.map +1 -1
  86. package/dist/services/arbitrage-service.js +71 -43
  87. package/dist/services/arbitrage-service.js.map +1 -1
  88. package/dist/services/binance-service.d.ts +154 -0
  89. package/dist/services/binance-service.d.ts.map +1 -0
  90. package/dist/services/binance-service.js +266 -0
  91. package/dist/services/binance-service.js.map +1 -0
  92. package/dist/services/dip-arb-service.d.ts +209 -0
  93. package/dist/services/dip-arb-service.d.ts.map +1 -0
  94. package/dist/services/dip-arb-service.js +1602 -0
  95. package/dist/services/dip-arb-service.js.map +1 -0
  96. package/dist/services/dip-arb-types.d.ts +553 -0
  97. package/dist/services/dip-arb-types.d.ts.map +1 -0
  98. package/dist/services/dip-arb-types.js +164 -0
  99. package/dist/services/dip-arb-types.js.map +1 -0
  100. package/dist/services/market-service.d.ts +267 -8
  101. package/dist/services/market-service.d.ts.map +1 -1
  102. package/dist/services/market-service.js +771 -42
  103. package/dist/services/market-service.js.map +1 -1
  104. package/dist/services/onchain-service.d.ts +309 -0
  105. package/dist/services/onchain-service.d.ts.map +1 -0
  106. package/dist/services/onchain-service.js +417 -0
  107. package/dist/services/onchain-service.js.map +1 -0
  108. package/dist/services/realtime-service-v2.d.ts +362 -0
  109. package/dist/services/realtime-service-v2.d.ts.map +1 -0
  110. package/dist/services/realtime-service-v2.js +858 -0
  111. package/dist/services/realtime-service-v2.js.map +1 -0
  112. package/dist/services/realtime-service.d.ts +17 -17
  113. package/dist/services/realtime-service.d.ts.map +1 -1
  114. package/dist/services/realtime-service.js +91 -59
  115. package/dist/services/realtime-service.js.map +1 -1
  116. package/dist/services/smart-money-service.d.ts +352 -0
  117. package/dist/services/smart-money-service.d.ts.map +1 -0
  118. package/dist/services/smart-money-service.js +582 -0
  119. package/dist/services/smart-money-service.js.map +1 -0
  120. package/dist/services/trading-service.d.ts +177 -0
  121. package/dist/services/trading-service.d.ts.map +1 -0
  122. package/dist/services/trading-service.js +422 -0
  123. package/dist/services/trading-service.js.map +1 -0
  124. package/dist/services/wallet-service.d.ts +225 -3
  125. package/dist/services/wallet-service.d.ts.map +1 -1
  126. package/dist/services/wallet-service.js +511 -3
  127. package/dist/services/wallet-service.js.map +1 -1
  128. package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
  129. package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
  130. package/dist/src/__tests__/integration/arbitrage-service.integration.test.js +267 -0
  131. package/dist/src/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
  132. package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
  133. package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
  134. package/dist/src/__tests__/integration/bridge-client.integration.test.js +260 -0
  135. package/dist/src/__tests__/integration/bridge-client.integration.test.js.map +1 -0
  136. package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
  137. package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
  138. package/dist/src/__tests__/integration/ctf-client.integration.test.js +234 -0
  139. package/dist/src/__tests__/integration/ctf-client.integration.test.js.map +1 -0
  140. package/dist/src/__tests__/integration/data-api.integration.test.d.ts +9 -0
  141. package/dist/src/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
  142. package/dist/src/__tests__/integration/data-api.integration.test.js +164 -0
  143. package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -0
  144. package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
  145. package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
  146. package/dist/src/__tests__/integration/gamma-api.integration.test.js +170 -0
  147. package/dist/src/__tests__/integration/gamma-api.integration.test.js.map +1 -0
  148. package/dist/src/__tests__/integration/market-service.integration.test.d.ts +10 -0
  149. package/dist/src/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
  150. package/dist/src/__tests__/integration/market-service.integration.test.js +180 -0
  151. package/dist/src/__tests__/integration/market-service.integration.test.js.map +1 -0
  152. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
  153. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
  154. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
  155. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
  156. package/dist/src/__tests__/integration/trading-service.integration.test.d.ts +10 -0
  157. package/dist/src/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
  158. package/dist/src/__tests__/integration/trading-service.integration.test.js +58 -0
  159. package/dist/src/__tests__/integration/trading-service.integration.test.js.map +1 -0
  160. package/dist/src/__tests__/test-utils.d.ts +92 -0
  161. package/dist/src/__tests__/test-utils.d.ts.map +1 -0
  162. package/dist/src/__tests__/test-utils.js +143 -0
  163. package/dist/src/__tests__/test-utils.js.map +1 -0
  164. package/dist/src/clients/bridge-client.d.ts +388 -0
  165. package/dist/src/clients/bridge-client.d.ts.map +1 -0
  166. package/dist/src/clients/bridge-client.js +587 -0
  167. package/dist/src/clients/bridge-client.js.map +1 -0
  168. package/dist/src/clients/ctf-client.d.ts +475 -0
  169. package/dist/src/clients/ctf-client.d.ts.map +1 -0
  170. package/dist/src/clients/ctf-client.js +915 -0
  171. package/dist/src/clients/ctf-client.js.map +1 -0
  172. package/dist/src/clients/data-api.d.ts +452 -0
  173. package/dist/src/clients/data-api.d.ts.map +1 -0
  174. package/dist/src/clients/data-api.js +637 -0
  175. package/dist/src/clients/data-api.js.map +1 -0
  176. package/dist/src/clients/gamma-api.d.ts +421 -0
  177. package/dist/src/clients/gamma-api.d.ts.map +1 -0
  178. package/dist/src/clients/gamma-api.js +359 -0
  179. package/dist/src/clients/gamma-api.js.map +1 -0
  180. package/dist/src/clients/subgraph.d.ts +196 -0
  181. package/dist/src/clients/subgraph.d.ts.map +1 -0
  182. package/dist/src/clients/subgraph.js +332 -0
  183. package/dist/src/clients/subgraph.js.map +1 -0
  184. package/dist/src/core/cache-adapter-bridge.d.ts +36 -0
  185. package/dist/src/core/cache-adapter-bridge.d.ts.map +1 -0
  186. package/dist/src/core/cache-adapter-bridge.js +81 -0
  187. package/dist/src/core/cache-adapter-bridge.js.map +1 -0
  188. package/dist/src/core/cache.d.ts +43 -0
  189. package/dist/src/core/cache.d.ts.map +1 -0
  190. package/dist/src/core/cache.js +76 -0
  191. package/dist/src/core/cache.js.map +1 -0
  192. package/dist/src/core/errors.d.ts +39 -0
  193. package/dist/src/core/errors.d.ts.map +1 -0
  194. package/dist/src/core/errors.js +86 -0
  195. package/dist/src/core/errors.js.map +1 -0
  196. package/dist/src/core/rate-limiter.d.ts +33 -0
  197. package/dist/src/core/rate-limiter.d.ts.map +1 -0
  198. package/dist/src/core/rate-limiter.js +82 -0
  199. package/dist/src/core/rate-limiter.js.map +1 -0
  200. package/dist/src/core/types.d.ts +506 -0
  201. package/dist/src/core/types.d.ts.map +1 -0
  202. package/dist/src/core/types.js +49 -0
  203. package/dist/src/core/types.js.map +1 -0
  204. package/dist/src/core/types.test.d.ts +7 -0
  205. package/dist/src/core/types.test.d.ts.map +1 -0
  206. package/dist/src/core/types.test.js +122 -0
  207. package/dist/src/core/types.test.js.map +1 -0
  208. package/dist/src/core/unified-cache.d.ts +63 -0
  209. package/dist/src/core/unified-cache.d.ts.map +1 -0
  210. package/dist/src/core/unified-cache.js +114 -0
  211. package/dist/src/core/unified-cache.js.map +1 -0
  212. package/dist/src/index.d.ts +159 -0
  213. package/dist/src/index.d.ts.map +1 -0
  214. package/dist/src/index.js +262 -0
  215. package/dist/src/index.js.map +1 -0
  216. package/dist/src/services/arbitrage-service.d.ts +409 -0
  217. package/dist/src/services/arbitrage-service.d.ts.map +1 -0
  218. package/dist/src/services/arbitrage-service.js +1450 -0
  219. package/dist/src/services/arbitrage-service.js.map +1 -0
  220. package/dist/src/services/authorization-service.d.ts +97 -0
  221. package/dist/src/services/authorization-service.d.ts.map +1 -0
  222. package/dist/src/services/authorization-service.js +279 -0
  223. package/dist/src/services/authorization-service.js.map +1 -0
  224. package/dist/src/services/binance-service.d.ts +154 -0
  225. package/dist/src/services/binance-service.d.ts.map +1 -0
  226. package/dist/src/services/binance-service.js +266 -0
  227. package/dist/src/services/binance-service.js.map +1 -0
  228. package/dist/src/services/dip-arb-service.d.ts +245 -0
  229. package/dist/src/services/dip-arb-service.d.ts.map +1 -0
  230. package/dist/src/services/dip-arb-service.js +1865 -0
  231. package/dist/src/services/dip-arb-service.js.map +1 -0
  232. package/dist/src/services/dip-arb-types.d.ts +553 -0
  233. package/dist/src/services/dip-arb-types.d.ts.map +1 -0
  234. package/dist/src/services/dip-arb-types.js +164 -0
  235. package/dist/src/services/dip-arb-types.js.map +1 -0
  236. package/dist/src/services/market-service.d.ts +370 -0
  237. package/dist/src/services/market-service.d.ts.map +1 -0
  238. package/dist/src/services/market-service.js +1200 -0
  239. package/dist/src/services/market-service.js.map +1 -0
  240. package/dist/src/services/onchain-service.d.ts +309 -0
  241. package/dist/src/services/onchain-service.d.ts.map +1 -0
  242. package/dist/src/services/onchain-service.js +417 -0
  243. package/dist/src/services/onchain-service.js.map +1 -0
  244. package/dist/src/services/realtime-service-v2.d.ts +367 -0
  245. package/dist/src/services/realtime-service-v2.d.ts.map +1 -0
  246. package/dist/src/services/realtime-service-v2.js +876 -0
  247. package/dist/src/services/realtime-service-v2.js.map +1 -0
  248. package/dist/src/services/smart-money-service.d.ts +352 -0
  249. package/dist/src/services/smart-money-service.d.ts.map +1 -0
  250. package/dist/src/services/smart-money-service.js +582 -0
  251. package/dist/src/services/smart-money-service.js.map +1 -0
  252. package/dist/src/services/swap-service.d.ts +217 -0
  253. package/dist/src/services/swap-service.d.ts.map +1 -0
  254. package/dist/src/services/swap-service.js +695 -0
  255. package/dist/src/services/swap-service.js.map +1 -0
  256. package/dist/src/services/trading-service.d.ts +177 -0
  257. package/dist/src/services/trading-service.d.ts.map +1 -0
  258. package/dist/src/services/trading-service.js +422 -0
  259. package/dist/src/services/trading-service.js.map +1 -0
  260. package/dist/src/services/wallet-service.d.ts +316 -0
  261. package/dist/src/services/wallet-service.d.ts.map +1 -0
  262. package/dist/src/services/wallet-service.js +681 -0
  263. package/dist/src/services/wallet-service.js.map +1 -0
  264. package/dist/src/utils/price-utils.d.ts +153 -0
  265. package/dist/src/utils/price-utils.d.ts.map +1 -0
  266. package/dist/src/utils/price-utils.js +236 -0
  267. package/dist/src/utils/price-utils.js.map +1 -0
  268. package/dist/src/utils/price-utils.test.d.ts +5 -0
  269. package/dist/src/utils/price-utils.test.d.ts.map +1 -0
  270. package/dist/src/utils/price-utils.test.js +192 -0
  271. package/dist/src/utils/price-utils.test.js.map +1 -0
  272. package/dist/utils/price-utils.test.d.ts +5 -0
  273. package/dist/utils/price-utils.test.d.ts.map +1 -0
  274. package/dist/utils/price-utils.test.js +192 -0
  275. package/dist/utils/price-utils.test.js.map +1 -0
  276. package/package.json +6 -5
  277. package/README.en.md +0 -502
@@ -0,0 +1,373 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * DipArb Auto Trading - 15m Crypto Markets
4
+ *
5
+ * ē­–ē•„åŽŸē†ļ¼š
6
+ * 1. 检测 10 秒内 5% ä»„äøŠēš„ēž¬ę—¶ęš“č·Œ
7
+ * 2. ä¹°å…„ęš“č·Œä¾§ (Leg1)
8
+ * 3. ē­‰å¾…åÆ¹ä¾§ä»·ę ¼äø‹é™ļ¼Œę»”č¶³ sumTarget 后买兄 (Leg2)
9
+ * 4. åŒęŒä»“é”å®šåˆ©ę¶¦ļ¼šUP + DOWN = $1
10
+ *
11
+ * ę—„åæ—ļ¼šęÆäøŖåø‚åœŗå•ē‹¬äø€äøŖę—„åæ—ę–‡ä»¶ļ¼Œå­˜ę”¾åœØ /tmp/dip-arb-logs/
12
+ *
13
+ * Run with:
14
+ * npx tsx scripts/dip-arb/auto-trade.ts --eth
15
+ * npx tsx scripts/dip-arb/auto-trade.ts --btc
16
+ * npx tsx scripts/dip-arb/auto-trade.ts --sol
17
+ * npx tsx scripts/dip-arb/auto-trade.ts --xrp
18
+ */
19
+ import * as fs from 'fs';
20
+ import * as path from 'path';
21
+ import { PolymarketSDK } from '../../src/index.js';
22
+ function parseArgs() {
23
+ const args = process.argv.slice(2);
24
+ // č§£ęžåøē§
25
+ let coin = 'ETH';
26
+ if (args.includes('--btc') || args.includes('-b'))
27
+ coin = 'BTC';
28
+ else if (args.includes('--eth') || args.includes('-e'))
29
+ coin = 'ETH';
30
+ else if (args.includes('--sol') || args.includes('-s'))
31
+ coin = 'SOL';
32
+ else if (args.includes('--xrp') || args.includes('-x'))
33
+ coin = 'XRP';
34
+ // č§£ęžę•°å€¼å‚ę•°
35
+ const getArgValue = (name, defaultVal) => {
36
+ const arg = args.find(a => a.startsWith(`--${name}=`));
37
+ if (arg) {
38
+ const val = parseFloat(arg.split('=')[1]);
39
+ return isNaN(val) ? defaultVal : val;
40
+ }
41
+ return defaultVal;
42
+ };
43
+ // åøē§é»˜č®¤å‚ę•°
44
+ const coinDefaults = {
45
+ XRP: { dipThreshold: 0.40, slidingWindowMs: 3000, leg2TimeoutSeconds: 60, sumTarget: 0.85 },
46
+ SOL: { dipThreshold: 0.40, slidingWindowMs: 3000, leg2TimeoutSeconds: 60, sumTarget: 0.85 },
47
+ ETH: { dipThreshold: 0.30, slidingWindowMs: 5000, leg2TimeoutSeconds: 60, sumTarget: 0.93 },
48
+ BTC: { dipThreshold: 0.20, slidingWindowMs: 5000, leg2TimeoutSeconds: 60, sumTarget: 0.95 },
49
+ };
50
+ const defaults = coinDefaults[coin];
51
+ return {
52
+ coin,
53
+ dipThreshold: getArgValue('dip', defaults.dipThreshold),
54
+ slidingWindowMs: getArgValue('window', defaults.slidingWindowMs),
55
+ leg2TimeoutSeconds: getArgValue('timeout', defaults.leg2TimeoutSeconds),
56
+ sumTarget: getArgValue('target', defaults.sumTarget),
57
+ shares: getArgValue('shares', 25),
58
+ };
59
+ }
60
+ const CLI_ARGS = parseArgs();
61
+ const SELECTED_COIN = CLI_ARGS.coin;
62
+ // Config
63
+ const PRIVATE_KEY = process.env.PRIVATE_KEY || '';
64
+ const MONITOR_DURATION_MS = 60 * 60 * 1000; // 1 hour
65
+ const LOG_DIR = '/tmp/dip-arb-logs';
66
+ if (!PRIVATE_KEY) {
67
+ console.error('Error: PRIVATE_KEY environment variable is required');
68
+ process.exit(1);
69
+ }
70
+ // Ensure log directory exists
71
+ if (!fs.existsSync(LOG_DIR)) {
72
+ fs.mkdirSync(LOG_DIR, { recursive: true });
73
+ }
74
+ // ========================================
75
+ // Per-Market Logging
76
+ // ========================================
77
+ let currentMarketSlug = null;
78
+ let currentLogs = [];
79
+ let currentLogPath = null;
80
+ function getLogFilename(marketSlug) {
81
+ const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
82
+ const time = new Date().toISOString().slice(11, 19).replace(/:/g, ''); // HHMMSS
83
+ return path.join(LOG_DIR, `${date}_${time}_${marketSlug}.log`);
84
+ }
85
+ function log(msg) {
86
+ const timestamp = new Date().toISOString().slice(11, 19);
87
+ const line = `[${timestamp}] ${msg}`;
88
+ console.log(line);
89
+ currentLogs.push(line);
90
+ }
91
+ function sdkLogHandler(message) {
92
+ const timestamp = new Date().toISOString().slice(11, 19);
93
+ const line = `[${timestamp}] ${message}`;
94
+ console.log(line);
95
+ currentLogs.push(line);
96
+ }
97
+ function saveCurrentLog(suffix) {
98
+ if (currentLogs.length === 0)
99
+ return;
100
+ const logPath = currentLogPath || path.join(LOG_DIR, `unknown_${Date.now()}.log`);
101
+ const finalPath = suffix ? logPath.replace('.log', `_${suffix}.log`) : logPath;
102
+ fs.writeFileSync(finalPath, currentLogs.join('\n'));
103
+ console.log(`šŸ“ Log saved: ${finalPath} (${currentLogs.length} lines)`);
104
+ }
105
+ function startNewMarketLog(marketSlug) {
106
+ // Save previous market log if exists
107
+ if (currentLogs.length > 0 && currentMarketSlug) {
108
+ saveCurrentLog();
109
+ }
110
+ // Start new log
111
+ currentMarketSlug = marketSlug;
112
+ currentLogs = [];
113
+ currentLogPath = getLogFilename(marketSlug);
114
+ log(`šŸ“ New log file: ${currentLogPath}`);
115
+ }
116
+ // ========================================
117
+ // Main
118
+ // ========================================
119
+ async function main() {
120
+ // ========================================
121
+ // Configuration
122
+ // ========================================
123
+ const config = {
124
+ // äŗ¤ę˜“å‚ę•° (ę”ÆęŒå‘½ä»¤č”Œč¦†ē›–)
125
+ shares: CLI_ARGS.shares, // --shares=25
126
+ sumTarget: CLI_ARGS.sumTarget, // --target=0.95
127
+ // č®¢å•ę‹†åˆ†å‚ę•°
128
+ splitOrders: 1, // å•ē¬”äø‹å•ļ¼Œéæå…ä»½é¢äøåŒ¹é…
129
+ orderIntervalMs: 500, // č®¢å•é—“éš” 500ms (ä»…åœØ splitOrders > 1 时使用)
130
+ // äæ”å·ę£€ęµ‹å‚ę•° (ę”ÆęŒå‘½ä»¤č”Œč¦†ē›–)
131
+ slidingWindowMs: CLI_ARGS.slidingWindowMs, // --window=10000 (毫秒)
132
+ dipThreshold: CLI_ARGS.dipThreshold, // --dip=0.30 (30%)
133
+ windowMinutes: 14, // č½®ę¬”å¼€å§‹åŽ 14 åˆ†é’Ÿå†…åÆäŗ¤ę˜“
134
+ // ę‰§č”Œå‚ę•°
135
+ maxSlippage: 0.02, // 2% 滑点
136
+ autoExecute: true, // č‡ŖåŠØę‰§č”Œ
137
+ executionCooldown: 500, // å†·å“ę—¶é—“ 500ms
138
+ // 其他
139
+ enableSurge: false, // ē¦ē”Øęš“ę¶Øę£€ęµ‹
140
+ autoMerge: true, // č‡ŖåŠØ merge
141
+ leg2TimeoutSeconds: CLI_ARGS.leg2TimeoutSeconds, // --timeout=60 (ē§’)
142
+ debug: true, // č°ƒčÆ•ę—„åæ—
143
+ // 旄志处理器 - 将 SDK ę—„åæ—ä¹Ÿå†™å…„å½“å‰ market ēš„ logs 数组
144
+ logHandler: sdkLogHandler,
145
+ };
146
+ // č®”ē®—é¢„ęœŸåˆ©ę¶¦ēŽ‡
147
+ const expectedProfit = ((1 - config.sumTarget) / config.sumTarget * 100).toFixed(1);
148
+ // Start initial log
149
+ startNewMarketLog('init');
150
+ log('');
151
+ log('╔══════════════════════════════════════════════════════════╗');
152
+ log(`ā•‘ DipArb Auto Trading - ${SELECTED_COIN} Markets ā•‘`);
153
+ log('╠══════════════════════════════════════════════════════════╣');
154
+ log(`ā•‘ Dip Threshold: ${(config.dipThreshold * 100).toFixed(0)}% in ${config.slidingWindowMs / 1000}s window ā•‘`);
155
+ log(`ā•‘ Sum Target: ${config.sumTarget} (profit >= ${expectedProfit}%) ā•‘`);
156
+ log(`ā•‘ Stop Loss: ${config.leg2TimeoutSeconds}s after Leg1 ā•‘`);
157
+ log(`ā•‘ Shares/Trade: ${config.shares} ā•‘`);
158
+ log(`ā•‘ Order Type: Market Order (Leg1 + Leg2 + Exit) ā•‘`);
159
+ log(`ā•‘ Log Directory: ${LOG_DIR}`);
160
+ log('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•');
161
+ log('');
162
+ log('Usage: npx tsx auto-trade.ts --xrp [--dip=0.40] [--window=3000] [--timeout=60] [--shares=25] [--target=0.95]');
163
+ log('');
164
+ // Initialize SDK
165
+ log('Initializing SDK...');
166
+ const sdk = new PolymarketSDK({
167
+ privateKey: PRIVATE_KEY,
168
+ });
169
+ sdk.dipArb.updateConfig(config);
170
+ // ========================================
171
+ // Event Listeners
172
+ // ========================================
173
+ sdk.dipArb.on('started', (market) => {
174
+ // Start new log for this market
175
+ startNewMarketLog(market.slug || market.conditionId.slice(0, 20));
176
+ log('');
177
+ log('ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”');
178
+ log('│ MARKET STARTED │');
179
+ log('ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¤');
180
+ log(`│ ${market.name.slice(0, 56)}`);
181
+ log(`│ ${market.underlying} ${market.durationMinutes}m`);
182
+ log(`│ End Time: ${market.endTime.toISOString()}`);
183
+ log(`│ Condition: ${market.conditionId.slice(0, 30)}...`);
184
+ log('ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜');
185
+ });
186
+ sdk.dipArb.on('stopped', () => {
187
+ log('>>> SERVICE STOPPED');
188
+ });
189
+ sdk.dipArb.on('newRound', (event) => {
190
+ const sum = event.upOpen + event.downOpen;
191
+ log(`>>> NEW ROUND | UP: ${event.upOpen.toFixed(3)} | DOWN: ${event.downOpen.toFixed(3)} | Sum: ${sum.toFixed(3)}`);
192
+ });
193
+ sdk.dipArb.on('signal', (signal) => {
194
+ log('');
195
+ log('╔══════════════════════════════════════════════════════════╗');
196
+ if (signal.type === 'leg1') {
197
+ log(`ā•‘ LEG1 SIGNAL: Buy ${signal.dipSide} @ ${signal.currentPrice.toFixed(4)}`);
198
+ log(`ā•‘ Drop: ${(signal.dropPercent * 100).toFixed(1)}% | Opposite: ${signal.oppositeAsk.toFixed(4)}`);
199
+ }
200
+ else {
201
+ log(`ā•‘ LEG2 SIGNAL: Buy ${signal.hedgeSide} @ ${signal.currentPrice.toFixed(4)}`);
202
+ log(`ā•‘ Total Cost: ${signal.totalCost.toFixed(4)} | Profit: ${(signal.expectedProfitRate * 100).toFixed(2)}%`);
203
+ }
204
+ log('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•');
205
+ });
206
+ sdk.dipArb.on('execution', (result) => {
207
+ if (result.success) {
208
+ log(`āœ… ${result.leg.toUpperCase()} FILLED: ${result.side} @ ${result.price?.toFixed(4)} x${result.shares}`);
209
+ }
210
+ else {
211
+ log(`āŒ ${result.leg.toUpperCase()} FAILED: ${result.error}`);
212
+ }
213
+ });
214
+ sdk.dipArb.on('roundComplete', (result) => {
215
+ log('');
216
+ log('ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”');
217
+ log(`│ ROUND ${result.status.toUpperCase()}`);
218
+ if (result.profit !== undefined) {
219
+ log(`│ Profit: $${result.profit.toFixed(4)} (${(result.profitRate * 100).toFixed(2)}%)`);
220
+ }
221
+ log('ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜');
222
+ });
223
+ sdk.dipArb.on('rotate', (event) => {
224
+ // Save current market log before rotation
225
+ log('');
226
+ log('╔══════════════════════════════════════════════════════════╗');
227
+ log(`ā•‘ šŸ”„ MARKET ROTATION ā•‘`);
228
+ log(`ā•‘ Reason: ${event.reason}`);
229
+ log(`ā•‘ Previous: ${event.previousMarket?.slice(0, 40) || 'none'}...`);
230
+ log(`ā•‘ New: ${event.newMarket.slice(0, 40)}...`);
231
+ log('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•');
232
+ // Save old log and start new one
233
+ // Note: 'started' event will be triggered after rotate, which will start new log
234
+ });
235
+ sdk.dipArb.on('settled', (result) => {
236
+ log(`>>> SETTLED: ${result.strategy} | Success: ${result.success}`);
237
+ if (result.amountReceived) {
238
+ log(` Amount: $${result.amountReceived.toFixed(2)}`);
239
+ }
240
+ if (result.error) {
241
+ log(` Error: ${result.error}`);
242
+ }
243
+ });
244
+ sdk.dipArb.on('error', (error) => {
245
+ log(`[ERROR] ${error.message}`);
246
+ });
247
+ // ========================================
248
+ // Scan and Start
249
+ // ========================================
250
+ log(`Scanning for ${SELECTED_COIN} 15m markets...`);
251
+ const markets = await sdk.dipArb.scanUpcomingMarkets({
252
+ coin: SELECTED_COIN,
253
+ duration: '15m',
254
+ limit: 5,
255
+ });
256
+ log(`Found ${markets.length} markets:`);
257
+ for (const m of markets) {
258
+ const endIn = Math.round((m.endTime.getTime() - Date.now()) / 60000);
259
+ const status = endIn <= 0 ? '(ENDED)' : `(ends in ${endIn}m)`;
260
+ log(` - ${m.name.slice(0, 50)} ${status}`);
261
+ log(` Condition: ${m.conditionId.slice(0, 30)}...`);
262
+ log(` End: ${m.endTime.toISOString()}`);
263
+ }
264
+ if (markets.length === 0) {
265
+ log('No markets found. Exiting.');
266
+ saveCurrentLog('no-markets');
267
+ return;
268
+ }
269
+ // Filter out already ended markets
270
+ const activeMarkets = markets.filter(m => m.endTime.getTime() > Date.now());
271
+ if (activeMarkets.length === 0) {
272
+ log('All markets have ended. Waiting for new markets...');
273
+ }
274
+ else {
275
+ log(`Active markets: ${activeMarkets.length}`);
276
+ }
277
+ // Start
278
+ const market = await sdk.dipArb.findAndStart({
279
+ coin: SELECTED_COIN,
280
+ preferDuration: '15m',
281
+ });
282
+ if (!market) {
283
+ log('Failed to start. Exiting.');
284
+ saveCurrentLog('failed');
285
+ return;
286
+ }
287
+ log(`Selected market ends at: ${market.endTime.toISOString()}`);
288
+ const timeUntilEnd = Math.round((market.endTime.getTime() - Date.now()) / 1000);
289
+ log(`Time until market end: ${timeUntilEnd}s (${Math.round(timeUntilEnd / 60)}m)`);
290
+ // Enable auto-rotate with redeem strategy
291
+ sdk.dipArb.enableAutoRotate({
292
+ enabled: true,
293
+ underlyings: [SELECTED_COIN],
294
+ duration: '15m',
295
+ settleStrategy: 'redeem', // ē­‰å¾…åø‚åœŗē»“ē®—åŽčµŽå›ž (5分钟后)
296
+ autoSettle: true,
297
+ preloadMinutes: 2,
298
+ redeemWaitMinutes: 5, // åø‚åœŗē»“ęŸåŽē­‰å¾… 5 åˆ†é’Ÿå†čµŽå›ž
299
+ redeemRetryIntervalSeconds: 30, // ęÆ 30 ē§’ę£€ęŸ„äø€ę¬”
300
+ });
301
+ log(`Auto-rotate enabled for ${SELECTED_COIN} (with background redemption)`);
302
+ log('');
303
+ log('═══════════════════════════════════════════════════════════');
304
+ log(' AUTO TRADING ACTIVE - Press Ctrl+C to stop');
305
+ log('═══════════════════════════════════════════════════════════');
306
+ log('');
307
+ // Status update every 30 seconds (more frequent to catch rotation)
308
+ let statusCount = 0;
309
+ const statusInterval = setInterval(() => {
310
+ const stats = sdk.dipArb.getStats();
311
+ const round = sdk.dipArb.getCurrentRound();
312
+ const currentMarket = sdk.dipArb.getMarket();
313
+ statusCount++;
314
+ // Check if market has ended
315
+ if (currentMarket) {
316
+ const timeLeft = Math.round((currentMarket.endTime.getTime() - Date.now()) / 1000);
317
+ const timeLeftStr = timeLeft > 0 ? `${timeLeft}s left` : `ENDED ${-timeLeft}s ago`;
318
+ log(`[Status #${statusCount}] Market: ${currentMarket.underlying} | ${timeLeftStr} | Signals: ${stats.signalsDetected} | L1: ${stats.leg1Filled} | L2: ${stats.leg2Filled}`);
319
+ }
320
+ else {
321
+ log(`[Status #${statusCount}] No market active | Signals: ${stats.signalsDetected}`);
322
+ }
323
+ // Show current position
324
+ if (round) {
325
+ if (round.phase === 'leg1_filled' && round.leg1) {
326
+ log(` šŸ“Š Position: ${round.leg1.shares}x ${round.leg1.side} @ ${round.leg1.price.toFixed(4)} | Waiting for Leg2...`);
327
+ }
328
+ else if (round.phase === 'completed' && round.leg1 && round.leg2) {
329
+ const totalCost = round.leg1.price + round.leg2.price;
330
+ const profit = (1 - totalCost) * round.leg1.shares;
331
+ log(` šŸ“Š Position: ${round.leg1.shares}x UP + ${round.leg2.shares}x DOWN | Cost: ${totalCost.toFixed(4)} | Profit: $${profit.toFixed(2)}`);
332
+ }
333
+ else if (round.phase === 'waiting') {
334
+ log(` šŸ“Š Position: None (waiting for signal)`);
335
+ }
336
+ }
337
+ }, 30000);
338
+ // Wait
339
+ await new Promise(resolve => setTimeout(resolve, MONITOR_DURATION_MS));
340
+ // Cleanup
341
+ clearInterval(statusInterval);
342
+ // Final stats
343
+ const stats = sdk.dipArb.getStats();
344
+ log('');
345
+ log('╔══════════════════════════════════════════════════════════╗');
346
+ log('ā•‘ FINAL STATS ā•‘');
347
+ log('╠══════════════════════════════════════════════════════════╣');
348
+ log(`ā•‘ Running Time: ${Math.round(stats.runningTimeMs / 1000)}s`);
349
+ log(`ā•‘ Rounds Monitored: ${stats.roundsMonitored}`);
350
+ log(`ā•‘ Signals Detected: ${stats.signalsDetected}`);
351
+ log(`ā•‘ Leg1 Filled: ${stats.leg1Filled}`);
352
+ log(`ā•‘ Leg2 Filled: ${stats.leg2Filled}`);
353
+ log(`ā•‘ Total Profit: $${stats.totalProfit.toFixed(2)}`);
354
+ log('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•');
355
+ await sdk.dipArb.stop();
356
+ sdk.stop();
357
+ // Save final log
358
+ saveCurrentLog('final');
359
+ }
360
+ // Handle Ctrl+C
361
+ process.on('SIGINT', async () => {
362
+ log('');
363
+ log('Interrupted. Saving logs...');
364
+ saveCurrentLog('interrupted');
365
+ process.exit(0);
366
+ });
367
+ main().catch((err) => {
368
+ log(`Fatal error: ${err.message}`);
369
+ console.error(err);
370
+ saveCurrentLog('error');
371
+ process.exit(1);
372
+ });
373
+ //# sourceMappingURL=auto-trade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-trade.js","sourceRoot":"","sources":["../../../scripts/dip-arb/auto-trade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Example 14: DipArbService - Dip Arbitrage for 15m/5m UP/DOWN Markets
4
+ *
5
+ * Demonstrates the dip arbitrage workflow for Polymarket's short-term crypto markets:
6
+ * 1. Scan for upcoming BTC/ETH/SOL/XRP UP/DOWN markets
7
+ * 2. Auto-select and start monitoring a market
8
+ * 3. Detect dip signals (price drops > threshold)
9
+ * 4. Execute Leg1 + Leg2 trades for risk-free profit
10
+ * 5. Auto-rotate to next market when current ends
11
+ *
12
+ * Strategy Overview:
13
+ * - Leg1: Buy the dipped side when price drops >= dipThreshold (default 15%)
14
+ * - Leg2: Buy the opposite side when combined cost < sumTarget (default 0.95)
15
+ * - Profit: Total cost < $1 means guaranteed profit at settlement
16
+ *
17
+ * Environment variables:
18
+ * POLY_PRIVKEY - Private key for trading (required for execution)
19
+ *
20
+ * Run with:
21
+ * pnpm example:dip-arb
22
+ *
23
+ * Or monitor-only (no trading):
24
+ * npx tsx examples/14-dip-arb-service.ts --monitor-only
25
+ *
26
+ * With auto-rotate:
27
+ * npx tsx examples/14-dip-arb-service.ts --auto-rotate
28
+ */
29
+ export {};
30
+ //# sourceMappingURL=example-basic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-basic.d.ts","sourceRoot":"","sources":["../../../scripts/dip-arb/example-basic.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Example 14: DipArbService - Dip Arbitrage for 15m/5m UP/DOWN Markets
4
+ *
5
+ * Demonstrates the dip arbitrage workflow for Polymarket's short-term crypto markets:
6
+ * 1. Scan for upcoming BTC/ETH/SOL/XRP UP/DOWN markets
7
+ * 2. Auto-select and start monitoring a market
8
+ * 3. Detect dip signals (price drops > threshold)
9
+ * 4. Execute Leg1 + Leg2 trades for risk-free profit
10
+ * 5. Auto-rotate to next market when current ends
11
+ *
12
+ * Strategy Overview:
13
+ * - Leg1: Buy the dipped side when price drops >= dipThreshold (default 15%)
14
+ * - Leg2: Buy the opposite side when combined cost < sumTarget (default 0.95)
15
+ * - Profit: Total cost < $1 means guaranteed profit at settlement
16
+ *
17
+ * Environment variables:
18
+ * POLY_PRIVKEY - Private key for trading (required for execution)
19
+ *
20
+ * Run with:
21
+ * pnpm example:dip-arb
22
+ *
23
+ * Or monitor-only (no trading):
24
+ * npx tsx examples/14-dip-arb-service.ts --monitor-only
25
+ *
26
+ * With auto-rotate:
27
+ * npx tsx examples/14-dip-arb-service.ts --auto-rotate
28
+ */
29
+ import { PolymarketSDK } from '../../src/index.js';
30
+ // Parse arguments
31
+ const args = process.argv.slice(2);
32
+ const MONITOR_ONLY = args.includes('--monitor-only');
33
+ const AUTO_ROTATE = args.includes('--auto-rotate');
34
+ const COIN = args.find(a => a.startsWith('--coin='))?.split('=')[1];
35
+ const RUN_DURATION = parseInt(args.find(a => a.startsWith('--duration='))?.split('=')[1] || '300') * 1000; // default 5 minutes
36
+ async function main() {
37
+ console.log('╔════════════════════════════════════════════════════════════════╗');
38
+ console.log('ā•‘ DipArbService - Dip Arbitrage Demo ā•‘');
39
+ console.log('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•');
40
+ console.log();
41
+ const privateKey = process.env.POLY_PRIVKEY;
42
+ if (!privateKey && !MONITOR_ONLY) {
43
+ console.log('No POLY_PRIVKEY provided. Running in monitor-only mode.\n');
44
+ }
45
+ // ========== Initialize SDK ==========
46
+ console.log('Initializing SDK...');
47
+ const sdk = await PolymarketSDK.create({
48
+ privateKey: MONITOR_ONLY ? undefined : privateKey,
49
+ });
50
+ console.log('SDK initialized\n');
51
+ // ========== Configure DipArbService ==========
52
+ sdk.dipArb.updateConfig({
53
+ shares: 20, // Buy 20 shares per leg
54
+ sumTarget: 0.95, // Target total cost <= $0.95 (5% profit)
55
+ dipThreshold: 0.15, // Trigger when price drops 15%
56
+ windowMinutes: 2, // Trade window after round starts
57
+ maxSlippage: 0.02, // Max 2% slippage
58
+ minProfitRate: 0.03, // Min 3% profit rate
59
+ leg2TimeoutSeconds: 300, // 5 min timeout for leg2
60
+ enableSurge: true, // Also detect surges
61
+ autoMerge: true, // Auto merge after both legs
62
+ autoExecute: !MONITOR_ONLY && !!privateKey,
63
+ debug: true,
64
+ });
65
+ console.log('Configuration:');
66
+ console.log(JSON.stringify(sdk.dipArb.getConfig(), null, 2));
67
+ console.log();
68
+ // ========== Set up event listeners ==========
69
+ sdk.dipArb.on('started', (market) => {
70
+ console.log('\n═══════════════════════════════════════════════════════════════');
71
+ console.log(`šŸš€ Started monitoring: ${market.name}`);
72
+ console.log(` Condition ID: ${market.conditionId.slice(0, 20)}...`);
73
+ console.log(` Underlying: ${market.underlying} | Duration: ${market.durationMinutes}m`);
74
+ console.log(` End Time: ${market.endTime.toLocaleString()}`);
75
+ console.log('═══════════════════════════════════════════════════════════════\n');
76
+ });
77
+ sdk.dipArb.on('stopped', () => {
78
+ console.log('\nšŸ›‘ Service stopped');
79
+ });
80
+ sdk.dipArb.on('newRound', (event) => {
81
+ console.log(`\nšŸ“ New Round: ${event.roundId}`);
82
+ console.log(` Price to Beat: $${event.priceToBeat.toFixed(2)}`);
83
+ console.log(` UP Open: ${event.upOpen.toFixed(4)} | DOWN Open: ${event.downOpen.toFixed(4)}`);
84
+ });
85
+ sdk.dipArb.on('signal', (signal) => {
86
+ if (signal.type === 'leg1') {
87
+ console.log(`\nšŸŽÆ LEG1 SIGNAL [${signal.source.toUpperCase()}]`);
88
+ console.log(` Buy ${signal.dipSide} @ ${signal.currentPrice.toFixed(4)}`);
89
+ console.log(` Drop: ${(signal.dropPercent * 100).toFixed(1)}%`);
90
+ console.log(` Opposite Ask: ${signal.oppositeAsk.toFixed(4)}`);
91
+ console.log(` Est Total Cost: ${signal.estimatedTotalCost.toFixed(4)}`);
92
+ console.log(` Est Profit Rate: ${(signal.estimatedProfitRate * 100).toFixed(2)}%`);
93
+ if (signal.btcInfo) {
94
+ console.log(` ${signal.btcInfo.btcPrice > 0 ? 'BTC' : 'Underlying'}: $${signal.btcInfo.btcPrice.toFixed(2)} (${signal.btcInfo.btcChangePercent >= 0 ? '+' : ''}${signal.btcInfo.btcChangePercent.toFixed(2)}%)`);
95
+ }
96
+ }
97
+ else {
98
+ console.log(`\nšŸŽÆ LEG2 SIGNAL`);
99
+ console.log(` Buy ${signal.hedgeSide} @ ${signal.currentPrice.toFixed(4)}`);
100
+ console.log(` Leg1 was: ${signal.leg1.side} @ ${signal.leg1.price.toFixed(4)}`);
101
+ console.log(` Total Cost: ${signal.totalCost.toFixed(4)}`);
102
+ console.log(` Expected Profit Rate: ${(signal.expectedProfitRate * 100).toFixed(2)}%`);
103
+ }
104
+ });
105
+ sdk.dipArb.on('execution', (result) => {
106
+ if (result.success) {
107
+ console.log(`\nāœ… ${result.leg.toUpperCase()} Executed!`);
108
+ if (result.side)
109
+ console.log(` Side: ${result.side}`);
110
+ if (result.price)
111
+ console.log(` Price: ${result.price.toFixed(4)}`);
112
+ if (result.shares)
113
+ console.log(` Shares: ${result.shares}`);
114
+ if (result.orderId)
115
+ console.log(` Order ID: ${result.orderId}`);
116
+ console.log(` Time: ${result.executionTimeMs}ms`);
117
+ }
118
+ else {
119
+ console.log(`\nāŒ ${result.leg.toUpperCase()} Failed: ${result.error}`);
120
+ }
121
+ });
122
+ sdk.dipArb.on('roundComplete', (result) => {
123
+ console.log(`\nšŸ“Š Round ${result.roundId} Complete`);
124
+ console.log(` Status: ${result.status}`);
125
+ if (result.totalCost !== undefined) {
126
+ console.log(` Total Cost: ${result.totalCost.toFixed(4)}`);
127
+ console.log(` Profit: $${result.profit?.toFixed(4)}`);
128
+ console.log(` Profit Rate: ${((result.profitRate || 0) * 100).toFixed(2)}%`);
129
+ }
130
+ console.log(` Merged: ${result.merged ? 'Yes' : 'No'}`);
131
+ });
132
+ sdk.dipArb.on('priceUpdate', (event) => {
133
+ // Only log significant price changes
134
+ if (Math.abs(event.changePercent) >= 0.5) {
135
+ console.log(` ${event.underlying}: $${event.value.toFixed(2)} (${event.changePercent >= 0 ? '+' : ''}${event.changePercent.toFixed(2)}% vs PTB)`);
136
+ }
137
+ });
138
+ sdk.dipArb.on('rotate', (event) => {
139
+ console.log(`\nšŸ”„ Market Rotation`);
140
+ console.log(` Reason: ${event.reason}`);
141
+ console.log(` Previous: ${event.previousMarket?.slice(0, 20) || 'none'}...`);
142
+ console.log(` New: ${event.newMarket.slice(0, 20)}...`);
143
+ });
144
+ sdk.dipArb.on('settled', (result) => {
145
+ console.log(`\nšŸ’° Position Settled`);
146
+ console.log(` Strategy: ${result.strategy}`);
147
+ console.log(` Success: ${result.success}`);
148
+ if (result.amountReceived) {
149
+ console.log(` Amount: $${result.amountReceived.toFixed(2)}`);
150
+ }
151
+ });
152
+ sdk.dipArb.on('error', (error) => {
153
+ console.error(`\nāŒ Error: ${error.message}`);
154
+ });
155
+ // ========== Enable auto-rotate if requested ==========
156
+ if (AUTO_ROTATE) {
157
+ sdk.dipArb.enableAutoRotate({
158
+ underlyings: COIN ? [COIN] : ['BTC', 'ETH'],
159
+ duration: '15m',
160
+ autoSettle: true,
161
+ settleStrategy: 'sell', // 'sell' is faster, 'redeem' waits for resolution
162
+ preloadMinutes: 2,
163
+ });
164
+ console.log('Auto-rotate enabled\n');
165
+ }
166
+ // ========== Scan for markets ==========
167
+ console.log('Scanning for upcoming markets...\n');
168
+ const markets = await sdk.dipArb.scanUpcomingMarkets({
169
+ coin: COIN || 'all',
170
+ duration: '15m',
171
+ minMinutesUntilEnd: 10,
172
+ maxMinutesUntilEnd: 60,
173
+ limit: 10,
174
+ });
175
+ if (markets.length === 0) {
176
+ console.log('No suitable markets found. Try again later.\n');
177
+ sdk.stop();
178
+ return;
179
+ }
180
+ console.log(`Found ${markets.length} markets:\n`);
181
+ markets.forEach((m, i) => {
182
+ const minutesLeft = Math.round((m.endTime.getTime() - Date.now()) / 60000);
183
+ console.log(` ${i + 1}. [${m.underlying}] ${m.slug}`);
184
+ console.log(` Ends in ${minutesLeft} minutes`);
185
+ });
186
+ console.log();
187
+ // ========== Start monitoring ==========
188
+ const market = await sdk.dipArb.findAndStart({
189
+ coin: COIN,
190
+ preferDuration: '15m',
191
+ });
192
+ if (!market) {
193
+ console.log('Could not start monitoring. Exiting.\n');
194
+ sdk.stop();
195
+ return;
196
+ }
197
+ // ========== Run for specified duration ==========
198
+ console.log(`Running for ${RUN_DURATION / 1000} seconds...`);
199
+ console.log('Press Ctrl+C to stop early.\n');
200
+ await new Promise(resolve => setTimeout(resolve, RUN_DURATION));
201
+ // ========== Print final stats ==========
202
+ const stats = sdk.dipArb.getStats();
203
+ console.log('\n═══════════════════════════════════════════════════════════════');
204
+ console.log('šŸ“Š Final Statistics');
205
+ console.log('═══════════════════════════════════════════════════════════════');
206
+ console.log(`Rounds Monitored: ${stats.roundsMonitored}`);
207
+ console.log(`Rounds Completed: ${stats.roundsCompleted}`);
208
+ console.log(`Rounds Successful: ${stats.roundsSuccessful}`);
209
+ console.log(`Rounds Expired: ${stats.roundsExpired}`);
210
+ console.log(`Signals Detected: ${stats.signalsDetected}`);
211
+ console.log(`Leg1 Filled: ${stats.leg1Filled}`);
212
+ console.log(`Leg2 Filled: ${stats.leg2Filled}`);
213
+ console.log(`Total Spent: $${stats.totalSpent.toFixed(2)}`);
214
+ console.log(`Total Profit: $${stats.totalProfit.toFixed(2)}`);
215
+ console.log(`Running Time: ${(stats.runningTimeMs / 1000).toFixed(1)}s`);
216
+ console.log();
217
+ // ========== Clean up ==========
218
+ sdk.stop();
219
+ console.log('Done!\n');
220
+ }
221
+ main().catch(console.error);
222
+ //# sourceMappingURL=example-basic.js.map