<?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: Mahavir Ganapati Dash</title>
    <description>The latest articles on DEV Community by Mahavir Ganapati Dash (@mahavir_ganapatidash_657).</description>
    <link>https://dev.to/mahavir_ganapatidash_657</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%2F3451801%2Fd63b85b3-a43a-49b2-ac94-1ed6ec97cd9d.jpg</url>
      <title>DEV Community: Mahavir Ganapati Dash</title>
      <link>https://dev.to/mahavir_ganapatidash_657</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahavir_ganapatidash_657"/>
    <language>en</language>
    <item>
      <title>12th Man: World Cup fandom on Solana, because my best predictions kept dying in the group chat</title>
      <dc:creator>Mahavir Ganapati Dash</dc:creator>
      <pubDate>Mon, 13 Jul 2026 04:28:22 +0000</pubDate>
      <link>https://dev.to/mahavir_ganapatidash_657/12th-man-world-cup-fandom-on-solana-because-my-best-predictions-kept-dying-in-the-group-chat-1loe</link>
      <guid>https://dev.to/mahavir_ganapatidash_657/12th-man-world-cup-fandom-on-solana-because-my-best-predictions-kept-dying-in-the-group-chat-1loe</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Every team has eleven players. The crowd is the twelfth one. Thats the idea behind this project.&lt;/p&gt;

&lt;p&gt;I watch every match of this world cup, and every time same thing happens. Someone in our group chat calls the exact score before kickoff, and next morning nobody believes him because the message is buried under 400 other messages. Fan passion just disappears like that. So i built &lt;strong&gt;12th Man&lt;/strong&gt;, a place where it cant disappear.&lt;/p&gt;

&lt;p&gt;You pick your national team and get a &lt;strong&gt;Fan Card&lt;/strong&gt; (one per wallet, so choose carefully, no switching sides later). You post &lt;strong&gt;chants&lt;/strong&gt; on a wall that nobody can edit or delete. And you &lt;strong&gt;call the score&lt;/strong&gt; before kickoff. Once its locked, its locked. After full time you get 3 points for exact score, 1 point for right result. All points count for your team, there is a leaderboard for the loudest fanbase.&lt;/p&gt;

&lt;p&gt;Best moment of the weekend for me. England beat Norway 2-1 in quarterfinal on saturday. I was watching the match, not my laptop. My oracle script saw the final score on ESPN, posted the result on chain and settled everyones predictions on its own. I had called 2-1. Opened my fan card later and the points were just sitting there. Nobody touched anything. That was when it stopped feeling like a demo to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live here: &lt;strong&gt;&lt;a href="https://twelfth-man.vercel.app" rel="noopener noreferrer"&gt;https://twelfth-man.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You dont need to own any crypto for trying it. The About page has three shared test accounts with devnet SOL already loaded (play money, no real value). Put Phantom in testnet mode, import one of the phrases, and in 2 minutes you are inside. Get a card, post a chant, call a score.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm6uu4j7v0c3o7yizicyr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm6uu4j7v0c3o7yizicyr.png" alt=" " width="800" height="470"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F10t0jza060hidgsghsas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F10t0jza060hidgsghsas.png" alt=" " width="800" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiau43ufwigyy9t127hsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiau43ufwigyy9t127hsw.png" alt=" " width="800" height="472"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8qbhxzzftzly1cgxhe39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8qbhxzzftzly1cgxhe39.png" alt=" " width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/crypto-priest/twelfth-man" rel="noopener noreferrer"&gt;https://github.com/crypto-priest/twelfth-man&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One Anchor program + Next.js frontend, 14 passing tests. Program ID &lt;code&gt;EwCR98M9we9XSNpNA7jnSh9HKXdQWtZPonLdJZ6yM6Kc&lt;/code&gt; on devnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Its a single Anchor program with seven instructions, and there is no backend or database at all, everything is Solana accounts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fan card is a PDA per wallet, so one card per person is enforced by the chain itself, not by my code&lt;/li&gt;
&lt;li&gt;Team stats is a PDA per country code, the leaderboard is read straight from these accounts&lt;/li&gt;
&lt;li&gt;Predictions are locked by the chains own clock, &lt;code&gt;predict&lt;/code&gt; checks kickoff time on chain so even one second late gets rejected&lt;/li&gt;
&lt;li&gt;Settlement is permissionless, anyone can settle anyones prediction once result is in. I didnt want some special bot standing between fans and their points&lt;/li&gt;
&lt;li&gt;The oracle is a small script that polls ESPNs public scoreboard every couple minutes. It only posts a result when two polls in a row agree the match is finished, so one bad API response cant push a wrong score&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be honest about the weak part: the result itself comes from my admin key reading ESPN. Settlement is permissionless but the result is trusted. For real production this needs a proper decentralized oracle. Also the design went through like four themes in one night, some screens could use one more pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Submitting for &lt;strong&gt;Best Use of Solana&lt;/strong&gt;. The chain is not decoration here, its the whole backend. Fees below a cent make chanting affordable, PDAs replace the database, and the kickoff gate + permissionless settlement only work because the chain enforces them.&lt;/p&gt;

&lt;p&gt;England vs Argentina semifinal is already on chain and open for calls. Mine goes in before kickoff. If im right its 3 points forever, if im wrong thats on the record too. Thats the point ⚽&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>100daysofsolana</category>
    </item>
  </channel>
</rss>
