@provable-games/budokan-sdk 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -24
- package/dist/{client-BtC3ngNe.d.cts → client-eg3Ink5N.d.cts} +31 -20
- package/dist/{client-BtC3ngNe.d.ts → client-eg3Ink5N.d.ts} +31 -20
- package/dist/index.cjs +372 -108
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +373 -109
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +397 -108
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +3 -1
- package/dist/react.d.ts +3 -1
- package/dist/react.js +398 -109
- package/dist/react.js.map +1 -1
- package/package.json +6 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/index.ts","../src/utils/retry.ts","../src/api/base.ts","../src/utils/mappers.ts","../src/api/tournaments.ts","../src/utils/address.ts","../src/api/players.ts","../src/api/games.ts","../src/api/activity.ts","../src/ws/manager.ts","../src/chains/constants.ts","../src/datasource/health.ts","../src/datasource/resolver.ts","../src/rpc/provider.ts","../src/rpc/viewer.ts","../src/rpc/abis/budokanViewer.json","../src/client.ts"],"names":["fetchOpts","num"],"mappings":"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","file":"index.cjs","sourcesContent":["export class BudokanError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BudokanError\";\n }\n}\n\nexport class BudokanApiError extends BudokanError {\n readonly status: number;\n readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string = \"\") {\n super(message);\n this.name = \"BudokanApiError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport class BudokanTimeoutError extends BudokanError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"BudokanTimeoutError\";\n }\n}\n\nexport class BudokanConnectionError extends BudokanError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"BudokanConnectionError\";\n }\n}\n\nexport class TournamentNotFoundError extends BudokanError {\n readonly tournamentId: string;\n\n constructor(tournamentId: string) {\n super(`Tournament not found: ${tournamentId}`);\n this.name = \"TournamentNotFoundError\";\n this.tournamentId = tournamentId;\n }\n}\n\nexport class RpcError extends BudokanError {\n readonly contractAddress?: string;\n\n constructor(message: string, contractAddress?: string) {\n super(message);\n this.name = \"RpcError\";\n this.contractAddress = contractAddress;\n }\n}\n\nexport class DataSourceError extends BudokanError {\n readonly primaryError: Error;\n readonly fallbackError: Error;\n\n constructor(primaryError: Error, fallbackError: Error) {\n super(`Both data sources failed. Primary: ${primaryError.message}. Fallback: ${fallbackError.message}`);\n this.name = \"DataSourceError\";\n this.primaryError = primaryError;\n this.fallbackError = fallbackError;\n }\n}\n\nexport function isNonRetryableError(error: unknown): boolean {\n if (error instanceof TournamentNotFoundError) return true;\n if (error instanceof BudokanApiError && error.status >= 400 && error.status < 500 && error.status !== 429) {\n return true;\n }\n return false;\n}\n","import { isNonRetryableError, BudokanTimeoutError } from \"../errors/index.js\";\n\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n): number {\n let delay = baseDelay * Math.pow(2, attempt);\n if (delay > maxDelay) delay = maxDelay;\n const minDelay = delay / 2;\n const jitter = Math.random() * (delay - minDelay);\n return minDelay + jitter;\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n attempts: number = 3,\n delay: number = 1000,\n): Promise<T> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (isNonRetryableError(error)) {\n throw error;\n }\n\n if (attempt === attempts - 1) break;\n\n const backoff = calculateBackoff(attempt, delay, delay * 8);\n await sleep(backoff);\n }\n }\n\n throw lastError ?? new BudokanTimeoutError(\"Unknown error after retries\");\n}\n","import { BudokanApiError, BudokanTimeoutError, BudokanConnectionError } from \"../errors/index.js\";\nimport { withRetry } from \"../utils/retry.js\";\n\nexport interface ApiFetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n signal?: AbortSignal;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n}\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst DEFAULT_RETRY_ATTEMPTS = 3;\nconst DEFAULT_RETRY_DELAY = 1000;\n\n/**\n * Fetch JSON from an API endpoint with retry logic, timeout, and error handling.\n */\nexport async function apiFetch<T>(url: string, options: ApiFetchOptions = {}): Promise<T> {\n const {\n method = \"GET\",\n headers = {},\n body,\n signal,\n timeout = DEFAULT_TIMEOUT,\n retryAttempts = DEFAULT_RETRY_ATTEMPTS,\n retryDelay = DEFAULT_RETRY_DELAY,\n } = options;\n\n return withRetry(\n async () => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // Link external signal\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timeoutId);\n throw new BudokanTimeoutError(\"Request was aborted\");\n }\n signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throw new BudokanApiError(\n (errorBody as Record<string, string>).error ?? `API error: ${response.status}`,\n response.status,\n response.statusText,\n );\n }\n\n return (await response.json()) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof BudokanApiError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n if (signal?.aborted) throw new BudokanTimeoutError(\"Request was aborted\");\n throw new BudokanTimeoutError();\n }\n throw new BudokanConnectionError(\n error instanceof Error ? error.message : \"Connection failed\",\n );\n }\n },\n retryAttempts,\n retryDelay,\n );\n}\n\n/**\n * Extract pagination from API response.\n * The API wraps pagination in a `pagination` object, but the SDK\n * PaginatedResult type uses flat fields (total, limit, offset).\n */\nexport function extractPagination(result: Record<string, unknown>, defaults?: { limit?: number; offset?: number }): {\n total: number | undefined;\n limit: number;\n offset: number;\n} {\n const pagination = result.pagination as { total?: number; limit?: number; offset?: number } | undefined;\n return {\n total: pagination?.total ?? (result.total as number | undefined),\n limit: pagination?.limit ?? (result.limit as number | undefined) ?? defaults?.limit ?? 50,\n offset: pagination?.offset ?? (result.offset as number | undefined) ?? defaults?.offset ?? 0,\n };\n}\n\n/**\n * Build a query string from a record of key-value pairs.\n * Undefined and null values are omitted.\n */\nexport function buildQueryString(params: Record<string, string | number | boolean | undefined | null>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n","/**\n * Convert a snake_case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\n/**\n * Convert a camelCase string to snake_case.\n */\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Deeply convert all keys in an object from snake_case to camelCase.\n */\nexport function snakeToCamel<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => snakeToCamel(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toCamelCase(key)] = snakeToCamel(value);\n }\n return result as T;\n }\n return obj as T;\n}\n\n/**\n * Deeply convert all keys in an object from camelCase to snake_case.\n */\nexport function camelToSnake<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToSnake(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toSnakeCase(key)] = camelToSnake(value);\n }\n return result as T;\n }\n return obj as T;\n}\n","import type { Tournament, TournamentListParams, QualificationEntry } from \"../types/tournament.js\";\nimport type { LeaderboardEntry } from \"../types/leaderboard.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\n\n/** Normalize tournament: ensure both `id` and `tournamentId` exist */\nfunction normalizeTournament(raw: Record<string, unknown>): Tournament {\n const t = snakeToCamel<Tournament & { id?: string }>(raw);\n // API returns `id`, SDK type uses `tournamentId` — keep both in sync\n if (t.id && !t.tournamentId) {\n (t as any).tournamentId = t.id;\n } else if (t.tournamentId && !t.id) {\n (t as any).id = t.tournamentId;\n }\n return t as Tournament;\n}\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch a paginated list of tournaments.\n */\nexport async function getTournaments(\n baseUrl: string,\n params?: TournamentListParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const qs = buildQueryString({\n game_address: params?.gameAddress,\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n sort: params?.sort,\n from_id: params?.fromId,\n exclude_ids: params?.excludeIds?.join(\",\"),\n whitelisted_extensions: params?.whitelistedExtensions?.join(\",\"),\n include_prizes: params?.includePrizeSummary,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => normalizeTournament(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch a single tournament by ID.\n */\nexport async function getTournament(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Tournament> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}`,\n fetchOpts(ctx),\n );\n return normalizeTournament(result.data);\n}\n\n/**\n * Fetch the leaderboard for a tournament.\n */\nexport async function getTournamentLeaderboard(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<LeaderboardEntry[]> {\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/leaderboard`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<LeaderboardEntry>(item));\n}\n\n/**\n * Fetch registrations for a tournament.\n */\nexport async function getTournamentRegistrations(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<Registration>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/registrations${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<Registration>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prizes for a tournament.\n */\nexport async function getTournamentPrizes(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Prize[]> {\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<Prize>(item));\n}\n\n/**\n * Fetch reward claims for a tournament.\n */\nexport async function getTournamentRewardClaims(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<RewardClaim>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/reward-claims${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<RewardClaim>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch reward claims summary for a tournament.\n */\nexport async function getTournamentRewardClaimsSummary(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<RewardClaimSummary> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}/reward-claims/summary`,\n fetchOpts(ctx),\n );\n return snakeToCamel<RewardClaimSummary>(result.data);\n}\n\n/**\n * Fetch qualifications for a tournament.\n */\nexport async function getTournamentQualifications(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<QualificationEntry>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/qualifications${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<QualificationEntry>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prize aggregation for a tournament.\n */\nexport async function getTournamentPrizeAggregation(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<PrizeAggregation[]> {\n const qs = buildQueryString({ include_aggregation: true });\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes${qs}`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<PrizeAggregation>(item));\n}\n","/**\n * Normalize a Starknet address to a 0x-prefixed, 66-character lowercase hex string.\n */\nexport function normalizeAddress(address: string): string {\n const stripped = address.replace(/^0x0*/i, \"\");\n return (\"0x\" + stripped.padStart(64, \"0\")).toLowerCase();\n}\n","import type { PlayerStats, PlayerTournament, PlayerTournamentParams } from \"../types/player.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { normalizeAddress } from \"../utils/address.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch tournaments for a player.\n */\nexport async function getPlayerTournaments(\n baseUrl: string,\n address: string,\n params?: PlayerTournamentParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<PlayerTournament>> {\n const normalized = normalizeAddress(address);\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n phase: params?.phase,\n game_token_ids: params?.gameTokenIds?.join(\",\"),\n });\n const result = await apiFetch<{\n data: Record<string, unknown>[];\n total?: number;\n limit: number;\n offset: number;\n }>(`${baseUrl}/players/${normalized}/tournaments${qs}`, fetchOpts(ctx));\n return {\n data: result.data.map((item) => snakeToCamel<PlayerTournament>(item)),\n total: (result as any).pagination?.total ?? result.total,\n limit: (result as any).pagination?.limit ?? result.limit,\n offset: (result as any).pagination?.offset ?? result.offset,\n };\n}\n\n/**\n * Fetch stats for a player.\n */\nexport async function getPlayerStats(\n baseUrl: string,\n address: string,\n ctx?: ApiContext,\n): Promise<PlayerStats> {\n const normalized = normalizeAddress(address);\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/players/${normalized}/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlayerStats>(result.data);\n}\n","import type { Tournament, TournamentListParams } from \"../types/tournament.js\";\nimport type { PlatformStats } from \"../types/activity.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { normalizeAddress } from \"../utils/address.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch tournaments for a specific game.\n */\nexport async function getGameTournaments(\n baseUrl: string,\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const normalized = normalizeAddress(gameAddress);\n const qs = buildQueryString({\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<{\n data: Record<string, unknown>[];\n total?: number;\n limit: number;\n offset: number;\n }>(`${baseUrl}/games/${normalized}/tournaments${qs}`, fetchOpts(ctx));\n return {\n data: result.data.map((item) => snakeToCamel<Tournament>(item)),\n total: (result as any).pagination?.total ?? result.total,\n limit: (result as any).pagination?.limit ?? result.limit,\n offset: (result as any).pagination?.offset ?? result.offset,\n };\n}\n\n/**\n * Fetch tournament stats for a specific game.\n */\nexport async function getGameStats(\n baseUrl: string,\n gameAddress: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const normalized = normalizeAddress(gameAddress);\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/games/${normalized}/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n","import type { ActivityEvent, ActivityParams, PlatformStats, PrizeStats } from \"../types/activity.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch activity events with optional filtering.\n */\nexport async function getActivity(\n baseUrl: string,\n params?: ActivityParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<ActivityEvent>> {\n const qs = buildQueryString({\n event_type: params?.eventType,\n tournament_id: params?.tournamentId,\n player_address: params?.playerAddress,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<{\n data: Record<string, unknown>[];\n total?: number;\n limit: number;\n offset: number;\n }>(`${baseUrl}/activity${qs}`, fetchOpts(ctx));\n return {\n data: result.data.map((item) => snakeToCamel<ActivityEvent>(item)),\n total: (result as any).pagination?.total ?? result.total,\n limit: (result as any).pagination?.limit ?? result.limit,\n offset: (result as any).pagination?.offset ?? result.offset,\n };\n}\n\n/**\n * Fetch platform-wide activity stats.\n */\nexport async function getActivityStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n\n/**\n * Fetch platform-wide prize stats.\n */\nexport async function getPrizeStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PrizeStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/prize-stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PrizeStats>(result.data);\n}\n","import type { WSSubscribeOptions, WSEventHandler, WSEventMessage } from \"../types/websocket.js\";\n\ninterface WSManagerConfig {\n maxReconnectAttempts: number;\n reconnectBaseDelay: number;\n}\n\nconst DEFAULT_WS_CONFIG: WSManagerConfig = {\n maxReconnectAttempts: 10,\n reconnectBaseDelay: 1000,\n};\n\n/**\n * WebSocket manager with auto-reconnect and subscription management.\n */\nexport class WSManager {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly config: WSManagerConfig;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private subscriptions = new Map<string, { options: WSSubscribeOptions; handler: WSEventHandler }>();\n private nextSubId = 1;\n private connected = false;\n private connectionListeners = new Set<(connected: boolean) => void>();\n\n constructor(wsUrl: string, config?: Partial<WSManagerConfig>) {\n this.wsUrl = wsUrl;\n this.config = { ...DEFAULT_WS_CONFIG, ...config };\n }\n\n /**\n * Open a WebSocket connection. No-op if already connected.\n */\n connect(): void {\n if (this.ws) return;\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.notifyConnectionChange(true);\n // Re-subscribe all active subscriptions\n for (const [, sub] of this.subscriptions) {\n this.sendSubscribe(sub.options);\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSEventMessage;\n if (message.type === \"event\") {\n for (const [, sub] of this.subscriptions) {\n sub.handler(message);\n }\n }\n } catch {\n // Ignore malformed messages\n }\n };\n\n this.ws.onclose = () => {\n this.connected = false;\n this.notifyConnectionChange(false);\n this.ws = null;\n this.attemptReconnect();\n };\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n };\n } catch {\n this.attemptReconnect();\n }\n }\n\n /**\n * Close the WebSocket connection and stop reconnecting.\n */\n disconnect(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.ws) {\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n }\n this.connected = false;\n this.notifyConnectionChange(false);\n this.reconnectAttempts = 0;\n }\n\n /**\n * Subscribe to channels with an optional tournament filter.\n * Returns an unsubscribe function.\n */\n subscribe(options: WSSubscribeOptions, handler: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n this.subscriptions.set(id, { options, handler });\n\n if (this.connected) {\n this.sendSubscribe(options);\n }\n\n return () => {\n this.subscriptions.delete(id);\n if (this.connected && this.ws) {\n this.ws.send(JSON.stringify({\n type: \"unsubscribe\",\n channels: options.channels,\n }));\n }\n };\n }\n\n /**\n * Register a callback for a single message. Convenience wrapper around subscribe.\n * Returns an unsubscribe function.\n */\n onMessage(callback: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n // Subscribe to all channels by using a passthrough handler\n this.subscriptions.set(id, {\n options: { channels: [] },\n handler: callback,\n });\n\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /**\n * Whether the WebSocket is currently connected.\n */\n get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Register a listener for connection state changes.\n * Returns an unsubscribe function.\n */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionChange(isConnected: boolean): void {\n for (const listener of this.connectionListeners) {\n try {\n listener(isConnected);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n private sendSubscribe(options: WSSubscribeOptions): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n if (options.channels.length === 0) return;\n this.ws.send(JSON.stringify({\n type: \"subscribe\",\n channels: options.channels,\n tournamentIds: options.tournamentIds,\n }));\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) return;\n if (this.subscriptions.size === 0) return;\n\n const delay = this.config.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n\n this.reconnectTimeout = setTimeout(() => {\n this.connect();\n }, Math.min(delay, 30_000));\n }\n}\n","export interface ChainConfig {\n rpcUrl: string;\n apiBaseUrl: string;\n wsUrl: string;\n budokanAddress: string;\n viewerAddress: string;\n}\n\nexport const CHAINS: Record<string, ChainConfig> = {\n mainnet: {\n rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet/rpc/v0_10\",\n apiBaseUrl: \"https://budokan-api-production.up.railway.app\",\n wsUrl: \"wss://budokan-api-production.up.railway.app/ws\",\n budokanAddress: \"\", // TODO: set after mainnet deployment\n viewerAddress: \"\", // TODO: set after mainnet deployment\n },\n sepolia: {\n rpcUrl: \"https://starknet-sepolia.public.blastapi.io\",\n apiBaseUrl: \"https://budokan-api-sepolia.up.railway.app\",\n wsUrl: \"wss://budokan-api-sepolia.up.railway.app/ws\",\n budokanAddress: \"\", // TODO: set after sepolia deployment\n viewerAddress: \"\", // TODO: set after sepolia deployment\n },\n} as const;\n\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAINS[chain];\n}\n","export type ConnectionMode = \"api\" | \"rpc-fallback\" | \"offline\";\n\nexport interface ServiceStatus {\n available: boolean;\n lastChecked: number;\n latency: number | null;\n error: string | null;\n}\n\nexport interface ConnectionStatusState {\n api: ServiceStatus;\n rpc: ServiceStatus;\n mode: ConnectionMode;\n initialCheckComplete: boolean;\n}\n\ntype StatusListener = (status: ConnectionStatusState) => void;\n\nexport interface HealthTimingConfig {\n initialCheckDelay?: number;\n checkInterval?: number;\n checkTimeout?: number;\n}\n\nexport class ConnectionStatus {\n private status: ConnectionStatusState = {\n api: { available: true, lastChecked: 0, latency: null, error: null },\n rpc: { available: true, lastChecked: 0, latency: null, error: null },\n mode: \"api\",\n initialCheckComplete: false,\n };\n\n private listeners = new Set<StatusListener>();\n private checkInterval: ReturnType<typeof setInterval> | null = null;\n private initialCheckTimeout: ReturnType<typeof setTimeout> | null = null;\n private apiUrl: string;\n private rpcUrl: string;\n private readonly initialCheckDelay: number;\n private readonly checkIntervalMs: number;\n private readonly checkTimeoutMs: number;\n\n constructor(apiUrl: string, rpcUrl: string, config?: HealthTimingConfig) {\n this.apiUrl = apiUrl;\n this.rpcUrl = rpcUrl;\n this.initialCheckDelay = Math.max(config?.initialCheckDelay ?? 1_000, 100);\n this.checkIntervalMs = Math.max(config?.checkInterval ?? 30_000, 1_000);\n this.checkTimeoutMs = Math.max(config?.checkTimeout ?? 5_000, 1_000);\n }\n\n getStatus(): ConnectionStatusState {\n return { ...this.status };\n }\n\n get mode(): ConnectionMode {\n return this.status.mode;\n }\n\n subscribe(listener: StatusListener): () => void {\n this.listeners.add(listener);\n listener(this.status);\n return () => { this.listeners.delete(listener); };\n }\n\n startMonitoring(): void {\n if (this.checkInterval) return;\n this.initialCheckTimeout = setTimeout(() => {\n this.performHealthCheck();\n this.checkInterval = setInterval(() => this.performHealthCheck(), this.checkIntervalMs);\n }, this.initialCheckDelay);\n }\n\n stopMonitoring(): void {\n if (this.checkInterval) {\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n }\n if (this.initialCheckTimeout) {\n clearTimeout(this.initialCheckTimeout);\n this.initialCheckTimeout = null;\n }\n }\n\n markApiUnavailable(error?: string): void {\n this.updateStatus({\n api: { ...this.status.api, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n markRpcUnavailable(error?: string): void {\n this.updateStatus({\n rpc: { ...this.status.rpc, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n async checkNow(): Promise<void> {\n await this.performHealthCheck();\n }\n\n destroy(): void {\n this.stopMonitoring();\n this.listeners.clear();\n }\n\n private async performHealthCheck(): Promise<void> {\n const [apiResult, rpcResult] = await Promise.all([\n this.checkApi(),\n this.checkRpc(),\n ]);\n this.updateStatus({ api: apiResult, rpc: rpcResult, initialCheckComplete: true });\n }\n\n private async checkApi(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(`${this.apiUrl}/health`, { signal: controller.signal });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isAvailable = data.status === \"healthy\" || data.status === \"degraded\";\n return { available: isAvailable, lastChecked: Date.now(), latency, error: isAvailable ? null : `API status: ${data.status}` };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private async checkRpc(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"starknet_chainId\", params: [], id: 1 }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isHealthy = data.result !== undefined && !data.error;\n return { available: isHealthy, lastChecked: Date.now(), latency, error: isHealthy ? null : \"RPC error\" };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private updateStatus(partial: Partial<ConnectionStatusState>): void {\n const newStatus = { ...this.status, ...partial };\n\n if (newStatus.api.available) {\n newStatus.mode = \"api\";\n } else if (newStatus.rpc.available) {\n newStatus.mode = \"rpc-fallback\";\n } else {\n newStatus.mode = \"offline\";\n }\n\n const changed =\n this.status.api.available !== newStatus.api.available ||\n this.status.rpc.available !== newStatus.rpc.available ||\n this.status.mode !== newStatus.mode ||\n this.status.initialCheckComplete !== newStatus.initialCheckComplete;\n\n this.status = newStatus;\n\n if (changed) {\n this.listeners.forEach((listener) => {\n try { listener(this.status); } catch { /* ignore */ }\n });\n }\n }\n}\n","import type { ConnectionStatus } from \"./health.js\";\nimport { DataSourceError } from \"../errors/index.js\";\n\nexport async function withFallback<T>(\n primary: () => Promise<T>,\n fallback: () => Promise<T>,\n health?: ConnectionStatus,\n): Promise<T> {\n // If health monitoring shows primary source is down, skip it\n if (health) {\n const mode = health.mode;\n if (mode === \"rpc-fallback\") {\n // API is known-down, go straight to RPC fallback\n try {\n return await fallback();\n } catch (fallbackError) {\n throw fallbackError;\n }\n }\n\n if (mode === \"offline\") {\n // Both are known-down, still try both in order\n }\n }\n\n let primaryError: Error;\n try {\n return await primary();\n } catch (error) {\n primaryError = error as Error;\n // Report failure to health service\n if (health) {\n health.markApiUnavailable(primaryError.message);\n }\n }\n\n try {\n return await fallback();\n } catch (fallbackError) {\n if (health) {\n health.markRpcUnavailable((fallbackError as Error).message);\n }\n throw new DataSourceError(primaryError, fallbackError as Error);\n }\n}\n","import type { RpcProvider, Contract } from \"starknet\";\n\nlet starknetModule: typeof import(\"starknet\") | null = null;\nlet useObjectConstructor: boolean | null = null;\n\nasync function getStarknet(): Promise<typeof import(\"starknet\")> {\n if (!starknetModule) {\n starknetModule = await import(\"starknet\");\n }\n return starknetModule;\n}\n\nexport async function createProvider(rpcUrl: string): Promise<RpcProvider> {\n const { RpcProvider: StarknetRpcProvider } = await getStarknet();\n const provider = new StarknetRpcProvider({ nodeUrl: rpcUrl });\n return provider;\n}\n\nexport async function createContract(\n abi: unknown[],\n address: string,\n provider: RpcProvider,\n): Promise<Contract> {\n // Handle case where ABI might be wrapped in a default export\n let resolvedAbi = abi;\n if (abi && !Array.isArray(abi) && typeof abi === \"object\" && \"default\" in abi) {\n resolvedAbi = (abi as { default: unknown[] }).default;\n }\n\n const starknet = await getStarknet();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const StarknetContract = starknet.Contract as any;\n\n // Detect constructor style once and cache result\n if (useObjectConstructor === null) {\n // Try object format first (v7+), catch and try positional (v6.x)\n try {\n const contract = new StarknetContract({\n abi: resolvedAbi,\n address,\n providerOrAccount: provider,\n });\n // Object format works (v7+)\n useObjectConstructor = true;\n return contract as Contract;\n } catch {\n // Object format failed, use positional (v6.x)\n useObjectConstructor = false;\n return new StarknetContract(resolvedAbi, address, provider) as Contract;\n }\n }\n\n // Use cached constructor style\n if (useObjectConstructor) {\n return new StarknetContract({\n abi: resolvedAbi,\n address,\n providerOrAccount: provider,\n }) as Contract;\n } else {\n return new StarknetContract(resolvedAbi, address, provider) as Contract;\n }\n}\n","import type { Contract } from \"starknet\";\nimport type { Tournament } from \"../types/tournament.js\";\nimport type { LeaderboardEntry } from \"../types/leaderboard.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport type { Phase } from \"../types/tournament.js\";\nimport { RpcError } from \"../errors/index.js\";\nimport { num } from \"starknet\";\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction wrapRpcCall<T>(fn: () => Promise<T>, contractAddress?: string): Promise<T> {\n return fn().catch((error: unknown) => {\n throw new RpcError(\n error instanceof Error ? error.message : \"RPC call failed\",\n contractAddress,\n );\n });\n}\n\nfunction decodeShortString(value: unknown): string {\n if (!value) return \"\";\n const hex = num.toHex(value as bigint);\n if (hex === \"0x0\") return \"\";\n const hexStr = hex.slice(2);\n let result = \"\";\n for (let i = 0; i < hexStr.length; i += 2) {\n const charCode = parseInt(hexStr.slice(i, i + 2), 16);\n if (charCode === 0) break;\n result += String.fromCharCode(charCode);\n }\n return result;\n}\n\nfunction decodeByteArray(value: unknown): string {\n if (!value) return \"\";\n // ByteArray from Cairo is serialized as { data: felt252[], pending_word: felt252, pending_word_len: u32 }\n const obj = value as Record<string, unknown>;\n const data = obj.data as unknown[] | undefined;\n const pendingWord = obj.pending_word;\n const pendingWordLen = Number(obj.pending_word_len ?? 0);\n\n let result = \"\";\n\n // Each data element is a 31-byte chunk encoded as felt252\n if (data) {\n for (const chunk of data) {\n const hex = num.toHex(chunk as bigint).slice(2).padStart(62, \"0\");\n for (let i = 0; i < 62; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n }\n\n // Pending word contains remaining bytes (< 31)\n if (pendingWord && pendingWordLen > 0) {\n const hex = num.toHex(pendingWord as bigint).slice(2).padStart(pendingWordLen * 2, \"0\");\n for (let i = 0; i < pendingWordLen * 2; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n\n return result;\n}\n\n/** Convert SDK Phase string to Cairo enum argument for RPC calls */\nfunction phaseToRpcArg(phase: Phase): Record<string, Record<string, never>> {\n const map: Record<Phase, string> = {\n scheduled: \"Scheduled\",\n registration: \"Registration\",\n staging: \"Staging\",\n live: \"Live\",\n submission: \"Submission\",\n finalized: \"Finalized\",\n };\n return { [map[phase]]: {} };\n}\n\n// =========================================================================\n// Parsers — raw on-chain structs → SDK types\n// =========================================================================\n\nfunction parseTournament(\n raw: unknown,\n entryCount: number,\n): Tournament {\n const obj = raw as Record<string, unknown>;\n const id = String(obj.id ?? \"0\");\n const createdAt = Number(obj.created_at ?? 0);\n const createdBy = num.toHex(obj.created_by as bigint);\n const creatorTokenId = obj.creator_token_id ? num.toHex(obj.creator_token_id as bigint) : null;\n\n // Metadata\n const metadata = obj.metadata as Record<string, unknown> | undefined;\n const name = metadata ? decodeShortString(metadata.name) : \"\";\n const description = metadata ? decodeByteArray(metadata.description) : \"\";\n\n // Schedule\n const sched = obj.schedule as Record<string, unknown> | undefined;\n const registrationStartDelay = Number(sched?.registration_start_delay ?? 0);\n const registrationEndDelay = Number(sched?.registration_end_delay ?? 0);\n const gameStartDelay = Number(sched?.game_start_delay ?? 0);\n const gameEndDelay = Number(sched?.game_end_delay ?? 0);\n const submissionDuration = Number(sched?.submission_duration ?? 0);\n\n // Compute absolute timestamps\n const createdAtStr = String(createdAt);\n const registrationStartTime = String(createdAt + registrationStartDelay);\n const registrationEndTime = String(createdAt + registrationEndDelay);\n const gameStartTime = String(createdAt + gameStartDelay);\n const gameEndTime = String(createdAt + gameEndDelay);\n const submissionEndTime = String(createdAt + gameEndDelay + submissionDuration);\n\n // GameConfig\n const gc = obj.game_config as Record<string, unknown> | undefined;\n const gameAddress = gc ? num.toHex(gc.game_address as bigint) : \"\";\n const settingsId = Number(gc?.settings_id ?? 0);\n const soulbound = Boolean(gc?.soulbound);\n const paymaster = Boolean(gc?.paymaster);\n const clientUrl = gc?.client_url ? decodeOptionalByteArray(gc.client_url) : null;\n const renderer = gc?.renderer ? parseOptionalAddress(gc.renderer) : null;\n\n // LeaderboardConfig\n const lc = obj.leaderboard_config as Record<string, unknown> | undefined;\n const ascending = Boolean(lc?.ascending);\n const gameMustBeOver = Boolean(lc?.game_must_be_over);\n\n // EntryFee (Option)\n const entryFeeRaw = parseOption(obj.entry_fee);\n let entryFeeToken: string | null = null;\n let entryFeeAmount: string | null = null;\n let entryFee: Tournament[\"entryFee\"] = null;\n if (entryFeeRaw) {\n const ef = entryFeeRaw as Record<string, unknown>;\n entryFeeToken = num.toHex(ef.token_address as bigint);\n entryFeeAmount = String(ef.amount ?? \"0\");\n entryFee = {\n tokenAddress: entryFeeToken,\n amount: entryFeeAmount,\n tournamentCreatorShare: Number(ef.tournament_creator_share ?? 0),\n gameCreatorShare: Number(ef.game_creator_share ?? 0),\n refundShare: Number(ef.refund_share ?? 0),\n distribution: ef.distribution ?? null,\n distributionCount: Number(ef.distribution_count ?? 0),\n };\n }\n\n // EntryRequirement (Option)\n const entryRequirement = parseOption(obj.entry_requirement) ?? null;\n const hasEntryRequirement = entryRequirement !== null;\n\n return {\n id,\n tournamentId: id,\n gameAddress,\n createdAt: new Date(createdAt * 1000).toISOString(),\n createdBy,\n creatorTokenId,\n name,\n description,\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n createdAtOnchain: createdAtStr,\n registrationStartTime,\n registrationEndTime,\n gameStartTime,\n gameEndTime,\n submissionEndTime,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n leaderboardAscending: ascending,\n leaderboardGameMustBeOver: gameMustBeOver,\n entryFeeToken,\n entryFeeAmount,\n hasEntryRequirement,\n schedule: {\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n },\n gameConfig: {\n gameAddress,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n },\n entryFee,\n entryRequirement,\n leaderboardConfig: { ascending, gameMustBeOver },\n entryCount,\n prizeCount: 0, // Not available from viewer\n submissionCount: 0, // Not available from viewer\n metadata: null,\n };\n}\n\nfunction parseLeaderboardEntry(raw: unknown): LeaderboardEntry {\n const obj = raw as Record<string, unknown>;\n return {\n position: Number(obj.position ?? 0),\n tokenId: num.toHex(obj.token_id as bigint),\n };\n}\n\nfunction parseRegistration(raw: unknown, tournamentId: string): Registration {\n const obj = raw as Record<string, unknown>;\n return {\n tournamentId,\n gameTokenId: num.toHex(obj.game_token_id as bigint),\n gameAddress: \"\", // Not in on-chain struct\n playerAddress: \"\", // Not in on-chain struct\n entryNumber: Number(obj.entry_id ?? 0),\n hasSubmitted: Boolean(obj.has_submitted),\n isBanned: Boolean(obj.is_banned),\n };\n}\n\nfunction parsePrize(raw: unknown): Prize {\n const obj = raw as Record<string, unknown>;\n const tokenTypeData = obj.token_type as Record<string, unknown> | undefined;\n\n // TokenTypeData is a Cairo enum: { erc20: ERC20Data } or { erc721: ERC721Data }\n let tokenType: \"erc20\" | \"erc721\" = \"erc20\";\n let amount: string | null = null;\n let tokenId: string | null = null;\n let distributionType: string | null = null;\n let distributionWeight: number | null = null;\n let distributionCount: number | null = null;\n let payoutPosition = 0;\n\n if (tokenTypeData) {\n if (\"erc20\" in tokenTypeData) {\n const erc20 = tokenTypeData.erc20 as Record<string, unknown>;\n tokenType = \"erc20\";\n amount = String(erc20.amount ?? \"0\");\n const dist = erc20.distribution as Record<string, unknown> | null;\n if (dist) {\n distributionType = String(dist.type ?? null);\n distributionWeight = dist.weight != null ? Number(dist.weight) : null;\n }\n distributionCount = erc20.distribution_count != null ? Number(erc20.distribution_count) : null;\n } else if (\"erc721\" in tokenTypeData) {\n const erc721 = tokenTypeData.erc721 as Record<string, unknown>;\n tokenType = \"erc721\";\n tokenId = String(erc721.id ?? \"0\");\n } else if (\"variant\" in tokenTypeData) {\n // starknet.js v6 enum style\n const variant = (tokenTypeData.variant as string)?.toLowerCase();\n if (variant === \"erc20\") {\n tokenType = \"erc20\";\n amount = String(tokenTypeData.amount ?? \"0\");\n const dist = tokenTypeData.distribution as Record<string, unknown> | null;\n if (dist) {\n distributionType = String(dist.type ?? null);\n distributionWeight = dist.weight != null ? Number(dist.weight) : null;\n }\n distributionCount = tokenTypeData.distribution_count != null ? Number(tokenTypeData.distribution_count) : null;\n } else if (variant === \"erc721\") {\n tokenType = \"erc721\";\n tokenId = String(tokenTypeData.id ?? \"0\");\n }\n }\n }\n\n return {\n prizeId: String(obj.id ?? \"0\"),\n tournamentId: String(obj.context_id ?? \"0\"),\n payoutPosition,\n tokenAddress: num.toHex(obj.token_address as bigint),\n tokenType,\n amount,\n tokenId,\n distributionType,\n distributionWeight,\n distributionCount,\n sponsorAddress: num.toHex(obj.sponsor_address as bigint),\n };\n}\n\n/** Unwrap a Cairo Option — starknet.js may return { Some: value } / { None: {} } or just the value */\nfunction parseOption(raw: unknown): unknown | null {\n if (raw === undefined || raw === null) return null;\n const obj = raw as Record<string, unknown>;\n if (\"Some\" in obj) return obj.Some;\n if (\"None\" in obj) return null;\n // Some starknet.js versions flatten the option\n return raw;\n}\n\nfunction decodeOptionalByteArray(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n return decodeByteArray(inner);\n}\n\nfunction parseOptionalAddress(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n const hex = num.toHex(inner as bigint);\n return hex === \"0x0\" ? null : hex;\n}\n\n// =========================================================================\n// Viewer functions\n// =========================================================================\n\ninterface TournamentFilterResult {\n tournamentIds: string[];\n total: number;\n}\n\nfunction parseFilterResult(raw: unknown): TournamentFilterResult {\n const obj = raw as Record<string, unknown>;\n const ids = (obj.tournament_ids as unknown[])?.map((v) => String(v)) ?? [];\n const total = Number(obj.total ?? 0);\n return { tournamentIds: ids, total };\n}\n\nfunction parseTournamentFullState(raw: unknown): Tournament {\n const obj = raw as Record<string, unknown>;\n const entryCount = Number(obj.entry_count ?? 0);\n return parseTournament(obj.tournament, entryCount);\n}\n\n// --- Tournament listing ---\n\nexport async function viewerTournaments(\n contract: Contract,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments\", [offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByGame(\n contract: Contract,\n gameAddress: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_game\", [gameAddress, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByCreator(\n contract: Contract,\n creator: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_creator\", [creator, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByPhase(\n contract: Contract,\n phase: Phase,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_phase\", [phaseToRpcArg(phase), offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\n// --- Tournament detail ---\n\nexport async function viewerTournamentDetail(\n contract: Contract,\n tournamentId: string,\n): Promise<Tournament> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_detail\", [tournamentId]);\n return parseTournamentFullState(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsBatch(\n contract: Contract,\n tournamentIds: string[],\n): Promise<Tournament[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_batch\", [tournamentIds]);\n return (result as unknown[]).map(parseTournamentFullState);\n }, contract.address);\n}\n\n// --- Registrations ---\n\nexport async function viewerRegistrations(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<PaginatedResult<Registration>> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_registrations\", [tournamentId, offset, limit]);\n const obj = result as Record<string, unknown>;\n const entries = (obj.entries as unknown[]) ?? [];\n const total = Number(obj.total ?? 0);\n return {\n data: entries.map((e) => parseRegistration(e, tournamentId)),\n total,\n limit,\n offset,\n };\n }, contract.address);\n}\n\n// --- Leaderboard ---\n\nexport async function viewerLeaderboard(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<LeaderboardEntry[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"leaderboard\", [tournamentId, offset, limit]);\n return (result as unknown[]).map(parseLeaderboardEntry);\n }, contract.address);\n}\n\n// --- Prizes ---\n\nexport async function viewerPrizes(\n contract: Contract,\n tournamentId: string,\n): Promise<Prize[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_prizes\", [tournamentId]);\n return (result as unknown[]).map(parsePrize);\n }, contract.address);\n}\n","[\n {\n \"type\": \"impl\",\n \"name\": \"UpgradeableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"upgrade\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanViewerImpl\",\n \"interface_name\": \"budokan_interfaces::viewer::IBudokanViewer\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFilterResult\",\n \"members\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u64\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::Phase\",\n \"variants\": [\n {\n \"name\": \"Scheduled\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Registration\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Staging\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Live\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Submission\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Finalized\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::byte_array::ByteArray\",\n \"members\": [\n {\n \"name\": \"data\",\n \"type\": \"core::array::Array::<core::bytes_31::bytes31>\"\n },\n {\n \"name\": \"pending_word\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"pending_word_len\",\n \"type\": \"core::internal::bounded_int::BoundedInt::<0, 30>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Metadata\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Schedule\",\n \"members\": [\n {\n \"name\": \"registration_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"registration_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"submission_duration\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::bool\",\n \"variants\": [\n {\n \"name\": \"False\",\n \"type\": \"()\"\n },\n {\n \"name\": \"True\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::GameConfig\",\n \"members\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"settings_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"soulbound\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"paymaster\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::integer::u16>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::distribution::Distribution\",\n \"variants\": [\n {\n \"name\": \"Linear\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Exponential\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Uniform\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Custom\",\n \"type\": \"core::array::Span::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::EntryFee\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"tournament_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<budokan_interfaces::budokan::EntryFee>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"budokan_interfaces::budokan::EntryFee\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::starknet::contract_address::ContractAddress>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::starknet::contract_address::ContractAddress>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::felt252>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"interfaces::extension::ExtensionConfig\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirementType\",\n \"variants\": [\n {\n \"name\": \"token\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"allowlist\",\n \"type\": \"core::array::Span::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"extension\",\n \"type\": \"interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirement\",\n \"members\": [\n {\n \"name\": \"entry_limit\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"entry_requirement_type\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirementType\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirement\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::LeaderboardConfig\",\n \"members\": [\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_must_be_over\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Tournament\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_at\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFee>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFullState\",\n \"members\": [\n {\n \"name\": \"tournament\",\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::registration::Registration\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RegistrationResult\",\n \"members\": [\n {\n \"name\": \"entries\",\n \"type\": \"core::array::Array::<game_components_interfaces::registration::Registration>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::LeaderboardEntryView\",\n \"members\": [\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u32>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC20Data\",\n \"members\": [\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC721Data\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::TokenTypeData\",\n \"variants\": [\n {\n \"name\": \"erc20\",\n \"type\": \"game_components_interfaces::prize::ERC20Data\"\n },\n {\n \"name\": \"erc721\",\n \"type\": \"game_components_interfaces::prize::ERC721Data\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::PrizeData\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"token_type\",\n \"type\": \"game_components_interfaces::prize::TokenTypeData\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan_interfaces::viewer::IBudokanViewer\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"tournaments\",\n \"inputs\": [\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_detail\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFullState\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_batch\",\n \"inputs\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::TournamentFullState>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"leaderboard\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::LeaderboardEntryView>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_prizes\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::prize::PrizeData>\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"owner\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"transfer_ownership\",\n \"inputs\": [\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounce_ownership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableCamelOnlyImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"transferOwnership\",\n \"inputs\": [\n {\n \"name\": \"newOwner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounceOwnership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"constructor\",\n \"name\": \"constructor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"budokan_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnershipTransferred\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Upgraded\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan_viewer::budokan_viewer::BudokanViewer::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnableEvent\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"UpgradeableEvent\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"flat\"\n }\n ]\n }\n]\n","import type { RpcProvider, Contract } from \"starknet\";\nimport type { BudokanClientConfig } from \"./types/config.js\";\nimport type { Tournament, TournamentListParams } from \"./types/tournament.js\";\nimport type { LeaderboardEntry } from \"./types/leaderboard.js\";\nimport type { Registration } from \"./types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"./types/prize.js\";\nimport type { PlayerStats, PlayerTournament, PlayerTournamentParams } from \"./types/player.js\";\nimport type { ActivityEvent, ActivityParams, PlatformStats, PrizeStats } from \"./types/activity.js\";\nimport type { QualificationEntry } from \"./types/tournament.js\";\nimport type { PaginatedResult } from \"./types/common.js\";\nimport type { WSChannel, WSEventHandler } from \"./types/websocket.js\";\nimport type { ConnectionStatusState } from \"./datasource/health.js\";\n\nimport {\n getTournaments as apiGetTournaments,\n getTournament as apiGetTournament,\n getTournamentLeaderboard as apiGetTournamentLeaderboard,\n getTournamentRegistrations as apiGetTournamentRegistrations,\n getTournamentPrizes as apiGetTournamentPrizes,\n getTournamentRewardClaims as apiGetTournamentRewardClaims,\n getTournamentRewardClaimsSummary as apiGetTournamentRewardClaimsSummary,\n getTournamentQualifications as apiGetTournamentQualifications,\n getTournamentPrizeAggregation as apiGetTournamentPrizeAggregation,\n} from \"./api/tournaments.js\";\nimport {\n getPlayerTournaments as apiGetPlayerTournaments,\n getPlayerStats as apiGetPlayerStats,\n} from \"./api/players.js\";\nimport {\n getGameTournaments as apiGetGameTournaments,\n getGameStats as apiGetGameStats,\n} from \"./api/games.js\";\nimport {\n getActivity as apiGetActivity,\n getActivityStats as apiGetActivityStats,\n getPrizeStats as apiGetPrizeStats,\n} from \"./api/activity.js\";\nimport { WSManager } from \"./ws/manager.js\";\nimport { getChainConfig } from \"./chains/constants.js\";\nimport { ConnectionStatus } from \"./datasource/health.js\";\nimport { withFallback } from \"./datasource/resolver.js\";\nimport { RpcError } from \"./errors/index.js\";\nimport { createProvider, createContract } from \"./rpc/provider.js\";\nimport {\n viewerTournaments,\n viewerTournamentsByGame,\n viewerTournamentsByCreator,\n viewerTournamentsByPhase,\n viewerTournamentDetail,\n viewerTournamentsBatch,\n viewerRegistrations,\n viewerLeaderboard,\n viewerPrizes,\n} from \"./rpc/viewer.js\";\n\nimport viewerAbi from \"./rpc/abis/budokanViewer.json\";\n\n/** Resolved config with all defaults applied */\ninterface ResolvedConfig extends BudokanClientConfig {\n rpcUrl: string;\n viewerAddress: string;\n budokanAddress: string;\n}\n\n/**\n * Main client for interacting with the Budokan tournament system.\n *\n * Provides methods for querying tournaments, registrations, leaderboards,\n * prizes, player stats, and activity events. Supports real-time updates\n * via WebSocket subscriptions and automatic RPC fallback when the API is\n * unavailable.\n *\n * @example\n * ```ts\n * // API-only (default, backward compatible)\n * const client = new BudokanClient({\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * });\n *\n * // With RPC fallback\n * const client = new BudokanClient({\n * chain: \"mainnet\",\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * viewerAddress: \"0x...\",\n * });\n *\n * // RPC-only (bypass API entirely)\n * const client = new BudokanClient({\n * primarySource: \"rpc\",\n * rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet/rpc/v0_10\",\n * viewerAddress: \"0x...\",\n * });\n * ```\n */\nexport class BudokanClient {\n private readonly resolvedConfig: ResolvedConfig;\n private readonly wsManager: WSManager;\n private readonly connectionStatus: ConnectionStatus;\n private cachedProvider: RpcProvider | null = null;\n private cachedViewerContract: Contract | null = null;\n\n constructor(config: BudokanClientConfig) {\n // Merge user config with chain defaults\n const chainConfig = config.chain ? getChainConfig(config.chain) : undefined;\n this.resolvedConfig = {\n ...config,\n apiBaseUrl: config.apiBaseUrl ?? chainConfig?.apiBaseUrl ?? \"\",\n rpcUrl: config.rpcUrl ?? chainConfig?.rpcUrl ?? \"\",\n viewerAddress: config.viewerAddress ?? chainConfig?.viewerAddress ?? \"\",\n budokanAddress: config.budokanAddress ?? chainConfig?.budokanAddress ?? \"\",\n };\n\n const wsUrl = config.wsUrl ?? chainConfig?.wsUrl\n ?? this.resolvedConfig.apiBaseUrl.replace(/^http/, \"ws\").replace(/\\/$/, \"\") + \"/ws\";\n this.wsManager = new WSManager(wsUrl);\n\n this.connectionStatus = new ConnectionStatus(\n this.resolvedConfig.apiBaseUrl,\n this.resolvedConfig.rpcUrl,\n config.health,\n );\n\n // Start health monitoring if both sources are configured\n if (this.resolvedConfig.apiBaseUrl && this.resolvedConfig.rpcUrl) {\n this.connectionStatus.startMonitoring();\n }\n }\n\n // ---- Configuration ----\n\n /** Returns the resolved configuration. */\n get clientConfig(): BudokanClientConfig {\n return { ...this.resolvedConfig };\n }\n\n /** Whether the WebSocket is currently connected. */\n get wsConnected(): boolean {\n return this.wsManager.isConnected;\n }\n\n // ---- Connection status ----\n\n /** Returns the current connection status (API, RPC, mode). */\n getConnectionStatus(): ConnectionStatusState {\n return this.connectionStatus.getStatus();\n }\n\n /** Subscribe to connection status changes. Returns an unsubscribe function. */\n onConnectionStatusChange(listener: (status: ConnectionStatusState) => void): () => void {\n return this.connectionStatus.subscribe(listener);\n }\n\n // ---- Lazy RPC getters ----\n\n private async getProvider(): Promise<RpcProvider> {\n if (this.cachedProvider) return this.cachedProvider;\n if (!this.resolvedConfig.rpcUrl) {\n throw new RpcError(\"No rpcUrl configured\");\n }\n if (this.resolvedConfig.provider) {\n this.cachedProvider = this.resolvedConfig.provider as RpcProvider;\n return this.cachedProvider;\n }\n this.cachedProvider = await createProvider(this.resolvedConfig.rpcUrl);\n return this.cachedProvider;\n }\n\n private async getViewerContract(): Promise<Contract> {\n if (this.cachedViewerContract) return this.cachedViewerContract;\n if (!this.resolvedConfig.viewerAddress) {\n throw new RpcError(\"No viewerAddress configured. Set viewerAddress in config or use a chain preset with a deployed viewer contract.\");\n }\n const provider = await this.getProvider();\n this.cachedViewerContract = await createContract(\n viewerAbi as unknown[],\n this.resolvedConfig.viewerAddress,\n provider,\n );\n return this.cachedViewerContract;\n }\n\n // ---- API context ----\n\n private get apiCtx() {\n return {\n retryAttempts: this.resolvedConfig.retryAttempts,\n retryDelay: this.resolvedConfig.retryDelay,\n timeout: this.resolvedConfig.timeout,\n };\n }\n\n // ---- Tournament Queries ----\n\n /**\n * Fetch a paginated list of tournaments with optional filtering.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournaments(params?: TournamentListParams): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n\n // Choose the appropriate viewer filter function\n let filterResult: { tournamentIds: string[]; total: number };\n if (params?.phase) {\n filterResult = await viewerTournamentsByPhase(contract, params.phase, offset, limit);\n } else if (params?.gameAddress) {\n filterResult = await viewerTournamentsByGame(contract, params.gameAddress, offset, limit);\n } else if (params?.creator) {\n filterResult = await viewerTournamentsByCreator(contract, params.creator, offset, limit);\n } else {\n filterResult = await viewerTournaments(contract, offset, limit);\n }\n\n // Batch-fetch full tournament data for the returned IDs\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournaments(this.resolvedConfig.apiBaseUrl, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch a single tournament by its ID.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournament(tournamentId: string): Promise<Tournament> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n return viewerTournamentDetail(contract, tournamentId);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournament(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch the leaderboard for a tournament.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournamentLeaderboard(tournamentId: string): Promise<LeaderboardEntry[]> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n // Fetch a large page; on-chain leaderboards are typically small\n return viewerLeaderboard(contract, tournamentId, 0, 1000);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentLeaderboard(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch registrations for a tournament.\n * Supports RPC fallback when API is unavailable.\n * Note: In RPC mode, `playerAddress` and `gameAddress` fields will be empty strings.\n */\n async getTournamentRegistrations(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<Registration>> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n return viewerRegistrations(contract, tournamentId, offset, limit);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRegistrations(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch prizes for a tournament.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournamentPrizes(tournamentId: string): Promise<Prize[]> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n return viewerPrizes(contract, tournamentId);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentPrizes(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n // ---- Player Queries (API-only, no on-chain equivalent) ----\n\n /**\n * Fetch tournaments that a player has registered for.\n * API-only — no RPC fallback available.\n */\n async getPlayerTournaments(\n address: string,\n params?: PlayerTournamentParams,\n ): Promise<PaginatedResult<PlayerTournament>> {\n return apiGetPlayerTournaments(this.resolvedConfig.apiBaseUrl, address, params, this.apiCtx);\n }\n\n /**\n * Fetch stats for a player.\n * API-only — no RPC fallback available.\n */\n async getPlayerStats(address: string): Promise<PlayerStats> {\n return apiGetPlayerStats(this.resolvedConfig.apiBaseUrl, address, this.apiCtx);\n }\n\n // ---- Game Queries ----\n\n /**\n * Fetch tournaments for a specific game.\n * Supports RPC fallback when API is unavailable.\n */\n async getGameTournaments(\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n const filterResult = await viewerTournamentsByGame(contract, gameAddress, offset, limit);\n\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetGameTournaments(this.resolvedConfig.apiBaseUrl, gameAddress, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch tournament stats for a specific game.\n * API-only — no RPC fallback available.\n */\n async getGameStats(gameAddress: string): Promise<PlatformStats> {\n return apiGetGameStats(this.resolvedConfig.apiBaseUrl, gameAddress, this.apiCtx);\n }\n\n // ---- Reward Claims & Qualifications (API-only) ----\n\n /**\n * Fetch reward claims for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentRewardClaims(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<RewardClaim>> {\n return apiGetTournamentRewardClaims(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx);\n }\n\n /**\n * Fetch reward claims summary for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentRewardClaimsSummary(tournamentId: string): Promise<RewardClaimSummary> {\n return apiGetTournamentRewardClaimsSummary(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx);\n }\n\n /**\n * Fetch qualifications for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentQualifications(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<QualificationEntry>> {\n return apiGetTournamentQualifications(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx);\n }\n\n /**\n * Fetch prize aggregation for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentPrizeAggregation(tournamentId: string): Promise<PrizeAggregation[]> {\n return apiGetTournamentPrizeAggregation(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx);\n }\n\n // ---- Activity Queries (API-only, activity is indexed) ----\n\n /**\n * Fetch activity events with optional filtering.\n * API-only — no RPC fallback available.\n */\n async getActivity(params?: ActivityParams): Promise<PaginatedResult<ActivityEvent>> {\n return apiGetActivity(this.resolvedConfig.apiBaseUrl, params, this.apiCtx);\n }\n\n /**\n * Fetch platform-wide activity stats.\n * API-only — no RPC fallback available.\n */\n async getActivityStats(): Promise<PlatformStats> {\n return apiGetActivityStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n /**\n * Fetch platform-wide prize stats.\n * API-only — no RPC fallback available.\n */\n async getPrizeStats(): Promise<PrizeStats> {\n return apiGetPrizeStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n // ---- WebSocket ----\n\n /**\n * Open a WebSocket connection for real-time updates.\n */\n connect(): void {\n this.wsManager.connect();\n }\n\n /**\n * Close the WebSocket connection.\n */\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n /**\n * Stop health monitoring and close all connections.\n */\n destroy(): void {\n this.connectionStatus.destroy();\n this.wsManager.disconnect();\n }\n\n /**\n * Subscribe to WebSocket channels with optional tournament filtering.\n * Returns an unsubscribe function.\n */\n subscribe(\n channels: WSChannel[],\n handler: WSEventHandler,\n tournamentIds?: string[],\n ): () => void {\n return this.wsManager.subscribe({ channels, tournamentIds }, handler);\n }\n\n /**\n * Register a listener for WebSocket connection state changes.\n * Returns an unsubscribe function.\n */\n onWsConnectionChange(listener: (connected: boolean) => void): () => void {\n return this.wsManager.onConnectionChange(listener);\n }\n}\n\n/**\n * Factory function for creating a BudokanClient instance.\n */\nexport function createBudokanClient(config: BudokanClientConfig): BudokanClient {\n return new BudokanClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/utils/retry.ts","../src/api/base.ts","../src/utils/mappers.ts","../src/api/tournaments.ts","../src/utils/address.ts","../src/api/players.ts","../src/api/games.ts","../src/api/activity.ts","../src/ws/manager.ts","../src/chains/constants.ts","../src/datasource/health.ts","../src/datasource/resolver.ts","../src/rpc/provider.ts","../src/rpc/viewer.ts","../src/rpc/abis/budokanViewer.json","../src/client.ts"],"names":["fetchOpts","num","CairoCustomEnum"],"mappings":"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","file":"index.cjs","sourcesContent":["export class BudokanError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BudokanError\";\n }\n}\n\nexport class BudokanApiError extends BudokanError {\n readonly status: number;\n readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string = \"\") {\n super(message);\n this.name = \"BudokanApiError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport class BudokanTimeoutError extends BudokanError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"BudokanTimeoutError\";\n }\n}\n\nexport class BudokanConnectionError extends BudokanError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"BudokanConnectionError\";\n }\n}\n\nexport class TournamentNotFoundError extends BudokanError {\n readonly tournamentId: string;\n\n constructor(tournamentId: string) {\n super(`Tournament not found: ${tournamentId}`);\n this.name = \"TournamentNotFoundError\";\n this.tournamentId = tournamentId;\n }\n}\n\nexport class RpcError extends BudokanError {\n readonly contractAddress?: string;\n\n constructor(message: string, contractAddress?: string) {\n super(message);\n this.name = \"RpcError\";\n this.contractAddress = contractAddress;\n }\n}\n\nexport class DataSourceError extends BudokanError {\n readonly primaryError: Error;\n readonly fallbackError: Error;\n\n constructor(primaryError: Error, fallbackError: Error) {\n super(`Both data sources failed. Primary: ${primaryError.message}. Fallback: ${fallbackError.message}`);\n this.name = \"DataSourceError\";\n this.primaryError = primaryError;\n this.fallbackError = fallbackError;\n }\n}\n\nexport function isNonRetryableError(error: unknown): boolean {\n if (error instanceof TournamentNotFoundError) return true;\n if (error instanceof BudokanApiError && error.status >= 400 && error.status < 500 && error.status !== 429) {\n return true;\n }\n return false;\n}\n","import { isNonRetryableError, BudokanTimeoutError } from \"../errors/index.js\";\n\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n): number {\n let delay = baseDelay * Math.pow(2, attempt);\n if (delay > maxDelay) delay = maxDelay;\n const minDelay = delay / 2;\n const jitter = Math.random() * (delay - minDelay);\n return minDelay + jitter;\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n attempts: number = 3,\n delay: number = 1000,\n): Promise<T> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (isNonRetryableError(error)) {\n throw error;\n }\n\n if (attempt === attempts - 1) break;\n\n const backoff = calculateBackoff(attempt, delay, delay * 8);\n await sleep(backoff);\n }\n }\n\n throw lastError ?? new BudokanTimeoutError(\"Unknown error after retries\");\n}\n","import { BudokanApiError, BudokanTimeoutError, BudokanConnectionError } from \"../errors/index.js\";\nimport { withRetry } from \"../utils/retry.js\";\n\nexport interface ApiFetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n signal?: AbortSignal;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n}\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst DEFAULT_RETRY_ATTEMPTS = 3;\nconst DEFAULT_RETRY_DELAY = 1000;\n\n/**\n * Fetch JSON from an API endpoint with retry logic, timeout, and error handling.\n */\nexport async function apiFetch<T>(url: string, options: ApiFetchOptions = {}): Promise<T> {\n const {\n method = \"GET\",\n headers = {},\n body,\n signal,\n timeout = DEFAULT_TIMEOUT,\n retryAttempts = DEFAULT_RETRY_ATTEMPTS,\n retryDelay = DEFAULT_RETRY_DELAY,\n } = options;\n\n return withRetry(\n async () => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // Link external signal\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timeoutId);\n throw new BudokanTimeoutError(\"Request was aborted\");\n }\n signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throw new BudokanApiError(\n (errorBody as Record<string, string>).error ?? `API error: ${response.status}`,\n response.status,\n response.statusText,\n );\n }\n\n return (await response.json()) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof BudokanApiError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n if (signal?.aborted) throw new BudokanTimeoutError(\"Request was aborted\");\n throw new BudokanTimeoutError();\n }\n throw new BudokanConnectionError(\n error instanceof Error ? error.message : \"Connection failed\",\n );\n }\n },\n retryAttempts,\n retryDelay,\n );\n}\n\n/**\n * Extract pagination from API response.\n * The API wraps pagination in a `pagination` object, but the SDK\n * PaginatedResult type uses flat fields (total, limit, offset).\n */\nexport function extractPagination(result: Record<string, unknown>, defaults?: { limit?: number; offset?: number }): {\n total: number | undefined;\n limit: number;\n offset: number;\n} {\n const pagination = result.pagination as { total?: number; limit?: number; offset?: number } | undefined;\n return {\n total: pagination?.total ?? (result.total as number | undefined),\n limit: pagination?.limit ?? (result.limit as number | undefined) ?? defaults?.limit ?? 50,\n offset: pagination?.offset ?? (result.offset as number | undefined) ?? defaults?.offset ?? 0,\n };\n}\n\n/**\n * Build a query string from a record of key-value pairs.\n * Undefined and null values are omitted.\n */\nexport function buildQueryString(params: Record<string, string | number | boolean | undefined | null>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n","/**\n * Convert a snake_case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\n/**\n * Convert a camelCase string to snake_case.\n */\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Deeply convert all keys in an object from snake_case to camelCase.\n */\nexport function snakeToCamel<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => snakeToCamel(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toCamelCase(key)] = snakeToCamel(value);\n }\n return result as T;\n }\n return obj as T;\n}\n\n/**\n * Deeply convert all keys in an object from camelCase to snake_case.\n */\nexport function camelToSnake<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToSnake(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toSnakeCase(key)] = camelToSnake(value);\n }\n return result as T;\n }\n return obj as T;\n}\n","import type { Tournament, TournamentListParams, QualificationEntry } from \"../types/tournament.js\";\nimport type { LeaderboardEntry } from \"../types/leaderboard.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\n\n/** Normalize tournament: ensure both `id` and `tournamentId` exist */\nfunction normalizeTournament(raw: Record<string, unknown>): Tournament {\n const t = snakeToCamel<Tournament & { id?: string }>(raw);\n // API returns `id`, SDK type uses `tournamentId` — keep both in sync\n const id = t.id ?? t.tournamentId;\n return { ...t, id, tournamentId: id };\n}\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch a paginated list of tournaments.\n */\nexport async function getTournaments(\n baseUrl: string,\n params?: TournamentListParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const qs = buildQueryString({\n game_address: params?.gameAddress,\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n sort: params?.sort,\n from_id: params?.fromId,\n exclude_ids: params?.excludeIds?.join(\",\"),\n whitelisted_extensions: params?.whitelistedExtensions?.join(\",\"),\n include_prizes: params?.includePrizeSummary,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => normalizeTournament(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch a single tournament by ID.\n */\nexport async function getTournament(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Tournament> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}`,\n fetchOpts(ctx),\n );\n return normalizeTournament(result.data);\n}\n\n/**\n * Fetch the leaderboard for a tournament.\n */\nexport async function getTournamentLeaderboard(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<LeaderboardEntry[]> {\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/leaderboard`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<LeaderboardEntry>(item));\n}\n\n/**\n * Fetch registrations for a tournament.\n */\nexport async function getTournamentRegistrations(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<Registration>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/registrations${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<Registration>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prizes for a tournament.\n */\nexport async function getTournamentPrizes(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Prize[]> {\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<Prize>(item));\n}\n\n/**\n * Fetch reward claims for a tournament.\n */\nexport async function getTournamentRewardClaims(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<RewardClaim>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/reward-claims${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<RewardClaim>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch reward claims summary for a tournament.\n */\nexport async function getTournamentRewardClaimsSummary(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<RewardClaimSummary> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}/reward-claims/summary`,\n fetchOpts(ctx),\n );\n return snakeToCamel<RewardClaimSummary>(result.data);\n}\n\n/**\n * Fetch qualifications for a tournament.\n */\nexport async function getTournamentQualifications(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<QualificationEntry>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/qualifications${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<QualificationEntry>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prize aggregation for a tournament.\n */\nexport async function getTournamentPrizeAggregation(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<PrizeAggregation[]> {\n const qs = buildQueryString({ include_aggregation: true });\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes${qs}`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<PrizeAggregation>(item));\n}\n","/**\n * Normalize a Starknet address to a 0x-prefixed, 66-character lowercase hex string.\n */\nexport function normalizeAddress(address: string): string {\n const stripped = address.replace(/^0x0*/i, \"\");\n return (\"0x\" + stripped.padStart(64, \"0\")).toLowerCase();\n}\n","import type { PlayerStats, PlayerTournament, PlayerTournamentParams } from \"../types/player.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { normalizeAddress } from \"../utils/address.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch tournaments for a player.\n */\nexport async function getPlayerTournaments(\n baseUrl: string,\n address: string,\n params?: PlayerTournamentParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<PlayerTournament>> {\n const normalized = normalizeAddress(address);\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n phase: params?.phase,\n game_token_ids: params?.gameTokenIds?.join(\",\"),\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/players/${normalized}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<PlayerTournament>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch stats for a player.\n */\nexport async function getPlayerStats(\n baseUrl: string,\n address: string,\n ctx?: ApiContext,\n): Promise<PlayerStats> {\n const normalized = normalizeAddress(address);\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/players/${normalized}/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlayerStats>(result.data);\n}\n","import type { Tournament, TournamentListParams } from \"../types/tournament.js\";\nimport type { PlatformStats } from \"../types/activity.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { normalizeAddress } from \"../utils/address.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch tournaments for a specific game.\n */\nexport async function getGameTournaments(\n baseUrl: string,\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const normalized = normalizeAddress(gameAddress);\n const qs = buildQueryString({\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/games/${normalized}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<Tournament>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch tournament stats for a specific game.\n */\nexport async function getGameStats(\n baseUrl: string,\n gameAddress: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const normalized = normalizeAddress(gameAddress);\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/games/${normalized}/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n","import type { ActivityEvent, ActivityParams, PlatformStats, PrizeStats } from \"../types/activity.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch activity events with optional filtering.\n */\nexport async function getActivity(\n baseUrl: string,\n params?: ActivityParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<ActivityEvent>> {\n const qs = buildQueryString({\n event_type: params?.eventType,\n tournament_id: params?.tournamentId,\n player_address: params?.playerAddress,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/activity${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<ActivityEvent>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch platform-wide activity stats.\n */\nexport async function getActivityStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n\n/**\n * Fetch platform-wide prize stats.\n */\nexport async function getPrizeStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PrizeStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/prize-stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PrizeStats>(result.data);\n}\n","import type { WSSubscribeOptions, WSEventHandler, WSEventMessage } from \"../types/websocket.js\";\n\ninterface WSManagerConfig {\n maxReconnectAttempts: number;\n reconnectBaseDelay: number;\n}\n\nconst DEFAULT_WS_CONFIG: WSManagerConfig = {\n maxReconnectAttempts: 10,\n reconnectBaseDelay: 1000,\n};\n\n/**\n * WebSocket manager with auto-reconnect and subscription management.\n */\nexport class WSManager {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly config: WSManagerConfig;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private subscriptions = new Map<string, { options: WSSubscribeOptions; handler: WSEventHandler }>();\n private nextSubId = 1;\n private connected = false;\n private connectionListeners = new Set<(connected: boolean) => void>();\n\n constructor(wsUrl: string, config?: Partial<WSManagerConfig>) {\n this.wsUrl = wsUrl;\n this.config = { ...DEFAULT_WS_CONFIG, ...config };\n }\n\n /**\n * Open a WebSocket connection. No-op if already connected.\n */\n connect(): void {\n if (this.ws) return;\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.notifyConnectionChange(true);\n // Re-subscribe all active subscriptions\n for (const [, sub] of this.subscriptions) {\n this.sendSubscribe(sub.options);\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSEventMessage;\n if (message.type === \"event\") {\n for (const [, sub] of this.subscriptions) {\n sub.handler(message);\n }\n }\n } catch {\n // Ignore malformed messages\n }\n };\n\n this.ws.onclose = () => {\n this.connected = false;\n this.notifyConnectionChange(false);\n this.ws = null;\n this.attemptReconnect();\n };\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n };\n } catch {\n this.attemptReconnect();\n }\n }\n\n /**\n * Close the WebSocket connection and stop reconnecting.\n */\n disconnect(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.ws) {\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n }\n this.connected = false;\n this.notifyConnectionChange(false);\n this.reconnectAttempts = 0;\n }\n\n /**\n * Subscribe to channels with an optional tournament filter.\n * Returns an unsubscribe function.\n */\n subscribe(options: WSSubscribeOptions, handler: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n this.subscriptions.set(id, { options, handler });\n\n if (this.connected) {\n this.sendSubscribe(options);\n }\n\n return () => {\n this.subscriptions.delete(id);\n if (this.connected && this.ws) {\n this.ws.send(JSON.stringify({\n type: \"unsubscribe\",\n channels: options.channels,\n }));\n }\n };\n }\n\n /**\n * Register a callback for a single message. Convenience wrapper around subscribe.\n * Returns an unsubscribe function.\n */\n onMessage(callback: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n // Subscribe to all channels by using a passthrough handler\n this.subscriptions.set(id, {\n options: { channels: [] },\n handler: callback,\n });\n\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /**\n * Whether the WebSocket is currently connected.\n */\n get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Register a listener for connection state changes.\n * Returns an unsubscribe function.\n */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionChange(isConnected: boolean): void {\n for (const listener of this.connectionListeners) {\n try {\n listener(isConnected);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n private sendSubscribe(options: WSSubscribeOptions): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n if (options.channels.length === 0) return;\n this.ws.send(JSON.stringify({\n type: \"subscribe\",\n channels: options.channels,\n tournamentIds: options.tournamentIds,\n }));\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) return;\n if (this.subscriptions.size === 0) return;\n\n const delay = this.config.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n\n this.reconnectTimeout = setTimeout(() => {\n this.connect();\n }, Math.min(delay, 30_000));\n }\n}\n","export interface ChainConfig {\n rpcUrl: string;\n apiBaseUrl: string;\n wsUrl: string;\n budokanAddress: string;\n viewerAddress: string;\n}\n\nexport const CHAINS: Record<string, ChainConfig> = {\n mainnet: {\n rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet/rpc/v0_10\",\n apiBaseUrl: \"https://budokan-api-production.up.railway.app\",\n wsUrl: \"wss://budokan-api-production.up.railway.app/ws\",\n budokanAddress: \"0x06137ee50f57d08e1d0d758045e45982e2f5ef4826091ed4db136e7afbafecce\",\n viewerAddress: \"0x075d1b9f1a9751e6b8f8b5a4ca8e721f10c58d87607e703cda062e512a434443\",\n },\n sepolia: {\n rpcUrl: \"https://starknet-sepolia.public.blastapi.io\",\n apiBaseUrl: \"https://budokan-api-sepolia.up.railway.app\",\n wsUrl: \"wss://budokan-api-sepolia.up.railway.app/ws\",\n budokanAddress: \"0x0072a26c29ba5021508bbbb8487663a2a536b8a926acf388d3d772961bd063e0\",\n viewerAddress: \"0x06bef644110a02c1b075b539953c707cd03b4bb32b42f5f1b0b0090b5139529f\",\n },\n} as const;\n\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAINS[chain];\n}\n","export type ConnectionMode = \"api\" | \"rpc-fallback\" | \"offline\";\n\nexport interface ServiceStatus {\n available: boolean;\n lastChecked: number;\n latency: number | null;\n error: string | null;\n}\n\nexport interface ConnectionStatusState {\n api: ServiceStatus;\n rpc: ServiceStatus;\n mode: ConnectionMode;\n initialCheckComplete: boolean;\n}\n\ntype StatusListener = (status: ConnectionStatusState) => void;\n\nexport interface HealthTimingConfig {\n initialCheckDelay?: number;\n checkInterval?: number;\n checkTimeout?: number;\n}\n\nexport class ConnectionStatus {\n private status: ConnectionStatusState = {\n api: { available: true, lastChecked: 0, latency: null, error: null },\n rpc: { available: true, lastChecked: 0, latency: null, error: null },\n mode: \"api\",\n initialCheckComplete: false,\n };\n\n private listeners = new Set<StatusListener>();\n private checkInterval: ReturnType<typeof setInterval> | null = null;\n private initialCheckTimeout: ReturnType<typeof setTimeout> | null = null;\n private apiUrl: string;\n private rpcUrl: string;\n private readonly initialCheckDelay: number;\n private readonly checkIntervalMs: number;\n private readonly checkTimeoutMs: number;\n\n constructor(apiUrl: string, rpcUrl: string, config?: HealthTimingConfig) {\n this.apiUrl = apiUrl;\n this.rpcUrl = rpcUrl;\n this.initialCheckDelay = Math.max(config?.initialCheckDelay ?? 1_000, 100);\n this.checkIntervalMs = Math.max(config?.checkInterval ?? 30_000, 1_000);\n this.checkTimeoutMs = Math.max(config?.checkTimeout ?? 5_000, 1_000);\n }\n\n getStatus(): ConnectionStatusState {\n return { ...this.status };\n }\n\n get mode(): ConnectionMode {\n return this.status.mode;\n }\n\n subscribe(listener: StatusListener): () => void {\n this.listeners.add(listener);\n listener(this.status);\n return () => { this.listeners.delete(listener); };\n }\n\n startMonitoring(): void {\n if (this.checkInterval) return;\n this.initialCheckTimeout = setTimeout(() => {\n this.performHealthCheck();\n this.checkInterval = setInterval(() => this.performHealthCheck(), this.checkIntervalMs);\n }, this.initialCheckDelay);\n }\n\n stopMonitoring(): void {\n if (this.checkInterval) {\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n }\n if (this.initialCheckTimeout) {\n clearTimeout(this.initialCheckTimeout);\n this.initialCheckTimeout = null;\n }\n }\n\n markApiUnavailable(error?: string): void {\n this.updateStatus({\n api: { ...this.status.api, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n markRpcUnavailable(error?: string): void {\n this.updateStatus({\n rpc: { ...this.status.rpc, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n async checkNow(): Promise<void> {\n await this.performHealthCheck();\n }\n\n destroy(): void {\n this.stopMonitoring();\n this.listeners.clear();\n }\n\n private async performHealthCheck(): Promise<void> {\n const [apiResult, rpcResult] = await Promise.all([\n this.checkApi(),\n this.checkRpc(),\n ]);\n this.updateStatus({ api: apiResult, rpc: rpcResult, initialCheckComplete: true });\n }\n\n private async checkApi(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(`${this.apiUrl}/health`, { signal: controller.signal });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isAvailable = data.status === \"healthy\" || data.status === \"degraded\";\n return { available: isAvailable, lastChecked: Date.now(), latency, error: isAvailable ? null : `API status: ${data.status}` };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private async checkRpc(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"starknet_chainId\", params: [], id: 1 }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isHealthy = data.result !== undefined && !data.error;\n return { available: isHealthy, lastChecked: Date.now(), latency, error: isHealthy ? null : \"RPC error\" };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private updateStatus(partial: Partial<ConnectionStatusState>): void {\n const newStatus = { ...this.status, ...partial };\n\n if (newStatus.api.available) {\n newStatus.mode = \"api\";\n } else if (newStatus.rpc.available) {\n newStatus.mode = \"rpc-fallback\";\n } else {\n newStatus.mode = \"offline\";\n }\n\n const changed =\n this.status.api.available !== newStatus.api.available ||\n this.status.rpc.available !== newStatus.rpc.available ||\n this.status.mode !== newStatus.mode ||\n this.status.initialCheckComplete !== newStatus.initialCheckComplete;\n\n this.status = newStatus;\n\n if (changed) {\n this.listeners.forEach((listener) => {\n try { listener(this.status); } catch { /* ignore */ }\n });\n }\n }\n}\n","import type { ConnectionStatus } from \"./health.js\";\nimport { DataSourceError } from \"../errors/index.js\";\n\nexport async function withFallback<T>(\n primary: () => Promise<T>,\n fallback: () => Promise<T>,\n health?: ConnectionStatus,\n): Promise<T> {\n // If health monitoring shows primary source is down, skip it\n if (health) {\n const mode = health.mode;\n if (mode === \"rpc-fallback\") {\n // API is known-down, go straight to RPC fallback\n try {\n return await fallback();\n } catch (fallbackError) {\n throw fallbackError;\n }\n }\n\n if (mode === \"offline\") {\n // Both are known-down, still try both in order\n }\n }\n\n let primaryError: Error;\n try {\n return await primary();\n } catch (error) {\n primaryError = error as Error;\n // Report failure to health service\n if (health) {\n health.markApiUnavailable(primaryError.message);\n }\n }\n\n try {\n return await fallback();\n } catch (fallbackError) {\n if (health) {\n health.markRpcUnavailable((fallbackError as Error).message);\n }\n throw new DataSourceError(primaryError, fallbackError as Error);\n }\n}\n","import type { RpcProvider, Contract, Abi } from \"starknet\";\n\nlet starknetModule: typeof import(\"starknet\") | null = null;\n\nasync function getStarknet(): Promise<typeof import(\"starknet\")> {\n if (!starknetModule) {\n starknetModule = await import(\"starknet\");\n }\n return starknetModule;\n}\n\nexport async function createProvider(rpcUrl: string): Promise<RpcProvider> {\n const { RpcProvider: StarknetRpcProvider } = await getStarknet();\n const provider = new StarknetRpcProvider({ nodeUrl: rpcUrl });\n return provider;\n}\n\nexport async function createContract(\n abi: Abi,\n address: string,\n provider: RpcProvider,\n): Promise<Contract> {\n // Handle case where ABI might be wrapped in a default export\n let resolvedAbi: Abi = abi;\n if (abi && !Array.isArray(abi) && typeof abi === \"object\" && \"default\" in abi) {\n resolvedAbi = (abi as { default: Abi }).default;\n }\n\n const starknet = await getStarknet();\n\n return new starknet.Contract({ abi: resolvedAbi, address, providerOrAccount: provider });\n}\n","import type { Contract } from \"starknet\";\nimport { CairoCustomEnum } from \"starknet\";\nimport type { Tournament } from \"../types/tournament.js\";\nimport type { EntryRequirement, Distribution } from \"@provable-games/metagame-sdk\";\nimport type { LeaderboardEntry } from \"../types/leaderboard.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport type { Phase } from \"../types/tournament.js\";\nimport { RpcError } from \"../errors/index.js\";\nimport { num } from \"starknet\";\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction wrapRpcCall<T>(fn: () => Promise<T>, contractAddress?: string): Promise<T> {\n return fn().catch((error: unknown) => {\n throw new RpcError(\n error instanceof Error ? error.message : \"RPC call failed\",\n contractAddress,\n );\n });\n}\n\nfunction decodeShortString(value: unknown): string {\n if (!value) return \"\";\n const hex = num.toHex(value as bigint);\n if (hex === \"0x0\") return \"\";\n const hexStr = hex.slice(2);\n let result = \"\";\n for (let i = 0; i < hexStr.length; i += 2) {\n const charCode = parseInt(hexStr.slice(i, i + 2), 16);\n if (charCode === 0) break;\n result += String.fromCharCode(charCode);\n }\n return result;\n}\n\nfunction decodeByteArray(value: unknown): string {\n if (!value) return \"\";\n // ByteArray from Cairo is serialized as { data: felt252[], pending_word: felt252, pending_word_len: u32 }\n const obj = value as Record<string, unknown>;\n const data = obj.data as unknown[] | undefined;\n const pendingWord = obj.pending_word;\n const pendingWordLen = Number(obj.pending_word_len ?? 0);\n\n let result = \"\";\n\n // Each data element is a 31-byte chunk encoded as felt252\n if (data) {\n for (const chunk of data) {\n const hex = num.toHex(chunk as bigint).slice(2).padStart(62, \"0\");\n for (let i = 0; i < 62; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n }\n\n // Pending word contains remaining bytes (< 31)\n if (pendingWord && pendingWordLen > 0) {\n const hex = num.toHex(pendingWord as bigint).slice(2).padStart(pendingWordLen * 2, \"0\");\n for (let i = 0; i < pendingWordLen * 2; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n\n return result;\n}\n\n/** All Phase variant names for CairoCustomEnum */\nconst PHASE_VARIANTS = [\"Scheduled\", \"Registration\", \"Staging\", \"Live\", \"Submission\", \"Finalized\"] as const;\n\nconst PHASE_NAME_MAP: Record<Phase, string> = {\n scheduled: \"Scheduled\",\n registration: \"Registration\",\n staging: \"Staging\",\n live: \"Live\",\n submission: \"Submission\",\n finalized: \"Finalized\",\n};\n\n/** Convert SDK Phase string to Cairo enum argument for RPC calls */\nfunction phaseToRpcArg(phase: Phase): CairoCustomEnum {\n const activeVariant = PHASE_NAME_MAP[phase];\n const variants: Record<string, unknown> = {};\n for (const v of PHASE_VARIANTS) {\n variants[v] = v === activeVariant ? {} : undefined;\n }\n return new CairoCustomEnum(variants);\n}\n\n// =========================================================================\n// Parsers — raw on-chain structs → SDK types\n// =========================================================================\n\nfunction parseTournament(\n raw: unknown,\n entryCount: number,\n): Tournament {\n const obj = raw as Record<string, unknown>;\n const id = String(obj.id ?? \"0\");\n const createdAt = Number(obj.created_at ?? 0);\n const createdBy = num.toHex(obj.created_by as bigint);\n const creatorTokenId = obj.creator_token_id ? num.toHex(obj.creator_token_id as bigint) : null;\n\n // Metadata\n const metadata = obj.metadata as Record<string, unknown> | undefined;\n const name = metadata ? decodeShortString(metadata.name) : \"\";\n const description = metadata ? decodeByteArray(metadata.description) : \"\";\n\n // Schedule\n const sched = obj.schedule as Record<string, unknown> | undefined;\n const registrationStartDelay = Number(sched?.registration_start_delay ?? 0);\n const registrationEndDelay = Number(sched?.registration_end_delay ?? 0);\n const gameStartDelay = Number(sched?.game_start_delay ?? 0);\n const gameEndDelay = Number(sched?.game_end_delay ?? 0);\n const submissionDuration = Number(sched?.submission_duration ?? 0);\n\n // Compute absolute timestamps\n const createdAtStr = String(createdAt);\n const registrationStartTime = String(createdAt + registrationStartDelay);\n const registrationEndTime = String(createdAt + registrationEndDelay);\n const gameStartTime = String(createdAt + gameStartDelay);\n const gameEndTime = String(createdAt + gameEndDelay);\n const submissionEndTime = String(createdAt + gameEndDelay + submissionDuration);\n\n // GameConfig\n const gc = obj.game_config as Record<string, unknown> | undefined;\n const gameAddress = gc ? num.toHex(gc.game_address as bigint) : \"\";\n const settingsId = Number(gc?.settings_id ?? 0);\n const soulbound = Boolean(gc?.soulbound);\n const paymaster = Boolean(gc?.paymaster);\n const clientUrl = gc?.client_url ? decodeOptionalByteArray(gc.client_url) : null;\n const renderer = gc?.renderer ? parseOptionalAddress(gc.renderer) : null;\n\n // LeaderboardConfig\n const lc = obj.leaderboard_config as Record<string, unknown> | undefined;\n const ascending = Boolean(lc?.ascending);\n const gameMustBeOver = Boolean(lc?.game_must_be_over);\n\n // EntryFee (Option)\n const entryFeeRaw = parseOption(obj.entry_fee);\n let entryFeeToken: string | null = null;\n let entryFeeAmount: string | null = null;\n let entryFee: Tournament[\"entryFee\"] = null;\n if (entryFeeRaw) {\n const ef = entryFeeRaw as Record<string, unknown>;\n entryFeeToken = num.toHex(ef.token_address as bigint);\n entryFeeAmount = String(ef.amount ?? \"0\");\n entryFee = {\n tokenAddress: entryFeeToken,\n amount: entryFeeAmount,\n tournamentCreatorShare: Number(ef.tournament_creator_share ?? 0),\n gameCreatorShare: Number(ef.game_creator_share ?? 0),\n refundShare: Number(ef.refund_share ?? 0),\n distribution: (ef.distribution as Distribution) ?? null,\n distributionCount: Number(ef.distribution_count ?? 0),\n };\n }\n\n // EntryRequirement (Option)\n const entryRequirement = parseOption(obj.entry_requirement) as EntryRequirement | null;\n const hasEntryRequirement = entryRequirement !== null;\n\n return {\n id,\n tournamentId: id,\n gameAddress,\n createdAt: new Date(createdAt * 1000).toISOString(),\n createdBy,\n creatorTokenId,\n name,\n description,\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n createdAtOnchain: createdAtStr,\n registrationStartTime,\n registrationEndTime,\n gameStartTime,\n gameEndTime,\n submissionEndTime,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n leaderboardAscending: ascending,\n leaderboardGameMustBeOver: gameMustBeOver,\n entryFeeToken,\n entryFeeAmount,\n hasEntryRequirement,\n schedule: {\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n },\n gameConfig: {\n gameAddress,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n },\n entryFee,\n entryRequirement,\n leaderboardConfig: { ascending, gameMustBeOver },\n entryCount,\n prizeCount: 0, // Not available from viewer\n submissionCount: 0, // Not available from viewer\n metadata: null,\n };\n}\n\nfunction parseLeaderboardEntry(raw: unknown): LeaderboardEntry {\n const obj = raw as Record<string, unknown>;\n return {\n position: Number(obj.position ?? 0),\n tokenId: num.toHex(obj.token_id as bigint),\n };\n}\n\nfunction parseRegistration(raw: unknown, tournamentId: string): Registration {\n const obj = raw as Record<string, unknown>;\n return {\n tournamentId,\n gameTokenId: num.toHex(obj.game_token_id as bigint),\n gameAddress: \"\", // Not in on-chain struct\n playerAddress: \"\", // Not in on-chain struct\n entryNumber: Number(obj.entry_id ?? 0),\n hasSubmitted: Boolean(obj.has_submitted),\n isBanned: Boolean(obj.is_banned),\n };\n}\n\nfunction parsePrize(raw: unknown): Prize {\n const obj = raw as Record<string, unknown>;\n const tokenTypeData = obj.token_type as Record<string, unknown> | undefined;\n\n // TokenTypeData is a Cairo enum: { erc20: ERC20Data } or { erc721: ERC721Data }\n let tokenType: \"erc20\" | \"erc721\" = \"erc20\";\n let amount: string | null = null;\n let tokenId: string | null = null;\n let distributionType: string | null = null;\n let distributionWeight: number | null = null;\n let distributionCount: number | null = null;\n let payoutPosition = 0;\n\n if (tokenTypeData) {\n // starknet.js v9 returns CairoCustomEnum with the active variant as a\n // non-undefined property. Check activeVariant() or the property value.\n const activeVariant = typeof tokenTypeData.activeVariant === \"function\"\n ? (tokenTypeData.activeVariant as () => string)()\n : tokenTypeData.erc20 !== undefined ? \"erc20\"\n : tokenTypeData.erc721 !== undefined ? \"erc721\"\n : null;\n\n // starknet.js v9 nests data under .variant.{name} or directly under .{name}\n const variantData = (tokenTypeData as Record<string, unknown>).variant as Record<string, unknown> | undefined;\n const unwrap = (name: string) =>\n (variantData?.[name] ?? tokenTypeData[name]) as Record<string, unknown> | undefined;\n\n if (activeVariant === \"erc20\") {\n const erc20 = unwrap(\"erc20\");\n tokenType = \"erc20\";\n amount = String(erc20?.amount ?? \"0\");\n\n // distribution is Option<Distribution> — unwrap the Option then the enum\n const distOption = erc20?.distribution as Record<string, unknown> | undefined;\n const distInner = distOption?.Some as Record<string, unknown> | undefined;\n if (distInner) {\n // Distribution enum: { variant: { Linear: n } } or { Linear: n }\n const distVariant = (distInner.variant ?? distInner) as Record<string, unknown>;\n const distType = Object.keys(distVariant).find((k) => distVariant[k] !== undefined);\n if (distType) {\n distributionType = distType.toLowerCase();\n const distValue = distVariant[distType];\n distributionWeight = distValue != null ? Number(distValue) : null;\n }\n }\n\n // distribution_count is Option<u32>\n const countOption = erc20?.distribution_count as Record<string, unknown> | undefined;\n distributionCount = countOption?.Some != null ? Number(countOption.Some) : null;\n } else if (activeVariant === \"erc721\") {\n const erc721 = unwrap(\"erc721\");\n tokenType = \"erc721\";\n tokenId = String(erc721?.id ?? \"0\");\n }\n }\n\n return {\n prizeId: String(obj.id ?? \"0\"),\n tournamentId: String(obj.context_id ?? \"0\"),\n payoutPosition,\n tokenAddress: num.toHex(obj.token_address as bigint),\n tokenType,\n amount,\n tokenId,\n distributionType,\n distributionWeight,\n distributionCount,\n sponsorAddress: num.toHex(obj.sponsor_address as bigint),\n };\n}\n\n/** Unwrap a Cairo Option — starknet.js may return { Some: value } / { None: {} } or just the value */\nfunction parseOption(raw: unknown): unknown | null {\n if (raw === undefined || raw === null) return null;\n const obj = raw as Record<string, unknown>;\n if (\"Some\" in obj) return obj.Some;\n if (\"None\" in obj) return null;\n // Some starknet.js versions flatten the option\n return raw;\n}\n\nfunction decodeOptionalByteArray(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n return decodeByteArray(inner);\n}\n\nfunction parseOptionalAddress(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n const hex = num.toHex(inner as bigint);\n return hex === \"0x0\" ? null : hex;\n}\n\n// =========================================================================\n// Viewer functions\n// =========================================================================\n\ninterface TournamentFilterResult {\n tournamentIds: string[];\n total: number;\n}\n\nfunction parseFilterResult(raw: unknown): TournamentFilterResult {\n const obj = raw as Record<string, unknown>;\n const ids = (obj.tournament_ids as unknown[])?.map((v) => String(v)) ?? [];\n const total = Number(obj.total ?? 0);\n return { tournamentIds: ids, total };\n}\n\nfunction parseTournamentFullState(raw: unknown): Tournament {\n const obj = raw as Record<string, unknown>;\n const entryCount = Number(obj.entry_count ?? 0);\n return parseTournament(obj.tournament, entryCount);\n}\n\n// --- Tournament listing ---\n\nexport async function viewerTournaments(\n contract: Contract,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments\", [offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByGame(\n contract: Contract,\n gameAddress: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_game\", [gameAddress, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByCreator(\n contract: Contract,\n creator: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_creator\", [creator, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\n/**\n * Map a single SDK phase to the group of on-chain phases it represents.\n * \"scheduled\" includes Scheduled + Registration + Staging (all pre-game).\n * \"live\" includes Live + Submission (active gameplay).\n * \"finalized\" stays as-is.\n */\nconst PHASE_GROUPS: Record<Phase, Phase[]> = {\n scheduled: [\"scheduled\", \"registration\", \"staging\"],\n registration: [\"registration\"],\n staging: [\"staging\"],\n live: [\"live\", \"submission\"],\n submission: [\"submission\"],\n finalized: [\"finalized\"],\n};\n\nexport async function viewerTournamentsByPhase(\n contract: Contract,\n phase: Phase,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n const phases = PHASE_GROUPS[phase];\n if (phases.length === 1) {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_phase\", [phaseToRpcArg(phase), offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n }\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_phases\", [phases.map(phaseToRpcArg), offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\n// --- Tournament detail ---\n\nexport async function viewerTournamentDetail(\n contract: Contract,\n tournamentId: string,\n): Promise<Tournament> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_detail\", [tournamentId]);\n return parseTournamentFullState(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsBatch(\n contract: Contract,\n tournamentIds: string[],\n): Promise<Tournament[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_batch\", [tournamentIds]);\n return (result as unknown[]).map(parseTournamentFullState);\n }, contract.address);\n}\n\n// --- Registrations ---\n\nexport async function viewerRegistrations(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<PaginatedResult<Registration>> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_registrations\", [tournamentId, offset, limit]);\n const obj = result as Record<string, unknown>;\n const entries = (obj.entries as unknown[]) ?? [];\n const total = Number(obj.total ?? 0);\n return {\n data: entries.map((e) => parseRegistration(e, tournamentId)),\n total,\n limit,\n offset,\n };\n }, contract.address);\n}\n\n// --- Leaderboard ---\n\nexport async function viewerLeaderboard(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<LeaderboardEntry[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"leaderboard\", [tournamentId, offset, limit]);\n return (result as unknown[]).map(parseLeaderboardEntry);\n }, contract.address);\n}\n\n// --- Prizes ---\n\nexport async function viewerPrizes(\n contract: Contract,\n tournamentId: string,\n): Promise<Prize[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_prizes\", [tournamentId]);\n return (result as unknown[]).map(parsePrize);\n }, contract.address);\n}\n\n// --- Reward Claims ---\n\nexport interface ViewerRewardClaim {\n rewardType: Record<string, unknown>;\n claimed: boolean;\n}\n\nexport interface ViewerRewardClaimResult {\n claims: ViewerRewardClaim[];\n total: number;\n totalClaimed: number;\n totalUnclaimed: number;\n}\n\nexport async function viewerRewardClaims(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<ViewerRewardClaimResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_reward_claims\", [tournamentId, offset, limit]);\n const obj = result as Record<string, unknown>;\n const claims = (obj.claims as unknown[])?.map((raw) => {\n const claim = raw as Record<string, unknown>;\n return {\n rewardType: claim.reward_type as Record<string, unknown>,\n claimed: Boolean(claim.claimed),\n };\n }) ?? [];\n return {\n claims,\n total: Number(obj.total ?? 0),\n totalClaimed: Number(obj.total_claimed ?? 0),\n totalUnclaimed: Number(obj.total_unclaimed ?? 0),\n };\n }, contract.address);\n}\n\n// --- Player Tournaments ---\n\nexport async function viewerPlayerTournaments(\n contract: Contract,\n playerAddress: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"player_tournaments\", [playerAddress, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n","[\n {\n \"type\": \"impl\",\n \"name\": \"UpgradeableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"upgrade\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanViewerImpl\",\n \"interface_name\": \"budokan_interfaces::viewer::IBudokanViewer\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFilterResult\",\n \"members\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u64\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::Phase\",\n \"variants\": [\n {\n \"name\": \"Scheduled\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Registration\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Staging\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Live\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Submission\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Finalized\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::byte_array::ByteArray\",\n \"members\": [\n {\n \"name\": \"data\",\n \"type\": \"core::array::Array::<core::bytes_31::bytes31>\"\n },\n {\n \"name\": \"pending_word\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"pending_word_len\",\n \"type\": \"core::internal::bounded_int::BoundedInt::<0, 30>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Metadata\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Schedule\",\n \"members\": [\n {\n \"name\": \"registration_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"registration_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"submission_duration\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::bool\",\n \"variants\": [\n {\n \"name\": \"False\",\n \"type\": \"()\"\n },\n {\n \"name\": \"True\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::GameConfig\",\n \"members\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"settings_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"soulbound\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"paymaster\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::integer::u16>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::distribution::Distribution\",\n \"variants\": [\n {\n \"name\": \"Linear\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Exponential\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Uniform\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Custom\",\n \"type\": \"core::array::Span::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::EntryFee\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"tournament_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<budokan_interfaces::budokan::EntryFee>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"budokan_interfaces::budokan::EntryFee\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::felt252>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"metagame_extensions_interfaces::extension::ExtensionConfig\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirementType\",\n \"variants\": [\n {\n \"name\": \"token\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirement\",\n \"members\": [\n {\n \"name\": \"entry_limit\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"entry_requirement_type\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirementType\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirement\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::LeaderboardConfig\",\n \"members\": [\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_must_be_over\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Tournament\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_at\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFee>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFullState\",\n \"members\": [\n {\n \"name\": \"tournament\",\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::registration::Registration\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RegistrationResult\",\n \"members\": [\n {\n \"name\": \"entries\",\n \"type\": \"core::array::Array::<game_components_interfaces::registration::Registration>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::LeaderboardEntryView\",\n \"members\": [\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u32>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC20Data\",\n \"members\": [\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC721Data\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::TokenTypeData\",\n \"variants\": [\n {\n \"name\": \"erc20\",\n \"type\": \"game_components_interfaces::prize::ERC20Data\"\n },\n {\n \"name\": \"erc721\",\n \"type\": \"game_components_interfaces::prize::ERC721Data\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::PrizeData\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"token_type\",\n \"type\": \"game_components_interfaces::prize::TokenTypeData\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::PrizeType\",\n \"variants\": [\n {\n \"name\": \"Single\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"Distributed\",\n \"type\": \"(core::integer::u64, core::integer::u32)\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeRewardType\",\n \"variants\": [\n {\n \"name\": \"Position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"TournamentCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"GameCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Refund\",\n \"type\": \"core::felt252\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::RewardType\",\n \"variants\": [\n {\n \"name\": \"Prize\",\n \"type\": \"game_components_interfaces::prize::PrizeType\"\n },\n {\n \"name\": \"EntryFee\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeRewardType\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RewardClaimView\",\n \"members\": [\n {\n \"name\": \"reward_type\",\n \"type\": \"budokan_interfaces::budokan::RewardType\"\n },\n {\n \"name\": \"claimed\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RewardClaimResult\",\n \"members\": [\n {\n \"name\": \"claims\",\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::RewardClaimView>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"total_claimed\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"total_unclaimed\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan_interfaces::viewer::IBudokanViewer\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"tournaments\",\n \"inputs\": [\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_phases\",\n \"inputs\": [\n {\n \"name\": \"phases\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::Phase>\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_phases\",\n \"inputs\": [\n {\n \"name\": \"phases\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::Phase>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_detail\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFullState\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_batch\",\n \"inputs\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::TournamentFullState>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"leaderboard\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::LeaderboardEntryView>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_prizes\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::prize::PrizeData>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_reward_claims\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RewardClaimResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"player_tournaments\",\n \"inputs\": [\n {\n \"name\": \"player_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"owner\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"transfer_ownership\",\n \"inputs\": [\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounce_ownership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableCamelOnlyImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"transferOwnership\",\n \"inputs\": [\n {\n \"name\": \"newOwner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounceOwnership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"constructor\",\n \"name\": \"constructor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"budokan_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnershipTransferred\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Upgraded\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan_viewer::budokan_viewer::BudokanViewer::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnableEvent\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"UpgradeableEvent\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"flat\"\n }\n ]\n }\n]","import type { RpcProvider, Contract, Abi } from \"starknet\";\nimport type { BudokanClientConfig } from \"./types/config.js\";\nimport type { Tournament, TournamentListParams } from \"./types/tournament.js\";\nimport type { LeaderboardEntry } from \"./types/leaderboard.js\";\nimport type { Registration } from \"./types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"./types/prize.js\";\nimport type { PlayerStats, PlayerTournament, PlayerTournamentParams } from \"./types/player.js\";\nimport type { ActivityEvent, ActivityParams, PlatformStats, PrizeStats } from \"./types/activity.js\";\nimport type { QualificationEntry } from \"./types/tournament.js\";\nimport type { PaginatedResult } from \"./types/common.js\";\nimport type { WSChannel, WSEventHandler } from \"./types/websocket.js\";\nimport type { ConnectionStatusState } from \"./datasource/health.js\";\n\nimport {\n getTournaments as apiGetTournaments,\n getTournament as apiGetTournament,\n getTournamentLeaderboard as apiGetTournamentLeaderboard,\n getTournamentRegistrations as apiGetTournamentRegistrations,\n getTournamentPrizes as apiGetTournamentPrizes,\n getTournamentRewardClaims as apiGetTournamentRewardClaims,\n getTournamentRewardClaimsSummary as apiGetTournamentRewardClaimsSummary,\n getTournamentQualifications as apiGetTournamentQualifications,\n getTournamentPrizeAggregation as apiGetTournamentPrizeAggregation,\n} from \"./api/tournaments.js\";\nimport {\n getPlayerTournaments as apiGetPlayerTournaments,\n getPlayerStats as apiGetPlayerStats,\n} from \"./api/players.js\";\nimport {\n getGameTournaments as apiGetGameTournaments,\n getGameStats as apiGetGameStats,\n} from \"./api/games.js\";\nimport {\n getActivity as apiGetActivity,\n getActivityStats as apiGetActivityStats,\n getPrizeStats as apiGetPrizeStats,\n} from \"./api/activity.js\";\nimport { WSManager } from \"./ws/manager.js\";\nimport { getChainConfig } from \"./chains/constants.js\";\nimport { ConnectionStatus } from \"./datasource/health.js\";\nimport { withFallback } from \"./datasource/resolver.js\";\nimport { RpcError } from \"./errors/index.js\";\nimport { createProvider, createContract } from \"./rpc/provider.js\";\nimport {\n viewerTournaments,\n viewerTournamentsByGame,\n viewerTournamentsByCreator,\n viewerTournamentsByPhase,\n viewerTournamentDetail,\n viewerTournamentsBatch,\n viewerRegistrations,\n viewerLeaderboard,\n viewerPrizes,\n viewerRewardClaims,\n viewerPlayerTournaments,\n} from \"./rpc/viewer.js\";\n\nimport viewerAbi from \"./rpc/abis/budokanViewer.json\";\n\n/** Resolved config with all defaults applied */\ninterface ResolvedConfig extends BudokanClientConfig {\n rpcUrl: string;\n viewerAddress: string;\n budokanAddress: string;\n}\n\n/**\n * Main client for interacting with the Budokan tournament system.\n *\n * Provides methods for querying tournaments, registrations, leaderboards,\n * prizes, player stats, and activity events. Supports real-time updates\n * via WebSocket subscriptions and automatic RPC fallback when the API is\n * unavailable.\n *\n * @example\n * ```ts\n * // API-only (default, backward compatible)\n * const client = new BudokanClient({\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * });\n *\n * // With RPC fallback\n * const client = new BudokanClient({\n * chain: \"mainnet\",\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * viewerAddress: \"0x...\",\n * });\n *\n * // RPC-only (bypass API entirely)\n * const client = new BudokanClient({\n * primarySource: \"rpc\",\n * rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet/rpc/v0_10\",\n * viewerAddress: \"0x...\",\n * });\n * ```\n */\nexport class BudokanClient {\n private readonly resolvedConfig: ResolvedConfig;\n private readonly wsManager: WSManager;\n private readonly connectionStatus: ConnectionStatus;\n private cachedProvider: RpcProvider | null = null;\n private cachedViewerContract: Contract | null = null;\n\n constructor(config: BudokanClientConfig) {\n // Merge user config with chain defaults\n const chainConfig = config.chain ? getChainConfig(config.chain) : undefined;\n this.resolvedConfig = {\n ...config,\n apiBaseUrl: config.apiBaseUrl ?? chainConfig?.apiBaseUrl ?? \"\",\n rpcUrl: config.rpcUrl ?? chainConfig?.rpcUrl ?? \"\",\n viewerAddress: config.viewerAddress ?? chainConfig?.viewerAddress ?? \"\",\n budokanAddress: config.budokanAddress ?? chainConfig?.budokanAddress ?? \"\",\n };\n\n const wsUrl = config.wsUrl ?? chainConfig?.wsUrl\n ?? this.resolvedConfig.apiBaseUrl.replace(/^http/, \"ws\").replace(/\\/$/, \"\") + \"/ws\";\n this.wsManager = new WSManager(wsUrl);\n\n this.connectionStatus = new ConnectionStatus(\n this.resolvedConfig.apiBaseUrl,\n this.resolvedConfig.rpcUrl,\n config.health,\n );\n\n // Start health monitoring if both sources are configured\n if (this.resolvedConfig.apiBaseUrl && this.resolvedConfig.rpcUrl) {\n this.connectionStatus.startMonitoring();\n }\n }\n\n // ---- Configuration ----\n\n /** Returns the resolved configuration. */\n get clientConfig(): BudokanClientConfig {\n return { ...this.resolvedConfig };\n }\n\n /** Whether the WebSocket is currently connected. */\n get wsConnected(): boolean {\n return this.wsManager.isConnected;\n }\n\n // ---- Connection status ----\n\n /** Returns the current connection status (API, RPC, mode). */\n getConnectionStatus(): ConnectionStatusState {\n return this.connectionStatus.getStatus();\n }\n\n /** Subscribe to connection status changes. Returns an unsubscribe function. */\n onConnectionStatusChange(listener: (status: ConnectionStatusState) => void): () => void {\n return this.connectionStatus.subscribe(listener);\n }\n\n // ---- Lazy RPC getters ----\n\n private async getProvider(): Promise<RpcProvider> {\n if (this.cachedProvider) return this.cachedProvider;\n if (!this.resolvedConfig.rpcUrl) {\n throw new RpcError(\"No rpcUrl configured\");\n }\n if (this.resolvedConfig.provider) {\n this.cachedProvider = this.resolvedConfig.provider;\n return this.cachedProvider;\n }\n this.cachedProvider = await createProvider(this.resolvedConfig.rpcUrl);\n return this.cachedProvider;\n }\n\n private async getViewerContract(): Promise<Contract> {\n if (this.cachedViewerContract) return this.cachedViewerContract;\n if (!this.resolvedConfig.viewerAddress) {\n throw new RpcError(\"No viewerAddress configured. Set viewerAddress in config or use a chain preset with a deployed viewer contract.\");\n }\n const provider = await this.getProvider();\n this.cachedViewerContract = await createContract(\n viewerAbi as Abi,\n this.resolvedConfig.viewerAddress,\n provider,\n );\n return this.cachedViewerContract;\n }\n\n // ---- API context ----\n\n private get apiCtx() {\n return {\n retryAttempts: this.resolvedConfig.retryAttempts,\n retryDelay: this.resolvedConfig.retryDelay,\n timeout: this.resolvedConfig.timeout,\n };\n }\n\n // ---- Tournament Queries ----\n\n /**\n * Fetch a paginated list of tournaments with optional filtering.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournaments(params?: TournamentListParams): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n\n // Choose the appropriate viewer filter function\n let filterResult: { tournamentIds: string[]; total: number };\n if (params?.phase) {\n filterResult = await viewerTournamentsByPhase(contract, params.phase, offset, limit);\n } else if (params?.gameAddress) {\n filterResult = await viewerTournamentsByGame(contract, params.gameAddress, offset, limit);\n } else if (params?.creator) {\n filterResult = await viewerTournamentsByCreator(contract, params.creator, offset, limit);\n } else {\n filterResult = await viewerTournaments(contract, offset, limit);\n }\n\n // Batch-fetch full tournament data for the returned IDs\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n\n // Fetch prize aggregation if requested\n if (params?.includePrizeSummary) {\n const prizePromises = data.map((t) =>\n viewerPrizes(contract, t.id).catch(() => [] as Prize[]),\n );\n const allPrizes = await Promise.all(prizePromises);\n data = data.map((t, i) => {\n const prizes = allPrizes[i];\n if (prizes.length === 0) return t;\n // Build aggregation by token\n const tokenMap = new Map<string, { tokenAddress: string; tokenType: string; totalAmount: bigint; nftCount: number }>();\n for (const p of prizes) {\n const key = p.tokenAddress;\n const existing = tokenMap.get(key);\n if (existing) {\n existing.totalAmount += BigInt(p.amount ?? \"0\");\n if (p.tokenType === \"erc721\") existing.nftCount += 1;\n } else {\n tokenMap.set(key, {\n tokenAddress: p.tokenAddress,\n tokenType: p.tokenType,\n totalAmount: BigInt(p.amount ?? \"0\"),\n nftCount: p.tokenType === \"erc721\" ? 1 : 0,\n });\n }\n }\n return {\n ...t,\n prizeAggregation: Array.from(tokenMap.values()).map((v) => ({\n tokenAddress: v.tokenAddress,\n tokenType: v.tokenType,\n totalAmount: v.totalAmount.toString(),\n nftCount: v.nftCount,\n })),\n };\n });\n }\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournaments(this.resolvedConfig.apiBaseUrl, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch a single tournament by its ID.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournament(tournamentId: string): Promise<Tournament> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n return viewerTournamentDetail(contract, tournamentId);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournament(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch the leaderboard for a tournament.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournamentLeaderboard(tournamentId: string): Promise<LeaderboardEntry[]> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n // Fetch a large page; on-chain leaderboards are typically small\n return viewerLeaderboard(contract, tournamentId, 0, 1000);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentLeaderboard(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch registrations for a tournament.\n * Supports RPC fallback when API is unavailable.\n * Note: In RPC mode, `playerAddress` and `gameAddress` fields will be empty strings.\n */\n async getTournamentRegistrations(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<Registration>> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n return viewerRegistrations(contract, tournamentId, offset, limit);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRegistrations(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch prizes for a tournament.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournamentPrizes(tournamentId: string): Promise<Prize[]> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n return viewerPrizes(contract, tournamentId);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentPrizes(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n // ---- Player Queries (API-only, no on-chain equivalent) ----\n\n /**\n * Fetch tournaments that a player has registered for.\n * Supports RPC fallback via viewer contract.\n */\n async getPlayerTournaments(\n address: string,\n params?: PlayerTournamentParams,\n ): Promise<PaginatedResult<PlayerTournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<PlayerTournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n const filterResult = await viewerPlayerTournaments(contract, address, offset, limit);\n\n let data: PlayerTournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n const tournaments = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n data = tournaments.map((t) => ({\n ...t,\n tournamentId: t.id,\n })) as unknown as PlayerTournament[];\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetPlayerTournaments(this.resolvedConfig.apiBaseUrl, address, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch stats for a player.\n * API-only — no RPC fallback available.\n */\n async getPlayerStats(address: string): Promise<PlayerStats> {\n return apiGetPlayerStats(this.resolvedConfig.apiBaseUrl, address, this.apiCtx);\n }\n\n // ---- Game Queries ----\n\n /**\n * Fetch tournaments for a specific game.\n * Supports RPC fallback when API is unavailable.\n */\n async getGameTournaments(\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n const filterResult = await viewerTournamentsByGame(contract, gameAddress, offset, limit);\n\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetGameTournaments(this.resolvedConfig.apiBaseUrl, gameAddress, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch tournament stats for a specific game.\n * API-only — no RPC fallback available.\n */\n async getGameStats(gameAddress: string): Promise<PlatformStats> {\n return apiGetGameStats(this.resolvedConfig.apiBaseUrl, gameAddress, this.apiCtx);\n }\n\n // ---- Reward Claims & Qualifications ----\n\n /**\n * Fetch reward claims for a tournament.\n * Supports RPC fallback via viewer contract.\n */\n async getTournamentRewardClaims(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<RewardClaim>> {\n const rpcFallback = async (): Promise<PaginatedResult<RewardClaim>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 100;\n const result = await viewerRewardClaims(contract, tournamentId, offset, limit);\n const data: RewardClaim[] = result.claims.map((c) => ({\n tournamentId,\n rewardType: c.rewardType as RewardClaim[\"rewardType\"],\n claimed: c.claimed,\n }));\n return { data, total: result.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRewardClaims(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch reward claims summary for a tournament.\n * Supports RPC fallback via viewer contract.\n */\n async getTournamentRewardClaimsSummary(tournamentId: string): Promise<RewardClaimSummary> {\n const rpcFallback = async (): Promise<RewardClaimSummary> => {\n const contract = await this.getViewerContract();\n const result = await viewerRewardClaims(contract, tournamentId, 0, 0);\n return {\n totalPrizes: result.total,\n totalClaimed: result.totalClaimed,\n totalUnclaimed: result.totalUnclaimed,\n };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRewardClaimsSummary(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch qualifications for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentQualifications(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<QualificationEntry>> {\n return apiGetTournamentQualifications(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx);\n }\n\n /**\n * Fetch prize aggregation for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentPrizeAggregation(tournamentId: string): Promise<PrizeAggregation[]> {\n return apiGetTournamentPrizeAggregation(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx);\n }\n\n // ---- Activity Queries (API-only, activity is indexed) ----\n\n /**\n * Fetch activity events with optional filtering.\n * API-only — no RPC fallback available.\n */\n async getActivity(params?: ActivityParams): Promise<PaginatedResult<ActivityEvent>> {\n return apiGetActivity(this.resolvedConfig.apiBaseUrl, params, this.apiCtx);\n }\n\n /**\n * Fetch platform-wide activity stats.\n * API-only — no RPC fallback available.\n */\n async getActivityStats(): Promise<PlatformStats> {\n return apiGetActivityStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n /**\n * Fetch platform-wide prize stats.\n * API-only — no RPC fallback available.\n */\n async getPrizeStats(): Promise<PrizeStats> {\n return apiGetPrizeStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n // ---- WebSocket ----\n\n /**\n * Open a WebSocket connection for real-time updates.\n */\n connect(): void {\n this.wsManager.connect();\n }\n\n /**\n * Close the WebSocket connection.\n */\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n /**\n * Stop health monitoring and close all connections.\n */\n destroy(): void {\n this.connectionStatus.destroy();\n this.wsManager.disconnect();\n }\n\n /**\n * Subscribe to WebSocket channels with optional tournament filtering.\n * Returns an unsubscribe function.\n */\n subscribe(\n channels: WSChannel[],\n handler: WSEventHandler,\n tournamentIds?: string[],\n ): () => void {\n return this.wsManager.subscribe({ channels, tournamentIds }, handler);\n }\n\n /**\n * Register a listener for WebSocket connection state changes.\n * Returns an unsubscribe function.\n */\n onWsConnectionChange(listener: (connected: boolean) => void): () => void {\n return this.wsManager.onConnectionChange(listener);\n }\n}\n\n/**\n * Factory function for creating a BudokanClient instance.\n */\nexport function createBudokanClient(config: BudokanClientConfig): BudokanClient {\n return new BudokanClient(config);\n}\n"]}
|