Skip to main content

Overview

There are two ways to create a bet on Mouth: via X (Twitter) or directly on the web app.

Via X (Twitter)

Flow

Step by Step

  1. User tweets or replies to a tweet tagging @MouthBet — e.g., “@MouthBet I’ll put $500 that ETH hits $10k by EOY” or replies to someone else’s prediction with “@MouthBet I’ll put $500 against this”
  2. Mouth bot detects the tag and:
    • Creates a Draft bet in the backend database
    • Replies with the bet URL: mouth.bet/bet/{id}
    • The URL is pre-filled with the tweet URL and opponent’s X handle (if any)
  3. User clicks the link and sees the bet creation form with:
    • Tweet URL already linked
    • Opponent’s X handle pre-filled (if any)
    • Fields to edit/confirm: title, description, amount, expiration, odds
  4. User confirms the deposit — the backend handles everything on-chain: approves USDC to the factory (if needed), deploys the bet contract via the Factory, and deposits the Challenger’s USDC — all as a gasless server-side transaction via Privy
  5. Bet goes from Draft to Pending on-chain
  6. The same URL (mouth.bet/bet/{id}) now shows the finalized bet details to anyone who visits — including the opponent, who can accept directly from this page
If the opponent hasn’t signed up on Mouth yet, the backend automatically pre-generates an embedded wallet for them via Privy’s server SDK. When they eventually log in with X, they’ll get the same wallet and can interact with the bet immediately. See Identity & Wallets for details.

Via Web App

Flow

Step by Step

  1. User navigates to mouth.bet
  2. Logs in with X (via Privy) — this creates/accesses their embedded wallet
  3. Clicks “Create Bet” and fills in:
    • Title: Short, clear prediction statement
    • Description: Detailed terms, resolution criteria, data sources
    • Amount: Bet size in USDC
    • Expiration date: When the prediction should be evaluated
    • Opponent (optional): X handle of the person being challenged
    • Category: Crypto, Sports, Politics, Tech, Other
  4. Confirms the deposit — the backend deploys the smart contract on-chain and deposits the Challenger’s USDC via a gasless server-side transaction. Bet is now Pending
  5. Bet page is live at mouth.bet/bet/{id} — can share on X, send in DMs, etc.
  6. If an opponent was specified, the Mouth bot tags them on X with the same bet link

Bet Parameters

Required

ParameterTypeDescription
titlestringShort prediction statement (max 140 chars)
amountuint256Bet amount in USDC (min total pot: $10 USDC)
expirationDateuint256Unix timestamp — when the prediction is evaluated

Optional

ParameterTypeDescriptionDefault
descriptionstringDetailed terms and resolution criteriaempty
opponentstringX handle of the challenged usernone (Open PvP Bet)
oddsuint8Challenger’s perceived probability for their side (10-90). Determines the deposit ratio between challenger and opponent.50
categorystringBet category”Other”
acceptanceDeadlineuint256Deadline for opponent to accept. Mandatory for all bets.72 hours
disputeableboolIf true, 48h dispute window after resolution. If false, immediately finalized.false
tweetUrlstringURL of the original tweet (context)none
The acceptance deadline is mandatory for all bet types (default: 72 hours). It ensures that every bet has a clear cutoff — if no one accepts by the deadline, the Challenger can reclaim their funds. For Open PvP Bets, it also prevents last-moment sniping when the outcome may already be predictable.

PvP vs Open PvP Bets

When creating a bet, the Challenger chooses one of two modes:

PvP Bet (1v1)

  • A specific opponent is named (X handle)
  • Only that person can accept
  • The opponent must deposit the full matching amount
  • Acceptance deadline applies (default 72 hours) — opponent must accept before it passes

Open PvP Bet (Partially Fillable)

  • No specific opponent — anyone can take the other side
  • Multiple opponents can each deposit a portion of the total amount
  • Acceptance deadline applies (default 72 hours)
  • The bet activates when fully filled OR when the acceptance deadline passes (whichever comes first)
  • If only partially filled at the deadline, the bet activates with the filled amount and the unfilled portion is returned to the Challenger
See Accept a Bet for detailed acceptance flows.

Single URL Lifecycle

Every bet has a single, permanent URL (mouth.bet/bet/{id}) that adapts its content based on who’s viewing and the current state:
ViewerBet StateWhat They See
ChallengerDraftForm to finalize bet details and deposit
ChallengerPendingBet details, withdraw option
OpponentPendingBet details, “Accept Bet” button
AnyoneActiveLive bet, countdown to expiration
AnyoneResolvedResult, winner, payout details
For bets created via X, the bot posts one reply with this URL. The Challenger uses it to finalize, and the opponent uses the same link to accept — no second tweet or link needed.

After Creation

Once the bet is created (on-chain):
  • The bet appears on the Challenger’s profile on mouth.bet
  • If directed at someone, the opponent receives a notification (X reply + web app notification)
  • Open PvP Bets are visible on the Mouth explore page
  • Funds are in the smart contract but withdrawable by the Challenger until accepted (directed) or until any opponent deposits (open)