{"version":3,"sources":["../src/polyfill.ts","../src/constants.ts","../src/errors.ts","../src/client.ts","../src/storage.ts","../src/provider.tsx","../src/ui/theme.ts","../src/managed-wallet.tsx","../src/wallet/mwa-adapter.ts","../src/wallet/phantom-deeplink/phantom-deeplink-adapter.ts","../src/wallet/phantom-deeplink/crypto.ts","../src/wallet/phantom-deeplink/deeplink-handler.ts","../src/ui/ConnectWalletScreen.tsx","../src/ui/AuthGate.tsx","../src/hooks/useEvents.ts","../src/hooks/useGame.ts","../src/hooks/useGames.ts","../src/hooks/useNetworkGames.ts","../src/hooks/useCreateGame.ts","../src/utils/transaction.ts","../src/hooks/useCredits.ts","../src/hooks/useJoinGame.ts","../src/hooks/useClaim.ts","../src/hooks/useCreateCustomGame.ts","../src/hooks/useHasClaimed.ts","../src/hooks/useAuth.ts","../src/auth-context.ts","../src/utils/device.ts","../src/utils/avatarUrl.ts","../src/hooks/useUFCFightCard.ts","../src/hooks/useUFCFighterDetail.ts","../src/hooks/useHighlights.ts","../src/hooks/useShorts.ts","../src/hooks/usePushNotifications.ts","../src/hooks/useArcadePools.ts","../src/hooks/useArcadePool.ts","../src/hooks/useArcadeGame.ts","../src/hooks/useEnterArcadePool.ts","../src/hooks/useArcadeCountdown.ts","../src/hooks/useArcadeBridge.ts","../src/hooks/useJackpot.ts","../src/hooks/useJackpotHistory.ts","../src/hooks/useEnterJackpot.ts","../src/ui/AvatarEditor.tsx","../src/ui/ConnectWalletButton.tsx","../src/ui/UserProfileCard.tsx","../src/ui/SettingsSheet.tsx","../src/ui/UserProfileSheet.tsx","../src/ui/game/GamePoster.tsx","../src/ui/game/LivePoolsCard.tsx","../src/ui/game/PickWinnerCard.tsx","../src/ui/game/PlayersCard.tsx","../src/ui/game/JoinGameButton.tsx","../src/ui/game/CreateCustomGameSheet.tsx","../src/ui/game/JoinGameSheet.tsx","../src/ui/game/SolSlider.tsx","../src/ui/game/TeamButton.tsx","../src/ui/game/ClaimPrizeSheet.tsx","../src/ui/game/ClaimButton.tsx","../src/ui/game/EnterArcadePoolSheet.tsx","../src/ui/game/ArcadeLeaderboardSheet.tsx","../src/ui/game/CreateGameSheet.tsx","../src/ui/jackpot/JackpotCard.tsx","../src/ui/jackpot/JackpotSheet.tsx","../src/ui/jackpot/JackpotWidget.tsx","../src/chat/provider.tsx","../src/chat/socket.ts","../src/chat/hooks.ts"],"sourcesContent":["/**\n * Polyfill crypto.getRandomValues for React Native environments.\n *\n * This runs once at SDK import time, before tweetnacl, @solana/web3.js,\n * uuid, jayson, or any other dependency tries to use crypto.\n *\n * Must be imported as the very first line in src/index.ts.\n */\nimport { getRandomValues } from 'expo-crypto';\n\nif (typeof global !== 'undefined') {\n  if (typeof global.crypto !== 'object') {\n    (global as any).crypto = {};\n  }\n  if (typeof global.crypto.getRandomValues !== 'function') {\n    (global.crypto as any).getRandomValues = getRandomValues;\n  }\n}\n\n// Also polyfill `self` so tweetnacl's init finds crypto via self.crypto\nif (typeof self === 'undefined' && typeof globalThis !== 'undefined') {\n  (globalThis as any).self = globalThis;\n}\n","export const DEFAULT_BASE_URL = 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1';\n\nexport const DEFAULT_RPC_URL = 'https://api.mainnet-beta.solana.com';\n\nexport type DubsNetwork = 'devnet' | 'mainnet-beta';\n\nexport const NETWORK_CONFIG: Record<DubsNetwork, { baseUrl: string; rpcUrl: string; cluster: string }> = {\n  'mainnet-beta': {\n    baseUrl: DEFAULT_BASE_URL,\n    rpcUrl: DEFAULT_RPC_URL,\n    cluster: 'mainnet-beta',\n  },\n  devnet: {\n    baseUrl: DEFAULT_BASE_URL,\n    rpcUrl: 'https://api.devnet.solana.com',\n    cluster: 'devnet',\n  },\n};\n","import type { ParsedError, SolanaErrorCode } from './types';\n\nexport class DubsApiError extends Error {\n  public readonly code: string;\n  public readonly httpStatus: number;\n\n  constructor(code: string, message: string, httpStatus: number) {\n    super(message);\n    this.name = 'DubsApiError';\n    this.code = code;\n    this.httpStatus = httpStatus;\n  }\n}\n\n/** Custom error codes from dubs_solana_program (6000-6049) */\nexport const SOLANA_PROGRAM_ERRORS: Record<number, SolanaErrorCode> = {\n  6000: { code: 'invalid_amount', message: 'Amount must be greater than 0' },\n  6001: { code: 'invalid_max_players', message: 'Max players must be between 1 and 20' },\n  6002: { code: 'game_not_active', message: 'Game is not active' },\n  6003: { code: 'game_full', message: 'Game is full' },\n  6004: { code: 'player_already_joined', message: 'Player has already joined this game' },\n  6005: { code: 'insufficient_funds', message: 'Insufficient funds in pot' },\n  6006: { code: 'unauthorized', message: 'Only the game creator can perform this action' },\n  6007: { code: 'invalid_winner_index', message: 'Invalid winner index' },\n  6008: { code: 'game_still_active', message: 'Game is still active — must close before resetting' },\n  6009: { code: 'pot_not_empty', message: 'Pot must be empty before resetting — distribute winnings first' },\n  6010: { code: 'no_winners_specified', message: 'At least one winner must be specified' },\n  6011: { code: 'mismatched_winners_percentages', message: 'Number of winners must match number of percentages' },\n  6012: { code: 'percentages_invalid', message: 'Percentages must sum to exactly 100' },\n  6013: { code: 'winner_account_mismatch', message: 'Winner account does not match expected player' },\n  6014: { code: 'invalid_operator_fee', message: 'Operator fee must be between 0 and 100' },\n  6015: { code: 'operator_wallet_mismatch', message: 'Operator wallet does not match game settings' },\n  6016: { code: 'winner_not_in_game', message: 'Winner address is not a player in this game' },\n  6017: { code: 'voting_not_enabled', message: 'Voting is not enabled for this game' },\n  6018: { code: 'voter_not_in_game', message: 'Voter is not a player in this game' },\n  6019: { code: 'voted_for_not_in_game', message: 'Cannot vote for someone who is not in the game' },\n  6020: { code: 'voting_incomplete', message: 'Voting incomplete — need majority of players to vote' },\n  6021: { code: 'invalid_referee_commission', message: 'Referee commission must be between 0 and 100' },\n  6022: { code: 'total_fees_exceed_100', message: 'Total fees (operator + referee) cannot exceed 100%' },\n  6023: { code: 'referee_mode_requires_referee', message: 'Referee mode requires a referee address' },\n  6024: { code: 'referee_must_earn_commission', message: 'Referee must earn commission' },\n  6025: { code: 'referee_cannot_be_player', message: 'Referee cannot join as a player (conflict of interest)' },\n  6026: { code: 'only_referee_can_vote', message: 'Only the referee can vote in Referee mode' },\n  6027: { code: 'referee_account_mismatch', message: 'Referee account does not match game settings' },\n  6028: { code: 'invalid_lock_time', message: 'Lock time must be in the future' },\n  6029: { code: 'game_locked', message: 'Game is locked — no more players can join' },\n  6030: { code: 'lock_time_passed', message: 'Lock time has passed — game is now locked' },\n  6031: { code: 'unauthorized_oracle', message: 'Only authorized oracle can resolve this game' },\n  6032: { code: 'game_not_locked', message: 'Game must be locked before it can be resolved' },\n  6033: { code: 'already_resolved', message: 'Game has already been resolved' },\n  6034: { code: 'game_not_resolved', message: 'Game has not been resolved yet' },\n  6035: { code: 'player_not_in_game', message: 'Player is not in this game' },\n  6036: { code: 'not_a_winner', message: 'Player did not win this game' },\n  6037: { code: 'invalid_game_mode', message: 'Invalid game mode for this operation' },\n  6038: { code: 'already_claimed', message: 'Player has already claimed their winnings' },\n  6039: { code: 'lock_time_too_soon', message: 'Lock time must be at least 2 minutes in the future' },\n  6040: { code: 'operator_account_missing', message: 'Operator account must be provided' },\n  6041: { code: 'no_winners_to_distribute', message: 'No winners to distribute funds to' },\n  6042: { code: 'insufficient_funds_for_rent', message: 'Insufficient funds to maintain rent exemption' },\n  6043: { code: 'cannot_resolve_before_lock', message: 'Cannot resolve game before lock time has passed' },\n  6044: { code: 'emergency_refund_not_available', message: 'Emergency refund not available yet — must wait 7 days after lock time' },\n  6045: { code: 'sponsor_account_missing', message: 'Sponsor account must be provided for tie refund' },\n  6046: { code: 'sponsor_wallet_mismatch', message: 'Sponsor wallet does not match stored sponsor' },\n  6047: { code: 'invalid_bet_amount', message: 'Bet amount must be greater than zero' },\n  6048: { code: 'no_survivors_to_distribute', message: 'No survivors to distribute winnings to' },\n  6049: { code: 'too_many_survivors', message: 'Too many survivors (max 50 per batch)' },\n};\n\n/** Known Solana built-in instruction errors */\nconst SOLANA_BUILTIN_ERRORS: Record<number, SolanaErrorCode> = {\n  0: { code: 'generic_error', message: 'Generic instruction error' },\n  1: { code: 'invalid_argument', message: 'Invalid argument passed to program' },\n  2: { code: 'invalid_instruction_data', message: 'Invalid instruction data' },\n  3: { code: 'invalid_account_data', message: 'Invalid account data' },\n  4: { code: 'account_data_too_small', message: 'Account data too small' },\n  5: { code: 'insufficient_funds', message: 'Insufficient funds for transaction' },\n  6: { code: 'incorrect_program_id', message: 'Incorrect program ID' },\n  7: { code: 'missing_required_signature', message: 'Missing required signature' },\n  8: { code: 'account_already_initialized', message: 'Account already initialized' },\n  9: { code: 'uninitialized_account', message: 'Attempt to operate on uninitialized account' },\n};\n\n/**\n * Parse a raw Solana transaction error into a human-readable { code, message }.\n * Handles: { InstructionError: [idx, { Custom: N }] }, string errors, etc.\n */\nexport function parseSolanaError(err: unknown): ParsedError {\n  if (!err) return { code: 'unknown_error', message: 'Unknown transaction error' };\n\n  let parsed = err;\n\n  if (typeof parsed === 'string') {\n    try {\n      const jsonMatch = parsed.match(/\\{.*\\}/s);\n      if (jsonMatch) parsed = JSON.parse(jsonMatch[0]);\n      else return { code: 'transaction_failed', message: parsed };\n    } catch {\n      return { code: 'transaction_failed', message: parsed as string };\n    }\n  }\n\n  if (typeof parsed === 'object' && parsed !== null && 'InstructionError' in parsed) {\n    const [ixIndex, details] = (parsed as { InstructionError: [number, unknown] }).InstructionError;\n\n    if (details && typeof details === 'object' && 'Custom' in details) {\n      const customCode = (details as { Custom: number }).Custom;\n      const known = SOLANA_PROGRAM_ERRORS[customCode];\n      if (known) return known;\n      return { code: `program_error_${customCode}`, message: `Program error code ${customCode} (instruction ${ixIndex})` };\n    }\n\n    if (typeof details === 'string') {\n      const snake = details.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n      return { code: snake, message: details.replace(/([a-z])([A-Z])/g, '$1 $2') };\n    }\n\n    if (typeof details === 'number') {\n      const known = SOLANA_BUILTIN_ERRORS[details];\n      if (known) return known;\n      return { code: `instruction_error_${details}`, message: `Instruction error ${details}` };\n    }\n\n    return { code: 'instruction_error', message: `Instruction ${ixIndex} failed: ${JSON.stringify(details)}` };\n  }\n\n  return { code: 'transaction_failed', message: typeof parsed === 'object' ? JSON.stringify(parsed) : String(parsed) };\n}\n","import { DEFAULT_BASE_URL } from './constants';\nimport { DubsApiError, parseSolanaError, SOLANA_PROGRAM_ERRORS } from './errors';\nimport type {\n  UnifiedEvent,\n  Pagination,\n  EsportsMatchDetail,\n  ValidateEventResult,\n  CreateGameParams,\n  CreateGameResult,\n  CreateCustomGameParams,\n  CreateCustomGameResult,\n  JoinGameParams,\n  JoinGameResult,\n  ConfirmGameParams,\n  ConfirmGameResult,\n  BuildClaimParams,\n  BuildClaimResult,\n  ConfirmClaimParams,\n  ConfirmClaimResult,\n  GameDetail,\n  GameListItem,\n  GetGamesParams,\n  GetNetworkGamesParams,\n  GetUpcomingEventsParams,\n  ParsedError,\n  SolanaErrorCode,\n  NonceResult,\n  AuthenticateParams,\n  AuthenticateResult,\n  RegisterParams,\n  RegisterResult,\n  DubsUser,\n  DubsPublicUser,\n  DubsAppUser,\n  CheckUsernameResult,\n  LiveScore,\n  UiConfig,\n  WhatsNewPost,\n  UFCEvent,\n  UFCFighterDetail,\n  ArcadePool,\n  ArcadeEntry,\n  ArcadeLeaderboardEntry,\n  ArcadePoolStats,\n  ArcadePoolResult,\n  StartAttemptResult,\n  SubmitScoreResult,\n  BuildArcadeEntryResult,\n  JackpotRound,\n  JackpotLastWinner,\n  JackpotEntry,\n  JackpotRoundResult,\n  JackpotConfig,\n  BuildJackpotEnterResult,\n  ConfirmJackpotEnterResult,\n  PromoCredit,\n} from './types';\n\nexport interface DubsClientConfig {\n  apiKey: string;\n  baseUrl?: string;\n}\n\nexport class DubsClient {\n  private readonly apiKey: string;\n  private readonly baseUrl: string;\n  private _token: string | null = null;\n\n  constructor(config: DubsClientConfig) {\n    this.apiKey = config.apiKey;\n    this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, '');\n  }\n\n  /** Set the user JWT token for authenticated requests */\n  setToken(token: string | null): void {\n    this._token = token;\n  }\n\n  /** Get the current user JWT token */\n  getToken(): string | null {\n    return this._token;\n  }\n\n  // ── Private HTTP helper ──\n\n  private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n    const url = `${this.baseUrl}${path}`;\n    const headers: Record<string, string> = {\n      'X-API-Key': this.apiKey,\n      'Content-Type': 'application/json',\n    };\n\n    if (this._token) {\n      headers['Authorization'] = `Bearer ${this._token}`;\n    }\n\n    console.log(`[DubsClient] ${method} ${url}`, body ? JSON.stringify(body).slice(0, 200) : '');\n\n    const res = await fetch(url, {\n      method,\n      headers,\n      body: body ? JSON.stringify(body) : undefined,\n    });\n\n    const text = await res.text();\n    console.log(`[DubsClient] ${method} ${path} → ${res.status}`, text.slice(0, 300));\n\n    let json: any;\n    try {\n      json = JSON.parse(text);\n    } catch {\n      throw new DubsApiError('parse_error', `Invalid JSON response: ${text.slice(0, 100)}`, res.status);\n    }\n\n    if (!json.success) {\n      const err = json.error;\n      if (typeof err === 'object' && err !== null) {\n        throw new DubsApiError(err.code || 'unknown', err.message || 'Unknown error', res.status);\n      }\n      throw new DubsApiError('unknown', typeof err === 'string' ? err : 'Request failed', res.status);\n    }\n\n    return json as T;\n  }\n\n  // ── Events ──\n\n  async getUpcomingEvents(params?: GetUpcomingEventsParams): Promise<{ events: UnifiedEvent[]; pagination: Pagination }> {\n    const qs = new URLSearchParams();\n    if (params?.type) qs.set('type', params.type);\n    if (params?.game) qs.set('game', params.game);\n    if (params?.page) qs.set('page', String(params.page));\n    if (params?.per_page) qs.set('per_page', String(params.per_page));\n    const query = qs.toString();\n    const res = await this.request<{ success: true; events: UnifiedEvent[]; pagination: Pagination }>(\n      'GET',\n      `/events/upcoming${query ? `?${query}` : ''}`,\n    );\n    return { events: res.events, pagination: res.pagination };\n  }\n\n  async getSportsEvents(league: string): Promise<UnifiedEvent[]> {\n    const res = await this.request<{ success: true; league: string; events: UnifiedEvent[] }>(\n      'GET',\n      `/sports/events/${encodeURIComponent(league)}`,\n    );\n    return res.events;\n  }\n\n  async getEsportsMatches(videogame?: string): Promise<UnifiedEvent[]> {\n    const qs = videogame ? `?videogame=${encodeURIComponent(videogame)}` : '';\n    const res = await this.request<{ success: true; matches: UnifiedEvent[] }>(\n      'GET',\n      `/esports/matches/upcoming${qs}`,\n    );\n    return res.matches;\n  }\n\n  async getEsportsMatchDetail(matchId: string | number): Promise<EsportsMatchDetail> {\n    const res = await this.request<{ success: true; match: EsportsMatchDetail }>(\n      'GET',\n      `/esports/matches/${encodeURIComponent(String(matchId))}`,\n    );\n    return res.match;\n  }\n\n  // ── UFC ──\n\n  async getUFCFightCard(): Promise<UFCEvent[]> {\n    const res = await this.request<{ success: true; events: UFCEvent[] }>(\n      'GET',\n      '/ufc/fightcard',\n    );\n    return res.events;\n  }\n\n  async getUFCFighterDetail(athleteId: string): Promise<UFCFighterDetail> {\n    const res = await this.request<{ success: true; fighter: UFCFighterDetail }>(\n      'GET',\n      `/ufc/fighters/${encodeURIComponent(athleteId)}`,\n    );\n    return res.fighter;\n  }\n\n  // ── Game Lifecycle ──\n\n  async validateEvent(id: string): Promise<ValidateEventResult> {\n    const res = await this.request<{ success: true } & ValidateEventResult>(\n      'POST',\n      '/games/validate',\n      { id },\n    );\n    return {\n      bettable: res.bettable,\n      gameMode: res.gameMode,\n      lockTimestamp: res.lockTimestamp,\n      startTime: res.startTime,\n      status: res.status,\n    };\n  }\n\n  async createGame(params: CreateGameParams): Promise<CreateGameResult> {\n    // Sponsored path: spend an active streak credit instead of paying\n    // rent + buy-in. Server picks oldest FIFO credit, returns the\n    // partial-signed compound tx + promoCode so confirmGame can mark\n    // the credit as used after the on-chain confirm.\n    if (params.useCredit) {\n      const res = await this.request<{\n        success: true;\n        gameId: string;\n        gameAddress: string;\n        transaction: string;\n        lockTimestamp: number;\n        event: UnifiedEvent;\n        promoCode: string;\n        sponsorWallet?: string;\n        wagerAmount: number;\n      }>('POST', '/games/create-sponsored', {\n        id: params.id,\n        teamChoice: params.teamChoice,\n      });\n      return {\n        gameId: res.gameId,\n        gameAddress: res.gameAddress,\n        transaction: res.transaction,\n        lockTimestamp: res.lockTimestamp,\n        event: res.event,\n        promoCode: res.promoCode,\n        sponsorWallet: res.sponsorWallet,\n        wagerAmount: res.wagerAmount,\n      };\n    }\n\n    const res = await this.request<{ success: true } & CreateGameResult>(\n      'POST',\n      '/games/create',\n      params,\n    );\n    return {\n      gameId: res.gameId,\n      gameAddress: res.gameAddress,\n      transaction: res.transaction,\n      lockTimestamp: res.lockTimestamp,\n      event: res.event,\n    };\n  }\n\n  async joinGame(params: JoinGameParams): Promise<JoinGameResult> {\n    // Sponsored path: spend an active streak credit instead of buy-in.\n    // Server picks the user's oldest active credit (FIFO); we just flag\n    // the intent. Result includes promoCode for the confirm step to\n    // mark as used.\n    if (params.useCredit) {\n      const res = await this.request<{\n        success: true;\n        gameId: string;\n        transaction: string;\n        gameAddress: string;\n        promoCode: string;\n        sponsorWallet?: string;\n      }>('POST', '/games/join-sponsored', {\n        gameId: params.gameId,\n        teamChoice: params.teamChoice,\n      });\n      return {\n        gameId: res.gameId,\n        transaction: res.transaction,\n        gameAddress: res.gameAddress,\n        promoCode: res.promoCode,\n        sponsorWallet: res.sponsorWallet,\n      };\n    }\n\n    const res = await this.request<{ success: true } & JoinGameResult>(\n      'POST',\n      '/games/join',\n      params,\n    );\n    return {\n      gameId: res.gameId,\n      transaction: res.transaction,\n      gameAddress: res.gameAddress,\n    };\n  }\n\n  async confirmGame(params: ConfirmGameParams): Promise<ConfirmGameResult> {\n    const res = await this.request<{ success: true } & ConfirmGameResult>(\n      'POST',\n      '/games/confirm',\n      params,\n    );\n    return {\n      gameId: res.gameId,\n      signature: res.signature,\n      explorerUrl: res.explorerUrl,\n      message: res.message,\n    };\n  }\n\n  // ── Custom Game Lifecycle (game_mode=6) ──\n\n  async createCustomGame(params: CreateCustomGameParams): Promise<CreateCustomGameResult> {\n    const res = await this.request<{ success: true } & CreateCustomGameResult>(\n      'POST',\n      '/games/custom/create',\n      params,\n    );\n    return {\n      gameId: res.gameId,\n      gameAddress: res.gameAddress,\n      transaction: res.transaction,\n      lockTimestamp: res.lockTimestamp,\n    };\n  }\n\n  async confirmCustomGame(params: ConfirmGameParams): Promise<ConfirmGameResult> {\n    const res = await this.request<{ success: true } & ConfirmGameResult>(\n      'POST',\n      '/games/custom/confirm',\n      params,\n    );\n    return {\n      gameId: res.gameId,\n      signature: res.signature,\n      explorerUrl: res.explorerUrl,\n      message: res.message,\n    };\n  }\n\n  async buildClaimTransaction(params: BuildClaimParams): Promise<BuildClaimResult> {\n    const res = await this.request<{ success: true } & BuildClaimResult>(\n      'POST',\n      '/transactions/build/claim',\n      params,\n    );\n    return {\n      transaction: res.transaction,\n      gameAddress: res.gameAddress,\n      message: res.message,\n    };\n  }\n\n  async confirmClaim(gameId: string, params: ConfirmClaimParams): Promise<ConfirmClaimResult> {\n    const res = await this.request<{ success: true } & ConfirmClaimResult>(\n      'POST',\n      `/games/${encodeURIComponent(gameId)}/claim/confirm`,\n      params,\n    );\n    return {\n      gameId: res.gameId,\n      signature: res.signature,\n      explorerUrl: res.explorerUrl,\n      message: res.message,\n    };\n  }\n\n  // ── Game Queries ──\n\n  async getGame(gameId: string): Promise<GameDetail> {\n    const res = await this.request<{ success: true; game: GameDetail }>(\n      'GET',\n      `/games/${encodeURIComponent(gameId)}`,\n    );\n    return res.game;\n  }\n\n  async getLiveScore(gameId: string): Promise<LiveScore | null> {\n    const res = await this.request<{ success: true; liveScore: LiveScore | null }>(\n      'GET',\n      `/games/${encodeURIComponent(gameId)}/live-score`,\n    );\n    return res.liveScore;\n  }\n\n  async getGames(params?: GetGamesParams): Promise<GameListItem[]> {\n    const qs = new URLSearchParams();\n    if (params?.wallet) qs.set('wallet', params.wallet);\n    if (params?.status) qs.set('status', params.status);\n    if (params?.limit != null) qs.set('limit', String(params.limit));\n    if (params?.offset != null) qs.set('offset', String(params.offset));\n    const query = qs.toString();\n    const res = await this.request<{ success: true; games: GameListItem[] }>(\n      'GET',\n      `/games${query ? `?${query}` : ''}`,\n    );\n    return res.games;\n  }\n\n  // ── Network ──\n\n  async getNetworkGames(params?: GetNetworkGamesParams): Promise<{ games: GameListItem[]; pagination: Pagination }> {\n    const qs = new URLSearchParams();\n    if (params?.league) qs.set('league', params.league);\n    if (params?.exclude_wallet) qs.set('exclude_wallet', params.exclude_wallet);\n    if (params?.limit != null) qs.set('limit', String(params.limit));\n    if (params?.offset != null) qs.set('offset', String(params.offset));\n    const query = qs.toString();\n    const res = await this.request<{ success: true; games: GameListItem[]; pagination: Pagination }>(\n      'GET',\n      `/network/games${query ? `?${query}` : ''}`,\n    );\n    return { games: res.games, pagination: res.pagination };\n  }\n\n  // ── User Auth ──\n\n  async getNonce(walletAddress: string): Promise<NonceResult> {\n    const res = await this.request<{ success: true; data: NonceResult }>(\n      'POST',\n      '/auth/nonce',\n      { walletAddress },\n    );\n    return res.data;\n  }\n\n  async authenticate(params: AuthenticateParams): Promise<AuthenticateResult> {\n    const res = await this.request<{ success: true; data: AuthenticateResult }>(\n      'POST',\n      '/auth/authenticate',\n      params,\n    );\n    // Auto-store token on successful auth\n    if (res.data.token) {\n      this._token = res.data.token;\n    }\n    return res.data;\n  }\n\n  async register(params: RegisterParams): Promise<RegisterResult> {\n    const res = await this.request<{ success: true; data: RegisterResult }>(\n      'POST',\n      '/auth/register',\n      params,\n    );\n    // Auto-store token on successful registration\n    if (res.data.token) {\n      this._token = res.data.token;\n    }\n    return res.data;\n  }\n\n  async getMe(): Promise<DubsUser> {\n    const res = await this.request<{ success: true; data: { user: DubsUser } }>(\n      'GET',\n      '/auth/me',\n    );\n    return res.data.user;\n  }\n\n  async getUser(walletAddress: string): Promise<DubsPublicUser | null> {\n    const res = await this.request<{ success: true; data: { user: DubsPublicUser | null } }>(\n      'GET',\n      `/users/${encodeURIComponent(walletAddress)}`,\n    );\n    return res.data.user;\n  }\n\n  async getAppUsers(params?: { limit?: number; offset?: number }): Promise<{ users: DubsAppUser[]; pagination: { total: number; limit: number; offset: number } }> {\n    const qs = new URLSearchParams();\n    if (params?.limit != null) qs.set('limit', String(params.limit));\n    if (params?.offset != null) qs.set('offset', String(params.offset));\n    const query = qs.toString();\n    const res = await this.request<{ success: true; data: { users: DubsAppUser[]; pagination: { total: number; limit: number; offset: number } } }>(\n      'GET',\n      `/users${query ? `?${query}` : ''}`,\n    );\n    return res.data;\n  }\n\n  async checkUsername(username: string): Promise<CheckUsernameResult> {\n    const res = await this.request<{ success: true; data: CheckUsernameResult }>(\n      'GET',\n      `/auth/check-username/${encodeURIComponent(username)}`,\n    );\n    return res.data;\n  }\n\n  async logout(): Promise<void> {\n    await this.request<{ success: true; data: { message: string } }>(\n      'POST',\n      '/auth/logout',\n    );\n    this._token = null;\n  }\n\n  // ── Push Notifications ──\n\n  async registerPushToken(params: { token: string; platform: string; deviceName?: string }): Promise<void> {\n    await this.request<{ success: true; data: { tokenId: number; token: string } }>(\n      'POST',\n      '/push/expo-token',\n      params,\n    );\n  }\n\n  async unregisterPushToken(token: string): Promise<void> {\n    await this.request<{ success: true; data: { message: string } }>(\n      'DELETE',\n      '/push/expo-token',\n      { token },\n    );\n  }\n\n  // ── Profile ──\n\n  async updateProfile(params: { avatar?: string }): Promise<DubsUser> {\n    const res = await this.request<{ success: true; data: { user: DubsUser } }>(\n      'PATCH',\n      '/auth/profile',\n      params,\n    );\n    return res.data.user;\n  }\n\n  // ── Error Utilities ──\n\n  async parseError(error: unknown): Promise<ParsedError> {\n    const res = await this.request<{ success: true; error: ParsedError }>(\n      'POST',\n      '/errors/parse',\n      { error },\n    );\n    return res.error;\n  }\n\n  async getErrorCodes(): Promise<Record<number, SolanaErrorCode>> {\n    const res = await this.request<{ success: true; errors: Record<number, SolanaErrorCode> }>(\n      'GET',\n      '/errors/codes',\n    );\n    return res.errors;\n  }\n\n  /**\n   * Parse a Solana error locally without an API call.\n   * Useful for instant feedback in the UI.\n   */\n  parseErrorLocal(error: unknown): ParsedError {\n    return parseSolanaError(error);\n  }\n\n  /** Get the full local error code map */\n  getErrorCodesLocal(): Record<number, SolanaErrorCode> {\n    return { ...SOLANA_PROGRAM_ERRORS };\n  }\n\n  // ── Arcade Pools ──\n\n  async getArcadePools(params?: { gameSlug?: string; status?: string }): Promise<ArcadePool[]> {\n    const qs = new URLSearchParams();\n    if (params?.gameSlug) qs.set('gameSlug', params.gameSlug);\n    if (params?.status) qs.set('status', params.status);\n    const query = qs.toString();\n    const res = await this.request<{ success: true; pools: ArcadePool[] }>(\n      'GET',\n      `/arcade/pools${query ? `?${query}` : ''}`,\n    );\n    return res.pools;\n  }\n\n  async getArcadePool(poolId: number): Promise<{ pool: ArcadePool; stats: ArcadePoolStats }> {\n    const res = await this.request<{ success: true; pool: ArcadePool; stats: ArcadePoolStats }>(\n      'GET',\n      `/arcade/pools/${poolId}`,\n    );\n    return { pool: res.pool, stats: res.stats };\n  }\n\n  /** Build unsigned entry transaction for an arcade pool */\n  async buildArcadeEntry(poolId: number, walletAddress: string): Promise<BuildArcadeEntryResult> {\n    const res = await this.request<{ success: true } & BuildArcadeEntryResult>(\n      'POST',\n      `/arcade/pools/${poolId}/build-enter`,\n      { walletAddress },\n    );\n    return {\n      transaction: res.transaction,\n      poolId: res.poolId,\n      amount: res.amount,\n      destination: res.destination,\n      gameId: res.gameId,\n      gameAddress: res.gameAddress,\n    };\n  }\n\n  async enterArcadePool(poolId: number, params: { walletAddress: string; txSignature: string; gameId?: string; gameAddress?: string }): Promise<ArcadeEntry> {\n    const res = await this.request<{ success: true; entry: ArcadeEntry }>(\n      'POST',\n      `/arcade/pools/${poolId}/enter`,\n      params,\n    );\n    return res.entry;\n  }\n\n  async startArcadeAttempt(poolId: number, walletAddress: string): Promise<StartAttemptResult> {\n    const res = await this.request<{ success: true } & StartAttemptResult>(\n      'POST',\n      `/arcade/pools/${poolId}/start-attempt`,\n      { walletAddress },\n    );\n    return { sessionToken: res.sessionToken, attemptNumber: res.attemptNumber, livesRemaining: res.livesRemaining };\n  }\n\n  async submitArcadeScore(poolId: number, params: { walletAddress: string; sessionToken: string; score: number; durationMs?: number }): Promise<SubmitScoreResult> {\n    const res = await this.request<{ success: true } & SubmitScoreResult>(\n      'POST',\n      `/arcade/pools/${poolId}/submit-score`,\n      params,\n    );\n    return { score: res.score, bestScore: res.bestScore, livesUsed: res.livesUsed, isNewBest: res.isNewBest };\n  }\n\n  async getArcadeLeaderboard(poolId: number, params?: { limit?: number; offset?: number }): Promise<ArcadeLeaderboardEntry[]> {\n    const qs = new URLSearchParams();\n    if (params?.limit != null) qs.set('limit', String(params.limit));\n    if (params?.offset != null) qs.set('offset', String(params.offset));\n    const query = qs.toString();\n    const res = await this.request<{ success: true; leaderboard: ArcadeLeaderboardEntry[] }>(\n      'GET',\n      `/arcade/pools/${poolId}/leaderboard${query ? `?${query}` : ''}`,\n    );\n    return res.leaderboard;\n  }\n\n  async getArcadeResults(poolId: number): Promise<ArcadePoolResult[]> {\n    const res = await this.request<{ success: true; results: ArcadePoolResult[] }>(\n      'GET',\n      `/arcade/pools/${poolId}/results`,\n    );\n    return res.results;\n  }\n\n  async getArcadeEntry(poolId: number, walletAddress: string): Promise<ArcadeEntry> {\n    const res = await this.request<{ success: true; entry: ArcadeEntry }>(\n      'GET',\n      `/arcade/pools/${poolId}/my-entry?walletAddress=${encodeURIComponent(walletAddress)}`,\n    );\n    return res.entry;\n  }\n\n  // ── Jackpot ──\n\n  /** Get current jackpot round + last winner */\n  async getJackpotCurrent(): Promise<{ round: JackpotRound | null; lastWinner: JackpotLastWinner | null }> {\n    const res = await this.request<{ success: true; round: JackpotRound | null; lastWinner: JackpotLastWinner | null }>(\n      'GET',\n      '/jackpot/current',\n    );\n    return { round: res.round, lastWinner: res.lastWinner };\n  }\n\n  /**\n   * List the authenticated user's active promo credits — codes that\n   * have been reserved to them but not yet used in a game. Includes\n   * streak-milestone unlocks (auto-minted at each 1000-dub crossing)\n   * and any manually-reserved Twitter giveaway codes.\n   */\n  async getCredits(): Promise<{ credits: PromoCredit[]; totalLamports: number; totalSOL: number }> {\n    const res = await this.request<{\n      success: true;\n      credits: PromoCredit[];\n      totalLamports: number;\n      totalSOL: number;\n    }>('GET', '/me/credits');\n    return { credits: res.credits, totalLamports: res.totalLamports, totalSOL: res.totalSOL };\n  }\n\n  /** Get current round entries with odds */\n  async getJackpotEntries(): Promise<{ roundId: string; entries: JackpotEntry[]; totalEntries: number }> {\n    const res = await this.request<{ success: true; roundId: string; entries: JackpotEntry[]; totalEntries: number }>(\n      'GET',\n      '/jackpot/entries',\n    );\n    return { roundId: res.roundId, entries: res.entries, totalEntries: res.totalEntries };\n  }\n\n  /** Get recent jackpot round results */\n  async getJackpotHistory(limit?: number): Promise<JackpotRoundResult[]> {\n    const qs = limit ? `?limit=${limit}` : '';\n    const res = await this.request<{ success: true; rounds: JackpotRoundResult[] }>(\n      'GET',\n      `/jackpot/history${qs}`,\n    );\n    return res.rounds;\n  }\n\n  /** Get jackpot protocol config */\n  async getJackpotConfig(): Promise<JackpotConfig> {\n    const res = await this.request<{ success: true; config: JackpotConfig }>(\n      'GET',\n      '/jackpot/config',\n    );\n    return res.config;\n  }\n\n  /** Build unsigned jackpot enter transaction */\n  async buildJackpotEnter(playerAddress: string, amount: number): Promise<BuildJackpotEnterResult> {\n    const res = await this.request<{ success: true } & BuildJackpotEnterResult>(\n      'POST',\n      '/jackpot/build-enter',\n      { playerAddress, amount },\n    );\n    return { transaction: res.transaction, roundId: res.roundId, amount: res.amount, amountSol: res.amountSol };\n  }\n\n  /** Confirm jackpot entry after wallet signs (creates developer attribution) */\n  async confirmJackpotEnter(params: { playerAddress: string; roundId?: string; amount?: number; signature: string }): Promise<ConfirmJackpotEnterResult> {\n    const res = await this.request<{ success: true } & ConfirmJackpotEnterResult>(\n      'POST',\n      '/jackpot/confirm-enter',\n      params,\n    );\n    return { attributed: res.attributed, appId: res.appId, signature: res.signature };\n  }\n\n  // ── Chat ──\n\n  /** Get recent global chat messages */\n  async getChatMessages(params?: { limit?: number; before?: number }): Promise<{ messages: any[]; hasMore: boolean }> {\n    const qs = new URLSearchParams();\n    if (params?.limit) qs.set('limit', String(params.limit));\n    if (params?.before) qs.set('before', String(params.before));\n    const query = qs.toString();\n    return this.request('GET', `/chat/messages${query ? `?${query}` : ''}`);\n  }\n\n  /**\n   * Send a message to global chat. Mirrors the same payload accepted by\n   * the chat socket's `send_message` event so REST callers (e.g. the\n   * useCreateGame auto-share) can attach a `gameInvite` chip, GIF, P&L\n   * share, payment signature, or @mention IDs alongside the text.\n   */\n  async sendChatMessage(params: {\n    message: string;\n    replyToId?: number;\n    gameInvite?: Record<string, unknown>;\n    mentions?: number[];\n    gifUrl?: string;\n    pnlShare?: Record<string, unknown>;\n    paymentSignature?: string;\n  }): Promise<{ message: any }> {\n    return this.request('POST', '/chat/message', params);\n  }\n\n  /** Edit your own message */\n  async editChatMessage(id: number, message: string): Promise<{ message: any }> {\n    return this.request('PUT', `/chat/message/${id}`, { message });\n  }\n\n  /** Delete your own message */\n  async deleteChatMessage(id: number): Promise<{ messageId: number }> {\n    return this.request('DELETE', `/chat/message/${id}`);\n  }\n\n  /** Block a user */\n  async blockUser(targetUserId: number): Promise<void> {\n    await this.request('POST', `/chat/block/${targetUserId}`);\n  }\n\n  /** Unblock a user */\n  async unblockUser(targetUserId: number): Promise<void> {\n    await this.request('DELETE', `/chat/block/${targetUserId}`);\n  }\n\n  // ── DMs ──\n\n  /** Get DM conversations inbox */\n  async getConversations(limit?: number): Promise<{ conversations: any[] }> {\n    const qs = limit ? `?limit=${limit}` : '';\n    return this.request('GET', `/dm/conversations${qs}`);\n  }\n\n  /** Get conversation history with a specific user */\n  async getConversation(walletAddress: string, params?: { limit?: number; beforeId?: number }): Promise<{ messages: any[]; otherUser: any }> {\n    const qs = new URLSearchParams();\n    if (params?.limit) qs.set('limit', String(params.limit));\n    if (params?.beforeId) qs.set('beforeId', String(params.beforeId));\n    const query = qs.toString();\n    return this.request('GET', `/dm/conversation/${encodeURIComponent(walletAddress)}${query ? `?${query}` : ''}`);\n  }\n\n  /** Send a direct message */\n  async sendDirectMessage(params: { recipientWallet: string; message: string }): Promise<{ message: any }> {\n    return this.request('POST', '/dm/send', params);\n  }\n\n  /** Mark all DMs from a user as read */\n  async markDMRead(walletAddress: string): Promise<{ markedRead: number }> {\n    return this.request('POST', `/dm/read/${encodeURIComponent(walletAddress)}`);\n  }\n\n  /** Get unread DM count */\n  async getDMUnreadCount(): Promise<{ unreadCount: number }> {\n    return this.request('GET', '/dm/unread');\n  }\n\n  /** Delete a DM conversation (soft delete) */\n  async deleteConversation(walletAddress: string): Promise<void> {\n    await this.request('DELETE', `/dm/conversation/${encodeURIComponent(walletAddress)}`);\n  }\n\n  // ── Social ──\n\n  /** Search users by username */\n  async searchUsers(query: string): Promise<{ results: any[] }> {\n    const qs = query ? `?q=${encodeURIComponent(query)}` : '';\n    return this.request('GET', `/social/search${qs}`);\n  }\n\n  /** Send a friend request */\n  async sendFriendRequest(targetUserId: number): Promise<{ requestId: number }> {\n    return this.request('POST', `/social/friend-request/${targetUserId}`);\n  }\n\n  /** Get pending friend requests (received) */\n  async getPendingFriendRequests(): Promise<{ requests: any[] }> {\n    return this.request('GET', '/social/friend-requests');\n  }\n\n  /** Get pending friend requests this user has sent (still awaiting response) */\n  async getSentFriendRequests(): Promise<{ requests: any[] }> {\n    return this.request('GET', '/social/friend-requests/sent');\n  }\n\n  /** Cancel a pending friend request the user previously sent */\n  async cancelFriendRequest(requestId: number): Promise<void> {\n    await this.request('DELETE', `/social/friend-request/${requestId}`);\n  }\n\n  /** Accept a friend request */\n  async acceptFriendRequest(requestId: number): Promise<void> {\n    await this.request('POST', `/social/request/${requestId}/accept`);\n  }\n\n  /** Reject a friend request */\n  async rejectFriendRequest(requestId: number): Promise<void> {\n    await this.request('POST', `/social/request/${requestId}/reject`);\n  }\n\n  /** Get friends list */\n  async getFriends(): Promise<{ friends: any[] }> {\n    return this.request('GET', '/social/friends');\n  }\n\n  /** Remove a friend */\n  async removeFriend(targetUserId: number): Promise<void> {\n    await this.request('DELETE', `/social/friend/${targetUserId}`);\n  }\n\n  /** Get blocked users list */\n  async getBlockedUsers(): Promise<{ blocked: any[] }> {\n    return this.request('GET', '/social/blocked');\n  }\n\n  // ── What's New ──\n\n  /** List published What's New posts for this app, with is_read for the current user. */\n  async getWhatsNewPosts(): Promise<{ posts: WhatsNewPost[] }> {\n    return this.request('GET', '/whats-new/posts');\n  }\n\n  /** Fetch a single What's New post by id. */\n  async getWhatsNewPost(postId: number): Promise<{ post: WhatsNewPost }> {\n    return this.request('GET', `/whats-new/posts/${postId}`);\n  }\n\n  /** Number of unread What's New posts for the current user (this app). */\n  async getWhatsNewUnreadCount(): Promise<{ count: number }> {\n    return this.request('GET', '/whats-new/unread-count');\n  }\n\n  /** Mark specific posts as read. */\n  async markWhatsNewRead(postIds: number[]): Promise<void> {\n    await this.request('POST', '/whats-new/mark-read', { postIds });\n  }\n\n  /** Mark every unread post as read. */\n  async markAllWhatsNewRead(): Promise<{ updated: number }> {\n    return this.request('POST', '/whats-new/mark-all-read');\n  }\n\n  // ── App Config ──\n\n  /** Fetch the app's UI customization config (accent color, icon, tagline, environment) */\n  async getAppConfig(): Promise<UiConfig> {\n    const res = await this.request<{ data: { environment?: string; uiConfig: UiConfig } }>('GET', '/apps/config');\n    const config = res.data?.uiConfig || {};\n    if (res.data?.environment) {\n      config.environment = res.data.environment as UiConfig['environment'];\n    }\n    return config;\n  }\n\n}\n","export interface TokenStorage {\n  getItem(key: string): Promise<string | null>;\n  setItem(key: string, value: string): Promise<void>;\n  deleteItem(key: string): Promise<void>;\n}\n\nexport const STORAGE_KEYS = {\n  MWA_AUTH_TOKEN: 'dubs_mwa_auth_token',\n  MWA_WALLET_ADDRESS: 'dubs_mwa_wallet_address',\n  JWT_TOKEN: 'dubs_jwt_token',\n  PHANTOM_SESSION: 'dubs_phantom_session',\n  PHANTOM_CONNECT_IN_FLIGHT: 'dubs_phantom_connect_in_flight',\n} as const;\n\n/**\n * Creates a TokenStorage backed by expo-secure-store.\n * Lazy-imports the module so it's only required at runtime when actually used.\n * Throws a clear error if expo-secure-store is not installed.\n */\nexport function createSecureStoreStorage(): TokenStorage {\n  // Use `any` to avoid requiring expo-secure-store types at build time.\n  // The module is lazy-imported at runtime only when this storage is actually used.\n  let SecureStore: any = null;\n\n  function getStore(): {\n    getItemAsync: (key: string) => Promise<string | null>;\n    setItemAsync: (key: string, value: string) => Promise<void>;\n    deleteItemAsync: (key: string) => Promise<void>;\n  } {\n    if (!SecureStore) {\n      try {\n        // Use require() to keep the import opaque to TypeScript's DTS generation.\n        // eslint-disable-next-line @typescript-eslint/no-var-requires\n        SecureStore = require('expo-secure-store');\n      } catch {\n        throw new Error(\n          '@dubsdotapp/expo: expo-secure-store is required for default token storage. ' +\n          'Install it with: npx expo install expo-secure-store — ' +\n          'or pass a custom tokenStorage prop to <DubsProvider>.',\n        );\n      }\n    }\n    return SecureStore;\n  }\n\n  return {\n    async getItem(key: string): Promise<string | null> {\n      const store = getStore();\n      return store.getItemAsync(key);\n    },\n    async setItem(key: string, value: string): Promise<void> {\n      const store = getStore();\n      await store.setItemAsync(key, value);\n    },\n    async deleteItem(key: string): Promise<void> {\n      const store = getStore();\n      await store.deleteItemAsync(key);\n    },\n  };\n}\n","import React, { createContext, useContext, useMemo, useCallback, useState, useEffect } from 'react';\nimport { ThemeOverrideProvider } from './ui/theme';\nimport type { DubsTheme } from './ui/theme';\nimport { Connection } from '@solana/web3.js';\nimport { DubsClient } from './client';\nimport { NETWORK_CONFIG } from './constants';\nimport type { DubsNetwork } from './constants';\nimport type { WalletAdapter } from './wallet/types';\nimport type { TokenStorage } from './storage';\nimport { createSecureStoreStorage, STORAGE_KEYS } from './storage';\nimport { ManagedWalletProvider, useDisconnect } from './managed-wallet';\nimport { AuthGate } from './ui/AuthGate';\nimport type { RegistrationScreenProps } from './ui/AuthGate';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { AuthStatus, UiConfig } from './types';\n\n// ── Context ──\n\nexport interface DubsContextValue {\n  client: DubsClient;\n  wallet: WalletAdapter;\n  connection: Connection;\n  appName: string;\n  network: DubsNetwork;\n  disconnect: () => Promise<void>;\n  uiConfig: UiConfig;\n  pushEnabled: boolean;\n}\n\nconst DubsContext = createContext<DubsContextValue | null>(null);\n\n// ── Props ──\n\nexport interface DubsProviderProps {\n  apiKey: string;\n  children: React.ReactNode;\n  appName?: string;\n  network?: DubsNetwork;\n  /** Escape hatch: bring your own wallet adapter. Disables managed MWA. */\n  wallet?: WalletAdapter;\n  /** Escape hatch: custom token persistence. Defaults to expo-secure-store. */\n  tokenStorage?: TokenStorage;\n  /** Escape hatch: override base URL (takes precedence over network). */\n  baseUrl?: string;\n  /** Escape hatch: override RPC URL (takes precedence over network). */\n  rpcUrl?: string;\n  /** Custom connect screen, or false to hide it entirely (headless mode). */\n  renderConnectScreen?: ((props: ConnectWalletScreenProps) => React.ReactNode) | false;\n  /** Custom loading screen shown during auth. */\n  renderLoading?: (status: AuthStatus) => React.ReactNode;\n  /** Custom error screen shown on auth failure. */\n  renderError?: (error: Error, retry: () => void) => React.ReactNode;\n  /** Custom registration screen. */\n  renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n  /** Set to false to skip AuthGate and connect screen (headless/BYOA mode). Default: true. */\n  managed?: boolean;\n  /** Deeplink redirect URI for Phantom wallet (required for iOS support). */\n  redirectUri?: string;\n  /** App URL shown in Phantom's connect screen. */\n  appUrl?: string;\n  /** Enable Dubs push notifications. Default: true. Set false if your app manages its own Firebase/push. */\n  pushEnabled?: boolean;\n}\n\n// ── Provider ──\n\nexport function DubsProvider({\n  apiKey,\n  children,\n  appName = 'Dubs',\n  network = 'mainnet-beta',\n  wallet: externalWallet,\n  tokenStorage,\n  baseUrl: baseUrlOverride,\n  rpcUrl: rpcUrlOverride,\n  renderConnectScreen,\n  renderLoading,\n  renderError,\n  renderRegistration,\n  managed = true,\n  redirectUri,\n  appUrl,\n  pushEnabled = true,\n}: DubsProviderProps) {\n  // Resolve network config — explicit props override network defaults\n  const config = NETWORK_CONFIG[network];\n  const baseUrl = baseUrlOverride || config.baseUrl;\n  const rpcUrl = rpcUrlOverride || config.rpcUrl;\n\n  // Create stable instances\n  const client = useMemo(() => new DubsClient({ apiKey, baseUrl }), [apiKey, baseUrl]);\n  const storage = useMemo(() => tokenStorage || createSecureStoreStorage(), [tokenStorage]);\n\n  // Fetch developer UI config on mount (silent fail = default theme)\n  // Also auto-detects sandbox/production environment from the API key\n  const [uiConfig, setUiConfig] = useState<UiConfig | null>(null);\n  const [resolvedNetwork, setResolvedNetwork] = useState<DubsNetwork>(network);\n  useEffect(() => {\n    client.getAppConfig()\n      .then((cfg) => {\n        console.log('[DubsProvider] UI config loaded:', JSON.stringify(cfg));\n        setUiConfig(cfg);\n        // Auto-detect network from API key environment (sandbox → devnet)\n        // Only override if the user didn't explicitly set network or rpcUrl\n        if (cfg.environment === 'sandbox' && network === 'mainnet-beta' && !rpcUrlOverride) {\n          console.log('[DubsProvider] Sandbox API key detected — auto-switching to devnet');\n          setResolvedNetwork('devnet');\n        }\n      })\n      .catch((err) => {\n        console.log('[DubsProvider] UI config fetch failed, using defaults:', err?.message);\n        setUiConfig({});\n      });\n  }, [client]);\n\n  // Use resolved network (may differ from prop if sandbox was auto-detected)\n  const resolvedConfig = NETWORK_CONFIG[resolvedNetwork];\n  const resolvedRpcUrl = rpcUrlOverride || resolvedConfig.rpcUrl;\n  const cluster = resolvedConfig.cluster;\n\n  // Connection uses the resolved RPC (auto-switched to devnet for sandbox keys)\n  const connection = useMemo(() => new Connection(resolvedRpcUrl, { commitment: 'confirmed' }), [resolvedRpcUrl]);\n\n  // Wait for config before rendering so accent color is applied on first paint\n  if (uiConfig === null) return null;\n\n  // Build theme overrides from server config so all SDK components respect the tint\n  const themeOverrides: Partial<DubsTheme> = {};\n  if (uiConfig.accentColor) {\n    themeOverrides.accent = uiConfig.accentColor;\n  }\n\n  // ── Path A: External wallet provided (BYOA) ──\n  if (externalWallet) {\n    return (\n      <ThemeOverrideProvider value={themeOverrides}>\n        <ExternalWalletProvider\n          client={client}\n          connection={connection}\n          wallet={externalWallet}\n          appName={uiConfig.appName || appName}\n          network={resolvedNetwork}\n          storage={storage}\n          managed={managed}\n          renderLoading={renderLoading}\n          renderError={renderError}\n          renderRegistration={renderRegistration}\n          accentColor={uiConfig.accentColor}\n          uiConfig={uiConfig}\n          pushEnabled={pushEnabled}\n        >\n          {children}\n        </ExternalWalletProvider>\n      </ThemeOverrideProvider>\n    );\n  }\n\n  // ── Path B: Managed MWA wallet ──\n  return (\n    <ThemeOverrideProvider value={themeOverrides}>\n      <ManagedWalletProvider\n        appName={uiConfig.appName || appName}\n        cluster={cluster}\n        storage={storage}\n        renderConnectScreen={renderConnectScreen}\n        accentColor={uiConfig.accentColor}\n        appIcon={uiConfig.appIcon}\n        tagline={uiConfig.tagline}\n        redirectUri={redirectUri}\n        appUrl={appUrl || uiConfig.appUrl}\n      >\n        {(adapter) => (\n          <ManagedInner\n            client={client}\n            connection={connection}\n            wallet={adapter}\n            appName={uiConfig.appName || appName}\n            network={resolvedNetwork}\n            storage={storage}\n            renderLoading={renderLoading}\n            renderError={renderError}\n            renderRegistration={renderRegistration}\n            accentColor={uiConfig.accentColor}\n            uiConfig={uiConfig}\n            pushEnabled={pushEnabled}\n          >\n            {children}\n          </ManagedInner>\n        )}\n      </ManagedWalletProvider>\n    </ThemeOverrideProvider>\n  );\n}\n\n// ── ManagedInner: context + AuthGate for managed wallet path ──\n\nfunction ManagedInner({\n  client,\n  connection,\n  wallet,\n  appName,\n  network,\n  storage,\n  renderLoading,\n  renderError,\n  renderRegistration,\n  accentColor,\n  uiConfig,\n  pushEnabled,\n  children,\n}: {\n  client: DubsClient;\n  connection: Connection;\n  wallet: WalletAdapter;\n  appName: string;\n  network: DubsNetwork;\n  storage: TokenStorage;\n  renderLoading?: (status: AuthStatus) => React.ReactNode;\n  renderError?: (error: Error, retry: () => void) => React.ReactNode;\n  renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n  accentColor?: string;\n  uiConfig: UiConfig;\n  pushEnabled: boolean;\n  children: React.ReactNode;\n}) {\n  const managedDisconnect = useDisconnect();\n\n  const disconnect = useCallback(async () => {\n    // Clear client JWT\n    client.setToken(null);\n    // Delegate to managed wallet (clears adapter + storage)\n    await managedDisconnect?.();\n  }, [client, managedDisconnect]);\n\n  const value = useMemo<DubsContextValue>(\n    () => ({ client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled }),\n    [client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled],\n  );\n\n  return (\n    <DubsContext.Provider value={value}>\n      <AuthGate\n        onSaveToken={(token) => {\n          if (token) return storage.setItem(STORAGE_KEYS.JWT_TOKEN, token);\n          return storage.deleteItem(STORAGE_KEYS.JWT_TOKEN);\n        }}\n        onLoadToken={() => storage.getItem(STORAGE_KEYS.JWT_TOKEN)}\n        renderLoading={renderLoading}\n        renderError={renderError}\n        renderRegistration={renderRegistration}\n        appName={appName}\n        accentColor={accentColor}\n      >\n        {children}\n      </AuthGate>\n    </DubsContext.Provider>\n  );\n}\n\n// ── ExternalWalletProvider: for BYOA path ──\n\nfunction ExternalWalletProvider({\n  client,\n  connection,\n  wallet,\n  appName,\n  network,\n  storage,\n  managed,\n  renderLoading,\n  renderError,\n  renderRegistration,\n  accentColor,\n  uiConfig,\n  pushEnabled,\n  children,\n}: {\n  client: DubsClient;\n  connection: Connection;\n  wallet: WalletAdapter;\n  appName: string;\n  network: DubsNetwork;\n  storage: TokenStorage;\n  managed: boolean;\n  renderLoading?: (status: AuthStatus) => React.ReactNode;\n  renderError?: (error: Error, retry: () => void) => React.ReactNode;\n  renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n  accentColor?: string;\n  uiConfig: UiConfig;\n  pushEnabled: boolean;\n  children: React.ReactNode;\n}) {\n  const disconnect = useCallback(async () => {\n    client.setToken(null);\n    await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n    await wallet.disconnect?.();\n  }, [client, storage, wallet]);\n\n  const value = useMemo<DubsContextValue>(\n    () => ({ client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled }),\n    [client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled],\n  );\n\n  if (!managed) {\n    // Headless mode — just context, no AuthGate\n    return <DubsContext.Provider value={value}>{children}</DubsContext.Provider>;\n  }\n\n  return (\n    <DubsContext.Provider value={value}>\n      <AuthGate\n        onSaveToken={(token) => {\n          if (token) return storage.setItem(STORAGE_KEYS.JWT_TOKEN, token);\n          return storage.deleteItem(STORAGE_KEYS.JWT_TOKEN);\n        }}\n        onLoadToken={() => storage.getItem(STORAGE_KEYS.JWT_TOKEN)}\n        renderLoading={renderLoading}\n        renderError={renderError}\n        renderRegistration={renderRegistration}\n        appName={appName}\n        accentColor={accentColor}\n      >\n        {children}\n      </AuthGate>\n    </DubsContext.Provider>\n  );\n}\n\n// ── Hooks ──\n\nexport function useDubs(): DubsContextValue {\n  const ctx = useContext(DubsContext);\n  if (!ctx) {\n    throw new Error('useDubs must be used within a <DubsProvider>');\n  }\n  return ctx;\n}\n\nexport function useAppConfig(): UiConfig {\n  const ctx = useContext(DubsContext);\n  return ctx?.uiConfig || {};\n}\n","import { createContext, useContext } from 'react';\nimport { useColorScheme } from 'react-native';\n\nexport interface DubsTheme {\n  background: string;\n  surface: string;\n  surfaceActive: string;\n  border: string;\n  text: string;\n  textSecondary: string;\n  textMuted: string;\n  textDim: string;\n  accent: string;\n  success: string;\n  live: string;\n  errorText: string;\n  errorBg: string;\n  errorBorder: string;\n}\n\nconst dark: DubsTheme = {\n  background: '#08080D',\n  surface: '#111118',\n  surfaceActive: '#7C3AED',\n  border: '#1A1A24',\n  text: '#FFFFFF',\n  textSecondary: '#E0E0EE',\n  textMuted: '#666666',\n  textDim: '#555555',\n  accent: '#7C3AED',\n  success: '#22C55E',\n  live: '#EF4444',\n  errorText: '#F87171',\n  errorBg: '#1A0A0A',\n  errorBorder: '#3A1515',\n};\n\nconst light: DubsTheme = {\n  background: '#FFFFFF',\n  surface: '#F0F0F5',\n  surfaceActive: '#7C3AED',\n  border: '#E0E0E8',\n  text: '#111118',\n  textSecondary: '#333333',\n  textMuted: '#888888',\n  textDim: '#999999',\n  accent: '#7C3AED',\n  success: '#16A34A',\n  live: '#DC2626',\n  errorText: '#DC2626',\n  errorBg: '#FEF2F2',\n  errorBorder: '#FECACA',\n};\n\n/** Context for provider-level theme overrides (e.g. accent color from developer config). */\nconst ThemeOverrideContext = createContext<Partial<DubsTheme>>({});\nexport const ThemeOverrideProvider = ThemeOverrideContext.Provider;\n\nexport function useDubsTheme(): DubsTheme {\n  const scheme = useColorScheme();\n  const base = scheme === 'light' ? light : dark;\n  const overrides = useContext(ThemeOverrideContext);\n  if (Object.keys(overrides).length === 0) return base;\n  return { ...base, ...overrides };\n}\n\n/** Merge overrides into a base theme (e.g. custom accent color from developer config) */\nexport function mergeTheme(base: DubsTheme, overrides: Partial<DubsTheme>): DubsTheme {\n  return { ...base, ...overrides };\n}\n","import React, { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';\nimport { Platform } from 'react-native';\nimport { MwaWalletAdapter } from './wallet/mwa-adapter';\nimport { PhantomDeeplinkAdapter } from './wallet/phantom-deeplink';\nimport type { PhantomSession } from './wallet/phantom-deeplink';\nimport type { WalletAdapter } from './wallet/types';\nimport { ConnectWalletScreen } from './ui/ConnectWalletScreen';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { TokenStorage } from './storage';\nimport { STORAGE_KEYS } from './storage';\n\nconst TAG = '[Dubs:ManagedWallet]';\n\n/** Auto-detect redirect URI on iOS using the app's scheme from expo-linking. */\nfunction getDefaultRedirectUri(): string | undefined {\n  if (Platform.OS !== 'ios') return undefined;\n  try {\n    const expoLinking = require('expo-linking');\n    if (expoLinking.createURL) {\n      const uri = expoLinking.createURL('phantom-callback');\n      console.log(TAG, 'Auto-detected redirect URI via expo-linking:', uri);\n      return uri;\n    }\n  } catch {}\n  try {\n    const Constants = require('expo-constants').default;\n    const scheme = Constants.expoConfig?.scheme;\n    if (scheme) {\n      const uri = `${scheme}://phantom-callback`;\n      console.log(TAG, 'Auto-detected redirect URI via expo-constants:', uri);\n      return uri;\n    }\n  } catch {}\n  return undefined;\n}\n\n// ── Module-level Phantom adapter singleton ──\n// Persists across React remounts (e.g. when the app backgrounds to open Phantom).\n// This prevents the Linking listener from being torn down mid-flow.\nlet phantomSingleton: PhantomDeeplinkAdapter | null = null;\n\nfunction getOrCreatePhantomAdapter(config: {\n  redirectUri: string;\n  appUrl?: string;\n  cluster: string;\n  storage: TokenStorage;\n}): PhantomDeeplinkAdapter {\n  if (!phantomSingleton) {\n    console.log(TAG, 'Creating PhantomDeeplinkAdapter (singleton)');\n    phantomSingleton = new PhantomDeeplinkAdapter({\n      redirectUri: config.redirectUri,\n      appUrl: config.appUrl,\n      cluster: config.cluster,\n      storage: config.storage,\n      onSessionChange: (session) => {\n        if (session) {\n          console.log(TAG, 'Phantom session changed — saving to storage, wallet:', session.walletPublicKey);\n          config.storage.setItem(STORAGE_KEYS.PHANTOM_SESSION, JSON.stringify(session)).catch((err) => {\n            console.log(TAG, 'Failed to save Phantom session:', err);\n          });\n        } else {\n          console.log(TAG, 'Phantom session cleared — removing from storage');\n          config.storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch((err) => {\n            console.log(TAG, 'Failed to delete Phantom session:', err);\n          });\n        }\n      },\n    });\n  }\n  return phantomSingleton;\n}\n\n// ── Disconnect Context (internal) ──\n\ntype DisconnectFn = () => Promise<void>;\n\nexport const DisconnectContext = createContext<DisconnectFn | null>(null);\n\nexport function useDisconnect(): DisconnectFn | null {\n  return useContext(DisconnectContext);\n}\n\n// ── Props ──\n\ninterface ManagedWalletProviderProps {\n  appName: string;\n  cluster: string;\n  storage: TokenStorage;\n  renderConnectScreen?: ((props: ConnectWalletScreenProps) => React.ReactNode) | false;\n  /** Developer UI config overrides for the connect screen */\n  accentColor?: string;\n  appIcon?: string;\n  tagline?: string;\n  /** Deeplink redirect URI for Phantom (required on iOS, optional on Android) */\n  redirectUri?: string;\n  /** App URL shown in Phantom's connect screen */\n  appUrl?: string;\n  children: (adapter: WalletAdapter) => React.ReactNode;\n}\n\n// ── Component ──\n\nexport function ManagedWalletProvider({\n  appName,\n  cluster,\n  storage,\n  renderConnectScreen,\n  accentColor,\n  appIcon,\n  tagline,\n  redirectUri,\n  appUrl,\n  children,\n}: ManagedWalletProviderProps) {\n  const [connected, setConnected] = useState(false);\n  const [connecting, setConnecting] = useState(false);\n  const [isReady, setIsReady] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  // Determine which adapter to use:\n  // - Android → MWA (Phantom + other wallets support Mobile Wallet Adapter natively)\n  // - iOS → Phantom deeplinks (MWA not available on iOS)\n  const resolvedRedirectUri = redirectUri || getDefaultRedirectUri();\n  const usePhantom = Platform.OS === 'ios' && !!resolvedRedirectUri;\n\n  console.log(TAG, `Platform: ${Platform.OS}, redirectUri: ${resolvedRedirectUri ?? 'none'} (explicit: ${!!redirectUri}), usePhantom: ${usePhantom}`);\n\n  const adapterRef = useRef<WalletAdapter | null>(null);\n  const transactRef = useRef<any>(null);\n\n  // Lazily create adapter — Phantom uses a module-level singleton to survive remounts\n  if (!adapterRef.current) {\n    if (usePhantom) {\n      adapterRef.current = getOrCreatePhantomAdapter({\n        redirectUri: resolvedRedirectUri!,\n        appUrl,\n        cluster,\n        storage,\n      });\n    } else {\n      console.log(TAG, 'Creating MwaWalletAdapter');\n      adapterRef.current = new MwaWalletAdapter({\n        transact: (...args: any[]) => {\n          if (!transactRef.current) {\n            throw new Error(\n              '@dubsdotapp/expo: @solana-mobile/mobile-wallet-adapter-protocol-web3js is required. ' +\n              'Install it with: npm install @solana-mobile/mobile-wallet-adapter-protocol-web3js',\n            );\n          }\n          return transactRef.current(...args);\n        },\n        appIdentity: { name: appName, uri: appUrl },\n        cluster,\n        onAuthTokenChange: (token) => {\n          if (token) {\n            storage.setItem(STORAGE_KEYS.MWA_AUTH_TOKEN, token).catch(() => {});\n          } else {\n            storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n          }\n        },\n      });\n    }\n  }\n  const adapter = adapterRef.current;\n\n  // Restore session / dynamic-import on mount\n  useEffect(() => {\n    let cancelled = false;\n\n    (async () => {\n      if (usePhantom) {\n        const phantom = adapter as PhantomDeeplinkAdapter;\n\n        // If the singleton is already connected (e.g. after returning from Phantom), skip restore\n        if (phantom.connected) {\n          console.log(TAG, 'Phantom adapter already connected, skipping restore');\n          if (!cancelled) {\n            setConnected(true);\n            setIsReady(true);\n          }\n          return;\n        }\n\n        // Check for cold-start recovery (Android killed the app during connect)\n        const coldStartUrl = phantom.consumeColdStartUrl();\n        if (coldStartUrl) {\n          try {\n            console.log(TAG, 'Cold-start URL detected, attempting recovery');\n            await phantom.completeConnectFromColdStart(coldStartUrl);\n            if (!cancelled) {\n              console.log(TAG, 'Cold-start recovery succeeded');\n              setConnected(true);\n              setIsReady(true);\n            }\n            return;\n          } catch (err) {\n            console.log(TAG, 'Cold-start recovery failed:', err instanceof Error ? err.message : err);\n            // Fall through to normal session restore\n          }\n        }\n\n        try {\n          const savedSession = await storage.getItem(STORAGE_KEYS.PHANTOM_SESSION);\n          if (savedSession && !cancelled) {\n            const session: PhantomSession = JSON.parse(savedSession);\n            console.log(TAG, 'Found saved Phantom session, restoring for wallet:', session.walletPublicKey);\n            phantom.restoreSession(session);\n            if (!cancelled) {\n              console.log(TAG, 'Phantom reconnected from saved session');\n              setConnected(true);\n            }\n          } else {\n            console.log(TAG, 'No saved Phantom session');\n          }\n        } catch (err) {\n          console.log(TAG, 'Phantom session restore failed:', err instanceof Error ? err.message : err);\n          await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {});\n        } finally {\n          if (!cancelled) {\n            console.log(TAG, 'Phantom init complete, marking ready');\n            setIsReady(true);\n          }\n        }\n      } else {\n        console.log(TAG, 'MWA path — dynamic-importing transact...');\n        try {\n          const mwa = await import('@solana-mobile/mobile-wallet-adapter-protocol-web3js');\n          if (cancelled) return;\n          transactRef.current = mwa.transact;\n          console.log(TAG, 'MWA transact loaded');\n        } catch {\n          console.log(TAG, 'MWA not installed — transact will throw on use');\n        }\n\n        try {\n          const savedToken = await storage.getItem(STORAGE_KEYS.MWA_AUTH_TOKEN);\n          const savedAddress = await storage.getItem(STORAGE_KEYS.MWA_WALLET_ADDRESS);\n          if (savedToken && savedAddress && !cancelled) {\n            console.log(TAG, 'Found saved MWA session, restoring silently for wallet:', savedAddress);\n            (adapter as MwaWalletAdapter).restoreSession(savedToken, savedAddress);\n            setConnected(true);\n          } else {\n            console.log(TAG, 'No saved MWA session (token or address missing)');\n          }\n        } catch (err) {\n          console.log(TAG, 'MWA session restore failed:', err instanceof Error ? err.message : err);\n          await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n          await storage.deleteItem(STORAGE_KEYS.MWA_WALLET_ADDRESS).catch(() => {});\n        } finally {\n          if (!cancelled) {\n            console.log(TAG, 'MWA init complete, marking ready');\n            setIsReady(true);\n          }\n        }\n      }\n    })();\n\n    return () => {\n      cancelled = true;\n    };\n  }, [adapter, storage, usePhantom]);\n\n  const handleConnect = useCallback(async () => {\n    console.log(TAG, 'handleConnect() — user tapped connect');\n    setConnecting(true);\n    setError(null);\n    try {\n      await adapter.connect!();\n      const walletAddress = adapter.publicKey?.toBase58();\n      console.log(TAG, 'handleConnect() — success, wallet:', walletAddress);\n      // Save wallet address for silent session restore on next launch (MWA only)\n      if (!usePhantom && walletAddress) {\n        storage.setItem(STORAGE_KEYS.MWA_WALLET_ADDRESS, walletAddress).catch(() => {});\n      }\n      setConnected(true);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : 'Connection failed';\n      console.log(TAG, 'handleConnect() — failed:', message);\n      setError(message);\n    } finally {\n      setConnecting(false);\n    }\n  }, [adapter, storage, usePhantom]);\n\n  const disconnect = useCallback(async () => {\n    console.log(TAG, 'disconnect() — clearing all state');\n    adapter.disconnect?.();\n    // Destroy and reset the singleton so a fresh adapter is created on next connect\n    if (usePhantom && phantomSingleton) {\n      console.log(TAG, 'Destroying Phantom singleton');\n      phantomSingleton.destroy();\n      phantomSingleton = null;\n      adapterRef.current = null;\n    }\n    await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n    await storage.deleteItem(STORAGE_KEYS.MWA_WALLET_ADDRESS).catch(() => {});\n    await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {});\n    await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n    await storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n    setConnected(false);\n    console.log(TAG, 'disconnect() — done');\n  }, [adapter, storage, usePhantom]);\n\n  // Show nothing until we've attempted silent reconnect\n  if (!isReady) {\n    console.log(TAG, 'Not ready yet — rendering null');\n    return null;\n  }\n\n  // Not connected — show connect screen\n  if (!connected) {\n    if (renderConnectScreen === false) {\n      return null;\n    }\n    const connectProps: ConnectWalletScreenProps = {\n      onConnect: handleConnect,\n      connecting,\n      error,\n      appName,\n      accentColor,\n      appIcon,\n      tagline,\n    };\n    if (renderConnectScreen) {\n      return <>{renderConnectScreen(connectProps)}</>;\n    }\n    return <ConnectWalletScreen {...connectProps} />;\n  }\n\n  // Connected — render children with adapter + disconnect\n  console.log(TAG, 'Rendering children — connected with wallet:', adapter.publicKey?.toBase58());\n  return (\n    <DisconnectContext.Provider value={disconnect}>\n      {children(adapter)}\n    </DisconnectContext.Provider>\n  );\n}\n","import { PublicKey, Transaction } from '@solana/web3.js';\nimport type { WalletAdapter } from './types';\n\n/** Convert an MWA address (base64 string or Uint8Array) to a PublicKey */\nfunction toPublicKey(address: string | Uint8Array): PublicKey {\n  if (address instanceof Uint8Array) {\n    return new PublicKey(address);\n  }\n  // MWA protocol returns addresses as base64 — decode to bytes\n  const bytes = Uint8Array.from(atob(address), (c) => c.charCodeAt(0));\n  return new PublicKey(bytes);\n}\n\n/** The `transact` function signature from @solana-mobile/mobile-wallet-adapter-protocol-web3js */\nexport type MwaTransactFn = (\n  callback: (wallet: any) => Promise<any>,\n) => Promise<any>;\n\nexport interface MwaAdapterConfig {\n  /** The MWA `transact` function — import it from @solana-mobile/mobile-wallet-adapter-protocol-web3js */\n  transact: MwaTransactFn;\n  appIdentity: {\n    name: string;\n    uri?: string;\n    icon?: string;\n  };\n  cluster?: string;\n  onAuthTokenChange?: (token: string | null) => void;\n}\n\n/**\n * Mobile Wallet Adapter implementation.\n * Wraps @solana-mobile/mobile-wallet-adapter-protocol-web3js.\n */\nexport class MwaWalletAdapter implements WalletAdapter {\n  private _publicKey: PublicKey | null = null;\n  private _connected = false;\n  private _authToken: string | null = null;\n  /** The raw base64-encoded address from MWA authorize — needed for signMessages */\n  private _mwaAddress: string | null = null;\n  private readonly config: MwaAdapterConfig;\n  private readonly transact: MwaTransactFn;\n\n  constructor(config: MwaAdapterConfig) {\n    this.config = config;\n    this.transact = config.transact;\n  }\n\n  get publicKey(): PublicKey | null {\n    return this._publicKey;\n  }\n\n  get connected(): boolean {\n    return this._connected;\n  }\n\n  get authToken(): string | null {\n    return this._authToken;\n  }\n\n  setAuthToken(token: string | null): void {\n    this._authToken = token;\n  }\n\n  /**\n   * Restore a previous session silently (no wallet interaction).\n   * Sets the public key and auth token so the adapter appears connected.\n   * The next signing operation will reauthorize with Phantom.\n   */\n  restoreSession(token: string, walletAddressBase58: string): void {\n    this._authToken = token;\n    this._publicKey = new PublicKey(walletAddressBase58);\n    this._connected = true;\n  }\n\n  /**\n   * Connect to a mobile wallet. Call this before any signing.\n   * Tries reauthorize first (if we have a saved token), then falls back to\n   * a fresh authorize in a SEPARATE transact session.\n   */\n  async connect(): Promise<void> {\n    // Try reauthorize with saved token in its own transact session\n    if (this._authToken) {\n      try {\n        await this.transact(async (wallet) => {\n          const authResult = await wallet.reauthorize({ auth_token: this._authToken });\n          this.applyAuthResult(authResult);\n        });\n        return;\n      } catch {\n        // Stale token — clear it and do fresh authorize below\n        console.log('[Dubs:MWA] reauthorize failed, clearing token and doing fresh authorize');\n        this._authToken = null;\n        this.config.onAuthTokenChange?.(null);\n      }\n    }\n\n    // Fresh authorize in a new transact session\n    await this.transact(async (wallet) => {\n      const authResult = await wallet.authorize({\n        identity: this.config.appIdentity,\n        cluster: this.config.cluster || 'mainnet-beta',\n      });\n      this.applyAuthResult(authResult);\n    });\n  }\n\n  /**\n   * Disconnect and clear auth token.\n   */\n  disconnect(): void {\n    this._publicKey = null;\n    this._connected = false;\n    this._authToken = null;\n    this._mwaAddress = null;\n    this.config.onAuthTokenChange?.(null);\n  }\n\n  async signTransaction(transaction: Transaction): Promise<Transaction> {\n    if (!this._connected) throw new Error('Wallet not connected');\n\n    const signed = await this.transact(async (wallet) => {\n      const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n      this.applyAuthResult(reauth);\n\n      const result = await wallet.signTransactions({\n        transactions: [transaction],\n      });\n      return result[0];\n    });\n\n    return signed;\n  }\n\n  async signMessage(message: Uint8Array): Promise<Uint8Array> {\n    if (!this._connected || !this._publicKey) throw new Error('Wallet not connected');\n\n    const sig = await this.transact(async (wallet) => {\n      const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n      this.applyAuthResult(reauth);\n\n      const result = await wallet.signMessages({\n        addresses: [reauth.accounts[0].address],\n        payloads: [message],\n      });\n      return result[0];\n    });\n\n    return sig instanceof Uint8Array ? sig : new Uint8Array(sig);\n  }\n\n  async signAndSendTransaction(transaction: Transaction): Promise<string> {\n    if (!this._connected) throw new Error('Wallet not connected');\n\n    let signature: any;\n    try {\n      signature = await this.transact(async (wallet) => {\n        const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n        this.applyAuthResult(reauth);\n\n        const result = await wallet.signAndSendTransactions({\n          transactions: [transaction],\n        });\n        return result[0];\n      });\n    } catch (err: any) {\n      console.error('[Dubs:MWA] ===== signAndSendTransaction ERROR DUMP =====');\n      console.error('[Dubs:MWA] typeof:', typeof err);\n      console.error('[Dubs:MWA] value:', err);\n      console.error('[Dubs:MWA] message:', err?.message);\n      console.error('[Dubs:MWA] name:', err?.name);\n      console.error('[Dubs:MWA] code:', err?.code);\n      console.error('[Dubs:MWA] cause:', err?.cause);\n      console.error('[Dubs:MWA] stack:', err?.stack);\n      console.error('[Dubs:MWA] JSON:', (() => { try { return JSON.stringify(err, Object.getOwnPropertyNames(err ?? {})); } catch { return 'unstringifiable'; } })());\n      console.error('[Dubs:MWA] ===== END DUMP =====');\n      throw err;\n    }\n\n    // MWA returns Uint8Array signature — convert to base58 string\n    if (signature instanceof Uint8Array) {\n      return new PublicKey(signature).toBase58();\n    }\n\n    return String(signature);\n  }\n\n  private applyAuthResult(authResult: any): void {\n    this._mwaAddress = authResult.accounts[0].address as string;\n    this._publicKey = toPublicKey(this._mwaAddress);\n    this._authToken = authResult.auth_token;\n    this._connected = true;\n    this.config.onAuthTokenChange?.(this._authToken);\n  }\n}\n","import { PublicKey, Transaction } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport type { WalletAdapter } from '../types';\nimport type { TokenStorage } from '../../storage';\nimport { STORAGE_KEYS } from '../../storage';\nimport {\n  generateKeyPair,\n  deriveSharedSecret,\n  encryptPayload,\n  decryptPayload,\n} from './crypto';\nimport { DeeplinkHandler } from './deeplink-handler';\n\nconst TAG = '[Dubs:PhantomAdapter]';\n\n/** Serializable session state — save this to restore without a deeplink round-trip. */\nexport interface PhantomSession {\n  /** Our x25519 public key (base58) */\n  dappPublicKey: string;\n  /** Our x25519 secret key (base58) */\n  dappSecretKey: string;\n  /** Phantom's x25519 public key (base58) */\n  phantomPublicKey: string;\n  /** Shared secret (base58) */\n  sharedSecret: string;\n  /** Phantom session token (opaque string) */\n  sessionToken: string;\n  /** User's wallet public key (base58) */\n  walletPublicKey: string;\n}\n\nexport interface PhantomDeeplinkAdapterConfig {\n  /** The deeplink redirect URI, e.g. \"myapp://phantom-callback\" */\n  redirectUri: string;\n  /** Shown in Phantom's connect screen */\n  appUrl?: string;\n  /** Solana cluster: 'devnet' | 'mainnet-beta' */\n  cluster?: string;\n  /** Deeplink round-trip timeout in ms (default 120000) */\n  timeout?: number;\n  /** Called when the Phantom session changes (save/clear for persistence) */\n  onSessionChange?: (session: PhantomSession | null) => void;\n  /** Storage for persisting in-flight connect state (cold-start recovery on Android) */\n  storage?: TokenStorage;\n}\n\nlet requestCounter = 0;\nfunction nextRequestId(): string {\n  return `req${Date.now()}_${++requestCounter}`;\n}\n\n/**\n * Phantom wallet adapter using deeplinks (works on iOS and Android).\n * Uses x25519 encrypted communication per Phantom's deeplink protocol.\n */\nexport class PhantomDeeplinkAdapter implements WalletAdapter {\n  private _publicKey: PublicKey | null = null;\n  private _connected = false;\n  private _dappKeyPair: { publicKey: Uint8Array; secretKey: Uint8Array } | null = null;\n  private _sharedSecret: Uint8Array | null = null;\n  private _sessionToken: string | null = null;\n  private _phantomPublicKey: Uint8Array | null = null;\n\n  private readonly config: PhantomDeeplinkAdapterConfig;\n  private readonly handler: DeeplinkHandler;\n  private readonly timeout: number;\n\n  constructor(config: PhantomDeeplinkAdapterConfig) {\n    console.log(TAG, 'Creating adapter with config:', {\n      redirectUri: config.redirectUri,\n      appUrl: config.appUrl,\n      cluster: config.cluster,\n      timeout: config.timeout,\n    });\n    this.config = config;\n    this.timeout = config.timeout ?? 120_000;\n    this.handler = new DeeplinkHandler(config.redirectUri);\n    this.handler.start();\n    console.log(TAG, 'Adapter created and deeplink listener started');\n  }\n\n  get publicKey(): PublicKey | null {\n    return this._publicKey;\n  }\n\n  get connected(): boolean {\n    return this._connected;\n  }\n\n  /**\n   * Restore a previously saved session without opening Phantom.\n   * Call this before connect() if you have persisted session state.\n   */\n  restoreSession(saved: PhantomSession): void {\n    console.log(TAG, 'Restoring session for wallet:', saved.walletPublicKey);\n    this._dappKeyPair = {\n      publicKey: bs58.decode(saved.dappPublicKey),\n      secretKey: bs58.decode(saved.dappSecretKey),\n    };\n    this._phantomPublicKey = bs58.decode(saved.phantomPublicKey);\n    this._sharedSecret = bs58.decode(saved.sharedSecret);\n    this._sessionToken = saved.sessionToken;\n    this._publicKey = new PublicKey(saved.walletPublicKey);\n    this._connected = true;\n    console.log(TAG, 'Session restored successfully — connected:', this._publicKey.toBase58());\n  }\n\n  /** Serialize the current session for persistence. Returns null if not connected. */\n  getSession(): PhantomSession | null {\n    if (\n      !this._connected ||\n      !this._dappKeyPair ||\n      !this._phantomPublicKey ||\n      !this._sharedSecret ||\n      !this._sessionToken ||\n      !this._publicKey\n    ) {\n      return null;\n    }\n    return {\n      dappPublicKey: bs58.encode(this._dappKeyPair.publicKey),\n      dappSecretKey: bs58.encode(this._dappKeyPair.secretKey),\n      phantomPublicKey: bs58.encode(this._phantomPublicKey),\n      sharedSecret: bs58.encode(this._sharedSecret),\n      sessionToken: this._sessionToken,\n      walletPublicKey: this._publicKey.toBase58(),\n    };\n  }\n\n  async connect(): Promise<void> {\n    console.log(TAG, 'connect() — generating x25519 keypair');\n    // Generate a fresh keypair for this connection\n    this._dappKeyPair = generateKeyPair();\n    const dappPubBase58 = bs58.encode(this._dappKeyPair.publicKey);\n    console.log(TAG, 'Dapp public key:', dappPubBase58);\n\n    const requestId = nextRequestId();\n    // Use clean redirect_link without query params — Phantom appends its own params\n    const redirectLink = this.config.redirectUri;\n    console.log(TAG, `connect() requestId=${requestId} redirectLink=${redirectLink}`);\n\n    // app_url is required by Phantom — default to redirectUri if not provided\n    const appUrl = this.config.appUrl || this.config.redirectUri;\n    console.log(TAG, 'Using app_url:', appUrl);\n\n    const params = new URLSearchParams({\n      dapp_encryption_public_key: dappPubBase58,\n      // Force mainnet-beta for deeplink session — devnet sessions cause -32603 on signMessage\n      cluster: 'mainnet-beta',\n      redirect_link: redirectLink,\n      app_url: appUrl,\n    });\n\n    // Persist in-flight state so we can recover if the OS kills the app (Android cold-start)\n    if (this.config.storage) {\n      console.log(TAG, 'Saving in-flight connect state to storage');\n      await this.config.storage.setItem(\n        STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT,\n        JSON.stringify({\n          dappPublicKey: dappPubBase58,\n          dappSecretKey: bs58.encode(this._dappKeyPair.secretKey),\n          requestId,\n          createdAt: Date.now(),\n        }),\n      );\n    }\n\n    const url = `https://phantom.app/ul/v1/connect?${params.toString()}`;\n    console.log(TAG, 'Opening Phantom connect deeplink...');\n    const response = await this.handler.send(url, requestId, this.timeout);\n    console.log(TAG, 'Received connect response, param keys:', Object.keys(response.params).join(', '));\n\n    // Extract Phantom's public key and derive shared secret\n    const phantomPubBase58 = response.params.phantom_encryption_public_key;\n    if (!phantomPubBase58) {\n      console.log(TAG, 'ERROR: No phantom_encryption_public_key in response');\n      throw new Error('Phantom did not return an encryption public key');\n    }\n    console.log(TAG, 'Phantom public key:', phantomPubBase58);\n\n    this._phantomPublicKey = bs58.decode(phantomPubBase58);\n    this._sharedSecret = deriveSharedSecret(\n      this._dappKeyPair.secretKey,\n      this._phantomPublicKey,\n    );\n    console.log(TAG, 'Shared secret derived, decrypting response...');\n\n    // Decrypt the connect response data\n    const data = decryptPayload(\n      response.params.data,\n      response.params.nonce,\n      this._sharedSecret,\n    );\n    console.log(TAG, 'Decrypted connect data — public_key:', data.public_key, 'session length:', data.session?.length);\n\n    this._sessionToken = data.session;\n    this._publicKey = new PublicKey(data.public_key);\n    this._connected = true;\n\n    console.log(TAG, 'Connected! Wallet:', this._publicKey.toBase58());\n\n    // Notify consumer of new session\n    this.config.onSessionChange?.(this.getSession());\n\n    // Clear in-flight state now that connect succeeded\n    this.config.storage?.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n  }\n\n  disconnect(): void {\n    console.log(TAG, 'disconnect() — clearing state, was connected:', this._connected, 'wallet:', this._publicKey?.toBase58());\n    this._publicKey = null;\n    this._connected = false;\n    this._dappKeyPair = null;\n    this._sharedSecret = null;\n    this._sessionToken = null;\n    this._phantomPublicKey = null;\n    this.config.onSessionChange?.(null);\n    console.log(TAG, 'Disconnected');\n  }\n\n  /**\n   * Return and clear the stashed cold-start URL from the deeplink handler.\n   * Used by ManagedWalletProvider to detect an in-flight connect on cold start.\n   */\n  consumeColdStartUrl(): string | null {\n    return this.handler.getColdStartUrl();\n  }\n\n  /**\n   * Complete a connect flow that was interrupted by the OS killing the app (Android).\n   * Loads the saved in-flight keypair from storage, decrypts the Phantom response\n   * from the cold-start URL, and restores the session.\n   */\n  async completeConnectFromColdStart(url: string): Promise<void> {\n    if (!this.config.storage) {\n      throw new Error('Cannot recover cold-start connect: no storage configured');\n    }\n\n    console.log(TAG, 'completeConnectFromColdStart() — attempting recovery');\n\n    const raw = await this.config.storage.getItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT);\n    if (!raw) {\n      throw new Error('No in-flight connect state found in storage');\n    }\n\n    const inFlight = JSON.parse(raw) as {\n      dappPublicKey: string;\n      dappSecretKey: string;\n      requestId: string;\n      createdAt: number;\n    };\n\n    // Check expiry (120s)\n    const age = Date.now() - inFlight.createdAt;\n    if (age > 120_000) {\n      console.log(TAG, `In-flight state expired (${Math.round(age / 1000)}s old), clearing`);\n      await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n      throw new Error('In-flight connect state expired');\n    }\n\n    console.log(TAG, `In-flight state age: ${Math.round(age / 1000)}s, requestId: ${inFlight.requestId}`);\n\n    // Restore keypair from storage\n    this._dappKeyPair = {\n      publicKey: bs58.decode(inFlight.dappPublicKey),\n      secretKey: bs58.decode(inFlight.dappSecretKey),\n    };\n\n    // Parse the Phantom callback URL\n    const parsed = new URL(url);\n    const params: Record<string, string> = {};\n    parsed.searchParams.forEach((value, key) => {\n      params[key] = value;\n    });\n\n    // Check for Phantom error\n    if (params.errorCode) {\n      const errorMessage = params.errorMessage\n        ? decodeURIComponent(params.errorMessage)\n        : `Phantom error code: ${params.errorCode}`;\n      await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n      throw new Error(errorMessage);\n    }\n\n    const phantomPubBase58 = params.phantom_encryption_public_key;\n    if (!phantomPubBase58) {\n      await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n      throw new Error('Phantom did not return an encryption public key');\n    }\n\n    console.log(TAG, 'Cold-start: Phantom public key:', phantomPubBase58);\n\n    this._phantomPublicKey = bs58.decode(phantomPubBase58);\n    this._sharedSecret = deriveSharedSecret(\n      this._dappKeyPair.secretKey,\n      this._phantomPublicKey,\n    );\n\n    const data = decryptPayload(params.data, params.nonce, this._sharedSecret);\n    console.log(TAG, 'Cold-start: Decrypted connect data — public_key:', data.public_key);\n\n    this._sessionToken = data.session;\n    this._publicKey = new PublicKey(data.public_key);\n    this._connected = true;\n\n    console.log(TAG, 'Cold-start recovery complete! Wallet:', this._publicKey.toBase58());\n\n    // Notify consumer of new session\n    this.config.onSessionChange?.(this.getSession());\n\n    // Clear in-flight state\n    await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n  }\n\n  async signTransaction(transaction: Transaction): Promise<Transaction> {\n    this.assertConnected();\n    console.log(TAG, 'signTransaction() — serializing transaction');\n\n    const serializedTx = bs58.encode(\n      transaction.serialize({ requireAllSignatures: false, verifySignatures: false }),\n    );\n    console.log(TAG, 'Transaction serialized, length:', serializedTx.length);\n\n    const { nonce, ciphertext } = encryptPayload(\n      { transaction: serializedTx, session: this._sessionToken },\n      this._sharedSecret!,\n    );\n\n    const requestId = nextRequestId();\n    const redirectLink = this.config.redirectUri;\n    console.log(TAG, `signTransaction() requestId=${requestId}`);\n\n    const params = new URLSearchParams({\n      dapp_encryption_public_key: bs58.encode(this._dappKeyPair!.publicKey),\n      nonce,\n      payload: ciphertext,\n      redirect_link: redirectLink,\n    });\n\n    const url = `https://phantom.app/ul/v1/signTransaction?${params.toString()}`;\n    console.log(TAG, 'Opening Phantom signTransaction deeplink...');\n    const response = await this.handler.send(url, requestId, this.timeout);\n    console.log(TAG, 'Received signTransaction response');\n\n    const data = decryptPayload(\n      response.params.data,\n      response.params.nonce,\n      this._sharedSecret!,\n    );\n    console.log(TAG, 'Decrypted signed transaction, length:', data.transaction?.length);\n\n    return Transaction.from(bs58.decode(data.transaction));\n  }\n\n  async signMessage(message: Uint8Array): Promise<Uint8Array> {\n    this.assertConnected();\n    console.log(TAG, 'signMessage() — message length:', message.length);\n\n    const encodedMessage = bs58.encode(message);\n    // Match Phantom demo app exactly: { session, message } — no display field\n    const payload = {\n      session: this._sessionToken,\n      message: encodedMessage,\n    };\n    console.log(TAG, 'signMessage() payload keys:', Object.keys(payload).join(', '));\n    console.log(TAG, 'signMessage() message (first 40 chars):', encodedMessage.substring(0, 40) + '...');\n    console.log(TAG, 'signMessage() session (first 20 chars):', this._sessionToken?.substring(0, 20) + '...');\n    console.log(TAG, 'signMessage() sharedSecret length:', this._sharedSecret!.length);\n    console.log(TAG, 'signMessage() dappPubKey:', bs58.encode(this._dappKeyPair!.publicKey));\n\n    // Verify encryption round-trip before sending\n    const { nonce, ciphertext } = encryptPayload(payload, this._sharedSecret!);\n    console.log(TAG, 'signMessage() encrypted — nonce length:', bs58.decode(nonce).length, 'ciphertext length:', bs58.decode(ciphertext).length);\n\n    // Self-test: verify we can decrypt our own payload\n    try {\n      const selfTest = decryptPayload(ciphertext, nonce, this._sharedSecret!);\n      console.log(TAG, 'signMessage() self-test decrypt OK — keys:', Object.keys(selfTest).join(', '));\n    } catch (err) {\n      console.log(TAG, 'signMessage() SELF-TEST FAILED:', err instanceof Error ? err.message : err);\n    }\n\n    const requestId = nextRequestId();\n    // Clean redirect_link — no query params. Phantom appends its own response params.\n    const redirectLink = this.config.redirectUri;\n    console.log(TAG, `signMessage() requestId=${requestId} redirectLink=${redirectLink}`);\n\n    const params = new URLSearchParams({\n      dapp_encryption_public_key: bs58.encode(this._dappKeyPair!.publicKey),\n      nonce,\n      payload: ciphertext,\n      redirect_link: redirectLink,\n    });\n\n    const url = `https://phantom.app/ul/v1/signMessage?${params.toString()}`;\n    console.log(TAG, 'signMessage() full URL length:', url.length);\n    console.log(TAG, 'Opening Phantom signMessage deeplink...');\n    const response = await this.handler.send(url, requestId, this.timeout);\n    console.log(TAG, 'Received signMessage response');\n\n    const data = decryptPayload(\n      response.params.data,\n      response.params.nonce,\n      this._sharedSecret!,\n    );\n    console.log(TAG, 'Message signed, signature:', data.signature?.substring(0, 20) + '...');\n\n    return bs58.decode(data.signature);\n  }\n\n  /** Remove the Linking event listener. Call when the adapter is no longer needed. */\n  destroy(): void {\n    console.log(TAG, 'destroy() — cleaning up');\n    this.handler.destroy();\n  }\n\n  private assertConnected(): void {\n    if (!this._connected || !this._sharedSecret || !this._sessionToken) {\n      console.log(TAG, 'assertConnected FAILED — connected:', this._connected, 'hasSecret:', !!this._sharedSecret, 'hasSession:', !!this._sessionToken);\n      throw new Error('Wallet not connected');\n    }\n  }\n}\n","import nacl from 'tweetnacl';\nimport bs58 from 'bs58';\n\nexport interface KeyPair {\n  publicKey: Uint8Array;\n  secretKey: Uint8Array;\n}\n\n/** Generate an x25519 keypair for Diffie-Hellman key exchange with Phantom. */\nexport function generateKeyPair(): KeyPair {\n  const kp = nacl.box.keyPair();\n  return { publicKey: kp.publicKey, secretKey: kp.secretKey };\n}\n\n/** Derive a shared secret from our secret key and Phantom's public key. */\nexport function deriveSharedSecret(\n  ourSecretKey: Uint8Array,\n  theirPublicKey: Uint8Array,\n): Uint8Array {\n  return nacl.box.before(theirPublicKey, ourSecretKey);\n}\n\n/** Encrypt a payload for Phantom using the shared secret. */\nexport function encryptPayload(\n  payload: object,\n  sharedSecret: Uint8Array,\n): { nonce: string; ciphertext: string } {\n  const nonce = nacl.randomBytes(24);\n  const message = new TextEncoder().encode(JSON.stringify(payload));\n  const encrypted = nacl.box.after(message, nonce, sharedSecret);\n  if (!encrypted) throw new Error('Encryption failed');\n  return {\n    nonce: bs58.encode(nonce),\n    ciphertext: bs58.encode(encrypted),\n  };\n}\n\n/** Decrypt a payload returned by Phantom using the shared secret. */\nexport function decryptPayload(\n  ciphertextBase58: string,\n  nonceBase58: string,\n  sharedSecret: Uint8Array,\n): Record<string, any> {\n  const ciphertext = bs58.decode(ciphertextBase58);\n  const nonce = bs58.decode(nonceBase58);\n  const decrypted = nacl.box.open.after(ciphertext, nonce, sharedSecret);\n  if (!decrypted) throw new Error('Decryption failed — invalid shared secret or corrupted data');\n  return JSON.parse(new TextDecoder().decode(decrypted));\n}\n","import { Linking } from 'react-native';\n\nconst TAG = '[Dubs:DeeplinkHandler]';\n\nexport interface DeeplinkResponse {\n  /** All query parameters from the redirect URL */\n  params: Record<string, string>;\n}\n\ninterface PendingRequest {\n  resolve: (response: DeeplinkResponse) => void;\n  reject: (error: Error) => void;\n  timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Manages the deeplink round-trip with Phantom:\n *   1. Opens a Phantom deeplink URL\n *   2. Waits for Phantom to redirect back to our `redirectBase`\n *   3. Routes the response to the correct pending promise via request ID\n */\nexport class DeeplinkHandler {\n  private readonly redirectBase: string;\n  private readonly pending = new Map<string, PendingRequest>();\n  private subscription: ReturnType<typeof Linking.addEventListener> | null = null;\n  private _coldStartUrl: string | null = null;\n\n  constructor(redirectBase: string) {\n    // Strip trailing slashes for consistent matching\n    this.redirectBase = redirectBase.replace(/\\/+$/, '');\n    console.log(TAG, 'Created with redirectBase:', this.redirectBase);\n  }\n\n  /** Start listening for incoming deeplinks. Call once on adapter init. */\n  start(): void {\n    if (this.subscription) {\n      console.log(TAG, 'Already listening, skipping start()');\n      return;\n    }\n\n    console.log(TAG, 'Starting URL listener');\n    this.subscription = Linking.addEventListener('url', ({ url }) => {\n      console.log(TAG, 'Received URL event:', url);\n      this.handleUrl(url);\n    });\n\n    // Check for cold-start URL (app was launched via deeplink)\n    Linking.getInitialURL().then((url) => {\n      if (url) {\n        console.log(TAG, 'Cold-start URL found:', url);\n        this.handleUrl(url);\n      } else {\n        console.log(TAG, 'No cold-start URL');\n      }\n    });\n  }\n\n  /** Stop listening and reject all pending requests. */\n  destroy(): void {\n    console.log(TAG, 'Destroying — pending requests:', this.pending.size);\n    this.subscription?.remove();\n    this.subscription = null;\n\n    for (const [id, req] of this.pending) {\n      clearTimeout(req.timer);\n      req.reject(new Error('DeeplinkHandler destroyed'));\n      this.pending.delete(id);\n    }\n  }\n\n  /**\n   * Open a Phantom deeplink and wait for the redirect response.\n   * @param url The full Phantom deeplink URL to open\n   * @param requestId Unique ID embedded in the redirect_link param\n   * @param timeoutMs How long to wait before rejecting (default 120s)\n   */\n  async send(url: string, requestId: string, timeoutMs = 120_000): Promise<DeeplinkResponse> {\n    console.log(TAG, `send() requestId=${requestId} timeout=${timeoutMs}ms`);\n    console.log(TAG, 'Opening URL:', url.substring(0, 120) + (url.length > 120 ? '...' : ''));\n\n    return new Promise<DeeplinkResponse>((resolve, reject) => {\n      const timer = setTimeout(() => {\n        console.log(TAG, `Timeout reached for requestId=${requestId}`);\n        this.pending.delete(requestId);\n        reject(new Error(`Phantom deeplink timed out after ${timeoutMs / 1000}s`));\n      }, timeoutMs);\n\n      this.pending.set(requestId, { resolve, reject, timer });\n\n      Linking.openURL(url).catch((err) => {\n        console.log(TAG, `Failed to open URL: ${err.message}`);\n        this.pending.delete(requestId);\n        clearTimeout(timer);\n        reject(new Error(`Failed to open Phantom: ${err.message}`));\n      });\n    });\n  }\n\n  private handleUrl(url: string): void {\n    // Only process URLs that match our redirect base\n    if (!url.startsWith(this.redirectBase)) {\n      console.log(TAG, 'Ignoring URL (not our redirect base):', url.substring(0, 80));\n      return;\n    }\n\n    console.log(TAG, 'Processing redirect URL:', url.substring(0, 120) + (url.length > 120 ? '...' : ''));\n\n    const parsed = new URL(url);\n    const params: Record<string, string> = {};\n    parsed.searchParams.forEach((value, key) => {\n      params[key] = value;\n    });\n\n    const paramKeys = Object.keys(params);\n    console.log(TAG, 'Parsed params keys:', paramKeys.join(', '));\n\n    // Check for Phantom error\n    if (params.errorCode) {\n      const errorMessage = params.errorMessage\n        ? decodeURIComponent(params.errorMessage)\n        : `Phantom error code: ${params.errorCode}`;\n      console.log(TAG, `Phantom returned error: code=${params.errorCode} message=\"${errorMessage}\"`);\n\n      // Route error to the pending request if we can identify it\n      const requestId = this.extractRequestId(url);\n      if (requestId && this.pending.has(requestId)) {\n        console.log(TAG, `Routing error to requestId=${requestId}`);\n        const req = this.pending.get(requestId)!;\n        clearTimeout(req.timer);\n        this.pending.delete(requestId);\n        req.reject(new Error(errorMessage));\n        return;\n      }\n\n      // If we can't route it, reject all pending (only one is typically active)\n      console.log(TAG, `Cannot route error to specific request, rejecting all ${this.pending.size} pending`);\n      for (const [id, req] of this.pending) {\n        clearTimeout(req.timer);\n        req.reject(new Error(errorMessage));\n        this.pending.delete(id);\n      }\n      return;\n    }\n\n    // Route success to the correct pending request\n    const requestId = this.extractRequestId(url);\n    console.log(TAG, `Extracted requestId=${requestId}, pending requests: [${[...this.pending.keys()].join(', ')}]`);\n\n    if (requestId && this.pending.has(requestId)) {\n      console.log(TAG, `Resolving requestId=${requestId}`);\n      const req = this.pending.get(requestId)!;\n      clearTimeout(req.timer);\n      this.pending.delete(requestId);\n      req.resolve({ params });\n      return;\n    }\n\n    // Fallback: resolve the first (and usually only) pending request\n    const first = this.pending.entries().next().value;\n    if (first) {\n      const [id, req] = first;\n      console.log(TAG, `Fallback: resolving first pending requestId=${id}`);\n      clearTimeout(req.timer);\n      this.pending.delete(id);\n      req.resolve({ params });\n    } else {\n      console.log(TAG, 'No pending requests to resolve — stashing as cold-start URL');\n      this._coldStartUrl = url;\n    }\n  }\n\n  /** Return and clear the stashed cold-start URL (if any). */\n  getColdStartUrl(): string | null {\n    const url = this._coldStartUrl;\n    this._coldStartUrl = null;\n    return url;\n  }\n\n  /** Extract the request ID from the dubs_rid query parameter. */\n  private extractRequestId(url: string): string | null {\n    try {\n      const parsed = new URL(url);\n      return parsed.searchParams.get('dubs_rid');\n    } catch {\n      return null;\n    }\n  }\n}\n","import React from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  ActivityIndicator,\n  StyleSheet,\n  Image,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\n\nexport interface ConnectWalletScreenProps {\n  /** Called when the user taps Connect Wallet */\n  onConnect: () => void | Promise<void>;\n  /** Show a loading spinner on the button while connecting */\n  connecting?: boolean;\n  /** Error message to display (e.g. \"User rejected the request\") */\n  error?: string | null;\n  /** App name shown in the header. Defaults to \"Dubs\" */\n  appName?: string;\n  /** Override accent color (e.g. from developer UI config) */\n  accentColor?: string;\n  /** URL to app icon — renders as Image instead of the default letter circle */\n  appIcon?: string;\n  /** Override subtitle text below app name */\n  tagline?: string;\n}\n\nexport function ConnectWalletScreen({\n  onConnect,\n  connecting = false,\n  error = null,\n  appName = 'Dubs',\n  accentColor,\n  appIcon,\n  tagline,\n}: ConnectWalletScreenProps) {\n  const t = useDubsTheme();\n  const accent = accentColor || t.accent;\n\n  return (\n    <View style={[styles.container, { backgroundColor: t.background }]}>\n      <View style={styles.content}>\n        {/* Branding */}\n        <View style={styles.brandingSection}>\n          {appIcon ? (\n            <Image\n              source={{ uri: appIcon }}\n              style={styles.logoImage}\n            />\n          ) : (\n            <View style={[styles.logoCircle, { backgroundColor: accent }]}>\n              <Text style={styles.logoText}>\n                {appName.charAt(0).toUpperCase()}\n              </Text>\n            </View>\n          )}\n          <Text style={[styles.appName, { color: t.text }]}>{appName}</Text>\n          <Text style={[styles.subtitle, { color: t.textMuted }]}>\n            {tagline || 'Connect your Solana wallet to get started'}\n          </Text>\n        </View>\n\n        {/* Action */}\n        <View style={styles.actionSection}>\n          {error ? (\n            <View\n              style={[\n                styles.errorBox,\n                { backgroundColor: t.errorBg, borderColor: t.errorBorder },\n              ]}\n            >\n              <Text style={[styles.errorText, { color: t.errorText }]}>{error}</Text>\n            </View>\n          ) : null}\n\n          <TouchableOpacity\n            style={[styles.connectButton, { backgroundColor: accent }]}\n            onPress={onConnect}\n            disabled={connecting}\n            activeOpacity={0.8}\n          >\n            {connecting ? (\n              <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n            ) : (\n              <Text style={styles.connectButtonText}>Connect Wallet</Text>\n            )}\n          </TouchableOpacity>\n\n          <Text style={[styles.hint, { color: t.textDim }]}>\n            Phantom, Solflare, or any Solana wallet\n          </Text>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n  },\n  content: {\n    flex: 1,\n    justifyContent: 'space-between',\n    paddingHorizontal: 32,\n    paddingTop: 120,\n    paddingBottom: 80,\n  },\n  brandingSection: {\n    alignItems: 'center',\n    gap: 12,\n  },\n  logoCircle: {\n    width: 80,\n    height: 80,\n    borderRadius: 40,\n    justifyContent: 'center',\n    alignItems: 'center',\n    marginBottom: 8,\n  },\n  logoImage: {\n    width: 80,\n    height: 80,\n    borderRadius: 16,\n    marginBottom: 8,\n  },\n  logoText: {\n    fontSize: 36,\n    fontWeight: '800',\n    color: '#FFFFFF',\n  },\n  appName: {\n    fontSize: 32,\n    fontWeight: '800',\n  },\n  subtitle: {\n    fontSize: 16,\n    textAlign: 'center',\n    lineHeight: 22,\n  },\n  actionSection: {\n    gap: 16,\n  },\n  errorBox: {\n    borderWidth: 1,\n    borderRadius: 12,\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n  },\n  errorText: {\n    fontSize: 14,\n    textAlign: 'center',\n  },\n  connectButton: {\n    height: 56,\n    borderRadius: 16,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  connectButtonText: {\n    color: '#FFFFFF',\n    fontSize: 18,\n    fontWeight: '700',\n  },\n  hint: {\n    fontSize: 13,\n    textAlign: 'center',\n  },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  TextInput,\n  TouchableOpacity,\n  ActivityIndicator,\n  StyleSheet,\n  Keyboard,\n  KeyboardAvoidingView,\n  Platform,\n  Image,\n  Animated,\n  ScrollView,\n} from 'react-native';\nimport { useAuth } from '../hooks';\nimport { usePushNotifications } from '../hooks/usePushNotifications';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport { useDubsTheme } from './theme';\nimport { AvatarEditor, generateSeed, getAvatarUrl } from './AvatarEditor';\nimport type { AuthStatus } from '../types';\nimport type { DubsClient } from '../client';\n\n// ── Public Types ──\n\nexport interface RegistrationScreenProps {\n  onRegister: (username: string, referralCode?: string, avatarUrl?: string) => void;\n  registering: boolean;\n  error: Error | null;\n  client: DubsClient;\n}\n\nexport interface ConnectWalletScreenProps {\n  /** Call this to trigger the wallet connection flow */\n  onConnect: () => void;\n  /** True while the wallet is connecting/signing */\n  connecting: boolean;\n  /** Error from a failed connection attempt */\n  error: Error | null;\n}\n\nexport interface AuthGateProps {\n  children: React.ReactNode;\n  onSaveToken: (token: string | null) => void | Promise<void>;\n  onLoadToken: () => string | null | Promise<string | null>;\n  renderLoading?: (status: AuthStatus) => React.ReactNode;\n  renderError?: (error: Error, retry: () => void) => React.ReactNode;\n  renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n  /**\n   * Render your own connect-wallet screen.\n   * Receives { onConnect, connecting, error }.\n   * If omitted, the default ConnectWalletScreen is shown.\n   */\n  renderConnectWallet?: (props: ConnectWalletScreenProps) => React.ReactNode;\n  appName?: string;\n  /** Override accent color for registration screens (from developer UI config) */\n  accentColor?: string;\n}\n\n// ── AuthGate Component ──\n\nexport function AuthGate({\n  children,\n  onSaveToken,\n  onLoadToken,\n  renderLoading,\n  renderError,\n  renderRegistration,\n  renderConnectWallet,\n  appName = 'Dubs',\n  accentColor,\n}: AuthGateProps) {\n  const { client, pushEnabled, uiConfig } = useDubs();\n  const auth = useAuth();\n  const [phase, setPhase] = useState<'init' | 'active'>('init');\n  const [registrationPhase, setRegistrationPhase] = useState(false);\n  const [showPushSetup, setShowPushSetup] = useState(false);\n  const [isRestoredSession, setIsRestoredSession] = useState(false);\n\n  useEffect(() => {\n    let cancelled = false;\n    (async () => {\n      try {\n        const savedToken = await onLoadToken();\n        if (cancelled) return;\n        if (savedToken) {\n          const restored = await auth.restoreSession(savedToken);\n          if (cancelled) return;\n          if (restored) { setIsRestoredSession(true); setPhase('active'); return; }\n          await onSaveToken(null);\n        }\n        if (cancelled) return;\n        setPhase('active');\n        await auth.authenticate();\n      } catch {\n        if (!cancelled) setPhase('active');\n      }\n    })();\n    return () => { cancelled = true; };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  useEffect(() => {\n    if (auth.status === 'needsRegistration') setRegistrationPhase(true);\n  }, [auth.status]);\n\n  // Show push setup after new registration completes (not restored sessions).\n  // Gated on pushConfigured.android — if the developer hasn't uploaded FCM credentials\n  // for this app in the dev portal, push can't be delivered, so don't prompt.\n  useEffect(() => {\n    if (\n      pushEnabled &&\n      uiConfig.pushConfigured?.android &&\n      auth.status === 'authenticated' &&\n      registrationPhase &&\n      !isRestoredSession\n    ) {\n      setShowPushSetup(true);\n    }\n  }, [pushEnabled, uiConfig.pushConfigured?.android, auth.status, registrationPhase, isRestoredSession]);\n\n  useEffect(() => {\n    if (auth.token) onSaveToken(auth.token);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [auth.token]);\n\n  const retry = useCallback(() => {\n    setRegistrationPhase(false);\n    auth.reset();\n    auth.authenticate();\n  }, [auth]);\n\n  const handleRegister = useCallback(\n    (username: string, referralCode?: string, avatarUrl?: string) => {\n      auth.register(username, referralCode, avatarUrl);\n    },\n    [auth],\n  );\n\n  // ── Render ──\n\n  if (phase === 'init') {\n    if (renderLoading) return <>{renderLoading('authenticating')}</>;\n    return <DefaultLoadingScreen status=\"authenticating\" appName={appName} accentColor={accentColor} />;\n  }\n\n  // Keep the registration screen mounted through the push step so the transition\n  // from step 3 (referral) → step 4 (push) animates as a continuation of the same flow.\n  const inRegistrationFlow =\n    registrationPhase &&\n    (auth.status === 'needsRegistration' ||\n      auth.status === 'registering' ||\n      (auth.status === 'authenticated' && showPushSetup));\n\n  if (auth.status === 'authenticated' && !inRegistrationFlow) {\n    return (\n      <AuthContext.Provider value={auth}>\n        {pushEnabled && <PushTokenRestorer />}\n        {children}\n      </AuthContext.Provider>\n    );\n  }\n\n  if (inRegistrationFlow) {\n    const isRegistering = auth.status === 'registering';\n    const regError = auth.status === 'error' ? auth.error : null;\n    if (renderRegistration) {\n      return <>{renderRegistration({ onRegister: handleRegister, registering: isRegistering, error: regError, client })}</>;\n    }\n    return (\n      <DefaultRegistrationScreen\n        onRegister={handleRegister}\n        registering={isRegistering}\n        error={regError}\n        client={client}\n        appName={appName}\n        accentColor={accentColor}\n        pushStepActive={showPushSetup}\n        onPushComplete={() => setShowPushSetup(false)}\n      />\n    );\n  }\n\n  if (auth.status === 'error' && auth.error) {\n    if (renderError) return <>{renderError(auth.error, retry)}</>;\n    return <DefaultErrorScreen error={auth.error} onRetry={retry} appName={appName} accentColor={accentColor} />;\n  }\n\n  // idle = waiting for user to connect — show connect wallet screen\n  if (auth.status === 'idle') {\n    const connectProps: ConnectWalletScreenProps = {\n      onConnect: auth.authenticate,\n      connecting: false,\n      error: null,\n    };\n    if (renderConnectWallet) return <>{renderConnectWallet(connectProps)}</>;\n    // Fall through to default loading (existing behaviour if no renderConnectWallet)\n  }\n\n  if (renderLoading) return <>{renderLoading(auth.status)}</>;\n  return <DefaultLoadingScreen status={auth.status} appName={appName} accentColor={accentColor} />;\n}\n\n// ── Default Loading Screen ──\n\nfunction DefaultLoadingScreen({ status, appName, accentColor }: { status: AuthStatus; appName: string; accentColor?: string }) {\n  const t = useDubsTheme();\n  const accent = accentColor || t.accent;\n  const statusText: Record<AuthStatus, string> = {\n    idle: 'Initializing...',\n    authenticating: 'Connecting...',\n    signing: 'Approve in your wallet...',\n    verifying: 'Verifying...',\n    registering: 'Creating account...',\n    needsRegistration: 'Almost there...',\n    authenticated: 'Ready!',\n    error: 'Something went wrong',\n  };\n  return (\n    <View style={[s.container, { backgroundColor: t.background }]}>\n      <View style={s.centerContent}>\n        <View style={s.brandingSection}>\n          <View style={[s.logoCircle, { backgroundColor: accent }]}>\n            <Text style={s.logoText}>D</Text>\n          </View>\n          <Text style={[s.appNameText, { color: t.text }]}>{appName}</Text>\n        </View>\n        <View style={s.loadingSection}>\n          <ActivityIndicator size=\"large\" color={accent} />\n          <Text style={[s.statusText, { color: t.textMuted }]}>{statusText[status] || 'Loading...'}</Text>\n        </View>\n      </View>\n    </View>\n  );\n}\n\n// ── Default Error Screen ──\n\nfunction DefaultErrorScreen({ error, onRetry, appName, accentColor }: { error: Error; onRetry: () => void; appName: string; accentColor?: string }) {\n  const t = useDubsTheme();\n  const accent = accentColor || t.accent;\n  return (\n    <View style={[s.container, { backgroundColor: t.background }]}>\n      <View style={s.spreadContent}>\n        <View style={s.brandingSection}>\n          <View style={[s.logoCircle, { backgroundColor: accent }]}>\n            <Text style={s.logoText}>D</Text>\n          </View>\n          <Text style={[s.appNameText, { color: t.text }]}>{appName}</Text>\n        </View>\n        <View style={{ gap: 16 }}>\n          <View style={[s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n            <Text style={[s.errorText, { color: t.errorText }]}>{error.message}</Text>\n          </View>\n          <TouchableOpacity style={[s.primaryBtn, { backgroundColor: accent }]} onPress={onRetry} activeOpacity={0.8}>\n            <Text style={s.primaryBtnText}>Try Again</Text>\n          </TouchableOpacity>\n        </View>\n      </View>\n    </View>\n  );\n}\n\n// ── Step Indicator ──\n\nfunction StepIndicator({ currentStep }: { currentStep: number }) {\n  const t = useDubsTheme();\n  const steps = [0, 1, 2, 3];\n  return (\n    <View style={s.stepRow}>\n      {steps.map((i) => (\n        <React.Fragment key={i}>\n          {i > 0 && (\n            <View style={[s.stepLine, { backgroundColor: i <= currentStep ? t.success : t.border }]} />\n          )}\n          <View\n            style={[\n              s.stepCircle,\n              i < currentStep\n                ? { backgroundColor: t.success }\n                : i === currentStep\n                ? { backgroundColor: t.accent }\n                : { backgroundColor: 'transparent', borderWidth: 2, borderColor: t.border },\n            ]}\n          >\n            {i < currentStep ? (\n              <Text style={s.stepCheck}>&#10003;</Text>\n            ) : (\n              <Text style={[s.stepNum, { color: i === currentStep ? '#FFF' : t.textMuted }]}>{i + 1}</Text>\n            )}\n          </View>\n        </React.Fragment>\n      ))}\n    </View>\n  );\n}\n\n// ── Default Registration Screen (3-Step Onboarding) ──\n\nfunction DefaultRegistrationScreen({\n  onRegister,\n  registering,\n  error,\n  client,\n  appName,\n  accentColor,\n  pushStepActive,\n  onPushComplete,\n}: RegistrationScreenProps & {\n  appName: string;\n  accentColor?: string;\n  pushStepActive?: boolean;\n  onPushComplete?: () => void;\n}) {\n  const t = useDubsTheme();\n  const accent = accentColor || t.accent;\n  const push = usePushNotifications();\n\n  // ── Shared state ──\n  const [step, setStep] = useState(0);\n  const [avatarSeed, setAvatarSeed] = useState(generateSeed);\n  const [avatarStyle, setAvatarStyle] = useState('adventurer');\n  const [avatarBg, setAvatarBg] = useState('1a1a2e');\n  const [showStyles, setShowStyles] = useState(false);\n  const [username, setUsername] = useState('');\n  const [referralCode, setReferralCode] = useState('');\n  const [checking, setChecking] = useState(false);\n  const [availability, setAvailability] = useState<{ available: boolean; reason?: string } | null>(null);\n  const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  // ── Animation ──\n  const fadeAnim = useRef(new Animated.Value(1)).current;\n  const slideAnim = useRef(new Animated.Value(0)).current;\n\n  const avatarUrl = getAvatarUrl(avatarStyle, avatarSeed, avatarBg);\n\n  // Debounced username check\n  useEffect(() => {\n    if (debounceRef.current) clearTimeout(debounceRef.current);\n    const trimmed = username.trim();\n    if (trimmed.length < 3) { setAvailability(null); setChecking(false); return; }\n    setChecking(true);\n    debounceRef.current = setTimeout(async () => {\n      try {\n        const result = await client.checkUsername(trimmed);\n        setAvailability(result);\n      } catch { setAvailability(null); }\n      finally { setChecking(false); }\n    }, 500);\n    return () => { if (debounceRef.current) clearTimeout(debounceRef.current); };\n  }, [username, client]);\n\n  const animateToStep = useCallback((newStep: number) => {\n    const dir = newStep > step ? 1 : -1;\n    Keyboard.dismiss();\n    Animated.parallel([\n      Animated.timing(fadeAnim, { toValue: 0, duration: 120, useNativeDriver: true }),\n      Animated.timing(slideAnim, { toValue: -dir * 40, duration: 120, useNativeDriver: true }),\n    ]).start(() => {\n      setStep(newStep);\n      slideAnim.setValue(dir * 40);\n      Animated.parallel([\n        Animated.timing(fadeAnim, { toValue: 1, duration: 200, useNativeDriver: true }),\n        Animated.timing(slideAnim, { toValue: 0, duration: 200, useNativeDriver: true }),\n      ]).start();\n    });\n  }, [step, fadeAnim, slideAnim]);\n\n  const canContinueUsername =\n    username.trim().length >= 3 && availability?.available === true && !checking;\n\n  const handleSubmit = () => {\n    Keyboard.dismiss();\n    onRegister(username.trim(), referralCode.trim() || undefined, avatarUrl);\n  };\n\n  // ── Step 1: Avatar ──\n  const renderAvatarStep = () => (\n    <View style={s.stepContainer}>\n      <View style={s.stepTop}>\n        <Text style={[s.title, { color: t.text }]}>Choose Your Avatar</Text>\n        <Text style={[s.subtitle, { color: t.textMuted }]}>Pick a look that represents you</Text>\n        <StepIndicator currentStep={0} />\n\n        <View style={s.avatarCenter}>\n          <View style={[s.avatarFrame, { borderColor: accent }]}>\n            <Image source={{ uri: avatarUrl }} style={s.avatarLarge} />\n            <View style={[s.checkBadge, { backgroundColor: t.success }]}>\n              <Text style={s.checkBadgeText}>&#10003;</Text>\n            </View>\n          </View>\n        </View>\n\n        <View style={s.avatarActions}>\n          <TouchableOpacity\n            style={[s.outlineBtn, { borderColor: t.border }]}\n            onPress={() => setAvatarSeed(generateSeed())}\n            activeOpacity={0.7}\n          >\n            <Text style={[s.outlineBtnText, { color: t.text }]}>&#8635;  Shuffle</Text>\n          </TouchableOpacity>\n          <TouchableOpacity\n            style={[s.outlineBtn, { borderColor: accent, backgroundColor: accent + '15' }]}\n            onPress={() => setShowStyles(!showStyles)}\n            activeOpacity={0.7}\n          >\n            <Text style={[s.outlineBtnText, { color: accent }]}>&#9786;  Customize</Text>\n          </TouchableOpacity>\n        </View>\n\n        {showStyles && (\n          <View style={s.styleScroll}>\n            <AvatarEditor\n              style={avatarStyle}\n              seed={avatarSeed}\n              bg={avatarBg}\n              onStyleChange={setAvatarStyle}\n              onSeedChange={setAvatarSeed}\n              onBgChange={setAvatarBg}\n              accentColor={accent}\n            />\n          </View>\n        )}\n      </View>\n\n      <View style={s.bottomRow}>\n        <TouchableOpacity\n          style={[s.primaryBtn, { backgroundColor: accent, flex: 1 }]}\n          onPress={() => animateToStep(1)}\n          activeOpacity={0.8}\n        >\n          <Text style={s.primaryBtnText}>Continue  &#8250;</Text>\n        </TouchableOpacity>\n      </View>\n    </View>\n  );\n\n  // ── Step 2: Username ──\n  const renderUsernameStep = () => (\n    <View style={s.stepContainer}>\n      <View style={s.stepTop}>\n        <View style={s.headerRow}>\n          <TouchableOpacity onPress={() => animateToStep(0)} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}>\n            <Text style={[s.backChevron, { color: t.text }]}>&#8249;</Text>\n          </TouchableOpacity>\n          <Text style={[s.titleInline, { color: t.text }]}>Pick a Username</Text>\n        </View>\n        <Text style={[s.subtitle, { color: t.textMuted }]}>This is how others will see you</Text>\n        <StepIndicator currentStep={1} />\n\n        <View style={s.avatarCenter}>\n          <View style={[s.avatarFrameSmall, { borderColor: accent }]}>\n            <Image source={{ uri: avatarUrl }} style={s.avatarSmall} />\n            <View style={[s.checkBadgeSm, { backgroundColor: t.success }]}>\n              <Text style={s.checkBadgeTextSm}>&#10003;</Text>\n            </View>\n          </View>\n        </View>\n\n        <View style={s.inputGroup}>\n          <Text style={[s.inputLabel, { color: t.text }]}>\n            Username <Text style={{ color: t.errorText }}>*</Text>\n          </Text>\n          <TextInput\n            style={[s.input, { backgroundColor: t.surface, color: t.text, borderColor: accent }]}\n            placeholder=\"Enter username\"\n            placeholderTextColor={t.textDim}\n            value={username}\n            onChangeText={setUsername}\n            autoCapitalize=\"none\"\n            autoCorrect={false}\n            autoFocus\n          />\n          {checking ? (\n            <Text style={[s.hint, { color: t.textDim }]}>Checking...</Text>\n          ) : availability ? (\n            <Text style={[s.hint, { color: availability.available ? t.success : t.errorText }]}>\n              {availability.available ? '\\u2713 Available!' : (availability.reason || 'Username taken')}\n            </Text>\n          ) : username.trim().length > 0 && username.trim().length < 3 ? (\n            <Text style={[s.hint, { color: t.textDim }]}>At least 3 characters</Text>\n          ) : null}\n        </View>\n      </View>\n\n      <View style={s.bottomRow}>\n        <TouchableOpacity\n          style={[s.secondaryBtn, { borderColor: t.border }]}\n          onPress={() => animateToStep(0)}\n          activeOpacity={0.7}\n        >\n          <Text style={[s.secondaryBtnText, { color: t.text }]}>&#8249;  Back</Text>\n        </TouchableOpacity>\n        <TouchableOpacity\n          style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: canContinueUsername ? 1 : 0.4 }]}\n          onPress={() => animateToStep(2)}\n          disabled={!canContinueUsername}\n          activeOpacity={0.8}\n        >\n          <Text style={s.primaryBtnText}>Continue  &#8250;</Text>\n        </TouchableOpacity>\n      </View>\n    </View>\n  );\n\n  // ── Step 3: Referral + Create ──\n  const renderReferralStep = () => (\n    <View style={s.stepContainer}>\n      <View style={s.stepTop}>\n        <View style={s.headerRow}>\n          <TouchableOpacity onPress={() => animateToStep(1)} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}>\n            <Text style={[s.backChevron, { color: t.text }]}>&#8249;</Text>\n          </TouchableOpacity>\n          <Text style={[s.titleInline, { color: t.text }]}>Almost There!</Text>\n        </View>\n        <Text style={[s.subtitle, { color: t.textMuted }]}>Got a referral code? (optional)</Text>\n        <StepIndicator currentStep={2} />\n\n        {/* Profile preview card */}\n        <View style={[s.profileCard, { borderColor: t.border }]}>\n          <Text style={[s.profileLabel, { color: t.textMuted }]}>Your Profile</Text>\n          <View style={s.profileRow}>\n            <Image source={{ uri: avatarUrl }} style={s.profileAvatar} />\n            <View style={{ gap: 4 }}>\n              <Text style={[s.profileUsername, { color: t.text }]}>@{username}</Text>\n              <Text style={[s.profileReady, { color: t.success }]}>{'\\u2713'} Ready to go!</Text>\n            </View>\n          </View>\n        </View>\n\n        {error ? (\n          <View style={[s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n            <Text style={[s.errorText, { color: t.errorText }]}>{error.message}</Text>\n          </View>\n        ) : null}\n\n        <View style={s.inputGroup}>\n          <Text style={[s.inputLabel, { color: t.text }]}>\n            Referral Code <Text style={{ color: t.textMuted }}>(optional)</Text>\n          </Text>\n          <TextInput\n            style={[s.input, { backgroundColor: t.surface, color: t.text, borderColor: t.border }]}\n            placeholder=\"Enter referral code\"\n            placeholderTextColor={t.textDim}\n            value={referralCode}\n            onChangeText={setReferralCode}\n            autoCapitalize=\"none\"\n            autoCorrect={false}\n            editable={!registering}\n          />\n          <Text style={[s.hint, { color: t.textMuted }]}>\n            {'\\uD83C\\uDF81'} If a friend invited you, enter their code to give them credit!\n          </Text>\n        </View>\n      </View>\n\n      <View style={s.bottomRow}>\n        <TouchableOpacity\n          style={[s.secondaryBtn, { borderColor: t.border }]}\n          onPress={() => animateToStep(1)}\n          disabled={registering}\n          activeOpacity={0.7}\n        >\n          <Text style={[s.secondaryBtnText, { color: t.text }]}>&#8249;  Back</Text>\n        </TouchableOpacity>\n        <TouchableOpacity\n          style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: registering ? 0.7 : 1 }]}\n          onPress={handleSubmit}\n          disabled={registering}\n          activeOpacity={0.8}\n        >\n          {registering ? (\n            <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n          ) : (\n            <Text style={s.primaryBtnText}>Create Account</Text>\n          )}\n        </TouchableOpacity>\n      </View>\n    </View>\n  );\n\n  // Advance to the push step when the parent signals (after auth completes).\n  // Uses the same animateToStep transition as steps 0→1→2 so it feels like\n  // a continuation, not a separate modal swap.\n  useEffect(() => {\n    if (pushStepActive && step !== 3) {\n      animateToStep(3);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [pushStepActive]);\n\n  // ── Step 4: Push Notifications ──\n  const handleEnablePush = async () => {\n    try { await push.register(); } catch {}\n    onPushComplete?.();\n  };\n\n  const renderPushStep = () => (\n    <View style={s.stepContainer}>\n      <View style={s.stepTop}>\n        <Text style={[s.title, { color: t.text }]}>Enable Notifications</Text>\n        <Text style={[s.subtitle, { color: t.textMuted }]}>\n          Stay in the loop with real-time updates\n        </Text>\n        <StepIndicator currentStep={3} />\n\n        <View style={pushStyles.iconContainer}>\n          <View style={[pushStyles.bellCircle, { backgroundColor: accent + '20' }]}>\n            <Text style={[pushStyles.bellIcon, { color: accent }]}>{'🔔'}</Text>\n          </View>\n        </View>\n\n        <View style={pushStyles.benefitsList}>\n          <Text style={[pushStyles.benefitsHeader, { color: t.text }]}>\n            Get real-time updates when:\n          </Text>\n          {[\n            'A fight you picked on goes LIVE',\n            'Your pick wins or loses',\n            'Final results and rankings',\n          ].map((item, i) => (\n            <View key={i} style={pushStyles.benefitRow}>\n              <View style={[pushStyles.bulletDot, { backgroundColor: accent }]} />\n              <Text style={[pushStyles.benefitText, { color: t.textMuted }]}>{item}</Text>\n            </View>\n          ))}\n        </View>\n      </View>\n\n      <View style={s.bottomRow}>\n        <TouchableOpacity\n          style={[s.secondaryBtn, { borderColor: t.border }]}\n          onPress={onPushComplete}\n          activeOpacity={0.7}\n        >\n          <Text style={[s.secondaryBtnText, { color: t.textMuted }]}>Maybe Later</Text>\n        </TouchableOpacity>\n        <TouchableOpacity\n          style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: push.loading ? 0.7 : 1 }]}\n          onPress={handleEnablePush}\n          disabled={push.loading}\n          activeOpacity={0.8}\n        >\n          {push.loading ? (\n            <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n          ) : (\n            <Text style={s.primaryBtnText}>Enable Notifications</Text>\n          )}\n        </TouchableOpacity>\n      </View>\n    </View>\n  );\n\n  const renderStep = () => {\n    switch (step) {\n      case 0: return renderAvatarStep();\n      case 1: return renderUsernameStep();\n      case 2: return renderReferralStep();\n      case 3: return renderPushStep();\n      default: return null;\n    }\n  };\n\n  return (\n    <KeyboardAvoidingView\n      style={[s.container, { backgroundColor: t.background }]}\n      behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n    >\n      <ScrollView\n        contentContainerStyle={{ flexGrow: 1 }}\n        keyboardShouldPersistTaps=\"handled\"\n        bounces={false}\n      >\n        <Animated.View\n          style={[\n            { flex: 1 },\n            { opacity: fadeAnim, transform: [{ translateX: slideAnim }] },\n          ]}\n        >\n          {renderStep()}\n        </Animated.View>\n      </ScrollView>\n    </KeyboardAvoidingView>\n  );\n}\n\n// ── Push Token Restorer (silent, zero UI) ──\n// Runs inside DubsContext + AuthGate when user is authenticated.\n// Silently re-registers the push token for returning users who already granted permission.\n// Does NOT prompt — the prompt only happens in step 4 of DefaultRegistrationScreen during onboarding.\n\nfunction PushTokenRestorer() {\n  const push = usePushNotifications();\n  const restored = useRef(false);\n\n  useEffect(() => {\n    if (restored.current) return;\n    restored.current = true;\n    push.restoreIfGranted();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return null;\n}\n\nconst pushStyles = StyleSheet.create({\n  iconContainer: { alignItems: 'center', marginVertical: 24 },\n  bellCircle: { width: 100, height: 100, borderRadius: 50, justifyContent: 'center', alignItems: 'center' },\n  bellIcon: { fontSize: 48 },\n  benefitsList: { paddingHorizontal: 24, gap: 12, marginTop: 8 },\n  benefitsHeader: { fontSize: 17, fontWeight: '700', marginBottom: 4 },\n  benefitRow: { flexDirection: 'row', alignItems: 'center', gap: 12 },\n  bulletDot: { width: 8, height: 8, borderRadius: 4 },\n  benefitText: { fontSize: 16, flex: 1 },\n});\n\n// ── Styles ──\n\nconst s = StyleSheet.create({\n  container: { flex: 1 },\n  // Loading / Error\n  centerContent: { flex: 1, justifyContent: 'center', alignItems: 'center', paddingHorizontal: 32, gap: 48 },\n  spreadContent: { flex: 1, justifyContent: 'space-between', paddingHorizontal: 32, paddingTop: 120, paddingBottom: 80 },\n  brandingSection: { alignItems: 'center', gap: 12 },\n  logoCircle: { width: 80, height: 80, borderRadius: 40, justifyContent: 'center', alignItems: 'center', marginBottom: 8 },\n  logoText: { fontSize: 36, fontWeight: '800', color: '#FFFFFF' },\n  appNameText: { fontSize: 32, fontWeight: '800' },\n  loadingSection: { alignItems: 'center', gap: 16 },\n  statusText: { fontSize: 16, textAlign: 'center' },\n  errorBox: { borderWidth: 1, borderRadius: 12, paddingHorizontal: 16, paddingVertical: 12 },\n  errorText: { fontSize: 14, textAlign: 'center' },\n  // Step indicator\n  stepRow: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 24, marginVertical: 16 },\n  stepLine: { flex: 1, height: 2 },\n  stepCircle: { width: 36, height: 36, borderRadius: 18, justifyContent: 'center', alignItems: 'center' },\n  stepCheck: { color: '#FFF', fontSize: 16, fontWeight: '700' },\n  stepNum: { fontSize: 14, fontWeight: '700' },\n  // Onboarding layout\n  stepContainer: { flex: 1, justifyContent: 'space-between', paddingBottom: 40 },\n  stepTop: { gap: 8, paddingTop: 64 },\n  headerRow: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 24 },\n  backChevron: { fontSize: 32, fontWeight: '300', lineHeight: 36, marginTop: -2 },\n  title: { fontSize: 28, fontWeight: '800', paddingHorizontal: 24 },\n  titleInline: { fontSize: 28, fontWeight: '800' },\n  subtitle: { fontSize: 15, paddingHorizontal: 24, lineHeight: 20 },\n  // Avatar\n  avatarCenter: { alignItems: 'center', marginVertical: 12 },\n  avatarFrame: { borderWidth: 3, borderRadius: 20, padding: 4 },\n  avatarLarge: { width: 160, height: 160, borderRadius: 16, backgroundColor: '#E5E5EA' },\n  checkBadge: { position: 'absolute', bottom: -6, right: -6, width: 28, height: 28, borderRadius: 14, justifyContent: 'center', alignItems: 'center' },\n  checkBadgeText: { color: '#FFF', fontSize: 15, fontWeight: '700' },\n  avatarFrameSmall: { borderWidth: 3, borderRadius: 14, padding: 3 },\n  avatarSmall: { width: 100, height: 100, borderRadius: 12, backgroundColor: '#E5E5EA' },\n  checkBadgeSm: { position: 'absolute', bottom: -4, right: -4, width: 22, height: 22, borderRadius: 11, justifyContent: 'center', alignItems: 'center' },\n  checkBadgeTextSm: { color: '#FFF', fontSize: 12, fontWeight: '700' },\n  avatarActions: { flexDirection: 'row', justifyContent: 'center', gap: 12, paddingHorizontal: 24 },\n  outlineBtn: { borderWidth: 1.5, borderRadius: 12, paddingHorizontal: 20, paddingVertical: 12 },\n  outlineBtnText: { fontSize: 15, fontWeight: '600' },\n  styleScroll: { paddingHorizontal: 24, marginTop: 4 },\n  styleThumbWrap: { borderWidth: 2, borderRadius: 12, padding: 3, marginRight: 10 },\n  styleThumb: { width: 52, height: 52, borderRadius: 10, backgroundColor: '#E5E5EA' },\n  // Input\n  inputGroup: { paddingHorizontal: 24, gap: 6 },\n  inputLabel: { fontSize: 15, fontWeight: '600' },\n  input: { height: 56, borderRadius: 16, borderWidth: 1.5, paddingHorizontal: 16, fontSize: 16 },\n  hint: { fontSize: 13, paddingLeft: 4 },\n  // Profile card\n  profileCard: { marginHorizontal: 24, borderWidth: 1, borderRadius: 16, padding: 16, gap: 12 },\n  profileLabel: { fontSize: 13 },\n  profileRow: { flexDirection: 'row', alignItems: 'center', gap: 14 },\n  profileAvatar: { width: 56, height: 56, borderRadius: 12, backgroundColor: '#E5E5EA' },\n  profileUsername: { fontSize: 20, fontWeight: '800' },\n  profileReady: { fontSize: 14, fontWeight: '600' },\n  // Buttons\n  bottomRow: { flexDirection: 'row', gap: 12, paddingHorizontal: 24 },\n  primaryBtn: { height: 56, borderRadius: 16, justifyContent: 'center', alignItems: 'center' },\n  primaryBtnText: { color: '#FFFFFF', fontSize: 18, fontWeight: '700' },\n  secondaryBtn: { height: 56, borderRadius: 16, borderWidth: 1.5, justifyContent: 'center', alignItems: 'center', paddingHorizontal: 24 },\n  secondaryBtnText: { fontSize: 16, fontWeight: '600' },\n});\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UnifiedEvent, Pagination, GetUpcomingEventsParams, QueryResult } from '../types';\n\nexport function useEvents(\n  params?: GetUpcomingEventsParams,\n): QueryResult<{ events: UnifiedEvent[]; pagination: Pagination }> {\n  const { client } = useDubs();\n  const [data, setData] = useState<{ events: UnifiedEvent[]; pagination: Pagination } | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  // Serialize params for dependency comparison\n  const paramKey = JSON.stringify(params ?? {});\n\n  const fetchData = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getUpcomingEvents(params);\n      setData(result);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  useEffect(() => {\n    fetchData();\n  }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameDetail, QueryResult } from '../types';\n\nexport function useGame(gameId: string | null): QueryResult<GameDetail> {\n  const { client } = useDubs();\n  const [data, setData] = useState<GameDetail | null>(null);\n  const [loading, setLoading] = useState(!!gameId);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchData = useCallback(async () => {\n    if (!gameId) return;\n    setLoading(true);\n    setError(null);\n    try {\n      const game = await client.getGame(gameId);\n      setData(game);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, gameId]);\n\n  useEffect(() => {\n    fetchData();\n  }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameListItem, GetGamesParams, QueryResult } from '../types';\n\nexport function useGames(params?: GetGamesParams): QueryResult<GameListItem[]> {\n  const { client } = useDubs();\n  const [data, setData] = useState<GameListItem[] | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  const paramKey = JSON.stringify(params ?? {});\n\n  const fetchData = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const games = await client.getGames(params);\n      setData(games);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  useEffect(() => {\n    fetchData();\n  }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameListItem, Pagination, GetNetworkGamesParams, QueryResult } from '../types';\n\nexport function useNetworkGames(params?: GetNetworkGamesParams): QueryResult<{ games: GameListItem[]; pagination: Pagination }> {\n  const { client } = useDubs();\n  const [data, setData] = useState<{ games: GameListItem[]; pagination: Pagination } | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  const paramKey = JSON.stringify(params ?? {});\n\n  const fetchData = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getNetworkGames(params);\n      setData(result);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  useEffect(() => {\n    fetchData();\n  }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { CreateGameParams, MutationStatus } from '../types';\nimport { emitCreditsChanged } from './useCredits';\n\n/**\n * Pull a short, recognisable team name from a long display name. Mirrors\n * the `getTeamNickname` helper the website uses when composing the\n * \"I just placed a bet on X\" share message — keeps the chat-feed text\n * tight (\"Mariners\" rather than \"Seattle Mariners\").\n */\nfunction teamNickname(name: string | null | undefined): string {\n  if (!name) return 'TBD';\n  const parts = name.split(' ');\n  return parts.length > 2 ? parts[parts.length - 1] : name;\n}\n\nexport interface CreateGameMutationResult {\n  gameId: string;\n  gameAddress: string;\n  signature: string;\n  explorerUrl: string;\n}\n\nexport function useCreateGame() {\n  const { client, wallet, connection } = useDubs();\n  const [status, setStatus] = useState<MutationStatus>('idle');\n  const [error, setError] = useState<Error | null>(null);\n  const [data, setData] = useState<CreateGameMutationResult | null>(null);\n\n  const reset = useCallback(() => {\n    setStatus('idle');\n    setError(null);\n    setData(null);\n  }, []);\n\n  const execute = useCallback(async (params: CreateGameParams): Promise<CreateGameMutationResult> => {\n    setStatus('building');\n    setError(null);\n    setData(null);\n\n    try {\n      // 1. Build unsigned transaction\n      console.log('[useCreateGame] Step 1: Building transaction...');\n      const createResult = await client.createGame(params);\n      console.log('[useCreateGame] Step 1 done:', { gameId: createResult.gameId, gameAddress: createResult.gameAddress });\n\n      // 2. Sign and send transaction\n      setStatus('signing');\n      console.log('[useCreateGame] Step 2: Signing and sending...');\n      const signature = await signAndSendBase64Transaction(\n        createResult.transaction,\n        wallet,\n        connection,\n      );\n      console.log('[useCreateGame] Step 2 done. Signature:', signature);\n\n      // 3. Confirm with backend (server handles on-chain verification)\n      setStatus('confirming');\n      console.log('[useCreateGame] Step 3: Confirming with backend...');\n      // For sponsored creates, the server forces wager to the credit\n      // amount — use that, not whatever was in params, so the saved\n      // game record is consistent with the on-chain bet.\n      const wagerAmount = createResult.wagerAmount ?? params.wagerAmount;\n      const confirmResult = await client.confirmGame({\n        gameId: createResult.gameId,\n        playerWallet: params.playerWallet,\n        signature,\n        teamChoice: params.teamChoice,\n        wagerAmount,\n        role: 'creator',\n        gameAddress: createResult.gameAddress,\n        // Echo the credit code through so the server marks it as used\n        // after the on-chain confirm succeeds.\n        promoCode: createResult.promoCode,\n      });\n      console.log('[useCreateGame] Step 3 done.');\n\n      const result: CreateGameMutationResult = {\n        gameId: createResult.gameId,\n        gameAddress: createResult.gameAddress,\n        signature,\n        explorerUrl: confirmResult.explorerUrl,\n      };\n\n      setData(result);\n      setStatus('success');\n      console.log('[useCreateGame] Complete!');\n\n      // Sponsored create just consumed a credit server-side — broadcast\n      // so every mounted useCredits instance (rewards widget, streak\n      // sheet, create sheet) refetches and the count drops in real time.\n      if (createResult.promoCode) emitCreditsChanged();\n\n      // Auto-share to global chat. Mirrors the dubs.app website's\n      // BetCreationModal behaviour so a bet placed from any client surfaces\n      // in chat with a tappable game-invite chip and a \"Join me!\" CTA.\n      // Fire-and-forget: a chat-broadcast failure must not surface as a\n      // create-game error, the on-chain bet is already settled.\n      try {\n        const event = createResult.event;\n        const home = event?.opponents?.[0]?.name ?? null;\n        const away = event?.opponents?.[1]?.name ?? null;\n        const teamLabel =\n          params.teamChoice === 'home' ? teamNickname(home) :\n          params.teamChoice === 'away' ? teamNickname(away) :\n          'Draw';\n\n        const message = `I just placed a ${wagerAmount} SOL bet on ${teamLabel} - Join me!`;\n        // event.startTime is an ESPN-unified ISO string (\"…Z\"), but every\n        // downstream chat consumer (dubs.app SPA, mobile app) does\n        // `new Date(strTimestamp + 'Z')` and crashes on the resulting\n        // double-Z. Strip the trailing Z so the on-the-wire shape matches\n        // the legacy TheSportsDB format the rest of the system expects.\n        const strTimestamp = typeof event?.startTime === 'string'\n          ? event.startTime.replace(/Z$/, '')\n          : null;\n        const gameInvite = {\n          gameId: createResult.gameId,\n          gameAddress: createResult.gameAddress,\n          title: event?.title,\n          league: event?.league,\n          gameType: 'sports',\n          buyIn: wagerAmount,\n          status: 'waiting',\n          homeTeam: home,\n          awayTeam: away,\n          homeTeamBadge: event?.opponents?.[0]?.imageUrl ?? null,\n          awayTeamBadge: event?.opponents?.[1]?.imageUrl ?? null,\n          imageUrl: event?.media?.thumbnail ?? null,\n          strThumb: event?.media?.thumbnail ?? null,\n          strPoster: event?.media?.poster ?? null,\n          strTimestamp,\n          creatorTeam: params.teamChoice,\n          creatorWallet: params.playerWallet,\n        } as Record<string, unknown>;\n        await client.sendChatMessage({ message, gameInvite });\n      } catch (chatErr) {\n        console.warn('[useCreateGame] Auto chat-share failed (non-fatal):', chatErr);\n      }\n\n      return result;\n    } catch (err) {\n      console.error('[useCreateGame] FAILED:', err);\n      const error = err instanceof Error ? err : new Error(String(err));\n      setError(error);\n      setStatus('error');\n      throw error;\n    }\n  }, [client, wallet]);\n\n  return { execute, status, error, data, reset };\n}\n","import { Transaction, Connection } from '@solana/web3.js';\nimport type { WalletAdapter } from '../wallet/types';\n\n/**\n * Deserialize a base64-encoded transaction, sign via wallet adapter, send to Solana.\n * Prefers signAndSendTransaction if available (MWA), otherwise falls back to\n * signTransaction + sendRawTransaction via RPC (Phantom deeplinks).\n * Returns the transaction signature.\n */\nexport async function signAndSendBase64Transaction(\n  base64Tx: string,\n  wallet: WalletAdapter,\n  connection: Connection,\n): Promise<string> {\n  if (!wallet.publicKey) throw new Error('Wallet not connected');\n\n  const binaryStr = atob(base64Tx);\n  const bytes = new Uint8Array(binaryStr.length);\n  for (let i = 0; i < binaryStr.length; i++) {\n    bytes[i] = binaryStr.charCodeAt(i);\n  }\n  const transaction = Transaction.from(bytes);\n\n  // Prefer signAndSendTransaction if wallet supports it (e.g. MWA)\n  if (wallet.signAndSendTransaction) {\n    return wallet.signAndSendTransaction(transaction);\n  }\n\n  // Fallback: sign via wallet, then send via RPC\n  const signed = await wallet.signTransaction(transaction);\n  const signature = await connection.sendRawTransaction(signed.serialize());\n  return signature;\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { PromoCredit } from '../types';\n\nexport interface UseCreditsResult {\n  credits: PromoCredit[];\n  totalLamports: number;\n  totalSOL: number;\n  loading: boolean;\n  error: Error | null;\n  refetch: () => Promise<void>;\n}\n\n// Module-level pub/sub so every active useCredits instance can refetch\n// when ANY component spends or unlocks a credit. Without this each hook\n// keeps its own state, and a sponsored bet placed via useJoinGame leaves\n// the home-screen rewards widget + the streak sheet stuck on stale\n// counts until the next 60s poll.\nconst creditListeners = new Set<() => void>();\n\n/**\n * Notify every mounted useCredits hook to refetch from the server.\n * Called automatically by useJoinGame / useCreateGame after a sponsored\n * op succeeds; can also be called manually after any flow that mutates\n * credits server-side (e.g. shaking through a 1000-dub milestone).\n */\nexport function emitCreditsChanged(): void {\n  for (const fn of creditListeners) fn();\n}\n\n/**\n * Returns every active promo credit reserved to the authenticated user\n * (streak-milestone unlocks + any unused Twitter giveaway codes).\n *\n * Credits are kept on the server (`promo_codes` table); this hook just\n * mirrors them. Refetches automatically whenever any other useCredits\n * caller emits via emitCreditsChanged() — keeps every credit-aware UI\n * surface consistent in real time.\n */\nexport function useCredits(): UseCreditsResult {\n  const { client } = useDubs();\n  const [credits, setCredits] = useState<PromoCredit[]>([]);\n  const [totalLamports, setTotalLamports] = useState(0);\n  const [totalSOL, setTotalSOL] = useState(0);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetch = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getCredits();\n      setCredits(result.credits);\n      setTotalLamports(result.totalLamports);\n      setTotalSOL(result.totalSOL);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client]);\n\n  useEffect(() => { fetch(); }, [fetch]);\n\n  // Subscribe to global credit-change events so this instance refetches\n  // whenever another component (or the join/create mutation) signals a\n  // credit was spent or minted.\n  useEffect(() => {\n    creditListeners.add(fetch);\n    return () => { creditListeners.delete(fetch); };\n  }, [fetch]);\n\n  return { credits, totalLamports, totalSOL, loading, error, refetch: fetch };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { JoinGameParams, MutationStatus } from '../types';\nimport { emitCreditsChanged } from './useCredits';\n\nexport interface JoinGameMutationResult {\n  gameId: string;\n  gameAddress: string;\n  signature: string;\n  explorerUrl: string;\n}\n\nexport function useJoinGame() {\n  const { client, wallet, connection } = useDubs();\n  const [status, setStatus] = useState<MutationStatus>('idle');\n  const [error, setError] = useState<Error | null>(null);\n  const [data, setData] = useState<JoinGameMutationResult | null>(null);\n\n  const reset = useCallback(() => {\n    setStatus('idle');\n    setError(null);\n    setData(null);\n  }, []);\n\n  const execute = useCallback(async (params: JoinGameParams): Promise<JoinGameMutationResult> => {\n    setStatus('building');\n    setError(null);\n    setData(null);\n\n    try {\n      // 1. Build unsigned transaction\n      console.log('[useJoinGame] Step 1: Building transaction...', { gameId: params.gameId, playerWallet: params.playerWallet, teamChoice: params.teamChoice, amount: params.amount });\n      const joinResult = await client.joinGame(params);\n      console.log('[useJoinGame] Step 1 done:', { gameId: joinResult.gameId, gameAddress: joinResult.gameAddress, hasTx: !!joinResult.transaction });\n\n      // 2. Sign and send transaction\n      setStatus('signing');\n      console.log('[useJoinGame] Step 2: Signing and sending transaction...');\n      const signature = await signAndSendBase64Transaction(\n        joinResult.transaction,\n        wallet,\n        connection,\n      );\n      console.log('[useJoinGame] Step 2 done. Signature:', signature);\n\n      // 3. Confirm with backend (server handles on-chain verification)\n      setStatus('confirming');\n      const confirmParams = {\n        gameId: params.gameId,\n        playerWallet: params.playerWallet,\n        signature,\n        teamChoice: params.teamChoice,\n        wagerAmount: params.amount,\n        role: 'joiner' as const,\n        gameAddress: joinResult.gameAddress,\n        // Pass through when this was a sponsored join — server marks\n        // the credit as used after the on-chain confirm succeeds.\n        promoCode: joinResult.promoCode,\n      };\n      console.log('[useJoinGame] Step 3: Confirming with backend...', confirmParams);\n      const confirmResult = await client.confirmGame(confirmParams);\n      console.log('[useJoinGame] Step 3 done. Backend confirmed.');\n\n      const result: JoinGameMutationResult = {\n        gameId: params.gameId,\n        gameAddress: joinResult.gameAddress,\n        signature,\n        explorerUrl: confirmResult.explorerUrl,\n      };\n\n      setData(result);\n      setStatus('success');\n      console.log('[useJoinGame] Complete!');\n\n      // Sponsored join just consumed a credit server-side — broadcast so\n      // every mounted useCredits instance (rewards widget, streak sheet,\n      // join sheet) refetches and the count drops in real time.\n      if (joinResult.promoCode) emitCreditsChanged();\n\n      return result;\n    } catch (err) {\n      console.error('[useJoinGame] FAILED at status:', status, err);\n      const error = err instanceof Error ? err : new Error(String(err));\n      setError(error);\n      setStatus('error');\n      throw error;\n    }\n  }, [client, wallet]);\n\n  return { execute, status, error, data, reset };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { BuildClaimParams, MutationStatus } from '../types';\n\nexport interface ClaimMutationResult {\n  gameId: string;\n  signature: string;\n  explorerUrl: string;\n}\n\nexport function useClaim() {\n  const { client, wallet, connection } = useDubs();\n  const [status, setStatus] = useState<MutationStatus>('idle');\n  const [error, setError] = useState<Error | null>(null);\n  const [data, setData] = useState<ClaimMutationResult | null>(null);\n\n  const reset = useCallback(() => {\n    setStatus('idle');\n    setError(null);\n    setData(null);\n  }, []);\n\n  const execute = useCallback(async (params: BuildClaimParams & { amountClaimed?: number }): Promise<ClaimMutationResult> => {\n    setStatus('building');\n    setError(null);\n    setData(null);\n\n    try {\n      // 1. Build unsigned claim transaction\n      console.log('[useClaim] Step 1: Building claim transaction...');\n      const claimResult = await client.buildClaimTransaction(params);\n      console.log('[useClaim] Step 1 done.');\n\n      // 2. Sign and send transaction\n      setStatus('signing');\n      console.log('[useClaim] Step 2: Signing and sending...');\n      const signature = await signAndSendBase64Transaction(\n        claimResult.transaction,\n        wallet,\n        connection,\n      );\n      console.log('[useClaim] Step 2 done. Signature:', signature);\n\n      // 3. Confirm claim with backend (records signature + amount in DB)\n      setStatus('confirming');\n      console.log('[useClaim] Step 3: Confirming claim...');\n      const confirmResult = await client.confirmClaim(params.gameId, {\n        playerWallet: params.playerWallet,\n        signature,\n        amountClaimed: params.amountClaimed,\n      });\n      console.log('[useClaim] Step 3 done.');\n\n      const result: ClaimMutationResult = {\n        gameId: params.gameId,\n        signature,\n        explorerUrl: confirmResult.explorerUrl,\n      };\n\n      setData(result);\n      setStatus('success');\n      console.log('[useClaim] Complete!');\n      return result;\n    } catch (err: any) {\n      console.error('[useClaim] ===== CLAIM ERROR DUMP =====');\n      console.error('[useClaim] typeof:', typeof err);\n      console.error('[useClaim] value:', err);\n      console.error('[useClaim] message:', err?.message);\n      console.error('[useClaim] name:', err?.name);\n      console.error('[useClaim] code:', err?.code);\n      console.error('[useClaim] cause:', err?.cause);\n      console.error('[useClaim] stack:', err?.stack);\n      console.error('[useClaim] JSON:', (() => { try { return JSON.stringify(err, Object.getOwnPropertyNames(err ?? {})); } catch { return 'unstringifiable'; } })());\n      console.error('[useClaim] ===== END DUMP =====');\n      const error = err instanceof Error ? err : new Error(String(err));\n      setError(error);\n      setStatus('error');\n      throw error;\n    }\n  }, [client, wallet]);\n\n  return { execute, status, error, data, reset };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { CreateCustomGameParams, MutationStatus } from '../types';\n\nexport interface CreateCustomGameMutationResult {\n  gameId: string;\n  gameAddress: string;\n  signature: string;\n  explorerUrl: string;\n  buyIn: number;\n}\n\nexport function useCreateCustomGame() {\n  const { client, wallet, connection } = useDubs();\n  const [status, setStatus] = useState<MutationStatus>('idle');\n  const [error, setError] = useState<Error | null>(null);\n  const [data, setData] = useState<CreateCustomGameMutationResult | null>(null);\n\n  const reset = useCallback(() => {\n    setStatus('idle');\n    setError(null);\n    setData(null);\n  }, []);\n\n  const execute = useCallback(async (params: CreateCustomGameParams): Promise<CreateCustomGameMutationResult> => {\n    setStatus('building');\n    setError(null);\n    setData(null);\n\n    try {\n      // 1. Build unsigned transaction\n      console.log('[useCreateCustomGame] Step 1: Building transaction...');\n      const createResult = await client.createCustomGame(params);\n      console.log('[useCreateCustomGame] Step 1 done:', { gameId: createResult.gameId, gameAddress: createResult.gameAddress });\n\n      // 2. Sign and send transaction\n      setStatus('signing');\n      console.log('[useCreateCustomGame] Step 2: Signing and sending...');\n      const signature = await signAndSendBase64Transaction(\n        createResult.transaction,\n        wallet,\n        connection,\n      );\n      console.log('[useCreateCustomGame] Step 2 done. Signature:', signature);\n\n      // 3. Confirm with backend\n      setStatus('confirming');\n      console.log('[useCreateCustomGame] Step 3: Confirming with backend...');\n      const confirmResult = await client.confirmCustomGame({\n        gameId: createResult.gameId,\n        playerWallet: params.playerWallet,\n        signature,\n        teamChoice: params.teamChoice,\n        wagerAmount: params.wagerAmount,\n        role: 'creator',\n        gameAddress: createResult.gameAddress,\n      });\n      console.log('[useCreateCustomGame] Step 3 done.');\n\n      const result: CreateCustomGameMutationResult = {\n        gameId: createResult.gameId,\n        gameAddress: createResult.gameAddress,\n        signature,\n        explorerUrl: confirmResult.explorerUrl,\n        buyIn: params.wagerAmount,\n      };\n\n      setData(result);\n      setStatus('success');\n      console.log('[useCreateCustomGame] Complete!');\n      return result;\n    } catch (err) {\n      console.error('[useCreateCustomGame] FAILED:', err);\n      const error = err instanceof Error ? err : new Error(String(err));\n      setError(error);\n      setStatus('error');\n      throw error;\n    }\n  }, [client, wallet]);\n\n  return { execute, status, error, data, reset };\n}\n","import { useState, useEffect } from 'react';\nimport { useDubs } from '../provider';\n\nexport interface ClaimStatus {\n  /** Whether the current wallet has claimed this game's prize */\n  hasClaimed: boolean;\n  /** Amount claimed (null if not claimed) */\n  amountClaimed: number | null;\n  /** Claim transaction signature (null if not claimed) */\n  claimSignature: string | null;\n  /** Whether the game has been resolved */\n  isResolved: boolean;\n  /** Loading state */\n  loading: boolean;\n  /** Error if fetch failed */\n  error: Error | null;\n  /** Re-fetch claim status */\n  refetch: () => void;\n}\n\n/**\n * Check whether the current wallet has already claimed a prize for a game.\n *\n * Uses the game detail endpoint which includes per-bettor claim data.\n */\nexport function useHasClaimed(gameId: string | null): ClaimStatus {\n  const { client, wallet } = useDubs();\n  const [hasClaimed, setHasClaimed] = useState(false);\n  const [amountClaimed, setAmountClaimed] = useState<number | null>(null);\n  const [claimSignature, setClaimSignature] = useState<string | null>(null);\n  const [isResolved, setIsResolved] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const [trigger, setTrigger] = useState(0);\n\n  const refetch = () => setTrigger(t => t + 1);\n\n  useEffect(() => {\n    if (!gameId || !wallet.publicKey) {\n      setHasClaimed(false);\n      setAmountClaimed(null);\n      setClaimSignature(null);\n      setIsResolved(false);\n      return;\n    }\n\n    let cancelled = false;\n    setLoading(true);\n    setError(null);\n\n    client\n      .getGame(gameId)\n      .then(game => {\n        if (cancelled) return;\n        setIsResolved(game.isResolved);\n\n        const myWallet = wallet.publicKey!.toBase58();\n        const myBet = game.bettors?.find(b => b.wallet === myWallet);\n\n        if (myBet?.amountClaimed != null && myBet.amountClaimed > 0) {\n          setHasClaimed(true);\n          setAmountClaimed(myBet.amountClaimed);\n          setClaimSignature(myBet.claimSignature ?? null);\n        } else {\n          setHasClaimed(false);\n          setAmountClaimed(null);\n          setClaimSignature(null);\n        }\n      })\n      .catch(err => {\n        if (!cancelled) {\n          setError(err instanceof Error ? err : new Error(String(err)));\n        }\n      })\n      .finally(() => {\n        if (!cancelled) setLoading(false);\n      });\n\n    return () => {\n      cancelled = true;\n    };\n  }, [gameId, wallet.publicKey, client, trigger]);\n\n  return { hasClaimed, amountClaimed, claimSignature, isResolved, loading, error, refetch };\n}\n","import { useState, useCallback, useRef, useContext } from 'react';\nimport bs58 from 'bs58';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport { useDisconnect } from '../managed-wallet';\nimport { getDeviceInfo } from '../utils/device';\nimport type { AuthStatus, DubsUser } from '../types';\nimport { ensurePngAvatar } from '../utils/avatarUrl';\n\nexport interface UseAuthResult {\n  /** Current auth status */\n  status: AuthStatus;\n  /** Authenticated user profile, or null */\n  user: DubsUser | null;\n  /** JWT token, or null */\n  token: string | null;\n  /** Convenience boolean */\n  isAuthenticated: boolean;\n  /** Error from the last operation, or null */\n  error: Error | null;\n\n  /**\n   * Full nonce → sign → verify flow.\n   * If the wallet is already registered, resolves to authenticated state.\n   * If new wallet, resolves to needsRegistration state — call register() next.\n   */\n  authenticate: () => Promise<void>;\n\n  /**\n   * Register a new user after authenticate() returned needsRegistration.\n   * Reuses the nonce+signature from authenticate() — no second signing prompt.\n   */\n  register: (username: string, referralCode?: string, avatarUrl?: string) => Promise<void>;\n\n  /** Log out and clear state */\n  logout: () => Promise<void>;\n\n  /**\n   * Restore a session from a saved token (e.g. AsyncStorage on app restart).\n   * Calls GET /auth/me to validate. Returns true if valid, false otherwise.\n   */\n  restoreSession: (token: string) => Promise<boolean>;\n\n  /** Re-fetch user profile from the server (e.g. after avatar change) */\n  refreshUser: () => Promise<void>;\n\n  /** Reset to idle state, clearing errors and user */\n  reset: () => void;\n}\n\nexport function useAuth(): UseAuthResult {\n  // If inside AuthGate, return the shared auth state\n  const sharedAuth = useContext(AuthContext);\n\n  const { client, wallet } = useDubs();\n  const disconnect = useDisconnect();\n  const [status, setStatus] = useState<AuthStatus>('idle');\n  const [user, setUser] = useState<DubsUser | null>(null);\n  const [token, setToken] = useState<string | null>(null);\n  const [error, setError] = useState<Error | null>(null);\n\n  // Stash nonce+signature+deviceInfo between authenticate → register (single-sign flow)\n  const pendingAuth = useRef<{\n    walletAddress: string;\n    nonce: string;\n    signature: string;\n    deviceInfo?: import('../utils/device').DeviceInfo;\n  } | null>(null);\n\n  const normalizeUser = (u: DubsUser): DubsUser => ({\n    ...u,\n    avatar: ensurePngAvatar(u.avatar) ?? u.avatar,\n  });\n\n  const reset = useCallback(() => {\n    setStatus('idle');\n    setUser(null);\n    setToken(null);\n    setError(null);\n    pendingAuth.current = null;\n    client.setToken(null);\n  }, [client]);\n\n  const authenticate = useCallback(async () => {\n    try {\n      if (!wallet.publicKey) {\n        throw new Error('Wallet not connected');\n      }\n      if (!wallet.signMessage) {\n        throw new Error('Wallet does not support signMessage');\n      }\n\n      setStatus('authenticating');\n      setError(null);\n\n      const walletAddress = wallet.publicKey.toBase58();\n\n      // 0. Collect device info\n      const deviceInfo = await getDeviceInfo();\n      console.log('[useAuth] Device info:', JSON.stringify(deviceInfo, null, 2));\n\n      // 1. Get nonce\n      const { nonce, message } = await client.getNonce(walletAddress);\n\n      // 2. Sign message\n      setStatus('signing');\n      const messageBytes = new TextEncoder().encode(message);\n      const signatureBytes = await wallet.signMessage!(messageBytes);\n\n      const signature = bs58.encode(signatureBytes);\n\n      // 3. Verify with server\n      setStatus('verifying');\n      const result = await client.authenticate({ walletAddress, signature, nonce, deviceInfo });\n\n      if (result.needsRegistration) {\n        // Stash credentials for register() — nonce is NOT consumed\n        pendingAuth.current = { walletAddress, nonce, signature, deviceInfo };\n        setStatus('needsRegistration');\n        return;\n      }\n\n      // Existing user — fully authenticated\n      setUser(normalizeUser(result.user!));\n      setToken(result.token!);\n      setStatus('authenticated');\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      // Phantom 4100 = stale/revoked session — clear it and return to connect screen\n      if (message.includes('4100') || message.includes('not been authorized')) {\n        console.log('[useAuth] Stale Phantom session detected (4100), forcing disconnect');\n        await disconnect?.();\n        setStatus('idle');\n        setError(null);\n        return;\n      }\n      setError(err instanceof Error ? err : new Error(message));\n      setStatus('error');\n    }\n  }, [client, wallet, disconnect]);\n\n  const register = useCallback(async (username: string, referralCode?: string, avatarUrl?: string) => {\n    try {\n      const pending = pendingAuth.current;\n      if (!pending) {\n        throw new Error('No pending authentication — call authenticate() first');\n      }\n\n      setStatus('registering');\n      setError(null);\n\n      const result = await client.register({\n        walletAddress: pending.walletAddress,\n        signature: pending.signature,\n        nonce: pending.nonce,\n        username,\n        referralCode,\n        avatarUrl,\n        deviceInfo: pending.deviceInfo,\n      });\n\n      pendingAuth.current = null;\n      // Use the chosen avatar locally if the backend didn't store it\n      const user = avatarUrl && !result.user.avatar\n        ? { ...result.user, avatar: avatarUrl }\n        : result.user;\n      setUser(normalizeUser(user));\n      setToken(result.token);\n      setStatus('authenticated');\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n      setStatus('error');\n    }\n  }, [client]);\n\n  const logout = useCallback(async () => {\n    try {\n      await client.logout();\n    } catch {\n      // Ignore logout errors — clear state regardless\n    }\n    setUser(null);\n    setToken(null);\n    setStatus('idle');\n    setError(null);\n    pendingAuth.current = null;\n  }, [client]);\n\n  const restoreSession = useCallback(async (savedToken: string): Promise<boolean> => {\n    try {\n      client.setToken(savedToken);\n      const me = await client.getMe();\n      setUser(normalizeUser(me));\n      setToken(savedToken);\n      setStatus('authenticated');\n      return true;\n    } catch {\n      client.setToken(null);\n      setUser(null);\n      setToken(null);\n      setStatus('idle');\n      return false;\n    }\n  }, [client]);\n\n  const refreshUser = useCallback(async () => {\n    try {\n      const me = await client.getMe();\n      setUser(normalizeUser(me));\n    } catch {\n      // Silent failure — keep existing user state\n    }\n  }, [client]);\n\n  // If shared context exists (inside AuthGate), prefer it over local state\n  if (sharedAuth) return sharedAuth;\n\n  return {\n    status,\n    user,\n    token,\n    isAuthenticated: status === 'authenticated',\n    error,\n    authenticate,\n    register,\n    logout,\n    restoreSession,\n    refreshUser,\n    reset,\n  };\n}\n","import { createContext } from 'react';\nimport type { UseAuthResult } from './hooks/useAuth';\n\n/**\n * Shared auth context provided by AuthGate.\n * When useAuth() is called inside an AuthGate, it reads from this context\n * so all components share the same auth state.\n */\nexport const AuthContext = createContext<UseAuthResult | null>(null);\n","import { Platform } from 'react-native';\n\nexport interface DeviceInfo {\n  platform: string;\n  modelName: string | null;\n  brand: string | null;\n  manufacturer: string | null;\n  osName: string | null;\n  osVersion: string | null;\n  deviceType: number | null;\n  deviceName: string | null;\n  totalMemory: number | null;\n  modelId: string | null;\n  designName: string | null;\n  productName: string | null;\n  isDevice: boolean | null;\n}\n\n/**\n * Detect Solana Seeker device (synchronous — safe to call during render).\n * Checks brand from expo-device; returns false if expo-device isn't installed.\n */\nexport function isSolanaSeeker(): boolean {\n  try {\n    const Device = require('expo-device');\n    return Device.brand?.toLowerCase() === 'solanamobile';\n  } catch {\n    return false;\n  }\n}\n\nexport async function getDeviceInfo(): Promise<DeviceInfo> {\n  try {\n    const Device = require('expo-device');\n    return {\n      platform: Platform.OS,\n      modelName: Device.modelName,\n      brand: Device.brand,\n      manufacturer: Device.manufacturer,\n      osName: Device.osName,\n      osVersion: Device.osVersion,\n      deviceType: Device.deviceType,\n      deviceName: Device.deviceName,\n      totalMemory: Device.totalMemory,\n      modelId: Device.modelId,\n      designName: Device.designName,\n      productName: Device.productName,\n      isDevice: Device.isDevice,\n    };\n  } catch {\n    // expo-device not installed — return minimal info\n    return {\n      platform: Platform.OS,\n      modelName: null,\n      brand: null,\n      manufacturer: null,\n      osName: null,\n      osVersion: null,\n      deviceType: null,\n      deviceName: null,\n      totalMemory: null,\n      modelId: null,\n      designName: null,\n      productName: null,\n      isDevice: null,\n    };\n  }\n}\n","/**\n * Ensure a DiceBear avatar URL uses PNG format for React Native compatibility.\n * React Native's Image component cannot render SVGs.\n * This converts at render time only — the stored URL in the DB is never modified.\n */\nexport function ensurePngAvatar(url: string | null | undefined): string | undefined {\n  if (!url) return undefined;\n  return url.replace('/svg?', '/png?');\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UFCEvent, QueryResult } from '../types';\n\nexport function useUFCFightCard(): QueryResult<UFCEvent[]> {\n  const { client } = useDubs();\n  const [data, setData] = useState<UFCEvent[] | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchData = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getUFCFightCard();\n      setData(result);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client]);\n\n  useEffect(() => {\n    fetchData();\n  }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UFCFighterDetail, QueryResult } from '../types';\n\nexport function useUFCFighterDetail(athleteId: string | null): QueryResult<UFCFighterDetail> {\n  const { client } = useDubs();\n  const [data, setData] = useState<UFCFighterDetail | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchData = useCallback(async () => {\n    if (!athleteId) {\n      setData(null);\n      setLoading(false);\n      return;\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getUFCFighterDetail(athleteId);\n      setData(result);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, athleteId]);\n\n  useEffect(() => {\n    fetchData();\n  }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { QueryResult } from '../types';\n\nexport interface HighlightVideo {\n  videoId: string;\n  title: string;\n  channelTitle: string;\n  thumbnail: string;\n  publishedAt: string;\n}\n\nexport function useHighlights(league?: string, limit: number = 8): QueryResult<HighlightVideo[]> {\n  const { client } = useDubs();\n  const [data, setData] = useState<HighlightVideo[] | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchData = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const qs = new URLSearchParams();\n      if (league) qs.set('league', league);\n      qs.set('limit', String(limit));\n      const res = await (client as any).request('GET', `/highlights?${qs.toString()}`);\n      setData(res.videos || []);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, league, limit]);\n\n  useEffect(() => { fetchData(); }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { QueryResult } from '../types';\n\nexport interface ShortVideo {\n  videoId: string;\n  title: string;\n  channelTitle: string;\n  thumbnail: string;\n  publishedAt: string;\n}\n\nexport function useShorts(league: string = 'NBA', limit: number = 20): QueryResult<ShortVideo[]> {\n  const { client } = useDubs();\n  const [data, setData] = useState<ShortVideo[] | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchData = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const qs = new URLSearchParams({ league, limit: String(limit) });\n      const res = await (client as any).request('GET', `/shorts?${qs.toString()}`);\n      setData(res.videos || []);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, league, limit]);\n\n  useEffect(() => { fetchData(); }, [fetchData]);\n\n  return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useCallback, useRef, useMemo, useEffect } from 'react';\nimport { Platform } from 'react-native';\nimport { useDubs } from '../provider';\n\nexport interface PushNotificationStatus {\n  /**\n   * Whether push is currently delivering to this user — the right signal for\n   * UI bindings like a \"Notifications: Enabled/Disabled\" toggle.\n   *\n   * Equivalent to `enabled && !!pushToken`. Goes false after `unregister()`\n   * even though OS permission is still granted. Goes true after `register()`\n   * succeeds.\n   *\n   * Use this — NOT `hasPermission` — when binding switches/toggles.\n   */\n  isActive: boolean;\n  /** Whether push notifications are enabled in the SDK configuration (the `pushEnabled` prop on DubsProvider). */\n  enabled: boolean;\n  /**\n   * Whether OS-level notification permission has been granted on this device.\n   *\n   * Note: this stays true after `unregister()` because the OS doesn't revoke\n   * permission when a server token is dropped. Useful for permission-flow\n   * prompts (e.g. \"Re-enable in Settings\" hint), but NOT for \"is push on\" UI —\n   * use `isActive` for that.\n   */\n  hasPermission: boolean;\n  /** The native device push token (FCM/APNs), if currently registered with the server. */\n  pushToken: string | null;\n  /**\n   * @deprecated Use pushToken instead. Kept for backwards compatibility.\n   */\n  expoPushToken: string | null;\n  /** Whether a registration operation is in progress */\n  loading: boolean;\n  /** The last error encountered */\n  error: Error | null;\n  /**\n   * Request notification permission and register the push token.\n   * Does NOT auto-prompt — must be called explicitly (e.g. from an onboarding screen).\n   */\n  register: () => Promise<boolean>;\n  /** Unregister the current push token */\n  unregister: () => Promise<void>;\n  /**\n   * Silently re-register if permission was already granted (no prompt).\n   * Safe to call on app startup for returning users.\n   */\n  restoreIfGranted: () => Promise<void>;\n}\n\nexport function usePushNotifications(): PushNotificationStatus {\n  const { client, appName, pushEnabled } = useDubs();\n  const channelId = useMemo(() => appName.toLowerCase().replace(/[^a-z0-9-]/g, ''), [appName]);\n  const [hasPermission, setHasPermission] = useState(false);\n  const [pushToken, setPushToken] = useState<string | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const registering = useRef(false);\n\n  const getNotificationsModule = useCallback(() => {\n    try {\n      return require('expo-notifications');\n    } catch {\n      return null;\n    }\n  }, []);\n\n  const getDeviceName = useCallback((): string | null => {\n    try {\n      const Device = require('expo-device');\n      return Device.deviceName || null;\n    } catch {\n      return null;\n    }\n  }, []);\n\n  const setupAndroidChannels = useCallback((Notifications: any) => {\n    if (Platform.OS === 'android') {\n      Notifications.setNotificationChannelAsync(channelId || 'default', {\n        name: appName || 'Default',\n        importance: Notifications.AndroidImportance?.MAX ?? 4,\n        vibrationPattern: [0, 250, 250, 250],\n      }).catch(() => {});\n    }\n  }, [channelId, appName]);\n\n  const registerTokenWithServer = useCallback(async (token: string) => {\n    const deviceName = getDeviceName();\n    await client.registerPushToken({\n      token,\n      platform: Platform.OS,\n      deviceName: deviceName || undefined,\n    });\n  }, [client, getDeviceName]);\n\n  const register = useCallback(async (): Promise<boolean> => {\n    if (!pushEnabled) return false;\n    if (registering.current) return false;\n    registering.current = true;\n    setLoading(true);\n    setError(null);\n\n    try {\n      const Notifications = getNotificationsModule();\n      if (!Notifications) {\n        throw new Error('expo-notifications is not installed');\n      }\n\n      // Request permission\n      const { status: existingStatus } = await Notifications.getPermissionsAsync();\n      let finalStatus = existingStatus;\n\n      if (existingStatus !== 'granted') {\n        const { status } = await Notifications.requestPermissionsAsync();\n        finalStatus = status;\n      }\n\n      if (finalStatus !== 'granted') {\n        setHasPermission(false);\n        setLoading(false);\n        registering.current = false;\n        return false;\n      }\n\n      setHasPermission(true);\n\n      // Get native device push token (FCM on Android, APNs on iOS)\n      const tokenResult = await Notifications.getDevicePushTokenAsync();\n      const token = tokenResult.data;\n      setPushToken(token);\n\n      // Register with server\n      await registerTokenWithServer(token);\n\n      // Setup Android channels\n      setupAndroidChannels(Notifications);\n\n      setLoading(false);\n      registering.current = false;\n      return true;\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err));\n      setError(e);\n      setLoading(false);\n      registering.current = false;\n      console.error('[usePushNotifications] Registration error:', e.message);\n      return false;\n    }\n  }, [getNotificationsModule, registerTokenWithServer, setupAndroidChannels]);\n\n  const unregister = useCallback(async () => {\n    if (!pushToken) return;\n    try {\n      await client.unregisterPushToken(pushToken);\n      setPushToken(null);\n    } catch (err) {\n      console.error('[usePushNotifications] Unregister error:', err);\n    }\n  }, [client, pushToken]);\n\n  const restoreIfGranted = useCallback(async () => {\n    if (!pushEnabled) return;\n    try {\n      const Notifications = getNotificationsModule();\n      if (!Notifications) return;\n\n      const { status } = await Notifications.getPermissionsAsync();\n      if (status !== 'granted') return;\n\n      // Get native device push token (FCM on Android, APNs on iOS)\n      const tokenResult = await Notifications.getDevicePushTokenAsync();\n      const token = tokenResult.data;\n\n      // Register with server — only mark as enabled if this succeeds\n      await registerTokenWithServer(token);\n      setPushToken(token);\n      setHasPermission(true);\n      setupAndroidChannels(Notifications);\n    } catch (err) {\n      // Server registration failed — don't show as enabled\n      setHasPermission(false);\n      console.log('[usePushNotifications] Restore skipped:', err instanceof Error ? err.message : err);\n    }\n  }, [getNotificationsModule, registerTokenWithServer, setupAndroidChannels]);\n\n  // On mount, set up foreground notification handler and restore push state\n  const didMount = useRef(false);\n  useEffect(() => {\n    if (didMount.current) return;\n    didMount.current = true;\n\n    const Notifications = getNotificationsModule();\n    if (Notifications) {\n      // Show notifications even when app is in the foreground\n      Notifications.setNotificationHandler({\n        handleNotification: async () => ({\n          shouldShowAlert: true,\n          shouldPlaySound: true,\n          shouldSetBadge: false,\n        }),\n      });\n    }\n\n    restoreIfGranted();\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  return {\n    isActive: pushEnabled && !!pushToken,\n    enabled: pushEnabled,\n    hasPermission,\n    pushToken,\n    expoPushToken: pushToken, // backwards compat\n    loading,\n    error,\n    register,\n    unregister,\n    restoreIfGranted,\n  };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { ArcadePool } from '../types';\n\nexport interface UseArcadePoolsResult {\n  pools: ArcadePool[];\n  loading: boolean;\n  error: Error | null;\n  refetch: () => void;\n}\n\nexport function useArcadePools(gameSlug?: string): UseArcadePoolsResult {\n  const { client } = useDubs();\n  const [pools, setPools] = useState<ArcadePool[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetch = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getArcadePools({ gameSlug });\n      setPools(result);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, gameSlug]);\n\n  useEffect(() => { fetch(); }, [fetch]);\n\n  return { pools, loading, error, refetch: fetch };\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useDubs } from '../provider';\nimport type { ArcadePool, ArcadePoolStats, ArcadeLeaderboardEntry } from '../types';\n\nexport interface UseArcadePoolResult {\n  pool: ArcadePool | null;\n  stats: ArcadePoolStats | null;\n  leaderboard: ArcadeLeaderboardEntry[];\n  loading: boolean;\n  error: Error | null;\n  refetch: () => void;\n}\n\nexport function useArcadePool(poolId: number | null): UseArcadePoolResult {\n  const { client } = useDubs();\n  const [pool, setPool] = useState<ArcadePool | null>(null);\n  const [stats, setStats] = useState<ArcadePoolStats | null>(null);\n  const [leaderboard, setLeaderboard] = useState<ArcadeLeaderboardEntry[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetch = useCallback(async () => {\n    if (!poolId) return;\n    setLoading(true);\n    setError(null);\n    try {\n      const [poolRes, lb] = await Promise.all([\n        client.getArcadePool(poolId),\n        client.getArcadeLeaderboard(poolId),\n      ]);\n      setPool(poolRes.pool);\n      setStats(poolRes.stats);\n      setLeaderboard(lb);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, poolId]);\n\n  useEffect(() => { fetch(); }, [fetch]);\n\n  return { pool, stats, leaderboard, loading, error, refetch: fetch };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { useAuth } from './useAuth';\nimport type { ArcadeEntry, StartAttemptResult, SubmitScoreResult } from '../types';\n\nexport interface UseArcadeGameResult {\n  entry: ArcadeEntry | null;\n  livesRemaining: number;\n  bestScore: number;\n  loading: boolean;\n  error: Error | null;\n  /** Fetch/refresh the user's entry for this pool */\n  refreshEntry: () => Promise<void>;\n  /** Start a new life — returns session token to pass to the game */\n  startAttempt: () => Promise<StartAttemptResult>;\n  /** Submit score after game over */\n  submitScore: (sessionToken: string, score: number, durationMs?: number) => Promise<SubmitScoreResult>;\n}\n\nexport function useArcadeGame(poolId: number | null, maxLives: number = 3): UseArcadeGameResult {\n  const { client } = useDubs();\n  const { user } = useAuth();\n  const [entry, setEntry] = useState<ArcadeEntry | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const walletAddress = user?.walletAddress || '';\n\n  const refreshEntry = useCallback(async () => {\n    if (!poolId || !walletAddress) return;\n    setLoading(true);\n    setError(null);\n    try {\n      const e = await client.getArcadeEntry(poolId, walletAddress);\n      setEntry(e);\n    } catch (err) {\n      // 404 means no entry yet — that's fine\n      if (err instanceof Error && err.message.includes('No entry found')) {\n        setEntry(null);\n      } else {\n        setError(err instanceof Error ? err : new Error(String(err)));\n      }\n    } finally {\n      setLoading(false);\n    }\n  }, [client, poolId, walletAddress]);\n\n  const startAttempt = useCallback(async (): Promise<StartAttemptResult> => {\n    if (!poolId || !walletAddress) throw new Error('Not ready');\n    setError(null);\n    try {\n      const result = await client.startArcadeAttempt(poolId, walletAddress);\n      return result;\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err));\n      setError(e);\n      throw e;\n    }\n  }, [client, poolId, walletAddress]);\n\n  const submitScore = useCallback(async (\n    sessionToken: string,\n    score: number,\n    durationMs?: number,\n  ): Promise<SubmitScoreResult> => {\n    if (!poolId || !walletAddress) throw new Error('Not ready');\n    setError(null);\n    try {\n      const result = await client.submitArcadeScore(poolId, {\n        walletAddress,\n        sessionToken,\n        score,\n        durationMs,\n      });\n      // Update local entry state\n      setEntry(prev => prev ? {\n        ...prev,\n        best_score: result.bestScore,\n        lives_used: result.livesUsed,\n      } : prev);\n      return result;\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err));\n      setError(e);\n      throw e;\n    }\n  }, [client, poolId, walletAddress]);\n\n  const livesRemaining = entry ? maxLives - entry.lives_used : maxLives;\n  const bestScore = entry?.best_score || 0;\n\n  return {\n    entry,\n    livesRemaining,\n    bestScore,\n    loading,\n    error,\n    refreshEntry,\n    startAttempt,\n    submitScore,\n  };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { useAuth } from './useAuth';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { ArcadeEntry, MutationStatus } from '../types';\n\nexport interface EnterArcadePoolMutationResult {\n  poolId: number;\n  signature: string;\n  entry: ArcadeEntry;\n}\n\nexport function useEnterArcadePool() {\n  const { client, wallet, connection } = useDubs();\n  const { user } = useAuth();\n  const [status, setStatus] = useState<MutationStatus>('idle');\n  const [error, setError] = useState<Error | null>(null);\n  const [data, setData] = useState<EnterArcadePoolMutationResult | null>(null);\n\n  const reset = useCallback(() => {\n    setStatus('idle');\n    setError(null);\n    setData(null);\n  }, []);\n\n  const execute = useCallback(async (poolId: number): Promise<EnterArcadePoolMutationResult> => {\n    if (!wallet.publicKey) throw new Error('Wallet not connected');\n    const walletAddress = wallet.publicKey.toBase58();\n\n    setStatus('building');\n    setError(null);\n    setData(null);\n\n    try {\n      // 1. Build unsigned transaction\n      console.log('[useEnterArcadePool] Step 1: Building transaction...', { poolId, walletAddress });\n      const buildResult = await client.buildArcadeEntry(poolId, walletAddress);\n      console.log('[useEnterArcadePool] Step 1 done:', { poolId: buildResult.poolId, amount: buildResult.amount });\n\n      // 2. Sign and send transaction\n      setStatus('signing');\n      console.log('[useEnterArcadePool] Step 2: Signing and sending...');\n      const signature = await signAndSendBase64Transaction(\n        buildResult.transaction,\n        wallet,\n        connection,\n      );\n      console.log('[useEnterArcadePool] Step 2 done. Signature:', signature);\n\n      // 3. Confirm entry with backend (pass gameId/gameAddress for on-chain tracking)\n      setStatus('confirming');\n      console.log('[useEnterArcadePool] Step 3: Confirming with backend...');\n      const entry = await client.enterArcadePool(poolId, {\n        walletAddress,\n        txSignature: signature,\n        gameId: buildResult.gameId,\n        gameAddress: buildResult.gameAddress,\n      });\n      console.log('[useEnterArcadePool] Step 3 done. Entry recorded.');\n\n      const result: EnterArcadePoolMutationResult = {\n        poolId,\n        signature,\n        entry,\n      };\n\n      setData(result);\n      setStatus('success');\n      console.log('[useEnterArcadePool] Complete!');\n      return result;\n    } catch (err) {\n      console.error('[useEnterArcadePool] FAILED at status:', status, err);\n      const e = err instanceof Error ? err : new Error(String(err));\n      setError(e);\n      setStatus('error');\n      throw e;\n    }\n  }, [client, wallet, connection]);\n\n  return { execute, status, error, data, reset };\n}\n","import { useState, useEffect, useRef } from 'react';\n\nexport interface ArcadeCountdown {\n  /** Total milliseconds remaining */\n  totalMs: number;\n  /** Days remaining */\n  days: number;\n  /** Hours remaining (0-23) */\n  hours: number;\n  /** Minutes remaining (0-59) */\n  minutes: number;\n  /** Seconds remaining (0-59) */\n  seconds: number;\n  /** Formatted string e.g. \"2d 5h 30m\" or \"5m 12s\" */\n  formatted: string;\n  /** True when countdown has reached zero */\n  isExpired: boolean;\n}\n\nfunction formatCountdown(ms: number): string {\n  if (ms <= 0) return 'Ended';\n  const s = Math.floor(ms / 1000);\n  const m = Math.floor(s / 60);\n  const h = Math.floor(m / 60);\n  const d = Math.floor(h / 24);\n\n  if (d > 0) return `${d}d ${h % 24}h ${m % 60}m`;\n  if (h > 0) return `${h}h ${m % 60}m ${s % 60}s`;\n  if (m > 0) return `${m}m ${s % 60}s`;\n  return `${s}s`;\n}\n\n/**\n * Countdown hook for arcade pool resolution time.\n * Pass the `next_resolution` ISO string from the pool object.\n * Ticks every second automatically.\n */\nexport function useArcadeCountdown(nextResolution: string | null | undefined): ArcadeCountdown {\n  const [now, setNow] = useState(Date.now());\n  const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n  useEffect(() => {\n    if (!nextResolution) return;\n    intervalRef.current = setInterval(() => setNow(Date.now()), 1000);\n    return () => {\n      if (intervalRef.current) clearInterval(intervalRef.current);\n    };\n  }, [nextResolution]);\n\n  if (!nextResolution) {\n    return { totalMs: 0, days: 0, hours: 0, minutes: 0, seconds: 0, formatted: '--', isExpired: false };\n  }\n\n  const target = new Date(nextResolution).getTime();\n  const totalMs = Math.max(0, target - now);\n  const totalSec = Math.floor(totalMs / 1000);\n  const days = Math.floor(totalSec / 86400);\n  const hours = Math.floor((totalSec % 86400) / 3600);\n  const minutes = Math.floor((totalSec % 3600) / 60);\n  const seconds = totalSec % 60;\n\n  return {\n    totalMs,\n    days,\n    hours,\n    minutes,\n    seconds,\n    formatted: formatCountdown(totalMs),\n    isExpired: totalMs <= 0,\n  };\n}\n","/**\n * useArcadeBridge\n *\n * Owns the full RN ↔ WebView bridge for Dubs Arcade pool integration.\n * Replaces the manual sessionToken / gameStartTime / handleMessage / injectJavaScript\n * wiring that previously lived inline in each game's index.tsx.\n *\n * PROTOCOL VERSION: dubsArcade 1.0\n *\n * Usage:\n *\n *   const { webviewRef, handleMessage, triggerPlay, lastResult } = useArcadeBridge({\n *     poolId,\n *     startAttempt,\n *     submitScore,\n *     canPlay,\n *     onScoreSubmitted: (result) => { refetchPool(); },\n *     onError:          (err)    => { console.warn(err); },\n *   });\n *\n *   <WebView ref={webviewRef} onMessage={handleMessage} ... />\n *   <TouchableOpacity onPress={triggerPlay}>Play</TouchableOpacity>\n */\n\nimport { useRef, useState, useCallback } from 'react';\nimport type { StartAttemptResult, SubmitScoreResult } from '../types';\n\n// react-native-webview is a peer dependency of apps using this SDK;\n// we only need its ref type for the public interface.\n// Using `any` here avoids forcing apps that don't use WebView to install it.\ntype WebView = any;\n\nconst PROTOCOL_VERSION = '1.0';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface UseArcadeBridgeOptions {\n  /** Whether the player currently has an entry with lives remaining */\n  canPlay: boolean;\n\n  /** From useArcadeGame — starts a new life on the server */\n  startAttempt: () => Promise<StartAttemptResult>;\n\n  /** From useArcadeGame — submits a score for a completed life */\n  submitScore: (\n    sessionToken: string,\n    score: number,\n    durationMs?: number,\n  ) => Promise<SubmitScoreResult>;\n\n  /** Called when a new life starts (after startAttempt succeeds and session is injected) */\n  onPlayStarted?: () => void;\n\n  /** Called after a score is successfully submitted */\n  onScoreSubmitted?: (result: SubmitScoreResult) => void;\n\n  /** Called on any bridge error (network, invalid message, etc.) */\n  onError?: (err: Error) => void;\n}\n\nexport interface UseArcadeBridgeResult {\n  /** Attach to <WebView ref={webviewRef}> */\n  webviewRef: React.RefObject<WebView>;\n\n  /** Pass to <WebView onMessage={handleMessage}> */\n  handleMessage: (event: any) => void;\n\n  /**\n   * Call when the player taps PLAY in your UI.\n   * Calls startAttempt() then injects the session token + ARCADE_START into the WebView.\n   */\n  triggerPlay: () => Promise<void>;\n\n  /** The result of the most recent submitted score, or null */\n  lastResult: SubmitScoreResult | null;\n\n  /** True while a startAttempt or submitScore request is in flight */\n  bridgeLoading: boolean;\n}\n\n// ─── Hook ───────────────────────────────────────────────────────────────────\n\nexport function useArcadeBridge({\n  canPlay,\n  startAttempt,\n  submitScore,\n  onPlayStarted,\n  onScoreSubmitted,\n  onError,\n}: UseArcadeBridgeOptions): UseArcadeBridgeResult {\n  const webviewRef = useRef<WebView>(null);\n\n  // Active session state — kept in refs so handleMessage callbacks stay stable\n  const sessionTokenRef = useRef<string | null>(null);\n  const gameStartTimeRef = useRef<number>(0);\n\n  // Keep canPlay in a ref so TAP_PLAY handler always sees the latest value\n  const canPlayRef = useRef(canPlay);\n  canPlayRef.current = canPlay;\n\n  const [lastResult, setLastResult] = useState<SubmitScoreResult | null>(null);\n  const [bridgeLoading, setBridgeLoading] = useState(false);\n\n  // ── Inject session token + fire ARCADE_START ──────────────────────────────\n  const injectSession = useCallback((token: string, attemptNumber: number) => {\n    webviewRef.current?.injectJavaScript(`\n      window.ARCADE_SESSION_TOKEN = ${JSON.stringify(token)};\n      window.ARCADE_ATTEMPT_NUMBER = ${attemptNumber};\n      window._ARCADE_GAME_START_TIME = Date.now();\n      window.dispatchEvent(new Event('ARCADE_START'));\n      true;\n    `);\n  }, []);\n\n  // ── triggerPlay ───────────────────────────────────────────────────────────\n  const triggerPlay = useCallback(async () => {\n    if (!canPlay) return;\n    setBridgeLoading(true);\n    try {\n      const result = await startAttempt();\n      sessionTokenRef.current = result.sessionToken;\n      gameStartTimeRef.current = Date.now();\n      setLastResult(null);\n      injectSession(result.sessionToken, result.attemptNumber);\n      onPlayStarted?.();\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err));\n      onError?.(e);\n    } finally {\n      setBridgeLoading(false);\n    }\n  }, [canPlay, startAttempt, injectSession, onPlayStarted, onError]);\n\n  // ── handleMessage ─────────────────────────────────────────────────────────\n  const handleMessage = useCallback(\n    async (event: any) => {\n      let data: Record<string, any>;\n\n      // Parse + validate protocol envelope\n      try {\n        data = JSON.parse(event.nativeEvent.data);\n      } catch {\n        return; // non-JSON postMessages from the game's own code — ignore\n      }\n\n      // If dubsArcade version is present it must match — if absent, accept anyway\n      // (backward-compat: old game builds don't include the envelope yet)\n      if (data.dubsArcade !== undefined && data.dubsArcade !== PROTOCOL_VERSION) return;\n\n      switch (data.type) {\n        case 'TAP_PLAY': {\n          if (canPlayRef.current) {\n            triggerPlay();\n          }\n          return;\n        }\n\n        case 'GAME_OVER': {\n          const token = sessionTokenRef.current;\n          if (!token) return; // no active session — stale message, ignore\n\n          const score: number = typeof data.score === 'number' ? data.score : 0;\n          // Use server-start time as ground truth; fall back to game's reported duration\n          const duration =\n            gameStartTimeRef.current > 0\n              ? Date.now() - gameStartTimeRef.current\n              : typeof data.durationMs === 'number'\n              ? data.durationMs\n              : undefined;\n\n          // Clear immediately to prevent double-submit on re-render\n          sessionTokenRef.current = null;\n          gameStartTimeRef.current = 0;\n\n          setBridgeLoading(true);\n          try {\n            const result = await submitScore(token, score, duration);\n            setLastResult(result);\n            onScoreSubmitted?.(result);\n          } catch (err) {\n            const e = err instanceof Error ? err : new Error(String(err));\n            onError?.(e);\n          } finally {\n            setBridgeLoading(false);\n          }\n          return;\n        }\n\n        default:\n          // Unknown message type from a future protocol version — ignore gracefully\n          return;\n      }\n    },\n    [triggerPlay, submitScore, onScoreSubmitted, onError],\n  );\n\n  return { webviewRef, handleMessage, triggerPlay, lastResult, bridgeLoading };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { JackpotRound, JackpotLastWinner } from '../types';\n\nexport interface UseJackpotResult {\n  round: JackpotRound | null;\n  lastWinner: JackpotLastWinner | null;\n  loading: boolean;\n  error: Error | null;\n  refetch: () => void;\n}\n\nexport function useJackpot(): UseJackpotResult {\n  const { client } = useDubs();\n  const [round, setRound] = useState<JackpotRound | null>(null);\n  const [lastWinner, setLastWinner] = useState<JackpotLastWinner | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetch = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getJackpotCurrent();\n      setRound(result.round);\n      setLastWinner(result.lastWinner);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client]);\n\n  useEffect(() => { fetch(); }, [fetch]);\n\n  return { round, lastWinner, loading, error, refetch: fetch };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { JackpotRoundResult } from '../types';\n\nexport interface UseJackpotHistoryResult {\n  rounds: JackpotRoundResult[];\n  loading: boolean;\n  error: Error | null;\n  refetch: () => void;\n}\n\nexport function useJackpotHistory(limit?: number): UseJackpotHistoryResult {\n  const { client } = useDubs();\n  const [rounds, setRounds] = useState<JackpotRoundResult[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetch = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await client.getJackpotHistory(limit);\n      setRounds(result);\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n    } finally {\n      setLoading(false);\n    }\n  }, [client, limit]);\n\n  useEffect(() => { fetch(); }, [fetch]);\n\n  return { rounds, loading, error, refetch: fetch };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { MutationStatus } from '../types';\n\nexport interface EnterJackpotMutationResult {\n  roundId: string;\n  amount: string;\n  amountSol: number;\n  signature: string;\n}\n\nexport function useEnterJackpot() {\n  const { client, wallet, connection } = useDubs();\n  const [status, setStatus] = useState<MutationStatus>('idle');\n  const [error, setError] = useState<Error | null>(null);\n  const [data, setData] = useState<EnterJackpotMutationResult | null>(null);\n\n  const reset = useCallback(() => {\n    setStatus('idle');\n    setError(null);\n    setData(null);\n  }, []);\n\n  const execute = useCallback(async (amountLamports: number): Promise<EnterJackpotMutationResult> => {\n    if (!wallet.publicKey) throw new Error('Wallet not connected');\n    const walletAddress = wallet.publicKey.toBase58();\n\n    setStatus('building');\n    setError(null);\n    setData(null);\n\n    try {\n      // 1. Build unsigned transaction\n      console.log('[useEnterJackpot] Step 1: Building transaction...', { walletAddress, amountLamports });\n      const buildResult = await client.buildJackpotEnter(walletAddress, amountLamports);\n      console.log('[useEnterJackpot] Step 1 done:', { roundId: buildResult.roundId, amount: buildResult.amount });\n\n      // 2. Sign and send transaction\n      setStatus('signing');\n      console.log('[useEnterJackpot] Step 2: Signing and sending...');\n      const signature = await signAndSendBase64Transaction(\n        buildResult.transaction,\n        wallet,\n        connection,\n      );\n      console.log('[useEnterJackpot] Step 2 done. Signature:', signature);\n\n      // 3. Confirm entry with backend (creates developer attribution)\n      setStatus('confirming');\n      console.log('[useEnterJackpot] Step 3: Confirming with backend...');\n      await client.confirmJackpotEnter({\n        playerAddress: walletAddress,\n        roundId: buildResult.roundId,\n        amount: amountLamports,\n        signature,\n      });\n      console.log('[useEnterJackpot] Step 3 done. Entry confirmed + attributed.');\n\n      const result: EnterJackpotMutationResult = {\n        roundId: buildResult.roundId,\n        amount: buildResult.amount,\n        amountSol: buildResult.amountSol,\n        signature,\n      };\n\n      setData(result);\n      setStatus('success');\n      return result;\n    } catch (err) {\n      console.error('[useEnterJackpot] FAILED:', err);\n      const e = err instanceof Error ? err : new Error(String(err));\n      setError(e);\n      setStatus('error');\n      throw e;\n    }\n  }, [client, wallet, connection]);\n\n  return { execute, status, error, data, reset };\n}\n","import React, { useState, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  Image,\n  ScrollView,\n  StyleSheet,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\n\nconst DICEBEAR_STYLES = [\n  'adventurer',\n  'avataaars',\n  'fun-emoji',\n  'bottts',\n  'big-smile',\n  'thumbs',\n];\n\nconst BG_COLORS = [\n  '1a1a2e', 'f43f5e', 'f97316', 'eab308', '22c55e',\n  '3b82f6', '8b5cf6', 'ec4899', '06b6d4', '64748b',\n];\n\nexport function generateSeed(): string {\n  return Math.random().toString(36).slice(2, 10);\n}\n\nexport function getAvatarUrl(style: string, seed: string, bg = '1a1a2e', size = 256): string {\n  return `https://api.dicebear.com/9.x/${style}/png?seed=${seed}&backgroundColor=${bg}&size=${size}`;\n}\n\nexport function parseAvatarUrl(url?: string | null): { style: string; seed: string; bg: string } {\n  if (!url) return { style: 'adventurer', seed: generateSeed(), bg: '1a1a2e' };\n  try {\n    const match = url.match(/\\/\\d+\\.x\\/([^/]+)\\/(?:png|svg)\\?seed=([^&]+)/);\n    if (match) {\n      const bgMatch = url.match(/backgroundColor=([^&]+)/);\n      return { style: match[1], seed: match[2], bg: bgMatch?.[1] || '1a1a2e' };\n    }\n  } catch {}\n  return { style: 'adventurer', seed: generateSeed(), bg: '1a1a2e' };\n}\n\nexport interface AvatarEditorProps {\n  style: string;\n  seed: string;\n  bg: string;\n  onStyleChange: (style: string) => void;\n  onSeedChange: (seed: string) => void;\n  onBgChange: (bg: string) => void;\n  disabled?: boolean;\n  accentColor?: string;\n}\n\nexport function AvatarEditor({\n  style: avatarStyle,\n  seed: avatarSeed,\n  bg: bgColor,\n  onStyleChange,\n  onSeedChange,\n  onBgChange,\n  disabled = false,\n  accentColor,\n}: AvatarEditorProps) {\n  const t = useDubsTheme();\n  const accent = accentColor || t.accent;\n\n  return (\n    <View style={styles.container}>\n      {/* Style picker */}\n      <ScrollView\n        horizontal\n        showsHorizontalScrollIndicator={false}\n        contentContainerStyle={styles.row}\n      >\n        {DICEBEAR_STYLES.map((st) => {\n          const isSelected = st === avatarStyle;\n          return (\n            <TouchableOpacity\n              key={st}\n              onPress={() => onStyleChange(st)}\n              activeOpacity={0.7}\n              disabled={disabled}\n              style={[\n                styles.styleTile,\n                {\n                  borderColor: isSelected ? accent : t.border,\n                  borderWidth: isSelected ? 2 : 1,\n                },\n              ]}\n            >\n              <Image\n                source={{ uri: getAvatarUrl(st, avatarSeed, bgColor, 80) }}\n                style={styles.styleTileImage}\n              />\n            </TouchableOpacity>\n          );\n        })}\n      </ScrollView>\n\n      {/* Background color picker */}\n      <Text style={[styles.label, { color: t.textSecondary }]}>Background Color</Text>\n      <ScrollView\n        horizontal\n        showsHorizontalScrollIndicator={false}\n        contentContainerStyle={styles.row}\n      >\n        {BG_COLORS.map((color) => {\n          const isSelected = color === bgColor;\n          return (\n            <TouchableOpacity\n              key={color}\n              onPress={() => onBgChange(color)}\n              activeOpacity={0.7}\n              disabled={disabled}\n              style={[\n                styles.colorSwatch,\n                { backgroundColor: `#${color}` },\n                isSelected && { borderColor: accent, borderWidth: 2.5 },\n              ]}\n            />\n          );\n        })}\n      </ScrollView>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    gap: 10,\n  },\n  row: {\n    gap: 10,\n  },\n  label: {\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  styleTile: {\n    width: 72,\n    height: 72,\n    borderRadius: 16,\n    overflow: 'hidden',\n  },\n  styleTileImage: {\n    width: '100%',\n    height: '100%',\n  },\n  colorSwatch: {\n    width: 32,\n    height: 32,\n    borderRadius: 16,\n    borderWidth: 1.5,\n    borderColor: 'rgba(255,255,255,0.15)',\n  },\n});\n","import React from 'react';\nimport {\n  TouchableOpacity,\n  Text,\n  ActivityIndicator,\n  StyleSheet,\n  View,\n} from 'react-native';\nimport { useAuth } from '../hooks/useAuth';\nimport { useDubsTheme } from './theme';\n\nexport interface ConnectWalletButtonProps {\n  /** Button label. Defaults to \"Connect Wallet\" */\n  label?: string;\n  /** Override accent/background color */\n  accentColor?: string;\n  /** Override text color. Defaults to #000 */\n  textColor?: string;\n  /** Override border radius */\n  borderRadius?: number;\n  /** Override padding vertical */\n  paddingVertical?: number;\n  /** Override font size */\n  fontSize?: number;\n  /** Full width. Defaults to true */\n  fullWidth?: boolean;\n  /** Called after authenticate() is triggered (not after it completes) */\n  onPress?: () => void;\n}\n\n/**\n * ConnectWalletButton\n *\n * A minimal, customisable button that fires useAuth().authenticate().\n * Use this when you want to own the connect-wallet screen UI (e.g. inside\n * your own onboarding) but still hand off the wallet picker, signing, and\n * registration flow to the SDK.\n *\n * The SDK will handle everything after this tap:\n *   wallet picker → sign message → (registration/avatar if new user) → authenticated\n *\n * Example:\n *   <ConnectWalletButton\n *     label=\"Let's go\"\n *     accentColor=\"#22C55E\"\n *     textColor=\"#000\"\n *   />\n */\nexport function ConnectWalletButton({\n  label = 'Connect Wallet',\n  accentColor,\n  textColor = '#000000',\n  borderRadius = 16,\n  paddingVertical = 16,\n  fontSize = 17,\n  fullWidth = true,\n  onPress,\n}: ConnectWalletButtonProps) {\n  const t = useDubsTheme();\n  const { authenticate, status } = useAuth();\n\n  const connecting = status === 'authenticating' || status === 'signing' || status === 'verifying';\n  const accent = accentColor || t.accent;\n\n  const handlePress = () => {\n    onPress?.();\n    authenticate();\n  };\n\n  return (\n    <TouchableOpacity\n      onPress={handlePress}\n      disabled={connecting}\n      activeOpacity={0.85}\n      style={[\n        styles.btn,\n        {\n          backgroundColor: accent,\n          borderRadius,\n          paddingVertical,\n          width: fullWidth ? '100%' : undefined,\n          opacity: connecting ? 0.8 : 1,\n        },\n      ]}\n    >\n      {connecting ? (\n        <ActivityIndicator color={textColor} size=\"small\" />\n      ) : (\n        <Text style={[styles.label, { color: textColor, fontSize }]}>\n          {label}\n        </Text>\n      )}\n    </TouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  btn: {\n    alignItems: 'center',\n    justifyContent: 'center',\n    paddingHorizontal: 24,\n  },\n  label: {\n    fontWeight: '800',\n    letterSpacing: -0.2,\n  },\n});\n","import React, { useMemo } from 'react';\nimport { View, Text, Image, StyleSheet } from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { ensurePngAvatar } from '../utils/avatarUrl';\n\nexport interface UserProfileCardProps {\n  walletAddress: string;\n  username?: string;\n  avatarUrl?: string | null;\n  memberSince?: string | null;\n}\n\nfunction truncateAddress(address: string, chars = 4): string {\n  if (address.length <= chars * 2 + 3) return address;\n  return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\nfunction formatMemberSince(iso: string): string {\n  const date = new Date(iso);\n  const month = date.toLocaleString('en-US', { month: 'short' });\n  const year = date.getFullYear();\n  return `Member since ${month} ${year}`;\n}\n\nexport function UserProfileCard({\n  walletAddress,\n  username,\n  avatarUrl,\n  memberSince,\n}: UserProfileCardProps) {\n  const t = useDubsTheme();\n\n  const imageUri = useMemo(\n    () =>\n      ensurePngAvatar(avatarUrl) ||\n      `https://api.dicebear.com/9.x/avataaars/png?seed=${walletAddress}&size=128`,\n    [avatarUrl, walletAddress],\n  );\n\n  return (\n    <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n      <Image source={{ uri: imageUri }} style={styles.avatar} />\n      <View style={styles.info}>\n        {username ? (\n          <Text style={[styles.username, { color: t.text }]}>{username}</Text>\n        ) : null}\n        <Text style={[styles.address, { color: t.textMuted }]}>\n          {truncateAddress(walletAddress)}\n        </Text>\n        {memberSince ? (\n          <Text style={[styles.memberSince, { color: t.textDim }]}>\n            {formatMemberSince(memberSince)}\n          </Text>\n        ) : null}\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    padding: 16,\n    borderRadius: 16,\n    borderWidth: 1,\n    gap: 14,\n  },\n  avatar: {\n    width: 64,\n    height: 64,\n    borderRadius: 32,\n    backgroundColor: '#1A1A24',\n  },\n  info: {\n    flex: 1,\n    gap: 2,\n  },\n  username: {\n    fontSize: 18,\n    fontWeight: '700',\n  },\n  address: {\n    fontSize: 14,\n    fontFamily: 'monospace',\n  },\n  memberSince: {\n    fontSize: 12,\n    marginTop: 2,\n  },\n});\n","import React from 'react';\nimport {\n  View,\n  Text,\n  ScrollView,\n  TouchableOpacity,\n  ActivityIndicator,\n  StyleSheet,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { UserProfileCard } from './UserProfileCard';\n\nexport interface SettingsSheetProps {\n  walletAddress: string;\n  username?: string;\n  avatarUrl?: string | null;\n  memberSince?: string | null;\n  appVersion?: string;\n  onCopyAddress?: () => void;\n  onSupport?: () => void;\n  onLogout: () => void | Promise<void>;\n  loggingOut?: boolean;\n}\n\nfunction truncateAddress(address: string, chars = 4): string {\n  if (address.length <= chars * 2 + 3) return address;\n  return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\nexport function SettingsSheet({\n  walletAddress,\n  username,\n  avatarUrl,\n  memberSince,\n  appVersion,\n  onCopyAddress,\n  onSupport,\n  onLogout,\n  loggingOut = false,\n}: SettingsSheetProps) {\n  const t = useDubsTheme();\n\n  return (\n    <ScrollView\n      style={[styles.container, { backgroundColor: t.background }]}\n      contentContainerStyle={styles.content}\n    >\n      {/* Profile card */}\n      <UserProfileCard\n        walletAddress={walletAddress}\n        username={username}\n        avatarUrl={avatarUrl}\n        memberSince={memberSince}\n      />\n\n      {/* Action rows */}\n      <View style={[styles.actionsCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n        {onCopyAddress ? (\n          <TouchableOpacity\n            style={styles.actionRow}\n            onPress={onCopyAddress}\n            activeOpacity={0.7}\n          >\n            <View style={styles.actionRowLeft}>\n              <Text style={[styles.actionLabel, { color: t.text }]}>Wallet Address</Text>\n              <Text style={[styles.actionValue, { color: t.textMuted }]}>\n                {truncateAddress(walletAddress)}\n              </Text>\n            </View>\n            <Text style={[styles.copyLabel, { color: t.accent }]}>Copy</Text>\n          </TouchableOpacity>\n        ) : null}\n\n        {onSupport ? (\n          <>\n            {onCopyAddress ? (\n              <View style={[styles.separator, { backgroundColor: t.border }]} />\n            ) : null}\n            <TouchableOpacity\n              style={styles.actionRow}\n              onPress={onSupport}\n              activeOpacity={0.7}\n            >\n              <Text style={[styles.actionLabel, { color: t.text }]}>Help & Support</Text>\n              <Text style={[styles.chevron, { color: t.textMuted }]}>{'\\u203A'}</Text>\n            </TouchableOpacity>\n          </>\n        ) : null}\n      </View>\n\n      {/* Logout button */}\n      <TouchableOpacity\n        style={[styles.logoutButton, { borderColor: t.live }]}\n        onPress={onLogout}\n        disabled={loggingOut}\n        activeOpacity={0.7}\n      >\n        {loggingOut ? (\n          <ActivityIndicator color={t.live} size=\"small\" />\n        ) : (\n          <Text style={[styles.logoutText, { color: t.live }]}>Log Out</Text>\n        )}\n      </TouchableOpacity>\n\n      {/* App version */}\n      {appVersion ? (\n        <Text style={[styles.version, { color: t.textDim }]}>v{appVersion}</Text>\n      ) : null}\n    </ScrollView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  content: {\n    padding: 20,\n    paddingTop: 24,\n    gap: 20,\n  },\n  actionsCard: {\n    borderRadius: 16,\n    borderWidth: 1,\n    overflow: 'hidden',\n  },\n  actionRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingHorizontal: 16,\n    paddingVertical: 14,\n  },\n  actionRowLeft: {\n    flex: 1,\n    gap: 2,\n  },\n  actionLabel: {\n    fontSize: 15,\n    fontWeight: '600',\n  },\n  actionValue: {\n    fontSize: 13,\n    fontFamily: 'monospace',\n  },\n  copyLabel: {\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  chevron: {\n    fontSize: 22,\n    fontWeight: '300',\n  },\n  separator: {\n    height: 1,\n    marginHorizontal: 16,\n  },\n  logoutButton: {\n    height: 52,\n    borderRadius: 16,\n    borderWidth: 1.5,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  logoutText: {\n    fontSize: 16,\n    fontWeight: '700',\n  },\n  version: {\n    fontSize: 12,\n    textAlign: 'center',\n  },\n});\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  ActivityIndicator,\n  Modal,\n  Animated,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n  Image,\n  ScrollView,\n  Dimensions,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { useDubs } from '../provider';\nimport { useAuth } from '../hooks/useAuth';\nimport { usePushNotifications } from '../hooks/usePushNotifications';\nimport { AvatarEditor, getAvatarUrl, generateSeed, parseAvatarUrl } from './AvatarEditor';\n\nfunction truncateAddress(address: string, chars = 4): string {\n  if (address.length <= chars * 2 + 3) return address;\n  return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\n// ── Props ──\n\nexport interface UserProfileSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  user: {\n    walletAddress: string;\n    username?: string;\n    avatar?: string | null;\n    createdAt?: string;\n  };\n  onAvatarUpdated?: (newAvatarUrl: string) => void;\n  onDisconnect?: () => void;\n}\n\nexport function UserProfileSheet({\n  visible,\n  onDismiss,\n  user,\n  onAvatarUpdated,\n  onDisconnect,\n}: UserProfileSheetProps) {\n  const t = useDubsTheme();\n  const { client } = useDubs();\n  const { refreshUser } = useAuth();\n  const push = usePushNotifications();\n\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n  const parsed = useMemo(() => parseAvatarUrl(user.avatar), [user.avatar]);\n  const [avatarStyle, setAvatarStyle] = useState(parsed.style);\n  const [avatarSeed, setAvatarSeed] = useState(parsed.seed);\n  const [bgColor, setBgColor] = useState(parsed.bg);\n  const [saving, setSaving] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  // Re-sync when user prop changes\n  useEffect(() => {\n    const p = parseAvatarUrl(user.avatar);\n    setAvatarStyle(p.style);\n    setAvatarSeed(p.seed);\n    setBgColor(p.bg);\n  }, [user.avatar]);\n\n  // Animate overlay\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible, overlayOpacity]);\n\n  // Reset error when sheet opens\n  useEffect(() => {\n    if (visible) setError(null);\n  }, [visible]);\n\n  const currentAvatarUrl = getAvatarUrl(avatarStyle, avatarSeed, bgColor);\n\n  const saveAvatar = useCallback(async (newUrl: string) => {\n    setSaving(true);\n    setError(null);\n    try {\n      await client.updateProfile({ avatar: newUrl });\n      await refreshUser();\n      onAvatarUpdated?.(newUrl);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : 'Failed to update avatar');\n    } finally {\n      setSaving(false);\n    }\n  }, [client, refreshUser, onAvatarUpdated]);\n\n  const handleStyleChange = useCallback((style: string) => {\n    setAvatarStyle(style);\n    saveAvatar(getAvatarUrl(style, avatarSeed, bgColor));\n  }, [avatarSeed, bgColor, saveAvatar]);\n\n  const handleShuffle = useCallback(() => {\n    const newSeed = generateSeed();\n    setAvatarSeed(newSeed);\n    saveAvatar(getAvatarUrl(avatarStyle, newSeed, bgColor));\n  }, [avatarStyle, bgColor, saveAvatar]);\n\n  const handleBgChange = useCallback((color: string) => {\n    setBgColor(color);\n    saveAvatar(getAvatarUrl(avatarStyle, avatarSeed, color));\n  }, [avatarStyle, avatarSeed, saveAvatar]);\n\n  return (\n    <Modal\n      visible={visible}\n      animationType=\"slide\"\n      transparent\n      onRequestClose={onDismiss}\n    >\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      <KeyboardAvoidingView\n        style={styles.keyboardView}\n        behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n      >\n        <View style={styles.sheetPositioner}>\n          <View style={[styles.sheet, { backgroundColor: t.background }]}>\n            {/* Drag handle */}\n            <View style={styles.handleRow}>\n              <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n            </View>\n\n            {/* Header */}\n            <View style={styles.header}>\n              <Text style={[styles.headerTitle, { color: t.text }]}>Profile</Text>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n                <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            <ScrollView\n              style={styles.scrollContent}\n              contentContainerStyle={styles.scrollContentInner}\n              showsVerticalScrollIndicator={false}\n              bounces={false}\n            >\n              {/* Avatar section */}\n              <View style={styles.avatarSection}>\n                <View style={[styles.avatarContainer, { borderColor: t.border }]}>\n                  <Image\n                    source={{ uri: currentAvatarUrl }}\n                    style={styles.avatar}\n                  />\n                  {saving && (\n                    <View style={styles.avatarLoading}>\n                      <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                    </View>\n                  )}\n                </View>\n                {user.username ? (\n                  <Text style={[styles.username, { color: t.text }]}>{user.username}</Text>\n                ) : null}\n                <Text style={[styles.walletAddress, { color: t.textMuted }]}>\n                  {truncateAddress(user.walletAddress, 6)}\n                </Text>\n              </View>\n\n              {/* Change Avatar */}\n              <View style={styles.section}>\n                <View style={styles.sectionHeaderRow}>\n                  <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>\n                    Change Avatar\n                  </Text>\n                  <TouchableOpacity\n                    style={[styles.shuffleButton, { borderColor: t.border }]}\n                    onPress={handleShuffle}\n                    activeOpacity={0.7}\n                    disabled={saving}\n                  >\n                    <Text style={[styles.shuffleText, { color: t.accent }]}>Shuffle</Text>\n                  </TouchableOpacity>\n                </View>\n                <AvatarEditor\n                  style={avatarStyle}\n                  seed={avatarSeed}\n                  bg={bgColor}\n                  onStyleChange={handleStyleChange}\n                  onSeedChange={setAvatarSeed}\n                  onBgChange={handleBgChange}\n                  disabled={saving}\n                />\n              </View>\n\n              {/* Error */}\n              {error ? (\n                <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n                  <Text style={[styles.errorText, { color: t.errorText }]}>{error}</Text>\n                </View>\n              ) : null}\n\n              {/* Push Notifications */}\n              {push.enabled && (\n                <View style={[styles.notifRow, { backgroundColor: t.surface, borderColor: t.border }]}>\n                  <View style={styles.notifLeft}>\n                    <Text style={[styles.notifLabel, { color: t.text }]}>Push Notifications</Text>\n                    <Text\n                      style={[\n                        styles.notifStatus,\n                        { color: push.hasPermission ? t.success : t.textMuted },\n                      ]}\n                    >\n                      {push.hasPermission ? 'Enabled' : 'Disabled'}\n                    </Text>\n                  </View>\n                  {!push.hasPermission && (\n                    <TouchableOpacity\n                      style={[styles.enableButton, { backgroundColor: t.accent }]}\n                      onPress={push.register}\n                      disabled={push.loading}\n                      activeOpacity={0.8}\n                    >\n                      {push.loading ? (\n                        <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                      ) : (\n                        <Text style={styles.enableText}>Enable</Text>\n                      )}\n                    </TouchableOpacity>\n                  )}\n                </View>\n              )}\n\n              {/* Push error */}\n              {push.enabled && push.error ? (\n                <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n                  <Text style={[styles.errorText, { color: t.errorText }]}>{push.error.message}</Text>\n                </View>\n              ) : null}\n\n              {/* Disconnect */}\n              {onDisconnect ? (\n                <TouchableOpacity\n                  style={[styles.disconnectButton, { borderColor: t.live }]}\n                  onPress={onDisconnect}\n                  activeOpacity={0.7}\n                >\n                  <Text style={[styles.disconnectText, { color: t.live }]}>Disconnect Wallet</Text>\n                </TouchableOpacity>\n              ) : null}\n            </ScrollView>\n          </View>\n        </View>\n      </KeyboardAvoidingView>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n  },\n  overlayTap: {\n    flex: 1,\n  },\n  keyboardView: {\n    flex: 1,\n    justifyContent: 'flex-end',\n  },\n  sheetPositioner: {\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    paddingHorizontal: 20,\n    paddingBottom: 0,\n    height: Dimensions.get('window').height * 0.7,\n  },\n  handleRow: {\n    alignItems: 'center',\n    paddingTop: 10,\n    paddingBottom: 8,\n  },\n  handle: {\n    width: 36,\n    height: 4,\n    borderRadius: 2,\n    opacity: 0.4,\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingVertical: 12,\n  },\n  headerTitle: {\n    fontSize: 20,\n    fontWeight: '700',\n  },\n  closeButton: {\n    fontSize: 20,\n    padding: 4,\n  },\n  scrollContent: {\n    flexGrow: 0,\n  },\n  scrollContentInner: {\n    paddingBottom: 8,\n  },\n  avatarSection: {\n    alignItems: 'center',\n    paddingTop: 8,\n    paddingBottom: 20,\n    gap: 8,\n  },\n  avatarContainer: {\n    width: 120,\n    height: 120,\n    borderRadius: 60,\n    borderWidth: 2,\n    overflow: 'hidden',\n  },\n  avatar: {\n    width: '100%',\n    height: '100%',\n  },\n  avatarLoading: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.35)',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  username: {\n    fontSize: 18,\n    fontWeight: '700',\n  },\n  walletAddress: {\n    fontSize: 13,\n    fontFamily: 'monospace',\n  },\n  section: {\n    marginBottom: 20,\n    gap: 12,\n  },\n  sectionHeaderRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n  },\n  sectionLabel: {\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  shuffleButton: {\n    paddingHorizontal: 14,\n    paddingVertical: 6,\n    borderRadius: 12,\n    borderWidth: 1,\n  },\n  shuffleText: {\n    fontSize: 13,\n    fontWeight: '600',\n  },\n  errorBox: {\n    marginBottom: 16,\n    borderRadius: 12,\n    borderWidth: 1,\n    padding: 12,\n  },\n  errorText: {\n    fontSize: 13,\n    fontWeight: '500',\n  },\n  notifRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    borderRadius: 16,\n    borderWidth: 1,\n    paddingHorizontal: 16,\n    paddingVertical: 14,\n    marginBottom: 16,\n  },\n  notifLeft: {\n    gap: 2,\n  },\n  notifLabel: {\n    fontSize: 15,\n    fontWeight: '600',\n  },\n  notifStatus: {\n    fontSize: 13,\n  },\n  enableButton: {\n    paddingHorizontal: 18,\n    paddingVertical: 10,\n    borderRadius: 12,\n  },\n  enableText: {\n    color: '#FFFFFF',\n    fontSize: 14,\n    fontWeight: '700',\n  },\n  disconnectButton: {\n    height: 52,\n    borderRadius: 16,\n    borderWidth: 1.5,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  disconnectText: {\n    fontSize: 16,\n    fontWeight: '700',\n  },\n});\n","import { useState } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface GamePosterProps {\n  game: GameDetail;\n  /** Optional Image component — pass expo-image or RN Image. Defaults to RN Image. */\n  ImageComponent?: React.ComponentType<any>;\n}\n\nfunction computeCountdown(lockTimestamp: number | string | null): string {\n  if (!lockTimestamp) return '';\n  const ts = typeof lockTimestamp === 'string' ? parseInt(lockTimestamp) : lockTimestamp;\n  const diff = ts * 1000 - Date.now();\n  if (diff <= 0) return 'LIVE';\n  const days = Math.floor(diff / 86400000);\n  const hours = Math.floor((diff % 86400000) / 3600000);\n  const mins = Math.floor((diff % 3600000) / 60000);\n  if (days > 0) return `${days}d ${hours}h`;\n  if (hours > 0) return `${hours}h ${mins}m`;\n  return `${mins}m`;\n}\n\n/**\n * Matchup poster hero widget.\n * Shows the game poster image (or team logo fallback), countdown pill, and pool total.\n */\nexport function GamePoster({ game, ImageComponent }: GamePosterProps) {\n  const t = useDubsTheme();\n  const Img = ImageComponent || require('react-native').Image;\n\n  const opponents = game.opponents || [];\n  const home = opponents[0];\n  const away = opponents[1];\n  const countdown = computeCountdown(game.lockTimestamp);\n  const isLive = countdown === 'LIVE';\n\n  return (\n    <View style={styles.container}>\n      {game.media?.poster ? (\n        <Img\n          source={{ uri: game.media.poster }}\n          style={styles.image}\n          resizeMode=\"cover\"\n        />\n      ) : (\n        <View style={[styles.image, { backgroundColor: t.surface }]}>\n          <View style={styles.fallback}>\n            <TeamLogoInternal url={home?.imageUrl} size={56} Img={Img} />\n            <Text style={styles.vs}>VS</Text>\n            <TeamLogoInternal url={away?.imageUrl} size={56} Img={Img} />\n          </View>\n        </View>\n      )}\n      <View style={styles.overlay} />\n\n      <View style={styles.teamNames}>\n        <Text style={styles.teamNameText} numberOfLines={1}>\n          {home?.name || 'Home'}\n        </Text>\n        <Text style={styles.teamNameVs}>vs</Text>\n        <Text style={styles.teamNameText} numberOfLines={1}>\n          {away?.name || 'Away'}\n        </Text>\n      </View>\n\n      {countdown ? (\n        <View style={styles.countdownPill}>\n          <Text style={[styles.countdownText, isLive && styles.countdownLive]}>\n            {countdown}\n          </Text>\n        </View>\n      ) : null}\n\n      <View style={styles.poolPill}>\n        <Text style={styles.poolText}>{game.totalPool || 0} SOL</Text>\n      </View>\n    </View>\n  );\n}\n\nfunction TeamLogoInternal({ url, size, Img }: { url: string | null | undefined; size: number; Img: any }) {\n  const [failed, setFailed] = useState(false);\n  if (!url || failed) {\n    return <View style={[styles.logoPlaceholder, { width: size, height: size, borderRadius: size / 2 }]} />;\n  }\n  return (\n    <Img\n      source={{ uri: url }}\n      style={{ width: size, height: size, borderRadius: size / 2 }}\n      resizeMode=\"contain\"\n      onError={() => setFailed(true)}\n    />\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    height: 200,\n    borderRadius: 16,\n    overflow: 'hidden',\n    position: 'relative',\n  },\n  image: {\n    ...StyleSheet.absoluteFillObject,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.35)',\n  },\n  fallback: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 24,\n    zIndex: 2,\n  },\n  vs: {\n    color: '#FFF',\n    fontSize: 24,\n    fontWeight: '900',\n    zIndex: 2,\n  },\n  logoPlaceholder: {\n    backgroundColor: 'rgba(255,255,255,0.15)',\n    zIndex: 2,\n  },\n  teamNames: {\n    position: 'absolute',\n    top: 12,\n    left: 12,\n    right: 12,\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    gap: 8,\n  },\n  teamNameText: {\n    color: '#FFF',\n    fontSize: 14,\n    fontWeight: '700',\n    maxWidth: '40%',\n  },\n  teamNameVs: {\n    color: 'rgba(255,255,255,0.6)',\n    fontSize: 12,\n    fontWeight: '600',\n  },\n  countdownPill: {\n    position: 'absolute',\n    bottom: 12,\n    left: 12,\n    backgroundColor: 'rgba(0,0,0,0.65)',\n    borderRadius: 8,\n    paddingHorizontal: 10,\n    paddingVertical: 5,\n  },\n  countdownText: {\n    color: '#FFF',\n    fontSize: 13,\n    fontWeight: '700',\n  },\n  countdownLive: {\n    color: '#EF4444',\n  },\n  poolPill: {\n    position: 'absolute',\n    bottom: 12,\n    right: 12,\n    backgroundColor: '#7C3AED',\n    borderRadius: 8,\n    paddingHorizontal: 12,\n    paddingVertical: 5,\n  },\n  poolText: {\n    color: '#FFF',\n    fontSize: 13,\n    fontWeight: '800',\n  },\n});\n","import { useMemo } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface LivePoolsCardProps {\n  game: GameDetail;\n  /** Custom short-name function for team labels. Defaults to full name. */\n  shortName?: (name: string | null) => string;\n  /** Override bar colors. Defaults to blue/red. */\n  homeColor?: string;\n  awayColor?: string;\n}\n\n/**\n * Pool breakdown card showing each side's SOL amount, bar chart, and implied odds.\n */\nexport function LivePoolsCard({\n  game,\n  shortName,\n  homeColor = '#3B82F6',\n  awayColor = '#EF4444',\n}: LivePoolsCardProps) {\n  const t = useDubsTheme();\n\n  const opponents = game.opponents || [];\n  const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n  const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n  const homePool = game.homePool || 0;\n  const awayPool = game.awayPool || 0;\n  const totalPool = game.totalPool || 0;\n\n  const { homePercent, awayPercent, homeOdds, awayOdds } = useMemo(() => {\n    return {\n      homePercent: totalPool > 0 ? (homePool / totalPool) * 100 : 50,\n      awayPercent: totalPool > 0 ? (awayPool / totalPool) * 100 : 50,\n      homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n      awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n    };\n  }, [homePool, awayPool, totalPool]);\n\n  return (\n    <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n      <Text style={[styles.title, { color: t.text }]}>Live Pools</Text>\n      <Text style={[styles.total, { color: t.accent }]}>{totalPool} SOL total</Text>\n\n      <View style={styles.bars}>\n        <PoolBar name={homeName} amount={homePool} percent={homePercent} color={homeColor} t={t} />\n        <PoolBar name={awayName} amount={awayPool} percent={awayPercent} color={awayColor} t={t} />\n      </View>\n\n      <View style={styles.oddsRow}>\n        <Text style={[styles.oddsText, { color: t.textMuted }]}>\n          {homeName}: <Text style={{ color: t.text, fontWeight: '700' }}>{homeOdds}x</Text>\n        </Text>\n        <Text style={[styles.oddsText, { color: t.textMuted }]}>\n          {awayName}: <Text style={{ color: t.text, fontWeight: '700' }}>{awayOdds}x</Text>\n        </Text>\n      </View>\n    </View>\n  );\n}\n\nfunction PoolBar({ name, amount, percent, color, t }: { name: string; amount: number; percent: number; color: string; t: any }) {\n  return (\n    <View style={styles.barRow}>\n      <Text style={[styles.barLabel, { color: t.textSecondary }]} numberOfLines={1}>{name}</Text>\n      <View style={[styles.barTrack, { backgroundColor: t.border }]}>\n        <View style={[styles.barFill, { width: `${Math.max(percent, 2)}%`, backgroundColor: color }]} />\n      </View>\n      <Text style={[styles.barAmount, { color: t.text }]}>{amount} SOL</Text>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n  title: { fontSize: 17, fontWeight: '700', marginBottom: 4 },\n  total: { fontSize: 14, fontWeight: '600', marginBottom: 14 },\n  bars: { gap: 10 },\n  barRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n  barLabel: { width: 80, fontSize: 13, fontWeight: '600' },\n  barTrack: { flex: 1, height: 10, borderRadius: 5, overflow: 'hidden' },\n  barFill: { height: '100%', borderRadius: 5 },\n  barAmount: { width: 70, textAlign: 'right', fontSize: 13, fontWeight: '700' },\n  oddsRow: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 12 },\n  oddsText: { fontSize: 12 },\n});\n","import { useState, useMemo } from 'react';\nimport { StyleSheet, View, Text, TouchableOpacity } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface PickWinnerCardProps {\n  game: GameDetail;\n  selectedTeam: 'home' | 'away' | null;\n  onSelect: (team: 'home' | 'away') => void;\n  /** Custom short-name function for team labels. Defaults to full name. */\n  shortName?: (name: string | null) => string;\n  /** Override colors. Defaults to blue/red. */\n  homeColor?: string;\n  awayColor?: string;\n  /** Optional Image component (expo-image, etc.). */\n  ImageComponent?: React.ComponentType<any>;\n}\n\n/**\n * Team selection card for picking which side to bet on.\n */\nexport function PickWinnerCard({\n  game,\n  selectedTeam,\n  onSelect,\n  shortName,\n  homeColor = '#3B82F6',\n  awayColor = '#EF4444',\n  ImageComponent,\n}: PickWinnerCardProps) {\n  const t = useDubsTheme();\n\n  const opponents = game.opponents || [];\n  const bettors = game.bettors || [];\n  const totalPool = game.totalPool || 0;\n  const homePool = game.homePool || 0;\n  const awayPool = game.awayPool || 0;\n\n  const { homeOdds, awayOdds, homeBets, awayBets } = useMemo(() => ({\n    homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n    awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n    homeBets: bettors.filter(b => b.team === 'home').length,\n    awayBets: bettors.filter(b => b.team === 'away').length,\n  }), [totalPool, homePool, awayPool, bettors]);\n\n  const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n  const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n\n  return (\n    <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n      <Text style={[styles.title, { color: t.text }]}>Pick Your Winner</Text>\n      <View style={styles.row}>\n        <TeamOption\n          name={homeName}\n          imageUrl={opponents[0]?.imageUrl}\n          odds={homeOdds}\n          bets={homeBets}\n          color={homeColor}\n          selected={selectedTeam === 'home'}\n          onPress={() => onSelect('home')}\n          ImageComponent={ImageComponent}\n          t={t}\n        />\n        <TeamOption\n          name={awayName}\n          imageUrl={opponents[1]?.imageUrl}\n          odds={awayOdds}\n          bets={awayBets}\n          color={awayColor}\n          selected={selectedTeam === 'away'}\n          onPress={() => onSelect('away')}\n          ImageComponent={ImageComponent}\n          t={t}\n        />\n      </View>\n    </View>\n  );\n}\n\nfunction TeamOption({\n  name, imageUrl, odds, bets, color, selected, onPress, ImageComponent, t,\n}: {\n  name: string; imageUrl?: string | null; odds: string; bets: number;\n  color: string; selected: boolean; onPress: () => void;\n  ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n  const [imgFailed, setImgFailed] = useState(false);\n  const Img = ImageComponent || require('react-native').Image;\n  const showImage = imageUrl && !imgFailed;\n\n  return (\n    <TouchableOpacity\n      style={[styles.option, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + '15' : t.background }]}\n      onPress={onPress}\n      activeOpacity={0.7}\n    >\n      {showImage ? (\n        <Img source={{ uri: imageUrl }} style={styles.logo} resizeMode=\"contain\" onError={() => setImgFailed(true)} />\n      ) : (\n        <View style={[styles.logo, styles.logoPlaceholder]} />\n      )}\n      <Text style={[styles.name, { color: t.text }]} numberOfLines={1}>{name}</Text>\n      <Text style={[styles.odds, { color }]}>{odds}x</Text>\n      <Text style={[styles.bets, { color: t.textMuted }]}>{bets} {bets === 1 ? 'bet' : 'bets'}</Text>\n      {selected && (\n        <View style={[styles.badge, { backgroundColor: color }]}>\n          <Text style={styles.badgeText}>Selected</Text>\n        </View>\n      )}\n    </TouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n  title: { fontSize: 17, fontWeight: '700', marginBottom: 12 },\n  row: { flexDirection: 'row', gap: 12 },\n  option: { flex: 1, borderWidth: 2, borderRadius: 16, padding: 16, alignItems: 'center', gap: 8 },\n  logo: { width: 48, height: 48, borderRadius: 24 },\n  logoPlaceholder: { backgroundColor: 'rgba(128,128,128,0.2)' },\n  name: { fontSize: 15, fontWeight: '700' },\n  odds: { fontSize: 20, fontWeight: '800' },\n  bets: { fontSize: 12 },\n  badge: { borderRadius: 8, paddingHorizontal: 12, paddingVertical: 4, marginTop: 4 },\n  badgeText: { color: '#FFF', fontSize: 12, fontWeight: '700' },\n});\n","import { useState } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { ensurePngAvatar } from '../../utils/avatarUrl';\nimport type { GameDetail } from '../../types';\n\nexport interface PlayersCardProps {\n  game: GameDetail;\n  /** How many chars to show on each side of a truncated wallet. Default 4. */\n  truncateChars?: number;\n  /** Override team dot colors. */\n  homeColor?: string;\n  awayColor?: string;\n  drawColor?: string;\n  /** Optional Image component (expo-image, etc.). */\n  ImageComponent?: React.ComponentType<any>;\n}\n\nfunction truncateWallet(addr: string, chars: number): string {\n  if (addr.length <= chars * 2 + 3) return addr;\n  return `${addr.slice(0, chars)}...${addr.slice(-chars)}`;\n}\n\n/**\n * Card showing all bettors in a game with their avatar, username, team, and wager amount.\n */\nexport function PlayersCard({\n  game,\n  truncateChars = 4,\n  homeColor = '#3B82F6',\n  awayColor = '#EF4444',\n  drawColor = '#A855F7',\n  ImageComponent,\n}: PlayersCardProps) {\n  const t = useDubsTheme();\n  const bettors = game.bettors || [];\n\n  const dotColor = (team: 'home' | 'away' | 'draw') => {\n    if (team === 'home') return homeColor;\n    if (team === 'away') return awayColor;\n    return drawColor;\n  };\n\n  return (\n    <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n      <Text style={[styles.title, { color: t.text }]}>\n        Players{bettors.length > 0 ? ` (${bettors.length})` : ''}\n      </Text>\n\n      {bettors.length === 0 ? (\n        <Text style={[styles.empty, { color: t.textMuted }]}>No players yet — be the first!</Text>\n      ) : (\n        bettors.map((b, i) => (\n          <BettorRow\n            key={`${b.wallet}-${i}`}\n            bettor={b}\n            dotColor={dotColor(b.team)}\n            truncateChars={truncateChars}\n            isFirst={i === 0}\n            ImageComponent={ImageComponent}\n            t={t}\n          />\n        ))\n      )}\n    </View>\n  );\n}\n\nfunction BettorRow({\n  bettor, dotColor, truncateChars, isFirst, ImageComponent, t,\n}: {\n  bettor: { wallet: string; username: string | null; avatar: string | null; team: 'home' | 'away' | 'draw'; amount: number };\n  dotColor: string; truncateChars: number; isFirst: boolean;\n  ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n  const [imgFailed, setImgFailed] = useState(false);\n  const Img = ImageComponent || require('react-native').Image;\n  const showAvatar = bettor.avatar && !imgFailed;\n\n  return (\n    <View style={[styles.row, !isFirst && { borderTopColor: t.border, borderTopWidth: 1 }]}>\n      <View style={[styles.dot, { backgroundColor: dotColor }]} />\n      {showAvatar ? (\n        <Img source={{ uri: ensurePngAvatar(bettor.avatar) }} style={styles.avatar} resizeMode=\"cover\" onError={() => setImgFailed(true)} />\n      ) : (\n        <View style={[styles.avatar, styles.avatarPlaceholder]} />\n      )}\n      <View style={styles.nameCol}>\n        <Text style={[styles.username, { color: t.text }]} numberOfLines={1}>\n          {bettor.username || truncateWallet(bettor.wallet, truncateChars)}\n        </Text>\n      </View>\n      <Text style={[styles.amount, { color: t.textSecondary }]}>{bettor.amount} SOL</Text>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n  title: { fontSize: 17, fontWeight: '700', marginBottom: 12 },\n  empty: { fontSize: 14, textAlign: 'center', paddingVertical: 16 },\n  row: { flexDirection: 'row', alignItems: 'center', paddingVertical: 10, gap: 10 },\n  dot: { width: 8, height: 8, borderRadius: 4 },\n  avatar: { width: 28, height: 28, borderRadius: 14 },\n  avatarPlaceholder: { backgroundColor: 'rgba(128,128,128,0.2)' },\n  nameCol: { flex: 1 },\n  username: { fontSize: 14, fontWeight: '600' },\n  amount: { fontSize: 13, fontWeight: '700' },\n});\n","import { useMemo } from 'react';\nimport { StyleSheet, View, Text, TouchableOpacity, ActivityIndicator } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail, MutationStatus } from '../../types';\n\nexport interface JoinGameButtonProps {\n  game: GameDetail;\n  walletAddress: string;\n  selectedTeam: 'home' | 'away' | null;\n  status: MutationStatus;\n  onJoin: () => void;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n  building: 'Building transaction...',\n  signing: 'Approve in wallet...',\n  confirming: 'Confirming on-chain...',\n  saving: 'Saving...',\n};\n\n/**\n * Fixed bottom bar with buy-in info and join button.\n * Renders nothing if the user already joined, or the game is locked/resolved.\n */\nexport function JoinGameButton({ game, walletAddress, selectedTeam, status, onJoin }: JoinGameButtonProps) {\n  const t = useDubsTheme();\n\n  const alreadyJoined = useMemo(() => {\n    if (!walletAddress) return false;\n    return (game.bettors || []).some(b => b.wallet === walletAddress);\n  }, [game.bettors, walletAddress]);\n\n  if (alreadyJoined || game.isLocked || game.isResolved) return null;\n\n  const isJoining = status !== 'idle' && status !== 'success' && status !== 'error';\n  const statusLabel = STATUS_LABELS[status] || '';\n\n  return (\n    <View style={[styles.bar, { backgroundColor: t.background, borderTopColor: t.border }]}>\n      <View style={styles.buyInRow}>\n        <Text style={[styles.buyInLabel, { color: t.textMuted }]}>Buy-in</Text>\n        <Text style={[styles.buyInValue, { color: t.text }]}>{game.buyIn} SOL</Text>\n      </View>\n      <TouchableOpacity\n        style={[styles.button, { backgroundColor: selectedTeam ? t.accent : t.border }]}\n        disabled={!selectedTeam || isJoining}\n        onPress={onJoin}\n        activeOpacity={0.8}\n      >\n        {isJoining ? (\n          <View style={styles.joiningRow}>\n            <ActivityIndicator size=\"small\" color=\"#000\" />\n            <Text style={styles.buttonText}>{statusLabel}</Text>\n          </View>\n        ) : (\n          <Text style={[styles.buttonText, !selectedTeam && { color: t.textMuted }]}>\n            {selectedTeam ? `Join Bet — ${game.buyIn} SOL` : 'Pick a team to bet'}\n          </Text>\n        )}\n      </TouchableOpacity>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  bar: { position: 'absolute', bottom: 0, left: 0, right: 0, paddingHorizontal: 16, paddingTop: 12, paddingBottom: 36, borderTopWidth: 1 },\n  buyInRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 },\n  buyInLabel: { fontSize: 13 },\n  buyInValue: { fontSize: 15, fontWeight: '800' },\n  button: { borderRadius: 14, paddingVertical: 16, alignItems: 'center' },\n  buttonText: { color: '#000', fontSize: 16, fontWeight: '800' },\n  joiningRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  TextInput,\n  TouchableOpacity,\n  ActivityIndicator,\n  Modal,\n  Animated,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useCreateCustomGame } from '../../hooks/useCreateCustomGame';\nimport type { CreateCustomGameMutationResult } from '../../hooks/useCreateCustomGame';\n\nexport interface CreateCustomGameSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  title?: string;\n  maxPlayers?: number;\n  fee?: number;\n  presetAmounts?: number[];\n  defaultAmount?: number;\n  metadata?: Record<string, unknown>;\n  onAmountChange?: (amount: number | null) => void;\n  onSuccess?: (result: CreateCustomGameMutationResult) => void;\n  onError?: (error: Error) => void;\n  /** Pool mode: hides buy-in selection, uses defaultAmount, auto-assigns team, shows \"Create Pool\" labels */\n  isPoolModeEnabled?: boolean;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n  building: 'Building transaction...',\n  signing: 'Approve in wallet...',\n  confirming: 'Confirming...',\n  success: 'Game Created!',\n};\n\nexport function CreateCustomGameSheet({\n  visible,\n  onDismiss,\n  title,\n  maxPlayers = 2,\n  fee = 5,\n  presetAmounts = [0.01, 0.1, 0.5, 1],\n  defaultAmount = 0.01,\n  metadata,\n  onAmountChange,\n  onSuccess,\n  onError,\n  isPoolModeEnabled = false,\n}: CreateCustomGameSheetProps) {\n  const t = useDubsTheme();\n  const { wallet } = useDubs();\n  const mutation = useCreateCustomGame();\n\n  const [selectedAmount, setSelectedAmount] = useState<number | null>(null);\n  const [customAmount, setCustomAmount] = useState('');\n  const [isCustom, setIsCustom] = useState(false);\n\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n  // Animate overlay on visibility change\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible, overlayOpacity]);\n\n  // Reset state when sheet opens\n  useEffect(() => {\n    if (visible) {\n      setSelectedAmount(defaultAmount ?? null);\n      setCustomAmount('');\n      setIsCustom(false);\n      mutation.reset();\n    }\n  }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Auto-dismiss on success\n  useEffect(() => {\n    if (mutation.status === 'success' && mutation.data) {\n      onSuccess?.(mutation.data);\n      const timer = setTimeout(() => {\n        onDismiss();\n      }, 1500);\n      return () => clearTimeout(timer);\n    }\n  }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Report errors\n  useEffect(() => {\n    if (mutation.status === 'error' && mutation.error) {\n      onError?.(mutation.error);\n    }\n  }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const handlePresetSelect = useCallback((amount: number) => {\n    setSelectedAmount(amount);\n    setIsCustom(false);\n    setCustomAmount('');\n    onAmountChange?.(amount);\n  }, [onAmountChange]);\n\n  const handleCustomSelect = useCallback(() => {\n    setIsCustom(true);\n    setSelectedAmount(null);\n    onAmountChange?.(null);\n  }, [onAmountChange]);\n\n  const handleCustomAmountChange = useCallback((text: string) => {\n    // Allow only numbers and single decimal point\n    const cleaned = text.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');\n    setCustomAmount(cleaned);\n    const parsed = parseFloat(cleaned);\n    const amount = parsed > 0 ? parsed : null;\n    setSelectedAmount(amount);\n    onAmountChange?.(amount);\n  }, [onAmountChange]);\n\n  const effectiveAmount = selectedAmount;\n  const playerCount = maxPlayers || 2;\n\n  // In pool mode, always use defaultAmount\n  const finalAmount = isPoolModeEnabled ? (defaultAmount ?? 0.1) : effectiveAmount;\n\n  const pot = finalAmount ? finalAmount * playerCount : 0;\n  const winnerTakes = pot * (1 - fee / 100);\n\n  const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n  const canCreate = finalAmount !== null && finalAmount > 0 && !isMutating && mutation.status !== 'success';\n\n  const handleCreate = useCallback(async () => {\n    if (!finalAmount || !wallet.publicKey) return;\n\n    try {\n      await mutation.execute({\n        playerWallet: wallet.publicKey.toBase58(),\n        teamChoice: 'home',\n        wagerAmount: finalAmount,\n        title,\n        maxPlayers,\n        metadata,\n      });\n    } catch {\n      // Error is already captured in mutation state\n    }\n  }, [finalAmount, wallet.publicKey, mutation.execute, title, maxPlayers, metadata]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n  const playersLabel = playerCount === 2 ? '2 (1v1)' : `${playerCount} players`;\n\n  return (\n    <Modal\n      visible={visible}\n      animationType=\"slide\"\n      transparent\n      onRequestClose={onDismiss}\n    >\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      <KeyboardAvoidingView\n        style={styles.keyboardView}\n        behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n      >\n        <View style={styles.sheetPositioner}>\n          <View style={[styles.sheet, { backgroundColor: t.background }]}>\n            {/* Drag handle */}\n            <View style={styles.handleRow}>\n              <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n            </View>\n\n            {/* Header */}\n            <View style={styles.header}>\n              <Text style={[styles.headerTitle, { color: t.text }]}>{isPoolModeEnabled ? 'Create Pool' : 'New Game'}</Text>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n                <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            {/* Buy-In Section — hidden in pool mode (uses defaultAmount) */}\n            {!isPoolModeEnabled && (\n              <View style={styles.section}>\n                <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Buy-In Amount</Text>\n                <View style={styles.chipsRow}>\n                  {presetAmounts.map((amount) => {\n                    const active = !isCustom && selectedAmount === amount;\n                    return (\n                      <TouchableOpacity\n                        key={amount}\n                        style={[\n                          styles.chip,\n                          { borderColor: active ? t.accent : t.border },\n                          active && { backgroundColor: t.accent },\n                        ]}\n                        onPress={() => handlePresetSelect(amount)}\n                        activeOpacity={0.8}\n                      >\n                        <Text style={[styles.chipText, { color: active ? '#FFFFFF' : t.text }]}>\n                          {amount} SOL\n                        </Text>\n                      </TouchableOpacity>\n                    );\n                  })}\n                  <TouchableOpacity\n                    style={[\n                      styles.chip,\n                      { borderColor: isCustom ? t.accent : t.border },\n                      isCustom && { backgroundColor: t.accent },\n                    ]}\n                    onPress={handleCustomSelect}\n                    activeOpacity={0.8}\n                  >\n                    <Text style={[styles.chipText, { color: isCustom ? '#FFFFFF' : t.text }]}>\n                      Custom\n                    </Text>\n                  </TouchableOpacity>\n                </View>\n\n                {isCustom && (\n                  <TextInput\n                    style={[styles.input, { backgroundColor: t.surface, color: t.text, borderColor: t.accent }]}\n                    placeholder=\"Enter amount in SOL\"\n                    placeholderTextColor={t.textDim}\n                    keyboardType=\"decimal-pad\"\n                    value={customAmount}\n                    onChangeText={handleCustomAmountChange}\n                    autoFocus\n                  />\n                )}\n              </View>\n            )}\n\n            {/* Summary Card */}\n            <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Buy-in</Text>\n                <Text style={[styles.summaryValue, { color: t.text }]}>\n                  {finalAmount ? `${finalAmount} SOL` : '—'}\n                </Text>\n              </View>\n              <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isPoolModeEnabled ? 'Max players' : 'Players'}</Text>\n                <Text style={[styles.summaryValue, { color: t.text }]}>{isPoolModeEnabled ? playerCount : playersLabel}</Text>\n              </View>\n              <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isPoolModeEnabled ? 'Max pot' : 'Winner Takes'}</Text>\n                <View style={styles.winnerCol}>\n                  <Text style={[styles.summaryValue, { color: t.success }]}>\n                    {finalAmount ? `${(finalAmount * playerCount * (1 - fee / 100)).toFixed(4)} SOL` : '—'}\n                  </Text>\n                  {finalAmount ? (\n                    <Text style={[styles.feeNote, { color: t.textDim }]}>{fee}% platform fee</Text>\n                  ) : null}\n                </View>\n              </View>\n            </View>\n\n            {/* Error Display */}\n            {mutation.error && (\n              <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n                <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n              </View>\n            )}\n\n            {/* CTA Button */}\n            <TouchableOpacity\n              style={[\n                styles.ctaButton,\n                { backgroundColor: canCreate ? t.accent : t.border },\n              ]}\n              disabled={!canCreate}\n              onPress={handleCreate}\n              activeOpacity={0.8}\n            >\n              {isMutating ? (\n                <View style={styles.ctaLoading}>\n                  <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                  <Text style={styles.ctaText}>{statusLabel}</Text>\n                </View>\n              ) : mutation.status === 'success' ? (\n                <Text style={styles.ctaText}>{isPoolModeEnabled ? 'Pool Created!' : STATUS_LABELS.success}</Text>\n              ) : (\n                <Text style={[styles.ctaText, !canCreate && { opacity: 0.5 }]}>\n                  {isPoolModeEnabled\n                    ? `Create Pool \\u2014 ${finalAmount} SOL`\n                    : effectiveAmount ? `Create Game \\u2014 ${effectiveAmount} SOL` : 'Select buy-in amount'}\n                </Text>\n              )}\n            </TouchableOpacity>\n          </View>\n        </View>\n      </KeyboardAvoidingView>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n  },\n  overlayTap: {\n    flex: 1,\n  },\n  keyboardView: {\n    flex: 1,\n    justifyContent: 'flex-end',\n  },\n  sheetPositioner: {\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    paddingHorizontal: 20,\n    paddingBottom: 40,\n  },\n  handleRow: {\n    alignItems: 'center',\n    paddingTop: 10,\n    paddingBottom: 8,\n  },\n  handle: {\n    width: 36,\n    height: 4,\n    borderRadius: 2,\n    opacity: 0.4,\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingVertical: 12,\n  },\n  headerTitle: {\n    fontSize: 20,\n    fontWeight: '700',\n  },\n  closeButton: {\n    fontSize: 20,\n    padding: 4,\n  },\n  section: {\n    gap: 12,\n    paddingTop: 8,\n  },\n  sectionLabel: {\n    fontSize: 15,\n    fontWeight: '600',\n  },\n  chipsRow: {\n    flexDirection: 'row',\n    flexWrap: 'wrap',\n    gap: 10,\n  },\n  chip: {\n    paddingHorizontal: 18,\n    paddingVertical: 10,\n    borderRadius: 14,\n    borderWidth: 1.5,\n  },\n  chipText: {\n    fontSize: 15,\n    fontWeight: '600',\n  },\n  input: {\n    height: 56,\n    borderRadius: 16,\n    borderWidth: 1.5,\n    paddingHorizontal: 16,\n    fontSize: 16,\n  },\n  summaryCard: {\n    marginTop: 20,\n    borderRadius: 16,\n    borderWidth: 1,\n    overflow: 'hidden',\n  },\n  summaryRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingHorizontal: 16,\n    paddingVertical: 14,\n  },\n  summaryLabel: {\n    fontSize: 14,\n  },\n  summaryValue: {\n    fontSize: 15,\n    fontWeight: '700',\n  },\n  summarySep: {\n    height: 1,\n    marginHorizontal: 16,\n  },\n  winnerCol: {\n    alignItems: 'flex-end',\n    gap: 2,\n  },\n  feeNote: {\n    fontSize: 11,\n  },\n  errorBox: {\n    marginTop: 16,\n    borderRadius: 12,\n    borderWidth: 1,\n    padding: 12,\n  },\n  errorText: {\n    fontSize: 13,\n    fontWeight: '500',\n  },\n  ctaButton: {\n    marginTop: 20,\n    height: 56,\n    borderRadius: 14,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  ctaText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '700',\n  },\n  ctaLoading: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 10,\n  },\n});\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport {\n  View,\n  Text,\n  Image,\n  TouchableOpacity,\n  ActivityIndicator,\n  Modal,\n  Animated,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useJoinGame } from '../../hooks/useJoinGame';\nimport type { JoinGameMutationResult } from '../../hooks/useJoinGame';\nimport { useCredits } from '../../hooks/useCredits';\nimport type { GameDetail } from '../../types';\nimport { SolSlider } from './SolSlider';\nimport { TeamButton } from './TeamButton';\n\nexport interface JoinGameSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  game: GameDetail;\n  /** Optional Image component (expo-image, etc.) for team logos */\n  ImageComponent?: React.ComponentType<any>;\n  /** Custom short-name function for team labels */\n  shortName?: (name: string | null) => string;\n  /** Override team colors (default blue/red/green) */\n  homeColor?: string;\n  awayColor?: string;\n  drawColor?: string;\n  /** Callbacks */\n  onSuccess?: (result: JoinGameMutationResult) => void;\n  onError?: (error: Error) => void;\n  /** Called when the user taps a team card (useful for sound/haptics) */\n  onTeamSelect?: (team: 'home' | 'away') => void;\n  /** Called when the join succeeds (useful for success sound/animation) */\n  onJoinSuccess?: (result: JoinGameMutationResult) => void;\n  /** Called on each slider tick (useful for haptics/sound) */\n  onSliderTick?: (value: number) => void;\n  /** Max wager in SOL (default 5) */\n  maxWager?: number;\n  /** Pool mode: hides team selection, auto-assigns team, shows \"Join Pool\" labels */\n  isPoolModeEnabled?: boolean;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n  building: 'Building transaction...',\n  signing: 'Approve in wallet...',\n  confirming: 'Confirming...',\n  success: 'Joined!',\n};\n\nconst CUSTOM_GAME_MODE = 6;\n\nfunction formatSol(n: number): string {\n  // Remove trailing zeros: 0.06000000 → 0.06, 1.00000 → 1\n  return parseFloat(n.toFixed(9)).toString();\n}\n\nfunction toPng(url: string | null | undefined): string | null {\n  if (!url) return null;\n  return url.replace('/svg?', '/png?');\n}\n\nexport function JoinGameSheet({\n  visible,\n  onDismiss,\n  game,\n  ImageComponent,\n  shortName,\n  homeColor = '#3B82F6',\n  awayColor = '#EF4444',\n  drawColor = '#F59E0B',\n  onSuccess,\n  onError,\n  onTeamSelect,\n  onJoinSuccess,\n  onSliderTick,\n  maxWager = 5,\n  isPoolModeEnabled = false,\n}: JoinGameSheetProps) {\n  const t = useDubsTheme();\n  const { wallet } = useDubs();\n  const mutation = useJoinGame();\n  const { credits, refetch: refetchCredits } = useCredits();\n\n  const isCustomGame = game.gameMode === CUSTOM_GAME_MODE;\n\n  const [selectedTeam, setSelectedTeam] = useState<'home' | 'away' | 'draw' | null>(null);\n  const [wager, setWager] = useState(game.buyIn);\n  const [showSuccess, setShowSuccess] = useState(false);\n  // \"Use my streak credit\" toggle. Only meaningful when the user has at\n  // least one active credit AND the credit's amount covers buy-in. The\n  // sponsored on-chain instruction transfers exactly the credit amount,\n  // so when this is on we lock wager to the credit value.\n  //\n  // Compare in lamports to dodge float drift between credit.amountSOL\n  // (server-rounded to 5dp) and game.buyIn — a 0.01 SOL credit must\n  // visibly cover a 0.01 SOL buy-in, which `>=` on raw floats can miss.\n  const [useCredit, setUseCredit] = useState(false);\n  const oldestCredit = credits.length > 0 ? credits[0] : null;\n  const canUseCredit = !!oldestCredit\n    && Math.round(oldestCredit.amountSOL * 1e9) >= Math.round(game.buyIn * 1e9);\n\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n  const successScale = useRef(new Animated.Value(0)).current;\n  const successOpacity = useRef(new Animated.Value(0)).current;\n\n  // Animate overlay on visibility change\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible, overlayOpacity]);\n\n  // Reset state when sheet opens\n  useEffect(() => {\n    if (visible) {\n      setSelectedTeam(isPoolModeEnabled ? 'home' : isCustomGame ? 'away' : null);\n      setWager(game.buyIn);\n      setShowSuccess(false);\n      successScale.setValue(0);\n      successOpacity.setValue(0);\n      mutation.reset();\n    }\n  }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Handle success with animation\n  useEffect(() => {\n    if (mutation.status === 'success' && mutation.data) {\n      setShowSuccess(true);\n      onSuccess?.(mutation.data);\n      onJoinSuccess?.(mutation.data);\n\n      // Animate success\n      Animated.parallel([\n        Animated.spring(successScale, { toValue: 1, friction: 4, tension: 80, useNativeDriver: true }),\n        Animated.timing(successOpacity, { toValue: 1, duration: 300, useNativeDriver: true }),\n      ]).start();\n\n      const timer = setTimeout(() => {\n        Animated.timing(successOpacity, { toValue: 0, duration: 300, useNativeDriver: true }).start(() => {\n          onDismiss();\n        });\n      }, 2500);\n      return () => clearTimeout(timer);\n    }\n  }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Report errors\n  useEffect(() => {\n    if (mutation.status === 'error' && mutation.error) {\n      onError?.(mutation.error);\n    }\n  }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // --- Derived values ---\n\n  const opponents = game.opponents || [];\n  const bettors = game.bettors || [];\n  const totalPool = game.totalPool || 0;\n  const homePool = game.homePool || 0;\n  const awayPool = game.awayPool || 0;\n  const drawPool = game.drawPool || 0;\n  const buyIn = game.buyIn;\n\n  // Show draw option if any bettor is on draw, or if the league supports it\n  const drawBettors = bettors.filter(b => b.team === 'draw');\n  const hasDrawOption = drawPool > 0 || drawBettors.length > 0 ||\n    (game.league && ['English Premier League', 'EPL', 'MLS', 'La Liga', 'Serie A', 'Bundesliga', 'Ligue 1'].some(l => (game.league || '').includes(l)));\n\n  const poolAfterJoin = totalPool + wager;\n\n  const { homeOdds, awayOdds, drawOdds, homeBets, awayBets, drawBets } = useMemo(() => {\n    const homeBetsCount = bettors.filter(b => b.team === 'home').length;\n    const awayBetsCount = bettors.filter(b => b.team === 'away').length;\n    const drawBetsCount = bettors.filter(b => b.team === 'draw').length;\n    // Show comparable odds for every side by computing each as \"if I bet\n    // `wager` on this team\". Total pool grows by `wager` regardless of\n    // which side you pick, so newPool is constant; only the side pool\n    // shifts. Previously this only added `wager` to the *selected* side,\n    // which left an unbetted side with sidePool === 0 → odds shown as\n    // \"—\". Empty sides now show their (high) implied multiplier so the\n    // user can actually compare risk/return before committing.\n    const newPool = totalPool + wager;\n    const homeWith = homePool + wager;\n    const awayWith = awayPool + wager;\n    const drawWith = drawPool + wager;\n    return {\n      homeOdds: homeWith > 0 ? (newPool / homeWith).toFixed(2) : '—',\n      awayOdds: awayWith > 0 ? (newPool / awayWith).toFixed(2) : '—',\n      drawOdds: drawWith > 0 ? (newPool / drawWith).toFixed(2) : '—',\n      homeBets: homeBetsCount,\n      awayBets: awayBetsCount,\n      drawBets: drawBetsCount,\n    };\n  }, [totalPool, homePool, awayPool, drawPool, bettors, wager]);\n\n  const selectedOdds = selectedTeam === 'home' ? homeOdds : selectedTeam === 'away' ? awayOdds : selectedTeam === 'draw' ? drawOdds : '—';\n  const potentialWinnings = selectedOdds !== '—' ? formatSol(parseFloat(selectedOdds) * wager) : '—';\n\n  const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n  const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n\n  const myBet = useMemo(() => {\n    if (!wallet.publicKey) return null;\n    const addr = wallet.publicKey.toBase58();\n    return bettors.find(b => b.wallet === addr) ?? null;\n  }, [bettors, wallet.publicKey]);\n\n  const alreadyJoined = myBet !== null;\n\n  const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n  const canJoin = selectedTeam !== null && !isMutating && mutation.status !== 'success' && !alreadyJoined;\n\n  const handleJoin = useCallback(async () => {\n    if (!selectedTeam || !wallet.publicKey) return;\n\n    try {\n      await mutation.execute({\n        playerWallet: wallet.publicKey.toBase58(),\n        gameId: game.gameId,\n        teamChoice: selectedTeam,\n        // When useCredit is on, the on-chain instruction transfers\n        // exactly the credit's amount; pass that as the wager.\n        amount: useCredit && oldestCredit ? oldestCredit.amountSOL : wager,\n        useCredit: useCredit && canUseCredit ? true : undefined,\n      });\n      // The credit was just spent — refresh the list so the toggle\n      // disappears (or rolls to the next FIFO credit).\n      if (useCredit) refetchCredits();\n    } catch {\n      // Error is already captured in mutation state\n    }\n  }, [selectedTeam, wallet.publicKey, mutation.execute, game.gameId, wager, useCredit, oldestCredit, canUseCredit, refetchCredits]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n  return (\n    <Modal\n      visible={visible}\n      animationType=\"slide\"\n      transparent\n      onRequestClose={onDismiss}\n    >\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      {/* Success overlay */}\n      {showSuccess && (\n        <View style={styles.successOverlay}>\n          <Animated.View style={[styles.successContent, { opacity: successOpacity, transform: [{ scale: successScale }] }]}>\n            <Text style={styles.successEmoji}>🎉</Text>\n            <Text style={styles.successTitle}>You're in!</Text>\n            <Text style={styles.successSub}>\n              {formatSol(wager)} SOL on {selectedTeam === 'home' ? homeName : awayName}\n            </Text>\n          </Animated.View>\n        </View>\n      )}\n\n      <KeyboardAvoidingView\n        style={styles.keyboardView}\n        behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n      >\n        <View style={styles.sheetPositioner}>\n          <View style={[styles.sheet, { backgroundColor: t.background }]}>\n            {/* Drag handle */}\n            <View style={styles.handleRow}>\n              <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n            </View>\n\n            {/* Header */}\n            <View style={styles.header}>\n              <Text style={[styles.headerTitle, { color: t.text }]}>{isPoolModeEnabled ? 'Join Pool' : 'Join Game'}</Text>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n                <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            {/* Bettors row */}\n            {bettors.length > 0 && (\n              <View style={styles.bettorsSection}>\n                <Text style={[styles.bettorsLabel, { color: t.textMuted }]}>\n                  {bettors.length} {bettors.length === 1 ? 'player' : 'players'} in this game\n                </Text>\n                <View style={styles.bettorsRow}>\n                  {bettors.slice(0, 6).map((b, i) => {\n                    const pngUrl = toPng(b.avatar);\n                    return (\n                      <View key={b.wallet} style={[styles.bettorCircle, { backgroundColor: ['#EF4444','#3B82F6','#22C55E','#F59E0B','#A855F7','#EC4899'][i % 6] }]}>\n                        {pngUrl ? (\n                          <Image source={{ uri: pngUrl }} style={styles.bettorImg} />\n                        ) : (\n                          <Text style={styles.bettorInitial}>{(b.username ?? b.wallet).charAt(0).toUpperCase()}</Text>\n                        )}\n                      </View>\n                    );\n                  })}\n                  {bettors.length > 6 && (\n                    <View style={[styles.bettorCircle, { backgroundColor: '#2C2C2E' }]}>\n                      <Text style={styles.bettorOverflow}>+{bettors.length - 6}</Text>\n                    </View>\n                  )}\n                </View>\n              </View>\n            )}\n\n            {/* Team Selection — hidden in pool mode and custom games */}\n            {!isCustomGame && !isPoolModeEnabled && !alreadyJoined && (\n              hasDrawOption ? (\n                /* ── 3-way layout: Home / VS / Away / OR / Draw ── */\n                <View style={styles.section}>\n                  <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Who will win?</Text>\n\n                  <PickRow\n                    name={homeName}\n                    subtitle=\"Home Team\"\n                    imageUrl={opponents[0]?.imageUrl}\n                    odds={homeOdds}\n                    bets={homeBets}\n                    color={homeColor}\n                    selected={selectedTeam === 'home'}\n                    onPress={() => { setSelectedTeam('home'); onTeamSelect?.('home'); }}\n                    ImageComponent={ImageComponent}\n                    t={t}\n                  />\n\n                  <View style={styles.dividerRow}>\n                    <View style={[styles.dividerLine, { backgroundColor: t.border }]} />\n                    <Text style={[styles.dividerText, { color: t.textMuted }]}>VS</Text>\n                    <View style={[styles.dividerLine, { backgroundColor: t.border }]} />\n                  </View>\n\n                  <PickRow\n                    name={awayName}\n                    subtitle=\"Away Team\"\n                    imageUrl={opponents[1]?.imageUrl}\n                    odds={awayOdds}\n                    bets={awayBets}\n                    color={awayColor}\n                    selected={selectedTeam === 'away'}\n                    onPress={() => { setSelectedTeam('away'); onTeamSelect?.('away'); }}\n                    ImageComponent={ImageComponent}\n                    t={t}\n                  />\n\n                  <View style={styles.dividerRow}>\n                    <View style={[styles.dividerLine, { backgroundColor: t.border }]} />\n                    <Text style={[styles.dividerText, { color: t.textMuted }]}>OR</Text>\n                    <View style={[styles.dividerLine, { backgroundColor: t.border }]} />\n                  </View>\n\n                  <PickRow\n                    name=\"Draw\"\n                    subtitle=\"Match ends in a tie\"\n                    odds={drawOdds}\n                    bets={drawBets}\n                    color={drawColor}\n                    selected={selectedTeam === 'draw'}\n                    onPress={() => { setSelectedTeam('draw' as any); onTeamSelect?.('draw' as any); }}\n                    t={t}\n                  />\n                </View>\n              ) : (\n                /* ── 2-way layout: side by side ── */\n                <View style={styles.section}>\n                  <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Pick Your Side</Text>\n                  <View style={styles.teamsRow}>\n                    <TeamButton\n                      name={homeName}\n                      imageUrl={opponents[0]?.imageUrl}\n                      odds={homeOdds}\n                      bets={homeBets}\n                      color={homeColor}\n                      selected={selectedTeam === 'home'}\n                      onPress={() => { setSelectedTeam('home'); onTeamSelect?.('home'); }}\n                      ImageComponent={ImageComponent}\n                      t={t}\n                    />\n                    <TeamButton\n                      name={awayName}\n                      imageUrl={opponents[1]?.imageUrl}\n                      odds={awayOdds}\n                      bets={awayBets}\n                      color={awayColor}\n                      selected={selectedTeam === 'away'}\n                      onPress={() => { setSelectedTeam('away'); onTeamSelect?.('away'); }}\n                      ImageComponent={ImageComponent}\n                      t={t}\n                    />\n                  </View>\n                </View>\n              )\n            )}\n\n            {/* Already joined — show which side */}\n            {alreadyJoined && myBet && (\n              <View style={[styles.myBetCard, { backgroundColor: (myBet.team === 'home' ? homeColor : myBet.team === 'away' ? awayColor : drawColor) + '15', borderColor: myBet.team === 'home' ? homeColor : myBet.team === 'away' ? awayColor : drawColor }]}>\n                <Text style={[styles.myBetLabel, { color: myBet.team === 'home' ? homeColor : myBet.team === 'away' ? awayColor : drawColor }]}>YOUR BET</Text>\n                <Text style={[styles.myBetTeam, { color: t.text }]}>\n                  {myBet.team === 'home' ? homeName : myBet.team === 'away' ? awayName : 'Draw'}\n                </Text>\n                <Text style={[styles.myBetAmount, { color: t.textMuted }]}>\n                  {formatSol(myBet.amount)} SOL\n                </Text>\n              </View>\n            )}\n\n            {/* Summary Card */}\n            <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Your wager</Text>\n                <Text style={[styles.summaryValue, { color: t.text }]}>{formatSol(wager)} SOL</Text>\n              </View>\n              <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n              {isPoolModeEnabled ? (\n                <>\n                  <View style={styles.summaryRow}>\n                    <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Players in</Text>\n                    <Text style={[styles.summaryValue, { color: t.text }]}>{bettors.length}</Text>\n                  </View>\n                  <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n                  <View style={styles.summaryRow}>\n                    <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Current pot</Text>\n                    <Text style={[styles.summaryValue, { color: t.success }]}>{formatSol(totalPool)} SOL</Text>\n                  </View>\n                </>\n              ) : (\n                <>\n                  <View style={styles.summaryRow}>\n                    <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Total pool</Text>\n                    <Text style={[styles.summaryValue, { color: t.text }]}>{formatSol(poolAfterJoin)} SOL</Text>\n                  </View>\n                  <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n                  <View style={styles.summaryRow}>\n                    <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Potential winnings</Text>\n                    <Text style={[styles.summaryValue, { color: t.success }]}>\n                      {potentialWinnings !== '—' ? `${potentialWinnings} SOL` : '—'}\n                    </Text>\n                  </View>\n                </>\n              )}\n            </View>\n\n            {/* Credit toggle — only when user has a credit ≥ buy-in */}\n            {selectedTeam && !alreadyJoined && canUseCredit && oldestCredit && (\n              <TouchableOpacity\n                style={[styles.creditRow, { backgroundColor: useCredit ? '#22C55E18' : t.surface, borderColor: useCredit ? '#22C55E' : t.border }]}\n                activeOpacity={0.8}\n                onPress={() => setUseCredit(v => !v)}\n              >\n                <View style={styles.creditRowText}>\n                  <Text style={[styles.creditTitle, { color: useCredit ? '#22C55E' : t.text }]}>\n                    🎁 Use my {formatSol(oldestCredit.amountSOL)} SOL credit\n                  </Text>\n                  <Text style={[styles.creditSub, { color: t.textMuted }]}>\n                    {useCredit\n                      ? 'Treasury covers this bet — wager locked to credit amount'\n                      : `${credits.length} credit${credits.length === 1 ? '' : 's'} available from your streak`}\n                  </Text>\n                </View>\n                <View style={[styles.creditCheckbox, useCredit && { backgroundColor: '#22C55E', borderColor: '#22C55E' }]}>\n                  {useCredit && <Text style={styles.creditCheck}>✓</Text>}\n                </View>\n              </TouchableOpacity>\n            )}\n\n            {/* SOL Slider — hidden when sponsoring with a credit */}\n            {selectedTeam && !isPoolModeEnabled && !alreadyJoined && !useCredit && (\n              <SolSlider\n                value={wager}\n                min={game.buyIn}\n                max={maxWager}\n                step={0.01}\n                accentColor={selectedTeam === 'home' ? homeColor : awayColor}\n                onValueChange={setWager}\n                onTick={onSliderTick}\n              />\n            )}\n\n            {/* Already Joined Notice */}\n            {alreadyJoined && (\n              <View style={[styles.errorBox, { backgroundColor: t.surface, borderColor: t.border }]}>\n                <Text style={[styles.errorText, { color: t.textMuted }]}>{isPoolModeEnabled ? \"You've already joined this pool.\" : \"You've already joined this game.\"}</Text>\n              </View>\n            )}\n\n            {/* Error Display */}\n            {mutation.error && (\n              <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n                <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n              </View>\n            )}\n\n            {/* CTA Button */}\n            <TouchableOpacity\n              style={[\n                styles.ctaButton,\n                { backgroundColor: canJoin ? t.accent : t.border },\n              ]}\n              disabled={!canJoin}\n              onPress={handleJoin}\n              activeOpacity={0.8}\n            >\n              {isMutating ? (\n                <View style={styles.ctaLoading}>\n                  <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                  <Text style={styles.ctaText}>{statusLabel}</Text>\n                </View>\n              ) : mutation.status === 'success' ? (\n                <Text style={styles.ctaText}>{isPoolModeEnabled ? 'Joined!' : STATUS_LABELS.success}</Text>\n              ) : (\n                <Text style={[styles.ctaText, !canJoin && { opacity: 0.5 }]}>\n                  {alreadyJoined\n                    ? 'Already Joined'\n                    : isPoolModeEnabled\n                      ? `Join Pool \\u2014 ${formatSol(wager)} SOL`\n                      : selectedTeam\n                        ? `Join Game \\u2014 ${formatSol(wager)} SOL`\n                        : 'Pick a side to join'}\n                </Text>\n              )}\n            </TouchableOpacity>\n          </View>\n        </View>\n      </KeyboardAvoidingView>\n    </Modal>\n  );\n}\n\n\n// ── PickRow (vertical 3-way layout for draw-supported leagues) ──\n\nfunction PickRow({\n  name, subtitle, imageUrl, odds, bets, color, selected, onPress, ImageComponent, t,\n}: {\n  name: string; subtitle?: string; imageUrl?: string | null; odds: string; bets: number;\n  color: string; selected: boolean; onPress: () => void;\n  ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n  const [imgFailed, setImgFailed] = useState(false);\n  const Img = ImageComponent || require('react-native').Image;\n  const showImage = imageUrl && !imgFailed;\n\n  return (\n    <TouchableOpacity\n      style={[pickStyles.row, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + '12' : t.background }]}\n      onPress={onPress}\n      activeOpacity={0.7}\n    >\n      {showImage ? (\n        <Img source={{ uri: imageUrl }} style={pickStyles.logo} resizeMode=\"contain\" onError={() => setImgFailed(true)} />\n      ) : (\n        <View style={[pickStyles.logoPlaceholder, { backgroundColor: color + '20' }]}>\n          <Text style={[pickStyles.logoEmoji, { color }]}>{name === 'Draw' ? '🤝' : name.charAt(0)}</Text>\n        </View>\n      )}\n      <View style={pickStyles.info}>\n        <Text style={[pickStyles.name, { color: t.text }]}>{name}</Text>\n        {subtitle && <Text style={[pickStyles.subtitle, { color: t.textMuted }]}>{subtitle}</Text>}\n      </View>\n      {odds !== '—' && <Text style={[pickStyles.odds, { color }]}>{odds}x</Text>}\n      {bets > 0 && <Text style={[pickStyles.bets, { color: t.textMuted }]}>{bets}</Text>}\n      {selected && (\n        <View style={[pickStyles.check, { backgroundColor: color }]}>\n          <Text style={pickStyles.checkText}>✓</Text>\n        </View>\n      )}\n    </TouchableOpacity>\n  );\n}\n\nconst pickStyles = StyleSheet.create({\n  row: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    borderWidth: 1.5,\n    borderRadius: 14,\n    paddingVertical: 12,\n    paddingHorizontal: 14,\n    gap: 12,\n  },\n  logo: {\n    width: 36,\n    height: 36,\n    borderRadius: 18,\n  },\n  logoPlaceholder: {\n    width: 36,\n    height: 36,\n    borderRadius: 18,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  logoEmoji: {\n    fontSize: 16,\n    fontWeight: '800',\n  },\n  info: {\n    flex: 1,\n  },\n  name: {\n    fontSize: 15,\n    fontWeight: '700',\n  },\n  subtitle: {\n    fontSize: 12,\n    marginTop: 1,\n  },\n  odds: {\n    fontSize: 16,\n    fontWeight: '800',\n  },\n  bets: {\n    fontSize: 12,\n  },\n  check: {\n    width: 22,\n    height: 22,\n    borderRadius: 11,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  checkText: {\n    color: '#FFF',\n    fontSize: 13,\n    fontWeight: '800',\n  },\n});\n\nconst styles = StyleSheet.create({\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n  },\n  overlayTap: {\n    flex: 1,\n  },\n  keyboardView: {\n    flex: 1,\n    justifyContent: 'flex-end',\n  },\n  sheetPositioner: {\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    paddingHorizontal: 20,\n    paddingBottom: 40,\n  },\n  handleRow: {\n    alignItems: 'center',\n    paddingTop: 10,\n    paddingBottom: 8,\n  },\n  handle: {\n    width: 36,\n    height: 4,\n    borderRadius: 2,\n    opacity: 0.4,\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingVertical: 12,\n  },\n  headerTitle: {\n    fontSize: 20,\n    fontWeight: '700',\n  },\n  closeButton: {\n    fontSize: 20,\n    padding: 4,\n  },\n\n  // Bettors row\n  bettorsSection: {\n    paddingBottom: 12,\n    gap: 8,\n  },\n  bettorsLabel: {\n    fontSize: 12,\n    fontWeight: '600',\n  },\n  bettorsRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 4,\n  },\n  bettorCircle: {\n    width: 28,\n    height: 28,\n    borderRadius: 14,\n    alignItems: 'center',\n    justifyContent: 'center',\n    overflow: 'hidden',\n  },\n  bettorImg: {\n    width: 28,\n    height: 28,\n    borderRadius: 14,\n  },\n  bettorInitial: {\n    color: '#FFF',\n    fontSize: 11,\n    fontWeight: '800',\n  },\n  bettorOverflow: {\n    color: '#8E8E93',\n    fontSize: 10,\n    fontWeight: '700',\n  },\n\n  // Success overlay\n  successOverlay: {\n    ...StyleSheet.absoluteFillObject,\n    zIndex: 100,\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: 'rgba(0,0,0,0.85)',\n  },\n  successContent: {\n    alignItems: 'center',\n    gap: 12,\n  },\n  successEmoji: {\n    fontSize: 64,\n  },\n  successTitle: {\n    color: '#FFFFFF',\n    fontSize: 28,\n    fontWeight: '900',\n  },\n  successSub: {\n    color: '#8E8E93',\n    fontSize: 16,\n  },\n\n  section: {\n    gap: 12,\n    paddingTop: 8,\n  },\n  sectionLabel: {\n    fontSize: 15,\n    fontWeight: '600',\n  },\n  teamsRow: {\n    flexDirection: 'row',\n    gap: 12,\n  },\n  drawRow: {\n    marginTop: 8,\n  },\n  dividerRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 12,\n    marginVertical: 6,\n  },\n  dividerLine: {\n    flex: 1,\n    height: 1,\n  },\n  dividerText: {\n    fontSize: 12,\n    fontWeight: '700',\n  },\n  summaryCard: {\n    marginTop: 20,\n    borderRadius: 16,\n    borderWidth: 1,\n    overflow: 'hidden',\n  },\n  summaryRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingHorizontal: 16,\n    paddingVertical: 14,\n  },\n  summaryLabel: {\n    fontSize: 14,\n  },\n  summaryValue: {\n    fontSize: 15,\n    fontWeight: '700',\n  },\n  summarySep: {\n    height: 1,\n    marginHorizontal: 16,\n  },\n  myBetCard: {\n    marginTop: 16,\n    borderRadius: 14,\n    borderWidth: 1.5,\n    padding: 16,\n    alignItems: 'center',\n    gap: 4,\n  },\n  myBetLabel: {\n    fontSize: 10,\n    fontWeight: '900',\n    letterSpacing: 1.5,\n  },\n  myBetTeam: {\n    fontSize: 18,\n    fontWeight: '700',\n  },\n  myBetAmount: {\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  errorBox: {\n    marginTop: 16,\n    borderRadius: 12,\n    borderWidth: 1,\n    padding: 12,\n  },\n  errorText: {\n    fontSize: 13,\n    fontWeight: '500',\n  },\n  ctaButton: {\n    marginTop: 20,\n    height: 56,\n    borderRadius: 14,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  ctaText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '700',\n  },\n  ctaLoading: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 10,\n  },\n  creditRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 12,\n    marginTop: 12,\n    padding: 12,\n    borderRadius: 12,\n    borderWidth: 1.5,\n  },\n  creditRowText: {\n    flex: 1,\n    gap: 2,\n  },\n  creditTitle: {\n    fontSize: 14,\n    fontWeight: '700',\n  },\n  creditSub: {\n    fontSize: 12,\n    fontWeight: '500',\n  },\n  creditCheckbox: {\n    width: 22,\n    height: 22,\n    borderRadius: 11,\n    borderWidth: 2,\n    borderColor: '#3A3A3C',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  creditCheck: {\n    color: '#FFFFFF',\n    fontSize: 14,\n    fontWeight: '900',\n  },\n});\n","import React, { useRef, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  PanResponder,\n  Dimensions,\n  Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\n\nconst THUMB_SIZE = 32;\nconst TRACK_HEIGHT = 6;\nconst TICK_INTERVAL = 0.01; // haptic every 0.01 SOL\n\nexport interface SolSliderProps {\n  /** Current value in SOL */\n  value: number;\n  /** Min SOL (default 0.01) */\n  min?: number;\n  /** Max SOL (default 5) */\n  max?: number;\n  /** Step size in SOL (default 0.01) */\n  step?: number;\n  /** Accent color for filled track + thumb glow */\n  accentColor?: string;\n  /** Called on every drag frame */\n  onValueChange: (value: number) => void;\n  /** Called when user lifts finger */\n  onSlidingComplete?: (value: number) => void;\n  /** Called on each tick for haptics/sound */\n  onTick?: (value: number) => void;\n  /** Disabled state */\n  disabled?: boolean;\n}\n\nexport function SolSlider({\n  value,\n  min = 0.01,\n  max = 5,\n  step = 0.01,\n  accentColor,\n  onValueChange,\n  onSlidingComplete,\n  onTick,\n  disabled = false,\n}: SolSliderProps) {\n  const t = useDubsTheme();\n  const accent = accentColor || t.accent;\n  const trackRef = useRef<View>(null);\n  const trackWidth = useRef(0);\n  const lastTickValue = useRef(value);\n\n  const clamp = (v: number) => {\n    const stepped = Math.round(v / step) * step;\n    return Math.max(min, Math.min(max, parseFloat(stepped.toFixed(4))));\n  };\n\n  const valueToPosition = (v: number) => {\n    const ratio = (v - min) / (max - min);\n    return ratio * trackWidth.current;\n  };\n\n  const positionToValue = (x: number) => {\n    const ratio = Math.max(0, Math.min(1, x / trackWidth.current));\n    return clamp(min + ratio * (max - min));\n  };\n\n  const panResponder = useRef(\n    PanResponder.create({\n      onStartShouldSetPanResponder: () => !disabled,\n      onMoveShouldSetPanResponder: () => !disabled,\n      onPanResponderGrant: (_, gestureState) => {\n        lastTickValue.current = value;\n      },\n      onPanResponderMove: (evt, gestureState) => {\n        // Calculate position relative to track\n        const touchX = gestureState.moveX;\n        trackRef.current?.measureInWindow((trackX) => {\n          const relX = touchX - trackX;\n          const newVal = positionToValue(relX);\n\n          // Fire tick if we crossed a tick boundary\n          const tickDelta = Math.abs(newVal - lastTickValue.current);\n          if (tickDelta >= TICK_INTERVAL) {\n            lastTickValue.current = newVal;\n            onTick?.(newVal);\n          }\n\n          onValueChange(newVal);\n        });\n      },\n      onPanResponderRelease: () => {\n        onSlidingComplete?.(value);\n      },\n    })\n  ).current;\n\n  const ratio = (value - min) / (max - min);\n  const filledWidth = `${ratio * 100}%`;\n\n  // Snap points for visual markers\n  const markers = [min, max * 0.25, max * 0.5, max * 0.75, max];\n\n  return (\n    <View style={styles.container}>\n      {/* Track */}\n      <View\n        ref={trackRef}\n        style={styles.trackContainer}\n        onLayout={(e) => { trackWidth.current = e.nativeEvent.layout.width; }}\n        {...panResponder.panHandlers}\n      >\n        {/* Background track */}\n        <View style={[styles.track, { backgroundColor: '#2C2C2E' }]}>\n          {/* Filled track */}\n          <View style={[styles.trackFilled, { width: filledWidth as any, backgroundColor: accent }]} />\n        </View>\n\n        {/* Tick markers */}\n        <View style={styles.markerRow}>\n          {markers.map((m, i) => {\n            const mRatio = (m - min) / (max - min);\n            return (\n              <View\n                key={i}\n                style={[\n                  styles.marker,\n                  {\n                    left: `${mRatio * 100}%`,\n                    backgroundColor: value >= m ? accent : '#3A3A3C',\n                  },\n                ]}\n              />\n            );\n          })}\n        </View>\n\n        {/* Thumb */}\n        <View\n          style={[\n            styles.thumb,\n            {\n              left: filledWidth as any,\n              backgroundColor: accent,\n              shadowColor: accent,\n            },\n          ]}\n        >\n          <View style={styles.thumbInner} />\n        </View>\n      </View>\n\n      {/* Min/Max labels */}\n      <View style={styles.rangeRow}>\n        <Text style={styles.rangeText}>{min}</Text>\n        <Text style={styles.rangeText}>{max} SOL</Text>\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    paddingVertical: 4,\n  },\n  trackContainer: {\n    height: THUMB_SIZE + 16,\n    justifyContent: 'center',\n    paddingHorizontal: THUMB_SIZE / 2,\n  },\n  track: {\n    height: TRACK_HEIGHT,\n    borderRadius: TRACK_HEIGHT / 2,\n    overflow: 'hidden',\n  },\n  trackFilled: {\n    height: '100%',\n    borderRadius: TRACK_HEIGHT / 2,\n  },\n  markerRow: {\n    position: 'absolute',\n    left: THUMB_SIZE / 2,\n    right: THUMB_SIZE / 2,\n    height: TRACK_HEIGHT,\n    top: (THUMB_SIZE + 16 - TRACK_HEIGHT) / 2,\n  },\n  marker: {\n    position: 'absolute',\n    width: 3,\n    height: 12,\n    borderRadius: 1.5,\n    top: -3,\n    marginLeft: -1.5,\n  },\n  thumb: {\n    position: 'absolute',\n    width: THUMB_SIZE,\n    height: THUMB_SIZE,\n    borderRadius: THUMB_SIZE / 2,\n    top: 8,\n    marginLeft: 0,\n    alignItems: 'center',\n    justifyContent: 'center',\n    ...Platform.select({\n      ios: {\n        shadowOffset: { width: 0, height: 0 },\n        shadowOpacity: 0.6,\n        shadowRadius: 10,\n      },\n      android: {\n        elevation: 8,\n      },\n    }),\n  },\n  thumbInner: {\n    width: 12,\n    height: 12,\n    borderRadius: 6,\n    backgroundColor: '#FFFFFF',\n  },\n  rangeRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    paddingHorizontal: THUMB_SIZE / 2,\n    marginTop: 4,\n  },\n  rangeText: {\n    color: '#5A5A5E',\n    fontSize: 11,\n    fontWeight: '600',\n  },\n});\n","import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native';\n\nexport interface TeamButtonProps {\n  name: string;\n  imageUrl?: string | null;\n  odds: string;\n  bets: number;\n  color: string;\n  selected: boolean;\n  onPress: () => void;\n  ImageComponent?: React.ComponentType<any>;\n  t: any;\n}\n\nexport function TeamButton({\n  name, imageUrl, odds, bets, color, selected, onPress, ImageComponent, t,\n}: TeamButtonProps) {\n  const [imgFailed, setImgFailed] = useState(false);\n  const Img = ImageComponent || require('react-native').Image;\n  const showImage = imageUrl && !imgFailed;\n\n  return (\n    <TouchableOpacity\n      style={[styles.teamOption, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + '15' : t.background }]}\n      onPress={onPress}\n      activeOpacity={0.7}\n    >\n      {showImage ? (\n        <Img source={{ uri: imageUrl }} style={styles.teamLogo} resizeMode=\"contain\" onError={() => setImgFailed(true)} />\n      ) : (\n        <View style={[styles.teamLogo, styles.teamLogoPlaceholder]} />\n      )}\n      <Text style={[styles.teamName, { color: t.text }]} numberOfLines={1}>{name}</Text>\n      {odds !== '—' && <Text style={[styles.teamOdds, { color }]}>{odds}x</Text>}\n      {bets > 0 && <Text style={[styles.teamBets, { color: t.textMuted }]}>{bets} {bets === 1 ? 'bet' : 'bets'}</Text>}\n      {selected && (\n        <View style={[styles.teamBadge, { backgroundColor: color }]}>\n          <Text style={styles.teamBadgeText}>Selected</Text>\n        </View>\n      )}\n    </TouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  teamOption: {\n    flex: 1,\n    borderWidth: 2,\n    borderRadius: 16,\n    padding: 16,\n    alignItems: 'center',\n    gap: 8,\n  },\n  teamLogo: {\n    width: 48,\n    height: 48,\n    borderRadius: 24,\n  },\n  teamLogoPlaceholder: {\n    backgroundColor: 'rgba(128,128,128,0.2)',\n  },\n  teamName: {\n    fontSize: 15,\n    fontWeight: '700',\n  },\n  teamOdds: {\n    fontSize: 20,\n    fontWeight: '800',\n  },\n  teamBets: {\n    fontSize: 12,\n  },\n  teamBadge: {\n    borderRadius: 8,\n    paddingHorizontal: 12,\n    paddingVertical: 4,\n    marginTop: 4,\n  },\n  teamBadgeText: {\n    color: '#FFF',\n    fontSize: 12,\n    fontWeight: '700',\n  },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  ActivityIndicator,\n  Modal,\n  Animated,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useClaim } from '../../hooks/useClaim';\nimport type { ClaimMutationResult } from '../../hooks/useClaim';\n\nexport interface ClaimPrizeSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  gameId: string;\n  /** Prize amount in SOL */\n  prizeAmount: number;\n  /** When true, shows refund language instead of prize language */\n  isRefund?: boolean;\n  /** Callbacks */\n  onSuccess?: (result: ClaimMutationResult) => void;\n  onError?: (error: Error) => void;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n  building: 'Building transaction...',\n  signing: 'Approve in wallet...',\n  confirming: 'Confirming...',\n  success: 'Claimed!',\n};\n\nexport function ClaimPrizeSheet({\n  visible,\n  onDismiss,\n  gameId,\n  prizeAmount,\n  isRefund = false,\n  onSuccess,\n  onError,\n}: ClaimPrizeSheetProps) {\n  const t = useDubsTheme();\n  const { wallet } = useDubs();\n  const mutation = useClaim();\n\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n  const celebrationScale = useRef(new Animated.Value(0)).current;\n  const celebrationOpacity = useRef(new Animated.Value(0)).current;\n  const [showCelebration, setShowCelebration] = useState(false);\n\n  // Animate overlay on visibility change\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible, overlayOpacity]);\n\n  // Reset state when sheet opens\n  useEffect(() => {\n    if (visible) {\n      mutation.reset();\n      setShowCelebration(false);\n      celebrationScale.setValue(0);\n      celebrationOpacity.setValue(0);\n    }\n  }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Celebration animation + auto-dismiss on success\n  useEffect(() => {\n    if (mutation.status === 'success' && mutation.data) {\n      setShowCelebration(true);\n\n      Animated.parallel([\n        Animated.spring(celebrationScale, {\n          toValue: 1,\n          tension: 50,\n          friction: 6,\n          useNativeDriver: true,\n        }),\n        Animated.timing(celebrationOpacity, {\n          toValue: 1,\n          duration: 300,\n          useNativeDriver: true,\n        }),\n      ]).start();\n\n      onSuccess?.(mutation.data);\n\n      const timer = setTimeout(() => {\n        onDismiss();\n      }, 2500);\n      return () => clearTimeout(timer);\n    }\n  }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Report errors\n  useEffect(() => {\n    if (mutation.status === 'error' && mutation.error) {\n      onError?.(mutation.error);\n    }\n  }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n  const canClaim = !isMutating && mutation.status !== 'success' && !!wallet.publicKey;\n\n  const handleClaim = useCallback(async () => {\n    if (!wallet.publicKey) return;\n\n    try {\n      await mutation.execute({\n        playerWallet: wallet.publicKey.toBase58(),\n        gameId,\n        amountClaimed: prizeAmount,\n      });\n    } catch {\n      // Error is already captured in mutation state\n    }\n  }, [wallet.publicKey, mutation.execute, gameId, prizeAmount]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n  return (\n    <Modal\n      visible={visible}\n      animationType=\"slide\"\n      transparent\n      onRequestClose={onDismiss}\n    >\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      <KeyboardAvoidingView\n        style={styles.keyboardView}\n        behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n      >\n        <View style={styles.sheetPositioner}>\n          <View style={[styles.sheet, { backgroundColor: t.background }]}>\n            {/* Drag handle */}\n            <View style={styles.handleRow}>\n              <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n            </View>\n\n            {/* Header */}\n            <View style={styles.header}>\n              <Text style={[styles.headerTitle, { color: t.text }]}>\n                {showCelebration\n                  ? (isRefund ? 'Refund Claimed!' : 'Prize Claimed!')\n                  : (isRefund ? 'Claim Refund' : 'Claim Prize')}\n              </Text>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n                <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            {/* Celebration */}\n            {showCelebration && (\n              <Animated.View\n                style={[\n                  styles.celebrationContainer,\n                  {\n                    opacity: celebrationOpacity,\n                    transform: [{ scale: celebrationScale }],\n                  },\n                ]}\n              >\n                <Text style={styles.celebrationEmoji}>{'🏆'}</Text>\n                <Text style={[styles.celebrationText, { color: t.success }]}>\n                  +{prizeAmount} SOL\n                </Text>\n                <Text style={[styles.celebrationSubtext, { color: t.textMuted }]}>\n                  {isRefund ? 'Refund sent to your wallet' : 'Winnings sent to your wallet'}\n                </Text>\n              </Animated.View>\n            )}\n\n            {/* Summary Card */}\n            {!showCelebration && (\n              <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n                <View style={styles.summaryRow}>\n                  <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isRefund ? 'Refund' : 'Prize'}</Text>\n                  <Text style={[styles.summaryValue, { color: t.success }]}>\n                    {prizeAmount} SOL\n                  </Text>\n                </View>\n                <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n                <View style={styles.summaryRow}>\n                  <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Game</Text>\n                  <Text\n                    style={[styles.summaryValue, { color: t.text }]}\n                    numberOfLines={1}\n                  >\n                    {gameId.slice(0, 8)}...{gameId.slice(-4)}\n                  </Text>\n                </View>\n              </View>\n            )}\n\n            {/* Error Display */}\n            {mutation.error && (\n              <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n                <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n              </View>\n            )}\n\n            {/* CTA Button */}\n            {!showCelebration && (\n              <TouchableOpacity\n                style={[\n                  styles.ctaButton,\n                  { backgroundColor: canClaim ? t.accent : t.border },\n                ]}\n                disabled={!canClaim}\n                onPress={handleClaim}\n                activeOpacity={0.8}\n              >\n                {isMutating ? (\n                  <View style={styles.ctaLoading}>\n                    <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                    <Text style={styles.ctaText}>{statusLabel}</Text>\n                  </View>\n                ) : (\n                  <Text style={[styles.ctaText, !canClaim && { opacity: 0.5 }]}>\n                    {isRefund ? 'Claim Refund' : 'Claim Prize'} — {prizeAmount} SOL\n                  </Text>\n                )}\n              </TouchableOpacity>\n            )}\n\n            {/* Explorer link on success */}\n            {mutation.data?.explorerUrl && (\n              <Text style={[styles.explorerHint, { color: t.textMuted }]}>\n                View on Solscan\n              </Text>\n            )}\n          </View>\n        </View>\n      </KeyboardAvoidingView>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n  },\n  overlayTap: {\n    flex: 1,\n  },\n  keyboardView: {\n    flex: 1,\n    justifyContent: 'flex-end',\n  },\n  sheetPositioner: {\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    paddingHorizontal: 20,\n    paddingBottom: 40,\n  },\n  handleRow: {\n    alignItems: 'center',\n    paddingTop: 10,\n    paddingBottom: 8,\n  },\n  handle: {\n    width: 36,\n    height: 4,\n    borderRadius: 2,\n    opacity: 0.4,\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingVertical: 12,\n  },\n  headerTitle: {\n    fontSize: 20,\n    fontWeight: '700',\n  },\n  closeButton: {\n    fontSize: 20,\n    padding: 4,\n  },\n  // Celebration\n  celebrationContainer: {\n    alignItems: 'center',\n    paddingVertical: 32,\n    gap: 8,\n  },\n  celebrationEmoji: {\n    fontSize: 64,\n  },\n  celebrationText: {\n    fontSize: 32,\n    fontWeight: '800',\n  },\n  celebrationSubtext: {\n    fontSize: 14,\n    marginTop: 4,\n  },\n  // Summary\n  summaryCard: {\n    marginTop: 20,\n    borderRadius: 16,\n    borderWidth: 1,\n    overflow: 'hidden',\n  },\n  summaryRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingHorizontal: 16,\n    paddingVertical: 14,\n  },\n  summaryLabel: {\n    fontSize: 14,\n  },\n  summaryValue: {\n    fontSize: 15,\n    fontWeight: '700',\n  },\n  summarySep: {\n    height: 1,\n    marginHorizontal: 16,\n  },\n  // Error\n  errorBox: {\n    marginTop: 16,\n    borderRadius: 12,\n    borderWidth: 1,\n    padding: 12,\n  },\n  errorText: {\n    fontSize: 13,\n    fontWeight: '500',\n  },\n  // CTA\n  ctaButton: {\n    marginTop: 20,\n    height: 56,\n    borderRadius: 14,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  ctaText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '700',\n  },\n  ctaLoading: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 10,\n  },\n  explorerHint: {\n    textAlign: 'center',\n    marginTop: 12,\n    fontSize: 13,\n  },\n});\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { StyleSheet, Text, TouchableOpacity, type ViewStyle } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useGame } from '../../hooks/useGame';\nimport { useHasClaimed } from '../../hooks/useHasClaimed';\nimport { ClaimPrizeSheet } from './ClaimPrizeSheet';\nimport type { ClaimMutationResult } from '../../hooks/useClaim';\n\nexport interface ClaimButtonProps {\n  gameId: string;\n  style?: ViewStyle;\n  onSuccess?: (result: ClaimMutationResult) => void;\n  onError?: (error: Error) => void;\n}\n\n/**\n * Drop-in claim button that handles eligibility checks, prize/refund display,\n * and the claim sheet lifecycle internally.\n *\n * Renders nothing when the user is ineligible (lost, not resolved, not a bettor, etc.).\n */\nexport function ClaimButton({ gameId, style, onSuccess, onError }: ClaimButtonProps) {\n  const t = useDubsTheme();\n  const { wallet } = useDubs();\n  const game = useGame(gameId);\n  const claimStatus = useHasClaimed(gameId);\n  const [sheetVisible, setSheetVisible] = useState(false);\n\n  const walletAddress = wallet.publicKey?.toBase58() ?? null;\n\n  const myBet = useMemo(() => {\n    if (!walletAddress || !game.data?.bettors) return null;\n    return game.data.bettors.find(b => b.wallet === walletAddress) ?? null;\n  }, [walletAddress, game.data?.bettors]);\n\n  const isResolved = game.data?.isResolved ?? false;\n  const isRefund = isResolved && game.data?.winnerSide === null;\n  const isWinner = isResolved && myBet != null && myBet.team === game.data?.winnerSide;\n  const isEligible = myBet != null && isResolved && (isWinner || isRefund);\n  const prizeAmount = isRefund ? (myBet?.amount ?? 0) : (game.data?.totalPool ?? 0);\n\n  const handleSuccess = useCallback(\n    (result: ClaimMutationResult) => {\n      claimStatus.refetch();\n      onSuccess?.(result);\n    },\n    [claimStatus.refetch, onSuccess], // eslint-disable-line react-hooks/exhaustive-deps\n  );\n\n  // Don't render while loading or missing wallet/data\n  if (game.loading || claimStatus.loading || !game.data || !walletAddress) {\n    return null;\n  }\n\n  const label = isRefund ? 'Refund' : 'Prize';\n\n  // Already claimed — always show badge regardless of eligibility computation\n  if (claimStatus.hasClaimed) {\n    return (\n      <TouchableOpacity\n        style={[styles.badge, { borderColor: t.accent }, style]}\n        activeOpacity={1}\n        disabled\n      >\n        <Text style={[styles.badgeText, { color: t.accent }]}>\n          {label} Claimed!\n        </Text>\n      </TouchableOpacity>\n    );\n  }\n\n  // Not eligible (lost, not resolved, not a bettor) — render nothing\n  if (!isEligible) {\n    return null;\n  }\n\n  return (\n    <>\n      <TouchableOpacity\n        style={[styles.button, { backgroundColor: t.accent }, style]}\n        activeOpacity={0.8}\n        onPress={() => setSheetVisible(true)}\n      >\n        <Text style={styles.buttonText}>\n          Claim {label} — {prizeAmount} SOL\n        </Text>\n      </TouchableOpacity>\n\n      <ClaimPrizeSheet\n        visible={sheetVisible}\n        onDismiss={() => setSheetVisible(false)}\n        gameId={gameId}\n        prizeAmount={prizeAmount}\n        isRefund={isRefund}\n        onSuccess={handleSuccess}\n        onError={onError}\n      />\n    </>\n  );\n}\n\nconst styles = StyleSheet.create({\n  button: {\n    height: 52,\n    borderRadius: 14,\n    justifyContent: 'center',\n    alignItems: 'center',\n    paddingHorizontal: 20,\n  },\n  buttonText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '700',\n  },\n  badge: {\n    height: 52,\n    borderRadius: 14,\n    borderWidth: 2,\n    justifyContent: 'center',\n    alignItems: 'center',\n    paddingHorizontal: 20,\n  },\n  badgeText: {\n    fontSize: 16,\n    fontWeight: '700',\n  },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  ActivityIndicator,\n  Modal,\n  Animated,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useEnterArcadePool } from '../../hooks/useEnterArcadePool';\nimport type { EnterArcadePoolMutationResult } from '../../hooks/useEnterArcadePool';\nimport type { ArcadePool, ArcadePoolStats } from '../../types';\n\nexport interface EnterArcadePoolSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  pool: ArcadePool;\n  stats?: ArcadePoolStats | null;\n  mode?: 'join' | 'rejoin';\n  onSuccess?: (result: EnterArcadePoolMutationResult) => void;\n  onError?: (error: Error) => void;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n  building: 'Building transaction...',\n  signing: 'Approve in wallet...',\n  confirming: 'Confirming...',\n  success: 'Joined!',\n};\n\nexport function EnterArcadePoolSheet({\n  visible,\n  onDismiss,\n  pool,\n  stats,\n  mode = 'join',\n  onSuccess,\n  onError,\n}: EnterArcadePoolSheetProps) {\n  const t = useDubsTheme();\n  const { wallet } = useDubs();\n  const mutation = useEnterArcadePool();\n\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible, overlayOpacity]);\n\n  // Reset on open\n  useEffect(() => {\n    if (visible) {\n      mutation.reset();\n    }\n  }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Auto-dismiss on success\n  useEffect(() => {\n    if (mutation.status === 'success' && mutation.data) {\n      onSuccess?.(mutation.data);\n      const timer = setTimeout(() => {\n        onDismiss();\n      }, 1500);\n      return () => clearTimeout(timer);\n    }\n  }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Report errors\n  useEffect(() => {\n    if (mutation.status === 'error' && mutation.error) {\n      onError?.(mutation.error);\n    }\n  }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const buyInSol = (pool.buy_in_lamports / 1_000_000_000).toFixed(4);\n  const totalPlayers = stats?.total_entries ?? 0;\n  const totalBuyIns = pool.total_entries ?? totalPlayers;\n  const topScore = stats?.top_score ?? 0;\n  const potSol = ((pool.buy_in_lamports * Number(totalBuyIns)) / 1_000_000_000).toFixed(4);\n\n  const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n  const canJoin = !isMutating && mutation.status !== 'success';\n\n  const handleJoin = useCallback(async () => {\n    if (!wallet.publicKey) return;\n    try {\n      await mutation.execute(pool.id);\n    } catch {\n      // Error captured in mutation state\n    }\n  }, [wallet.publicKey, mutation.execute, pool.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const statusLabel = STATUS_LABELS[mutation.status] || '';\n  const isRejoin = mode === 'rejoin';\n  const headerTitle = isRejoin ? 'Play Again' : 'Join Pool';\n  const ctaLabel = isRejoin\n    ? `Play Again \\u2014 ${buyInSol} SOL`\n    : `Join Pool \\u2014 ${buyInSol} SOL`;\n  const successLabel = isRejoin ? 'Lives refilled!' : 'Joined!';\n\n  return (\n    <Modal\n      visible={visible}\n      animationType=\"slide\"\n      transparent\n      onRequestClose={onDismiss}\n    >\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      <KeyboardAvoidingView\n        style={styles.keyboardView}\n        behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n      >\n        <View style={styles.sheetPositioner}>\n          <View style={[styles.sheet, { backgroundColor: t.background }]}>\n            {/* Drag handle */}\n            <View style={styles.handleRow}>\n              <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n            </View>\n\n            {/* Header */}\n            <View style={styles.header}>\n              <Text style={[styles.headerTitle, { color: t.text }]}>{headerTitle}</Text>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n                <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            {/* Pool name */}\n            <Text style={[styles.poolName, { color: t.textSecondary }]}>{pool.name}</Text>\n\n            {/* Summary Card */}\n            <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Buy-in</Text>\n                <Text style={[styles.summaryValue, { color: t.text }]}>{buyInSol} SOL</Text>\n              </View>\n              <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Players in</Text>\n                <Text style={[styles.summaryValue, { color: t.text }]}>{totalPlayers}</Text>\n              </View>\n              <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Current pot</Text>\n                <Text style={[styles.summaryValue, { color: t.success }]}>{potSol} SOL</Text>\n              </View>\n              <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Lives</Text>\n                <Text style={[styles.summaryValue, { color: t.text }]}>{pool.max_lives}</Text>\n              </View>\n              {topScore > 0 && (\n                <>\n                  <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n                  <View style={styles.summaryRow}>\n                    <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Top score</Text>\n                    <Text style={[styles.summaryValue, { color: t.text }]}>{topScore}</Text>\n                  </View>\n                </>\n              )}\n            </View>\n\n            {/* Error Display */}\n            {mutation.error && (\n              <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n                <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n              </View>\n            )}\n\n            {/* CTA Button */}\n            <TouchableOpacity\n              style={[\n                styles.ctaButton,\n                { backgroundColor: canJoin ? t.accent : t.border },\n              ]}\n              disabled={!canJoin}\n              onPress={handleJoin}\n              activeOpacity={0.8}\n            >\n              {isMutating ? (\n                <View style={styles.ctaLoading}>\n                  <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                  <Text style={styles.ctaText}>{statusLabel}</Text>\n                </View>\n              ) : mutation.status === 'success' ? (\n                <Text style={styles.ctaText}>{successLabel}</Text>\n              ) : (\n                <Text style={[styles.ctaText, !canJoin && { opacity: 0.5 }]}>\n                  {ctaLabel}\n                </Text>\n              )}\n            </TouchableOpacity>\n          </View>\n        </View>\n      </KeyboardAvoidingView>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n  },\n  overlayTap: { flex: 1 },\n  keyboardView: { flex: 1, justifyContent: 'flex-end' },\n  sheetPositioner: { justifyContent: 'flex-end' },\n  sheet: {\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    paddingHorizontal: 20,\n    paddingBottom: 40,\n  },\n  handleRow: { alignItems: 'center', paddingTop: 10, paddingBottom: 8 },\n  handle: { width: 36, height: 4, borderRadius: 2, opacity: 0.4 },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingVertical: 12,\n  },\n  headerTitle: { fontSize: 20, fontWeight: '700' },\n  closeButton: { fontSize: 20, padding: 4 },\n  poolName: { fontSize: 15, fontWeight: '600', marginBottom: 8 },\n  summaryCard: {\n    marginTop: 12,\n    borderRadius: 16,\n    borderWidth: 1,\n    overflow: 'hidden',\n  },\n  summaryRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingHorizontal: 16,\n    paddingVertical: 14,\n  },\n  summaryLabel: { fontSize: 14 },\n  summaryValue: { fontSize: 15, fontWeight: '700' },\n  summarySep: { height: 1, marginHorizontal: 16 },\n  errorBox: {\n    marginTop: 16,\n    borderRadius: 12,\n    borderWidth: 1,\n    padding: 12,\n  },\n  errorText: { fontSize: 13, fontWeight: '500' },\n  ctaButton: {\n    marginTop: 20,\n    height: 56,\n    borderRadius: 14,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  ctaText: { color: '#FFFFFF', fontSize: 16, fontWeight: '700' },\n  ctaLoading: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n});\n","import React, { useEffect, useRef } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  Modal,\n  Animated,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n  Image,\n  FlatList,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useArcadePool } from '../../hooks/useArcadePool';\nimport { ensurePngAvatar } from '../../utils/avatarUrl';\nimport type { ArcadeLeaderboardEntry } from '../../types';\n\nexport interface ArcadeLeaderboardSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  poolId: number;\n  /** Highlighted wallet address (e.g. current user) */\n  highlightWallet?: string;\n}\n\nfunction RankLabel({ index }: { index: number }) {\n  if (index === 0) return <Text style={styles.rankEmoji}>{'\\uD83E\\uDD47'}</Text>;\n  if (index === 1) return <Text style={styles.rankEmoji}>{'\\uD83E\\uDD48'}</Text>;\n  if (index === 2) return <Text style={styles.rankEmoji}>{'\\uD83E\\uDD49'}</Text>;\n  return <Text style={styles.rankNum}>{index + 1}</Text>;\n}\n\nexport function ArcadeLeaderboardSheet({\n  visible,\n  onDismiss,\n  poolId,\n  highlightWallet,\n}: ArcadeLeaderboardSheetProps) {\n  const t = useDubsTheme();\n  const { pool, leaderboard, stats, loading, refetch } = useArcadePool(poolId);\n\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible, overlayOpacity]);\n\n  // Refresh on open\n  useEffect(() => {\n    if (visible) refetch();\n  }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const renderItem = ({ item, index }: { item: ArcadeLeaderboardEntry; index: number }) => {\n    const isMe = highlightWallet && item.wallet_address === highlightWallet;\n    return (\n      <View\n        style={[\n          styles.row,\n          { backgroundColor: isMe ? `${t.accent}18` : index % 2 === 0 ? t.surface : 'transparent' },\n          isMe ? { borderWidth: 1, borderColor: t.accent } : undefined,\n        ]}\n      >\n        <View style={styles.rankCol}>\n          <RankLabel index={index} />\n        </View>\n        {item.avatar ? (\n          <Image source={{ uri: ensurePngAvatar(item.avatar) }} style={styles.avatar} />\n        ) : (\n          <View style={[styles.avatar, { backgroundColor: t.border }]} />\n        )}\n        <View style={styles.nameCol}>\n          <Text style={[styles.name, { color: t.text }]} numberOfLines={1}>\n            {item.username || `${item.wallet_address.slice(0, 4)}...${item.wallet_address.slice(-4)}`}\n          </Text>\n          <Text style={[styles.lives, { color: t.textMuted }]}>\n            {item.lives_used} {item.lives_used === 1 ? 'life' : 'lives'} used\n          </Text>\n        </View>\n        <Text style={[styles.score, { color: t.accent }]}>{item.best_score}</Text>\n      </View>\n    );\n  };\n\n  return (\n    <Modal\n      visible={visible}\n      animationType=\"slide\"\n      transparent\n      onRequestClose={onDismiss}\n    >\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      <KeyboardAvoidingView\n        style={styles.keyboardView}\n        behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n      >\n        <View style={styles.sheetPositioner}>\n          <View style={[styles.sheet, { backgroundColor: t.background }]}>\n            {/* Drag handle */}\n            <View style={styles.handleRow}>\n              <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n            </View>\n\n            {/* Header */}\n            <View style={styles.header}>\n              <View>\n                <Text style={[styles.headerTitle, { color: t.text }]}>Leaderboard</Text>\n                {pool && (\n                  <Text style={[styles.poolName, { color: t.textMuted }]}>{pool.name}</Text>\n                )}\n              </View>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n                <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            {/* Stats bar */}\n            {stats && (\n              <View style={[styles.statsBar, { backgroundColor: t.surface, borderColor: t.border }]}>\n                <View style={styles.statItem}>\n                  <Text style={[styles.statValue, { color: t.text }]}>{stats.total_entries}</Text>\n                  <Text style={[styles.statLabel, { color: t.textMuted }]}>Players</Text>\n                </View>\n                <View style={[styles.statDivider, { backgroundColor: t.border }]} />\n                <View style={styles.statItem}>\n                  <Text style={[styles.statValue, { color: t.accent }]}>{stats.top_score}</Text>\n                  <Text style={[styles.statLabel, { color: t.textMuted }]}>Top Score</Text>\n                </View>\n                <View style={[styles.statDivider, { backgroundColor: t.border }]} />\n                <View style={styles.statItem}>\n                  <Text style={[styles.statValue, { color: t.text }]}>{Math.round(stats.avg_score)}</Text>\n                  <Text style={[styles.statLabel, { color: t.textMuted }]}>Avg Score</Text>\n                </View>\n              </View>\n            )}\n\n            {/* Leaderboard list */}\n            <FlatList\n              data={leaderboard}\n              renderItem={renderItem}\n              keyExtractor={(item) => String(item.id)}\n              style={styles.list}\n              contentContainerStyle={styles.listContent}\n              ListEmptyComponent={\n                <View style={styles.emptyState}>\n                  <Text style={[styles.emptyText, { color: t.textMuted }]}>\n                    {loading ? 'Loading...' : 'No scores yet'}\n                  </Text>\n                </View>\n              }\n            />\n          </View>\n        </View>\n      </KeyboardAvoidingView>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n  },\n  overlayTap: { flex: 1 },\n  keyboardView: { flex: 1, justifyContent: 'flex-end' },\n  sheetPositioner: { flex: 1, justifyContent: 'flex-end' },\n  sheet: {\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    paddingHorizontal: 20,\n    paddingBottom: 40,\n    maxHeight: '80%',\n  },\n  handleRow: { alignItems: 'center', paddingTop: 10, paddingBottom: 8 },\n  handle: { width: 36, height: 4, borderRadius: 2, opacity: 0.4 },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'flex-start',\n    justifyContent: 'space-between',\n    paddingVertical: 12,\n  },\n  headerTitle: { fontSize: 20, fontWeight: '700' },\n  poolName: { fontSize: 13, fontWeight: '600', marginTop: 2 },\n  closeButton: { fontSize: 20, padding: 4 },\n  statsBar: {\n    flexDirection: 'row',\n    borderRadius: 12,\n    borderWidth: 1,\n    marginBottom: 12,\n    overflow: 'hidden',\n  },\n  statItem: { flex: 1, alignItems: 'center', paddingVertical: 10 },\n  statValue: { fontSize: 18, fontWeight: '800' },\n  statLabel: { fontSize: 11, fontWeight: '600', marginTop: 2 },\n  statDivider: { width: 1, marginVertical: 8 },\n  list: { flexGrow: 0 },\n  listContent: { paddingBottom: 8 },\n  row: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    paddingVertical: 10,\n    paddingHorizontal: 12,\n    borderRadius: 10,\n    marginBottom: 2,\n  },\n  rankCol: { width: 32, alignItems: 'center' },\n  rankEmoji: { fontSize: 18 },\n  rankNum: { fontSize: 14, fontWeight: '700', color: '#888' },\n  avatar: { width: 32, height: 32, borderRadius: 16, marginRight: 10 },\n  nameCol: { flex: 1 },\n  name: { fontSize: 14, fontWeight: '600' },\n  lives: { fontSize: 11, marginTop: 1 },\n  score: { fontSize: 18, fontWeight: '800' },\n  emptyState: { paddingVertical: 40, alignItems: 'center' },\n  emptyText: { fontSize: 14, fontWeight: '600' },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  Image,\n  TouchableOpacity,\n  ActivityIndicator,\n  Modal,\n  Animated,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useCreateGame } from '../../hooks/useCreateGame';\nimport type { CreateGameMutationResult } from '../../hooks/useCreateGame';\nimport { useCredits } from '../../hooks/useCredits';\nimport type { UnifiedEvent } from '../../types';\nimport { SolSlider } from './SolSlider';\nimport { TeamButton } from './TeamButton';\n\nexport interface CreateGameSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  event: UnifiedEvent;\n  /** Override team colors */\n  homeColor?: string;\n  awayColor?: string;\n  /** Callbacks */\n  onSuccess?: (result: CreateGameMutationResult) => void;\n  onError?: (error: Error) => void;\n  /** Called when the user taps a team card */\n  onTeamSelect?: (team: 'home' | 'away') => void;\n  /** Called on success (for sound/animation) */\n  onCreateSuccess?: (result: CreateGameMutationResult) => void;\n  /** Called on each slider tick */\n  onSliderTick?: (value: number) => void;\n  /** Max wager in SOL */\n  maxWager?: number;\n  /** Custom short-name function for team labels */\n  shortName?: (name: string | null) => string;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n  building: 'Building transaction...',\n  signing: 'Approve in wallet...',\n  confirming: 'Confirming...',\n  success: 'Game Created!',\n};\n\nfunction formatSol(n: number): string {\n  return parseFloat(n.toFixed(9)).toString();\n}\n\nfunction toPng(url: string | null | undefined): string | null {\n  if (!url) return null;\n  return url.replace('/svg?', '/png?');\n}\n\nexport function CreateGameSheet({\n  visible,\n  onDismiss,\n  event,\n  homeColor = '#3B82F6',\n  awayColor = '#EF4444',\n  onSuccess,\n  onError,\n  onTeamSelect,\n  onCreateSuccess,\n  onSliderTick,\n  maxWager = 1,\n  shortName,\n}: CreateGameSheetProps) {\n  const t = useDubsTheme();\n  const { wallet } = useDubs();\n  const mutation = useCreateGame();\n  const { credits, refetch: refetchCredits } = useCredits();\n\n  const [selectedTeam, setSelectedTeam] = useState<'home' | 'away' | null>(null);\n  const [wager, setWager] = useState(0.01);\n  const [showSuccess, setShowSuccess] = useState(false);\n  const [useCredit, setUseCredit] = useState(false);\n\n  const oldestCredit = credits.length > 0 ? credits[0] : null;\n  // Compare in lamports to avoid float drift between credit.amountSOL and\n  // the slider's wager value. The on-chain instruction requires exact\n  // match anyway — if either side has a sub-lamport rounding error we'd\n  // get a confusing on-chain failure instead of a clean toggle gate.\n  const canUseCredit = !!oldestCredit; // Any 0.01 SOL credit covers the 0.01 SOL minimum buy-in\n\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n  const successScale = useRef(new Animated.Value(0)).current;\n  const successOpacity = useRef(new Animated.Value(0)).current;\n\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible]);\n\n  useEffect(() => {\n    if (visible) {\n      setSelectedTeam(null);\n      setWager(0.01);\n      setShowSuccess(false);\n      successScale.setValue(0);\n      successOpacity.setValue(0);\n      mutation.reset();\n    }\n  }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Handle success\n  useEffect(() => {\n    if (mutation.status === 'success' && mutation.data) {\n      setShowSuccess(true);\n      onSuccess?.(mutation.data);\n      onCreateSuccess?.(mutation.data);\n\n      Animated.parallel([\n        Animated.spring(successScale, { toValue: 1, friction: 4, tension: 80, useNativeDriver: true }),\n        Animated.timing(successOpacity, { toValue: 1, duration: 300, useNativeDriver: true }),\n      ]).start();\n\n      const timer = setTimeout(() => {\n        Animated.timing(successOpacity, { toValue: 0, duration: 300, useNativeDriver: true }).start(() => {\n          onDismiss();\n        });\n      }, 2500);\n      return () => clearTimeout(timer);\n    }\n  }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  useEffect(() => {\n    if (mutation.status === 'error' && mutation.error) {\n      onError?.(mutation.error);\n    }\n  }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const opponents = event.opponents || [];\n  const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n  const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n\n  const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n  const canCreate = selectedTeam !== null && !isMutating && mutation.status !== 'success';\n\n  const handleCreate = useCallback(async () => {\n    if (!selectedTeam || !wallet.publicKey) return;\n\n    try {\n      await mutation.execute({\n        id: event.id,\n        playerWallet: wallet.publicKey.toBase58(),\n        teamChoice: selectedTeam,\n        // When sponsoring, the on-chain instruction forces buy-in to\n        // the credit's amount; pass that so client-side wager state\n        // matches what gets recorded.\n        wagerAmount: useCredit && oldestCredit ? oldestCredit.amountSOL : wager,\n        useCredit: useCredit && canUseCredit ? true : undefined,\n      });\n      if (useCredit) refetchCredits();\n    } catch {\n      // Error captured in mutation state\n    }\n  }, [selectedTeam, wallet.publicKey, mutation.execute, event.id, wager, useCredit, oldestCredit, canUseCredit, refetchCredits]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n  // Countdown\n  const startTime = event.startTime ? new Date(event.startTime) : null;\n  const timeLabel = startTime\n    ? startTime.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' }) +\n      ' at ' +\n      startTime.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })\n    : 'TBD';\n\n  return (\n    <Modal visible={visible} animationType=\"slide\" transparent onRequestClose={onDismiss}>\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      {/* Success overlay */}\n      {showSuccess && (\n        <View style={styles.successOverlay}>\n          <Animated.View style={[styles.successContent, { opacity: successOpacity, transform: [{ scale: successScale }] }]}>\n            <Text style={styles.successEmoji}>🎯</Text>\n            <Text style={styles.successTitle}>Game Created!</Text>\n            <Text style={styles.successSub}>\n              {formatSol(wager)} SOL on {selectedTeam === 'home' ? homeName : awayName}\n            </Text>\n          </Animated.View>\n        </View>\n      )}\n\n      <KeyboardAvoidingView style={styles.keyboardView} behavior={Platform.OS === 'ios' ? 'padding' : undefined}>\n        <View style={styles.sheetPositioner}>\n          <View style={[styles.sheet, { backgroundColor: t.background }]}>\n            {/* Drag handle */}\n            <View style={styles.handleRow}>\n              <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n            </View>\n\n            {/* Header */}\n            <View style={styles.header}>\n              <View>\n                <Text style={[styles.headerTitle, { color: t.text }]}>Create Game</Text>\n                <Text style={[styles.headerSub, { color: t.textMuted }]}>{timeLabel}</Text>\n              </View>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n                <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            {/* Team Selection */}\n            <View style={styles.section}>\n              <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Pick Your Side</Text>\n              <View style={styles.teamsRow}>\n                <TeamButton\n                  name={homeName}\n                  imageUrl={opponents[0]?.imageUrl}\n                  odds=\"—\"\n                  bets={0}\n                  color={homeColor}\n                  selected={selectedTeam === 'home'}\n                  onPress={() => { setSelectedTeam('home'); onTeamSelect?.('home'); }}\n                  t={t}\n                />\n                <TeamButton\n                  name={awayName}\n                  imageUrl={opponents[1]?.imageUrl}\n                  odds=\"—\"\n                  bets={0}\n                  color={awayColor}\n                  selected={selectedTeam === 'away'}\n                  onPress={() => { setSelectedTeam('away'); onTeamSelect?.('away'); }}\n                  t={t}\n                />\n              </View>\n            </View>\n\n            {/* Summary */}\n            <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Your wager</Text>\n                <Text style={[styles.summaryValue, { color: t.text }]}>{formatSol(wager)} SOL</Text>\n              </View>\n              <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n              <View style={styles.summaryRow}>\n                <Text style={[styles.summaryLabel, { color: t.textMuted }]}>You're the first</Text>\n                <Text style={[styles.summaryValue, { color: t.success }]}>Set the odds</Text>\n              </View>\n            </View>\n\n            {/* Credit toggle — only when user has at least one credit */}\n            {selectedTeam && canUseCredit && oldestCredit && (\n              <TouchableOpacity\n                style={[styles.creditRow, { backgroundColor: useCredit ? '#22C55E18' : t.surface, borderColor: useCredit ? '#22C55E' : t.border }]}\n                activeOpacity={0.8}\n                onPress={() => setUseCredit(v => !v)}\n              >\n                <View style={styles.creditRowText}>\n                  <Text style={[styles.creditTitle, { color: useCredit ? '#22C55E' : t.text }]}>\n                    🎁 Use my {formatSol(oldestCredit.amountSOL)} SOL credit\n                  </Text>\n                  <Text style={[styles.creditSub, { color: t.textMuted }]}>\n                    {useCredit\n                      ? 'Treasury covers rent + buy-in'\n                      : `${credits.length} credit${credits.length === 1 ? '' : 's'} from your streak`}\n                  </Text>\n                </View>\n                <View style={[styles.creditCheckbox, useCredit && { backgroundColor: '#22C55E', borderColor: '#22C55E' }]}>\n                  {useCredit && <Text style={styles.creditCheck}>✓</Text>}\n                </View>\n              </TouchableOpacity>\n            )}\n\n            {/* SOL Slider — hidden when sponsoring (wager locked to credit) */}\n            {selectedTeam && !useCredit && (\n              <SolSlider\n                value={wager}\n                min={0.01}\n                max={maxWager}\n                step={0.01}\n                accentColor={selectedTeam === 'home' ? homeColor : awayColor}\n                onValueChange={setWager}\n                onTick={onSliderTick}\n              />\n            )}\n\n            {/* Error */}\n            {mutation.error && (\n              <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n                <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n              </View>\n            )}\n\n            {/* CTA */}\n            <TouchableOpacity\n              style={[styles.ctaButton, { backgroundColor: canCreate ? t.accent : t.border }]}\n              disabled={!canCreate}\n              onPress={handleCreate}\n              activeOpacity={0.8}\n            >\n              {isMutating ? (\n                <View style={styles.ctaLoading}>\n                  <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                  <Text style={styles.ctaText}>{statusLabel}</Text>\n                </View>\n              ) : mutation.status === 'success' ? (\n                <Text style={styles.ctaText}>Game Created!</Text>\n              ) : (\n                <Text style={[styles.ctaText, !canCreate && { opacity: 0.5 }]}>\n                  {selectedTeam\n                    ? `Create Game \\u2014 ${formatSol(wager)} SOL`\n                    : 'Pick a side to start'}\n                </Text>\n              )}\n            </TouchableOpacity>\n          </View>\n        </View>\n      </KeyboardAvoidingView>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: { ...StyleSheet.absoluteFillObject, backgroundColor: 'rgba(0,0,0,0.5)' },\n  overlayTap: { flex: 1 },\n  keyboardView: { flex: 1, justifyContent: 'flex-end' },\n  sheetPositioner: { justifyContent: 'flex-end' },\n  sheet: { borderTopLeftRadius: 24, borderTopRightRadius: 24, paddingHorizontal: 20, paddingBottom: 40 },\n  handleRow: { alignItems: 'center', paddingTop: 10, paddingBottom: 8 },\n  handle: { width: 36, height: 4, borderRadius: 2, opacity: 0.4 },\n  header: { flexDirection: 'row', alignItems: 'flex-start', justifyContent: 'space-between', paddingVertical: 8 },\n  headerTitle: { fontSize: 20, fontWeight: '700' },\n  headerSub: { fontSize: 13, marginTop: 2 },\n  closeButton: { fontSize: 20, padding: 4 },\n\n  section: { gap: 10, paddingTop: 12 },\n  sectionLabel: { fontSize: 14, fontWeight: '600' },\n  teamsRow: { flexDirection: 'row', gap: 12 },\n\n  summaryCard: { marginTop: 12, borderRadius: 14, borderWidth: 1, overflow: 'hidden' },\n  summaryRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingHorizontal: 16, paddingVertical: 12 },\n  summaryLabel: { fontSize: 14 },\n  summaryValue: { fontSize: 15, fontWeight: '700' },\n  summarySep: { height: 1, marginHorizontal: 16 },\n\n  errorBox: { marginTop: 12, borderRadius: 12, borderWidth: 1, padding: 12 },\n  errorText: { fontSize: 13, fontWeight: '500' },\n\n  ctaButton: { marginTop: 16, height: 54, borderRadius: 14, justifyContent: 'center', alignItems: 'center' },\n  ctaText: { color: '#FFFFFF', fontSize: 16, fontWeight: '700' },\n  ctaLoading: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n\n  creditRow: { flexDirection: 'row', alignItems: 'center', gap: 12, marginTop: 12, padding: 12, borderRadius: 12, borderWidth: 1.5 },\n  creditRowText: { flex: 1, gap: 2 },\n  creditTitle: { fontSize: 14, fontWeight: '700' },\n  creditSub: { fontSize: 12, fontWeight: '500' },\n  creditCheckbox: { width: 22, height: 22, borderRadius: 11, borderWidth: 2, borderColor: '#3A3A3C', alignItems: 'center', justifyContent: 'center' },\n  creditCheck: { color: '#FFFFFF', fontSize: 14, fontWeight: '900' },\n\n  successOverlay: { ...StyleSheet.absoluteFillObject, zIndex: 100, alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(0,0,0,0.85)' },\n  successContent: { alignItems: 'center', gap: 12 },\n  successEmoji: { fontSize: 64 },\n  successTitle: { color: '#FFFFFF', fontSize: 28, fontWeight: '900' },\n  successSub: { color: '#8E8E93', fontSize: 16 },\n});\n","import React, { useEffect, useRef } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  Animated,\n  StyleSheet,\n  Image,\n} from 'react-native';\nimport type { JackpotRound, JackpotLastWinner, JackpotEntry } from '../../types';\nimport type { ViewStyle } from 'react-native';\n\nexport interface JackpotCardProps {\n  round: JackpotRound | null;\n  lastWinner?: JackpotLastWinner | null;\n  entries?: JackpotEntry[];\n  onPress?: () => void;\n  style?: ViewStyle;\n}\n\nfunction formatSOL(lamports: string | number): string {\n  const val = typeof lamports === 'string' ? parseInt(lamports, 10) : lamports;\n  if (isNaN(val) || val === 0) return '0';\n  const sol = val / 1_000_000_000;\n  // No trailing zeros\n  if (sol >= 100) return sol.toFixed(0);\n  if (sol >= 1) return sol.toFixed(2);\n  if (sol >= 0.01) return sol.toFixed(3);\n  return sol.toFixed(4);\n}\n\nfunction truncateWallet(addr: string): string {\n  if (!addr || addr.length < 8) return addr || '';\n  return `${addr.slice(0, 4)}...${addr.slice(-4)}`;\n}\n\nexport function JackpotCard({ round, lastWinner, entries, onPress, style }: JackpotCardProps) {\n  const shimmerAnim = useRef(new Animated.Value(-1)).current;\n  const pulseAnim = useRef(new Animated.Value(0.4)).current;\n\n  useEffect(() => {\n    // Shimmer sweep: matches web heroSweep (4s)\n    const shimmer = Animated.loop(\n      Animated.sequence([\n        Animated.timing(shimmerAnim, { toValue: 1, duration: 4000, useNativeDriver: true }),\n        Animated.delay(500),\n        Animated.timing(shimmerAnim, { toValue: -1, duration: 0, useNativeDriver: true }),\n      ]),\n    );\n    shimmer.start();\n\n    // Status dot pulse\n    const pulse = Animated.loop(\n      Animated.sequence([\n        Animated.timing(pulseAnim, { toValue: 1, duration: 1000, useNativeDriver: true }),\n        Animated.timing(pulseAnim, { toValue: 0.4, duration: 1000, useNativeDriver: true }),\n      ]),\n    );\n    pulse.start();\n\n    return () => { shimmer.stop(); pulse.stop(); };\n  }, [shimmerAnim, pulseAnim]);\n\n  const potSol = round ? formatSOL(round.totalPotLamports) : '0';\n  const isOpen = round?.status === 'Open';\n  const entryCount = round?.entryCount ?? 0;\n  const totalWeight = round ? Number(BigInt(round.totalWeight || '0')) : 0;\n\n  return (\n    <TouchableOpacity\n      activeOpacity={0.9}\n      onPress={onPress}\n      style={[styles.card, style]}\n    >\n      {/* Green accent gradient background */}\n      <View style={styles.gradientBg} />\n\n      {/* Shimmer sweep overlay */}\n      <Animated.View\n        style={[\n          styles.shimmer,\n          {\n            transform: [{\n              translateX: shimmerAnim.interpolate({\n                inputRange: [-1, 1],\n                outputRange: [-400, 400],\n              }),\n            }],\n          },\n        ]}\n      />\n\n      {/* Bottom accent bar */}\n      <View style={styles.accentBar} />\n\n      {/* Content */}\n      <View style={styles.content}>\n        {/* Status badge */}\n        <View style={styles.statusRow}>\n          <View style={[styles.statusBadge, isOpen ? styles.statusOpen : styles.statusClosed]}>\n            {isOpen && (\n              <Animated.View style={[styles.statusDot, { opacity: pulseAnim }]} />\n            )}\n            <Text style={[styles.statusText, { color: isOpen ? '#22c55e' : '#9ca3af' }]}>\n              {isOpen ? 'Open' : round?.status ?? 'Loading'}\n            </Text>\n          </View>\n          <Text style={styles.entryCountText}>{entryCount} player{entryCount !== 1 ? 's' : ''}</Text>\n        </View>\n\n        {/* Hero pot section */}\n        <View style={styles.heroSection}>\n          <View style={styles.potInfo}>\n            <Text style={styles.jackpotLabel}>JACKPOT</Text>\n            <Text style={styles.potValue}>{potSol} SOL</Text>\n          </View>\n          <Text style={styles.potEmoji}>🤑</Text>\n        </View>\n\n        {/* Info grid: Your Chance / Players / Last Winner */}\n        <View style={styles.infoGrid}>\n          <View style={styles.infoCard}>\n            <Text style={styles.infoLabel}>PLAYERS</Text>\n            <Text style={styles.infoValue}>{entryCount}</Text>\n          </View>\n          <View style={styles.infoCard}>\n            <Text style={styles.infoLabel}>TOTAL POT</Text>\n            <Text style={[styles.infoValue, { color: '#4ade80' }]}>{potSol}</Text>\n          </View>\n          <View style={styles.infoCard}>\n            <Text style={styles.infoLabel}>LAST WIN</Text>\n            <Text style={[styles.infoValue, { color: '#22c55e' }]}>\n              {lastWinner ? formatSOL(lastWinner.winAmount) : '—'}\n            </Text>\n          </View>\n        </View>\n\n        {/* Player carousel (horizontal scroll of entry chips) */}\n        {entries && entries.length > 0 && (\n          <View style={styles.playersSection}>\n            <View style={styles.playersSectionHeader}>\n              <Text style={styles.playersSectionTitle}>Players in Round</Text>\n              <View style={styles.activeCountBadge}>\n                <Text style={styles.activeCountText}>{entries.length}</Text>\n              </View>\n            </View>\n            <View style={styles.playersCarousel}>\n              {entries.slice(0, 8).map((entry, i) => {\n                const odds = entry.oddsPercent;\n                return (\n                  <View key={`${entry.player}-${i}`} style={styles.playerCard}>\n                    {/* Avatar placeholder */}\n                    <View style={styles.playerAvatar}>\n                      <Text style={styles.playerAvatarText}>\n                        {entry.player.slice(0, 2).toUpperCase()}\n                      </Text>\n                    </View>\n                    <Text style={styles.playerWallet} numberOfLines={1}>\n                      {truncateWallet(entry.player)}\n                    </Text>\n                    <Text style={styles.playerWager}>{entry.weightSol.toFixed(2)} SOL</Text>\n                    <Text style={styles.playerOdds}>{odds}%</Text>\n                  </View>\n                );\n              })}\n              {entries.length > 8 && (\n                <View style={styles.playerCardMore}>\n                  <Text style={styles.playerMoreText}>+{entries.length - 8}</Text>\n                </View>\n              )}\n            </View>\n          </View>\n        )}\n\n        {/* Place Bet CTA */}\n        <TouchableOpacity\n          style={styles.placeBetButton}\n          activeOpacity={0.85}\n          onPress={onPress}\n        >\n          <Text style={styles.placeBetText}>Place Bet</Text>\n        </TouchableOpacity>\n      </View>\n    </TouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: {\n    borderRadius: 16,\n    borderWidth: 1,\n    borderColor: 'rgba(34, 197, 94, 0.2)',\n    backgroundColor: '#0c0c14',\n    overflow: 'hidden',\n    position: 'relative',\n  },\n  gradientBg: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(34, 197, 94, 0.04)',\n  },\n  shimmer: {\n    position: 'absolute',\n    top: 0,\n    bottom: 0,\n    width: 120,\n    backgroundColor: 'rgba(34, 197, 94, 0.08)',\n  },\n  accentBar: {\n    position: 'absolute',\n    bottom: 0,\n    left: 0,\n    right: '40%' as any,\n    height: 2,\n    backgroundColor: '#22c55e',\n  },\n  content: {\n    padding: 16,\n    gap: 12,\n  },\n  // Status row\n  statusRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8,\n  },\n  statusBadge: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 6,\n    paddingHorizontal: 10,\n    paddingVertical: 4,\n    borderRadius: 100,\n  },\n  statusOpen: {\n    backgroundColor: 'rgba(34, 197, 94, 0.15)',\n  },\n  statusClosed: {\n    backgroundColor: 'rgba(156, 163, 175, 0.15)',\n  },\n  statusDot: {\n    width: 6,\n    height: 6,\n    borderRadius: 3,\n    backgroundColor: '#22c55e',\n  },\n  statusText: {\n    fontSize: 12,\n    fontWeight: '700',\n  },\n  entryCountText: {\n    fontSize: 12,\n    color: '#6b6b6b',\n    fontWeight: '500',\n  },\n  // Hero pot\n  heroSection: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n  },\n  potInfo: {\n    flex: 1,\n  },\n  jackpotLabel: {\n    fontSize: 10,\n    fontWeight: '600',\n    color: '#6b6b6b',\n    letterSpacing: 3,\n    textTransform: 'uppercase',\n    marginBottom: 4,\n  },\n  potValue: {\n    fontSize: 36,\n    fontWeight: '900',\n    color: '#4ade80',\n    letterSpacing: -1,\n  },\n  potEmoji: {\n    fontSize: 40,\n    opacity: 0.2,\n  },\n  // Info grid\n  infoGrid: {\n    flexDirection: 'row',\n    gap: 8,\n  },\n  infoCard: {\n    flex: 1,\n    borderRadius: 12,\n    borderWidth: 1,\n    borderColor: '#1e1e2a',\n    backgroundColor: '#0c0c14',\n    padding: 12,\n  },\n  infoLabel: {\n    fontSize: 9,\n    fontWeight: '600',\n    color: '#6b6b6b',\n    letterSpacing: 2,\n    textTransform: 'uppercase',\n    marginBottom: 4,\n  },\n  infoValue: {\n    fontSize: 18,\n    fontWeight: '700',\n    color: '#FFFFFF',\n  },\n  // Players section\n  playersSection: {\n    borderRadius: 12,\n    borderWidth: 1,\n    borderColor: '#1e1e2a',\n    backgroundColor: 'rgba(139, 92, 246, 0.04)',\n    padding: 12,\n    overflow: 'hidden',\n  },\n  playersSectionHeader: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    marginBottom: 10,\n  },\n  playersSectionTitle: {\n    fontSize: 13,\n    fontWeight: '600',\n    color: '#a0a0a0',\n  },\n  activeCountBadge: {\n    backgroundColor: 'rgba(34, 197, 94, 0.15)',\n    paddingHorizontal: 8,\n    paddingVertical: 2,\n    borderRadius: 100,\n  },\n  activeCountText: {\n    fontSize: 11,\n    fontWeight: '700',\n    color: '#22c55e',\n  },\n  playersCarousel: {\n    flexDirection: 'row',\n    gap: 10,\n  },\n  playerCard: {\n    width: 96,\n    borderRadius: 12,\n    borderWidth: 1.5,\n    borderColor: 'rgba(139, 92, 246, 0.4)',\n    backgroundColor: 'rgba(139, 92, 246, 0.08)',\n    padding: 10,\n    alignItems: 'center',\n    gap: 4,\n  },\n  playerAvatar: {\n    width: 40,\n    height: 40,\n    borderRadius: 20,\n    borderWidth: 1.5,\n    borderColor: '#8b5cf6',\n    backgroundColor: 'rgba(139, 92, 246, 0.2)',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  playerAvatarText: {\n    fontSize: 14,\n    fontWeight: '700',\n    color: '#a78bfa',\n  },\n  playerWallet: {\n    fontSize: 10,\n    fontWeight: '500',\n    color: '#a0a0a0',\n    width: '100%',\n    textAlign: 'center',\n  },\n  playerWager: {\n    fontSize: 12,\n    fontWeight: '600',\n    color: '#a78bfa',\n  },\n  playerOdds: {\n    fontSize: 10,\n    fontWeight: '700',\n    color: '#22c55e',\n  },\n  playerCardMore: {\n    width: 96,\n    borderRadius: 12,\n    borderWidth: 1.5,\n    borderColor: '#1e1e2a',\n    backgroundColor: '#14141e',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  playerMoreText: {\n    fontSize: 16,\n    fontWeight: '700',\n    color: '#6b6b6b',\n  },\n  // Place bet CTA\n  placeBetButton: {\n    height: 52,\n    borderRadius: 12,\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: '#22c55e',\n    shadowColor: '#22c55e',\n    shadowOffset: { width: 0, height: 4 },\n    shadowOpacity: 0.25,\n    shadowRadius: 12,\n    elevation: 6,\n  },\n  placeBetText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '700',\n  },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  ActivityIndicator,\n  Modal,\n  Animated,\n  StyleSheet,\n  ScrollView,\n  FlatList,\n  TextInput,\n  Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useJackpot } from '../../hooks/useJackpot';\nimport { useEnterJackpot } from '../../hooks/useEnterJackpot';\nimport type { EnterJackpotMutationResult } from '../../hooks/useEnterJackpot';\nimport type { JackpotEntry } from '../../types';\n\nexport interface JackpotSheetProps {\n  visible: boolean;\n  onDismiss: () => void;\n  onSuccess?: (result: EnterJackpotMutationResult) => void;\n  onError?: (error: Error) => void;\n  minEntry?: number;\n  maxEntry?: number;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n  building: 'Building transaction...',\n  signing: 'Approve in wallet...',\n  confirming: 'Confirming entry...',\n  success: \"You're in! 🏆\",\n};\n\nconst QUICK_AMOUNTS = [0.1, 0.5, 1];\n\nfunction formatSOL(lamports: string | number): string {\n  const val = typeof lamports === 'string' ? parseInt(lamports, 10) : lamports;\n  if (isNaN(val) || val === 0) return '0';\n  const sol = val / 1_000_000_000;\n  if (sol >= 100) return sol.toFixed(0);\n  if (sol >= 1) return sol.toFixed(2);\n  if (sol >= 0.01) return sol.toFixed(3);\n  return sol.toFixed(4);\n}\n\nfunction truncateWallet(addr: string): string {\n  if (!addr || addr.length < 8) return addr || '';\n  return `${addr.slice(0, 4)}...${addr.slice(-4)}`;\n}\n\nexport function JackpotSheet({\n  visible,\n  onDismiss,\n  onSuccess,\n  onError,\n  minEntry = 0.01,\n  maxEntry = 10,\n}: JackpotSheetProps) {\n  const t = useDubsTheme();\n  const { wallet, client } = useDubs();\n  const { round, lastWinner, refetch } = useJackpot();\n  const mutation = useEnterJackpot();\n\n  const [betAmount, setBetAmount] = useState('0.1');\n  const [entries, setEntries] = useState<JackpotEntry[]>([]);\n  const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n  useEffect(() => {\n    Animated.timing(overlayOpacity, {\n      toValue: visible ? 1 : 0,\n      duration: 250,\n      useNativeDriver: true,\n    }).start();\n  }, [visible, overlayOpacity]);\n\n  // Fetch entries when sheet opens\n  useEffect(() => {\n    if (visible) {\n      mutation.reset();\n      setBetAmount('0.1');\n      refetch();\n      client.getJackpotEntries().then(res => setEntries(res.entries)).catch(() => {});\n    }\n  }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Auto-dismiss on success\n  useEffect(() => {\n    if (mutation.status === 'success' && mutation.data) {\n      onSuccess?.(mutation.data);\n      refetch();\n      client.getJackpotEntries().then(res => setEntries(res.entries)).catch(() => {});\n      const timer = setTimeout(() => onDismiss(), 2500);\n      return () => clearTimeout(timer);\n    }\n  }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  useEffect(() => {\n    if (mutation.status === 'error' && mutation.error) {\n      onError?.(mutation.error);\n    }\n  }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const potSol = round ? Number(BigInt(round.totalPotLamports || '0')) / 1_000_000_000 : 0;\n  const totalWeight = round ? Number(BigInt(round.totalWeight || '0')) : 0;\n  const betSol = parseFloat(betAmount) || 0;\n  const entryLamports = Math.round(betSol * 1_000_000_000);\n\n  // Live odds preview\n  const userOdds = totalWeight > 0\n    ? ((entryLamports / (totalWeight + entryLamports)) * 100).toFixed(1)\n    : entries.length === 0 ? '100.0' : '0.0';\n\n  const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n  const canEnter = !isMutating && mutation.status !== 'success' && round?.status === 'Open' && betSol >= minEntry;\n\n  const handleQuickAdd = useCallback((amount: number) => {\n    setBetAmount(prev => {\n      const current = parseFloat(prev) || 0;\n      const next = Math.min(current + amount, maxEntry);\n      return next.toFixed(2);\n    });\n  }, [maxEntry]);\n\n  const handleEnter = useCallback(async () => {\n    if (!wallet.publicKey || entryLamports < 10000) return;\n    try {\n      await mutation.execute(entryLamports);\n    } catch {\n      // Error captured in mutation state\n    }\n  }, [wallet.publicKey, mutation.execute, entryLamports]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n  const renderPlayerCard = ({ item, index }: { item: JackpotEntry; index: number }) => (\n    <View style={styles.playerCard}>\n      {/* Avatar */}\n      <View style={styles.playerAvatar}>\n        <Text style={styles.playerAvatarText}>\n          {item.player.slice(0, 2).toUpperCase()}\n        </Text>\n      </View>\n      {/* Username */}\n      <Text style={styles.playerUsername} numberOfLines={1}>\n        @{truncateWallet(item.player)}\n      </Text>\n      {/* Wager */}\n      <View style={styles.playerWagerRow}>\n        <Text style={styles.playerWagerAmount}>{item.weightSol.toFixed(2)} SOL</Text>\n      </View>\n      {/* Odds */}\n      <Text style={styles.playerOdds}>{item.oddsPercent}%</Text>\n    </View>\n  );\n\n  return (\n    <Modal\n      visible={visible}\n      animationType=\"slide\"\n      transparent\n      onRequestClose={onDismiss}\n    >\n      <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n        <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n      </Animated.View>\n\n      <View style={styles.sheetPositioner}>\n        <View style={styles.sheet}>\n          {/* Drag handle */}\n          <View style={styles.handleRow}>\n            <View style={styles.handle} />\n          </View>\n\n          <ScrollView\n            style={styles.scrollView}\n            contentContainerStyle={styles.scrollContent}\n            showsVerticalScrollIndicator={false}\n            bounces={true}\n          >\n            {/* Header */}\n            <View style={styles.header}>\n              <Text style={styles.headerTitle}>Jackpot</Text>\n              <TouchableOpacity onPress={onDismiss} activeOpacity={0.8} style={styles.closeBtn}>\n                <Text style={styles.closeBtnText}>{'\\u2715'}</Text>\n              </TouchableOpacity>\n            </View>\n\n            {/* Hero pot card */}\n            <View style={styles.heroCard}>\n              <View style={styles.heroGradient} />\n              <Text style={styles.heroLabel}>JACKPOT</Text>\n              <View style={styles.heroPotRow}>\n                <Text style={styles.heroPotValue}>{potSol.toFixed(4)} SOL</Text>\n                <Text style={styles.heroEmoji}>🤑</Text>\n              </View>\n              {/* Accent bar */}\n              <View style={styles.heroAccentBar} />\n            </View>\n\n            {/* Info cards row */}\n            <View style={styles.infoRow}>\n              <View style={styles.infoCard}>\n                <Text style={styles.infoCardLabel}>YOUR WAGER</Text>\n                <Text style={styles.infoCardValue}>{betSol.toFixed(2)}</Text>\n              </View>\n              <View style={styles.infoCard}>\n                <Text style={styles.infoCardLabel}>YOUR CHANCE</Text>\n                <Text style={[styles.infoCardValue, { color: '#22c55e' }]}>{userOdds}%</Text>\n              </View>\n              <View style={styles.infoCard}>\n                <Text style={styles.infoCardLabel}>PLAYERS</Text>\n                <Text style={styles.infoCardValue}>{entries.length}</Text>\n              </View>\n            </View>\n\n            {/* Player carousel */}\n            {entries.length > 0 && (\n              <View style={styles.playersSection}>\n                <View style={styles.playersSectionHeader}>\n                  <Text style={styles.playersSectionTitle}>Players in Round</Text>\n                  <View style={styles.playersBadge}>\n                    <View style={styles.playersBadgeDot} />\n                    <Text style={styles.playersBadgeText}>{entries.length} active</Text>\n                  </View>\n                </View>\n                <FlatList\n                  data={entries}\n                  renderItem={renderPlayerCard}\n                  keyExtractor={(item, i) => `${item.player}-${i}`}\n                  horizontal\n                  showsHorizontalScrollIndicator={false}\n                  contentContainerStyle={styles.playersListContent}\n                  ItemSeparatorComponent={() => <View style={{ width: 10 }} />}\n                />\n              </View>\n            )}\n\n            {/* Empty state */}\n            {entries.length === 0 && (\n              <View style={styles.emptyState}>\n                <Text style={styles.emptyEmoji}>🤑</Text>\n                <Text style={styles.emptyTitle}>No players yet</Text>\n                <Text style={styles.emptySubtitle}>Be the first to join!</Text>\n              </View>\n            )}\n\n            {/* Bet input section */}\n            <View style={styles.betSection}>\n              <Text style={styles.betLabel}>Bet Amount</Text>\n\n              {/* Input row */}\n              <View style={styles.betInputRow}>\n                <View style={styles.solIcon}>\n                  <Text style={styles.solIconText}>◎</Text>\n                </View>\n                <TextInput\n                  style={styles.betInput}\n                  value={betAmount}\n                  onChangeText={setBetAmount}\n                  keyboardType=\"decimal-pad\"\n                  placeholder=\"0.00\"\n                  placeholderTextColor=\"#6b6b6b\"\n                  selectTextOnFocus\n                />\n                <Text style={styles.betInputSuffix}>SOL</Text>\n              </View>\n\n              {/* Quick bet buttons */}\n              <View style={styles.quickBetRow}>\n                {QUICK_AMOUNTS.map(amount => (\n                  <TouchableOpacity\n                    key={amount}\n                    style={styles.quickBetBtn}\n                    onPress={() => handleQuickAdd(amount)}\n                    activeOpacity={0.7}\n                  >\n                    <Text style={styles.quickBetText}>+{amount} SOL</Text>\n                  </TouchableOpacity>\n                ))}\n              </View>\n            </View>\n\n            {/* Error */}\n            {mutation.error && (\n              <View style={styles.errorBox}>\n                <Text style={styles.errorText}>{mutation.error.message}</Text>\n              </View>\n            )}\n\n            {/* Place Bet CTA */}\n            <TouchableOpacity\n              style={[\n                styles.placeBetBtn,\n                !canEnter && styles.placeBetBtnDisabled,\n                mutation.status === 'success' && styles.placeBetBtnSuccess,\n              ]}\n              disabled={!canEnter}\n              onPress={handleEnter}\n              activeOpacity={0.85}\n            >\n              {isMutating ? (\n                <View style={styles.placeBetLoading}>\n                  <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n                  <Text style={styles.placeBetText}>{statusLabel}</Text>\n                </View>\n              ) : mutation.status === 'success' ? (\n                <Text style={styles.placeBetText}>You're in! 🏆</Text>\n              ) : (\n                <Text style={[styles.placeBetText, !canEnter && { opacity: 0.5 }]}>\n                  Place Bet — {betSol.toFixed(2)} SOL\n                </Text>\n              )}\n            </TouchableOpacity>\n\n            {/* Last winner */}\n            {lastWinner && (\n              <View style={styles.lastWinnerSection}>\n                <Text style={styles.lastWinnerLabel}>Last Winner</Text>\n                <View style={styles.lastWinnerRow}>\n                  <Text style={styles.lastWinnerWallet}>{truncateWallet(lastWinner.winner)}</Text>\n                  <Text style={styles.lastWinnerAmount}>won {formatSOL(lastWinner.winAmount)} SOL</Text>\n                </View>\n              </View>\n            )}\n          </ScrollView>\n        </View>\n      </View>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(0,0,0,0.65)',\n  },\n  overlayTap: { flex: 1 },\n  sheetPositioner: {\n    flex: 1,\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    backgroundColor: '#08080e',\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    maxHeight: '92%',\n    borderWidth: 1,\n    borderColor: '#1e1e2a',\n    borderBottomWidth: 0,\n  },\n  handleRow: { alignItems: 'center', paddingTop: 10, paddingBottom: 4 },\n  handle: { width: 36, height: 4, borderRadius: 2, backgroundColor: '#2a2a3a' },\n  scrollView: { flexGrow: 0 },\n  scrollContent: {\n    paddingHorizontal: 16,\n    paddingBottom: Platform.OS === 'ios' ? 40 : 24,\n  },\n  // Header\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingVertical: 12,\n  },\n  headerTitle: { fontSize: 20, fontWeight: '700', color: '#FFFFFF' },\n  closeBtn: { padding: 4 },\n  closeBtnText: { fontSize: 20, color: '#6b6b6b' },\n\n  // Hero pot card\n  heroCard: {\n    borderRadius: 16,\n    borderWidth: 1,\n    borderColor: 'rgba(34, 197, 94, 0.2)',\n    padding: 16,\n    overflow: 'hidden',\n    position: 'relative',\n  },\n  heroGradient: {\n    ...StyleSheet.absoluteFillObject,\n    backgroundColor: 'rgba(34, 197, 94, 0.04)',\n  },\n  heroLabel: {\n    fontSize: 10,\n    fontWeight: '600',\n    color: '#6b6b6b',\n    letterSpacing: 3,\n    marginBottom: 4,\n  },\n  heroPotRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n  },\n  heroPotValue: {\n    fontSize: 32,\n    fontWeight: '900',\n    color: '#4ade80',\n    letterSpacing: -1,\n  },\n  heroEmoji: {\n    fontSize: 36,\n    opacity: 0.2,\n  },\n  heroAccentBar: {\n    position: 'absolute',\n    bottom: 0,\n    left: 0,\n    width: '60%',\n    height: 2,\n    backgroundColor: '#22c55e',\n  },\n\n  // Info row\n  infoRow: {\n    flexDirection: 'row',\n    gap: 8,\n    marginTop: 12,\n  },\n  infoCard: {\n    flex: 1,\n    borderRadius: 12,\n    borderWidth: 1,\n    borderColor: '#1e1e2a',\n    backgroundColor: '#0c0c14',\n    padding: 12,\n  },\n  infoCardLabel: {\n    fontSize: 9,\n    fontWeight: '600',\n    color: '#6b6b6b',\n    letterSpacing: 2,\n    marginBottom: 4,\n  },\n  infoCardValue: {\n    fontSize: 18,\n    fontWeight: '700',\n    color: '#FFFFFF',\n  },\n\n  // Players section\n  playersSection: {\n    marginTop: 16,\n    borderRadius: 16,\n    borderWidth: 1,\n    borderColor: '#1e1e2a',\n    backgroundColor: 'rgba(139, 92, 246, 0.03)',\n    padding: 12,\n    overflow: 'hidden',\n  },\n  playersSectionHeader: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    marginBottom: 12,\n  },\n  playersSectionTitle: {\n    fontSize: 13,\n    fontWeight: '600',\n    color: '#a0a0a0',\n  },\n  playersBadge: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 6,\n    backgroundColor: 'rgba(34, 197, 94, 0.15)',\n    paddingHorizontal: 8,\n    paddingVertical: 3,\n    borderRadius: 100,\n  },\n  playersBadgeDot: {\n    width: 6,\n    height: 6,\n    borderRadius: 3,\n    backgroundColor: '#22c55e',\n  },\n  playersBadgeText: {\n    fontSize: 11,\n    fontWeight: '700',\n    color: '#22c55e',\n  },\n  playersListContent: {\n    paddingRight: 4,\n  },\n\n  // Player cards (carousel items)\n  playerCard: {\n    width: 110,\n    borderRadius: 12,\n    borderWidth: 1.5,\n    borderColor: 'rgba(139, 92, 246, 0.4)',\n    backgroundColor: 'rgba(139, 92, 246, 0.08)',\n    padding: 12,\n    alignItems: 'center',\n    gap: 6,\n  },\n  playerAvatar: {\n    width: 48,\n    height: 48,\n    borderRadius: 24,\n    borderWidth: 2,\n    borderColor: '#8b5cf6',\n    backgroundColor: 'rgba(139, 92, 246, 0.15)',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  playerAvatarText: {\n    fontSize: 16,\n    fontWeight: '700',\n    color: '#a78bfa',\n  },\n  playerUsername: {\n    fontSize: 11,\n    fontWeight: '500',\n    color: '#a0a0a0',\n    textAlign: 'center',\n  },\n  playerWagerRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 4,\n  },\n  playerWagerAmount: {\n    fontSize: 13,\n    fontWeight: '600',\n    color: '#a78bfa',\n  },\n  playerOdds: {\n    fontSize: 11,\n    fontWeight: '700',\n    color: '#22c55e',\n  },\n\n  // Empty state\n  emptyState: {\n    marginTop: 16,\n    alignItems: 'center',\n    paddingVertical: 24,\n    borderRadius: 16,\n    borderWidth: 1,\n    borderColor: '#1e1e2a',\n    backgroundColor: '#0c0c14',\n  },\n  emptyEmoji: { fontSize: 40, marginBottom: 8 },\n  emptyTitle: { fontSize: 16, fontWeight: '600', color: '#FFFFFF' },\n  emptySubtitle: { fontSize: 13, color: '#6b6b6b', marginTop: 4 },\n\n  // Bet section\n  betSection: {\n    marginTop: 16,\n  },\n  betLabel: {\n    fontSize: 13,\n    fontWeight: '500',\n    color: '#6b6b6b',\n    marginBottom: 8,\n  },\n  betInputRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8,\n    backgroundColor: '#08080e',\n    borderWidth: 1,\n    borderColor: '#2a2a3a',\n    borderRadius: 12,\n    paddingHorizontal: 14,\n    paddingVertical: Platform.OS === 'ios' ? 14 : 10,\n  },\n  solIcon: {\n    width: 32,\n    height: 32,\n    borderRadius: 16,\n    backgroundColor: 'rgba(139, 92, 246, 0.15)',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  solIconText: {\n    fontSize: 18,\n    color: '#a78bfa',\n    fontWeight: '700',\n  },\n  betInput: {\n    flex: 1,\n    fontSize: 24,\n    fontWeight: '700',\n    color: '#FFFFFF',\n    padding: 0,\n  },\n  betInputSuffix: {\n    fontSize: 14,\n    fontWeight: '500',\n    color: '#6b6b6b',\n  },\n  quickBetRow: {\n    flexDirection: 'row',\n    gap: 8,\n    marginTop: 10,\n  },\n  quickBetBtn: {\n    flex: 1,\n    paddingVertical: 12,\n    borderRadius: 10,\n    borderWidth: 1,\n    borderColor: '#2a2a3a',\n    backgroundColor: '#08080e',\n    alignItems: 'center',\n  },\n  quickBetText: {\n    fontSize: 13,\n    fontWeight: '600',\n    color: '#FFFFFF',\n  },\n\n  // Error\n  errorBox: {\n    marginTop: 12,\n    borderRadius: 12,\n    borderWidth: 1,\n    borderColor: '#3A1515',\n    backgroundColor: '#1A0A0A',\n    padding: 12,\n  },\n  errorText: { fontSize: 13, fontWeight: '500', color: '#F87171' },\n\n  // Place Bet CTA\n  placeBetBtn: {\n    marginTop: 16,\n    height: 56,\n    borderRadius: 14,\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: '#22c55e',\n    shadowColor: '#22c55e',\n    shadowOffset: { width: 0, height: 4 },\n    shadowOpacity: 0.25,\n    shadowRadius: 12,\n    elevation: 6,\n  },\n  placeBetBtnDisabled: {\n    backgroundColor: '#1e1e2a',\n    shadowOpacity: 0,\n    elevation: 0,\n  },\n  placeBetBtnSuccess: {\n    backgroundColor: '#16a34a',\n  },\n  placeBetText: { color: '#FFFFFF', fontSize: 16, fontWeight: '700' },\n  placeBetLoading: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n\n  // Last winner\n  lastWinnerSection: {\n    marginTop: 14,\n    paddingTop: 14,\n    borderTopWidth: 1,\n    borderTopColor: '#1e1e2a',\n  },\n  lastWinnerLabel: {\n    fontSize: 11,\n    fontWeight: '600',\n    color: '#6b6b6b',\n    letterSpacing: 1,\n    textTransform: 'uppercase',\n    marginBottom: 4,\n  },\n  lastWinnerRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 6,\n  },\n  lastWinnerWallet: {\n    fontSize: 13,\n    fontWeight: '500',\n    color: '#a0a0a0',\n  },\n  lastWinnerAmount: {\n    fontSize: 13,\n    fontWeight: '600',\n    color: '#22c55e',\n  },\n});\n","import React, { useState, useEffect } from 'react';\nimport { JackpotCard } from './JackpotCard';\nimport { JackpotSheet } from './JackpotSheet';\nimport { useJackpot } from '../../hooks/useJackpot';\nimport { useDubs } from '../../provider';\nimport type { EnterJackpotMutationResult } from '../../hooks/useEnterJackpot';\nimport type { JackpotEntry } from '../../types';\nimport type { ViewStyle } from 'react-native';\n\nexport interface JackpotWidgetProps {\n  /** Style applied to the card */\n  style?: ViewStyle;\n  /** Minimum entry in SOL (default: 0.01) */\n  minEntry?: number;\n  /** Maximum entry in SOL (default: 10) */\n  maxEntry?: number;\n  /** Callback when a jackpot entry succeeds */\n  onEntry?: (result: EnterJackpotMutationResult) => void;\n  /** Callback on entry error */\n  onError?: (error: Error) => void;\n}\n\n/**\n * Self-contained Jackpot widget — the first \"crypto ad\".\n *\n * Drop `<JackpotWidget />` anywhere in your app. Shows a live jackpot card\n * matching the web lobby design with pot amount, player carousel, and\n * Place Bet button. Tapping opens a scrollable sheet with full entry flow.\n */\nexport function JackpotWidget({\n  style,\n  minEntry,\n  maxEntry,\n  onEntry,\n  onError,\n}: JackpotWidgetProps) {\n  const [sheetVisible, setSheetVisible] = useState(false);\n  const { round, lastWinner } = useJackpot();\n  const { client } = useDubs();\n  const [entries, setEntries] = useState<JackpotEntry[]>([]);\n\n  // Fetch entries for the card carousel\n  useEffect(() => {\n    client.getJackpotEntries()\n      .then(res => setEntries(res.entries))\n      .catch(() => {});\n  }, [client, round?.entryCount]);\n\n  return (\n    <>\n      <JackpotCard\n        round={round}\n        lastWinner={lastWinner}\n        entries={entries}\n        onPress={() => setSheetVisible(true)}\n        style={style}\n      />\n      <JackpotSheet\n        visible={sheetVisible}\n        onDismiss={() => setSheetVisible(false)}\n        onSuccess={(result) => {\n          onEntry?.(result);\n          // Refresh entries after entry\n          client.getJackpotEntries()\n            .then(res => setEntries(res.entries))\n            .catch(() => {});\n        }}\n        onError={onError}\n        minEntry={minEntry}\n        maxEntry={maxEntry}\n      />\n    </>\n  );\n}\n","import React, { createContext, useContext, useEffect, useRef, useState, useCallback, useMemo } from 'react';\nimport { AppState, type AppStateStatus } from 'react-native';\nimport { useDubs } from '../provider';\nimport { ChatSocket } from './socket';\nimport type {\n  ChatMessage,\n  OnlineUser,\n  ChatConnectionStatus,\n  Conversation,\n  FriendUser,\n  FriendRequest,\n  SentFriendRequest,\n  DirectMessage,\n  ChatNotification,\n} from './types';\nimport type { WhatsNewPost } from '../types';\n\nexport interface ChatContextValue {\n  /** The underlying socket manager */\n  socket: ChatSocket;\n  /** Connection status */\n  status: ChatConnectionStatus;\n  /** Global chat messages (newest last) */\n  messages: ChatMessage[];\n  /** Currently online users */\n  onlineUsers: OnlineUser[];\n  /** Online user count */\n  onlineCount: number;\n  /** Unread notification count */\n  unreadCount: number;\n  /** DM conversations */\n  conversations: Conversation[];\n  /** Friends list */\n  friends: FriendUser[];\n  /** Pending friend requests (received) */\n  pendingRequests: FriendRequest[];\n  /** Pending friend requests this user has sent (still awaiting response) */\n  sentFriendRequests: SentFriendRequest[];\n  /** Reload messages from REST */\n  refreshMessages: () => Promise<void>;\n  /** Reload conversations from REST */\n  refreshConversations: () => Promise<void>;\n  /** Reload friends from REST */\n  refreshFriends: () => Promise<void>;\n  /** Reload pending friend requests (received) from REST */\n  refreshPendingRequests: () => Promise<void>;\n  /** Reload pending friend requests (sent) from REST */\n  refreshSentFriendRequests: () => Promise<void>;\n  /** What's New posts for this app */\n  whatsNewPosts: WhatsNewPost[];\n  /** Number of unread What's New posts */\n  whatsNewUnreadCount: number;\n  /** Reload What's New posts + unread count from REST */\n  refreshWhatsNew: () => Promise<void>;\n}\n\nconst ChatContext = createContext<ChatContextValue | null>(null);\n\nexport interface ChatProviderProps {\n  children: React.ReactNode;\n  /** Set to false to disable auto-connect on mount. Default: true */\n  autoConnect?: boolean;\n}\n\n/**\n * Provides chat, DM, and social context to child components.\n * Must be rendered inside a <DubsProvider>.\n */\nexport function ChatProvider({ children, autoConnect = true }: ChatProviderProps) {\n  const { client } = useDubs();\n  const socketRef = useRef(new ChatSocket());\n\n  const [status, setStatus] = useState<ChatConnectionStatus>('disconnected');\n  const [messages, setMessages] = useState<ChatMessage[]>([]);\n  const [onlineUsers, setOnlineUsers] = useState<OnlineUser[]>([]);\n  const [onlineCount, setOnlineCount] = useState(0);\n  const [unreadCount, setUnreadCount] = useState(0);\n  const [conversations, setConversations] = useState<Conversation[]>([]);\n  const [friends, setFriends] = useState<FriendUser[]>([]);\n  const [pendingRequests, setPendingRequests] = useState<FriendRequest[]>([]);\n  const [sentFriendRequests, setSentFriendRequests] = useState<SentFriendRequest[]>([]);\n  const [whatsNewPosts, setWhatsNewPosts] = useState<WhatsNewPost[]>([]);\n  const [whatsNewUnreadCount, setWhatsNewUnreadCount] = useState(0);\n\n  // ── REST loaders ──\n\n  const refreshMessages = useCallback(async () => {\n    try {\n      const res = await client.getChatMessages({ limit: 30 });\n      // The dev API returns messages oldest-first (chatService applies a\n      // .reverse() for legacy chat-order callers). Inverted chat FlatLists\n      // — and onNewMessage's prepend below — assume newest-first. Flip\n      // here so the internal store is consistent everywhere.\n      setMessages([...res.messages].reverse());\n    } catch (err) {\n      console.error('[Dubs:ChatProvider] Failed to load messages:', err);\n    }\n  }, [client]);\n\n  const refreshConversations = useCallback(async () => {\n    try {\n      const res = await client.getConversations();\n      setConversations(res.conversations);\n    } catch (_) {\n      // DM service may not be deployed yet — silent fail\n    }\n  }, [client]);\n\n  const refreshFriends = useCallback(async () => {\n    try {\n      const res = await client.getFriends();\n      setFriends(res.friends);\n    } catch (_) {\n      // Social service may not be deployed yet — silent fail\n    }\n  }, [client]);\n\n  const refreshPendingRequests = useCallback(async () => {\n    try {\n      const res = await client.getPendingFriendRequests();\n      setPendingRequests(res.requests);\n    } catch (_) {\n      // Social service may not be deployed yet — silent fail\n    }\n  }, [client]);\n\n  const refreshSentFriendRequests = useCallback(async () => {\n    try {\n      const res = await client.getSentFriendRequests();\n      setSentFriendRequests(res.requests);\n    } catch (_) {\n      // Server may not yet expose /social/friend-requests/sent — silent fail\n    }\n  }, [client]);\n\n  const refreshWhatsNew = useCallback(async () => {\n    try {\n      const res = await client.getWhatsNewPosts();\n      setWhatsNewPosts(res.posts);\n      // Count unread from the same payload (avoids a second roundtrip)\n      const unread = res.posts.filter((p: WhatsNewPost) => !p.is_read).length;\n      setWhatsNewUnreadCount(unread);\n    } catch (_) {\n      // Server may not yet expose /whats-new endpoints — silent fail\n    }\n  }, [client]);\n\n  // ── Socket setup ──\n\n  useEffect(() => {\n    const token = client.getToken();\n    if (!autoConnect || !token) return;\n\n    const chatSocket = socketRef.current;\n\n    // Derive host from client baseUrl: strip /api/developer/v1\n    const baseUrl = (client as any).baseUrl as string;\n    const host = new URL(baseUrl).origin;\n\n    chatSocket.setListeners({\n      // Refetch the message list whenever the socket reaches 'connected'.\n      // Covers both the initial connect AND every reconnect (app resumed\n      // from background, transient network blip, server restart). Without\n      // this, the provider's `messages` state is frozen at whatever it was\n      // when the app last connected — Socket.IO's auto-reconnect resumes\n      // delivery of *new* events but does not replay the gap.\n      onConnectionChange: (next) => {\n        setStatus(next);\n        if (next === 'connected') {\n          refreshMessages().catch(() => {});\n          refreshConversations().catch(() => {});\n        }\n      },\n      // Global chat\n      onNewMessage: (msg) => {\n        setMessages((prev) => {\n          // Deduplicate by id\n          if (prev.some((m) => m.id === msg.id)) return prev;\n          // Prepend — newest-first for inverted FlatList\n          return [msg, ...prev];\n        });\n      },\n      onOnlineUsers: setOnlineUsers,\n      onOnlineCount: setOnlineCount,\n      onUnreadCount: setUnreadCount,\n      // Notifications trigger conversation refresh\n      onDMNotification: () => {\n        refreshConversations();\n      },\n      onNotification: (n: ChatNotification) => {\n        setUnreadCount((prev) => prev + 1);\n        // Refresh relevant lists on social notifications\n        if (n.type === 'friend_request') refreshPendingRequests();\n        if (n.type === 'friend_request_accepted') {\n          refreshFriends();\n          refreshSentFriendRequests();\n        }\n        if (n.type === 'friend_request_declined') refreshSentFriendRequests();\n        // What's New posts: a developer published a new one for this app\n        if (n.type === 'whats_new') refreshWhatsNew();\n      },\n      // These events now fan out to BOTH parties (server emits to actor's\n      // own room as well), so each handler refreshes every list that could\n      // be affected — works whether this client is the actor or the target.\n      onFriendRequestAccepted: () => {\n        refreshFriends();\n        refreshPendingRequests();\n        refreshSentFriendRequests();\n      },\n      onFriendRequestDeclined: () => {\n        refreshPendingRequests();\n        refreshSentFriendRequests();\n      },\n      onFriendRequestCancelled: () => {\n        refreshPendingRequests();\n        refreshSentFriendRequests();\n      },\n      onFriendRemoved: () => refreshFriends(),\n    });\n\n    chatSocket.connect({ host, token });\n\n    // Load initial data — friends/social loaded silently (may not be deployed yet)\n    refreshMessages();\n    refreshFriends().catch(() => {});\n    refreshPendingRequests().catch(() => {});\n    refreshSentFriendRequests().catch(() => {});\n    refreshWhatsNew().catch(() => {});\n\n    return () => {\n      chatSocket.disconnect();\n    };\n  }, [client, autoConnect, refreshMessages, refreshConversations, refreshFriends, refreshPendingRequests, refreshSentFriendRequests, refreshWhatsNew]);\n\n  // ── Reconnect on app foreground ──\n\n  useEffect(() => {\n    const handleAppState = (nextState: AppStateStatus) => {\n      if (nextState === 'active') {\n        const chatSocket = socketRef.current;\n        if (!chatSocket.isConnected()) {\n          const token = client.getToken();\n          if (token) {\n            const baseUrl = (client as any).baseUrl as string;\n            const host = new URL(baseUrl).origin;\n            chatSocket.connect({ host, token });\n          }\n        }\n        // Refresh all key data to catch up on socket events that fired\n        // while the app was backgrounded (declines, accepts, cancels,\n        // new requests, friend removals, etc.)\n        refreshMessages();\n        refreshConversations().catch(() => {});\n        refreshFriends().catch(() => {});\n        refreshPendingRequests().catch(() => {});\n        refreshSentFriendRequests().catch(() => {});\n        refreshWhatsNew().catch(() => {});\n      }\n    };\n\n    const sub = AppState.addEventListener('change', handleAppState);\n    return () => sub.remove();\n  }, [client, refreshMessages, refreshConversations, refreshFriends, refreshPendingRequests, refreshSentFriendRequests, refreshWhatsNew]);\n\n  const value = useMemo<ChatContextValue>(\n    () => ({\n      socket: socketRef.current,\n      status,\n      messages,\n      onlineUsers,\n      onlineCount,\n      unreadCount,\n      conversations,\n      friends,\n      pendingRequests,\n      sentFriendRequests,\n      whatsNewPosts,\n      whatsNewUnreadCount,\n      refreshMessages,\n      refreshConversations,\n      refreshFriends,\n      refreshPendingRequests,\n      refreshSentFriendRequests,\n      refreshWhatsNew,\n    }),\n    [status, messages, onlineUsers, onlineCount, unreadCount, conversations, friends, pendingRequests, sentFriendRequests, whatsNewPosts, whatsNewUnreadCount, refreshMessages, refreshConversations, refreshFriends, refreshPendingRequests, refreshSentFriendRequests, refreshWhatsNew],\n  );\n\n  return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>;\n}\n\n/** Access the chat context. Must be used inside <ChatProvider>. */\nexport function useChatContext(): ChatContextValue {\n  const ctx = useContext(ChatContext);\n  if (!ctx) {\n    throw new Error('useChatContext must be used inside a <ChatProvider>');\n  }\n  return ctx;\n}\n","import { io, Socket } from 'socket.io-client';\nimport type {\n  ChatMessage,\n  OnlineUser,\n  ChatNotification,\n  ChatConnectionStatus,\n  DirectMessage,\n  SendMessageParams,\n  SendDMParams,\n} from './types';\n\nexport interface ChatSocketConfig {\n  /** Server origin, e.g. \"https://dubs-server-prod-xxx.herokuapp.com\" */\n  host: string;\n  /** JWT token for authentication */\n  token: string;\n}\n\nexport interface ChatSocketListeners {\n  onConnectionChange?: (status: ChatConnectionStatus) => void;\n  // Global chat\n  onNewMessage?: (message: ChatMessage) => void;\n  onOnlineUsers?: (users: OnlineUser[]) => void;\n  onOnlineCount?: (count: number) => void;\n  onTyping?: (data: { userId: number; username: string; walletAddress: string; isTyping: boolean }) => void;\n  onReactionAdded?: (data: { messageId: number; userId: number; reaction: string; walletAddress: string }) => void;\n  onReactionRemoved?: (data: { messageId: number; userId: number; reaction: string }) => void;\n  // Notifications\n  onNotification?: (notification: ChatNotification) => void;\n  onUnreadCount?: (count: number) => void;\n  // DMs\n  onDMNewMessage?: (message: DirectMessage) => void;\n  onDMMessageSent?: (message: DirectMessage) => void;\n  onDMNotification?: (data: { senderId: number; senderUsername: string; senderAvatar: string | null; senderWallet: string; preview: string; createdAt: string }) => void;\n  onDMMessagesRead?: (data: { readBy: number; readByWallet: string }) => void;\n  // Social\n  onFriendRequestAccepted?: (data: { requestId: number; acceptedBy: number; acceptedByUsername: string }) => void;\n  onFriendRequestDeclined?: (data: { requestId: number; declinedBy: number }) => void;\n  /** Recipient-side: the original sender cancelled a pending friend request */\n  onFriendRequestCancelled?: (data: { requestId: number; cancelledBy: number }) => void;\n  onFriendRemoved?: (data: { removedBy: number }) => void;\n  // Errors\n  onError?: (error: { message: string }) => void;\n}\n\n/**\n * Manages the Socket.IO connection to the Dubs chat namespace.\n */\nexport class ChatSocket {\n  private socket: Socket | null = null;\n  private listeners: ChatSocketListeners = {};\n\n  /** Set event listeners. Call before or after connect. */\n  setListeners(listeners: ChatSocketListeners): void {\n    this.listeners = listeners;\n  }\n\n  /** Connect to the /chat namespace */\n  connect(config: ChatSocketConfig): void {\n    if (this.socket?.connected) {\n      console.log('[Dubs:ChatSocket] Already connected');\n      return;\n    }\n\n    this.listeners.onConnectionChange?.('connecting');\n\n    console.log(`[Dubs:ChatSocket] Connecting to ${config.host}/chat`);\n\n    this.socket = io(`${config.host}/chat`, {\n      auth: { token: config.token },\n      transports: ['websocket'],\n      reconnection: true,\n      reconnectionDelay: 1000,\n      reconnectionAttempts: 10,\n    });\n\n    this.socket.on('connect', () => {\n      console.log('[Dubs:ChatSocket] Connected');\n      this.listeners.onConnectionChange?.('connected');\n    });\n\n    this.socket.on('disconnect', (reason) => {\n      console.log('[Dubs:ChatSocket] Disconnected:', reason);\n      this.listeners.onConnectionChange?.('disconnected');\n    });\n\n    this.socket.on('connect_error', (error) => {\n      console.error('[Dubs:ChatSocket] Connection error:', error.message);\n      this.listeners.onConnectionChange?.('error');\n    });\n\n    // Global chat events\n    this.socket.on('new_message', (msg: ChatMessage) => this.listeners.onNewMessage?.(msg));\n    this.socket.on('online_users', (users: OnlineUser[]) => this.listeners.onOnlineUsers?.(users));\n    this.socket.on('online_count', (count: number) => this.listeners.onOnlineCount?.(count));\n    this.socket.on('user_typing', (data: any) => this.listeners.onTyping?.(data));\n    this.socket.on('reaction_added', (data: any) => this.listeners.onReactionAdded?.(data));\n    this.socket.on('reaction_removed', (data: any) => this.listeners.onReactionRemoved?.(data));\n\n    // Notifications\n    this.socket.on('notification', (n: ChatNotification) => this.listeners.onNotification?.(n));\n    this.socket.on('unread_count', (count: number) => this.listeners.onUnreadCount?.(count));\n\n    // DM events\n    this.socket.on('dm:new_message', (msg: DirectMessage) => this.listeners.onDMNewMessage?.(msg));\n    this.socket.on('dm:message_sent', (msg: DirectMessage) => this.listeners.onDMMessageSent?.(msg));\n    this.socket.on('dm:notification', (data: any) => this.listeners.onDMNotification?.(data));\n    this.socket.on('dm:messages_read', (data: any) => this.listeners.onDMMessagesRead?.(data));\n\n    // Social events\n    this.socket.on('friend_request_accepted', (data: any) => this.listeners.onFriendRequestAccepted?.(data));\n    this.socket.on('friend_request_declined', (data: any) => this.listeners.onFriendRequestDeclined?.(data));\n    this.socket.on('friend_request_cancelled', (data: any) => this.listeners.onFriendRequestCancelled?.(data));\n    this.socket.on('friend_removed', (data: any) => this.listeners.onFriendRemoved?.(data));\n\n    // Error\n    this.socket.on('error', (err: { message: string }) => this.listeners.onError?.(err));\n  }\n\n  /** Disconnect from the chat namespace */\n  disconnect(): void {\n    if (this.socket) {\n      console.log('[Dubs:ChatSocket] Disconnecting');\n      this.socket.removeAllListeners();\n      this.socket.disconnect();\n      this.socket = null;\n    }\n  }\n\n  /** Whether the socket is currently connected */\n  isConnected(): boolean {\n    return this.socket?.connected ?? false;\n  }\n\n  // ── Global Chat Actions ──\n\n  /** Send a message to global chat */\n  sendMessage(params: SendMessageParams): void {\n    this.socket?.emit('send_message', params);\n  }\n\n  /** Emit typing indicator */\n  sendTyping(isTyping: boolean): void {\n    this.socket?.emit('typing', isTyping);\n  }\n\n  /** Add an emoji reaction to a message */\n  addReaction(messageId: number, reaction: string): void {\n    this.socket?.emit('add_reaction', { messageId, reaction });\n  }\n\n  /** Remove an emoji reaction from a message */\n  removeReaction(messageId: number, reaction: string): void {\n    this.socket?.emit('remove_reaction', { messageId, reaction });\n  }\n\n  // ── DM Actions ──\n\n  /** Join a DM room to receive messages in real-time */\n  joinDM(recipientWallet: string): void {\n    this.socket?.emit('dm:join', { recipientWallet });\n  }\n\n  /** Leave a DM room */\n  leaveDM(recipientWallet: string): void {\n    this.socket?.emit('dm:leave', { recipientWallet });\n  }\n\n  /** Send a direct message via socket */\n  sendDM(params: SendDMParams): void {\n    this.socket?.emit('dm:send', params);\n  }\n\n  /** Mark DMs from a sender as read */\n  markDMRead(senderWallet: string): void {\n    this.socket?.emit('dm:mark_read', { senderWallet });\n  }\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { useDubs } from '../provider';\nimport { useChatContext } from './provider';\nimport type {\n  ChatMessage,\n  OnlineUser,\n  ChatConnectionStatus,\n  Conversation,\n  DirectMessage,\n  FriendUser,\n  FriendRequest,\n  SentFriendRequest,\n  SendMessageParams,\n} from './types';\nimport type { WhatsNewPost } from '../types';\n\n// ── Connection ──\n\n/** Get the current chat connection status */\nexport function useChatStatus(): ChatConnectionStatus {\n  return useChatContext().status;\n}\n\n// ── Global Chat ──\n\n/** Get global chat messages with refetch */\nexport function useChatMessages(): {\n  messages: ChatMessage[];\n  loading: boolean;\n  refetch: () => Promise<void>;\n} {\n  const { messages, refreshMessages } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const refetch = useCallback(async () => {\n    setLoading(true);\n    await refreshMessages();\n    setLoading(false);\n  }, [refreshMessages]);\n\n  return { messages, loading, refetch };\n}\n\n/** Send a message to global chat (via socket for real-time, falls back to REST) */\nexport function useSendMessage(): {\n  send: (params: SendMessageParams) => void;\n  sendViaREST: (params: { message: string; replyToId?: number }) => Promise<void>;\n} {\n  const { socket } = useChatContext();\n  const { client } = useDubs();\n\n  const send = useCallback(\n    (params: SendMessageParams) => {\n      socket.sendMessage(params);\n    },\n    [socket],\n  );\n\n  const sendViaREST = useCallback(\n    async (params: { message: string; replyToId?: number }) => {\n      await client.sendChatMessage(params);\n    },\n    [client],\n  );\n\n  return { send, sendViaREST };\n}\n\n/** Get online users and count */\nexport function useOnlineUsers(): { users: OnlineUser[]; count: number } {\n  const { onlineUsers, onlineCount } = useChatContext();\n  return { users: onlineUsers, count: onlineCount };\n}\n\n/** Get unread notification count */\nexport function useUnreadCount(): number {\n  return useChatContext().unreadCount;\n}\n\n// ── DMs ──\n\n/** Get DM conversations inbox */\nexport function useConversations(): {\n  conversations: Conversation[];\n  loading: boolean;\n  refetch: () => Promise<void>;\n} {\n  const { conversations, refreshConversations } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const refetch = useCallback(async () => {\n    setLoading(true);\n    await refreshConversations();\n    setLoading(false);\n  }, [refreshConversations]);\n\n  return { conversations, loading, refetch };\n}\n\n/** Get DM thread with a specific user by wallet address */\nexport function useDirectMessages(recipientWallet: string): {\n  messages: DirectMessage[];\n  loading: boolean;\n  otherUser: { id: number; username: string; avatar: string | null; walletAddress: string } | null;\n  send: (message: string) => void;\n  sendViaREST: (message: string) => Promise<void>;\n  markRead: () => void;\n  refetch: () => Promise<void>;\n} {\n  const { client } = useDubs();\n  const { socket, refreshConversations } = useChatContext();\n  const [messages, setMessages] = useState<DirectMessage[]>([]);\n  const [otherUser, setOtherUser] = useState<{ id: number; username: string; avatar: string | null; walletAddress: string } | null>(null);\n  const [loading, setLoading] = useState(true);\n\n  const refetch = useCallback(async () => {\n    try {\n      setLoading(true);\n      const res = await client.getConversation(recipientWallet);\n      setMessages(res.messages);\n      setOtherUser(res.otherUser);\n    } catch (err) {\n      console.error('[Dubs:useDirectMessages] Error loading:', err);\n    } finally {\n      setLoading(false);\n    }\n  }, [client, recipientWallet]);\n\n  // Load on mount and join DM room\n  useEffect(() => {\n    refetch();\n    socket.joinDM(recipientWallet);\n    return () => {\n      socket.leaveDM(recipientWallet);\n    };\n  }, [recipientWallet, refetch, socket]);\n\n  // Listen for new DMs via socket\n  const socketRef = useRef(socket);\n  socketRef.current = socket;\n\n  useEffect(() => {\n    const currentSocket = socketRef.current;\n    const prevListeners = (currentSocket as any).listeners;\n\n    // Augment listeners to catch DM messages for this conversation\n    const originalOnDMNew = prevListeners?.onDMNewMessage;\n    currentSocket.setListeners({\n      ...prevListeners,\n      onDMNewMessage: (msg: DirectMessage) => {\n        originalOnDMNew?.(msg);\n        // Check if this message belongs to our conversation\n        if (msg.senderWallet === recipientWallet || msg.isOwn) {\n          setMessages((prev) => {\n            if (prev.some((m) => m.id === msg.id)) return prev;\n            return [...prev, msg];\n          });\n        }\n      },\n      onDMMessageSent: (msg: DirectMessage) => {\n        setMessages((prev) => {\n          if (prev.some((m) => m.id === msg.id)) return prev;\n          return [...prev, { ...msg, isOwn: true }];\n        });\n      },\n    });\n  }, [recipientWallet]);\n\n  const send = useCallback(\n    (message: string) => {\n      socket.sendDM({ recipientWallet, message });\n    },\n    [socket, recipientWallet],\n  );\n\n  const sendViaREST = useCallback(\n    async (message: string) => {\n      await client.sendDirectMessage({ recipientWallet, message });\n      await refetch();\n      await refreshConversations();\n    },\n    [client, recipientWallet, refetch, refreshConversations],\n  );\n\n  const markRead = useCallback(() => {\n    socket.markDMRead(recipientWallet);\n  }, [socket, recipientWallet]);\n\n  return { messages, loading, otherUser, send, sendViaREST, markRead, refetch };\n}\n\n// ── Social ──\n\n/** Get friends list */\nexport function useFriends(): {\n  friends: FriendUser[];\n  loading: boolean;\n  refetch: () => Promise<void>;\n} {\n  const { friends, refreshFriends } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const refetch = useCallback(async () => {\n    setLoading(true);\n    await refreshFriends();\n    setLoading(false);\n  }, [refreshFriends]);\n\n  return { friends, loading, refetch };\n}\n\n/** Get pending friend requests */\nexport function useFriendRequests(): {\n  requests: FriendRequest[];\n  loading: boolean;\n  refetch: () => Promise<void>;\n} {\n  const { pendingRequests, refreshPendingRequests } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const refetch = useCallback(async () => {\n    setLoading(true);\n    await refreshPendingRequests();\n    setLoading(false);\n  }, [refreshPendingRequests]);\n\n  return { requests: pendingRequests, loading, refetch };\n}\n\n/** Get pending friend requests this user has SENT (still awaiting response). */\nexport function useSentFriendRequests(): {\n  requests: SentFriendRequest[];\n  loading: boolean;\n  refetch: () => Promise<void>;\n} {\n  const { sentFriendRequests, refreshSentFriendRequests } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const refetch = useCallback(async () => {\n    setLoading(true);\n    await refreshSentFriendRequests();\n    setLoading(false);\n  }, [refreshSentFriendRequests]);\n\n  return { requests: sentFriendRequests, loading, refetch };\n}\n\n/** Cancel a pending friend request the current user previously sent. */\nexport function useCancelFriendRequest(): {\n  cancel: (requestId: number) => Promise<void>;\n  loading: boolean;\n} {\n  const { client } = useDubs();\n  const { refreshSentFriendRequests } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const cancel = useCallback(\n    async (requestId: number) => {\n      setLoading(true);\n      try {\n        await client.cancelFriendRequest(requestId);\n        await refreshSentFriendRequests();\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, refreshSentFriendRequests],\n  );\n\n  return { cancel, loading };\n}\n\n/** Search for users by username */\nexport function useSearchUsers(): {\n  results: FriendUser[];\n  loading: boolean;\n  search: (query: string) => Promise<void>;\n  clear: () => void;\n} {\n  const { client } = useDubs();\n  const [results, setResults] = useState<FriendUser[]>([]);\n  const [loading, setLoading] = useState(false);\n\n  const search = useCallback(\n    async (query: string) => {\n      setLoading(true);\n      try {\n        const res = await client.searchUsers(query);\n        setResults(res.results);\n      } catch (err) {\n        console.error('[Dubs:useSearchUsers] Error:', err);\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client],\n  );\n\n  const clear = useCallback(() => setResults([]), []);\n\n  return { results, loading, search, clear };\n}\n\n/** Send a friend request */\nexport function useSendFriendRequest(): {\n  send: (targetUserId: number) => Promise<void>;\n  loading: boolean;\n} {\n  const { client } = useDubs();\n  const { refreshPendingRequests } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const send = useCallback(\n    async (targetUserId: number) => {\n      setLoading(true);\n      try {\n        await client.sendFriendRequest(targetUserId);\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, refreshPendingRequests],\n  );\n\n  return { send, loading };\n}\n\n/** Accept or reject a friend request */\nexport function useRespondToFriendRequest(): {\n  accept: (requestId: number) => Promise<void>;\n  reject: (requestId: number) => Promise<void>;\n  loading: boolean;\n} {\n  const { client } = useDubs();\n  const { refreshFriends, refreshPendingRequests } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const accept = useCallback(\n    async (requestId: number) => {\n      setLoading(true);\n      try {\n        await client.acceptFriendRequest(requestId);\n        await Promise.all([refreshFriends(), refreshPendingRequests()]);\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, refreshFriends, refreshPendingRequests],\n  );\n\n  const reject = useCallback(\n    async (requestId: number) => {\n      setLoading(true);\n      try {\n        await client.rejectFriendRequest(requestId);\n        await refreshPendingRequests();\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, refreshPendingRequests],\n  );\n\n  return { accept, reject, loading };\n}\n\n// ── What's New ────────────────────────────────────────────────────────────\n\n/**\n * Read-only subscription to the calling app's What's New posts.\n *\n * Auto-refreshes via the chat socket when a new `whats_new` notification\n * arrives, so the unread badge / list update without manual refetch.\n */\nexport function useWhatsNew(): {\n  posts: WhatsNewPost[];\n  unreadCount: number;\n  loading: boolean;\n  refetch: () => Promise<void>;\n  markRead: (postIds: number[]) => Promise<void>;\n  markAllRead: () => Promise<void>;\n} {\n  const { client } = useDubs();\n  const { whatsNewPosts, whatsNewUnreadCount, refreshWhatsNew } = useChatContext();\n  const [loading, setLoading] = useState(false);\n\n  const refetch = useCallback(async () => {\n    setLoading(true);\n    try {\n      await refreshWhatsNew();\n    } finally {\n      setLoading(false);\n    }\n  }, [refreshWhatsNew]);\n\n  const markRead = useCallback(\n    async (postIds: number[]) => {\n      if (postIds.length === 0) return;\n      try {\n        await client.markWhatsNewRead(postIds);\n        await refreshWhatsNew();\n      } catch (err) {\n        console.error('[Dubs:useWhatsNew] markRead error:', err);\n      }\n    },\n    [client, refreshWhatsNew],\n  );\n\n  const markAllRead = useCallback(async () => {\n    try {\n      await client.markAllWhatsNewRead();\n      await refreshWhatsNew();\n    } catch (err) {\n      console.error('[Dubs:useWhatsNew] markAllRead error:', err);\n    }\n  }, [client, refreshWhatsNew]);\n\n  return {\n    posts: whatsNewPosts,\n    unreadCount: whatsNewUnreadCount,\n    loading,\n    refetch,\n    markRead,\n    markAllRead,\n  };\n}\n"],"mappings":"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","names":["res","createContext","useContext","useMemo","useCallback","useState","useEffect","Connection","createContext","useContext","PublicKey","Transaction","bs58","requestId","TAG","bs58","PublicKey","Transaction","jsx","TAG","createContext","useContext","React","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","StyleSheet","Platform","Image","ScrollView","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","Transaction","useState","useEffect","useCallback","useState","fetch","useCallback","useEffect","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useEffect","useState","useEffect","useState","useCallback","useRef","useContext","bs58","createContext","Platform","useContext","useState","useRef","useCallback","bs58","user","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","useRef","useEffect","Platform","useState","useRef","useCallback","Platform","useEffect","useState","useEffect","useCallback","useState","fetch","useCallback","useEffect","useState","useEffect","useCallback","useState","fetch","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useEffect","useRef","s","useRef","useState","useCallback","useState","useEffect","useCallback","useState","fetch","useCallback","useEffect","useState","useEffect","useCallback","useState","fetch","useCallback","useEffect","useState","useCallback","useState","useCallback","View","Text","TouchableOpacity","Image","StyleSheet","jsx","jsxs","View","styles","TouchableOpacity","Image","Text","StyleSheet","Fragment","jsx","jsxs","useState","useEffect","useCallback","View","Text","ActivityIndicator","TouchableOpacity","React","useRef","Image","Platform","ScrollView","StyleSheet","jsx","createContext","useMemo","useState","useEffect","Connection","useCallback","useContext","TouchableOpacity","Text","ActivityIndicator","StyleSheet","jsx","TouchableOpacity","styles","ActivityIndicator","Text","StyleSheet","useMemo","View","Text","Image","StyleSheet","jsx","jsxs","useMemo","View","styles","Image","Text","StyleSheet","View","Text","ScrollView","TouchableOpacity","ActivityIndicator","StyleSheet","Fragment","jsx","jsxs","truncateAddress","ScrollView","styles","View","TouchableOpacity","Text","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","useMemo","View","Text","TouchableOpacity","ActivityIndicator","Animated","StyleSheet","KeyboardAvoidingView","Platform","Image","ScrollView","jsx","jsxs","truncateAddress","useRef","Animated","useMemo","useState","useEffect","useCallback","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ScrollView","Image","ActivityIndicator","StyleSheet","useState","StyleSheet","View","Text","jsx","jsxs","View","styles","Text","useState","StyleSheet","useMemo","StyleSheet","View","Text","jsx","jsxs","useMemo","View","styles","Text","StyleSheet","useState","useMemo","StyleSheet","View","Text","TouchableOpacity","jsx","jsxs","useMemo","View","styles","Text","useState","TouchableOpacity","StyleSheet","useState","StyleSheet","View","Text","jsx","jsxs","View","styles","Text","useState","StyleSheet","useMemo","StyleSheet","View","Text","TouchableOpacity","ActivityIndicator","jsx","jsxs","useMemo","View","styles","Text","TouchableOpacity","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","View","Text","TextInput","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","jsx","jsxs","STATUS_LABELS","useState","useRef","Animated","useEffect","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","TextInput","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","useMemo","View","Text","Image","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","useRef","View","Text","StyleSheet","Platform","jsx","jsxs","useRef","ratio","View","styles","Text","StyleSheet","Platform","useState","View","Text","TouchableOpacity","StyleSheet","jsx","jsxs","styles","Fragment","jsx","jsxs","STATUS_LABELS","useState","useRef","Animated","useEffect","useMemo","useCallback","Modal","styles","TouchableOpacity","View","Text","KeyboardAvoidingView","Platform","Image","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","jsx","jsxs","STATUS_LABELS","useRef","Animated","useState","useEffect","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ActivityIndicator","StyleSheet","useState","useMemo","useCallback","StyleSheet","Text","TouchableOpacity","Fragment","jsx","jsxs","useState","useMemo","useCallback","TouchableOpacity","styles","Text","StyleSheet","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","Fragment","jsx","jsxs","STATUS_LABELS","useRef","Animated","useEffect","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ActivityIndicator","StyleSheet","useEffect","useRef","View","Text","TouchableOpacity","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","Image","jsx","jsxs","Text","styles","useRef","Animated","useEffect","View","Image","Modal","TouchableOpacity","KeyboardAvoidingView","Platform","StyleSheet","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","jsx","jsxs","STATUS_LABELS","formatSol","useState","useRef","Animated","useEffect","useCallback","STATUS_LABELS","jsxs","Modal","jsx","styles","TouchableOpacity","View","Text","formatSol","KeyboardAvoidingView","Platform","ActivityIndicator","StyleSheet","useEffect","useRef","View","Text","TouchableOpacity","Animated","StyleSheet","jsx","jsxs","truncateWallet","styles","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","ScrollView","FlatList","TextInput","Platform","jsx","jsxs","STATUS_LABELS","formatSOL","truncateWallet","useState","useRef","Animated","useEffect","useCallback","View","styles","Text","Modal","TouchableOpacity","ScrollView","FlatList","TextInput","ActivityIndicator","StyleSheet","Platform","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","createContext","useContext","useEffect","useRef","useState","useCallback","useMemo","jsx","createContext","useRef","useState","useCallback","useEffect","useMemo","useContext","useState","useCallback","useEffect","useRef","useState","useCallback","useEffect","useRef"]}