polymarket-trader-mcp 1.0.1

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 (223) hide show
  1. package/.env.example +20 -0
  2. package/README.md +158 -0
  3. package/dist/db/queries.d.ts +93 -0
  4. package/dist/db/queries.d.ts.map +1 -0
  5. package/dist/db/queries.js +161 -0
  6. package/dist/db/queries.js.map +1 -0
  7. package/dist/db/schema.d.ts +3 -0
  8. package/dist/db/schema.d.ts.map +1 -0
  9. package/dist/db/schema.js +88 -0
  10. package/dist/db/schema.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +124 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/services/backtester.d.ts +30 -0
  16. package/dist/services/backtester.d.ts.map +1 -0
  17. package/dist/services/backtester.js +96 -0
  18. package/dist/services/backtester.js.map +1 -0
  19. package/dist/services/budget-manager.d.ts +16 -0
  20. package/dist/services/budget-manager.d.ts.map +1 -0
  21. package/dist/services/budget-manager.js +42 -0
  22. package/dist/services/budget-manager.js.map +1 -0
  23. package/dist/services/conviction-scorer.d.ts +14 -0
  24. package/dist/services/conviction-scorer.d.ts.map +1 -0
  25. package/dist/services/conviction-scorer.js +88 -0
  26. package/dist/services/conviction-scorer.js.map +1 -0
  27. package/dist/services/leaderboard.d.ts +28 -0
  28. package/dist/services/leaderboard.d.ts.map +1 -0
  29. package/dist/services/leaderboard.js +45 -0
  30. package/dist/services/leaderboard.js.map +1 -0
  31. package/dist/services/market-filter.d.ts +19 -0
  32. package/dist/services/market-filter.d.ts.map +1 -0
  33. package/dist/services/market-filter.js +50 -0
  34. package/dist/services/market-filter.js.map +1 -0
  35. package/dist/services/market-resolver.d.ts +10 -0
  36. package/dist/services/market-resolver.d.ts.map +1 -0
  37. package/dist/services/market-resolver.js +28 -0
  38. package/dist/services/market-resolver.js.map +1 -0
  39. package/dist/services/position-tracker.d.ts +13 -0
  40. package/dist/services/position-tracker.d.ts.map +1 -0
  41. package/dist/services/position-tracker.js +152 -0
  42. package/dist/services/position-tracker.js.map +1 -0
  43. package/dist/services/price-history.d.ts +18 -0
  44. package/dist/services/price-history.d.ts.map +1 -0
  45. package/dist/services/price-history.js +46 -0
  46. package/dist/services/price-history.js.map +1 -0
  47. package/dist/services/price-service.d.ts +14 -0
  48. package/dist/services/price-service.d.ts.map +1 -0
  49. package/dist/services/price-service.js +62 -0
  50. package/dist/services/price-service.js.map +1 -0
  51. package/dist/services/smart-flow.d.ts +22 -0
  52. package/dist/services/smart-flow.d.ts.map +1 -0
  53. package/dist/services/smart-flow.js +91 -0
  54. package/dist/services/smart-flow.js.map +1 -0
  55. package/dist/services/trade-executor.d.ts +44 -0
  56. package/dist/services/trade-executor.d.ts.map +1 -0
  57. package/dist/services/trade-executor.js +153 -0
  58. package/dist/services/trade-executor.js.map +1 -0
  59. package/dist/services/trader-analyzer.d.ts +19 -0
  60. package/dist/services/trader-analyzer.d.ts.map +1 -0
  61. package/dist/services/trader-analyzer.js +100 -0
  62. package/dist/services/trader-analyzer.js.map +1 -0
  63. package/dist/services/wallet-monitor.d.ts +51 -0
  64. package/dist/services/wallet-monitor.d.ts.map +1 -0
  65. package/dist/services/wallet-monitor.js +192 -0
  66. package/dist/services/wallet-monitor.js.map +1 -0
  67. package/dist/services/wta-discovery.d.ts +29 -0
  68. package/dist/services/wta-discovery.d.ts.map +1 -0
  69. package/dist/services/wta-discovery.js +155 -0
  70. package/dist/services/wta-discovery.js.map +1 -0
  71. package/dist/tools/analyze-trader.d.ts +6 -0
  72. package/dist/tools/analyze-trader.d.ts.map +1 -0
  73. package/dist/tools/analyze-trader.js +28 -0
  74. package/dist/tools/analyze-trader.js.map +1 -0
  75. package/dist/tools/backtest-trader.d.ts +7 -0
  76. package/dist/tools/backtest-trader.d.ts.map +1 -0
  77. package/dist/tools/backtest-trader.js +39 -0
  78. package/dist/tools/backtest-trader.js.map +1 -0
  79. package/dist/tools/buy.d.ts +14 -0
  80. package/dist/tools/buy.d.ts.map +1 -0
  81. package/dist/tools/buy.js +48 -0
  82. package/dist/tools/buy.js.map +1 -0
  83. package/dist/tools/cancel-orders.d.ts +5 -0
  84. package/dist/tools/cancel-orders.d.ts.map +1 -0
  85. package/dist/tools/cancel-orders.js +26 -0
  86. package/dist/tools/cancel-orders.js.map +1 -0
  87. package/dist/tools/check-exits.d.ts +3 -0
  88. package/dist/tools/check-exits.d.ts.map +1 -0
  89. package/dist/tools/check-exits.js +14 -0
  90. package/dist/tools/check-exits.js.map +1 -0
  91. package/dist/tools/check-market.d.ts +8 -0
  92. package/dist/tools/check-market.d.ts.map +1 -0
  93. package/dist/tools/check-market.js +31 -0
  94. package/dist/tools/check-market.js.map +1 -0
  95. package/dist/tools/close-position.d.ts +8 -0
  96. package/dist/tools/close-position.d.ts.map +1 -0
  97. package/dist/tools/close-position.js +26 -0
  98. package/dist/tools/close-position.js.map +1 -0
  99. package/dist/tools/discover-flow.d.ts +8 -0
  100. package/dist/tools/discover-flow.d.ts.map +1 -0
  101. package/dist/tools/discover-flow.js +36 -0
  102. package/dist/tools/discover-flow.js.map +1 -0
  103. package/dist/tools/discover-markets.d.ts +14 -0
  104. package/dist/tools/discover-markets.d.ts.map +1 -0
  105. package/dist/tools/discover-markets.js +67 -0
  106. package/dist/tools/discover-markets.js.map +1 -0
  107. package/dist/tools/discover-traders.d.ts +15 -0
  108. package/dist/tools/discover-traders.d.ts.map +1 -0
  109. package/dist/tools/discover-traders.js +64 -0
  110. package/dist/tools/discover-traders.js.map +1 -0
  111. package/dist/tools/discover-wta.d.ts +7 -0
  112. package/dist/tools/discover-wta.d.ts.map +1 -0
  113. package/dist/tools/discover-wta.js +26 -0
  114. package/dist/tools/discover-wta.js.map +1 -0
  115. package/dist/tools/get-balance.d.ts +4 -0
  116. package/dist/tools/get-balance.d.ts.map +1 -0
  117. package/dist/tools/get-balance.js +21 -0
  118. package/dist/tools/get-balance.js.map +1 -0
  119. package/dist/tools/get-dashboard.d.ts +5 -0
  120. package/dist/tools/get-dashboard.d.ts.map +1 -0
  121. package/dist/tools/get-dashboard.js +57 -0
  122. package/dist/tools/get-dashboard.js.map +1 -0
  123. package/dist/tools/get-portfolio.d.ts +3 -0
  124. package/dist/tools/get-portfolio.d.ts.map +1 -0
  125. package/dist/tools/get-portfolio.js +45 -0
  126. package/dist/tools/get-portfolio.js.map +1 -0
  127. package/dist/tools/get-positions.d.ts +11 -0
  128. package/dist/tools/get-positions.d.ts.map +1 -0
  129. package/dist/tools/get-positions.js +34 -0
  130. package/dist/tools/get-positions.js.map +1 -0
  131. package/dist/tools/get-price-history.d.ts +13 -0
  132. package/dist/tools/get-price-history.d.ts.map +1 -0
  133. package/dist/tools/get-price-history.js +55 -0
  134. package/dist/tools/get-price-history.js.map +1 -0
  135. package/dist/tools/get-price.d.ts +8 -0
  136. package/dist/tools/get-price.d.ts.map +1 -0
  137. package/dist/tools/get-price.js +37 -0
  138. package/dist/tools/get-price.js.map +1 -0
  139. package/dist/tools/get-trade-history.d.ts +10 -0
  140. package/dist/tools/get-trade-history.d.ts.map +1 -0
  141. package/dist/tools/get-trade-history.js +32 -0
  142. package/dist/tools/get-trade-history.js.map +1 -0
  143. package/dist/tools/get-trader-positions.d.ts +7 -0
  144. package/dist/tools/get-trader-positions.d.ts.map +1 -0
  145. package/dist/tools/get-trader-positions.js +27 -0
  146. package/dist/tools/get-trader-positions.js.map +1 -0
  147. package/dist/tools/go-live.d.ts +8 -0
  148. package/dist/tools/go-live.d.ts.map +1 -0
  149. package/dist/tools/go-live.js +22 -0
  150. package/dist/tools/go-live.js.map +1 -0
  151. package/dist/tools/list-watchlist.d.ts +3 -0
  152. package/dist/tools/list-watchlist.d.ts.map +1 -0
  153. package/dist/tools/list-watchlist.js +16 -0
  154. package/dist/tools/list-watchlist.js.map +1 -0
  155. package/dist/tools/log-cycle.d.ts +24 -0
  156. package/dist/tools/log-cycle.d.ts.map +1 -0
  157. package/dist/tools/log-cycle.js +23 -0
  158. package/dist/tools/log-cycle.js.map +1 -0
  159. package/dist/tools/place-stink-bid.d.ts +10 -0
  160. package/dist/tools/place-stink-bid.d.ts.map +1 -0
  161. package/dist/tools/place-stink-bid.js +53 -0
  162. package/dist/tools/place-stink-bid.js.map +1 -0
  163. package/dist/tools/rebalance.d.ts +9 -0
  164. package/dist/tools/rebalance.d.ts.map +1 -0
  165. package/dist/tools/rebalance.js +79 -0
  166. package/dist/tools/rebalance.js.map +1 -0
  167. package/dist/tools/score-trader.d.ts +6 -0
  168. package/dist/tools/score-trader.d.ts.map +1 -0
  169. package/dist/tools/score-trader.js +28 -0
  170. package/dist/tools/score-trader.js.map +1 -0
  171. package/dist/tools/search-markets.d.ts +8 -0
  172. package/dist/tools/search-markets.d.ts.map +1 -0
  173. package/dist/tools/search-markets.js +44 -0
  174. package/dist/tools/search-markets.js.map +1 -0
  175. package/dist/tools/sell.d.ts +10 -0
  176. package/dist/tools/sell.d.ts.map +1 -0
  177. package/dist/tools/sell.js +46 -0
  178. package/dist/tools/sell.js.map +1 -0
  179. package/dist/tools/set-config.d.ts +13 -0
  180. package/dist/tools/set-config.d.ts.map +1 -0
  181. package/dist/tools/set-config.js +24 -0
  182. package/dist/tools/set-config.js.map +1 -0
  183. package/dist/tools/set-exit-rules.d.ts +9 -0
  184. package/dist/tools/set-exit-rules.d.ts.map +1 -0
  185. package/dist/tools/set-exit-rules.js +39 -0
  186. package/dist/tools/set-exit-rules.js.map +1 -0
  187. package/dist/tools/start-monitor.d.ts +9 -0
  188. package/dist/tools/start-monitor.d.ts.map +1 -0
  189. package/dist/tools/start-monitor.js +24 -0
  190. package/dist/tools/start-monitor.js.map +1 -0
  191. package/dist/tools/stop-monitor.d.ts +3 -0
  192. package/dist/tools/stop-monitor.d.ts.map +1 -0
  193. package/dist/tools/stop-monitor.js +14 -0
  194. package/dist/tools/stop-monitor.js.map +1 -0
  195. package/dist/tools/watch-market.d.ts +15 -0
  196. package/dist/tools/watch-market.d.ts.map +1 -0
  197. package/dist/tools/watch-market.js +68 -0
  198. package/dist/tools/watch-market.js.map +1 -0
  199. package/dist/tools/watch-wallet.d.ts +13 -0
  200. package/dist/tools/watch-wallet.d.ts.map +1 -0
  201. package/dist/tools/watch-wallet.js +30 -0
  202. package/dist/tools/watch-wallet.js.map +1 -0
  203. package/dist/utils/config.d.ts +22 -0
  204. package/dist/utils/config.d.ts.map +1 -0
  205. package/dist/utils/config.js +40 -0
  206. package/dist/utils/config.js.map +1 -0
  207. package/dist/utils/fetch.d.ts +5 -0
  208. package/dist/utils/fetch.d.ts.map +1 -0
  209. package/dist/utils/fetch.js +57 -0
  210. package/dist/utils/fetch.js.map +1 -0
  211. package/dist/utils/license.d.ts +4 -0
  212. package/dist/utils/license.d.ts.map +1 -0
  213. package/dist/utils/license.js +49 -0
  214. package/dist/utils/license.js.map +1 -0
  215. package/dist/utils/logger.d.ts +10 -0
  216. package/dist/utils/logger.d.ts.map +1 -0
  217. package/dist/utils/logger.js +23 -0
  218. package/dist/utils/logger.js.map +1 -0
  219. package/dist/utils/tool-wrapper.d.ts +10 -0
  220. package/dist/utils/tool-wrapper.d.ts.map +1 -0
  221. package/dist/utils/tool-wrapper.js +15 -0
  222. package/dist/utils/tool-wrapper.js.map +1 -0
  223. package/package.json +50 -0
package/.env.example ADDED
@@ -0,0 +1,20 @@
1
+ # Polymarket CLOB API (Required for Live mode, optional for Preview)
2
+ POLY_PRIVATE_KEY=
3
+ POLY_API_KEY=
4
+ POLY_API_SECRET=
5
+ POLY_API_PASSPHRASE=
6
+ POLY_FUNDER_ADDRESS=
7
+
8
+ # Bot settings
9
+ DAILY_BUDGET=20
10
+ MIN_CONVICTION=3
11
+ COPY_MODE=preview
12
+
13
+ # MCP Marketplace License (for Pro features)
14
+ MCP_LICENSE_KEY=
15
+
16
+ # Set to "true" to bypass license API check (for offline/air-gapped environments)
17
+ # MCP_LICENSE_OFFLINE=true
18
+
19
+ # Optional
20
+ CHAIN_ID=137
package/README.md ADDED
@@ -0,0 +1,158 @@
1
+ # Polymarket MCP Server
2
+
3
+ MCP server for trading, analyzing, and automating Polymarket prediction markets through Claude Code or any MCP-compatible client.
4
+
5
+ ## Features
6
+
7
+ - **Direct Trading** — Buy and sell on any Polymarket market with market or limit orders
8
+ - **Market Search** — Find markets by keyword, category, or end date
9
+ - **Copy Trading** — Watch top traders and automatically copy their trades
10
+ - **Smart Money Flow** — Detect when multiple top traders converge on the same market
11
+ - **Backtest** — Simulate copying any trader's historical trades before committing capital
12
+ - **Conviction Scoring** — 0-100 score based on win rate, consistency, experience, and diversity
13
+ - **Market Quality Filter** — Auto-skip illiquid markets based on spread, depth, and price range
14
+ - **Stop-Loss / Take-Profit** — Set automated exit rules on any position
15
+ - **Auto-Rebalance** — Remove underperforming traders from your watchlist
16
+ - **Price History** — Historical price data with sparkline charts
17
+ - **34 MCP Tools** — Full control via natural language through Claude Code
18
+
19
+ ## Quick Start
20
+
21
+ ### Prerequisites
22
+
23
+ - Node.js 18+
24
+ - Claude Code CLI (or any MCP client)
25
+
26
+ ### Installation
27
+
28
+ ```bash
29
+ npm install -g polymarket-trader-mcp
30
+ ```
31
+
32
+ Or add to Claude Code config (`~/.claude/settings.json`):
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "polymarket": {
38
+ "command": "npx",
39
+ "args": ["polymarket-trader-mcp"]
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ ### Configuration
46
+
47
+ Copy `.env.example` to `.env` and configure:
48
+
49
+ ```bash
50
+ cp .env.example .env
51
+ ```
52
+
53
+ | Variable | Required | Default | Description |
54
+ |----------|----------|---------|-------------|
55
+ | `COPY_MODE` | No | `preview` | `preview` (simulated) or `live` (real orders) |
56
+ | `DAILY_BUDGET` | No | `20` | Max daily spend in USDC |
57
+ | `MIN_CONVICTION` | No | `3` | Min trade size to copy ($) |
58
+ | `POLY_PRIVATE_KEY` | Live only | - | Polymarket wallet private key |
59
+ | `POLY_API_KEY` | Live only | - | CLOB API key |
60
+ | `POLY_API_SECRET` | Live only | - | CLOB API secret |
61
+ | `POLY_API_PASSPHRASE` | Live only | - | CLOB API passphrase |
62
+ | `MCP_LICENSE_KEY` | Pro | - | Marketplace license key |
63
+
64
+ ## Tools
65
+
66
+ ### Discovery
67
+ | Tool | Description |
68
+ |------|-------------|
69
+ | `search_markets` | Search markets by keyword (bitcoin, election, UFC...) |
70
+ | `discover_traders` | Find top traders by PnL and volume |
71
+ | `discover_markets` | Find markets by end date and category |
72
+ | `discover_wta` | Find WTA tennis markets with stink bid prices |
73
+ | `discover_flow` | Smart money signals — multiple top traders buying same market |
74
+
75
+ ### Trading
76
+ | Tool | Description |
77
+ |------|-------------|
78
+ | `buy` | Buy shares on any market — direct trading |
79
+ | `sell` | Sell an open position |
80
+ | `place_stink_bid` | Place limit orders at discount |
81
+ | `cancel_orders` | Cancel all open orders |
82
+ | `go_live` | Switch from preview to live mode |
83
+
84
+ ### Copy Trading
85
+ | Tool | Description |
86
+ |------|-------------|
87
+ | `watch_wallet` | Add/remove traders from watchlist |
88
+ | `start_monitor` | Start copy trading loop |
89
+ | `stop_monitor` | Stop copy trading loop |
90
+ | `rebalance` | Remove underperforming traders |
91
+
92
+ ### Analysis
93
+ | Tool | Description |
94
+ |------|-------------|
95
+ | `analyze_trader` | Detailed trader profile with win rate and P&L |
96
+ | `score_trader` | Conviction score (0-100) across 5 dimensions |
97
+ | `backtest_trader` | Simulate copying past trades |
98
+ | `check_market` | Market quality check (spread, depth) |
99
+ | `get_price` | Live bid/ask/spread prices |
100
+ | `get_price_history` | Historical prices with sparkline (1h-1m) |
101
+
102
+ ### Portfolio
103
+ | Tool | Description |
104
+ |------|-------------|
105
+ | `get_balance` | Account balance, budget, and P&L summary |
106
+ | `get_portfolio` | Multi-wallet overview with P&L per trader |
107
+ | `get_positions` | Open/closed positions |
108
+ | `close_position` | Manually close a position |
109
+ | `set_exit_rules` | Set stop-loss and take-profit levels |
110
+ | `check_exits` | Check positions for resolution |
111
+ | `watch_market` | Market watchlist with price alerts |
112
+
113
+ ### Utilities
114
+ | Tool | Description |
115
+ |------|-------------|
116
+ | `get_dashboard` | Terminal-formatted dashboard |
117
+ | `get_trade_history` | Trade history with filters |
118
+ | `set_config` | Update bot settings |
119
+ | `list_watchlist` | Show watched wallets |
120
+ | `log_cycle` | Log agent cycle for dashboard tracking |
121
+
122
+ ## Free vs Pro
123
+
124
+ | Feature | Free | Pro |
125
+ |---------|------|-----|
126
+ | Search & discover markets | Full | Full |
127
+ | Buy / sell (preview mode) | Full | Full |
128
+ | Buy / sell (live mode) | - | Full |
129
+ | Price & market quality | Full | Full |
130
+ | Price history | Full | Full |
131
+ | Discover traders | 1 page | Full |
132
+ | Watch wallets | 3 max | Unlimited |
133
+ | Analyze trader (basic) | Full | Full |
134
+ | Score trader | - | Full |
135
+ | Backtest trader | - | Full |
136
+ | Smart money flow | - | Full |
137
+ | Copy trading monitor | - | Full |
138
+ | Portfolio overview | - | Full |
139
+ | Market watchlist & alerts | - | Full |
140
+ | Stop-loss / take-profit | - | Full |
141
+ | Rebalance | - | Full |
142
+ | Trade history | - | Full |
143
+
144
+ Get a Pro license at [mcp-marketplace.io](https://mcp-marketplace.io/server/polymarket-trader-mcp).
145
+
146
+ ## Development
147
+
148
+ ```bash
149
+ git clone https://github.com/demwick/polymarket-trader-mcp.git
150
+ cd polymarket-trader-mcp
151
+ npm install
152
+ npm run build
153
+ npm test # 200+ tests
154
+ ```
155
+
156
+ ## License
157
+
158
+ MIT
@@ -0,0 +1,93 @@
1
+ import Database from "better-sqlite3";
2
+ export interface WatchlistEntry {
3
+ address: string;
4
+ alias: string | null;
5
+ roi: number;
6
+ volume: number;
7
+ pnl: number;
8
+ trade_count: number;
9
+ added_at?: string;
10
+ last_checked?: string | null;
11
+ }
12
+ export interface TradeRecord {
13
+ id?: number;
14
+ trader_address: string;
15
+ market_slug: string | null;
16
+ condition_id: string | null;
17
+ token_id: string | null;
18
+ side: string;
19
+ price: number;
20
+ amount: number;
21
+ original_amount: number | null;
22
+ mode: "preview" | "live";
23
+ status: "simulated" | "executed" | "failed" | "resolved_win" | "resolved_loss";
24
+ pnl?: number;
25
+ created_at?: string;
26
+ resolved_at?: string | null;
27
+ current_price?: number | null;
28
+ exit_reason?: string | null;
29
+ sl_price?: number | null;
30
+ tp_price?: number | null;
31
+ }
32
+ export declare function addToWatchlist(db: Database.Database, entry: Omit<WatchlistEntry, "added_at" | "last_checked">): void;
33
+ export declare function removeFromWatchlist(db: Database.Database, address: string): void;
34
+ export declare function getWatchlist(db: Database.Database): WatchlistEntry[];
35
+ export declare function getWatchlistCount(db: Database.Database): number;
36
+ export declare function updateLastChecked(db: Database.Database, address: string): void;
37
+ export declare function recordTrade(db: Database.Database, trade: Omit<TradeRecord, "id" | "pnl" | "created_at" | "resolved_at">): number;
38
+ /** Atomically record a trade and update daily budget in a single transaction */
39
+ export declare function recordTradeWithBudget(db: Database.Database, trade: Omit<TradeRecord, "id" | "pnl" | "created_at" | "resolved_at">, date: string, spendAmount: number, dailyLimit: number): number;
40
+ export declare function getTradeHistory(db: Database.Database, opts: {
41
+ limit?: number;
42
+ trader?: string;
43
+ status?: string;
44
+ }): TradeRecord[];
45
+ export declare function hasExistingPosition(db: Database.Database, conditionId: string): boolean;
46
+ export declare function getDailySpent(db: Database.Database, date: string): number;
47
+ export declare function addDailySpent(db: Database.Database, date: string, amount: number, limitAmount: number): void;
48
+ export declare function getDailyBudgetRemaining(db: Database.Database, date: string, dailyLimit: number): number;
49
+ export declare function getTradeStats(db: Database.Database): {
50
+ total: number;
51
+ wins: number;
52
+ losses: number;
53
+ totalPnl: number;
54
+ winRate: number;
55
+ };
56
+ export declare function getConfig(db: Database.Database, key: string): string | null;
57
+ export declare function setConfig(db: Database.Database, key: string, value: string): void;
58
+ export declare function getOpenPositions(db: Database.Database): TradeRecord[];
59
+ export declare function updateTradeExit(db: Database.Database, tradeId: number, currentPrice: number, exitReason: string, pnl: number): void;
60
+ export declare function getPositionsByStatus(db: Database.Database, status: "open" | "closed" | "all"): TradeRecord[];
61
+ export declare function setExitRules(db: Database.Database, tradeId: number, slPrice: number | null, tpPrice: number | null): boolean;
62
+ export declare function getPositionsWithExitRules(db: Database.Database): TradeRecord[];
63
+ export interface WalletPortfolio {
64
+ address: string;
65
+ alias: string | null;
66
+ openPositions: number;
67
+ closedPositions: number;
68
+ totalInvested: number;
69
+ realizedPnl: number;
70
+ winRate: number;
71
+ }
72
+ export declare function getPortfolioByWallet(db: Database.Database): WalletPortfolio[];
73
+ export interface MarketWatch {
74
+ condition_id: string;
75
+ token_id: string | null;
76
+ title: string | null;
77
+ slug: string | null;
78
+ alert_below: number | null;
79
+ alert_above: number | null;
80
+ last_price: number | null;
81
+ added_at?: string;
82
+ }
83
+ export declare function addMarketWatch(db: Database.Database, entry: Omit<MarketWatch, "added_at">): void;
84
+ export declare function removeMarketWatch(db: Database.Database, conditionId: string): void;
85
+ export declare function getMarketWatchlist(db: Database.Database): MarketWatch[];
86
+ export declare function updateMarketWatchPrice(db: Database.Database, conditionId: string, price: number): void;
87
+ /** Daily P&L history for charting — returns cumulative running total */
88
+ export declare function getDailyPnlHistory(db: Database.Database): {
89
+ date: string;
90
+ pnl: number;
91
+ cumulative: number;
92
+ }[];
93
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ export function addToWatchlist(db, entry) {
2
+ db.prepare(`
3
+ INSERT OR REPLACE INTO watchlist (address, alias, roi, volume, pnl, trade_count)
4
+ VALUES (@address, @alias, @roi, @volume, @pnl, @trade_count)
5
+ `).run(entry);
6
+ }
7
+ export function removeFromWatchlist(db, address) {
8
+ db.prepare("DELETE FROM watchlist WHERE address = ?").run(address);
9
+ }
10
+ export function getWatchlist(db) {
11
+ return db.prepare("SELECT * FROM watchlist ORDER BY roi DESC").all();
12
+ }
13
+ export function getWatchlistCount(db) {
14
+ const row = db.prepare("SELECT COUNT(*) as count FROM watchlist").get();
15
+ return row.count;
16
+ }
17
+ export function updateLastChecked(db, address) {
18
+ db.prepare("UPDATE watchlist SET last_checked = datetime('now') WHERE address = ?").run(address);
19
+ }
20
+ export function recordTrade(db, trade) {
21
+ const result = db.prepare(`
22
+ INSERT INTO trades (trader_address, market_slug, condition_id, token_id, side, price, amount, original_amount, mode, status)
23
+ VALUES (@trader_address, @market_slug, @condition_id, @token_id, @side, @price, @amount, @original_amount, @mode, @status)
24
+ `).run(trade);
25
+ return Number(result.lastInsertRowid);
26
+ }
27
+ /** Atomically record a trade and update daily budget in a single transaction */
28
+ export function recordTradeWithBudget(db, trade, date, spendAmount, dailyLimit) {
29
+ const txn = db.transaction(() => {
30
+ const tradeId = recordTrade(db, trade);
31
+ addDailySpent(db, date, spendAmount, dailyLimit);
32
+ return tradeId;
33
+ });
34
+ return txn();
35
+ }
36
+ export function getTradeHistory(db, opts) {
37
+ let sql = "SELECT * FROM trades WHERE 1=1";
38
+ const params = {};
39
+ if (opts.trader) {
40
+ sql += " AND trader_address = @trader";
41
+ params.trader = opts.trader;
42
+ }
43
+ if (opts.status) {
44
+ sql += " AND status = @status";
45
+ params.status = opts.status;
46
+ }
47
+ sql += " ORDER BY created_at DESC LIMIT @limit";
48
+ params.limit = opts.limit ?? 50;
49
+ return db.prepare(sql).all(params);
50
+ }
51
+ export function hasExistingPosition(db, conditionId) {
52
+ const row = db.prepare("SELECT 1 FROM trades WHERE condition_id = ? AND status IN ('simulated', 'executed') LIMIT 1").get(conditionId);
53
+ return !!row;
54
+ }
55
+ export function getDailySpent(db, date) {
56
+ const row = db.prepare("SELECT spent FROM daily_budget WHERE date = ?").get(date);
57
+ return row?.spent ?? 0;
58
+ }
59
+ export function addDailySpent(db, date, amount, limitAmount) {
60
+ const existing = db.prepare("SELECT spent FROM daily_budget WHERE date = ?").get(date);
61
+ if (existing) {
62
+ db.prepare("UPDATE daily_budget SET spent = spent + ? WHERE date = ?").run(amount, date);
63
+ }
64
+ else {
65
+ db.prepare("INSERT INTO daily_budget (date, spent, limit_amount) VALUES (?, ?, ?)").run(date, amount, limitAmount);
66
+ }
67
+ }
68
+ export function getDailyBudgetRemaining(db, date, dailyLimit) {
69
+ const spent = getDailySpent(db, date);
70
+ return Math.max(0, dailyLimit - spent);
71
+ }
72
+ export function getTradeStats(db) {
73
+ const rows = db.prepare("SELECT status, pnl FROM trades").all();
74
+ const total = rows.length;
75
+ const wins = rows.filter((r) => r.status === "resolved_win").length;
76
+ const losses = rows.filter((r) => r.status === "resolved_loss").length;
77
+ const totalPnl = rows.reduce((sum, r) => sum + (r.pnl ?? 0), 0);
78
+ const resolved = wins + losses;
79
+ const winRate = resolved > 0 ? (wins / resolved) * 100 : 0;
80
+ return { total, wins, losses, totalPnl, winRate };
81
+ }
82
+ export function getConfig(db, key) {
83
+ const row = db.prepare("SELECT value FROM config WHERE key = ?").get(key);
84
+ return row?.value ?? null;
85
+ }
86
+ export function setConfig(db, key, value) {
87
+ db.prepare("INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)").run(key, value);
88
+ }
89
+ export function getOpenPositions(db) {
90
+ return db.prepare("SELECT * FROM trades WHERE status IN ('simulated', 'executed') ORDER BY created_at DESC").all();
91
+ }
92
+ export function updateTradeExit(db, tradeId, currentPrice, exitReason, pnl) {
93
+ const status = pnl >= 0 ? "resolved_win" : "resolved_loss";
94
+ db.prepare("UPDATE trades SET current_price = ?, exit_reason = ?, pnl = ?, status = ?, resolved_at = datetime('now') WHERE id = ?").run(currentPrice, exitReason, pnl, status, tradeId);
95
+ }
96
+ export function getPositionsByStatus(db, status) {
97
+ if (status === "open") {
98
+ return db.prepare("SELECT * FROM trades WHERE status IN ('simulated', 'executed') ORDER BY created_at DESC").all();
99
+ }
100
+ if (status === "closed") {
101
+ return db.prepare("SELECT * FROM trades WHERE status IN ('resolved_win', 'resolved_loss', 'failed') ORDER BY resolved_at DESC").all();
102
+ }
103
+ return db.prepare("SELECT * FROM trades ORDER BY created_at DESC").all();
104
+ }
105
+ export function setExitRules(db, tradeId, slPrice, tpPrice) {
106
+ const result = db.prepare("UPDATE trades SET sl_price = ?, tp_price = ? WHERE id = ? AND status IN ('simulated', 'executed')").run(slPrice, tpPrice, tradeId);
107
+ return result.changes > 0;
108
+ }
109
+ export function getPositionsWithExitRules(db) {
110
+ return db.prepare("SELECT * FROM trades WHERE status IN ('simulated', 'executed') AND (sl_price IS NOT NULL OR tp_price IS NOT NULL) ORDER BY created_at DESC").all();
111
+ }
112
+ export function getPortfolioByWallet(db) {
113
+ const wallets = db.prepare("SELECT address, alias FROM watchlist").all();
114
+ return wallets.map((w) => {
115
+ const trades = db.prepare("SELECT status, amount, pnl FROM trades WHERE trader_address = ?").all(w.address);
116
+ const open = trades.filter((t) => t.status === "simulated" || t.status === "executed");
117
+ const wins = trades.filter((t) => t.status === "resolved_win").length;
118
+ const losses = trades.filter((t) => t.status === "resolved_loss").length;
119
+ const resolved = wins + losses;
120
+ return {
121
+ address: w.address,
122
+ alias: w.alias,
123
+ openPositions: open.length,
124
+ closedPositions: resolved,
125
+ totalInvested: open.reduce((sum, t) => sum + t.amount, 0),
126
+ realizedPnl: trades.reduce((sum, t) => sum + (t.pnl ?? 0), 0),
127
+ winRate: resolved > 0 ? (wins / resolved) * 100 : 0,
128
+ };
129
+ });
130
+ }
131
+ export function addMarketWatch(db, entry) {
132
+ db.prepare(`
133
+ INSERT OR REPLACE INTO market_watchlist (condition_id, token_id, title, slug, alert_below, alert_above, last_price)
134
+ VALUES (@condition_id, @token_id, @title, @slug, @alert_below, @alert_above, @last_price)
135
+ `).run(entry);
136
+ }
137
+ export function removeMarketWatch(db, conditionId) {
138
+ db.prepare("DELETE FROM market_watchlist WHERE condition_id = ?").run(conditionId);
139
+ }
140
+ export function getMarketWatchlist(db) {
141
+ return db.prepare("SELECT * FROM market_watchlist ORDER BY added_at DESC").all();
142
+ }
143
+ export function updateMarketWatchPrice(db, conditionId, price) {
144
+ db.prepare("UPDATE market_watchlist SET last_price = ? WHERE condition_id = ?").run(price, conditionId);
145
+ }
146
+ /** Daily P&L history for charting — returns cumulative running total */
147
+ export function getDailyPnlHistory(db) {
148
+ const rows = db.prepare(`
149
+ SELECT date(resolved_at) as date, SUM(pnl) as pnl
150
+ FROM trades
151
+ WHERE pnl IS NOT NULL AND resolved_at IS NOT NULL
152
+ GROUP BY date(resolved_at)
153
+ ORDER BY date ASC
154
+ `).all();
155
+ let cumulative = 0;
156
+ return rows.map((r) => {
157
+ cumulative += r.pnl;
158
+ return { date: r.date, pnl: r.pnl, cumulative };
159
+ });
160
+ }
161
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import Database from "better-sqlite3";
2
+ export declare function initializeDb(db: Database.Database): void;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAsFxD"}
@@ -0,0 +1,88 @@
1
+ export function initializeDb(db) {
2
+ db.pragma("journal_mode = WAL");
3
+ db.exec(`
4
+ CREATE TABLE IF NOT EXISTS watchlist (
5
+ address TEXT PRIMARY KEY,
6
+ alias TEXT,
7
+ roi REAL,
8
+ volume REAL,
9
+ pnl REAL,
10
+ trade_count INTEGER,
11
+ added_at TEXT DEFAULT (datetime('now')),
12
+ last_checked TEXT
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS trades (
16
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17
+ trader_address TEXT NOT NULL,
18
+ market_slug TEXT,
19
+ condition_id TEXT,
20
+ token_id TEXT,
21
+ side TEXT NOT NULL,
22
+ price REAL NOT NULL,
23
+ amount REAL NOT NULL,
24
+ original_amount REAL,
25
+ mode TEXT NOT NULL CHECK (mode IN ('preview', 'live')),
26
+ status TEXT NOT NULL CHECK (status IN ('simulated', 'executed', 'failed', 'resolved_win', 'resolved_loss')),
27
+ pnl REAL DEFAULT 0,
28
+ created_at TEXT DEFAULT (datetime('now')),
29
+ resolved_at TEXT,
30
+ current_price REAL,
31
+ exit_reason TEXT
32
+ );
33
+
34
+ CREATE TABLE IF NOT EXISTS daily_budget (
35
+ date TEXT NOT NULL,
36
+ spent REAL DEFAULT 0,
37
+ limit_amount REAL NOT NULL,
38
+ PRIMARY KEY (date)
39
+ );
40
+
41
+ CREATE TABLE IF NOT EXISTS config (
42
+ key TEXT PRIMARY KEY,
43
+ value TEXT NOT NULL
44
+ );
45
+
46
+ CREATE TABLE IF NOT EXISTS agent_cycles (
47
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
48
+ agent_name TEXT NOT NULL,
49
+ strategy TEXT NOT NULL,
50
+ status TEXT NOT NULL DEFAULT 'ok',
51
+ positions_open INTEGER DEFAULT 0,
52
+ positions_closed INTEGER DEFAULT 0,
53
+ realized_pnl REAL DEFAULT 0,
54
+ unrealized_pnl REAL DEFAULT 0,
55
+ win_rate REAL DEFAULT 0,
56
+ budget_used REAL DEFAULT 0,
57
+ budget_limit REAL DEFAULT 0,
58
+ actions_taken TEXT,
59
+ notes TEXT,
60
+ created_at TEXT DEFAULT (datetime('now'))
61
+ );
62
+
63
+ CREATE TABLE IF NOT EXISTS market_watchlist (
64
+ condition_id TEXT PRIMARY KEY,
65
+ token_id TEXT,
66
+ title TEXT,
67
+ slug TEXT,
68
+ alert_below REAL,
69
+ alert_above REAL,
70
+ last_price REAL,
71
+ added_at TEXT DEFAULT (datetime('now'))
72
+ );
73
+
74
+ CREATE INDEX IF NOT EXISTS idx_trades_condition_id ON trades(condition_id);
75
+ CREATE INDEX IF NOT EXISTS idx_trades_trader_address ON trades(trader_address);
76
+ CREATE INDEX IF NOT EXISTS idx_trades_status ON trades(status);
77
+ CREATE INDEX IF NOT EXISTS idx_trades_created_at ON trades(created_at);
78
+ CREATE INDEX IF NOT EXISTS idx_daily_budget_date ON daily_budget(date);
79
+ `);
80
+ // Migrations — add columns safely
81
+ const cols = db.prepare("PRAGMA table_info(trades)").all();
82
+ const colNames = new Set(cols.map((c) => c.name));
83
+ if (!colNames.has("sl_price"))
84
+ db.exec("ALTER TABLE trades ADD COLUMN sl_price REAL");
85
+ if (!colNames.has("tp_price"))
86
+ db.exec("ALTER TABLE trades ADD COLUMN tp_price REAL");
87
+ }
88
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EP,CAAC,CAAC;IAEH,kCAAkC;IAClC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,GAAG,EAAwB,CAAC;IACjF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACtF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}