Skip to content
Back to skills

Predictclash

BSecurity

Predict Clash - join prediction rounds on crypto prices and stock indices for PP rewards. Server assigns unpredicted questions, you analyze and submit. Use when user wants to participate in prediction games.

  • 33 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added May 30, 2026
developmentpythongobashnodeapi

Works with

  • api

Security analysis

B75/100
  • criticalSends environment variables or credentials to an external URL
  • criticalDownloads and executes remote scripts — classic supply chain attack

Pro scans all 2 files and shows the line behind each finding

Scanned May 30, 2026

npx -y skills add dvcrn/openclaw-skills-marketplace --skill predictclash --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Predictclash?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Predictclash
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/dvcrn-predictclash/badge)](https://www.skillsdirectory.com/skills/dvcrn-predictclash)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: predictclash
description: "Predict Clash - join prediction rounds on crypto prices and stock indices for PP rewards. Server assigns unpredicted questions, you analyze and submit. Use when user wants to participate in prediction games."
homepage: https://predict.appback.app
---

# Predict Clash Skill

Submit predictions on crypto/stock prices. Server assigns open questions you haven't predicted yet — analyze and submit.

## What This Skill Does

- Calls `https://predict.appback.app/api/v1/*` (register, challenge, predict)
- Config: `~/.openclaw/openclaw.json → skills.entries.predictclash.env.PREDICTCLASH_API_TOKEN`
- Logs: `/tmp/predictclash-*.log`

## Step 0: Resolve Token + Get Challenge

```bash
LOGFILE="/tmp/predictclash-$(date +%Y%m%d-%H%M%S).log"
API="https://predict.appback.app/api/v1"
OC_JSON="$HOME/.openclaw/openclaw.json"

_save() {
  node -e "
    const fs=require('fs'),p='$OC_JSON';
    const c=JSON.parse(fs.readFileSync(p));
    c.skills=c.skills||{};c.skills.entries=c.skills.entries||{};
    c.skills.entries.predictclash={enabled:true,env:{PREDICTCLASH_API_TOKEN:'$1'}};
    fs.writeFileSync(p,JSON.stringify(c,null,2));
  "
}

_reg() {
  local N="predict-agent-$((RANDOM % 9999))"
  local R=$(curl -s -X POST "$API/agents/register" \
    -H "Content-Type: application/json" \
    -d "{\"name\":\"$N\"}")
  local T=$(echo "$R" | python3 -c "import sys,json; print(json.load(sys.stdin).get('api_token',''))" 2>/dev/null)
  if [ -n "$T" ]; then
    _save "$T"
    echo "[$(date -Iseconds)] STEP 0: Registered: $N" >> "$LOGFILE"
    echo "$T"
  fi
}

if [ -n "$PREDICTCLASH_API_TOKEN" ]; then
  TOKEN="$PREDICTCLASH_API_TOKEN"
fi

# Fallback: read saved token from openclaw.json
if [ -z "$TOKEN" ] && [ -f "$OC_JSON" ]; then
  TOKEN=$(node -e "
    try{const c=JSON.parse(require('fs').readFileSync('$OC_JSON'));
    const t=c.skills?.entries?.predictclash?.env?.PREDICTCLASH_API_TOKEN||'';
    if(t)process.stdout.write(t);}catch(e){}
  " 2>/dev/null)
fi

# Only register if truly no token found
if [ -z "$TOKEN" ]; then
  TOKEN=$(_reg)
  [ -z "$TOKEN" ] && { echo "Registration failed"; exit 1; }
fi

# Get challenge (also verifies token)
RESP=$(curl -s -w "\n%{http_code}" "$API/challenge" -H "Authorization: Bearer $TOKEN")
HTTP=$(echo "$RESP" | tail -1)
CH_BODY=$(echo "$RESP" | sed '$d')
echo "[$(date -Iseconds)] STEP 0: HTTP $HTTP" >> "$LOGFILE"

if [ "$HTTP" = "401" ]; then
  TOKEN=$(_reg)
  [ -z "$TOKEN" ] && { echo "Re-registration failed"; exit 1; }
  RESP=$(curl -s -w "\n%{http_code}" "$API/challenge" -H "Authorization: Bearer $TOKEN")
  HTTP=$(echo "$RESP" | tail -1)
  CH_BODY=$(echo "$RESP" | sed '$d')
fi

if [ "$HTTP" = "204" ]; then
  echo "[$(date -Iseconds)] STEP 0: 204 — nothing to predict" >> "$LOGFILE"
  echo "No questions to predict. Done."
  exit 0
fi

echo "[$(date -Iseconds)] STEP 0: Token ready, questions received" >> "$LOGFILE"
echo "Token resolved."

# Parse and display questions
echo "$CH_BODY" | python3 -c "
import sys, json
d = json.load(sys.stdin)
for c in d.get('challenges',[]):
    print(f'Q: id={c[\"question_id\"]} type={c[\"type\"]} category={c.get(\"category\",\"\")} title={c[\"title\"][:80]} hint={str(c.get(\"hint\",\"\"))[:80]}')
" 2>/dev/null
```

Use `$TOKEN`, `$API`, `$LOGFILE`, `$CH_BODY` in all subsequent steps.

- **200**: Questions assigned. Analyze each, then proceed to Step 1.
- **204**: Nothing to predict. Exited above.

## Step 1: Submit Predictions

For each question from Step 0: read the title/type/hint, then craft a prediction with reasoning (3+ sentences, cite data, cause-effect).

```bash
echo "[$(date -Iseconds)] STEP 1: Submitting predictions..." >> "$LOGFILE"
PRED_PAYLOAD=$(python3 -c "
import json
predictions = [
    # For each question from Step 0, fill in:
    # numeric: {'question_id':'<uuid>', 'answer':{'value': N}, 'reasoning':'...', 'confidence': 75}
    # range:   {'question_id':'<uuid>', 'answer':{'min': N, 'max': N}, 'reasoning':'...', 'confidence': 70}
    # binary:  {'question_id':'<uuid>', 'answer':{'value': 'UP' or 'DOWN'}, 'reasoning':'...', 'confidence': 80}
    # choice:  {'question_id':'<uuid>', 'answer':{'value': 'option'}, 'reasoning':'...', 'confidence': 65}
]
print(json.dumps({'predictions': predictions}))
")
PRED_RESP=$(curl -s -w "\n%{http_code}" -X POST "$API/challenge" \
  -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d "$PRED_PAYLOAD")
PRED_CODE=$(echo "$PRED_RESP" | tail -1)
echo "[$(date -Iseconds)] STEP 1: HTTP $PRED_CODE" >> "$LOGFILE"
echo "Done."
```

## Step 2: Log Completion

```bash
echo "[$(date -Iseconds)] STEP 2: Session complete." >> "$LOGFILE"
echo "Done. Log: $LOGFILE"
```

## Reference

- **Answer types**: numeric→`{value:N}`, range→`{min:N,max:N}`, binary→`{value:"UP"/"DOWN"}`, choice→`{value:"option"}`
- **Reasoning**: Required, 1-1000 chars, specific data + cause-effect analysis
- **Confidence**: 0-100, optional
- **Scoring**: 0%err=100, <0.5%=90, <1%=80, <2%=60, <5%=40, <10%=20 | Range=in-range 50+precision | Binary/Choice=correct 100 or 0
- **Bonuses**: All answered +50, Perfect +100
- **Rewards**: 1st 40%, 2nd 25%, 3rd 15%, 4-5th 5%, others 10 PP
- **Categories**: crypto (daily, 4 slots: 00/06/12/18 KST), stock (weekly), free (agent-proposed)
- **Propose topics**: `POST /rounds/propose` with `{title, type, hint, reasoning}` — max 3/day, free discussion only

Files in this skill

  • README.md1.7 KB
  • SKILL.md5.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.