
Robinhood Predictor
AI-agent parimutuel stock prediction market with Chainlink feeds and World ID anchoring
Demo
About
Robinhood Predictor is a parimutuel stock prediction market live on Robinhood Chain mainnet (chain ID 4663), where users bet whether a stock's closing price will land above or below its opening price. The core contract went live on July 10, two to three days after Robinhood Chain itself launched, and it's been running continuously since — 91 commits and 88 real transactions across market creation, locking, and settlement. For ETHOnline we extended this live infrastructure with an AI agent that can place bets on its own. The agent reads live price data from Chainlink and trend signals from a Graph subgraph we built for this market, then decides whether to bet or sit out. If the two signals disagree, it holds off instead of forcing a trade. An autonomous agent placing bets raises an obvious question: who's actually behind it? Every agent bet has to pass through World AgentKit first. The relayer checks that the wallet is backed by a real, unique human before it will sign the transaction. No valid attestation, no bet. Settlement runs through Chainlink: the contract reads the price recorded when a market locked, compares it to the live closing price, and decides the winner on-chain. We also wrote an independent Python script that rebuilds the settlement logic from scratch, without touching our Solidity code, reruns it against every real transaction on mainnet, and seals the result with a SHA-256 hash. Before StockPredictionMarketV2.sol ever entered git history, we ran a self-audit pass modeled on our own audit-orchestrator methodology — recon, then fix. It caught two real issues pre-commit: a receive() function that would have permanently trapped any ETH sent to it by accident, and a missing zero-address check on the relayer address in the constructor. The contract shipped already fixed. Full notes: https://github.com/pplmaverick/robinhood-stock-prediction-market/blob/824e0d67e0fe2e8ba0c96760c44905ee1ee1b3d8/verification/self-audit/AUDIT_NOTES.md Full AgentKit feedback document: https://github.com/pplmaverick/robinhood-stock-prediction-market/blob/824e0d67e0fe2e8ba0c96760c44905ee1ee1b3d8/docs/feedback-agentkit.md
How it's made
The contract is Solidity, deployed on Robinhood Chain, an Arbitrum-based L2 built for stock trading, first on July 10 and still live today. Settlement is parimutuel: winners split the losing side's pool, and Chainlink price feeds decide the outcome by comparing the price at lock time to the price at close. For ETHOnline we added a second contract, StockPredictionMarketV2, with a placeAgentBet function gated by a relayer-signed attestation — the caller supplies a signature that must recover to the relayer's address before the bet is accepted. Behind that relayer sits a small Node.js decision engine that pulls live price data from Chainlink and reads trend data from a Graph subgraph we built specifically for this market, indexing every bet and settlement event so the agent has something to reason against beyond raw price. If the price signal and the trend signal agree, the agent bets. If they disagree, it skips the market on purpose. The part that took the most work is the World AgentKit layer sitting in front of the relayer. Before the relayer signs an agent's bet, it checks that the agent's wallet is verified as backed by a real, unique human through AgentKit. If that check fails, the transaction never gets signed. Testing the backed path fully needs a physical Orb, which we didn't have during the hackathon, so that branch is currently verified through code review and unit tests rather than a live proof — we're writing this up honestly instead of claiming we tested something we didn't. Because the original contract already had a real transaction history before this hackathon started, we also wrote a standalone Python script that rebuilds the settlement math independently of our Solidity code, checks it against every transaction pulled from mainnet via eth_getLogs, and seals the result with a SHA-256 hash so the numbers can't be quietly edited afterward.