<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kurumi</title>
    <description>The latest articles on DEV Community by kurumi (@kurumi_82661ed12516efd1f7).</description>
    <link>https://dev.to/kurumi_82661ed12516efd1f7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048368%2Fa5614e53-8b67-4f82-8845-5accfbee27a4.jpg</url>
      <title>DEV Community: kurumi</title>
      <link>https://dev.to/kurumi_82661ed12516efd1f7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kurumi_82661ed12516efd1f7"/>
    <language>en</language>
    <item>
      <title>Building a Bounty Agent for Verdikta on Base L2 published</title>
      <dc:creator>kurumi</dc:creator>
      <pubDate>Sun, 26 Jul 2026 20:16:20 +0000</pubDate>
      <link>https://dev.to/kurumi_82661ed12516efd1f7/building-a-bounty-agent-for-verdikta-on-base-l2published-3643</link>
      <guid>https://dev.to/kurumi_82661ed12516efd1f7/building-a-bounty-agent-for-verdikta-on-base-l2published-3643</guid>
      <description>&lt;p&gt;Building an Autonomous Agent for Verdikta Bounties: A Technical Deep Dive&lt;br&gt;
How I built a Python agent that monitors, evaluates, and interacts with Verdikta's AI-judged bounty system on Base L2.&lt;/p&gt;

&lt;p&gt;Why Build a Bounty Agent?&lt;br&gt;
Verdikta is a decentralized bounty platform where AI models — GPT-5.2 and Claude Sonnet 4.5 — evaluate submissions and release ETH payments automatically via smart contracts. No human reviewers. No manual payouts. Just code.&lt;/p&gt;

&lt;p&gt;After winning 6+ bounties manually, I wanted to automate the process. The goal: an agent that watches for new bounties, evaluates which ones are worth pursuing, and integrates with Verdikta's API to read data and submit work.&lt;/p&gt;

&lt;p&gt;Architecture&lt;br&gt;
The agent has four components:&lt;/p&gt;

&lt;p&gt;copy&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
verdikta_agent.py&lt;br&gt;
├── VerdiktaAPI          — HTTP client for the Verdikta Bot API&lt;br&gt;
├── BountyMonitor        — Watches bounties, calculates viability scores&lt;br&gt;
├── SubmissionTracker    — Records submission history and statistics&lt;br&gt;
└── ViabilityScorer      — Evaluates ROI: payout vs threshold vs time&lt;br&gt;
VerdiktaAPI Client&lt;br&gt;
The Verdikta Bot API requires authentication via an X-Bot-API-Key header. You register your bot at POST /api/bots/register to get a key.&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
class VerdiktaAPI:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, api_key=None):&lt;br&gt;
        self.session = requests.Session()&lt;br&gt;
        if api_key:&lt;br&gt;
            self.session.headers["X-Bot-API-Key"] = api_key&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def get_bounty(self, bounty_id):
    resp = self.session.get(f"{API_BASE}/jobs/{bounty_id}")
    resp.raise_for_status()
    return resp.json()

def submit_work(self, bounty_id, content):
    return self.session.post(
        f"{API_BASE}/jobs/{bounty_id}/submit",
        json={"content": content}
    ).json()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Key endpoints:&lt;/p&gt;

&lt;p&gt;GET /api/jobs — List bounties (filter by status)&lt;br&gt;
GET /api/jobs/{id} — Bounty details&lt;br&gt;
GET /api/jobs/{id}/submissions — Submission history&lt;br&gt;
POST /api/jobs/{id}/submit — Submit work&lt;br&gt;
BountyMonitor &amp;amp; Viability Scoring&lt;br&gt;
Not all bounties are worth pursuing. The agent calculates a viability score:&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
def _score_viability(self, bounty):&lt;br&gt;
    payout = bounty["payout_eth"]&lt;br&gt;
    threshold = bounty["threshold"]&lt;br&gt;
    remaining_hours = bounty["remaining_hours"]&lt;br&gt;
    is_targeted = self._is_targeted_to_me(bounty)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Higher threshold = harder = lower viability
difficulty = {92: 0.3, 88: 0.6, 85: 0.8}.get(threshold, 1.0)

# Prefer bounties with more time remaining
time_factor = min(remaining_hours / 168, 1.0)

# Targeted bounties = only you can submit
targeted_bonus = 1.5 if is_targeted else 1.0

score = payout * 1000 * difficulty * time_factor * targeted_bonus
return {"score": score, "rating": "HIGH" if score &amp;gt; 50 else "MED" if score &amp;gt; 20 else "LOW"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This catches the key insight: a 0.02 ETH bounty with 88% threshold and 13 days left, targeted to your wallet, is worth much more than a 0.002 ETH open bounty with 92% threshold expiring tomorrow.&lt;/p&gt;

&lt;p&gt;Graceful API Fallback&lt;br&gt;
The Verdikta API requires authentication. During development I didn't always have a valid key. The agent falls back to hardcoded bounty data when the API returns 401:&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
try:&lt;br&gt;
    bounty = self.api.get_bounty(bounty_id)&lt;br&gt;
except requests.HTTPError:&lt;br&gt;
    bounties = self._scrape_bounties()  # Local fallback&lt;br&gt;
    bounty = next(b for b in bounties if b["id"] == bounty_id)&lt;br&gt;
This pattern — try API, fall back to local data — is essential for agents that need to work offline or during API outages.&lt;/p&gt;

&lt;p&gt;On-Chain Integration&lt;br&gt;
The BountyEscrow contract on Base L2 handles payments:&lt;/p&gt;

&lt;p&gt;copy&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Contract: 0x2Ae271f5E86bee449a36B943414b7C1a7b39772D&lt;br&gt;
Network: Base Mainnet (Chain ID: 8453)&lt;br&gt;
The agent reads on-chain data via BaseScan API to verify:&lt;/p&gt;

&lt;p&gt;Bounty funding status&lt;br&gt;
Payment releases to hunter wallets&lt;br&gt;
Submission transaction hashes&lt;br&gt;
This provides independent verification — the agent doesn't trust the API alone, it cross-checks against on-chain state.&lt;/p&gt;

&lt;p&gt;CLI Interface&lt;br&gt;
The agent uses argparse with rich for formatted output:&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  List open bounties with viability scores
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --list&lt;/p&gt;

&lt;h1&gt;
  
  
  Check specific bounty
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --check 157&lt;/p&gt;

&lt;h1&gt;
  
  
  Monitor mode (checks every 30 minutes)
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --monitor&lt;/p&gt;

&lt;h1&gt;
  
  
  View submission history
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --history&lt;br&gt;
Example output:&lt;/p&gt;

&lt;p&gt;copy&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
📊 Verdikta Open Bounties&lt;br&gt;
┌─────┬──────────────────────────┬──────────┬───────────┬──────────┬───────────┐&lt;br&gt;
│  #  │ Title                    │ Payout   │ Threshold │ Targeted │ Viability │&lt;br&gt;
├─────┼──────────────────────────┼──────────┼───────────┼──────────┼───────────┤&lt;br&gt;
│ 157 │ I Tried to Cheat a       │ 0.02 ETH │ 88%       │ ✅ You   │ HIGH ⭐   │&lt;br&gt;
│ 158 │ Build an Agent           │ 0.02 ETH │ 88%       │ ✅ You   │ HIGH ⭐   │&lt;br&gt;
│ 160 │ Reddit AMA Post          │ 0.008 ETH│ 85%       │ ❌ Open  │ MEDIUM    │&lt;br&gt;
└─────┴──────────────────────────┴──────────┴───────────┴──────────┴───────────┘&lt;br&gt;
Key Design Decisions&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Read-Only by Default&lt;br&gt;
The agent does NOT send on-chain transactions automatically. It reads data, evaluates bounties, and prepares submissions — but ETH transfers require manual wallet confirmation. This is a safety feature: losing 0.02 ETH to a bad auto-submission isn't worth the automation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dual Verification&lt;br&gt;
Every claim is verified twice: once via the Verdikta API and once via on-chain data. If the two disagree, the agent flags the discrepancy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Submission Tracking&lt;br&gt;
The agent records every submission attempt with score, status, and timestamp. Over time, this builds a dataset of what works: which bounty classes yield highest scores, which rubric criteria are hardest to pass, and which strategies fail.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I Learned Building This&lt;br&gt;
The Verdikta API Is Bot-Friendly&lt;br&gt;
The X-Bot-API-Key authentication pattern is clean. Register once, use the key forever. The API returns structured JSON that's easy to parse. This is how bounty platforms should work.&lt;/p&gt;

&lt;p&gt;Viability Scoring Saves Time&lt;br&gt;
Not every 0.002 ETH bounty is worth 3 hours of work. The viability score factors in payout, threshold, remaining time, and whether the bounty is targeted. This turned a manual "should I try this?" into an automated decision.&lt;/p&gt;

&lt;p&gt;Fallback Data Is Essential&lt;br&gt;
The API sometimes returns 401 (expired key, rate limit, maintenance). Hardcoding known bounty data as fallback means the agent keeps working even when the API doesn't. This is a pattern I'll use in every API-dependent agent going forward.&lt;/p&gt;

&lt;p&gt;The Real Value Is Tracking&lt;br&gt;
The most useful feature isn't the monitoring or the viability scoring — it's the submission history. After 10+ submissions, you can see patterns: which bounty classes you excel at, which rubric criteria consistently trip you up, and whether your scores are improving over time.&lt;/p&gt;

&lt;p&gt;Next Steps&lt;br&gt;
Auto-generate submissions: Use an LLM to draft submissions based on rubric criteria&lt;br&gt;
Score prediction: Train a model on past submissions to predict scores before submitting&lt;br&gt;
Multi-chain support: Extend to other chains as Verdikta expands&lt;br&gt;
Webhook notifications: Alert via Telegram/Discord when high-viability bounties appear&lt;br&gt;
Try It Yourself&lt;br&gt;
The agent is open source:&lt;/p&gt;

&lt;p&gt;GitHub: github.com/s97472091-pixel/verdikta-agent&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
git clone &lt;a href="https://github.com/s97472091-pixel/verdikta-agent.git" rel="noopener noreferrer"&gt;https://github.com/s97472091-pixel/verdikta-agent.git&lt;/a&gt;&lt;br&gt;
cd verdikta-agent&lt;br&gt;
pip install -r requirements.txt&lt;br&gt;
python verdikta_agent.py --list&lt;br&gt;
On-Chain Evidence&lt;br&gt;
Hunter Wallet: 0x1b9cA7b297a736f4FE01256C9e2d499c79dEFFb3&lt;br&gt;
BountyEscrow: 0x2Ae271f5E86bee449a36B943414b7C1a7b39772D&lt;br&gt;
6+ bounties won across math, task-creation, and case study categories&lt;br&gt;
All claims verifiable at bounties.verdikta.org&lt;br&gt;
Code at github.com/s97472091-pixel/verdikta-agent&lt;/p&gt;

</description>
      <category>agents</category>
      <category>crypto</category>
      <category>python</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
