{"version":3,"sources":["../src/logger.ts","../src/prediction-contract-store.ts"],"names":["STACKS_MAINNET","broadcastTransaction","makeContractCall","createClient","cvToHex","cvToValue","hexToCV","errorMessage","uintCV","stringAsciiCV","receiptInfo","name","listCV","PostConditionMode","tupleCV","bufferCV","Cl"],"mappings":"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","file":"prediction-contract-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;","/**\n * Prediction Contract Store: Direct interface to the Clarity smart contract\n * \n * This module provides function wrappers for interacting with the\n * prediction market contract. It abstracts the complexity of making direct\n * contract calls and provides a cleaner interface for the rest of the application.\n * \n * Includes both read-only functions and functions for state-changing operations.\n * \n * Uses a robust client implementation with:\n * - Multiple API endpoint fallbacks\n * - API key rotation\n * - Automatic retries\n * - Request batching\n */\n\nimport { logger } from './logger';\nimport { AppError } from './logger';\nimport { STACKS_MAINNET, StacksNetwork } from '@stacks/network';\nimport { createClient, Client } from \"@stacks/blockchain-api-client\";\nimport { paths } from \"@stacks/blockchain-api-client/lib/generated/schema\";\n\n// Import the types and functions we need for contract calls\nimport {\n  makeContractCall,\n  broadcastTransaction,\n  uintCV,\n  stringAsciiCV,\n  tupleCV,\n  listCV,\n  noneCV,\n  someCV,\n  bufferCV,\n  ClarityType,\n  ClarityValue,\n  OptionalCV,\n  ResponseCV,\n  BooleanCV,\n  BufferCV,\n  StringAsciiCV,\n  UIntCV,\n  ListCV,\n  TupleCV,\n  cvToValue,\n  hexToCV,\n  cvToHex,\n  PostConditionMode,\n  TxBroadcastResult,\n  Cl,\n} from '@stacks/transactions';\n\n/**\n * API endpoints for Stacks blockchain\n * Multiple endpoints for redundancy and load balancing\n */\nconst API_ENDPOINTS = [\n  \"https://api.hiro.so/\",\n  \"https://api.mainnet.hiro.so/\",\n  \"https://stacks-node-api.mainnet.stacks.co/\",\n];\n\n// Default retry settings\nconst DEFAULT_RETRY_COUNT = 3;\nconst DEFAULT_RETRY_DELAY = 1000; // ms\n\n// Contract configuration - consistent with other stores\nconst contractConfig = {\n  contractAddress: process.env.PREDICTION_CONTRACT_ADDRESS || 'SP2ZNGJ85ENDY6QRHQ5P2D4FXKGZWCKTB2T0Z55KS',\n  contractName: process.env.PREDICTION_CONTRACT_NAME || 'blaze-welsh-predictions-v1',\n  network: STACKS_MAINNET,\n  privateKey: process.env.MARKET_CREATOR_PRIVATE_KEY || '',\n  apiKey: process.env.HIRO_API_KEY || '',\n  apiKeys: process.env.HIRO_API_KEYS ? process.env.HIRO_API_KEYS.split(',') : [],\n  apiKeyRotation: process.env.API_KEY_ROTATION || 'loop', // 'loop' or 'random'\n  retryCount: parseInt(process.env.API_RETRY_COUNT || '3', 10),\n  retryDelay: parseInt(process.env.API_RETRY_DELAY || '1000', 10),\n};\n\n// Create a logger instance for this module\nconst contractLogger = logger.child({ context: 'prediction-contract-store' });\n\n// Initialize API clients with API key rotation\nconst stacksClients: Client<paths, `${string}/${string}`>[] = [];\nlet currentClientIndex = 0;\nlet currentKeyIndex = 0;\n\n// Track metadata cache to avoid redundant calls\ninterface MetadataCache {\n  marketInfo: Map<string, { data: PredictionMarketInfo | null, timestamp: number }>;\n  receiptInfo: Map<number, { data: PredictionReceiptInfo | null, timestamp: number }>;\n  rewardQuote: Map<number, { data: PredictionRewardQuote | null, timestamp: number }>;\n  receiptOwner: Map<number, { data: string | null, timestamp: number }>;\n}\n\n// Default cache expiration time in milliseconds (15 seconds)\nconst CACHE_EXPIRATION = 15 * 1000;\n\nconst metadataCache: MetadataCache = {\n  marketInfo: new Map(),\n  receiptInfo: new Map(),\n  rewardQuote: new Map(),\n  receiptOwner: new Map()\n};\n\n/**\n * Check if cached data is still valid (not expired)\n * @param timestamp The timestamp when the data was cached\n * @returns Boolean indicating if the cache is still valid\n */\nconst isCacheValid = (timestamp: number): boolean => {\n  return Date.now() - timestamp < CACHE_EXPIRATION;\n};\n\n/**\n * Helper function to validate a broadcast result is successful\n * @param result The broadcast result to validate\n * @returns True if the transaction appears successful, false otherwise\n */\nconst isBroadcastSuccessful = (result: any): boolean => {\n  // Check for essential properties\n  if (!result.txid) {\n    return false;\n  }\n\n  // Check for error indicators in the response\n  if (result.error || result.reason) {\n    return false;\n  }\n\n  // For Stacks, check tx_status if available\n  if (result.tx_status && result.tx_status !== 'success' && result.tx_status !== 'pending') {\n    return false;\n  }\n\n  return true;\n};\n\n/**\n * Helper function to broadcast a transaction with automatic fee adjustment\n * @param transaction The transaction to broadcast\n * @param makeContractCallOptions Options to recreate the transaction with adjusted fee\n * @param logContext Context information for logging\n * @returns The broadcast result\n */\nconst broadcastWithFeeAdjustment = async (\n  transaction: any,\n  makeContractCallOptions: any,\n  logContext: Record<string, any> = {}\n): Promise<TxBroadcastResult> => {\n  try {\n    // First attempt with the provided fee\n    const result: any = await broadcastTransaction({ transaction });\n\n    // Check if the result indicates success\n    if (!isBroadcastSuccessful(result)) {\n      // If we have a txid but there's an error, log it for debugging\n      if (result.txid && (result.error || result.reason)) {\n        contractLogger.warn({\n          ...logContext,\n          txid: result.txid,\n          error: result.error,\n          reason: result.reason,\n          status: result.tx_status\n        }, 'Transaction broadcast returned a txid but has error indicators');\n      }\n\n      throw new AppError({\n        message: `Transaction broadcast failed: ${result.reason || result.error || 'Unknown error'}`,\n        context: 'prediction-contract-store',\n        code: 'BROADCAST_ERROR',\n        data: {\n          result, ...logContext,\n          error: result.error,\n          reason: result.reason,\n        }\n      })\n    }\n\n    return result;\n  } catch (error: any) {\n    // Check for fee too low error\n    if (error.data.result.reason === 'FeeTooLow' && error.data.result.reason_data) {\n      const actualFee = error.data.result.reason_data.actual || 0;\n      const expectedFee = error.data.result.reason_data.expected || 0;\n      const feePadding = 10; // Add a little extra to be safe\n\n      contractLogger.warn({\n        ...logContext,\n        error: 'Fee too low',\n        txid: error.txid,\n        actualFee,\n        expectedFee,\n        newFee: expectedFee + feePadding\n      }, 'Transaction rejected due to fee too low, retrying with adjusted fee');\n\n      // Create a new transaction with the suggested fee (plus padding)\n      const adjustedOptions = {\n        ...makeContractCallOptions,\n        fee: expectedFee + feePadding\n      };\n\n      const newTransaction = await makeContractCall(adjustedOptions);\n\n      // Try broadcasting again with the new fee\n      const retryResult: any = await broadcastTransaction({ transaction: newTransaction });\n\n      // Validate the retry result\n      if (!isBroadcastSuccessful(retryResult)) {\n        throw new AppError({\n          message: `Retry transaction broadcast failed: ${retryResult.error || retryResult.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'RETRY_BROADCAST_ERROR',\n          data: { retryResult, adjustedFee: expectedFee + feePadding, ...logContext }\n        }).log();\n      }\n\n      return retryResult;\n    }\n\n    // Re-throw other errors\n    throw error;\n  }\n};\n\n/**\n * Initialize API clients\n */\nconst initClients = () => {\n  if (stacksClients.length > 0) return; // Already initialized\n\n  for (const endpoint of API_ENDPOINTS) {\n    const client = createClient({ baseUrl: endpoint });\n\n    // Add API key handling middleware\n    client.use({\n      onRequest({ request }) {\n        const apiKeys = contractConfig.apiKeys.length\n          ? contractConfig.apiKeys\n          : contractConfig.apiKey ? [contractConfig.apiKey] : [];\n\n        if (!apiKeys.length) return;\n\n        // Get next API key based on rotation strategy\n        const rotationStrategy = contractConfig.apiKeyRotation;\n        let key: string;\n\n        if (rotationStrategy === \"random\") {\n          const randomIndex = Math.floor(Math.random() * apiKeys.length);\n          key = apiKeys[randomIndex]!;\n        } else {\n          // Default loop strategy\n          key = apiKeys[currentKeyIndex]!;\n          currentKeyIndex = (currentKeyIndex + 1) % apiKeys.length;\n        }\n        request.headers.set(\"x-api-key\", key);\n      },\n    });\n\n    stacksClients.push(client);\n  }\n\n  contractLogger.info({\n    endpointCount: API_ENDPOINTS.length,\n    apiKeyCount: contractConfig.apiKeys.length + (contractConfig.apiKey ? 1 : 0)\n  }, 'Initialized Stacks API clients');\n};\n\n/**\n * Get the next client with rotation\n */\nconst getNextClient = (): Client<paths, `${string}/${string}`> => {\n  // Initialize clients on first use\n  if (stacksClients.length === 0) {\n    initClients();\n  }\n\n  const client = stacksClients[currentClientIndex]!;\n  currentClientIndex = (currentClientIndex + 1) % stacksClients.length;\n  return client;\n};\n\n/**\n * Helper function to fetch transaction status using client with API key rotation\n */\nconst getTransactionStatus = async (txid: string): Promise<any> => {\n  try {\n    const client = getNextClient();\n\n    contractLogger.debug({ txid }, 'Getting transaction status');\n\n    try {\n      const response = await client.GET(\n        \"/extended/v1/tx/{tx_id}\",\n        { params: { path: { tx_id: txid } } }\n      );\n\n      return response.data;\n    } catch (error: any) {\n      // Handle 404 specially - might just be pending\n      if (error.status === 404) {\n        return { status: 'not_found' };\n      }\n      throw error;\n    }\n  } catch (error) {\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    contractLogger.error({ txid, error: errorMessage }, 'Error getting transaction status');\n\n    throw new AppError({\n      message: `Failed to get transaction status for ${txid}`,\n      context: 'prediction-contract-store',\n      code: 'TX_STATUS_ERROR',\n      originalError: error instanceof Error ? error : new Error(String(error)),\n      data: { txid }\n    }).log();\n  }\n};\n\n/**\n * Call a read-only contract function using client with API key rotation\n */\nconst enhancedReadOnlyCall = async <T = any>(\n  contractAddress: string,\n  contractName: string,\n  functionName: string,\n  functionArgs: ClarityValue[] = [],\n  senderAddress?: string\n): Promise<T> => {\n  const retryCount = contractConfig.retryCount;\n  const retryDelay = contractConfig.retryDelay;\n  let lastError: any;\n\n  for (let attempt = 0; attempt < retryCount; attempt++) {\n    try {\n      // Get client with API key rotation handled by middleware\n      const client = getNextClient();\n\n      contractLogger.debug({\n        contractId: `${contractAddress}.${contractName}`,\n        function: functionName,\n        attempt: attempt + 1\n      }, 'Calling read-only function');\n\n      // Convert function arguments to hex strings for API\n      const args = functionArgs.map(arg => cvToHex(arg));\n\n      // Make the contract call via API client\n      const response = await client.POST(\n        `/v2/contracts/call-read/${contractAddress}/${contractName}/${functionName}` as any,\n        {\n          body: {\n            sender: senderAddress || contractAddress,\n            arguments: args\n          }\n        }\n      );\n\n      if (!response?.data?.result) {\n        throw new Error(`No result from contract call ${functionName}`);\n      }\n\n      // Convert the hex result back to a JS object\n      const result = cvToValue(hexToCV(response.data.result)) as T;\n      return result\n\n    } catch (error) {\n      lastError = error;\n\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.warn({\n        contractId: `${contractAddress}.${contractName}`,\n        function: functionName,\n        attempt: attempt + 1,\n        maxAttempts: retryCount,\n        error: errorMessage\n      }, 'Read-only function call failed, retrying');\n\n      // Last attempt failed, wait before retrying with exponential backoff\n      if (attempt < retryCount - 1) {\n        await new Promise(resolve => setTimeout(resolve, retryDelay * Math.pow(2, attempt)));\n      }\n    }\n  }\n\n  // All attempts failed\n  const errorMessage = lastError instanceof Error ? lastError.message : String(lastError);\n  contractLogger.error({\n    contractId: `${contractAddress}.${contractName}`,\n    function: functionName,\n    attempts: retryCount,\n    error: errorMessage\n  }, 'All read-only function call attempts failed');\n\n  throw new AppError({\n    message: `Failed to call read-only function ${functionName} after ${retryCount} attempts`,\n    context: 'prediction-contract-store',\n    code: 'READ_ONLY_CALL_FAILED',\n    originalError: lastError instanceof Error ? lastError : new Error(errorMessage),\n    data: { contractAddress, contractName, functionName }\n  }).log();\n};\n\n/**\n * Helper interface for market structure in the contract\n */\nexport interface PredictionMarketInfo {\n  creator: string;\n  name: string;\n  description: string;\n  'outcome-names': string[];\n  'outcome-pools': number[];\n  'total-pool': number;\n  'is-open': boolean;\n  'is-resolved': boolean;\n  'winning-outcome': number;\n  resolver?: string;\n  'creation-time': number;\n  'resolution-time': number;\n}\n\n/**\n * Helper interface for prediction receipt information\n */\nexport interface PredictionReceiptInfo {\n  'market-id': string;\n  'outcome-id': number;\n  amount: number;\n  predictor?: string;\n}\n\n/**\n * Interface for prediction reward quote\n */\nexport interface PredictionRewardQuote {\n  dx: string; // market id\n  dy: number; // reward amount\n  dk: number; // receipt id\n}\n\n/**\n * Interface for market creation result\n */\nexport interface MarketCreationResult {\n  marketId: string;\n  creator: string;\n  creationTime: number;\n}\n\n/**\n * Interface for market resolution request\n */\nexport interface MarketResolutionRequest {\n  marketId: string;\n  winningOutcomeId: number;\n}\n\n/**\n * Interface for prediction transaction result\n */\nexport interface PredictionTransactionResult {\n  dx: string; // market id\n  dy: number; // pool amount\n  dk: number; // receipt id\n}\n\n/**\n * Interface for signed transaction parameters\n */\nexport interface SignedTransactionParams {\n  signature: string; // hex string of signature buffer\n  nonce: number;\n}\n\n/**\n * Interface for batch prediction operation\n */\nexport interface BatchPredictionOperation {\n  signet: SignedTransactionParams;\n  marketId: string;\n  outcomeId: number;\n  amount: number;\n}\n\n/**\n * Interface for batch claim reward operation\n */\nexport interface BatchClaimOperation {\n  signet: SignedTransactionParams;\n  receiptId: number;\n}\n\n/**\n * Prediction contract store with functions to query and interact with the contract\n */\nexport const predictionContractStore = {\n  /**\n   * Utility functions for managing the metadata cache\n   */\n  cache: {\n    /**\n     * Clear all metadata caches\n     */\n    clearAll(): void {\n      metadataCache.marketInfo.clear();\n      metadataCache.receiptInfo.clear();\n      metadataCache.rewardQuote.clear();\n      metadataCache.receiptOwner.clear();\n      contractLogger.info({ message: 'Cleared all metadata caches' });\n    },\n\n    /**\n     * Clear market info cache for a specific market\n     * @param marketId The ID of the market to clear from cache\n     */\n    clearMarketInfo(marketId: string): void {\n      metadataCache.marketInfo.delete(marketId);\n      contractLogger.debug({ marketId }, 'Cleared market info from cache');\n    },\n\n    /**\n     * Clear receipt info cache for a specific receipt\n     * @param receiptId The ID of the receipt to clear from cache\n     */\n    clearReceiptInfo(receiptId: number): void {\n      metadataCache.receiptInfo.delete(receiptId);\n      metadataCache.receiptOwner.delete(receiptId);\n      metadataCache.rewardQuote.delete(receiptId);\n      contractLogger.debug({ receiptId }, 'Cleared receipt data from cache');\n    },\n\n    /**\n     * Get cache statistics\n     * @returns Object with cache counts\n     */\n    getStats(): {\n      marketInfoCount: number;\n      receiptInfoCount: number;\n      rewardQuoteCount: number;\n      receiptOwnerCount: number;\n      cacheExpirationMs: number;\n    } {\n      return {\n        marketInfoCount: metadataCache.marketInfo.size,\n        receiptInfoCount: metadataCache.receiptInfo.size,\n        rewardQuoteCount: metadataCache.rewardQuote.size,\n        receiptOwnerCount: metadataCache.receiptOwner.size,\n        cacheExpirationMs: CACHE_EXPIRATION\n      };\n    }\n  },\n  /**\n   * Check if a receipt ID exists on the blockchain by checking if it has an owner\n   * @param receiptId The ID of the receipt to check\n   * @param skipCache Whether to skip the cache and force a fresh lookup\n   * @returns True if the receipt exists and has an owner, false otherwise\n   */\n  async doesReceiptExist(receiptId: number, skipCache: boolean = false): Promise<boolean> {\n    try {\n      // We can leverage the getReceiptOwner method which is already cache-aware\n      const owner = await this.getReceiptOwner(receiptId, skipCache);\n      return owner !== null;\n    } catch (error) {\n      contractLogger.error({\n        receiptId,\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error checking if receipt exists');\n\n      // Return false in case of error, assume it doesn't exist\n      return false;\n    }\n  },\n\n  /**\n   * Get the owner of a receipt from the contract\n   * @param receiptId The ID of the receipt to check\n   * @param skipCache Whether to skip the cache and force a fresh lookup\n   * @returns The principal address of the owner, or null if not found or error\n   */\n  async getReceiptOwner(receiptId: number, skipCache: boolean = false): Promise<string | null> {\n    try {\n      // Check cache first if not skipping cache\n      if (!skipCache) {\n        const cached = metadataCache.receiptOwner.get(receiptId);\n        if (cached && isCacheValid(cached.timestamp)) {\n          contractLogger.debug({ receiptId, fromCache: true }, 'Got receipt owner from cache');\n          return cached.data;\n        }\n      }\n\n      contractLogger.debug({ receiptId }, 'Getting receipt owner from chain');\n\n      const result = await enhancedReadOnlyCall(\n        contractConfig.contractAddress,\n        contractConfig.contractName,\n        'get-owner',\n        [uintCV(receiptId)]\n      );\n\n      // If we get a successful response with an owner, return the owner\n      let owner: string | null = null;\n      if (result && result.value && result.value.type !== 'none') {\n        owner = result.value.value;\n        contractLogger.debug({ receiptId, owner }, 'Found receipt owner');\n      } else {\n        contractLogger.debug({ receiptId }, 'No owner found for receipt');\n      }\n\n      // Update cache with the result\n      metadataCache.receiptOwner.set(receiptId, {\n        data: owner,\n        timestamp: Date.now()\n      });\n\n      return owner;\n    } catch (error) {\n      contractLogger.error({\n        receiptId,\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error getting receipt owner');\n\n      return null;\n    }\n  },\n\n  /**\n   * Get information about a specific market from the contract\n   * @param marketId The ID of the market to check\n   * @param skipCache Whether to skip the cache and force a fresh lookup\n   * @returns Market information or null if not found or error\n   */\n  async getMarketInfo(marketId: string, skipCache: boolean = false): Promise<PredictionMarketInfo | null> {\n    try {\n      // Check cache first if not skipping cache\n      if (!skipCache) {\n        const cached = metadataCache.marketInfo.get(marketId);\n        if (cached && isCacheValid(cached.timestamp)) {\n          contractLogger.debug({ marketId, fromCache: true }, 'Got market info from cache');\n          return cached.data;\n        }\n      }\n\n      contractLogger.debug({ marketId }, 'Getting market info from chain');\n\n      const result = await enhancedReadOnlyCall(\n        contractConfig.contractAddress,\n        contractConfig.contractName,\n        'get-market-info',\n        [stringAsciiCV(marketId)]\n      );\n\n      // If we get a successful response, parse the market info\n      let marketInfo: PredictionMarketInfo | null = null;\n      if (result) {\n        marketInfo = {\n          creator: result.value.creator.value,\n          name: result.value.name.value,\n          description: result.value.description.value,\n          'outcome-names': result.value['outcome-names'].value,\n          'outcome-pools': result.value['outcome-pools'].value,\n          'total-pool': Number(result.value['total-pool'].value),\n          'is-open': result.value['is-open'].value,\n          'is-resolved': result.value['is-resolved'].value,\n          'winning-outcome': Number(result.value['winning-outcome'].value),\n          resolver: result.value.resolver.value,\n          'creation-time': result.value['creation-time'].value,\n          'resolution-time': result.value['resolution-time'].value\n        } as PredictionMarketInfo;\n\n        contractLogger.debug({\n          marketId,\n          name: marketInfo.name,\n          isResolved: marketInfo['is-resolved']\n        }, 'Found market info');\n      } else {\n        contractLogger.debug({ marketId }, 'Market not found on chain');\n      }\n\n      // Update cache with the result\n      metadataCache.marketInfo.set(marketId, {\n        data: marketInfo,\n        timestamp: Date.now()\n      });\n\n      return marketInfo;\n    } catch (error) {\n      contractLogger.error({\n        marketId,\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error getting market info');\n\n      return null;\n    }\n  },\n\n  /**\n   * Get information about a specific prediction receipt from the contract\n   * @param receiptId The ID of the receipt to check\n   * @param skipCache Whether to skip the cache and force a fresh lookup\n   * @returns Receipt information or null if not found or error\n   */\n  async getReceiptInfo(receiptId: number, skipCache: boolean = false): Promise<PredictionReceiptInfo | null> {\n    try {\n      // Check cache first if not skipping cache\n      if (!skipCache) {\n        const cached = metadataCache.receiptInfo.get(receiptId);\n        if (cached && isCacheValid(cached.timestamp)) {\n          contractLogger.debug({ receiptId, fromCache: true }, 'Got receipt info from cache');\n          return cached.data;\n        }\n      }\n\n      contractLogger.debug({ receiptId }, 'Getting receipt info from chain');\n\n      const result = await enhancedReadOnlyCall(\n        contractConfig.contractAddress,\n        contractConfig.contractName,\n        'get-receipt-info',\n        [uintCV(receiptId)]\n      );\n\n      // If we get a successful response, parse the receipt info\n      let receiptInfo: PredictionReceiptInfo | null = null;\n      if (result.success) {\n        receiptInfo = {\n          'market-id': result.value['market-id'].value,\n          'outcome-id': result.value['outcome-id'].value,\n          amount: result.value.amount.value,\n          predictor: result.value.predictor.value\n        } as PredictionReceiptInfo;\n\n        contractLogger.debug({\n          receiptId,\n          marketId: receiptInfo['market-id'],\n          outcomeId: receiptInfo['outcome-id'],\n          predictor: receiptInfo.predictor\n        }, 'Found receipt info');\n      } else {\n        contractLogger.debug({ receiptId }, 'Receipt not found on chain');\n      }\n\n      // Update cache with the result\n      metadataCache.receiptInfo.set(receiptId, {\n        data: receiptInfo,\n        timestamp: Date.now()\n      });\n\n      return receiptInfo;\n    } catch (error) {\n      contractLogger.error({\n        receiptId,\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error getting receipt info');\n\n      return null;\n    }\n  },\n\n  /**\n   * Check if a prediction is eligible for reward based on the resolved market\n   * This calls the quote-reward function to see if there's any reward available\n   * \n   * @param receiptId The ID of the receipt to check\n   * @param skipCache Whether to skip the cache and force a fresh lookup\n   * @returns Object with reward info or null if not found or error\n   */\n  async getRewardQuote(receiptId: number, skipCache: boolean = false): Promise<PredictionRewardQuote | null> {\n    try {\n      // Check cache first if not skipping cache\n      if (!skipCache) {\n        const cached = metadataCache.rewardQuote.get(receiptId);\n        if (cached && isCacheValid(cached.timestamp)) {\n          contractLogger.debug({ receiptId, fromCache: true }, 'Got reward quote from cache');\n          return cached.data;\n        }\n      }\n\n      contractLogger.debug({ receiptId }, 'Getting reward quote from chain');\n\n      const result = await enhancedReadOnlyCall(\n        contractConfig.contractAddress,\n        contractConfig.contractName,\n        'quote-reward',\n        [uintCV(receiptId)]\n      );\n\n      // If we get a successful response, parse the reward quote\n      let quote: PredictionRewardQuote | null = null;\n      if (result) {\n        quote = {\n          dx: result.value.dx.value,\n          dy: Number(result.value.dy.value),\n          dk: Number(result.value.dk.value)\n        } as PredictionRewardQuote;\n\n        contractLogger.debug({\n          receiptId,\n          marketId: quote.dx,\n          reward: quote.dy\n        }, 'Got reward quote');\n      } else {\n        contractLogger.debug({ receiptId }, 'Failed to get reward quote');\n      }\n\n      // Update cache with the result\n      metadataCache.rewardQuote.set(receiptId, {\n        data: quote,\n        timestamp: Date.now()\n      });\n\n      return quote;\n    } catch (error) {\n      contractLogger.error({\n        receiptId,\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error getting reward quote');\n\n      return null;\n    }\n  },\n\n  /**\n   * Check if a prediction has won in a resolved market\n   * \n   * @param receiptId The ID of the receipt to check\n   * @param skipCache Whether to skip the cache and force a fresh lookup\n   * @returns Boolean indicating if the prediction is a winner (with reward > 0)\n   */\n  async isPredictionWinner(receiptId: number, skipCache: boolean = false): Promise<boolean> {\n    try {\n      // Get the reward quote to see if there's a payout\n      const quote = await this.getRewardQuote(receiptId, skipCache);\n\n      // If there's a reward and it's greater than 0, it's a winner\n      if (quote && quote.dy > 0) {\n        contractLogger.debug({\n          receiptId,\n          reward: quote.dy\n        }, 'Prediction is a winner');\n        return true;\n      }\n\n      contractLogger.debug({ receiptId }, 'Prediction is not a winner');\n      return false;\n    } catch (error) {\n      contractLogger.error({\n        receiptId,\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error checking if prediction is a winner');\n\n      return false;\n    }\n  },\n\n  /**\n   * Get the status of a prediction based on market resolution and outcome\n   * This combines multiple contract calls to determine the full status\n   * \n   * @param receiptId The ID of the receipt to check\n   * @param skipCache Whether to skip the cache and force a fresh lookup\n   * @returns 'unresolved' | 'won' | 'lost' | 'redeemed' | null (if error or not found)\n   */\n  async getPredictionStatus(receiptId: number, skipCache: boolean = false): Promise<'unresolved' | 'won' | 'lost' | 'redeemed' | null> {\n    try {\n      contractLogger.debug({ receiptId, skipCache }, 'Determining prediction status from chain');\n\n      // First check if the receipt exists (has an owner)\n      const owner = await this.getReceiptOwner(receiptId, skipCache);\n\n      // If no owner, it's been redeemed (NFT burned) or doesn't exist\n      if (!owner) {\n        // Get receipt info to check if it's just not found or was redeemed\n        const receiptInfo = await this.getReceiptInfo(receiptId, skipCache);\n\n        if (receiptInfo) {\n          contractLogger.debug({ receiptId }, 'Prediction has been redeemed (NFT burned)');\n          return 'redeemed';\n        } else {\n          contractLogger.debug({ receiptId }, 'Prediction not found on chain');\n          return null;\n        }\n      }\n\n      // If we have an owner, get the receipt info\n      const receiptInfo = await this.getReceiptInfo(receiptId, skipCache);\n      if (!receiptInfo) {\n        contractLogger.debug({ receiptId }, 'Receipt info not found even though owner exists');\n        return null;\n      }\n\n      // Get the market info to check if it's resolved\n      const marketInfo = await this.getMarketInfo(receiptInfo['market-id'], skipCache);\n      if (!marketInfo) {\n        contractLogger.debug({ receiptId, marketId: receiptInfo['market-id'] }, 'Market not found');\n        return null;\n      }\n\n      // If market isn't resolved, prediction is unresolved\n      if (!marketInfo['is-resolved']) {\n        contractLogger.debug({ receiptId, marketId: receiptInfo['market-id'] }, 'Market not resolved, prediction is unresolved');\n        return 'unresolved';\n      }\n\n      // Market is resolved, check if prediction is a winner\n      const isWinner = await this.isPredictionWinner(receiptId, skipCache);\n\n      if (isWinner) {\n        return 'won';\n      } else {\n        return 'lost';\n      }\n    } catch (error) {\n      contractLogger.error({\n        receiptId,\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error determining prediction status');\n\n      return null;\n    }\n  },\n\n  /**\n   * Get predictions that should be marked as won or lost based on market resolution\n   * This checks for receipts with 'pending' status in custody but that should be 'won' or 'lost'\n   * based on the blockchain state\n   * \n   * @param pendingIds List of receipt IDs that are currently 'pending' in custody\n   * @param skipCache Whether to skip the cache and force a fresh lookup for all predictions\n   * @returns Object containing arrays of 'won' and 'lost' IDs\n   */\n  async getStatusUpdatesForPendingPredictions(\n    pendingIds: number[],\n    skipCache: boolean = false\n  ): Promise<{\n    won: number[];\n    lost: number[];\n    errors: number[];\n  }> {\n    try {\n      contractLogger.info({\n        pendingCount: pendingIds.length,\n        skipCache\n      }, 'Getting status updates for pending predictions');\n\n      const results = {\n        won: [] as number[],\n        lost: [] as number[],\n        errors: [] as number[],\n      };\n\n      // Process in batches of 10 to avoid rate limits or timeouts\n      const batchSize = 10;\n\n      for (let i = 0; i < pendingIds.length; i += batchSize) {\n        const batch = pendingIds.slice(i, i + batchSize);\n\n        // Process each receipt in the batch concurrently\n        const statusPromises = batch.map(async (receiptId) => {\n          try {\n            // Use cached data by default for performance if not explicitly skipping cache\n            const status = await this.getPredictionStatus(receiptId, skipCache);\n            return { receiptId, status };\n          } catch (error) {\n            contractLogger.error({\n              receiptId,\n              error: error instanceof Error ? error.message : String(error)\n            }, 'Error getting prediction status in batch');\n\n            return { receiptId, status: 'error' };\n          }\n        });\n\n        // Wait for all statuses in this batch\n        const statuses = await Promise.all(statusPromises);\n\n        // Sort into appropriate categories\n        for (const { receiptId, status } of statuses) {\n          if (status === 'won') {\n            results.won.push(receiptId);\n          } else if (status === 'lost') {\n            results.lost.push(receiptId);\n          } else if (status === 'error' || status === null) {\n            results.errors.push(receiptId);\n          }\n          // Ignore 'pending' and 'redeemed' as they don't need updates\n        }\n\n        // Small delay between batches to avoid rate limiting\n        if (i + batchSize < pendingIds.length) {\n          await new Promise(resolve => setTimeout(resolve, 100));\n        }\n      }\n\n      contractLogger.info({\n        pendingCount: pendingIds.length,\n        wonCount: results.won.length,\n        lostCount: results.lost.length,\n        errorCount: results.errors.length,\n        cacheUsed: !skipCache\n      }, 'Finished getting status updates for pending predictions');\n\n      return results;\n    } catch (error) {\n      contractLogger.error({\n        error: error instanceof Error ? error.message : String(error)\n      }, 'Error getting status updates for pending predictions');\n\n      throw new AppError({\n        message: 'Failed to get status updates for pending predictions',\n        context: 'prediction-contract-store',\n        code: 'STATUS_UPDATE_ERROR',\n        originalError: error instanceof Error ? error : new Error(String(error)),\n        data: { pendingCount: pendingIds.length, skipCache }\n      }).log();\n    }\n  },\n\n  /**\n   * Create a new prediction market on the blockchain\n   * @param marketId Unique identifier for the market (max 64 ASCII chars)\n   * @param name Name of the market (max 64 ASCII chars)\n   * @param description Description of the market (max 128 ASCII chars)\n   * @param outcomeNames List of possible outcome names (max 16 outcomes, each max 32 chars)\n   * @param senderKey Private key of the sender (defaults to contract config)\n   * @returns Result of the transaction with market creation details\n   */\n  async createMarket(\n    marketId: string,\n    name: string,\n    description: string,\n    outcomeNames: string[],\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    result?: MarketCreationResult;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({\n        marketId,\n        name,\n        descriptionLength: description.length,\n        outcomeCount: outcomeNames.length\n      }, 'Creating new prediction market on-chain');\n\n      // Validate input\n      if (!marketId || !name || !description || !outcomeNames.length) {\n        throw new AppError({\n          message: 'Invalid market data',\n          context: 'prediction-contract-store',\n          code: 'INVALID_MARKET_DATA',\n          data: { marketId, name, descriptionLength: description.length, outcomeCount: outcomeNames.length }\n        }).log();\n      }\n\n      // Validate string lengths according to contract constraints\n      if (marketId.length > 64) {\n        throw new AppError({\n          message: 'Market ID exceeds maximum length of 64 ASCII characters',\n          context: 'prediction-contract-store',\n          code: 'INVALID_MARKET_ID_LENGTH',\n          data: { marketId, length: marketId.length }\n        }).log();\n      }\n\n      if (name.length > 64) {\n        throw new AppError({\n          message: 'Market name exceeds maximum length of 64 ASCII characters',\n          context: 'prediction-contract-store',\n          code: 'INVALID_MARKET_NAME_LENGTH',\n          data: { name, length: name.length }\n        }).log();\n      }\n\n      if (description.length > 128) {\n        throw new AppError({\n          message: 'Market description exceeds maximum length of 128 ASCII characters',\n          context: 'prediction-contract-store',\n          code: 'INVALID_MARKET_DESCRIPTION_LENGTH',\n          data: { descriptionLength: description.length }\n        }).log();\n      }\n\n      if (outcomeNames.length > 16) {\n        throw new AppError({\n          message: 'Too many outcomes, maximum is 16',\n          context: 'prediction-contract-store',\n          code: 'TOO_MANY_OUTCOMES',\n          data: { outcomeCount: outcomeNames.length }\n        }).log();\n      }\n\n      // Check if any outcome name is too long\n      const longOutcomes = outcomeNames.filter(name => name.length > 32);\n      if (longOutcomes.length > 0) {\n        throw new AppError({\n          message: 'One or more outcome names exceed maximum length of 32 ASCII characters',\n          context: 'prediction-contract-store',\n          code: 'INVALID_OUTCOME_NAME_LENGTH',\n          data: { longOutcomes: longOutcomes.map(name => ({ name, length: name.length })) }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'create-market',\n        functionArgs: [\n          stringAsciiCV(marketId),\n          stringAsciiCV(name),\n          stringAsciiCV(description),\n          listCV(outcomeNames.map(name => stringAsciiCV(name)))\n        ],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { marketId, name }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast market creation transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        marketId,\n        name\n      }, 'Successfully submitted market creation transaction');\n\n      // Clear the cache for this market ID if it exists\n      this.cache.clearMarketInfo(marketId);\n\n      return {\n        success: true,\n        txid: result.txid,\n        result: {\n          marketId,\n          creator: transaction.auth.spendingCondition.signer,\n          creationTime: Math.floor(Date.now() / 1000)\n        }\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        marketId,\n        error: errorMessage\n      }, 'Error creating market on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to create market: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Close a market (no more predictions allowed)\n   * @param marketId The ID of the market to close\n   * @param senderKey Private key of the sender (must be admin or deployer)\n   * @returns Result of the transaction\n   */\n  async closeMarket(\n    marketId: string,\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({ marketId }, 'Closing market on-chain');\n\n      // Validate input\n      if (!marketId) {\n        throw new AppError({\n          message: 'Invalid market ID',\n          context: 'prediction-contract-store',\n          code: 'INVALID_MARKET_ID',\n          data: { marketId }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'close-market',\n        functionArgs: [\n          stringAsciiCV(marketId)\n        ],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { marketId, operation: 'closeMarket' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast market close transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        marketId\n      }, 'Successfully submitted market close transaction');\n\n      // Clear the cache for this market ID\n      this.cache.clearMarketInfo(marketId);\n\n      return {\n        success: true,\n        txid: result.txid\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        marketId,\n        error: errorMessage\n      }, 'Error closing market on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to close market: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Resolve a market by setting the winning outcome\n   * @param marketId The ID of the market to resolve\n   * @param winningOutcomeId The ID of the winning outcome\n   * @param senderKey Private key of the sender (must be admin or deployer)\n   * @returns Result of the transaction\n   */\n  async resolveMarket(\n    marketId: string,\n    winningOutcomeId: number,\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({ marketId, winningOutcomeId }, 'Resolving market on-chain');\n\n      // Validate input\n      if (!marketId) {\n        throw new AppError({\n          message: 'Invalid market ID',\n          context: 'prediction-contract-store',\n          code: 'INVALID_MARKET_ID',\n          data: { marketId }\n        }).log();\n      }\n\n      if (winningOutcomeId < 0) {\n        throw new AppError({\n          message: 'Invalid winning outcome ID',\n          context: 'prediction-contract-store',\n          code: 'INVALID_OUTCOME_ID',\n          data: { winningOutcomeId }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'resolve-market',\n        functionArgs: [\n          stringAsciiCV(marketId),\n          uintCV(winningOutcomeId)\n        ],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { marketId, winningOutcomeId, operation: 'resolveMarket' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast market resolution transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        marketId,\n        winningOutcomeId\n      }, 'Successfully submitted market resolution transaction');\n\n      // Clear the cache for this market ID since its state has changed\n      this.cache.clearMarketInfo(marketId);\n\n      return {\n        success: true,\n        txid: result.txid\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        marketId,\n        winningOutcomeId,\n        error: errorMessage\n      }, 'Error resolving market on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to resolve market: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Make a prediction on a market outcome (direct transaction)\n   * @param marketId The ID of the market\n   * @param outcomeId The ID of the outcome being predicted\n   * @param amount The amount to stake on this prediction\n   * @param senderKey Private key of the sender\n   * @returns Result of the transaction with prediction details\n   */\n  async makePrediction(\n    marketId: string,\n    outcomeId: number,\n    amount: number,\n    senderKey: string\n  ): Promise<{\n    success: boolean;\n    result?: PredictionTransactionResult;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({\n        marketId,\n        outcomeId,\n        amount\n      }, 'Making prediction on-chain');\n\n      // Validate input\n      if (!marketId || outcomeId < 0 || amount <= 0) {\n        throw new AppError({\n          message: 'Invalid prediction data',\n          context: 'prediction-contract-store',\n          code: 'INVALID_PREDICTION_DATA',\n          data: { marketId, outcomeId, amount }\n        }).log();\n      }\n\n      if (!senderKey) {\n        throw new AppError({\n          message: 'No private key provided for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'make-prediction',\n        functionArgs: [\n          stringAsciiCV(marketId),\n          uintCV(outcomeId),\n          uintCV(amount)\n        ],\n        senderKey: senderKey,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { marketId, outcomeId, amount, operation: 'makePrediction' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast prediction transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        marketId,\n        outcomeId,\n        amount\n      }, 'Successfully submitted prediction transaction');\n\n      // We don't know the receipt ID yet - it will be assigned by the contract\n      // The receipt ID should be retrieved by monitoring the transaction result\n      return {\n        success: true,\n        txid: result.txid,\n        result: {\n          dx: marketId,\n          dy: Number(amount),\n          dk: 0 // We don't know the actual receipt ID yet\n        }\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        marketId,\n        outcomeId,\n        amount,\n        error: errorMessage\n      }, 'Error making prediction on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to make prediction: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Make a prediction using a signed transaction\n   * @param signet Signature and nonce for the transaction\n   * @param marketId The ID of the market\n   * @param outcomeId The ID of the outcome being predicted\n   * @param amount The amount to stake on this prediction\n   * @param senderKey Private key for sending the transaction (admin key)\n   * @returns Result of the transaction with prediction details\n   */\n  async signedPredict(\n    signet: SignedTransactionParams,\n    marketId: string,\n    outcomeId: number,\n    amount: number,\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    result?: PredictionTransactionResult;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({\n        marketId,\n        outcomeId,\n        amount,\n        nonce: signet.nonce\n      }, 'Making signed prediction on-chain');\n\n      // Validate input\n      if (!marketId || outcomeId < 0 || amount <= 0) {\n        throw new AppError({\n          message: 'Invalid prediction data',\n          context: 'prediction-contract-store',\n          code: 'INVALID_PREDICTION_DATA',\n          data: { marketId, outcomeId, amount }\n        }).log();\n      }\n\n      if (!signet.signature || signet.nonce === undefined) {\n        throw new AppError({\n          message: 'Invalid signet data',\n          context: 'prediction-contract-store',\n          code: 'INVALID_SIGNET',\n          data: { hasSignature: !!signet.signature, hasNonce: signet.nonce !== undefined }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'signed-predict',\n        functionArgs: [\n          tupleCV({\n            signature: bufferCV(Buffer.from(signet.signature, 'hex')),\n            nonce: uintCV(signet.nonce)\n          }),\n          stringAsciiCV(marketId),\n          uintCV(outcomeId),\n          uintCV(amount)\n        ],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { marketId, outcomeId, amount, nonce: signet.nonce, operation: 'signedPredict' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast signed prediction transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        marketId,\n        outcomeId,\n        amount,\n        nonce: signet.nonce\n      }, 'Successfully submitted signed prediction transaction');\n\n      // The receipt ID should be the same as the nonce in signed transactions\n      return {\n        success: true,\n        txid: result.txid,\n        result: {\n          dx: marketId,\n          dy: Number(amount),\n          dk: signet.nonce\n        }\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        marketId,\n        outcomeId,\n        amount,\n        nonce: signet.nonce,\n        error: errorMessage\n      }, 'Error making signed prediction on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to make signed prediction: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Claim a reward for a winning prediction\n   * @param receiptId The ID of the winning prediction receipt\n   * @param senderKey Private key of the receipt owner\n   * @returns Result of the transaction with reward details\n   */\n  async claimReward(\n    receiptId: number,\n    senderKey: string\n  ): Promise<{\n    success: boolean;\n    result?: PredictionTransactionResult;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({ receiptId }, 'Claiming prediction reward on-chain');\n\n      // Validate input\n      if (receiptId <= 0) {\n        throw new AppError({\n          message: 'Invalid receipt ID',\n          context: 'prediction-contract-store',\n          code: 'INVALID_RECEIPT_ID',\n          data: { receiptId }\n        }).log();\n      }\n\n      if (!senderKey) {\n        throw new AppError({\n          message: 'No private key provided for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'claim-reward',\n        functionArgs: [\n          uintCV(receiptId)\n        ],\n        senderKey: senderKey,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { receiptId, operation: 'claimReward' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast claim reward transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        receiptId\n      }, 'Successfully submitted claim reward transaction');\n\n      // Clear the cache for this receipt ID since its state has changed\n      this.cache.clearReceiptInfo(receiptId);\n\n      return {\n        success: true,\n        txid: result.txid,\n        result: {\n          dx: \"\", // We don't know the market ID yet\n          dy: 0,  // We don't know the reward amount yet\n          dk: receiptId\n        }\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        receiptId,\n        error: errorMessage\n      }, 'Error claiming reward on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to claim reward: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Claim a reward using a signed transaction\n   * @param signet Signature and nonce for the transaction\n   * @param receiptId The ID of the winning prediction receipt\n   * @param senderKey Private key for sending the transaction (admin key)\n   * @returns Result of the transaction with reward details\n   */\n  async signedClaimReward(\n    signet: SignedTransactionParams,\n    receiptId: number,\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    result?: PredictionTransactionResult;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({\n        receiptId,\n        nonce: signet.nonce\n      }, 'Claiming reward with signed transaction on-chain');\n\n      // Validate input\n      if (receiptId <= 0) {\n        throw new AppError({\n          message: 'Invalid receipt ID',\n          context: 'prediction-contract-store',\n          code: 'INVALID_RECEIPT_ID',\n          data: { receiptId }\n        }).log();\n      }\n\n      if (!signet.signature || signet.nonce === undefined) {\n        throw new AppError({\n          message: 'Invalid signet data',\n          context: 'prediction-contract-store',\n          code: 'INVALID_SIGNET',\n          data: { hasSignature: !!signet.signature, hasNonce: signet.nonce !== undefined }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'signed-claim-reward',\n        functionArgs: [\n          tupleCV({\n            signature: bufferCV(Buffer.from(signet.signature, 'hex')),\n            nonce: uintCV(signet.nonce)\n          }),\n          uintCV(receiptId)\n        ],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { receiptId, nonce: signet.nonce, operation: 'signedClaimReward' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast signed claim reward transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        receiptId,\n        nonce: signet.nonce\n      }, 'Successfully submitted signed claim reward transaction');\n\n      // Clear the cache for this receipt ID since its state has changed\n      this.cache.clearReceiptInfo(receiptId);\n\n      return {\n        success: true,\n        txid: result.txid,\n        result: {\n          dx: \"\", // We don't know the market ID yet\n          dy: 0,  // We don't know the reward amount yet\n          dk: receiptId\n        }\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        receiptId,\n        nonce: signet.nonce,\n        error: errorMessage\n      }, 'Error claiming reward with signed transaction on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to claim reward with signed transaction: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Process a batch of prediction operations in a single transaction\n   * @param operations Array of prediction operations to execute\n   * @param senderKey Private key for sending the transaction (admin key)\n   * @returns Result of the batch operation\n   */\n  async batchPredict(\n    operations: BatchPredictionOperation[],\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    results?: boolean[];\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({\n        operationCount: operations.length\n      }, 'Processing batch predictions on-chain');\n\n      // Validate input\n      if (!operations.length) {\n        throw new AppError({\n          message: 'No operations provided for batch processing',\n          context: 'prediction-contract-store',\n          code: 'EMPTY_BATCH',\n          data: { operationCount: 0 }\n        }).log();\n      }\n\n      // Check maximum batch size (from contract constant)\n      const MAX_BATCH_SIZE = 200; // From contract\n      if (operations.length > MAX_BATCH_SIZE) {\n        throw new AppError({\n          message: `Batch size exceeds maximum of ${MAX_BATCH_SIZE} operations`,\n          context: 'prediction-contract-store',\n          code: 'BATCH_TOO_LARGE',\n          data: { operationCount: operations.length, maxSize: MAX_BATCH_SIZE }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Transform operations into contract format\n      const operationCVs = operations.map(op => {\n        return tupleCV({\n          signet: tupleCV({\n            signature: Cl.bufferFromHex(op.signet.signature),\n            nonce: uintCV(op.signet.nonce)\n          }),\n          \"market-id\": stringAsciiCV(op.marketId),\n          \"outcome-id\": uintCV(op.outcomeId),\n          amount: uintCV(op.amount)\n        });\n      });\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'batch-predict',\n        functionArgs: [\n          listCV(operationCVs)\n        ],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        // Set fee proportional to batch size, with a higher base\n        fee: Math.min(100000, 1100 * operations.length)\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { operationCount: operations.length, operation: 'batchPredict' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast batch predict transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        operationCount: operations.length\n      }, 'Successfully submitted batch predict transaction');\n\n      // Clear market cache for all markets in the batch\n      // We use a Set to remove duplicates in case multiple predictions are for the same market\n      const uniqueMarketIds = new Set(operations.map(op => op.marketId));\n      uniqueMarketIds.forEach(marketId => {\n        this.cache.clearMarketInfo(marketId);\n      });\n\n      return {\n        success: true,\n        txid: result.txid,\n        // We don't know the actual results until the transaction is processed\n        results: Array(operations.length).fill(true)\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        operationCount: operations.length,\n        error: errorMessage\n      }, 'Error processing batch predictions on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to process batch predictions: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Process a batch of claim reward operations in a single transaction\n   * @param operations Array of claim reward operations to execute\n   * @param senderKey Private key for sending the transaction (admin key)\n   * @param waitForStatus Whether to wait for transaction status to be confirmed\n   * @returns Result of the batch operation\n   */\n  async batchClaimReward(\n    operations: BatchClaimOperation[],\n    senderKey?: string,\n    waitForStatus: boolean = false\n  ): Promise<{\n    success: boolean;\n    results?: boolean[];\n    txid?: string;\n    error?: string;\n    status?: string;\n  }> {\n    try {\n      contractLogger.info({\n        operationCount: operations.length\n      }, 'Processing batch claim rewards on-chain');\n\n      // Validate input\n      if (!operations.length) {\n        throw new AppError({\n          message: 'No operations provided for batch processing',\n          context: 'prediction-contract-store',\n          code: 'EMPTY_BATCH',\n          data: { operationCount: 0 }\n        }).log();\n      }\n\n      // Check maximum batch size (from contract constant)\n      const MAX_BATCH_SIZE = 200; // From contract\n      if (operations.length > MAX_BATCH_SIZE) {\n        throw new AppError({\n          message: `Batch size exceeds maximum of ${MAX_BATCH_SIZE} operations`,\n          context: 'prediction-contract-store',\n          code: 'BATCH_TOO_LARGE',\n          data: { operationCount: operations.length, maxSize: MAX_BATCH_SIZE }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Transform operations into contract format\n      const operationCVs = operations.map(op => {\n        return tupleCV({\n          signet: tupleCV({\n            signature: bufferCV(Buffer.from(op.signet.signature, 'hex')),\n            nonce: uintCV(op.signet.nonce)\n          }),\n          \"receipt-id\": uintCV(op.receiptId)\n        });\n      });\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'batch-claim-reward',\n        functionArgs: [\n          listCV(operationCVs)\n        ],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        // Set fee proportional to batch size, with a higher base\n        fee: Math.min(100000, 110 * operations.length)\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { operationCount: operations.length, operation: 'batchClaimReward' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast batch claim reward transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        operationCount: operations.length\n      }, 'Successfully submitted batch claim reward transaction');\n\n      // Clear cache for all receipt IDs in the batch\n      operations.forEach(op => {\n        this.cache.clearReceiptInfo(op.receiptId);\n      });\n\n      // If we want to wait for status, check the transaction with API keys\n      if (waitForStatus) {\n        try {\n          // Wait for the transaction to be confirmed - with a timeout\n          const txStatus = await getTransactionStatus(result.txid);\n\n          return {\n            success: true,\n            txid: result.txid,\n            status: txStatus.tx_status || txStatus.status,\n            results: Array(operations.length).fill(true)\n          };\n        } catch (error) {\n          // Transaction was broadcast but we couldn't get status\n          // This is not a failure, just return the txid\n          contractLogger.warn({\n            txid: result.txid,\n            error: error instanceof Error ? error.message : String(error)\n          }, 'Transaction submitted but status check failed');\n\n          return {\n            success: true,\n            txid: result.txid,\n            results: Array(operations.length).fill(true),\n            status: 'unknown'\n          };\n        }\n      }\n\n      return {\n        success: true,\n        txid: result.txid,\n        // We don't know the actual results until the transaction is processed\n        results: Array(operations.length).fill(true)\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        operationCount: operations.length,\n        error: errorMessage\n      }, 'Error processing batch claim rewards on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to process batch claim rewards: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Add an admin to the contract\n   * @param adminAddress The principal address to add as admin\n   * @param senderKey Private key of the contract deployer (required)\n   * @returns Result of the transaction\n   */\n  async addAdmin(\n    adminAddress: string,\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({ adminAddress }, 'Adding admin on-chain');\n\n      // Validate input\n      if (!adminAddress) {\n        throw new AppError({\n          message: 'Invalid admin address',\n          context: 'prediction-contract-store',\n          code: 'INVALID_ADMIN_ADDRESS',\n          data: { adminAddress }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'add-admin',\n        functionArgs: [Cl.principal(adminAddress)],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500 // Starting with higher default fee\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { adminAddress, operation: 'addAdmin' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast add admin transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        adminAddress\n      }, 'Successfully submitted add admin transaction');\n\n      return {\n        success: true,\n        txid: result.txid\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        adminAddress,\n        error: errorMessage\n      }, 'Error adding admin on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to add admin: ${errorMessage}`\n      };\n    }\n  },\n\n  /**\n   * Remove an admin from the contract\n   * @param adminAddress The principal address to remove as admin\n   * @param senderKey Private key of the contract deployer (required)\n   * @returns Result of the transaction\n   */\n  async removeAdmin(\n    adminAddress: string,\n    senderKey?: string\n  ): Promise<{\n    success: boolean;\n    txid?: string;\n    error?: string;\n  }> {\n    try {\n      contractLogger.info({ adminAddress }, 'Removing admin on-chain');\n\n      // Validate input\n      if (!adminAddress) {\n        throw new AppError({\n          message: 'Invalid admin address',\n          context: 'prediction-contract-store',\n          code: 'INVALID_ADMIN_ADDRESS',\n          data: { adminAddress }\n        }).log();\n      }\n\n      // Use provided senderKey or fall back to config\n      const key = senderKey || contractConfig.privateKey;\n      if (!key) {\n        throw new AppError({\n          message: 'No private key available for transaction',\n          context: 'prediction-contract-store',\n          code: 'NO_PRIVATE_KEY'\n        }).log();\n      }\n\n      // Prepare contract call options\n      const contractCallOptions = {\n        contractAddress: contractConfig.contractAddress,\n        contractName: contractConfig.contractName,\n        functionName: 'remove-admin',\n        functionArgs: [Cl.address(adminAddress)],\n        senderKey: key,\n        validateWithAbi: true,\n        network: contractConfig.network,\n        postConditionMode: PostConditionMode.Allow,\n        fee: 500 // Starting with higher default fee\n      };\n\n      // Create the transaction\n      const transaction = await makeContractCall(contractCallOptions);\n\n      // Broadcast the transaction with fee adjustment if needed\n      const result: any = await broadcastWithFeeAdjustment(\n        transaction,\n        contractCallOptions,\n        { adminAddress, operation: 'removeAdmin' }\n      );\n\n      // Extra validation to catch any errors that might have been missed\n      if (!isBroadcastSuccessful(result)) {\n        throw new AppError({\n          message: `Failed to broadcast remove admin transaction: ${result.error || result.reason || 'Unknown error'}`,\n          context: 'prediction-contract-store',\n          code: 'BROADCAST_ERROR',\n          data: { result }\n        }).log();\n      }\n\n      contractLogger.info({\n        txid: result.txid,\n        adminAddress\n      }, 'Successfully submitted remove admin transaction');\n\n      return {\n        success: true,\n        txid: result.txid\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      contractLogger.error({\n        adminAddress,\n        error: errorMessage\n      }, 'Error removing admin on blockchain');\n\n      if (error instanceof AppError) {\n        return {\n          success: false,\n          error: error.message\n        };\n      }\n\n      return {\n        success: false,\n        error: `Failed to remove admin: ${errorMessage}`\n      };\n    }\n  }\n};"]}