Prediction Market·EVM (Optimism, Arbitrum, Base)
Overtime Markets
Onchain sports prediction market originally built on top of Thales, now a standalone protocol. Deployed on Optimism (primary), Arbitrum and Base — uses an AMM-style liquidity model with no KYC and account-abstraction UX.
- 01onchain sports betting frontends
- 02no-KYC sportsbook apps
- 03embedded sports odds widgets
- 04parlay / single-bet UIs
- 05live in-play betting flows
- pnpm add @overtime-markets/sdk ethers viem
| Variable | Scope | Description |
|---|---|---|
| NEXT_PUBLIC_OVERTIME_API_BASE | Client | Base URL for the Overtime data API — typically https://api.overtimemarkets.xyz. Used to discover markets and quote odds. |
| NEXT_PUBLIC_OVERTIME_NETWORK_ID | Client | Target network id: 10 (Optimism), 42161 (Arbitrum) or 8453 (Base). Drives contract addresses and liquidity pools. |
| NEXT_PUBLIC_OVERTIME_REFERRER | Client | Referrer address that receives a share of the spread on each ticket placed via your frontend. |
Use Overtime for onchain sports betting on Optimism / Arbitrum / Base. Discover markets via `GET https://api.overtimemarkets.xyz/overtime-v2/networks/<networkId>/markets` (filter by `sport`, `status=open`, `ungroup=true`) and quote a parlay/single via `POST /networks/<networkId>/quote` with `{ tradeData: [...], buyInAmount, collateral }`. Submit by calling `tradeData`-based `trade` on the SportsAMMV2 contract (or the LiveTradingProcessor for in-play markets) — collateral is USDC by default but multi-collateral routing through `MultiCollateralOnOffRamp` lets users pay in ETH/THALES/OVER. Bind the referrer address for revenue share. Read open positions via subgraph (`overtime-protocol-v2` on each chain) and settle via `exerciseTickets` once games resolve.
- ⚑AMM-style liquidity, not an orderbook — odds drift with ticket size against the pool. Always quote via the API immediately before submitting; stale quotes fail with `InvalidOdds`.
- ⚑Each chain (OP / ARB / Base) has its own SportsAMMV2 deployment, USDC contract and subgraph. Don't share addresses across chains — pull them from the docs' addresses page or `@overtime-markets/sdk` registry.
- ⚑Resolution relies on Chainlink + a centralized data provider; disputed games can pause settlement. Surface `Ticket.status` (Open / Resolved / Cancelled / Paused) so users understand why payouts are delayed.
- ⚑No KYC, but the protocol still geofences blocked jurisdictions at the frontend layer. If you build a public UI mirror their geo-blocklist (US, UK, France, etc.) to stay aligned with their licensing posture.
- ⚑Live (in-play) markets use a separate `LiveTradingProcessor` flow with a request-then-confirm pattern — direct calls to SportsAMMV2 won't work for in-play bets.
- ⚑Account-abstraction UX (smart-wallet bundlers via Biconomy) is the recommended path; using a raw EOA + ERC-20 approvals works but skips gasless / one-tap signing the docs assume.