Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user wants to actually PLACE, manage, or redeem bets on Polymarket (not just read odds — that's blockrun_markets). Covers setup (deposit wallet, funding, approvals), buy/sell with confirm gating, positions, redeeming winnings, geoblock handling, and the end-to-end demo flow.
.claude/skills/blockrunai-polymarket-trading/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 53% | 0% |
Real-money trading on Polymarket's CLOB V2 (Polygon), signed locally by the user's BlockRun wallet key. Data discovery stays on blockrun_markets — this tool only trades.
~/.blockrun/.session by default; aBLOCKRUN_WALLET_KEY env var or an existing agent wallet.json takes precedence). Never leaves the machine. setup prints the actual signer address — back up the key behind it, wherever it lives (key file or env-var value).
(POLY_1271). It holds the betting funds in pUSD and only honors the signer's EIP-712 signatures. Deploy/approve/redeem are gasless (relayer).
Base. The budget ledger does NOT cover bets — confirm:true + caps do.
setup the MCP bootstraps a builder key from the user's OWN wallet, then derives + deploys the vault (all gasless). Geoblock is handled by default — CLOB traffic routes through BlockRun's Finland egress out of the box.
confirm:true unless the user explicitly approved that exacttrade. Call once WITHOUT confirm → show the dry-run preview → ask → re-call with confirm:true.
POLYMARKET_MAX_BET_USD (default $25) and optional session capare enforced server-side; don't try to split orders to sneak past them.
approve, region, re-run setup). Don't retry blindly.
# 0. No Polymarket account or API keys needed — the MCP bootstraps everything
# from the user's own wallet on first setup. (Geoblock is already handled:
# CLOB traffic routes through BlockRun's Finland egress by default. Set
# POLYMARKET_CLOB_HOST only to use your own egress, or to hit Polymarket
# directly from a permitted region.)
# 1. Provision + inspect (idempotent, safe to re-run any time)
blockrun_polymarket action:"setup"
# → deposit wallet address + funding instructions + region status
# 2. Fund the vault from the user's Base USDC — gasless x402, one call ($0.01 fee,
# non-custodial). pUSD credit is ASYNC (minutes) — re-run setup to watch it. Min $2.
blockrun_polymarket action:"fund" amount_usd:5 # dry-run preview
blockrun_polymarket action:"fund" amount_usd:5 confirm:true
# 3. Sign the one-time gasless approval batch (after user consent)
blockrun_polymarket action:"setup" confirm:true
# 4. Find a market, then resolve the selected condition (paid data)
blockrun_markets path:"markets/search" params:{q:"Bitcoin",status:"open",venue:"polymarket",limit:"20"}
blockrun_markets path:"polymarket/markets/keyset" params:{condition_id:"0x...",status:"open",limit:"5"}
# 5. Preview, then place
blockrun_polymarket_read action:"preview" side:"buy" token_id:"..." amount_usd:5 order_type:"FOK"
blockrun_polymarket action:"buy" token_id:"..." amount_usd:5 order_type:"FOK" confirm:true
# or limit: price:0.45 size:10 (GTC; order_type:"GTD" + expires_at for expiry)
# or via condition: condition_id:"0x..." outcome:"Yes"
# 6. Manage
blockrun_polymarket_read action:"orders" # open orders
blockrun_polymarket action:"cancel" order_id:"..." # or all:true
blockrun_polymarket_read action:"positions" # holdings + PnL + redeemable
# 7. Claim winnings after resolution (gasless)
blockrun_polymarket action:"redeem" condition_id:"0x..." # preview
blockrun_polymarket action:"redeem" condition_id:"0x..." confirm:true
# 8. Cash out — pUSD → native USDC on Base, back to the user's agent wallet
blockrun_polymarket action:"withdraw" # dry-run (full balance)
blockrun_polymarket action:"withdraw" confirm:true # (partial: amount_usd:5)amount_usd (dollars). Market sell = size (shares).price + size; default GTC; post_only:true for maker-only.FAK or a limit at the shown book price.
Order placement is IP-geoblocked (US/UK/EU + many regions). Handled by default — CLOB traffic routes through BlockRun's Finland egress, so setup reports ✅ Region: order placement permitted out of the box; you don't need to do anything. A user can override by pointing POLYMARKET_CLOB_HOST at their own relay (or at Polymarket directly, from a permitted region), optionally reached through their own proxy via POLYMARKET_CLOB_PROXY / HTTPS_PROXY (POLYMARKET_CLOB_PROXY wins if both are set). A proxy alone does NOT change the Polymarket-facing egress — CLOB traffic still exits from BlockRun's Finland relay unless POLYMARKET_CLOB_HOST is also repointed. Respecting Polymarket's ToS for the user's jurisdiction is the user's responsibility — never suggest evading it.
action:"setup".user's own wallet on first setup. (Advanced: POLYMARKET_SIG_TYPE=0 = plain EOA mode; needs POL gas + pUSD in the EOA. The CLOB may reject plain-EOA makers on order placement — treat it as a diagnostic fallback, not a guaranteed trading mode.)
balance cache and retries once; if it still fails, the vault genuinely lacks pUSD or approvals — fund it, then action:"setup" confirm:true.
shows ready → a deposit wallet created before the pUSD→NegRisk Adapter approval was added needs ONE more action:"setup" confirm:true to grant it (setup reads approvals on-chain every run, so it detects and signs the missing one).
collateral-adapter approvals redeem now pulls tokens through — one action:"setup" confirm:true grants them.
once (creds re-derived); if persistent, setup, then as a last resort POLYMARKET_SIG_TYPE=0 (upstream clob-client-v2 issue #65; see the EOA-mode caveat above).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,410 | 5,720 | -32% | 1 | 1 | 0% | 1,411 | 2,146 | +52% | 0 | 0 | — |
case-02 | pass→fail | 7,303 | 8,021 | +10% | 1 | 1 | 0% | 1,111 | 2,593 | +133% | 0 | 0 | — |
case-03 | fail→fail | 12,581 | 6,005 | -52% | 1 | 1 | 0% | 2,333 | 2,362 | +1% | 0 | 0 | — |
case-04 | pass→pass | 5,715 | 4,302 | -25% | 1 | 1 | 0% | 875 | 2,640 | +202% | 0 | 0 | — |
case-05 | fail→fail | 8,662 | 3,490 | -60% | 1 | 1 | 0% | 1,415 | 2,363 | +67% | 0 | 0 | — |
case-06 | fail→pass | 10,197 | 2,937 | -71% | 1 | 1 | 0% | 1,562 | 2,353 | +51% | 0 | 0 | — |
case-07 | fail→pass | 18,995 | 2,618 | -86% | 1 | 1 | 0% | 1,373 | 2,322 | +69% | 0 | 0 | — |
case-08 | fail→pass | 11,046 | 3,783 | -66% | 1 | 1 | 0% | 1,713 | 2,554 | +49% | 0 | 0 | — |
case-09 | fail→pass | 7,147 | 3,875 | -46% | 1 | 1 | 0% | 1,274 | 2,667 | +109% | 0 | 0 | — |
case-10 | fail→pass | 10,844 | 3,923 | -64% | 1 | 1 | 0% | 1,694 | 2,597 | +53% | 0 | 0 | — |
case-11 | fail→pass | 13,101 | 2,052 | -84% | 1 | 1 | 0% | 2,246 | 2,206 | -2% | 0 | 0 | — |
case-12 | fail→pass | 14,401 | 4,609 | -68% | 1 | 1 | 0% | 2,254 | 2,686 | +19% | 0 | 0 | — |
case-13 | pass→pass | 5,601 | 1,795 | -68% | 1 | 1 | 0% | 868 | 2,146 | +147% | 0 | 0 | — |
case-14 | fail→pass | 7,360 | 1,966 | -73% | 1 | 1 | 0% | 1,135 | 2,213 | +95% | 0 | 0 | — |
case-15 | fail→pass | 7,349 | 2,440 | -67% | 1 | 1 | 0% | 1,217 | 2,282 | +88% | 0 | 0 | — |
case-16 | fail→pass | 9,331 | 4,181 | -55% | 1 | 1 | 0% | 1,693 | 2,584 | +53% | 0 | 0 | — |
case-17 | fail→pass | 10,155 | 1,670 | -84% | 1 | 1 | 0% | 1,663 | 2,136 | +28% | 0 | 0 | — |
case-18 | pass→pass | 6,724 | 1,814 | -73% | 1 | 1 | 0% | 1,086 | 2,161 | +99% | 0 | 0 | — |
case-19 | fail→pass | 14,657 | 1,808 | -88% | 1 | 1 | 0% | 2,284 | 2,174 | -5% | 0 | 0 | — |
case-20 | fail→fail | 8,210 | 2,713 | -67% | 1 | 1 | 0% | 1,468 | 2,386 | +63% | 0 | 0 | — |
case-21 | fail→fail | 8,928 | 9,122 | +2% | 1 | 1 | 0% | 1,505 | 2,321 | +54% | 0 | 0 | — |
case-22 | fail→pass | 16,839 | 10,396 | -38% | 1 | 1 | 0% | 3,394 | 3,711 | +9% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 17 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +55 percentage points is the difference between those two pass rates over the 17 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.