World Cup PvP

World Cup PvP is an onchain platform that turns the World Cup into a live market on Ethereum: each nation is an ERC-20 token with its own market, backed by the core $WCUP token, and the liquidity of eliminated teams moves to the winner as the tournament advances. The main web app articulates several coordinated sections: a homepage with the live match, the $WCUP market panel, per-nation charts, and a real-time trade feed; a Matches page with all official fixtures, kickoff times, and groups; a Nations page where each team exposes its ERC-20 token, price, and a buy entry point; a Trading Floor with live transactions, whale tracking, and per-nation filters; a Tournament page with the group stage, standings enriched with onchain data, and brackets; a leaderboard; and a "Pre-Match Briefing" onboarding that walks the user step by step (choose a nation, buy its token, join the community) with a loyalty-points and giveaways system. Wallet connection is handled with ConnectKit and SIWE authentication (Sign-In With Ethereum), and all dynamic content —prices, trades, live chat— updates in real time. The art direction is that of a sports trading terminal: dark backgrounds, electric-green accents, condensed typography, and micro-charts, reinforced with Framer Motion animations.



Technologies used:

Front End:

The frontend is a high-performance SPA built with React 19 and Vite, deployed to the edge on Cloudflare Workers. Routing and data management are handled with the TanStack ecosystem (Router, Query, and Start) for typed navigation and server-data caching with revalidation. The onchain layer relies on wagmi and viem for wallet connection, contract reads, and signing, with ConnectKit for the connection flow and SIWE for passwordless authentication. The real-time interface is fed by Ably (prices, trades, and live chat), and the UI is composed with Tailwind CSS 4, accessible Radix UI components, and Framer Motion animations. End-to-end typing with TypeScript and validation with Zod guarantee safe data contracts between client and API. The project lives in a Turborepo monorepo alongside a separate documentation site.

  • React

  • TypeScript

  • Vite

  • Tailwind

Back End:

The backend is a NestJS 11 API organized into bounded contexts with CQRS (auth, market, matches, nations, portfolio, users, chat, loyalty, and giveaways), following a clean, decoupled domain architecture. Persistence is handled with Prisma 7 over PostgreSQL, with Redis for caching and ephemeral state, and Ably for real-time event broadcasting (prices, trades, and chat). Authentication is onchain via server-verified SIWE and JWT sessions through Passport. Scheduled jobs (NestJS Schedule) sync matches and results from remote sources, and observability is covered with Sentry. As a fullstack developer I also worked on the admin panel, a separate application with its own web app (React + Vite + TanStack, on Cloudflare) and its own NestJS + Prisma API, used to operate the platform: wallet management (KOLs and market makers), nations, matches, and market parameters. The whole system is deployed in a decoupled way —the frontend on Cloudflare and the API on Fly.io— within a Turborepo monorepo with pnpm.

  • PostgreSql

  • NestJS