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 isNew: boolean;54 isFeatured: boolean;55 isJackpot: boolean;56 popularity: number;57 favorite?: boolean;58 lastPlayedAt?: string | null;59}6061export interface GameInfo extends GameCard {62 rtp: number;63 hitFrequency: number | null;64 description: string;65 rules: string[];66 paytable: { symbol: string; label: string; pays: Record<string, number> }[];67 certification: CertificationSummary | null;68}6970export interface CertificationSummary {71 spins: number;72 configuredRtp: number;73 observedRtp: number;74 deviation: number;75 hitRate: number;76 bonusRate: number;77 maxWinMultiplier: number;78 status: "PASS" | "FAIL";79 certifiedAt: string;80 version: string;81}8283export interface SpinResponse {84 roundId: string;85 game: string;86 version: string;87 bet: number;88 win: number;89 multiplier: number;90 winClass: WinClassId;91 balance: number;92 xp: { gained: number; total: number; level: number; leveledUp: boolean; levelReward: number };93 result: unknown;94 unlocked: { achievements: string[]; missions: string[] };95 replayed?: boolean;96}9798export interface LedgerEntry {99 id: string;100 type: TransactionType;101 amount: number;102 balanceAfter: number;103 reference: string | null;104 createdAt: string;105}106107export interface RoundHistoryEntry {108 roundId: string;109 game: string;110 gameName: string;111 bet: number;112 win: number;113 multiplier: number;114 balanceAfter: number;115 createdAt: string;116}117118export interface DailyRewardStatus {119 available: boolean;120 streakDay: number;121 nextAmount: number;122 nextAvailableAt: string | null;123 schedule: readonly number[];124 claimedToday: boolean;125}126127export interface RescueStatus {128 eligible: boolean;129 amount: number;130 balance: number;131 nextAvailableAt: string | null;132}133134export interface AchievementView {135 key: string;136 name: string;137 description: string;138 rewardCredits: number;139 rewardXp: number;140 icon: string;141 unlockedAt: string | null;142 progress: number;143 target: number;144}145146export interface MissionView {147 key: string;148 name: string;149 description: string;150 period: "daily" | "weekly";151 target: number;152 progress: number;153 rewardCredits: number;154 rewardXp: number;155 completedAt: string | null;156 claimedAt: string | null;157 expiresAt: string;158}159160export interface LeaderboardEntry {161 rank: number;162 username: string;163 level: number;164 value: number;165 game?: string | null;166 isYou?: boolean;167}168169export interface LeaderboardView {170 category: string;171 label: string;172 entries: LeaderboardEntry[];173 you: LeaderboardEntry | null;174 updatedAt: string;175}176177export interface ApiError {178 error: string;179 message: string;180 details?: unknown;181}182