@catalyst-team/poly-sdk 0.3.0 → 0.4.3

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