@gonzih/polymarket-arb 1.0.0 → 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.
- package/README.md +14 -5
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +8 -29
- package/dist/claude.js.map +1 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -7,10 +7,20 @@ Claude-powered Polymarket arbitrage bot. Monitors BTC/ETH price feeds, detects 3
|
|
|
7
7
|
1. **Price feeds** — connects to Binance WebSocket (with Coinbase fallback on 451 geo-block) for real-time BTC/ETH prices
|
|
8
8
|
2. **Signal detection** — fires when |30s momentum| > 0.35%
|
|
9
9
|
3. **Contract discovery** — queries Polymarket GraphQL for open BTC/ETH up/down contracts expiring within 20 minutes
|
|
10
|
-
4. **Claude analysis** —
|
|
10
|
+
4. **Claude analysis** — spawns `claude --print` subprocess with signal + contract data to get confidence score, Kelly fraction, and reasoning
|
|
11
11
|
5. **Trade entry** — only enters if Claude confidence > 0.65; sizes position using Kelly Criterion (capped at 10%)
|
|
12
12
|
6. **Risk management** — daily loss limit -20%, total drawdown kill switch -40%
|
|
13
13
|
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- `claude` CLI installed and authenticated:
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @anthropic-ai/claude-code
|
|
19
|
+
claude # run once to authenticate
|
|
20
|
+
claude --version # verify
|
|
21
|
+
```
|
|
22
|
+
- No API key needed — uses your existing Claude Code session
|
|
23
|
+
|
|
14
24
|
## Installation
|
|
15
25
|
|
|
16
26
|
```bash
|
|
@@ -21,17 +31,16 @@ npm install -g @gonzih/polymarket-arb
|
|
|
21
31
|
|
|
22
32
|
```bash
|
|
23
33
|
# Paper trading (default, safe)
|
|
24
|
-
|
|
34
|
+
polymarket-arb --paper
|
|
25
35
|
|
|
26
36
|
# Live trading
|
|
27
|
-
|
|
37
|
+
POLYMARKET_API_KEY=... POLYMARKET_SECRET=... polymarket-arb --live
|
|
28
38
|
```
|
|
29
39
|
|
|
30
40
|
## Environment variables
|
|
31
41
|
|
|
32
42
|
| Variable | Required | Default | Description |
|
|
33
43
|
|----------|----------|---------|-------------|
|
|
34
|
-
| `ANTHROPIC_API_KEY` | Yes | — | Claude API key |
|
|
35
44
|
| `POLYMARKET_API_KEY` | Live only | — | Polymarket CLOB API key |
|
|
36
45
|
| `POLYMARKET_SECRET` | Live only | — | Polymarket API secret |
|
|
37
46
|
| `PAPER_MODE` | No | `true` | Set `false` for live trading |
|
|
@@ -59,7 +68,7 @@ src/
|
|
|
59
68
|
feeds.ts — Binance + Coinbase WebSocket managers
|
|
60
69
|
signal.ts — 30s momentum calculation
|
|
61
70
|
polymarket.ts — GraphQL contract discovery + CLOB order placement
|
|
62
|
-
claude.ts —
|
|
71
|
+
claude.ts — claude CLI subprocess integration, trade analysis
|
|
63
72
|
kelly.ts — Kelly Criterion position sizing, risk limits
|
|
64
73
|
logger.ts — Structured JSON logging
|
|
65
74
|
daemon.ts — Main bot loop, kill switch logic
|
package/dist/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKhD,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiD/B"}
|
package/dist/claude.js
CHANGED
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { execFile } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
2
3
|
import { log } from "./logger.js";
|
|
3
|
-
const
|
|
4
|
-
let client = null;
|
|
5
|
-
function getClient() {
|
|
6
|
-
if (!client) {
|
|
7
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
8
|
-
if (!apiKey)
|
|
9
|
-
throw new Error("ANTHROPIC_API_KEY is required");
|
|
10
|
-
client = new Anthropic({ apiKey });
|
|
11
|
-
}
|
|
12
|
-
return client;
|
|
13
|
-
}
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
14
5
|
export async function analyzeTradeOpportunity(signal, contract) {
|
|
15
6
|
const momentumPct = (signal.momentum * 100).toFixed(3);
|
|
16
7
|
const direction = signal.direction === "down" ? "dropped" : "rose";
|
|
17
|
-
const contractOdds = contract.
|
|
8
|
+
const contractOdds = contract.yesPrice;
|
|
18
9
|
const minutesToExpiry = Math.round((contract.expiresAt - Date.now()) / 60_000);
|
|
19
|
-
// Implied real probability based on momentum direction matching contract
|
|
20
10
|
const impliedProb = signal.direction === contract.direction ? 0.75 : 0.35;
|
|
21
11
|
const impliedEdge = Math.abs(impliedProb - contractOdds);
|
|
22
12
|
const prompt = `You are a prediction market arbitrage assistant. Analyze this trade opportunity and respond in JSON only.
|
|
@@ -30,24 +20,13 @@ Current price: ${signal.currentPrice}
|
|
|
30
20
|
|
|
31
21
|
Assess: Does the momentum signal justify a bet on this contract? Consider momentum strength, edge size, time to expiry, and signal-contract alignment.
|
|
32
22
|
|
|
33
|
-
Respond with JSON only:
|
|
23
|
+
Respond with JSON only, no markdown:
|
|
34
24
|
{"confidence": 0.0-1.0, "kelly_fraction": 0.0-0.1, "reasoning": "brief explanation", "enter": true/false}`;
|
|
35
25
|
try {
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
model: MODEL,
|
|
39
|
-
max_tokens: 256,
|
|
40
|
-
messages: [{ role: "user", content: prompt }],
|
|
41
|
-
});
|
|
42
|
-
const content = message.content[0];
|
|
43
|
-
if (content.type !== "text") {
|
|
44
|
-
log("warn", { source: "claude", event: "unexpected_response_type" });
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
// Extract JSON from response (may have surrounding text)
|
|
48
|
-
const jsonMatch = content.text.match(/\{[^}]+\}/s);
|
|
26
|
+
const { stdout } = await execFileAsync("claude", ["--print", "--model", "claude-haiku-4-5-20251001", prompt], { timeout: 15000 });
|
|
27
|
+
const jsonMatch = stdout.match(/\{[\s\S]*\}/);
|
|
49
28
|
if (!jsonMatch) {
|
|
50
|
-
log("warn", { source: "claude", event: "no_json_in_response", text:
|
|
29
|
+
log("warn", { source: "claude", event: "no_json_in_response", text: stdout });
|
|
51
30
|
return null;
|
|
52
31
|
}
|
|
53
32
|
const analysis = JSON.parse(jsonMatch[0]);
|
package/dist/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAS1C,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAsB,EACtB,QAAkB;IAElB,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACvC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;IAE/E,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG;;UAEP,MAAM,CAAC,MAAM,IAAI,SAAS,IAAI,WAAW;wBAC3B,QAAQ,CAAC,QAAQ,yBAAyB,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9G,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mDAAmD,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;qBAC1G,eAAe;uBACb,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;iBACnC,MAAM,CAAC,YAAY;;;;;0GAKsE,CAAC;IAEzG,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,QAAQ,EACR,CAAC,SAAS,EAAE,SAAS,EAAE,2BAA2B,EAAE,MAAM,CAAC,EAC3D,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAkB,CAAC;QAC3D,GAAG,CAAC,MAAM,EAAE;YACV,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,GAAG,QAAQ;SACZ,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,6 @@ Options:
|
|
|
14
14
|
--help Show this help
|
|
15
15
|
|
|
16
16
|
Environment variables:
|
|
17
|
-
ANTHROPIC_API_KEY Required — Claude API key for trade analysis
|
|
18
17
|
POLYMARKET_API_KEY Required for live trading
|
|
19
18
|
POLYMARKET_SECRET Required for live trading
|
|
20
19
|
PAPER_MODE=true Default paper mode (overridden by --live flag)
|
|
@@ -34,10 +33,6 @@ if (!paperMode && !process.env.POLYMARKET_API_KEY) {
|
|
|
34
33
|
console.error("ERROR: --live mode requires POLYMARKET_API_KEY environment variable");
|
|
35
34
|
process.exit(1);
|
|
36
35
|
}
|
|
37
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
38
|
-
console.error("ERROR: ANTHROPIC_API_KEY environment variable is required");
|
|
39
|
-
process.exit(1);
|
|
40
|
-
}
|
|
41
36
|
log("info", {
|
|
42
37
|
event: "startup",
|
|
43
38
|
mode: paperMode ? "paper" : "live",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;iBAgBG,MAAM,EAAE;CACxB,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,uBAAuB;AACvB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACvC,CAAC,CAAC,KAAK;IACP,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC1B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO,CAAC;AAEvC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IAClD,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,GAAG,CAAC,MAAM,EAAE;IACV,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;IAClC,MAAM,EAAE,MAAM,EAAE;IAChB,WAAW,EAAE,OAAO,CAAC,OAAO;CAC7B,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;AAC5C,MAAM,CAAC,KAAK,EAAE,CAAC;AAEf,oBAAoB;AACpB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gonzih/polymarket-arb",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Claude-powered Polymarket arbitrage bot — BTC/ETH momentum signal + AI trade analysis",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"polymarket",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"type": "module",
|
|
23
23
|
"bin": {
|
|
24
|
-
"polymarket-arb": "
|
|
24
|
+
"polymarket-arb": "dist/index.js"
|
|
25
25
|
},
|
|
26
26
|
"main": "./dist/index.js",
|
|
27
27
|
"scripts": {
|
|
@@ -41,7 +41,6 @@
|
|
|
41
41
|
"access": "public"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@anthropic-ai/sdk": "0.39.0",
|
|
45
44
|
"ws": "8.18.1"
|
|
46
45
|
},
|
|
47
46
|
"devDependencies": {
|