Vault Markets prediction market platform development. Use when working on this project's components, APIs, database models, authentication, or betting logic.
Vault Markets is a Web2-based prediction market platform built with Next.js 16, featuring AMM (Automated Market Maker) trading mechanics, Twitter/X integration, and Privy authentication.
vault-markets/
├── apps/
│ └── markets-web/ # Next.js 16 frontend application
│ ├── src/
│ │ ├── app/ # App Router pages and API routes
│ │ ├── components/ # React components
│ │ └── lib/ # Utilities and services
│ └── package.json
├── packages/
│ ├── vault-ui/ # Shared UI components (shadcn/ui)
│ ├── database/ # Prisma schema and client
│ ├── auth/ # Privy authentication
│ ├── twitter-service/ # Twitter/X RapidAPI client
│ └── skills/ # Agent skills library
└── turbo.json
Always import Prisma from the database package:
import { prisma } from "@vault/database";
import type { User, Market, Bet } from "@vault/database";
Import from the vault-ui package:
import { Button, GlassCard, Skeleton } from "@vault/ui";
Use auth helpers for protected routes:
import { requireUser, requireAdmin } from "@vault/auth";
// In API route
const user = await requireUser();
const admin = await requireAdmin();
Pages are Server Components by default. Add "use client" only when needed:
// src/app/markets/[slug]/page.tsx - Server Component
export default async function MarketPage({ params }) {
const { slug } = await params;
const market = await prisma.market.findUnique({ where: { slug } });
return <MarketDetail market={market} />;
}
API routes live in src/app/api/:
// src/app/api/markets/route.ts
import { NextResponse } from "next/server";
import { prisma } from "@vault/database";
export async function GET() {
const markets = await prisma.market.findMany();
return NextResponse.json(markets);
}
User - Users with balance, role, Twitter infoMarket - Prediction markets with outcomesOutcome - Binary outcomes (A/B) for each marketBet - Individual bets with amount and weightPosition - Aggregated user positions per marketBalanceLedger - Audit trail for balance changesDRAFT → OPEN → CLOSED → RESOLVED → SETTLED
Markets use CPMM (Constant Product Market Maker):
// Payout calculation
const totalPool = poolA + poolB;
const winningPool = outcome === "A" ? poolA : poolB;
const userShare = userBet / winningPool;
const payout = userShare * totalPool * (1 - feeBps / 10000);
Required in .env:
DATABASE_URL=postgresql://...
PRIVY_APP_ID=...
PRIVY_APP_SECRET=...
RAPID_API_KEY=...
APP_URL=http://localhost:3000
# Development
pnpm dev # Start all apps
pnpm --filter @vault/markets-web dev
# Database
pnpm --filter @vault/database db:generate # Generate Prisma client
pnpm --filter @vault/database db:push # Push schema to DB
pnpm --filter @vault/database db:studio # Open Prisma Studio
# Build
pnpm build # Build all packages
pnpm typecheck # Type check all packages
NextResponse.json()GlassCard component for card styling