{"version":3,"sources":["../src/logger.ts","../src/kv-store.ts","../src/utils.ts","../src/user-balance-store.ts","../src/bug-report-store.ts"],"names":["kv","createClerkClient","fetchCallReadOnlyFunction","Cl","STACKS_MAINNET","ClarityType"],"mappings":"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","file":"bug-report-store.cjs","sourcesContent":["// Simple logger interface\nexport interface Logger {\n  info: (obj: Record<string, unknown>, msg?: string) => void;\n  error: (obj: Record<string, unknown>, msg?: string) => void;\n  warn: (obj: Record<string, unknown>, msg?: string) => void;\n  debug: (obj: Record<string, unknown>, msg?: string) => void;\n  child: (bindings: object) => Logger;\n}\n\n/**\n * Centralized logger configuration\n * \n * This provides consistent logging across all modules with proper\n * context and standardized error handling.\n */\n\n// Simple console-based logger factory - no external dependencies\nconst createLogger = (): Logger => {\n  // Get log level from environment or default to 'info'\n  const logLevel = process.env.LOG_LEVEL || 'info';\n  \n  // Map log levels to numeric values for comparison\n  const logLevels = {\n    debug: 0,\n    info: 1,\n    warn: 2,\n    error: 3\n  } as const;\n  \n  // Current log level\n  const currentLevelValue = logLevel in logLevels \n    ? logLevels[logLevel as keyof typeof logLevels] \n    : logLevels.info;\n  \n  // Format a log message with timestamp and metadata\n  const formatLog = (level: string, obj: Record<string, unknown>, msg?: string): string => {\n    const timestamp = new Date().toISOString();\n    const service = 'wisdom-sdk';\n    const objStr = JSON.stringify(obj);\n    return `[${timestamp}] ${level.toUpperCase()} [${service}] ${msg || ''} ${objStr}`;\n  };\n  \n  // Simple implementation using console methods\n  return {\n    debug: (obj: Record<string, unknown>, msg?: string) => {\n      if (currentLevelValue <= 0) { // debug level\n        console.debug(formatLog('debug', obj, msg));\n      }\n    },\n    info: (obj: Record<string, unknown>, msg?: string) => {\n      if (currentLevelValue <= 1) { // info level\n        console.info(formatLog('info', obj, msg));\n      }\n    },\n    warn: (obj: Record<string, unknown>, msg?: string) => {\n      if (currentLevelValue <= 2) { // warn level\n        console.warn(formatLog('warn', obj, msg));\n      }\n    },\n    error: (obj: Record<string, unknown>, msg?: string) => {\n      if (currentLevelValue <= 3) { // error level\n        console.error(formatLog('error', obj, msg));\n      }\n    },\n    child: (bindings: object) => {\n      // For child loggers, we merge the bindings with the log objects\n      const childLogger = createLogger();\n      \n      // Override methods to include the bindings\n      return {\n        debug: (obj: Record<string, unknown>, msg?: string) => \n          childLogger.debug({ ...obj, ...bindings }, msg),\n        info: (obj: Record<string, unknown>, msg?: string) => \n          childLogger.info({ ...obj, ...bindings }, msg),\n        warn: (obj: Record<string, unknown>, msg?: string) => \n          childLogger.warn({ ...obj, ...bindings }, msg),\n        error: (obj: Record<string, unknown>, msg?: string) => \n          childLogger.error({ ...obj, ...bindings }, msg),\n        child: (nestedBindings: object) => \n          childLogger.child({ ...bindings, ...nestedBindings })\n      };\n    }\n  };\n};\n\n// Default logger instance\nexport const logger = createLogger();\n\n// Create a child logger with context\nexport function getContextLogger(context: string): Logger {\n  return logger.child({ context });\n}\n\n// Error handling utilities\nexport class AppError extends Error {\n  public readonly context: string;\n  public readonly code: string;\n  public readonly originalError?: Error;\n  public readonly data?: Record<string, unknown>;\n\n  constructor({\n    message,\n    context = 'general',\n    code = 'INTERNAL_ERROR',\n    originalError,\n    data,\n  }: {\n    message: string;\n    context?: string;\n    code?: string;\n    originalError?: Error;\n    data?: Record<string, unknown>;\n  }) {\n    super(message);\n    this.name = 'AppError';\n    this.context = context;\n    this.code = code;\n    this.originalError = originalError;\n    this.data = data;\n    // Preserve stack trace\n    Error.captureStackTrace(this, this.constructor);\n  }\n\n  // Logs this error with appropriate context and returns it\n  log() {\n    const contextLogger = getContextLogger(this.context);\n    const logObj = {\n      code: this.code,\n      error: this.message,\n      ...(this.originalError && { originalError: this.originalError.message }),\n      ...(this.data && { data: this.data }),\n    };\n\n    contextLogger.error(logObj, this.message);\n    return this;\n  }\n}\n\nexport default logger;","import { kv } from '@vercel/kv';\nimport { AppError, logger } from './logger';\n\n/**\n * Centralized KV Store Helper\n * \n * This provides standardized methods for interacting with Vercel KV storage,\n * ensuring consistent key formats, serialization/deserialization, and error handling.\n * \n * Also provides transaction support to ensure data consistency for complex operations.\n */\n\n// Create a logger instance for this module\nconst kvLogger = logger.child({ context: 'kv-store' });\n\n// Define constant prefixes for all entity types\nexport const KV_PREFIXES = {\n  MARKET: 'market',\n  MARKET_IDS: 'market_ids',\n  USER_MARKETS: 'user_markets',\n  MARKET_PARTICIPANTS: 'market_participants',\n  MARKET_CATEGORY: 'market_category',  // Index for markets by category\n  MARKET_STATUS: 'market_status',      // Index for markets by status\n  PREDICTION: 'prediction',\n  USER_PREDICTIONS: 'user_predictions',\n  MARKET_PREDICTIONS: 'market_predictions',\n  PREDICTION_NFT: 'prediction_nft',\n  USER_BALANCE: 'user_balance',\n  USER_STATS: 'user_stats',\n  LEADERBOARD: 'leaderboard',\n  LEADERBOARD_EARNINGS: 'leaderboard_earnings',\n  LEADERBOARD_ACCURACY: 'leaderboard_accuracy',\n  BUG_REPORT: 'bug_report',\n  BUG_REPORT_IDS: 'bug_report_ids',\n  USER_BUG_REPORTS: 'user_bug_reports',\n  // Transaction custody-related prefixes\n  CUSTODY_TRANSACTION: 'custody_transaction',\n  CUSTODY_TRANSACTION_IDS: 'custody_transaction_ids',\n  USER_TRANSACTIONS: 'user_transactions',\n  SIGNER_TRANSACTIONS: 'signer_transactions',\n  MARKET_TRANSACTIONS: 'market_transactions',\n  CUSTODY_NFT_RECEIPT: 'custody_nft_receipt',\n  // Claim reward transaction prefixes\n  CLAIM_REWARD_TRANSACTION: 'claim_reward_transaction',\n  USER_CLAIM_REWARDS: 'user_claim_rewards'\n} as const;\n\n// Type safety for valid entity types\nexport type EntityType = keyof typeof KV_PREFIXES;\n\n/**\n * Get a formatted key for a specific entity\n */\nexport function getKey(entityType: EntityType, id?: string): string {\n  const prefix = KV_PREFIXES[entityType];\n\n  // Special handling for MARKET_IDS - it doesn't use a colon format\n  if (entityType === 'MARKET_IDS' && !id) {\n    return prefix;\n  }\n\n  return id ? `${prefix}:${id}` : prefix;\n}\n\n/**\n * Store an entity in KV\n */\nexport async function storeEntity<T>(entityType: EntityType, id: string, data: T): Promise<T> {\n  try {\n    const key = getKey(entityType, id);\n    await kv.set(key, JSON.stringify(data));\n    return data;\n  } catch (error) {\n    throw new AppError({\n      message: `Failed to store ${entityType} with ID ${id}`,\n      context: 'kv-store',\n      code: 'KV_STORE_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error)),\n      data: { entityType, id, operation: 'store' }\n    }).log();\n  }\n}\n\n/**\n * Get an entity from KV - with backward compatibility\n */\nexport async function getEntity<T>(entityType: EntityType, id: string): Promise<T | null> {\n  try {\n    // Try with new key format\n    const key = getKey(entityType, id);\n    let data = await kv.get<string>(key);\n\n    // If not found and it's a MARKET, try the old plural format (markets:id)\n    if (!data && entityType === 'MARKET') {\n      data = await kv.get<string>(`markets:${id}`);\n    }\n\n    if (!data) {\n      // Not an error, just not found\n      kvLogger.debug({ entityType, id }, `Entity not found: ${entityType}:${id}`);\n      return null;\n    }\n\n    // If data is already in object format (newer KV might handle JSON automatically)\n    if (typeof data !== 'string') {\n      return data as unknown as T;\n    }\n\n    // Parse JSON string\n    try {\n      return JSON.parse(data) as T;\n    } catch (e) {\n      throw new AppError({\n        message: `Error parsing JSON for ${entityType} with ID ${id}`,\n        context: 'kv-store',\n        code: 'KV_JSON_PARSE_ERROR',\n        originalError: e instanceof Error ? e : new Error(String(e)),\n        data: { entityType, id, operation: 'parse' }\n      }).log();\n    }\n  } catch (error) {\n    // Only throw AppError if it's not already one\n    if (error instanceof AppError) {\n      throw error;\n    }\n\n    throw new AppError({\n      message: `Failed to retrieve ${entityType} with ID ${id}`,\n      context: 'kv-store',\n      code: 'KV_RETRIEVE_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error)),\n      data: { entityType, id, operation: 'get' }\n    }).log();\n  }\n}\n\n/**\n * Delete an entity from KV\n */\nexport async function deleteEntity(entityType: EntityType, id: string): Promise<boolean> {\n  try {\n    const key = getKey(entityType, id);\n    await kv.del(key);\n\n    // If it's a MARKET, also try to delete the legacy format\n    if (entityType === 'MARKET') {\n      await kv.del(`markets:${id}`);\n    }\n\n    return true;\n  } catch (error) {\n    // Log error but don't throw - deletion errors are often non-critical\n    new AppError({\n      message: `Failed to delete ${entityType} with ID ${id}`,\n      context: 'kv-store',\n      code: 'KV_DELETE_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error)),\n      data: { entityType, id, operation: 'delete' }\n    }).log();\n\n    return false;\n  }\n}\n\n/**\n * Add an ID to a set - with backward compatibility\n */\nexport async function addToSet(setType: EntityType, id: string, memberId: string): Promise<boolean> {\n  try {\n    const key = getKey(setType, id);\n    await kv.sadd(key, memberId);\n\n    // If it's MARKET_IDS, also add to the old format for backward compatibility\n    if (setType === 'MARKET_IDS') {\n      await kv.sadd('market_ids', memberId);\n    }\n\n    return true;\n  } catch (error) {\n    new AppError({\n      message: `Failed to add member ${memberId} to set ${setType}:${id}`,\n      context: 'kv-store',\n      code: 'KV_SET_ADD_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error)),\n      data: { setType, id, memberId, operation: 'sadd' }\n    }).log();\n\n    return false;\n  }\n}\n\n/**\n * Remove an ID from a set\n */\nexport async function removeFromSet(setType: EntityType, id: string, memberId: string): Promise<boolean> {\n  try {\n    const key = getKey(setType, id);\n    await kv.srem(key, memberId);\n\n    // If it's MARKET_IDS, also remove from the old format for backward compatibility\n    if (setType === 'MARKET_IDS') {\n      await kv.srem('market_ids', memberId);\n    }\n\n    return true;\n  } catch (error) {\n    new AppError({\n      message: `Failed to remove member ${memberId} from set ${setType}:${id}`,\n      context: 'kv-store',\n      code: 'KV_SET_REMOVE_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error)),\n      data: { setType, id, memberId, operation: 'srem' }\n    }).log();\n\n    return false;\n  }\n}\n\n/**\n * Get all members of a set - with backward compatibility\n */\nexport async function getSetMembers(setType: EntityType, id: string): Promise<string[]> {\n  try {\n    const key = getKey(setType, id);\n    let members = await kv.smembers(key) as string[];\n\n    // For backward compatibility with market_ids\n    if (setType === 'MARKET_IDS' && members.length === 0) {\n      const legacyMembers = await kv.smembers('market_ids') as string[];\n      if (legacyMembers.length > 0) {\n        // Migrate the data to the new format\n        for (const marketId of legacyMembers) {\n          await addToSet('MARKET_IDS', '', marketId);\n        }\n        members = legacyMembers;\n      }\n    }\n\n    return members;\n  } catch (error) {\n    new AppError({\n      message: `Failed to get members from set ${setType}:${id}`,\n      context: 'kv-store',\n      code: 'KV_SET_MEMBERS_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error)),\n      data: { setType, id, operation: 'smembers' }\n    }).log();\n\n    return [];\n  }\n}\n\n/**\n * Check if a member is in a set\n */\nexport async function isSetMember(setType: EntityType, id: string, memberId: string): Promise<boolean> {\n  try {\n    const key = getKey(setType, id);\n    const result = await kv.sismember(key, memberId);\n    return !!result;\n  } catch (error) {\n    console.error(`Error checking set membership for ${setType} with ID ${id}:`, error);\n    return false;\n  }\n}\n\n/**\n * Add a member to a sorted set with score\n */\nexport async function addToSortedSet(setType: EntityType, memberId: string, score: number): Promise<boolean> {\n  try {\n    const key = getKey(setType);\n    await kv.zadd(key, { score, member: memberId });\n    return true;\n  } catch (error) {\n    console.error(`Error adding to sorted set ${setType}:`, error);\n    return false;\n  }\n}\n\n/**\n * Get top members from a sorted set\n */\nexport async function getTopFromSortedSet(setType: EntityType, limit: number = 10, reverse: boolean = true): Promise<string[]> {\n  try {\n    const key = getKey(setType);\n    return await kv.zrange(key, 0, limit - 1, { rev: reverse }) as string[];\n  } catch (error) {\n    console.error(`Error getting top members from sorted set ${setType}:`, error);\n    return [];\n  }\n}\n\n/**\n * Get scores for specific members from a sorted set\n * Returns a map of memberId -> score\n */\nexport async function getScoresFromSortedSet(setType: EntityType, memberIds: string[]): Promise<Record<string, number>> {\n  try {\n    const key = getKey(setType);\n    const result: Record<string, number> = {};\n\n    // Process members in batches if there are many\n    const batchSize = 50;\n    for (let i = 0; i < memberIds.length; i += batchSize) {\n      const batch = memberIds.slice(i, i + batchSize);\n\n      // Get scores for this batch\n      const batchScores = await Promise.all(\n        batch.map(async (memberId) => {\n          const score = await kv.zscore(key, memberId);\n          return { memberId, score: score ? Number(score) : null };\n        })\n      );\n\n      // Add scores to result map\n      batchScores.forEach(({ memberId, score }) => {\n        if (score !== null) {\n          result[memberId] = score;\n        }\n      });\n    }\n\n    return result;\n  } catch (error) {\n    console.error(`Error getting scores from sorted set ${setType}:`, error);\n    return {};\n  }\n}\n\n/**\n * Get all keys matching a pattern\n */\nexport async function getKeys(pattern: string): Promise<string[]> {\n  try {\n    return await kv.keys(pattern) as string[];\n  } catch (error) {\n    console.error(`Error getting keys with pattern ${pattern}:`, error);\n    return [];\n  }\n}\n\n/**\n * Check if a key exists\n */\nexport async function keyExists(entityType: EntityType, id: string): Promise<boolean> {\n  try {\n    const key = getKey(entityType, id);\n    const result = await kv.exists(key);\n    return result === 1;\n  } catch (error) {\n    console.error(`Error checking if key exists for ${entityType} with ID ${id}:`, error);\n    return false;\n  }\n}\n\n/**\n * Debug function to get information about KV store\n */\nexport async function getDebugInfo(): Promise<Record<string, unknown>> {\n  try {\n    const allKeys = await kv.keys('*');\n    const patterns = [\n      'market:*',\n      'markets:*',\n      'market_ids',\n      'prediction:*',\n      'predictions:*',\n      'user_predictions:*',\n      'market_predictions:*',\n      'prediction_nft:*',\n      'prediction_nfts:*'\n    ];\n\n    const result: Record<string, unknown> = {\n      totalKeys: allKeys.length,\n      keysByPattern: {} as Record<string, { count: number; sample: string[] }>\n    };\n\n    const keysByPattern = result.keysByPattern as Record<string, { count: number; sample: string[] }>;\n\n    for (const pattern of patterns) {\n      const keys = await kv.keys(pattern);\n      keysByPattern[pattern] = {\n        count: keys.length,\n        sample: keys.slice(0, 5) as string[]\n      };\n    }\n\n    return result;\n  } catch (error) {\n    console.error('Error getting debug info:', error);\n    return { error: String(error) };\n  }\n}\n\n/**\n * Transaction interface for atomic operations\n */\nexport interface KvTransaction {\n  operations: Array<{\n    type: 'entity' | 'set' | 'sortedSet';\n    entityType: EntityType;\n    id: string;\n    data?: unknown;\n  }>;\n  addEntity<T>(entityType: EntityType, id: string, data: T): Promise<void>;\n  addToSetInTransaction(setType: EntityType, id: string, memberId: string): Promise<void>;\n  addToSortedSetInTransaction(setType: EntityType, memberId: string, score: number): Promise<void>;\n  execute(): Promise<boolean>;\n}\n\n/**\n * Start a Redis transaction for atomic operations\n * @returns A transaction object with methods that queue commands to be executed atomically\n */\nexport async function startTransaction(): Promise<KvTransaction> {\n  try {\n    // @vercel/kv supports Redis transactions via the multi() method\n    const transaction = kv.multi();\n\n    // Track operations for potential rollback planning\n    const operations: Array<{\n      type: 'entity' | 'set' | 'sortedSet';\n      entityType: EntityType;\n      id: string;\n      data?: unknown;\n    }> = [];\n\n    const txObject: KvTransaction = {\n      operations,\n\n      // Add entity to transaction\n      async addEntity<T>(entityType: EntityType, id: string, data: T): Promise<void> {\n        const key = getKey(entityType, id);\n        transaction.set(key, JSON.stringify(data));\n        operations.push({ type: 'entity', entityType, id, data });\n      },\n\n      // Add to set in transaction\n      async addToSetInTransaction(setType: EntityType, id: string, memberId: string): Promise<void> {\n        const key = getKey(setType, id);\n        transaction.sadd(key, memberId);\n        operations.push({ type: 'set', entityType: setType, id: memberId });\n\n        // Handle backward compatibility if needed\n        if (setType === 'MARKET_IDS') {\n          transaction.sadd('market_ids', memberId);\n        }\n      },\n\n      // Add to sorted set in transaction\n      async addToSortedSetInTransaction(setType: EntityType, memberId: string, score: number): Promise<void> {\n        const key = getKey(setType);\n        transaction.zadd(key, { score, member: memberId });\n        operations.push({ type: 'sortedSet', entityType: setType, id: memberId, data: score });\n      },\n\n      // Execute all queued commands atomically\n      async execute(): Promise<boolean> {\n        try {\n          kvLogger.debug(\n            { operationCount: operations.length },\n            `Executing transaction with ${operations.length} operations`\n          );\n\n          await transaction.exec();\n          return true;\n        } catch (error) {\n          const appError = new AppError({\n            message: 'Transaction execution failed',\n            context: 'kv-store',\n            code: 'TRANSACTION_FAILED',\n            originalError: error instanceof Error ? error : new Error(String(error)),\n            data: { operationCount: operations.length }\n          });\n\n          appError.log();\n\n          // Note: Redis transactions are atomic - they either all succeed or all fail\n          // No manual rollback is needed as failed transactions don't apply any changes\n\n          return false;\n        }\n      }\n    };\n\n    return txObject;\n  } catch (error) {\n    throw new AppError({\n      message: 'Failed to start transaction',\n      context: 'kv-store',\n      code: 'TRANSACTION_START_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error))\n    }).log();\n  }\n}","/**\n * Utility functions for OP Predict\n */\n\n// Admin user IDs\nexport const ADMIN_USER_IDS = [\n  'user_2tjVcbojjJk2bkQd856eNE1Ax0S', // rozar\n  'user_2tkBcBEVGanm3LHkg6XK7j91DRj', // kraken\n];\n\n// Check if a user is an admin\nexport function isAdmin(userId: string): boolean {\n  return ADMIN_USER_IDS.includes(userId);\n}\n\n/**\n * Generates a UUID using the Web Crypto API which is available in both\n * Node.js and edge runtime environments. This replaces the Node.js-specific\n * crypto.randomUUID() function.\n * \n * @returns A UUID v4 string\n */\nexport function generateUUID(): string {\n  // Use crypto.randomUUID() from Web Crypto API if available (modern browsers and Node.js 16+)\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n\n  // Fallback implementation for environments where crypto.randomUUID() is not available\n  // Based on the RFC4122 specification for UUID v4\n  const getRandomBytes = (n: number): Uint8Array => {\n    const bytes = new Uint8Array(n);\n    if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n      crypto.getRandomValues(bytes);\n    } else {\n      // Final fallback for extremely unlikely case - not cryptographically secure\n      for (let i = 0; i < n; i++) {\n        bytes[i] = Math.floor(Math.random() * 256);\n      }\n    }\n    return bytes;\n  };\n\n  const randomBytes = getRandomBytes(16);\n\n  // Set version (4) and variant bits\n  // Use non-null assertion as we know index 6 and 8 exist in our 16-byte array\n  randomBytes[6] = (randomBytes[6]! & 0x0f) | 0x40; // version 4\n  randomBytes[8] = (randomBytes[8]! & 0x3f) | 0x80; // variant 10\n\n  // Convert to hex string with proper formatting\n  let hex = '';\n  for (let i = 0; i < 16; i++) {\n    // We know all indexes exist in our 16-byte array\n    hex += randomBytes[i]!.toString(16).padStart(2, '0');\n    if (i === 3 || i === 5 || i === 7 || i === 9) {\n      hex += '-';\n    }\n  }\n\n  return hex;\n}\n\n/**\n * Calculate outcome percentages based on staked amounts with fallback to votes\n * @param outcomes Market outcomes\n * @returns Outcomes with percentages and a flag indicating if vote-based fallback was used\n */\nexport function calculateOutcomePercentages(outcomes: { id: number; name: string; amount?: number; votes?: number }[]) {\n  // Calculate total amount staked for percentage\n  const totalAmount = outcomes.reduce((sum, outcome) => sum + (outcome.amount || 0), 0);\n  const useFallbackVotes = totalAmount === 0;\n\n  // If no amount data is available, fall back to votes\n  const totalVotes = useFallbackVotes\n    ? outcomes.reduce((sum, outcome) => sum + (outcome.votes || 0), 0)\n    : 0;\n\n  // Update percentages\n  const outcomesWithPercentages = outcomes.map(outcome => ({\n    ...outcome,\n    percentage: useFallbackVotes\n      ? (totalVotes > 0 ? Math.round(((outcome.votes || 0) / totalVotes) * 100) : 0)\n      : (totalAmount > 0 ? Math.round(((outcome.amount || 0) / totalAmount) * 100) : 0)\n  }));\n\n  return {\n    outcomesWithPercentages,\n    useFallbackVotes\n  };\n}\n\n/**\n * Safely get the base URL of the application without causing SSR issues\n * with window access\n */\nexport function getBaseUrl(): string {\n  // Check for environment variable first\n  if (process.env.NEXT_PUBLIC_APP_URL) {\n    return process.env.NEXT_PUBLIC_APP_URL;\n  }\n\n  // Then check if window is available (client-side only)\n  if (typeof window !== 'undefined') {\n    // In development, use window.location.origin\n    if (process.env.NODE_ENV === 'development') {\n      return window.location.origin;\n    }\n  }\n\n  // Default fallback for SSR and production without env var\n  return 'https://oppredict.com';\n}\n\n// Market query and search utilities\n\nexport type MarketStatus = 'active' | 'resolved' | 'cancelled' | 'closed' | 'all';\nexport type MarketType = 'binary' | 'multiple' | 'all';\nexport type SortField = 'createdAt' | 'endDate' | 'poolAmount' | 'participants';\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface MarketQueryOptions {\n  status?: MarketStatus;\n  category?: string;\n  type?: MarketType;\n  search?: string;\n  creatorId?: string;\n  limit?: number;\n  offset?: number;\n  cursor?: string;\n  sortBy?: SortField;\n  sortDirection?: SortDirection;\n  resolvedOutcomeId?: number;\n  resolvedAt?: string;\n  resolvedBy?: string;\n  adminFee?: number;\n  remainingPot?: number;\n  totalWinningAmount?: number;\n}\n\nexport interface PaginatedResult<T> {\n  items: T[];\n  total: number;\n  hasMore: boolean;\n  nextCursor?: string;\n}\n\n/**\n * Simple text search for markets\n * Searches for terms in name and description\n */\nexport function searchMarketText(market: any, searchText: string): boolean {\n  if (!searchText) return true;\n\n  const text = `${market.name} ${market.description}`.toLowerCase();\n  const terms = searchText.toLowerCase().split(/\\s+/).filter(Boolean);\n\n  return terms.every(term => text.includes(term));\n}\n\n/**\n * Filter markets by multiple criteria\n */\nexport function filterMarkets(markets: any[], options: MarketQueryOptions = {}): any[] {\n  return markets.filter(market => {\n    console.log(options.status, market.status)\n    // Status filter\n    if (options.status && options.status !== 'all' && market.status !== options.status) {\n      return false;\n    }\n\n    // Category filter\n    if (options.category && market.category !== options.category) {\n      return false;\n    }\n\n    // Type filter\n    if (options.type && options.type !== 'all' && market.type !== options.type) {\n      return false;\n    }\n\n    // Creator filter\n    if (options.creatorId && market.createdBy !== options.creatorId) {\n      return false;\n    }\n\n    // Text search\n    if (options.search && !searchMarketText(market, options.search)) {\n      return false;\n    }\n\n    return true;\n  });\n}\n\n/**\n * Sort markets by specified field and direction\n */\nexport function sortMarkets(markets: any[], sortBy: SortField = 'createdAt', sortDirection: SortDirection = 'desc'): any[] {\n  return [...markets].sort((a, b) => {\n    let comparison = 0;\n\n    // Handle different field types\n    if (sortBy === 'createdAt' || sortBy === 'endDate') {\n      const dateA = new Date(a[sortBy] || 0).getTime();\n      const dateB = new Date(b[sortBy] || 0).getTime();\n      comparison = dateA - dateB;\n    } else {\n      // Numeric fields\n      const valA = a[sortBy] || 0;\n      const valB = b[sortBy] || 0;\n      comparison = valA - valB;\n    }\n\n    // Apply sort direction\n    return sortDirection === 'asc' ? comparison : -comparison;\n  });\n}\n\n/**\n * Apply pagination to results\n */\nexport function paginateResults<T>(items: T[], options: { limit?: number; offset?: number }): PaginatedResult<T> {\n  const limit = options.limit || 20;\n  const offset = options.offset || 0;\n  const paginatedItems = items.slice(offset, offset + limit);\n\n  return {\n    items: paginatedItems,\n    total: items.length,\n    hasMore: offset + paginatedItems.length < items.length,\n    nextCursor: offset + paginatedItems.length < items.length\n      ? `${offset + limit}`\n      : undefined\n  };\n}","import { fetchCallReadOnlyFunction, Cl, ClarityType } from '@stacks/transactions';\nimport { STACKS_MAINNET } from '@stacks/network';\nimport { createClerkClient } from '@clerk/backend';\n\nconst CONTRACT_ADDRESS = 'SP2ZNGJ85ENDY6QRHQ5P2D4FXKGZWCKTB2T0Z55KS';\nconst CONTRACT_NAME = 'blaze-welsh-v1';\n\nconst clerkClient = createClerkClient({\n  secretKey: process.env.CLERK_SECRET_KEY,\n  publishableKey: process.env.CLERK_PUBLISHABLE_KEY\n});\n\n// User balance store with Clerk integration\nexport const userBalanceStore = {\n  /**\n   * Get the user's Stacks address from Clerk's publicMetadata\n   */\n  async getUserStacksAddress(userId: string): Promise<string | null> {\n    try {\n      // Get the user from Clerk\n      const user = await clerkClient.users.getUser(userId);\n\n      // Check for Stacks address in public metadata\n      if (user.publicMetadata && typeof user.publicMetadata === 'object') {\n        const metadata = user.publicMetadata as Record<string, any>;\n        if (metadata.stacksAddress) {\n          return metadata.stacksAddress as string;\n        }\n      }\n\n      // No Stacks address found\n      console.warn(`No Stacks address found for user ${userId}`);\n      return null;\n    } catch (error) {\n      console.error(`Error getting Stacks address for user ${userId}:`, error);\n      return null;\n    }\n  },\n\n  /**\n   * Fetch a user's on-chain balance from the contract\n   */\n  async fetchContractBalance(user: string): Promise<number> {\n    try {\n      const result = await fetchCallReadOnlyFunction({\n        contractAddress: CONTRACT_ADDRESS,\n        contractName: CONTRACT_NAME,\n        functionName: 'get-balance',\n        functionArgs: [Cl.principal(user)],\n        network: STACKS_MAINNET,\n        senderAddress: user\n      });\n      const balance = result.type === ClarityType.UInt ? Number(result.value) : 0;\n\n      return balance;\n    } catch (error: unknown) {\n      console.error('Failed to fetch contract balance:', error);\n      return 0;\n    }\n  },\n\n  /**\n   * Get user balance using their Clerk ID\n   * Fetches directly from blockchain if Stacks address is available\n   */\n  async getUserBalance(userId: string) {\n    try {\n      if (!userId) return null;\n\n      // Get stacks address from Clerk\n      const stacksAddress = await this.getUserStacksAddress(userId);\n\n      // Get stored balance data\n      let balance = await kvStore.getEntity('USER_BALANCE', userId);\n\n      // If no balance exists, initialize it\n      if (!balance) {\n        balance = {\n          userId,\n          availableBalance: 0,\n          totalDeposited: 0,\n          totalWithdrawn: 0,\n          inPredictions: 0,\n          lastUpdated: new Date().toISOString(),\n          stacksAddress: null\n        };\n      }\n\n      // If we have a Stacks address, update with real blockchain balance\n      if (stacksAddress) {\n        balance.stacksAddress = stacksAddress;\n        const contractBalance = await this.fetchContractBalance(stacksAddress);\n        balance.availableBalance = contractBalance;\n      }\n\n      return balance;\n    } catch (error) {\n      console.error(`Error getting user balance for ${userId}:`, error);\n      return null;\n    }\n  },\n\n  // Update user balance when making a prediction\n  async updateBalanceForPrediction(userId: string, amount: number) {\n    try {\n      const balance: any = await this.getUserBalance(userId);\n      if (!balance) return null;\n\n      // Check if user has enough balance\n      if (balance.availableBalance < amount) {\n        throw new Error('Insufficient balance');\n      }\n\n      const updatedBalance = {\n        ...balance,\n        availableBalance: balance.availableBalance - amount,\n        inPredictions: balance.inPredictions + amount,\n        lastUpdated: new Date().toISOString()\n      };\n\n      await kvStore.storeEntity('USER_BALANCE', userId, updatedBalance);\n      return updatedBalance;\n    } catch (error) {\n      console.error(`Error updating balance for prediction, user ${userId}:`, error);\n      throw error;\n    }\n  },\n\n  // Update user balance when a prediction is resolved\n  async updateBalanceForResolvedPrediction(\n    userId: string,\n    originalAmount: number,\n    winnings: number = 0\n  ) {\n    try {\n      const balance: any = await this.getUserBalance(userId);\n      if (!balance) return null;\n\n      const updatedBalance = {\n        ...balance,\n        availableBalance: balance.availableBalance + winnings,\n        inPredictions: balance.inPredictions - originalAmount,\n        lastUpdated: new Date().toISOString()\n      };\n\n      await kvStore.storeEntity('USER_BALANCE', userId, updatedBalance);\n      return updatedBalance;\n    } catch (error) {\n      console.error(`Error updating balance for resolved prediction, user ${userId}:`, error);\n      throw error;\n    }\n  },\n\n  // Add funds to user balance (for deposit functionality)\n  async addFunds(userId: string, amount: number) {\n    try {\n      const balance: any = await this.getUserBalance(userId);\n      if (!balance) return null;\n\n      const updatedBalance = {\n        ...balance,\n        availableBalance: balance.availableBalance + amount,\n        totalDeposited: balance.totalDeposited + amount,\n        lastUpdated: new Date().toISOString()\n      };\n\n      await kvStore.storeEntity('USER_BALANCE', userId, updatedBalance);\n      return updatedBalance;\n    } catch (error) {\n      console.error(`Error adding funds for user ${userId}:`, error);\n      throw error;\n    }\n  },\n\n  // Withdraw funds from user balance\n  async withdrawFunds(userId: string, amount: number) {\n    try {\n      const balance: any = await this.getUserBalance(userId);\n      if (!balance) return null;\n\n      // Check if user has enough balance\n      if (balance.availableBalance < amount) {\n        throw new Error('Insufficient balance');\n      }\n\n      const updatedBalance = {\n        ...balance,\n        availableBalance: balance.availableBalance - amount,\n        totalWithdrawn: balance.totalWithdrawn + amount,\n        lastUpdated: new Date().toISOString()\n      };\n\n      await kvStore.storeEntity('USER_BALANCE', userId, updatedBalance);\n      return updatedBalance;\n    } catch (error) {\n      console.error(`Error withdrawing funds for user ${userId}:`, error);\n      throw error;\n    }\n  },\n\n  // Force refresh a user's balance from the blockchain\n  async refreshBalance(userId: string) {\n    try {\n      const stacksAddress = await this.getUserStacksAddress(userId);\n      if (!stacksAddress) {\n        throw new Error(`No Stacks address found for user ${userId}`);\n      }\n\n      const contractBalance = await this.fetchContractBalance(stacksAddress);\n      const balance = await kvStore.getEntity('USER_BALANCE', userId) || {\n        userId,\n        availableBalance: 0,\n        totalDeposited: 0,\n        totalWithdrawn: 0,\n        inPredictions: 0,\n        lastUpdated: new Date().toISOString()\n      };\n\n      const updatedBalance = {\n        ...balance,\n        availableBalance: contractBalance,\n        stacksAddress,\n        lastUpdated: new Date().toISOString()\n      };\n\n      await kvStore.storeEntity('USER_BALANCE', userId, updatedBalance);\n      return updatedBalance;\n    } catch (error) {\n      console.error(`Error refreshing balance for user ${userId}:`, error);\n      throw error;\n    }\n  }\n};\n\nconst kvStore = {\n  async getEntity(collection: string, id: string) {\n    console.log({ collection, id });\n    // Get the user's Stacks address\n    const stacksAddress = await userBalanceStore.getUserStacksAddress(id);\n\n    let availableBalance = 0;\n    if (stacksAddress) {\n      availableBalance = await userBalanceStore.fetchContractBalance(stacksAddress);\n    }\n\n    const balance = {\n      userId: id,\n      availableBalance,\n      totalDeposited: 0,\n      totalWithdrawn: 0,\n      inPredictions: 0,\n      lastUpdated: new Date().toISOString(),\n      stacksAddress\n    };\n    return balance;\n  },\n\n  async storeEntity(collection: string, id: string, entity: any) {\n    console.log({ collection, id, entity });\n    return null;\n  }\n};","import * as kvStore from './kv-store';\nimport { generateUUID } from './utils';\nimport { AppError, logger } from './logger';\nimport { userBalanceStore } from './user-balance-store';\n\n// Create a logger instance for this module\nconst bugReportLogger = logger.child({ context: 'bug-report-store' });\n\n// Default reward amounts\nconst DEFAULT_INITIAL_REWARD = 10;\nconst DEFAULT_CONFIRMATION_REWARD = 90;\n\nexport class BugReportStore {\n  /**\n   * Get all bug reports\n   */\n  async getAllBugReports() {\n    try {\n      // Get all bug report IDs\n      const reportIds = await kvStore.getSetMembers('BUG_REPORT_IDS', '');\n\n      if (!reportIds || reportIds.length === 0) {\n        return [];\n      }\n\n      // Get all bug reports\n      const reports = await Promise.all(\n        reportIds.map(async (id) => {\n          const report = await kvStore.getEntity('BUG_REPORT', id);\n          return report;\n        })\n      );\n\n      return reports.filter((report) => report !== null);\n    } catch (error) {\n      throw new AppError({\n        message: 'Failed to retrieve bug reports',\n        context: 'bug-report-store',\n        code: 'BUG_REPORT_FETCH_ERROR',\n        originalError: error instanceof Error ? error : new Error(String(error))\n      }).log();\n    }\n  }\n\n  /**\n   * Get specific bug report by ID\n   */\n  async getBugReport(id: string) {\n    if (!id) {\n      bugReportLogger.warn({}, 'Attempted to get bug report with empty ID');\n      return null;\n    }\n\n    const report: any = await kvStore.getEntity('BUG_REPORT', id);\n\n    if (!report) {\n      bugReportLogger.debug({ reportId: id }, `Bug report ${id} not found`);\n    }\n\n    return report;\n  }\n\n  /**\n   * Get all bug reports for a specific user\n   */\n  async getUserBugReports(userId: string) {\n    try {\n      if (!userId) {\n        return [];\n      }\n\n      // Get the user's bug report IDs\n      const reportIds = await kvStore.getSetMembers('USER_BUG_REPORTS', userId);\n\n      if (reportIds.length === 0) {\n        return [];\n      }\n\n      // Get all bug reports\n      const reports = await Promise.all(\n        reportIds.map(id => this.getBugReport(id))\n      );\n\n      // Filter out any null reports (in case of data inconsistency)\n      return reports.filter((report) => report !== null);\n    } catch (error) {\n      throw new AppError({\n        message: `Failed to retrieve bug reports for user ${userId}`,\n        context: 'bug-report-store',\n        code: 'USER_BUG_REPORTS_ERROR',\n        originalError: error instanceof Error ? error : new Error(String(error)),\n        data: { userId }\n      }).log();\n    }\n  }\n\n  /**\n   * Create a new bug report\n   */\n  async createBugReport(data: {\n    title: string;\n    description: string;\n    severity: string;\n    url?: string;\n    createdBy: string;\n  }) {\n    try {\n      // Validate required fields\n      if (!data.title || !data.description || !data.createdBy) {\n        throw new AppError({\n          message: 'Missing required bug report data',\n          context: 'bug-report-store',\n          code: 'BUG_REPORT_VALIDATION_ERROR',\n          data: {\n            hasTitle: !!data.title,\n            hasDescription: !!data.description,\n            hasCreatedBy: !!data.createdBy\n          }\n        }).log();\n      }\n\n      const id = generateUUID();\n      const now = new Date().toISOString();\n\n      // Construct complete bug report with defaults\n      const bugReport = {\n        id,\n        title: data.title,\n        description: data.description,\n        severity: data.severity,\n        url: data.url,\n        createdBy: data.createdBy,\n        createdAt: now,\n        status: 'open'\n      };\n\n      // Start transaction for atomic operation\n      const tx = await kvStore.startTransaction();\n\n      try {\n        // Add all operations to transaction\n        await tx.addEntity('BUG_REPORT', id, bugReport);\n        await tx.addToSetInTransaction('BUG_REPORT_IDS', '', id);\n        await tx.addToSetInTransaction('USER_BUG_REPORTS', data.createdBy, id);\n\n        // Execute transaction\n        const success = await tx.execute();\n\n        if (!success) {\n          throw new AppError({\n            message: 'Failed to create bug report - transaction failed',\n            context: 'bug-report-store',\n            code: 'BUG_REPORT_TRANSACTION_ERROR',\n            data: { reportId: id }\n          }).log();\n        }\n\n        bugReportLogger.info(\n          { reportId: id, userId: data.createdBy },\n          `Bug report created: ${data.title}`\n        );\n\n        return bugReport;\n      } catch (error) {\n        if (error instanceof AppError) {\n          throw error;\n        } else {\n          throw new AppError({\n            message: 'Error during bug report creation transaction',\n            context: 'bug-report-store',\n            code: 'BUG_REPORT_CREATE_TRANSACTION_ERROR',\n            originalError: error instanceof Error ? error : new Error(String(error)),\n            data: { title: data.title }\n          }).log();\n        }\n      }\n    } catch (error) {\n      if (error instanceof AppError) {\n        throw error;\n      } else {\n        throw new AppError({\n          message: 'Failed to create bug report',\n          context: 'bug-report-store',\n          code: 'BUG_REPORT_CREATE_ERROR',\n          originalError: error instanceof Error ? error : new Error(String(error)),\n          data: { title: data.title }\n        }).log();\n      }\n    }\n  }\n\n  /**\n   * Update an existing bug report\n   */\n  async updateBugReport(id: string, data: any) {\n    try {\n      const existingReport = await this.getBugReport(id);\n      if (!existingReport) {\n        bugReportLogger.warn({ reportId: id }, `Cannot update non-existent bug report with ID ${id}`);\n        return null;\n      }\n\n      // Ensure we don't change critical fields like ID\n      const safeData = { ...data };\n      if (safeData.id && safeData.id !== id) {\n        delete safeData.id;\n        bugReportLogger.warn(\n          { reportId: id, attemptedId: data.id },\n          'Attempted to change bug report ID during update - ignoring'\n        );\n      }\n\n      const updatedReport = {\n        ...existingReport,\n        ...safeData,\n        updatedAt: new Date().toISOString()\n      };\n\n      // Save updated bug report\n      await kvStore.storeEntity('BUG_REPORT', id, updatedReport);\n\n      bugReportLogger.debug(\n        { reportId: id },\n        `Bug report updated: ${existingReport.title}`\n      );\n\n      return updatedReport;\n    } catch (error) {\n      throw new AppError({\n        message: `Failed to update bug report ${id}`,\n        context: 'bug-report-store',\n        code: 'BUG_REPORT_UPDATE_ERROR',\n        originalError: error instanceof Error ? error : new Error(String(error)),\n        data: { reportId: id }\n      }).log();\n    }\n  }\n\n  async deleteBugReport(id: string): Promise<boolean> {\n    try {\n      const report = await this.getBugReport(id);\n      if (!report) {\n        throw new Error(`Bug report ${id} not found`);\n      }\n\n      // Delete bug report\n      await kvStore.deleteEntity('BUG_REPORT', id);\n\n      // Remove from global set of bug report IDs\n      await kvStore.removeFromSet('BUG_REPORT_IDS', '', id);\n\n      // Remove from user's set of bug reports\n      await kvStore.removeFromSet('USER_BUG_REPORTS', report.createdBy, id);\n\n      return true;\n    } catch (error) {\n      console.error(`Error deleting bug report ${id}:`, error);\n      return false;\n    }\n  }\n\n  /**\n     * Process a reward payment for a bug report\n     * This handles giving the initial or confirmation reward to a user\n     * \n     * @param reportId Bug report ID\n     * @param userId User ID to receive the reward\n     * @param rewardType Type of reward (initial or confirmation)\n     * @param customAmount Optional custom amount (overrides defaults)\n     * @returns Result object with success/error status\n     */\n  /**\n   * Confirm a bug report (mark as verified by admin)\n   * @param id Bug report ID\n   * @param adminId ID of the admin confirming the report\n   */\n  async confirmBugReport(id: string, adminId: string) {\n    try {\n      const report = await this.getBugReport(id);\n      if (!report) {\n        bugReportLogger.warn({ reportId: id }, `Cannot confirm non-existent bug report: ${id}`);\n        return null;\n      }\n\n      if (report.status === 'resolved') {\n        bugReportLogger.warn({ reportId: id }, `Bug report ${id} is already resolved`);\n        return report;\n      }\n\n      const now = new Date().toISOString();\n      const updatedReport = await this.updateBugReport(id, {\n        status: 'resolved' as const,\n        confirmedBy: adminId,\n        confirmedAt: now,\n        updatedBy: adminId,\n        updatedAt: now\n      });\n\n      bugReportLogger.info(\n        { reportId: id, adminId },\n        `Bug report confirmed: ${report.title}`\n      );\n\n      return updatedReport;\n    } catch (error) {\n      throw new AppError({\n        message: `Failed to confirm bug report ${id}`,\n        context: 'bug-report-store',\n        code: 'BUG_REPORT_CONFIRM_ERROR',\n        originalError: error instanceof Error ? error : new Error(String(error)),\n        data: { reportId: id, adminId }\n      }).log();\n    }\n  }\n\n  /**\n   * Pay a reward for a bug report\n   * @param id Bug report ID\n   * @param isInitialReward Whether to pay the initial (true) or confirmation (false) reward\n   */\n  async payReward(id: string, isInitialReward: boolean) {\n    try {\n      // Get the bug report\n      const report = await this.getBugReport(id);\n      if (!report) {\n        bugReportLogger.warn({ reportId: id }, `Cannot pay reward for non-existent bug report: ${id}`);\n        return null;\n      }\n\n      // Determine recipient and reward type\n      const recipientId = report.createdBy;\n      const rewardType = isInitialReward ? 'initial' : 'confirmation';\n\n      // Process the payment through the internal method\n      const result = await this.processRewardPayment(id, recipientId, rewardType);\n\n      if (!result.success) {\n        throw new AppError({\n          message: result.error || 'Failed to pay reward',\n          context: 'bug-report-store',\n          code: 'REWARD_PAYMENT_FAILED',\n          data: {\n            reportId: id,\n            userId: recipientId,\n            rewardType,\n            error: result.error\n          }\n        });\n      }\n\n      return result.report || null;\n    } catch (error) {\n      if (error instanceof AppError) {\n        throw error;\n      } else {\n        throw new AppError({\n          message: `Failed to pay ${isInitialReward ? 'initial' : 'confirmation'} reward for bug report ${id}`,\n          context: 'bug-report-store',\n          code: 'REWARD_PAYMENT_ERROR',\n          originalError: error instanceof Error ? error : new Error(String(error)),\n          data: { reportId: id, isInitialReward }\n        }).log();\n      }\n    }\n  }\n\n  /**\n   * Internal helper method to process reward payments\n   * This handles giving the initial or confirmation reward to a user\n   */\n  private async processRewardPayment(\n    reportId: string,\n    userId: string,\n    rewardType: 'initial' | 'confirmation',\n    customAmount?: number\n  ): Promise<{\n    success: boolean;\n    amount?: number;\n    error?: string;\n    report?: any;\n  }> {\n    try {\n      const opLogger = bugReportLogger.child({\n        operation: 'processRewardPayment',\n        reportId,\n        userId,\n        rewardType\n      });\n\n      opLogger.info({}, `Processing ${rewardType} reward payment`);\n\n      // Get the bug report\n      const report = await this.getBugReport(reportId);\n      if (!report) {\n        return { success: false, error: 'Bug report not found' };\n      }\n\n      // Determine the reward amount\n      const amount = customAmount ||\n        (rewardType === 'initial' ? DEFAULT_INITIAL_REWARD : DEFAULT_CONFIRMATION_REWARD);\n\n      // Check if reward has already been paid\n      if (rewardType === 'initial' && report.initialRewardPaid) {\n        opLogger.warn({}, 'Initial reward already paid for this report');\n        return {\n          success: false,\n          error: 'Initial reward already paid for this report',\n          report\n        };\n      }\n\n      if (rewardType === 'confirmation' && report.confirmationRewardPaid) {\n        opLogger.warn({}, 'Confirmation reward already paid for this report');\n        return {\n          success: false,\n          error: 'Confirmation reward already paid for this report',\n          report\n        };\n      }\n\n      opLogger.debug({ amount }, `Processing payment of ${amount} tokens`);\n\n      // Process the payment\n      const updatedBalance = await userBalanceStore.addFunds(userId, amount);\n\n      if (!updatedBalance) {\n        throw new AppError({\n          message: 'Failed to update user balance',\n          context: 'bug-report-store',\n          code: 'BALANCE_UPDATE_FAILED',\n          data: { userId, amount, reportId }\n        });\n      }\n\n      // Update the bug report to reflect the paid reward\n      const updateData: any = {};\n      if (rewardType === 'initial') {\n        updateData.initialRewardPaid = true;\n      } else {\n        updateData.confirmationRewardPaid = true;\n\n        // If we're paying the confirmation reward, also update status if not already resolved\n        if (report.status !== 'resolved') {\n          updateData.status = 'resolved' as const;\n          updateData.confirmedAt = new Date().toISOString();\n        }\n      }\n\n      const updatedReport = await this.updateBugReport(reportId, updateData);\n      if (!updatedReport) {\n        throw new AppError({\n          message: 'Failed to update bug report after payment',\n          context: 'bug-report-store',\n          code: 'REPORT_UPDATE_FAILED',\n          data: { reportId, rewardType }\n        });\n      }\n\n      opLogger.info(\n        { amount, reportId, userId },\n        `Successfully processed ${rewardType} reward payment`\n      );\n\n      return {\n        success: true,\n        amount,\n        report: updatedReport\n      };\n    } catch (error) {\n      if (error instanceof AppError) {\n        error.log();\n        return { success: false, error: error.message };\n      } else {\n        const appError = new AppError({\n          message: `Error processing reward payment for report ${reportId}`,\n          context: 'bug-report-store',\n          code: 'REWARD_PROCESS_ERROR',\n          originalError: error instanceof Error ? error : new Error(String(error)),\n          data: { reportId, userId, rewardType }\n        }).log();\n\n        return { success: false, error: appError.message };\n      }\n    }\n  }\n}\n\n// Export a singleton instance\nexport const bugReportStore = new BugReportStore();"]}