polymarket-trade
name: polymarket-trade
by aure-duncan · published 2026-04-01
$ claw add gh:aure-duncan/aure-duncan-aurehub-polymarket-trade---
name: polymarket-trade
description: >
Trade on Polymarket prediction markets on Polygon. Supports browsing markets,
checking wallet/CLOB balance, and buying or selling YES/NO shares with safety gates.
Wallet: WDK vault (~/.aurehub/.wdk_vault). Config: ~/.aurehub/polymarket.yaml.
Triggers: buy YES, buy NO, sell shares, browse markets, check Polymarket balance,
Polymarket trade, prediction market, what are the odds, redeem winnings, claim resolved positions.
license: MIT
compatibility: "Requires Node.js >= 18, Polygon RPC (HTTPS), and Polymarket CLOB API credentials."
metadata:
author: aurehub
version: "1.0.0"
---
# polymarket-trade
Trade on Polymarket prediction markets. Non-custodial — private key stays in your WDK vault.
Prerequisites
Before any action, check prerequisites for the current flow and auto-fix what you can.
**Browse flow** (no wallet, no RPC, no CLOB needed): check step 4 only.
**Redeem flow** (no CLOB needed): check steps 1–5 in order.
**Balance / Trade / Setup flow**: check all steps 1–6 in order.
Step types:
| Step | Missing item | Type | Agent action |
|------|---|---|---|
| 1 | `~/.aurehub/.wdk_vault` | HARD STOP | Inform: xaut-trade must be installed and its wallet setup completed first. Stop. |
| 2 | `~/.aurehub/.wdk_password` | HARD STOP | Inform: xaut-trade must be installed and its wallet setup completed first. Stop. |
| 3 | `~/.aurehub/.env` missing | AUTO-FIX | Run: `cp <skill-dir>/.env.example ~/.aurehub/.env` |
| 3 | `~/.aurehub/.env` exists, `POLYGON_RPC_URL` absent | AUTO-FIX | Append `POLYGON_RPC_URL=https://polygon.drpc.org` to `~/.aurehub/.env` |
| 4 | `~/.aurehub/polymarket.yaml` missing | AUTO-FIX | Run: `cp <skill-dir>/config.example.yaml ~/.aurehub/polymarket.yaml` |
| 5 | `node_modules` missing in `<skill-dir>/scripts/` | AUTO-FIX | Run: `npm install` in `<skill-dir>/scripts/` |
| 6 | `~/.aurehub/.polymarket_clob` missing | INTERACTIVE | Run: `node <skill-dir>/scripts/setup.js` (only after steps 3–5 pass) |
On any auto-fix failure: stop and report the error with the manual remediation command.
After all fixes succeed, re-run the relevant checks and proceed.
After prerequisites pass: if the user's message matches browse flow (contains "browse", "what markets", "what are the odds"), skip registration and proceed directly to intent detection. Otherwise run **Wallet-Ready Registration** (below) before proceeding to intent detection.
`<skill-dir>` is the directory containing this SKILL.md file.
Resolving POLY_SCRIPTS_DIR
Use `<skill-dir>/scripts` as the scripts directory. To find it at runtime:
# 1. Git repo fallback
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
[ -n "$GIT_ROOT" ] && [ -d "$GIT_ROOT/skills/polymarket-trade/scripts" ] && POLY_SCRIPTS_DIR="$GIT_ROOT/skills/polymarket-trade/scripts"
# 2. Bounded home search
[ -z "$POLY_SCRIPTS_DIR" ] && POLY_SCRIPTS_DIR=$(dirname "$(find -L "$HOME" -maxdepth 6 -type f -path "*/polymarket-trade/scripts/browse.js" 2>/dev/null | head -1)")Wallet-Ready Registration
Run after prerequisites pass for any wallet-requiring flow (not browse). Derive WALLET_ADDRESS using xaut-trade's `swap.js` (required by prerequisites):
XAUT_SWAP=$(find -L "$HOME" -maxdepth 6 -type f -path "*/xaut-trade/scripts/swap.js" 2>/dev/null | head -1)
source ~/.aurehub/.env
WALLET_ADDRESS=$(node "$XAUT_SWAP" address | node -p "JSON.parse(require('fs').readFileSync(0,'utf8')).address")If `XAUT_SWAP` is empty or the command fails, skip registration silently and continue.
1. `REGISTERED=$(cat ~/.aurehub/.registered 2>/dev/null)`
2. If `"$REGISTERED"` starts with `"$WALLET_ADDRESS:"` → already registered, silent skip; return immediately
3. If `RANKINGS_OPT_IN` != `"true"`:
- Check marker: `PROMPTED=$(cat ~/.aurehub/.rankings_prompted 2>/dev/null)`
- If marker starts with `"$WALLET_ADDRESS:"` → skip; return immediately
- Otherwise ask once: "Join XAUT activity rankings now? (yes/no)"
- If user says `no`: `echo "$WALLET_ADDRESS:declined" > ~/.aurehub/.rankings_prompted`; return
- If user says `yes`:
- If `NICKNAME` is empty: ask user for nickname
- Persist opt-in in `~/.aurehub/.env` (`RANKINGS_OPT_IN=true`, `NICKNAME=<value>`)
- Re-source env: `source ~/.aurehub/.env`
- Continue to step 4
4. If `RANKINGS_OPT_IN` == `"true"`:
- If `NICKNAME` is empty: ask "You're opted in to XAUT activity rankings — what nickname would you like to appear as?", then persist to `~/.aurehub/.env` and re-source
- Register:
```bash
NICKNAME_ESC=$(printf '%s' "$NICKNAME" | sed 's/\\/\\\\/g; s/"/\\"/g')
REGISTER_RESP=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
https://xaue.com/api/rankings/participants \
-H 'Content-Type: application/json' \
-d "{\"wallet_address\":\"$WALLET_ADDRESS\",\"nickname\":\"$NICKNAME_ESC\",\"source\":\"agent\"}")
```
- HTTP 200 or 201: `echo "$WALLET_ADDRESS:$NICKNAME" > ~/.aurehub/.registered`; inform: "Registered with nickname: $NICKNAME"
- Any other status: silent continue, do not write marker file
Only prompt once per wallet. The `.rankings_prompted` and `.registered` markers ensure idempotency across sessions.
Intent Detection
| User says | Action |
|-----------|--------|
| "buy YES on X market", "buy X at Y price", "buy shares" | buy flow |
| "sell my YES shares", "sell X shares" | sell flow |
| "browse X", "what markets", "what are the odds on X" | browse flow |
| "my polymarket balance", "how much USDC" | balance flow |
| "redeem", "claim winnings", "collect" | redeem flow |
Browse Flow
Run environment check (no wallet, no RPC, no CLOB credentials needed):
node "$POLY_SCRIPTS_DIR/browse.js" "<keyword or market slug>"Show the output to the user. The output includes:
Prefer passing ConditionId to `--market` when trading (more reliable than slug).
Balance Flow
Run environment check:
node "$POLY_SCRIPTS_DIR/balance.js"Redeem Flow
Run environment check (no CLOB credentials needed), then:
node "$POLY_SCRIPTS_DIR/redeem.js"Show output. If negRisk positions are skipped, tell the user to visit polymarket.com.
Buy Flow
1. Run `node "$POLY_SCRIPTS_DIR/browse.js" <market>` to show current prices
2. Ask user: market slug, side (YES/NO), amount in USD
3. Run: `node "$POLY_SCRIPTS_DIR/trade.js" --buy --market <slug> --side YES|NO --amount <usd>`
4. The script handles approval and order submission; report the result
Pass `--dry-run` to simulate the full flow (balance checks, hard stops, order construction) without submitting any transactions.
Sell Flow
1. Run `node "$POLY_SCRIPTS_DIR/browse.js" <market>` to confirm token IDs and current bids
2. Ask user: market slug, side (YES/NO to sell), number of shares
3. Run: `node "$POLY_SCRIPTS_DIR/trade.js" --sell --market <slug> --side YES|NO --amount <shares>`
4. The script handles setApprovalForAll and order submission; report the result
Pass `--dry-run` to simulate the full flow (balance checks, hard stops, order construction) without submitting any transactions.
Safety Gates (handled by trade.js)
Geo-restriction
Polymarket API blocks US and some other regions. If you see a 403 error, tell the user to enable a VPN and retry.
Polymarket Knowledge Base
Answer knowledge queries directly using the data above — no API calls needed.
References
Load these on demand:
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...