TypeScript 97.6%
SQL 1.4%
JavaScript 0.5%
1import type { GameLifecycle, TransactionType, WinClassId } from "./constants";23export type Volatility = "low" | "medium" | "high" | "extreme";45export interface PublicUser {6 id: string;7 username: string;8 level: number;9 xp: number;10 xpIntoLevel: number;11 xpForNext: number;12 createdAt: string;13 lastLoginAt: string | null;14 isNew?: boolean;15}1617export interface WalletView {18 balance: number;19 lifetimeWagered: number;20 lifetimeWon: number;21 updatedAt: string;22}2324export interface UserSettings {25 soundEnabled: boolean;26 musicVolume: number;27 effectsVolume: number;28 masterVolume: number;29 reduceMotion: boolean;30 animationIntensity: "low" | "medium" | "high";31 sessionReminderMinutes: number;32 breakReminder: boolean;33 leaderboardOptIn: boolean;34}3536export interface GameCard {37 slug: string;38 name: string;39 tagline: string;40 theme: string;41 volatility: Volatility;42 version: string;43 grid: { reels: number; rows: number };44 minBet: number;45 maxBet: number;46 maxMultiplier: number;47 features: string[];48 tags: string[];49 palette: { primary: string; secondary: string; glow: string; bg: string; surface?: string };50 /** Renderer presentation hints (frame, backdrop, particles, ambience). */51 presentation?: { frame: string; backdrop: string; particles: string; ambience: string };52 lifecycle: GameLifecycle;53 kind: "slot" | "crash" | "arcade";54 category: "slots" | "risk" | "originals";55 isNew: boolean;56 isFeatured: boolean;57 isJackpot: boolean;58 popularity: number;59 favorite?: boolean;60 lastPlayedAt?: string | null;61}6263export interface GameInfo extends GameCard {64 rtp: number;65 hitFrequency: number | null;66 description: string;67 rules: string[];68 paytable: { symbol: string; label: string; pays: Record<string, number> }[];69 certification: CertificationSummary | null;70}7172export interface CertificationSummary {73 spins: number;74 configuredRtp: number;75 observedRtp: number;76 deviation: number;77 hitRate: number;78 bonusRate: number;79 maxWinMultiplier: number;80 status: "PASS" | "FAIL";81 certifiedAt: string;82 version: string;83}8485export interface SpinResponse {86 roundId: string;87 game: string;88 version: string;89 bet: number;90 win: number;91 multiplier: number;92 winClass: WinClassId;93 balance: number;94 xp: { gained: number; total: number; level: number; leveledUp: boolean; levelReward: number };95 result: unknown;96 unlocked: { achievements: string[]; missions: string[] };97 replayed?: boolean;98}99100export interface LedgerEntry {101 id: string;102 type: TransactionType;103 amount: number;104 balanceAfter: number;105 reference: string | null;106 createdAt: string;107}108109export interface RoundHistoryEntry {110 roundId: string;111 game: string;112 gameName: string;113 bet: number;114 win: number;115 multiplier: number;116 balanceAfter: number;117 createdAt: string;118}119120export interface DailyRewardStatus {121 available: boolean;122 streakDay: number;123 nextAmount: number;124 nextAvailableAt: string | null;125 schedule: readonly number[];126 claimedToday: boolean;127}128129export interface RescueStatus {130 eligible: boolean;131 amount: number;132 balance: number;133 nextAvailableAt: string | null;134}135136export interface AchievementView {137 key: string;138 name: string;139 description: string;140 rewardCredits: number;141 rewardXp: number;142 icon: string;143 unlockedAt: string | null;144 progress: number;145 target: number;146}147148export interface MissionView {149 key: string;150 name: string;151 description: string;152 period: "daily" | "weekly";153 target: number;154 progress: number;155 rewardCredits: number;156 rewardXp: number;157 completedAt: string | null;158 claimedAt: string | null;159 expiresAt: string;160}161162export interface LeaderboardEntry {163 rank: number;164 username: string;165 level: number;166 value: number;167 game?: string | null;168 isYou?: boolean;169}170171export interface LeaderboardView {172 category: string;173 label: string;174 entries: LeaderboardEntry[];175 you: LeaderboardEntry | null;176 updatedAt: string;177}178179export interface ApiError {180 error: string;181 message: string;182 details?: unknown;183}184