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 };50 lifecycle: GameLifecycle;51 isNew: boolean;52 isFeatured: boolean;53 isJackpot: boolean;54 popularity: number;55 favorite?: boolean;56 lastPlayedAt?: string | null;57}5859export interface GameInfo extends GameCard {60 rtp: number;61 hitFrequency: number | null;62 description: string;63 rules: string[];64 paytable: { symbol: string; label: string; pays: Record<string, number> }[];65 certification: CertificationSummary | null;66}6768export interface CertificationSummary {69 spins: number;70 configuredRtp: number;71 observedRtp: number;72 deviation: number;73 hitRate: number;74 bonusRate: number;75 maxWinMultiplier: number;76 status: "PASS" | "FAIL";77 certifiedAt: string;78 version: string;79}8081export interface SpinResponse {82 roundId: string;83 game: string;84 version: string;85 bet: number;86 win: number;87 multiplier: number;88 winClass: WinClassId;89 balance: number;90 xp: { gained: number; total: number; level: number; leveledUp: boolean; levelReward: number };91 result: unknown;92 unlocked: { achievements: string[]; missions: string[] };93 replayed?: boolean;94}9596export interface LedgerEntry {97 id: string;98 type: TransactionType;99 amount: number;100 balanceAfter: number;101 reference: string | null;102 createdAt: string;103}104105export interface RoundHistoryEntry {106 roundId: string;107 game: string;108 gameName: string;109 bet: number;110 win: number;111 multiplier: number;112 balanceAfter: number;113 createdAt: string;114}115116export interface DailyRewardStatus {117 available: boolean;118 streakDay: number;119 nextAmount: number;120 nextAvailableAt: string | null;121 schedule: readonly number[];122 claimedToday: boolean;123}124125export interface RescueStatus {126 eligible: boolean;127 amount: number;128 balance: number;129 nextAvailableAt: string | null;130}131132export interface AchievementView {133 key: string;134 name: string;135 description: string;136 rewardCredits: number;137 rewardXp: number;138 icon: string;139 unlockedAt: string | null;140 progress: number;141 target: number;142}143144export interface MissionView {145 key: string;146 name: string;147 description: string;148 period: "daily" | "weekly";149 target: number;150 progress: number;151 rewardCredits: number;152 rewardXp: number;153 completedAt: string | null;154 claimedAt: string | null;155 expiresAt: string;156}157158export interface LeaderboardEntry {159 rank: number;160 username: string;161 level: number;162 value: number;163 game?: string | null;164 isYou?: boolean;165}166167export interface LeaderboardView {168 category: string;169 label: string;170 entries: LeaderboardEntry[];171 you: LeaderboardEntry | null;172 updatedAt: string;173}174175export interface ApiError {176 error: string;177 message: string;178 details?: unknown;179}180