Back

CatalystBet (Web3)

Horse-racing themed betting dApp (Umamusume-style): a proof of concept for on-chain randomness without oracles, on Sonic testnet. Frontend + smart contracts only.

Overview

Horse-racing themed betting dApp, inspired by Umamusume, that I built with a fellow Web3 dev and auditor. The idea was a proof of concept: generating on-chain random numbers via a relayer, without depending on oracles like Chainlink, aiming to contribute a standard on Ethereum. It runs on Sonic testnet (EVM): the user picks a character, bets test USDC and waits for the phases to end to see if they won. No backend — just frontend and smart contracts.

Key decisions

Randomness without oracles

The project's purpose: to show that on-chain random numbers can be generated with a relayer, without relying on external oracles (Chainlink and similar). We aimed to lay down a reusable standard on Ethereum.

Block counter against manipulation

We used a block counter to prevent validators from knowing the outcome in advance and manipulating the race — key for the randomness to be trustworthy.

No backend: frontend + contracts

The app talks directly to the already-deployed contracts via wagmi + viem (ABIs and addresses on the client). I handled design and frontend; my colleague built and audited the smart contracts.

Sign-in with wallet (SIWE)

Beyond connecting the wallet with RainbowKit, the user signs a message (Sign-In With Ethereum + NextAuth) for a real session, not just a connected wallet.

Challenges & learnings
  • Achieving trustworthy on-chain randomness without external oracles was the core challenge; solving it broadened our Web3 perspective a lot.
  • Syncing the phase-based flow (betting → race → claim) with on-chain state without an intermediary backend.