{"version":3,"sources":["../src/utils/circuit-type-utils.ts","../src/configuration/network-services.ts","../src/utils/identity-secret-derivation.ts","../src/utils/schema-parser.ts","../src/configuration/provider.ts","../src/transaction/embedded-zk-config-provider.ts","../src/transaction/providers.ts","../src/types/artifacts.ts","../src/utils/zip-extractor.ts","../src/utils/artifacts.ts","../src/utils/network-id.ts","../src/utils/index.ts","../src/validation/address.ts","../src/validation/index.ts","../src/configuration/execution.ts","../src/configuration/explorer.ts","../src/configuration/rpc.ts","../src/configuration/index.ts","../src/query/executor.ts","../src/query/view-checker.ts","../src/query/handler.ts","../src/query/index.ts","../src/index.ts","../src/browser-init.ts","../src/adapter.ts","../src/analysis/function-decorations-service.ts","../src/transaction/contract-evaluator.ts","../src/transaction/witness-evaluator.ts","../src/analysis/organizer-only-detector.ts","../src/export/bootstrap.ts","../src/utils/zip-slimmer.ts","../src/mapping/field-generator.ts","../src/utils/type-helpers.ts","../src/mapping/type-mapper.ts","../src/utils/artifact-preparation.ts","../src/wallet/components/account/AccountDisplay.tsx","../src/wallet/hooks/useMidnightWallet.ts","../src/wallet/context/MidnightWalletContext.tsx","../src/wallet/hooks/facade-hooks.ts","../src/wallet/utils/SafeMidnightComponent.tsx","../src/wallet/components/connect/ConnectButton.tsx","../src/wallet/components/MidnightWalletUiRoot.tsx","../src/wallet/connection.ts","../src/wallet/implementation/lace-implementation.ts","../src/wallet/utils/midnightWalletImplementationManager.ts","../src/contract/loader.ts","../src/transaction/eoa.ts","../src/utils/secret-property-helpers.ts","../src/transaction/call-circuit.ts","../src/transaction/error-enhancer.ts","../src/transaction/formatter.ts","../src/transform/input-parser.ts","../src/transform/output-formatter.ts","../src/transaction/sender.ts","../src/transaction/index.ts","../src/transaction/local-execution-router.ts","../src/transaction/pure-circuit-executor.ts","../src/types/index.ts","../src/networks/testnet.ts","../src/networks/index.ts","../src/config.ts"],"sourcesContent":["import type { ContractFunction } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = '[CircuitTypeUtils]';\n\n/**\n * Regex pattern for matching pure circuit function signatures\n * Matches functions with or without context parameter:\n * - Pattern 1: function(context: Type, ...params) - with context\n * - Pattern 2: function(...params) - without context\n */\nexport const PURE_CIRCUIT_METHOD_REGEX =\n  /(\\w+)\\s*\\((?:context\\s*:[^,\\)]+(?:,\\s*([^\\)]+))?|([^\\)]+?))\\)/g;\n\n/**\n * Regex pattern for matching impure circuit function signatures\n * Matches functions with context parameter: function(context: Type, ...params)\n */\nexport const IMPURE_CIRCUIT_METHOD_REGEX = /(\\w+)\\s*\\(\\s*context\\s*:[^,\\)]+(?:,\\s*([^\\)]+))?\\)/g;\n\n/**\n * Regex pattern for matching Circuits<T> type definition (legacy/fallback)\n * Used for older contracts that only have Circuits<T> instead of ImpureCircuits and PureCircuits\n */\nexport const CIRCUITS_TYPE_REGEX =\n  /export\\s+(?:declare\\s+)?type\\s+Circuits\\s*<[^>]*>\\s*=\\s*{([\\s\\S]*?)}\\s*;?/s;\n\n/**\n * Checks if the contract definition contains an ImpureCircuits type definition\n *\n * @param contractDefinition - The contract definition (.d.ts) content\n * @returns True if ImpureCircuits type exists, false otherwise\n */\nexport function hasImpureCircuitsType(contractDefinition: string): boolean {\n  const impureCircuitsMatch = contractDefinition.match(\n    /export\\s+(?:declare\\s+)?type\\s+ImpureCircuits\\s*<[^>]*>\\s*=\\s*{([\\s\\S]*?)}\\s*;?/s\n  );\n  return !!impureCircuitsMatch;\n}\n\n/**\n * Checks if the contract definition contains a PureCircuits type definition\n *\n * @param contractDefinition - The contract definition (.d.ts) content\n * @returns True if PureCircuits type exists, false otherwise\n */\nexport function hasPureCircuitsType(contractDefinition: string): boolean {\n  const pureCircuitsMatch = contractDefinition.match(\n    /export\\s+(?:declare\\s+)?type\\s+PureCircuits\\s*=\\s*{([\\s\\S]*?)}\\s*;?/s\n  );\n  return !!pureCircuitsMatch;\n}\n\n/**\n * Checks if the contract definition contains a Circuits<T> type definition (legacy/fallback)\n *\n * @param contractDefinition - The contract definition (.d.ts) content\n * @returns True if Circuits<T> type exists, false otherwise\n */\nexport function hasCircuitsType(contractDefinition: string): boolean {\n  const circuitsMatch = contractDefinition.match(CIRCUITS_TYPE_REGEX);\n  return !!circuitsMatch;\n}\n\n/**\n * Extracts ImpureCircuits from the contract definition\n *\n * @param contractDefinition - The contract definition (.d.ts) content\n * @returns Object mapping circuit names to their ContractFunction definitions\n */\nexport function extractImpureCircuits(\n  contractDefinition: string,\n  parseParameters: (paramsText: string) => ContractFunction['inputs'],\n  capitalizeFirst: (str: string) => string\n): Record<string, ContractFunction> {\n  const circuits: Record<string, ContractFunction> = {};\n\n  const impureCircuitsMatch = contractDefinition.match(\n    /export\\s+(?:declare\\s+)?type\\s+ImpureCircuits\\s*<[^>]*>\\s*=\\s*{([\\s\\S]*?)}\\s*;?/s\n  );\n\n  if (impureCircuitsMatch) {\n    const impureCircuitsContent = impureCircuitsMatch[1];\n    const methodRegex = IMPURE_CIRCUIT_METHOD_REGEX;\n    let match;\n    while ((match = methodRegex.exec(impureCircuitsContent)) !== null) {\n      const name = match[1];\n      const paramsText = match[2] || '';\n      circuits[name] = {\n        id: name,\n        name,\n        displayName: capitalizeFirst(name),\n        inputs: parseParameters(paramsText),\n        outputs: [], // Circuits don't expose return values directly\n        modifiesState: true,\n        type: 'function',\n        stateMutability: 'nonpayable',\n      };\n    }\n  }\n\n  return circuits;\n}\n\n/**\n * Extracts PureCircuits from the contract definition\n *\n * @param contractDefinition - The contract definition (.d.ts) content\n * @returns Object mapping circuit names to their ContractFunction definitions\n */\nexport function extractPureCircuits(\n  contractDefinition: string,\n  parseParameters: (paramsText: string) => ContractFunction['inputs'],\n  capitalizeFirst: (str: string) => string\n): Record<string, ContractFunction> {\n  const circuits: Record<string, ContractFunction> = {};\n\n  const pureCircuitsMatch = contractDefinition.match(\n    /export\\s+(?:declare\\s+)?type\\s+PureCircuits\\s*=\\s*{([\\s\\S]*?)}\\s*;?/s\n  );\n\n  if (pureCircuitsMatch) {\n    const pureCircuitsContent = pureCircuitsMatch[1];\n    logger.debug(SYSTEM_LOG_TAG, 'Found PureCircuits type, content:', pureCircuitsContent);\n    // Pure circuits may or may not have context - match both patterns\n    // Pattern 1: function(context: Type, ...params) - with context\n    // Pattern 2: function(...params) - without context\n    const methodRegex = PURE_CIRCUIT_METHOD_REGEX;\n    let match;\n    while ((match = methodRegex.exec(pureCircuitsContent)) !== null) {\n      const name = match[1];\n      // If match[2] exists, it means context was present and these are the rest of params\n      // If match[3] exists, it means no context - these are all params\n      const paramsText = match[2] || match[3] || '';\n      logger.debug(SYSTEM_LOG_TAG, `Extracted pure circuit: ${name} with params: ${paramsText}`);\n      circuits[name] = {\n        id: name,\n        name,\n        displayName: capitalizeFirst(name),\n        inputs: parseParameters(paramsText),\n        outputs: [], // Circuits don't expose return values directly\n        modifiesState: false,\n        type: 'function',\n        stateMutability: 'pure',\n      };\n    }\n  } else {\n    logger.debug(SYSTEM_LOG_TAG, 'PureCircuits type not found in contract definition');\n  }\n\n  return circuits;\n}\n\n/**\n * Checks if a function is an impure circuit (state-modifying)\n *\n * @param functionDetails - The function details from the contract schema\n * @returns True if the function is an impure circuit\n */\nexport function isImpureCircuit(functionDetails: ContractFunction): boolean {\n  return functionDetails.modifiesState === true && functionDetails.stateMutability !== 'pure';\n}\n\n/**\n * Checks if a function is a pure circuit (local execution)\n *\n * @param functionDetails - The function details from the contract schema\n * @returns True if the function is a pure circuit\n */\nexport function isPureCircuit(functionDetails: ContractFunction): boolean {\n  return functionDetails.stateMutability === 'pure';\n}\n","import type { NetworkServiceForm } from '@openzeppelin/ui-builder-types';\n\n/**\n * Returns the network service forms for Midnight networks.\n * Defines the UI configuration for the Indexer service.\n */\nexport function getMidnightNetworkServiceForms(): NetworkServiceForm[] {\n  return [\n    {\n      id: 'indexer',\n      label: 'Indexer',\n      description:\n        'Configure Midnight Indexer GraphQL endpoints. Provide both HTTP and WebSocket URLs.',\n      fields: [\n        {\n          id: 'indexer-http',\n          name: 'httpUrl',\n          type: 'text',\n          label: 'HTTP URL',\n          placeholder: 'https://indexer.testnet-02.midnight.network/api/v1/graphql',\n          validation: { required: true, pattern: '^https?://.+' },\n          width: 'full',\n        },\n        {\n          id: 'indexer-ws',\n          name: 'wsUrl',\n          type: 'text',\n          label: 'WebSocket URL',\n          placeholder: 'wss://indexer.testnet-02.midnight.network/api/v1/graphql/ws',\n          validation: { required: true, pattern: '^wss?://.+' },\n          width: 'full',\n        },\n      ],\n    },\n  ];\n}\n\n/**\n * Validates a network service configuration for Midnight networks.\n */\nexport async function validateMidnightNetworkServiceConfig(\n  serviceId: string,\n  values: Record<string, unknown>\n): Promise<boolean> {\n  if (serviceId !== 'indexer') return true;\n  try {\n    const http = new URL(String(values.httpUrl || ''));\n    const ws = new URL(String(values.wsUrl || ''));\n    const httpOk = http.protocol === 'http:' || http.protocol === 'https:';\n    const wsOk = ws.protocol === 'ws:' || ws.protocol === 'wss:';\n    return Boolean(httpOk && wsOk && http.host && ws.host && http.pathname && ws.pathname);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Tests a network service connection for Midnight networks.\n * Note: We only test the HTTP endpoint here. The WebSocket endpoint is validated\n * via URL format but not tested because GraphQL WebSocket endpoints require\n * specific subprotocols (graphql-ws or graphql-transport-ws) and a proper\n * GraphQL handshake that's complex to test. The Midnight SDK's\n * indexerPublicDataProvider handles WebSocket connections correctly when\n * actually used. HTTP is sufficient for validating connectivity since it's\n * what's used for GraphQL queries (WebSocket is mainly for subscriptions).\n */\nexport async function testMidnightNetworkServiceConnection(\n  serviceId: string,\n  values: Record<string, unknown>\n): Promise<{ success: boolean; latency?: number; error?: string }> {\n  if (serviceId !== 'indexer') return { success: true };\n  const httpUrl = String(values.httpUrl || '');\n  const wsUrl = String(values.wsUrl || '');\n\n  if (!httpUrl) return { success: false, error: 'HTTP URL is required' };\n  if (!wsUrl) return { success: false, error: 'WebSocket URL is required' };\n\n  const start = performance.now();\n  try {\n    const res = await fetch(httpUrl, {\n      method: 'POST',\n      headers: { 'content-type': 'application/json' },\n      body: JSON.stringify({ query: 'query Q{__typename}' }),\n    });\n    const latency = Math.round(performance.now() - start);\n    if (!res.ok) return { success: false, latency, error: `HTTP ${res.status}` };\n    return { success: true, latency };\n  } catch (e) {\n    const latency = Math.round(performance.now() - start);\n    return { success: false, latency, error: e instanceof Error ? e.message : 'Network error' };\n  }\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\nimport type { MidnightContractArtifacts } from '../types';\n\nconst SYSTEM_LOG_TAG = 'IdentitySecretDerivation';\n\n/**\n * Attempts to derive the identity secret key property name\n * from uploaded artifacts.\n *\n * Strategy:\n * 1) Prefer parsing the TypeScript definition for PrivateState in contractDefinition (.d.ts/.d.cts)\n *    - Find `export type <Name>PrivateState = { ... }`\n *    - Select a single field whose type is `Uint8Array` or `Uint8Array | null`\n * 2) Fallback: parse witnessCode for well-known witness functions and `privateState.<prop>` usage\n *    - Targets functions: local_sk, local_secret_key, organizer_key\n */\nexport function deriveIdentitySecretPropertyName(\n  artifacts: MidnightContractArtifacts | null\n): string | undefined {\n  try {\n    if (!artifacts) return undefined;\n\n    // 1) Parse contractDefinition for PrivateState type\n    const dts = artifacts.contractDefinition || '';\n    if (dts) {\n      // Capture blocks like `export type FooPrivateState = { ... };`\n      const privateStateBlocks = Array.from(\n        dts.matchAll(/export\\s+type\\s+\\w+PrivateState\\s*=\\s*\\{([\\s\\S]*?)\\};?/g)\n      );\n\n      for (const match of privateStateBlocks) {\n        const body = match[1] || '';\n        // Extract readonly <name>: <type>;\n        // Stop at comment start (/), semicolon, or newline to avoid capturing inline comments\n        const fields = Array.from(body.matchAll(/readonly\\s+(\\w+)\\s*:\\s*([^;/\\n]+)/g)).map((m) => ({\n          name: m[1],\n          type: (m[2] || '').trim(),\n        }));\n\n        const candidates = fields.filter((f) => /^Uint8Array(\\s*\\|\\s*null)?$/.test(f.type));\n\n        if (candidates.length === 1) {\n          const name = candidates[0].name;\n          logger.debug(SYSTEM_LOG_TAG, 'Derived from .d.ts PrivateState field:', name);\n          return name;\n        }\n      }\n    }\n\n    // 2) Fallback: Parse witnessCode and look for privateState.<prop> used in well-known witnesses\n    const witnesses = artifacts.witnessCode || '';\n    if (witnesses) {\n      // Split into lines and look for lines that contain both:\n      // - A well-known witness name (local_sk, local_secret_key, organizer_key)\n      // - A reference to privateState.<prop>\n      const lines = witnesses.split('\\n');\n      const propCounts: Record<string, number> = {};\n\n      for (const line of lines) {\n        // Check if this line contains a well-known witness identifier\n        if (/(local_sk|local_secret_key|organizer_key)/.test(line)) {\n          // Extract all privateState.<prop> references from this line\n          const refs = Array.from(line.matchAll(/privateState\\.(\\w+)/g)).map((m) => m[1]);\n          for (const prop of refs) {\n            propCounts[prop] = (propCounts[prop] || 0) + 1;\n          }\n        }\n      }\n\n      const entries = Object.entries(propCounts).sort((a, b) => b[1] - a[1]);\n      if (entries.length > 0) {\n        logger.debug(SYSTEM_LOG_TAG, 'Derived from witnessCode usage:', entries[0][0]);\n        return entries[0][0];\n      }\n    }\n  } catch (err) {\n    logger.debug(\n      SYSTEM_LOG_TAG,\n      'Identity secret property derivation failed:',\n      err instanceof Error ? err.message : String(err)\n    );\n  }\n\n  return undefined;\n}\n","import {\n  ContractEvent,\n  ContractFunction,\n  ContractSchema,\n  FunctionParameter,\n} from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport {\n  CIRCUITS_TYPE_REGEX,\n  extractImpureCircuits,\n  extractPureCircuits,\n  IMPURE_CIRCUIT_METHOD_REGEX,\n} from './circuit-type-utils';\n\nconst SYSTEM_LOG_TAG = '[SchemaParser]';\n\n/**\n * Parses the string content of a Midnight contract's .d.ts file.\n * @param interfaceContent The string content of the .d.ts file.\n * @returns A partial schema containing the functions and types.\n */\nexport function parseMidnightContractInterface(\n  interfaceContent: string\n): Pick<ContractSchema, 'functions' | 'events' | 'metadata'> {\n  try {\n    const circuits = extractCircuits(interfaceContent);\n    const ledgerProperties = extractLedgerProperties(interfaceContent);\n    const enums = extractEnums(interfaceContent);\n\n    const impureCount = Object.values(circuits).filter((c) => c.modifiesState).length;\n    const pureCount = Object.values(circuits).filter((c) => !c.modifiesState).length;\n\n    logger.info(\n      SYSTEM_LOG_TAG,\n      `Parsed d.ts → impure circuits:${impureCount} pure circuits:${pureCount} ledger:${Object.keys(ledgerProperties).length}`\n    );\n\n    const functions = [...Object.values(circuits), ...Object.values(ledgerProperties)];\n\n    // TODO: Extract events from the interface content.\n    const events: ContractEvent[] = [];\n\n    return {\n      functions,\n      events,\n      metadata: {\n        enums,\n      },\n    };\n  } catch (error) {\n    logger.error(SYSTEM_LOG_TAG, 'Failed to parse contract interface:', error);\n    throw new Error(\n      `Failed to parse Midnight contract interface: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n/**\n * Capitalizes the first letter of a string\n */\nfunction capitalizeFirst(str: string): string {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction extractCircuits(content: string): Record<string, ContractFunction> {\n  const circuits: Record<string, ContractFunction> = {};\n\n  // Extract ImpureCircuits (state-modifying circuits)\n  const impureCircuits = extractImpureCircuits(content, parseParameters, capitalizeFirst);\n  Object.assign(circuits, impureCircuits);\n\n  // Extract PureCircuits (read-only circuits that run locally)\n  const pureCircuits = extractPureCircuits(content, parseParameters, capitalizeFirst);\n  Object.assign(circuits, pureCircuits);\n\n  // Fallback: if neither ImpureCircuits nor PureCircuits exists, extract from Circuits\n  // This handles older contracts that only have Circuits<T>\n  if (Object.keys(circuits).length === 0) {\n    const circuitsMatch = content.match(CIRCUITS_TYPE_REGEX);\n\n    if (circuitsMatch) {\n      const circuitsContent = circuitsMatch[1];\n      const methodRegex = IMPURE_CIRCUIT_METHOD_REGEX;\n      let match;\n      while ((match = methodRegex.exec(circuitsContent)) !== null) {\n        const name = match[1];\n        const paramsText = match[2] || '';\n        circuits[name] = {\n          id: name,\n          name,\n          displayName: capitalizeFirst(name),\n          inputs: parseParameters(paramsText),\n          outputs: [], // Circuits don't expose return values directly\n          modifiesState: true, // Default to true for backwards compatibility\n          type: 'function',\n          stateMutability: 'nonpayable',\n        };\n      }\n    }\n  }\n\n  logger.debug(SYSTEM_LOG_TAG, `Extracted ${Object.keys(circuits).length} circuits`);\n  return circuits;\n}\n\n/**\n * Extract enums from the contract interface (export enum Name { a = 0, b = 1 })\n * Returns a map: enumName -> array of variant objects { name, value }\n */\nfunction extractEnums(content: string): Record<string, Array<{ name: string; value?: number }>> {\n  const result: Record<string, Array<{ name: string; value?: number }>> = {};\n  const enumRegex = /export\\s+enum\\s+(\\w+)\\s*\\{([^}]+)\\}/g;\n  let match: RegExpExecArray | null;\n  while ((match = enumRegex.exec(content)) !== null) {\n    const enumName = match[1];\n    const body = match[2];\n    const variants: Array<{ name: string; value?: number }> = [];\n    // Split by commas at top level\n    const parts = body.split(',');\n    for (const raw of parts) {\n      const part = raw.trim();\n      if (!part) continue;\n      const kv = part.split('=');\n      const name = kv[0].trim();\n      const value = kv[1] !== undefined ? Number(kv[1]) : undefined;\n      variants.push({ name, value: Number.isFinite(value) ? (value as number) : undefined });\n    }\n    if (variants.length > 0) {\n      result[enumName] = variants;\n    }\n  }\n  return result;\n}\n\n/**\n * Extracts ledger properties and query methods from the contract interface.\n * Ledger properties are readonly state values, while Queries are parameterized methods.\n * Both are treated as view functions in the UI.\n */\nfunction extractLedgerProperties(content: string): Record<string, ContractFunction> {\n  const properties: Record<string, ContractFunction> = {};\n\n  // Match: export (declare) type Ledger = { readonly prop: Type; ... }\n  const ledgerMatch = content.match(/export\\s+(?:declare\\s+)?type\\s+Ledger\\s*=\\s*{([\\s\\S]*?)}/s);\n\n  if (ledgerMatch) {\n    const ledgerContent = ledgerMatch[1];\n    const propertyRegex = /readonly\\s+(\\w+)\\s*:\\s*([^;]*);/g;\n    let match;\n    while ((match = propertyRegex.exec(ledgerContent)) !== null) {\n      const name = match[1];\n      const typeStr = match[2].trim();\n      properties[name] = {\n        id: name,\n        name,\n        displayName: capitalizeFirst(name),\n        inputs: [],\n        outputs: [{ name: 'value', type: typeStr }],\n        modifiesState: false,\n        type: 'function',\n        stateMutability: 'view',\n      };\n    }\n  }\n\n  // Also check for Queries type (parameterized query methods)\n  // We need to manually extract the content by tracking brace depth\n  const queriesStartMatch = content.match(\n    /export\\s+(?:declare\\s+)?type\\s+Queries\\s*<[^>]*>\\s*=\\s*{/\n  );\n\n  if (queriesStartMatch) {\n    const startIndex = queriesStartMatch.index! + queriesStartMatch[0].length;\n    let braceCount = 1;\n    let endIndex = startIndex;\n\n    // Find the matching closing brace\n    for (let i = startIndex; i < content.length && braceCount > 0; i++) {\n      if (content[i] === '{') braceCount++;\n      else if (content[i] === '}') braceCount--;\n      if (braceCount > 0) endIndex = i + 1;\n    }\n\n    const queriesContent = content.substring(startIndex, endIndex);\n    // Parse methods with return types, handling complex nested types\n    // We need to parse character by character to handle nested braces in return types\n    let currentMethod = '';\n    let braceDepth = 0;\n    let angleDepth = 0;\n    let parenDepth = 0;\n\n    for (let i = 0; i < queriesContent.length; i++) {\n      const char = queriesContent[i];\n\n      if (char === '{') {\n        braceDepth++;\n        currentMethod += char;\n      } else if (char === '}') {\n        braceDepth--;\n        currentMethod += char;\n      } else if (char === '<') {\n        angleDepth++;\n        currentMethod += char;\n      } else if (char === '>') {\n        angleDepth--;\n        currentMethod += char;\n      } else if (char === '(') {\n        parenDepth++;\n        currentMethod += char;\n      } else if (char === ')') {\n        parenDepth--;\n        currentMethod += char;\n      } else if (\n        (char === ';' || char === ',') &&\n        braceDepth === 0 &&\n        angleDepth === 0 &&\n        parenDepth === 0\n      ) {\n        // End of method definition at top level\n        if (currentMethod.trim()) {\n          parseQueryMethod(currentMethod.trim(), properties);\n        }\n        currentMethod = '';\n      } else {\n        currentMethod += char;\n      }\n    }\n\n    // Don't forget the last method if there's no trailing semicolon\n    if (currentMethod.trim()) {\n      parseQueryMethod(currentMethod.trim(), properties);\n    }\n  }\n\n  logger.debug(\n    SYSTEM_LOG_TAG,\n    `Extracted ${Object.keys(properties).length} ledger properties/queries`\n  );\n  return properties;\n}\n\n/**\n * Parses a single query method signature and adds it to the properties object\n */\nfunction parseQueryMethod(methodText: string, properties: Record<string, ContractFunction>): void {\n  // Match: methodName(...params): ReturnType\n  const methodMatch = methodText.match(/^(\\w+)\\s*\\((.*?)\\)\\s*:\\s*(.+)$/s);\n  if (methodMatch) {\n    const name = methodMatch[1];\n    const paramsText = methodMatch[2] || '';\n    const returnType = methodMatch[3]?.trim() || 'unknown';\n\n    // Check for name collision with ledger properties\n    if (properties[name]) {\n      logger.warn(\n        SYSTEM_LOG_TAG,\n        `Name collision detected: Query method \"${name}\" overwrites ledger property with same name`\n      );\n    }\n\n    properties[name] = {\n      id: name,\n      name,\n      displayName: capitalizeFirst(name),\n      inputs: parseParameters(paramsText),\n      outputs: [{ name: 'value', type: returnType }],\n      modifiesState: false,\n      type: 'function',\n      stateMutability: 'view',\n    };\n  }\n}\n\n/**\n * Parses function parameters from TypeScript signature text.\n * Handles simple types and attempts to parse complex nested types.\n *\n * Note: This is a simplified parser that handles common cases.\n * Complex generic types with nested brackets/colons may not parse correctly.\n */\nfunction parseParameters(paramsText: string): FunctionParameter[] {\n  if (!paramsText.trim()) return [];\n\n  try {\n    const params: FunctionParameter[] = [];\n    let currentParam = '';\n    let bracketDepth = 0;\n    let angleDepth = 0;\n\n    // Parse character by character to handle nested types\n    for (let i = 0; i < paramsText.length; i++) {\n      const char = paramsText[i];\n\n      if (char === '{' || char === '[') {\n        bracketDepth++;\n        currentParam += char;\n      } else if (char === '}' || char === ']') {\n        bracketDepth--;\n        // Validate depth never goes negative (indicates malformed input)\n        if (bracketDepth < 0) {\n          logger.warn(\n            SYSTEM_LOG_TAG,\n            `Malformed parameter text: unbalanced brackets/braces at position ${i} in \"${paramsText}\"`\n          );\n          throw new Error(`Unbalanced brackets/braces at position ${i}`);\n        }\n        currentParam += char;\n      } else if (char === '<') {\n        angleDepth++;\n        currentParam += char;\n      } else if (char === '>') {\n        angleDepth--;\n        // Validate depth never goes negative (indicates malformed input)\n        if (angleDepth < 0) {\n          logger.warn(\n            SYSTEM_LOG_TAG,\n            `Malformed parameter text: unbalanced angle brackets at position ${i} in \"${paramsText}\"`\n          );\n          throw new Error(`Unbalanced angle brackets at position ${i}`);\n        }\n        currentParam += char;\n      } else if (char === ',' && bracketDepth === 0 && angleDepth === 0) {\n        // Top-level comma - this separates parameters\n        if (currentParam.trim()) {\n          params.push(parseParameter(currentParam.trim()));\n        }\n        currentParam = '';\n      } else {\n        currentParam += char;\n      }\n    }\n\n    // Validate all brackets/angles are balanced at the end\n    if (bracketDepth !== 0) {\n      logger.warn(\n        SYSTEM_LOG_TAG,\n        `Malformed parameter text: unclosed brackets/braces (depth: ${bracketDepth}) in \"${paramsText}\"`\n      );\n      throw new Error(`Unclosed brackets/braces (depth: ${bracketDepth})`);\n    }\n    if (angleDepth !== 0) {\n      logger.warn(\n        SYSTEM_LOG_TAG,\n        `Malformed parameter text: unclosed angle brackets (depth: ${angleDepth}) in \"${paramsText}\"`\n      );\n      throw new Error(`Unclosed angle brackets (depth: ${angleDepth})`);\n    }\n\n    // Don't forget the last parameter\n    if (currentParam.trim()) {\n      params.push(parseParameter(currentParam.trim()));\n    }\n\n    return params;\n  } catch (error) {\n    logger.warn(SYSTEM_LOG_TAG, `Failed to parse parameters: \"${paramsText}\"`, error);\n    // Fallback to simple split for backwards compatibility\n    return paramsText.split(',').map((param) => {\n      const [name, type] = param.split(':').map((s) => s.trim());\n      return { name: name || 'unknown', type: type || 'unknown' };\n    });\n  }\n}\n\n/**\n * Parses a single parameter from \"name: Type\" format\n */\nfunction parseParameter(paramText: string): FunctionParameter {\n  const colonIndex = paramText.indexOf(':');\n  if (colonIndex === -1) {\n    logger.warn(SYSTEM_LOG_TAG, `Invalid parameter format (missing colon): \"${paramText}\"`);\n    return { name: paramText.trim(), type: 'unknown' };\n  }\n\n  const name = paramText.substring(0, colonIndex).trim();\n  const type = paramText.substring(colonIndex + 1).trim();\n\n  if (!name) {\n    logger.warn(SYSTEM_LOG_TAG, `Parameter missing name: \"${paramText}\"`);\n    return { name: 'unknown', type: type || 'unknown' };\n  }\n\n  return { name, type: type || 'unknown' };\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\n// Local copy of minimal provider config used by wallet serviceUriConfig()\nexport interface ProviderConfig {\n  indexerUri: string;\n  indexerWsUri: string;\n  substrateNodeUri: string;\n  proverServerUri: string;\n  networkId?: string;\n}\n\n/**\n * Validates that the wallet config has all required URI properties.\n * @param config The configuration object to validate\n * @returns true if valid, false otherwise\n */\nfunction isValidWalletConfig(config: unknown): boolean {\n  if (!config || typeof config !== 'object') {\n    return false;\n  }\n\n  const obj = config as Record<string, unknown>;\n  return (\n    typeof obj.indexerUri === 'string' &&\n    typeof obj.indexerWsUri === 'string' &&\n    typeof obj.substrateNodeUri === 'string' &&\n    typeof obj.proverServerUri === 'string'\n  );\n}\n\n/**\n * Attempts to get wallet configuration if wallet is available.\n * This respects user privacy preferences for indexer/node URIs.\n *\n * For read-only queries, only `indexerUri` and `indexerWsUri` are used.\n * `substrateNodeUri` and `proverServerUri` will be important for write operations.\n *\n * @returns Wallet configuration if available, undefined otherwise\n */\nexport async function getWalletConfigIfAvailable(): Promise<Partial<ProviderConfig> | undefined> {\n  try {\n    // Only support Lace wallet for now. If we add other wallets later,\n    // update this function accordingly.\n    if (typeof window === 'undefined' || !window.midnight?.mnLace) {\n      logger.debug('getWalletConfigIfAvailable', 'Lace wallet not available in browser');\n      return undefined;\n    }\n\n    // Get service URI configuration from Lace (respects user privacy preferences)\n    const config = await window.midnight.mnLace.serviceUriConfig();\n\n    // Validate response structure\n    if (!isValidWalletConfig(config)) {\n      logger.warn('getWalletConfigIfAvailable', 'Wallet returned invalid configuration structure', {\n        missing: ['indexerUri', 'indexerWsUri', 'substrateNodeUri', 'proverServerUri'].filter(\n          (key) => {\n            const cfg = config as unknown as Record<string, unknown>;\n            return typeof cfg?.[key] !== 'string';\n          }\n        ),\n      });\n      return undefined;\n    }\n\n    logger.info(\n      'getWalletConfigIfAvailable',\n      'Using wallet configuration (respecting user privacy preferences)',\n      {\n        indexerUri: config.indexerUri,\n      }\n    );\n\n    return {\n      indexerUri: config.indexerUri,\n      indexerWsUri: config.indexerWsUri,\n      substrateNodeUri: config.substrateNodeUri,\n      proverServerUri: config.proverServerUri,\n      // ServiceUriConfig doesn't include networkId in v3, it will be undefined\n      networkId: undefined,\n    };\n  } catch (error) {\n    // Handle specific error scenarios\n    if (error instanceof TypeError) {\n      logger.debug(\n        'getWalletConfigIfAvailable',\n        'Wallet API contract violation: method or property not found',\n        {\n          message: error.message,\n        }\n      );\n    } else if (error instanceof ReferenceError) {\n      logger.debug(\n        'getWalletConfigIfAvailable',\n        'Wallet reference error: wallet API not properly initialized',\n        {\n          message: error.message,\n        }\n      );\n    } else {\n      logger.debug('getWalletConfigIfAvailable', 'Failed to retrieve wallet configuration', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n    return undefined;\n  }\n}\n","import type { ProverKey, VerifierKey, ZKConfig, ZKIR } from '@midnight-ntwrk/midnight-js-types';\nimport { ZKConfigProvider as BaseZKConfigProvider } from '@midnight-ntwrk/midnight-js-types';\n\nimport type { ZkArtifact } from '../utils/zip-extractor';\n\n/**\n * A ZkConfigProvider that uses embedded ZK artifacts from contract ZIP files.\n * Works entirely in-browser without requiring any server endpoints.\n *\n * This provider stores the prover/verifier keys and ZKIR files extracted from\n * the contract ZIP and provides them to the proof server when generating proofs.\n *\n * Extends the SDK's abstract ZKConfigProvider class to ensure type compatibility.\n */\nexport class EmbeddedZkConfigProvider extends BaseZKConfigProvider<string> {\n  constructor(private artifacts: Record<string, ZkArtifact> = {}) {\n    super();\n  }\n\n  /**\n   * Register ZK artifacts for a circuit\n   */\n  register(circuitId: string, artifact: ZkArtifact): void {\n    this.artifacts[circuitId] = artifact;\n  }\n\n  /**\n   * Register multiple ZK artifacts at once\n   */\n  registerAll(artifacts: Record<string, ZkArtifact>): void {\n    this.artifacts = { ...this.artifacts, ...artifacts };\n  }\n\n  /**\n   * Get ZK configuration for a specific circuit\n   * This is called by the SDK when creating the proof server payload\n   */\n  override async get(circuitId: string): Promise<ZKConfig<string>> {\n    const artifact = this.artifacts[circuitId];\n\n    if (!artifact) {\n      throw new Error(`No ZK artifacts found for circuit: ${circuitId}`);\n    }\n\n    // Return the configuration in the format expected by the proof provider\n    return {\n      circuitId,\n      proverKey: artifact.prover,\n      verifierKey: artifact.verifier,\n      zkir: artifact.zkir || new Uint8Array(0),\n    } as ZKConfig<string>;\n  }\n\n  /**\n   * Retrieves the ZKIR for the given circuit\n   */\n  override async getZKIR(circuitId: string): Promise<ZKIR> {\n    const artifact = this.artifacts[circuitId];\n    if (!artifact) {\n      throw new Error(`No ZK artifacts found for circuit: ${circuitId}`);\n    }\n    return (artifact.zkir || new Uint8Array(0)) as ZKIR;\n  }\n\n  /**\n   * Retrieves the prover key for the given circuit\n   */\n  override async getProverKey(circuitId: string): Promise<ProverKey> {\n    const artifact = this.artifacts[circuitId];\n    if (!artifact) {\n      throw new Error(`No ZK artifacts found for circuit: ${circuitId}`);\n    }\n    return artifact.prover as ProverKey;\n  }\n\n  /**\n   * Retrieves the verifier key for the given circuit\n   */\n  override async getVerifierKey(circuitId: string): Promise<VerifierKey> {\n    const artifact = this.artifacts[circuitId];\n    if (!artifact) {\n      throw new Error(`No ZK artifacts found for circuit: ${circuitId}`);\n    }\n    return artifact.verifier as VerifierKey;\n  }\n\n  /**\n   * Get all registered circuit IDs\n   */\n  getCircuitIds(): string[] {\n    return Object.keys(this.artifacts);\n  }\n\n  /**\n   * Clear all registered artifacts\n   */\n  clear(): void {\n    this.artifacts = {};\n  }\n}\n","import type {\n  BalancedTransaction,\n  MidnightProvider,\n  MidnightProviders,\n  UnbalancedTransaction,\n  WalletProvider,\n} from '@midnight-ntwrk/midnight-js-types';\n\nimport type { MidnightNetworkConfig } from '@openzeppelin/ui-builder-types';\nimport {\n  logger,\n  userNetworkServiceConfigService,\n  userRpcConfigService,\n} from '@openzeppelin/ui-builder-utils';\n\nimport { getWalletConfigIfAvailable } from '../configuration/provider';\nimport type { LaceWalletImplementation } from '../wallet/implementation/lace-implementation';\nimport { EmbeddedZkConfigProvider } from './embedded-zk-config-provider';\n\n/**\n * Global instance of the ZK config provider\n * This is shared across all transactions and populated when artifacts are loaded\n */\nexport const globalZkConfigProvider = new EmbeddedZkConfigProvider();\n\n/**\n * Creates all 5 required Midnight providers for transaction execution\n * Pattern: mirrors bboard-ui/src/contexts/BrowserDeployedBoardManager.ts lines 202-232\n *\n * Uses dynamic imports to avoid loading WASM dependencies at module initialization\n */\nexport async function createTransactionProviders(\n  walletImplementation: LaceWalletImplementation,\n  networkConfig: MidnightNetworkConfig\n): Promise<MidnightProviders> {\n  const api = walletImplementation.getApi();\n  if (!api) {\n    throw new Error('Wallet not connected');\n  }\n\n  const walletState = await api.state();\n  if (!walletState || !walletState.coinPublicKey) {\n    throw new Error('Unable to retrieve wallet state');\n  }\n\n  logger.debug('createTransactionProviders', 'Wallet state:', {\n    coinPublicKey: walletState.coinPublicKey,\n    encryptionPublicKey: walletState.encryptionPublicKey,\n    address: walletState.address,\n  });\n\n  // Get wallet configuration (may include user privacy preferences)\n  const walletConfig = await getWalletConfigIfAvailable();\n\n  // Resolve indexer endpoints with priority order (matches EVM/Stellar pattern):\n  // 1. User RPC override (custom dev/test endpoints)\n  // 2. Wallet config (Midnight-specific: respects user privacy preferences)\n  // 3. Network config (explicit configuration)\n  // 4. Derived from RPC endpoint (fallback)\n\n  let indexerUri: string;\n  let indexerWsUri: string;\n\n  // Priority 1: Check for user Indexer override\n  const userIndexer = userNetworkServiceConfigService.get(networkConfig.id, 'indexer') as {\n    httpUrl?: string;\n    wsUrl?: string;\n  } | null;\n  const customRpcConfig = userRpcConfigService.getUserRpcConfig(networkConfig.id);\n  if (userIndexer?.httpUrl && userIndexer?.wsUrl) {\n    indexerUri = userIndexer.httpUrl;\n    indexerWsUri = userIndexer.wsUrl;\n    logger.info('createTransactionProviders', 'Using user Indexer override', { indexerUri });\n  } else if (customRpcConfig?.url) {\n    // Derive indexer endpoints from custom RPC\n    indexerUri = deriveIndexerUri(customRpcConfig.url);\n    indexerWsUri = deriveIndexerWsUri(customRpcConfig.url);\n    logger.info('createTransactionProviders', 'Using user RPC override to derive indexer URIs', {\n      rpcUrl: customRpcConfig.url,\n      indexerUri,\n    });\n  } else if (walletConfig?.indexerUri && walletConfig?.indexerWsUri) {\n    // Priority 2: Respect user privacy preferences from wallet\n    indexerUri = walletConfig.indexerUri;\n    indexerWsUri = walletConfig.indexerWsUri;\n    logger.info(\n      'createTransactionProviders',\n      'Using wallet-provided indexer URIs (user privacy preferences)'\n    );\n  } else if (networkConfig.indexerUri && networkConfig.indexerWsUri) {\n    // Priority 3: Explicit network configuration\n    indexerUri = networkConfig.indexerUri;\n    indexerWsUri = networkConfig.indexerWsUri;\n    logger.info('createTransactionProviders', 'Using explicit network-configured indexer URIs');\n  } else {\n    // Priority 4: Derive from RPC endpoint as fallback\n    const defaultRpc = networkConfig.rpcEndpoints?.default;\n    if (!defaultRpc) {\n      throw new Error(\n        'No indexer URIs available. Please configure indexerUri/indexerWsUri in network config or provide an RPC endpoint.'\n      );\n    }\n    indexerUri = deriveIndexerUri(defaultRpc);\n    indexerWsUri = deriveIndexerWsUri(defaultRpc);\n    logger.info('createTransactionProviders', 'Derived indexer URIs from network RPC endpoint', {\n      rpcUrl: defaultRpc,\n      indexerUri,\n    });\n  }\n\n  // Proof server URI must come from wallet - there's no public proof server\n  if (!walletConfig?.proverServerUri) {\n    throw new Error(\n      'Proof server URI not available. Please ensure the Lace wallet is connected and configured correctly. ' +\n        'The proof server is required for generating zero-knowledge proofs for transactions.'\n    );\n  }\n\n  const proofServerUri = walletConfig.proverServerUri;\n\n  logger.info('createTransactionProviders', 'Initializing providers', {\n    indexerUri,\n    proofServerUri,\n    proofServerSource: 'wallet',\n  });\n\n  // Dynamic imports to avoid loading at module initialization\n  const [\n    { indexerPublicDataProvider },\n    { httpClientProofProvider },\n    { levelPrivateStateProvider },\n    { getLedgerNetworkId, getZswapNetworkId },\n    { createBalancedTx },\n    { Transaction },\n    { Transaction: ZswapTransaction },\n  ] = await Promise.all([\n    import('@midnight-ntwrk/midnight-js-indexer-public-data-provider'),\n    import('@midnight-ntwrk/midnight-js-http-client-proof-provider'),\n    import('@midnight-ntwrk/midnight-js-level-private-state-provider'),\n    import('@midnight-ntwrk/midnight-js-network-id'),\n    import('@midnight-ntwrk/midnight-js-types'),\n    import('@midnight-ntwrk/ledger'),\n    import('@midnight-ntwrk/zswap'),\n  ]);\n\n  // 1. Private state provider (IndexedDB-backed for browser)\n  // Use defaults from the SDK to ensure consistency across environments\n  const privateStateProvider = levelPrivateStateProvider();\n\n  // 2. ZK config provider (uses global embedded provider)\n  // Artifacts are registered with this provider when the ZIP is uploaded\n  const zkConfigProvider = globalZkConfigProvider;\n  logger.info(\n    'createTransactionProviders',\n    'Using EmbeddedZkConfigProvider with circuits:',\n    zkConfigProvider.getCircuitIds()\n  );\n\n  // 3. Proof provider (HTTP client to proof server)\n  const proofProvider = httpClientProofProvider(proofServerUri);\n\n  // 4. Public data provider (already used in queries)\n  const publicDataProvider = indexerPublicDataProvider(indexerUri, indexerWsUri);\n\n  // 5. Wallet + Midnight provider (combined)\n  // Pattern: lines 213-230 of bboard-ui example\n\n  // Debug: Log the coin public key format\n  logger.debug(\n    'createTransactionProviders',\n    'Creating wallet provider with coinPublicKey:',\n    walletState.coinPublicKey\n  );\n\n  const walletProvider: WalletProvider = {\n    coinPublicKey: walletState.coinPublicKey,\n    encryptionPublicKey: walletState.encryptionPublicKey,\n    balanceTx(tx: UnbalancedTransaction, newCoins: unknown[]): Promise<BalancedTransaction> {\n      type CoinsParam = Parameters<typeof api.balanceAndProveTransaction>[1];\n      const coins = newCoins as unknown as CoinsParam;\n      return api\n        .balanceAndProveTransaction(\n          ZswapTransaction.deserialize(tx.serialize(getLedgerNetworkId()), getZswapNetworkId()),\n          coins\n        )\n        .then((zswapTx) =>\n          Transaction.deserialize(zswapTx.serialize(getZswapNetworkId()), getLedgerNetworkId())\n        )\n        .then(createBalancedTx);\n    },\n  };\n\n  const midnightProvider: MidnightProvider = {\n    async submitTx(tx: BalancedTransaction): Promise<string> {\n      logger.debug('MidnightProvider', 'Submitting transaction:', {\n        txType: typeof tx,\n        txKeys: tx ? Object.keys(tx) : null,\n        hasSerialize: tx && typeof (tx as { serialize?: unknown }).serialize === 'function',\n      });\n\n      const result = (await api.submitTransaction(tx)) as unknown;\n      if (typeof result === 'string') return result;\n      if (result && typeof result === 'object') {\n        const r = result as { txHash?: string; hash?: string };\n        return r.txHash || r.hash || '';\n      }\n      return '';\n    },\n  };\n\n  // Type assertion: MidnightProviders is a generic type with specific circuit ID, private state ID,\n  // and private state type parameters. Since we're working with dynamically loaded contracts,\n  // we use the base MidnightProviders type without specific generics. The providers are correctly\n  // typed individually, so this cast is safe and simply widens the type for flexibility.\n  return {\n    privateStateProvider,\n    zkConfigProvider,\n    proofProvider,\n    publicDataProvider,\n    walletProvider,\n    midnightProvider,\n  } as MidnightProviders;\n}\n\n// Helper functions (mirror query handler logic)\nfunction deriveIndexerUri(rpcUrl: string): string {\n  const url = new URL(rpcUrl);\n  if (url.protocol === 'ws:') url.protocol = 'http:';\n  else if (url.protocol === 'wss:') url.protocol = 'https:';\n  url.pathname = '/api/v1/graphql';\n  return url.toString();\n}\n\nfunction deriveIndexerWsUri(rpcUrl: string): string {\n  const url = new URL(rpcUrl);\n  if (url.protocol === 'http:') url.protocol = 'ws:';\n  else if (url.protocol === 'https:') url.protocol = 'wss:';\n  url.pathname = '/api/v1/graphql/ws';\n  return url.toString();\n}\n","/**\n * Midnight-specific contract artifacts interface\n * Defines the structure of data needed to load Midnight contracts\n */\nexport interface MidnightContractArtifacts {\n  /** The deployed contract address (required, Bech32m format) */\n  contractAddress: string;\n\n  /** Unique identifier for private state instance (required) */\n  privateStateId: string;\n\n  /**\n   * Contract-level identity secret key property name (derived from artifacts).\n   * Example: 'organizerSecretKey', 'secretKey'. Used as a default for all functions.\n   * Functions may override this in Customize if needed.\n   */\n  identitySecretKeyPropertyName?: string;\n\n  /** TypeScript interface definition from contract.d.ts (required) */\n  contractDefinition: string;\n\n  /** Optional compiled contract code from contract.cjs */\n  contractModule?: string;\n\n  /** Optional witness functions for zero-knowledge proofs */\n  witnessCode?: string;\n\n  /** Optional verifier keys for ZK proofs (from keys directory) */\n  verifierKeys?: Record<string, unknown>;\n\n  /** Optional original ZIP data for auto-save functionality */\n  originalZipData?: string;\n\n  /** Optional trimmed ZIP data (saved when artifacts are trimmed for a specific function) */\n  trimmedZipBase64?: string;\n}\n\n/**\n * Type guard to check if an object matches MidnightContractArtifacts structure\n */\nexport function isMidnightContractArtifacts(obj: unknown): obj is MidnightContractArtifacts {\n  const record = obj as Record<string, unknown>;\n  return (\n    typeof obj === 'object' &&\n    obj !== null &&\n    typeof record.contractAddress === 'string' &&\n    typeof record.privateStateId === 'string' &&\n    typeof record.contractDefinition === 'string'\n  );\n}\n","/**\n * ZIP file extraction utility for Midnight contract artifacts\n * Handles extraction of contract files from uploaded ZIP archives\n */\nimport JSZip from 'jszip';\n\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'ZipExtractor';\n\n/**\n * ZK artifact files for a circuit (used by FetchZkConfigProvider)\n */\nexport interface ZkArtifact {\n  prover: Uint8Array;\n  verifier: Uint8Array;\n  zkir?: Uint8Array;\n}\n\n/**\n * Extracted contract artifacts from ZIP file\n */\nexport interface ExtractedArtifacts {\n  contractDefinition?: string;\n  contractModule?: string;\n  witnessCode?: string;\n  verifierKeys?: Record<string, unknown>;\n  zkArtifacts?: Record<string, ZkArtifact>;\n}\n\n/**\n * Filters out system and hidden files from ZIP file list\n */\nfunction filterZipFiles(files: string[]): string[] {\n  return files.filter(\n    // Ignore macOS resource fork files and __MACOSX dir artifacts\n    (f) => !f.includes('__MACOSX/') && !/\\/_?\\.[^/]+$/.test(f) && !/\\/_\\./.test(f)\n  );\n}\n\n/**\n * Finds the best contract module file from available .cjs files\n */\nfunction findContractModuleFile(files: string[]): string | undefined {\n  const contractModuleFiles = files.filter(\n    (f) => !f.endsWith('/') && f.endsWith('.cjs') && f.includes('contract')\n  );\n\n  return (\n    contractModuleFiles.find((f) => f.endsWith('index.cjs')) ||\n    contractModuleFiles.find((f) => f.includes('contract.cjs')) ||\n    contractModuleFiles[0]\n  );\n}\n\n/**\n * Scores a .d.ts file based on presence of key contract type declarations\n */\ninterface ScoredDefinition {\n  path: string;\n  content: string;\n  score: number;\n}\n\nasync function scoreDefinitionFile(zip: JSZip, path: string): Promise<ScoredDefinition> {\n  const content = await zip.files[path].async('string');\n  const hasCircuits = /export\\s+(?:declare\\s+)?type\\s+Circuits\\s*</s.test(content);\n  const hasLedger = /export\\s+(?:declare\\s+)?type\\s+Ledger\\s*=\\s*\\{/s.test(content);\n  const hasQueries = /export\\s+(?:declare\\s+)?type\\s+Queries\\s*</s.test(content);\n  const score = (hasCircuits ? 2 : 0) + (hasLedger ? 1 : 0) + (hasQueries ? 1 : 0);\n  return { path, content, score };\n}\n\n/**\n * Finds the best contract definition file based on naming patterns and content scoring\n */\nasync function findBestDefinitionFile(\n  zip: JSZip,\n  files: string[]\n): Promise<ScoredDefinition | null> {\n  const definitionFiles = files.filter(\n    (f) => !f.endsWith('/') && (f.endsWith('.d.ts') || f.endsWith('.d.cts'))\n  );\n\n  if (definitionFiles.length === 0) {\n    return null;\n  }\n\n  // Preferred filename patterns (checked in order)\n  const preferredPatterns = [\n    /contract\\/index\\.d\\.(ts|cts)$/,\n    /managed\\/.+\\/contract\\/index\\.d\\.(ts|cts)$/,\n    /index\\.d\\.(ts|cts)$/,\n  ];\n\n  // First pass: check preferred filenames\n  for (const pattern of preferredPatterns) {\n    const matchingFile = definitionFiles.find((f) => pattern.test(f));\n    if (matchingFile) {\n      return await scoreDefinitionFile(zip, matchingFile);\n    }\n  }\n\n  // Second pass: score all definition files and pick the best\n  let bestDef: ScoredDefinition | null = null;\n  for (const file of definitionFiles) {\n    try {\n      const scored = await scoreDefinitionFile(zip, file);\n      if (!bestDef || scored.score > bestDef.score) {\n        bestDef = scored;\n      }\n    } catch {\n      // Skip files that fail to load\n    }\n  }\n\n  return bestDef;\n}\n\n/**\n * Resolves re-exports in TypeScript definition files\n * Follows export * declarations and aggregates content from multiple files\n */\nasync function resolveReExports(\n  zip: JSZip,\n  basePath: string,\n  initialContent: string\n): Promise<string> {\n  const visited = new Set<string>();\n  const queue: Array<{ path: string; content: string }> = [\n    { path: basePath, content: initialContent },\n  ];\n  const aggregate: string[] = [];\n  const maxFiles = 20;\n\n  while (queue.length > 0 && aggregate.length < maxFiles) {\n    const { path, content } = queue.shift()!;\n    if (visited.has(path)) continue;\n\n    visited.add(path);\n    aggregate.push(content);\n\n    const dir = path.substring(0, path.lastIndexOf('/') + 1);\n    const exportAllRe = /export\\s+\\*\\s+from\\s+['\"](.+?)['\"];?/g;\n\n    let match: RegExpExecArray | null;\n    while ((match = exportAllRe.exec(content)) !== null) {\n      const targetRaw = match[1];\n      const resolvedPath = resolveExportPath(dir, targetRaw);\n\n      for (const candidate of resolvedPath) {\n        const file = zip.files[candidate];\n        if (file) {\n          const subContent = await file.async('string');\n          queue.push({ path: candidate, content: subContent });\n          break;\n        }\n      }\n    }\n  }\n\n  if (queue.length > 0 && aggregate.length >= maxFiles) {\n    logger.warn(\n      SYSTEM_LOG_TAG,\n      `Re-export resolution hit safety cap of ${maxFiles} files with ${queue.length} files still pending. ` +\n        `Contract definition may be incomplete. Consider simplifying your re-export chain or increasing the limit.`\n    );\n  }\n\n  return aggregate.join('\\n');\n}\n\n/**\n * Resolves possible file paths for a TypeScript export declaration\n */\nfunction resolveExportPath(baseDir: string, targetPath: string): string[] {\n  const candidates: string[] = [];\n  const rel = targetPath.replace(/^\\.\\//, '');\n\n  if (rel.endsWith('.d.ts') || rel.endsWith('.d.cts')) {\n    candidates.push(baseDir + rel);\n  } else {\n    if (rel.endsWith('.cjs') || rel.endsWith('.js')) {\n      candidates.push(baseDir + rel.replace(/\\.(cjs|js)$/i, '.d.cts'));\n      candidates.push(baseDir + rel.replace(/\\.(cjs|js)$/i, '.d.ts'));\n    } else {\n      candidates.push(baseDir + rel + '.d.cts');\n      candidates.push(baseDir + rel + '.d.ts');\n    }\n\n    const baseSubDir = baseDir + rel.replace(/\\/$/, '');\n    candidates.push(baseSubDir + '/index.d.cts');\n    candidates.push(baseSubDir + '/index.d.ts');\n  }\n\n  return candidates;\n}\n\n/**\n * Appends witness type definitions to contract definition.\n * This enhances the contract definition with witness type information,\n * which is used for identity secret key property derivation.\n */\nasync function appendWitnessTypeDefinitions(\n  zip: JSZip,\n  files: string[],\n  existingDefinition: string\n): Promise<string> {\n  try {\n    const witnessDtsFiles = files.filter(\n      (f) => !f.endsWith('/') && f.endsWith('.d.ts') && /witness/i.test(f) && !/\\.map$/.test(f)\n    );\n\n    if (witnessDtsFiles.length === 0) {\n      logger.debug(SYSTEM_LOG_TAG, 'No witness .d.ts files found in ZIP');\n      return existingDefinition;\n    }\n\n    const contents = await Promise.all(witnessDtsFiles.map((p) => zip.files[p].async('string')));\n    logger.debug(\n      SYSTEM_LOG_TAG,\n      `Appending ${contents.length} witness type definition(s) to contract definition`\n    );\n\n    return [existingDefinition, ...contents].filter(Boolean).join('\\n\\n');\n  } catch (err) {\n    // Log at warning level since this could affect identity secret derivation\n    logger.warn(\n      SYSTEM_LOG_TAG,\n      'Failed to append witness type definitions to contract definition. ' +\n        'Identity secret key property name will default to \"organizerSecretKey\". ' +\n        'You can manually configure this in the Customize step if your contract uses a different property name.',\n      err instanceof Error ? err.message : String(err)\n    );\n    return existingDefinition;\n  }\n}\n\n/**\n * Finds and extracts witness code file\n */\nasync function extractWitnessCode(zip: JSZip, files: string[]): Promise<string | undefined> {\n  const witnessCandidates = files.filter(\n    (f) =>\n      !f.endsWith('/') &&\n      /witness/i.test(f) &&\n      (f.endsWith('.cjs') || f.endsWith('.js') || f.endsWith('.ts')) &&\n      !f.endsWith('.map')\n  );\n\n  if (witnessCandidates.length === 0) {\n    return undefined;\n  }\n\n  const priority = (file: string): number => {\n    if (file.endsWith('.cjs')) return 0;\n    if (file.endsWith('.js')) return 1;\n    if (file.endsWith('.ts')) return 2;\n    return 3;\n  };\n\n  const selectedWitness = witnessCandidates.sort((a, b) => priority(a) - priority(b))[0];\n  return await zip.files[selectedWitness].async('string');\n}\n\n/**\n * Extracts ZK artifacts for a single circuit\n */\nasync function extractCircuitArtifacts(\n  zip: JSZip,\n  files: string[],\n  proverFile: string,\n  circuitName: string\n): Promise<ZkArtifact | null> {\n  try {\n    const proverBytes = await zip.files[proverFile].async('uint8array');\n\n    const verifierFile = files.find(\n      (f) => f.endsWith(`${circuitName}.verifier`) && !/\\/_\\./.test(f)\n    );\n\n    if (!verifierFile) {\n      logger.warn(SYSTEM_LOG_TAG, `No verifier found for prover: ${circuitName}`);\n      return null;\n    }\n\n    const verifierBytes = await zip.files[verifierFile].async('uint8array');\n\n    const zkirFileB = files.find((f) => f.endsWith(`${circuitName}.bzkir`) && !/\\/_.\\./.test(f));\n    const zkirFileZ = files.find((f) => f.endsWith(`${circuitName}.zkir`) && !/\\/_.\\./.test(f));\n    const zkirFile = zkirFileB || zkirFileZ;\n\n    let zkirBytes: Uint8Array | undefined;\n    if (zkirFile) {\n      zkirBytes = await zip.files[zkirFile].async('uint8array');\n      logger.debug(\n        SYSTEM_LOG_TAG,\n        `Found ${zkirFile.endsWith('.bzkir') ? 'bzkir' : 'zkir'} for ${circuitName}: ${zkirBytes.length} bytes`\n      );\n\n      if (!zkirFileB && zkirFileZ) {\n        logger.warn(\n          SYSTEM_LOG_TAG,\n          `Using legacy textual .zkir for ${circuitName}. Proof server may require binary .bzkir; if you encounter 400 errors, rebuild artifacts to include .bzkir.`\n        );\n      }\n    } else {\n      logger.warn(SYSTEM_LOG_TAG, `No zkir/bzkir file found for ${circuitName}`);\n    }\n\n    logger.info(\n      SYSTEM_LOG_TAG,\n      `Extracted ZK artifacts for ${circuitName}: prover=${proverBytes.length}b verifier=${verifierBytes.length}b zkir=${zkirBytes?.length ?? 0}b`\n    );\n\n    return {\n      prover: proverBytes,\n      verifier: verifierBytes,\n      zkir: zkirBytes,\n    };\n  } catch (err) {\n    logger.warn(SYSTEM_LOG_TAG, `Failed to extract ZK artifacts for ${circuitName}:`, err);\n    return null;\n  }\n}\n\n/**\n * Extracts all ZK artifacts from the ZIP file\n */\nasync function extractZkArtifacts(\n  zip: JSZip,\n  files: string[]\n): Promise<Record<string, ZkArtifact>> {\n  const zkArtifacts: Record<string, ZkArtifact> = {};\n\n  const proverFiles = files.filter(\n    (f) => !f.endsWith('/') && f.endsWith('.prover') && !/\\/_\\./.test(f)\n  );\n\n  logger.info(SYSTEM_LOG_TAG, `Found ${proverFiles.length} .prover files in ZIP:`, proverFiles);\n\n  for (const proverFile of proverFiles) {\n    const match = proverFile.match(/([^/]+)\\.prover$/);\n    if (!match) continue;\n\n    const circuitName = match[1];\n    logger.debug(SYSTEM_LOG_TAG, `Processing circuit: ${circuitName} from ${proverFile}`);\n\n    const artifact = await extractCircuitArtifacts(zip, files, proverFile, circuitName);\n    if (artifact) {\n      zkArtifacts[circuitName] = artifact;\n    }\n  }\n\n  if (Object.keys(zkArtifacts).length > 0) {\n    logger.info(SYSTEM_LOG_TAG, `Extracted ${Object.keys(zkArtifacts).length} ZK artifact sets`);\n  } else {\n    logger.warn(\n      SYSTEM_LOG_TAG,\n      'No ZK artifacts extracted! This may prevent transaction execution.'\n    );\n  }\n\n  return zkArtifacts;\n}\n\n/**\n * Extracts legacy verifier keys for backward compatibility\n */\nasync function extractLegacyVerifierKeys(\n  zip: JSZip,\n  files: string[]\n): Promise<Record<string, unknown>> {\n  const verifierKeys: Record<string, unknown> = {};\n\n  const verifierFiles = files.filter(\n    (f) => !f.endsWith('/') && f.endsWith('.verifier') && !/\\/_\\./.test(f)\n  );\n\n  for (const verifierFile of verifierFiles) {\n    const match = verifierFile.match(/([^/]+)\\.verifier$/);\n    if (!match) continue;\n\n    const circuitName = match[1];\n    try {\n      const bytes = await zip.files[verifierFile].async('uint8array');\n\n      try {\n        const text = new TextDecoder().decode(bytes);\n        const parsed = JSON.parse(text);\n        verifierKeys[circuitName] = parsed;\n      } catch {\n        verifierKeys[circuitName] = bytes;\n      }\n    } catch (err) {\n      logger.warn(SYSTEM_LOG_TAG, `Failed to parse verifier key for ${circuitName}:`, err);\n    }\n  }\n\n  return verifierKeys;\n}\n\n/**\n * Validates that required artifacts are present\n */\nfunction validateRequiredArtifacts(artifacts: ExtractedArtifacts): void {\n  if (!artifacts.contractModule) {\n    throw new Error(\n      'Missing required contract module (.cjs file). Please ensure your ZIP contains the compiled contract code.'\n    );\n  }\n\n  if (!artifacts.contractDefinition) {\n    throw new Error(\n      'Missing required contract definition (.d.ts file). Please ensure your ZIP contains the TypeScript interface definition.'\n    );\n  }\n}\n\n/**\n * Extracts Midnight contract artifacts from a ZIP file\n * Supports flexible directory structures and searches for required files\n *\n * @param zipData - ZIP file data as ArrayBuffer, Blob, or base64 string\n * @returns Extracted artifacts\n * @throws Error if ZIP is invalid or required files are missing\n */\nexport async function extractMidnightContractZip(\n  zipData: ArrayBuffer | Blob | string\n): Promise<ExtractedArtifacts> {\n  logger.info(SYSTEM_LOG_TAG, 'Starting ZIP extraction');\n\n  try {\n    const zip = await JSZip.loadAsync(\n      zipData,\n      typeof zipData === 'string' ? { base64: true } : undefined\n    );\n\n    const files = filterZipFiles(Object.keys(zip.files));\n    const artifacts: ExtractedArtifacts = {};\n\n    // Extract contract module\n    const contractModuleFile = findContractModuleFile(files);\n    if (contractModuleFile) {\n      artifacts.contractModule = await zip.files[contractModuleFile].async('string');\n    }\n\n    // Extract contract definition\n    const bestDef = await findBestDefinitionFile(zip, files);\n    if (bestDef) {\n      const resolved = await resolveReExports(zip, bestDef.path, bestDef.content);\n      artifacts.contractDefinition = await appendWitnessTypeDefinitions(zip, files, resolved);\n    }\n\n    // Extract witness code\n    artifacts.witnessCode = await extractWitnessCode(zip, files);\n\n    // Extract ZK artifacts\n    const zkArtifacts = await extractZkArtifacts(zip, files);\n    if (Object.keys(zkArtifacts).length > 0) {\n      artifacts.zkArtifacts = zkArtifacts;\n    }\n\n    // Extract legacy verifier keys\n    const verifierKeys = await extractLegacyVerifierKeys(zip, files);\n    if (Object.keys(verifierKeys).length > 0) {\n      artifacts.verifierKeys = verifierKeys;\n    }\n\n    // Validate required artifacts are present\n    validateRequiredArtifacts(artifacts);\n\n    logger.info(\n      SYSTEM_LOG_TAG,\n      `ZIP extracted. module:${!!artifacts.contractModule} d.ts:${!!artifacts.contractDefinition} witness:${!!artifacts.witnessCode} zkArtifacts:${Object.keys(artifacts.zkArtifacts || {}).length} legacyKeys:${Object.keys(verifierKeys).length}`\n    );\n\n    return artifacts;\n  } catch (e) {\n    logger.error(SYSTEM_LOG_TAG, 'Failed to extract ZIP file:', e);\n\n    if (e instanceof Error) {\n      if (e.message.includes('not a valid zip')) {\n        throw new Error(\n          'Invalid ZIP file. Please upload a valid ZIP archive containing your contract artifacts.'\n        );\n      }\n      throw e;\n    }\n\n    throw new Error('Failed to extract contract artifacts from ZIP file');\n  }\n}\n\n/**\n * Converts a File object to base64 string for storage\n *\n * @param file - File object from file input\n * @returns Base64 encoded string\n */\nexport async function fileToBase64(file: File): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      if (typeof reader.result === 'string') {\n        // Remove data URL prefix to get just base64\n        const base64 = reader.result.split(',')[1];\n        resolve(base64);\n      } else {\n        reject(new Error('Failed to convert file to base64'));\n      }\n    };\n    reader.onerror = reject;\n    reader.readAsDataURL(file);\n  });\n}\n\n/**\n * Validates that a ZIP file contains the expected Midnight contract structure\n * This is a lighter validation than extraction - just checks file presence\n *\n * @param zipData - ZIP file data\n * @returns Object with validation results\n */\nexport async function validateMidnightZip(zipData: ArrayBuffer | Blob | string): Promise<{\n  isValid: boolean;\n  hasContractModule: boolean;\n  hasContractDefinition: boolean;\n  hasVerifierKeys: boolean;\n  hasWitnessCode: boolean;\n  errors: string[];\n}> {\n  const errors: string[] = [];\n\n  try {\n    const zip = await JSZip.loadAsync(\n      zipData,\n      typeof zipData === 'string' ? { base64: true } : undefined\n    );\n    const files = Object.keys(zip.files);\n\n    const hasContractModule = files.some((f) => f.endsWith('.cjs'));\n    const hasContractDefinition = files.some((f) => f.endsWith('.d.ts'));\n    const hasVerifierKeys = files.some((f) => f.endsWith('.verifier'));\n    const hasWitnessCode = files.some(\n      (f) => f.includes('witness') && (f.endsWith('.js') || f.endsWith('.ts') || f.endsWith('.cjs'))\n    );\n\n    if (!hasContractModule) {\n      errors.push('No contract module (.cjs) file found');\n    }\n    if (!hasContractDefinition) {\n      errors.push('No contract definition (.d.ts) file found');\n    }\n\n    return {\n      isValid: errors.length === 0,\n      hasContractModule,\n      hasContractDefinition,\n      hasVerifierKeys,\n      hasWitnessCode,\n      errors,\n    };\n  } catch {\n    return {\n      isValid: false,\n      hasContractModule: false,\n      hasContractDefinition: false,\n      hasVerifierKeys: false,\n      hasWitnessCode: false,\n      errors: ['Invalid ZIP file format'],\n    };\n  }\n}\n","/**\n * Utility functions for Midnight contract artifacts validation and conversion\n */\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { globalZkConfigProvider } from '../transaction/providers';\nimport type { MidnightContractArtifacts } from '../types/artifacts';\nimport { isMidnightContractArtifacts } from '../types/artifacts';\nimport { deriveIdentitySecretPropertyName } from './identity-secret-derivation';\nimport { extractMidnightContractZip, fileToBase64 } from './zip-extractor';\n\nconst SYSTEM_LOG_TAG = 'ArtifactsValidator';\n\n/**\n * Validates and converts generic source input to MidnightContractArtifacts\n * Now supports ZIP file uploads in addition to direct artifacts\n *\n * @param source - Generic contract source (string address or artifacts object)\n * @returns Validated MidnightContractArtifacts\n * @throws Error if the source is invalid\n */\nexport async function validateAndConvertMidnightArtifacts(\n  source: string | Record<string, unknown>\n): Promise<MidnightContractArtifacts> {\n  if (typeof source === 'string') {\n    throw new Error(\n      'Midnight adapter requires contract artifacts object, not just an address string.'\n    );\n  }\n\n  // Support URL-based artifacts (exported apps fetching static asset)\n  if (\n    typeof (source as Record<string, unknown>).contractArtifactsUrl === 'string' &&\n    (source as Record<string, unknown>).contractArtifactsUrl\n  ) {\n    logger.info(SYSTEM_LOG_TAG, 'Processing URL-based artifacts');\n    const url = (source as Record<string, unknown>).contractArtifactsUrl as string;\n    const resp = await fetch(url);\n    if (!resp.ok) {\n      throw new Error(`Failed to fetch artifacts ZIP from ${url} (${resp.status})`);\n    }\n    const blob = await resp.blob();\n    const extractedArtifacts = await extractMidnightContractZip(blob);\n\n    if (!extractedArtifacts.contractDefinition) {\n      throw new Error('Contract definition is missing from the fetched ZIP.');\n    }\n    if (!extractedArtifacts.contractModule) {\n      throw new Error('Contract module is missing from the fetched ZIP.');\n    }\n\n    if (extractedArtifacts.zkArtifacts) {\n      globalZkConfigProvider.registerAll(extractedArtifacts.zkArtifacts);\n      logger.info(\n        SYSTEM_LOG_TAG,\n        `Registered ${Object.keys(extractedArtifacts.zkArtifacts).length} ZK artifact sets with EmbeddedZkConfigProvider:`,\n        Object.keys(extractedArtifacts.zkArtifacts)\n      );\n    }\n\n    const sourceRecord = source as Record<string, unknown>;\n    if (!sourceRecord.contractAddress || !sourceRecord.privateStateId) {\n      throw new Error('Contract address and private state ID are required.');\n    }\n\n    const artifacts: MidnightContractArtifacts = {\n      contractAddress: sourceRecord.contractAddress as string,\n      privateStateId: sourceRecord.privateStateId as string,\n      contractDefinition: extractedArtifacts.contractDefinition,\n      contractModule: extractedArtifacts.contractModule,\n      witnessCode: extractedArtifacts.witnessCode,\n      verifierKeys: extractedArtifacts.verifierKeys,\n      // Note: do not set originalZipData when loading via URL\n    };\n    // Derive and store contract-level default for identity secret key property\n    artifacts.identitySecretKeyPropertyName =\n      deriveIdentitySecretPropertyName(artifacts) ?? undefined;\n    return artifacts;\n  }\n\n  // Support loading from a previously trimmed ZIP saved in IndexedDB\n  // This path is used when a configuration was saved with `trimmedZipBase64`\n  // instead of the original heavy ZIP. Treat it the same as a base64 ZIP upload.\n  if (\n    typeof (source as Record<string, unknown>).trimmedZipBase64 === 'string' &&\n    (source as Record<string, unknown>).trimmedZipBase64\n  ) {\n    logger.info(SYSTEM_LOG_TAG, 'Processing trimmed base64 ZIP from saved configuration');\n\n    const base64Data = (source as Record<string, unknown>).trimmedZipBase64 as string;\n\n    const extractedArtifacts = await extractMidnightContractZip(base64Data);\n\n    if (!extractedArtifacts.contractDefinition) {\n      throw new Error('Contract definition is missing from the trimmed ZIP.');\n    }\n    if (!extractedArtifacts.contractModule) {\n      throw new Error('Contract module is missing from the trimmed ZIP.');\n    }\n\n    if (extractedArtifacts.zkArtifacts) {\n      globalZkConfigProvider.registerAll(extractedArtifacts.zkArtifacts);\n      logger.info(\n        SYSTEM_LOG_TAG,\n        `Registered ${Object.keys(extractedArtifacts.zkArtifacts).length} ZK artifact sets with EmbeddedZkConfigProvider:`,\n        Object.keys(extractedArtifacts.zkArtifacts)\n      );\n    }\n\n    const sourceRecord = source as Record<string, unknown>;\n    if (!sourceRecord.contractAddress || !sourceRecord.privateStateId) {\n      throw new Error('Contract address and private state ID are required.');\n    }\n\n    const artifacts: MidnightContractArtifacts = {\n      contractAddress: sourceRecord.contractAddress as string,\n      privateStateId: sourceRecord.privateStateId as string,\n      contractDefinition: extractedArtifacts.contractDefinition,\n      contractModule: extractedArtifacts.contractModule,\n      witnessCode: extractedArtifacts.witnessCode,\n      verifierKeys: extractedArtifacts.verifierKeys,\n      trimmedZipBase64: base64Data, // Preserve for persistence and export\n      // Note: keep storage minimal; do not set originalZipData here\n    };\n    artifacts.identitySecretKeyPropertyName =\n      deriveIdentitySecretPropertyName(artifacts) ?? undefined;\n    return artifacts;\n  }\n\n  // Check if this is a ZIP upload\n  if (source.contractArtifactsZip) {\n    logger.info(SYSTEM_LOG_TAG, 'Processing ZIP file upload');\n\n    const zipData = source.contractArtifactsZip;\n    let base64Data: string;\n\n    // Handle different input formats\n    if (zipData instanceof File) {\n      // Convert File to base64 for storage\n      base64Data = await fileToBase64(zipData);\n    } else if (typeof zipData === 'string') {\n      // Already base64 (from auto-save restore)\n      base64Data = zipData;\n    } else {\n      throw new Error('Invalid ZIP file format. Expected File or base64 string.');\n    }\n\n    // Extract artifacts from ZIP\n    const extractedArtifacts = await extractMidnightContractZip(base64Data);\n\n    // Validate required fields from extraction\n    if (!extractedArtifacts.contractDefinition) {\n      throw new Error(\n        'Contract definition is missing from the extracted artifacts. The ZIP file may be corrupted or incomplete.'\n      );\n    }\n\n    if (!extractedArtifacts.contractModule) {\n      throw new Error(\n        'Contract module is missing from the extracted artifacts. The ZIP file may be corrupted or incomplete.'\n      );\n    }\n\n    // Register ZK artifacts with the global provider (works in dev and production)\n    if (extractedArtifacts.zkArtifacts) {\n      globalZkConfigProvider.registerAll(extractedArtifacts.zkArtifacts);\n      logger.info(\n        SYSTEM_LOG_TAG,\n        `Registered ${Object.keys(extractedArtifacts.zkArtifacts).length} ZK artifact sets with EmbeddedZkConfigProvider:`,\n        Object.keys(extractedArtifacts.zkArtifacts)\n      );\n    }\n\n    // Validate required form fields\n    if (!source.contractAddress || !source.privateStateId) {\n      throw new Error('Contract address and private state ID are required.');\n    }\n\n    // Combine with address and privateStateId (all fields are now validated)\n    const artifacts: MidnightContractArtifacts = {\n      contractAddress: source.contractAddress as string,\n      privateStateId: source.privateStateId as string,\n      contractDefinition: extractedArtifacts.contractDefinition,\n      contractModule: extractedArtifacts.contractModule,\n      witnessCode: extractedArtifacts.witnessCode,\n      verifierKeys: extractedArtifacts.verifierKeys,\n      originalZipData: base64Data, // Store for auto-save\n    };\n\n    artifacts.identitySecretKeyPropertyName =\n      deriveIdentitySecretPropertyName(artifacts) ?? undefined;\n    return artifacts;\n  }\n\n  // Legacy path: direct artifacts object\n  if (!isMidnightContractArtifacts(source)) {\n    throw new Error(\n      'Invalid contract artifacts provided. Expected an object with contractAddress, privateStateId, and contractDefinition properties.'\n    );\n  }\n\n  return source;\n}\n","import type { MidnightNetworkConfig } from '@openzeppelin/ui-builder-types';\n\n/**\n * Returns the numeric network ID from MidnightNetworkConfig.networkId map\n */\nexport function getNumericNetworkId(config: MidnightNetworkConfig): number | undefined {\n  const entries = Object.entries(config.networkId || {});\n  if (entries.length === 0) return undefined;\n  const [numericIdStr] = entries[0] as [string, string];\n  return Number(numericIdStr);\n}\n\n/**\n * Returns the enum network ID name from MidnightNetworkConfig.networkId map\n */\nexport function getNetworkId(config: MidnightNetworkConfig): string | undefined {\n  const entries = Object.entries(config.networkId || {});\n  if (entries.length === 0) return undefined;\n  const [, name] = entries[0] as [string, string];\n  return name;\n}\n","// Barrel file for utils module\nexport * from './artifacts';\nexport * from './circuit-type-utils';\nexport * from './schema-parser';\nexport * from './zip-extractor';\nexport { getNetworkId, getNumericNetworkId } from './network-id';\n","import { MidnightBech32m } from '@midnight-ntwrk/wallet-sdk-address-format';\n\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\n/**\n * Address validation utilities for Midnight Network\n *\n * Uses the official @midnight-ntwrk/wallet-sdk-address-format package\n * for Bech32m validation.\n *\n * @see https://github.com/midnightntwrk\n */\n\n/**\n * Error messages for contract address validation\n * Matches the Midnight Deploy CLI validation\n */\nexport const CONTRACT_VALIDATION_ERRORS = {\n  INVALID_FORMAT: 'Invalid contract address format',\n  INVALID_LENGTH: 'Contract address must be 68 hex characters',\n  INVALID_PREFIX: 'Contract address must start with 0200',\n  INVALID_CHARACTERS: 'Invalid characters in contract address',\n} as const;\n\n/**\n * Error messages for user address validation\n */\nexport const USER_VALIDATION_ERRORS = {\n  INVALID_FORMAT: 'Invalid address format',\n  MISSING_SEPARATOR: 'Bech32m address missing separator \"1\"',\n  INVALID_BECH32M: 'Invalid Bech32m encoding',\n  INVALID_PREFIX: 'Invalid address prefix',\n} as const;\n\n/**\n * Validates a Midnight contract address\n *\n * Midnight contract addresses are 68-character hex strings that start with \"0200\"\n * Example: 0200326c95873182775840764ae28e8750f73a68f236800171ebd92520e96a9fffb6\n *\n * This implementation matches the validation logic from midnight-deploy-cli\n *\n * @param address The address to validate\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateContractAddress(address: string): {\n  isValid: boolean;\n  error?: string;\n  normalized?: string;\n} {\n  try {\n    // Basic format checks\n    if (!address || typeof address !== 'string') {\n      return {\n        isValid: false,\n        error: CONTRACT_VALIDATION_ERRORS.INVALID_FORMAT,\n      };\n    }\n\n    // Trim and normalize\n    const trimmed = address.trim().toLowerCase();\n\n    // Check length (68 hex characters)\n    if (trimmed.length !== 68) {\n      return {\n        isValid: false,\n        error: CONTRACT_VALIDATION_ERRORS.INVALID_LENGTH,\n      };\n    }\n\n    // Check prefix (must start with 0200)\n    if (!trimmed.startsWith('0200')) {\n      return {\n        isValid: false,\n        error: CONTRACT_VALIDATION_ERRORS.INVALID_PREFIX,\n      };\n    }\n\n    // Check for valid hex characters\n    const hexRegex = /^[0-9a-f]+$/;\n    if (!hexRegex.test(trimmed)) {\n      return {\n        isValid: false,\n        error: CONTRACT_VALIDATION_ERRORS.INVALID_CHARACTERS,\n      };\n    }\n\n    logger.debug('validateContractAddress', `Valid contract address: ${trimmed}`);\n\n    return {\n      isValid: true,\n      normalized: trimmed,\n    };\n  } catch {\n    return {\n      isValid: false,\n      error: CONTRACT_VALIDATION_ERRORS.INVALID_FORMAT,\n    };\n  }\n}\n\n/**\n * Formats a contract address to ensure consistent representation\n *\n * @param address The contract address to format\n * @returns The formatted address (lowercase, trimmed) or null if invalid\n */\nexport function formatContractAddress(address: string): string | null {\n  const validation = validateContractAddress(address);\n  return validation.isValid ? validation.normalized! : null;\n}\n\n/**\n * Converts a hex contract address to the format expected by the indexer\n * For Midnight, this is just the hex address itself (already in the right format)\n *\n * @param address The hex contract address\n * @returns The address in indexer format (same as input for Midnight)\n */\nexport function contractAddressToHex(address: string): string {\n  const validation = validateContractAddress(address);\n\n  if (!validation.isValid) {\n    throw new Error(`Invalid contract address: ${validation.error}`);\n  }\n\n  // Return the normalized (lowercase) hex address\n  return validation.normalized!;\n}\n\n/**\n * Checks if a string looks like a valid Midnight contract address\n * Quick check without full validation\n *\n * @param address The address to check\n * @returns True if the address has the correct format\n */\nexport function isValidContractAddressFormat(address: string): boolean {\n  if (!address || typeof address !== 'string') {\n    return false;\n  }\n\n  const trimmed = address.trim().toLowerCase();\n\n  // Quick check: 68 chars, starts with 0200, looks like hex\n  return trimmed.length === 68 && trimmed.startsWith('0200') && /^[0-9a-f]+$/.test(trimmed);\n}\n\n/**\n * Valid Bech32m address type prefixes for Midnight user addresses\n * Note: Midnight uses compound prefixes in the format: <network>-<type>_<env>\n * For example: mn_shield-addr_test, mn_shield-naddr_test\n * The Bech32m prefix (before the '1' separator) includes the full compound prefix.\n */\nexport const MIDNIGHT_ADDRESS_TYPES = {\n  SHIELDED: 'addr', // Shielded addresses\n  UNSHIELDED: 'naddr', // Unshielded addresses (Night addresses)\n  DUST: 'dust', // Dust addresses\n  COIN_PUBLIC_KEY: 'cpk', // Coin public key\n  ENCRYPTION_PUBLIC_KEY: 'epk', // Encryption public key\n} as const;\n\n/**\n * Validates a Midnight user address (Bech32m format)\n *\n * Midnight user addresses use Bech32m encoding with compound prefixes in the format:\n * <network>-<type>_<env>1<data>\n *\n * Examples:\n * - mn_shield-addr_test1... (shielded testnet address)\n * - mn_shield-naddr_test1... (unshielded testnet address)\n * - mn_shield-addr1... (shielded mainnet address)\n *\n * Address types:\n * - addr: Shielded addresses\n * - naddr: Unshielded addresses (Night addresses)\n * - dust: Dust addresses\n * - cpk: Coin public keys\n * - epk: Encryption public keys\n *\n * Uses the official @midnight-ntwrk/wallet-sdk-address-format MidnightBech32m parser\n * for proper validation. Implements a two-phase approach for performance:\n * 1. Fast preliminary checks for obviously invalid/incomplete addresses\n * 2. Full Bech32m validation (including checksum) only for addresses that look complete\n *\n * @param address The address to validate\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateUserAddress(address: string): {\n  isValid: boolean;\n  error?: string;\n  prefix?: string;\n} {\n  try {\n    if (!address || typeof address !== 'string') {\n      return {\n        isValid: false,\n        error: USER_VALIDATION_ERRORS.INVALID_FORMAT,\n      };\n    }\n\n    const trimmed = address.trim().toLowerCase();\n\n    if (trimmed.length === 0) {\n      return {\n        isValid: false,\n        error: USER_VALIDATION_ERRORS.INVALID_FORMAT,\n      };\n    }\n\n    // Fast preliminary checks before expensive Bech32m parsing\n\n    // Check for Bech32m separator '1'\n    if (!trimmed.includes('1')) {\n      return {\n        isValid: false,\n        error: USER_VALIDATION_ERRORS.MISSING_SEPARATOR,\n      };\n    }\n\n    // Quick length check - Midnight addresses are typically 100+ characters\n    // Skip full validation if address is obviously too short (still being typed)\n    if (trimmed.length < 80) {\n      return {\n        isValid: false,\n        error: USER_VALIDATION_ERRORS.INVALID_FORMAT,\n      };\n    }\n\n    // Extract type from prefix for quick check\n    const separatorIndex = trimmed.lastIndexOf('1');\n    if (separatorIndex === -1 || separatorIndex === trimmed.length - 1) {\n      return {\n        isValid: false,\n        error: USER_VALIDATION_ERRORS.MISSING_SEPARATOR,\n      };\n    }\n\n    const prefix = trimmed.substring(0, separatorIndex);\n    const validAddressTypes = Object.values(MIDNIGHT_ADDRESS_TYPES);\n    const hasValidAddressType = validAddressTypes.some((type) => prefix.includes(type));\n\n    if (!hasValidAddressType) {\n      return {\n        isValid: false,\n        error: USER_VALIDATION_ERRORS.INVALID_PREFIX,\n        prefix: prefix,\n      };\n    }\n\n    // Only run expensive Bech32m validation if preliminary checks pass\n    // This includes full checksum verification\n    const parsed = MidnightBech32m.parse(trimmed);\n\n    logger.debug('validateUserAddress', `Valid user address: ${trimmed} (type: ${parsed.type})`);\n\n    return {\n      isValid: true,\n      prefix: parsed.type,\n    };\n  } catch (err) {\n    // Validation failures are expected during user input (typing, incomplete addresses)\n    // Log at debug level to avoid noise in console\n    logger.debug('validateUserAddress', 'Address validation failed', {\n      address: address,\n      error: err,\n    });\n    return {\n      isValid: false,\n      error: USER_VALIDATION_ERRORS.INVALID_BECH32M,\n    };\n  }\n}\n\n/**\n * Checks if a string looks like a valid Midnight user address\n * Quick check without full Bech32m validation\n *\n * @param address The address to check\n * @returns True if the address has the correct format\n */\nexport function isValidUserAddressFormat(address: string): boolean {\n  if (!address || typeof address !== 'string') {\n    return false;\n  }\n\n  const trimmed = address.trim().toLowerCase();\n  const validAddressTypes = Object.values(MIDNIGHT_ADDRESS_TYPES);\n\n  // Quick check: contains Bech32m separator and has a valid address type\n  // The address may have compound prefixes like \"mn_shield-addr_test1...\"\n  return (\n    trimmed.includes('1') &&\n    validAddressTypes.some((type) => trimmed.includes(type)) &&\n    trimmed.length > 20\n  );\n}\n\n/**\n * Validates any Midnight address (contract or user)\n *\n * This is a convenience function that tries both contract and user address validation.\n * Used by the adapter's isValidAddress() method for general validation.\n *\n * @param address The address to validate\n * @returns True if the address is valid (either contract or user format)\n */\nexport function isValidAddress(address: string): boolean {\n  // Try contract address format first (68-char hex)\n  if (isValidContractAddressFormat(address)) {\n    return validateContractAddress(address).isValid;\n  }\n\n  // Try user address format (Bech32m)\n  if (isValidUserAddressFormat(address)) {\n    return validateUserAddress(address).isValid;\n  }\n\n  return false;\n}\n","// Barrel file for validation module\nexport * from './address';\n","import type {\n  EoaExecutionConfig,\n  ExecutionConfig,\n  ExecutionMethodDetail,\n} from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { isValidAddress } from '../validation';\n\nconst SYSTEM_LOG_TAG = 'adapter-midnight-execution-config';\n\n/**\n * Returns details for execution methods supported by the Midnight adapter.\n */\nexport async function getMidnightSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n  return Promise.resolve([\n    {\n      type: 'eoa',\n      name: 'EOA (Midnight Account)',\n      description: 'Execute using a standard Midnight account.',\n    },\n  ]);\n}\n\n/**\n * Validates EOA execution configuration for Midnight.\n */\nasync function _validateEoaConfig(config: EoaExecutionConfig): Promise<true | string> {\n  if (!config.allowAny && !config.specificAddress) {\n    return 'Specific EOA address is required when \"Allow Any\" is disabled.';\n  }\n\n  if (!config.allowAny && config.specificAddress && !isValidAddress(config.specificAddress)) {\n    return 'Invalid EOA address format for Midnight.';\n  }\n\n  return true;\n}\n\n/**\n * Validates the complete execution configuration object against the\n * requirements and capabilities of the Midnight adapter.\n */\nexport async function validateMidnightExecutionConfig(\n  config: ExecutionConfig\n): Promise<true | string> {\n  logger.info(SYSTEM_LOG_TAG, 'Validating Midnight execution config:', { config });\n\n  switch (config.method) {\n    case 'eoa':\n      return _validateEoaConfig(config as EoaExecutionConfig);\n    default: {\n      const unknownMethod = (config as ExecutionConfig).method;\n      logger.warn(\n        SYSTEM_LOG_TAG,\n        `Unsupported execution method type encountered: ${unknownMethod}`\n      );\n      return `Unsupported execution method type: ${unknownMethod}`;\n    }\n  }\n}\n","import { NetworkConfig } from '@openzeppelin/ui-builder-types';\nimport type { UserExplorerConfig } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\n/**\n * Gets a blockchain explorer URL for an address on Midnight.\n * Uses the explorerUrl from the network configuration.\n *\n * @param address The address to get the explorer URL for\n * @param networkConfig The network configuration object.\n * @returns A URL to view the address on the configured Midnight explorer, or null.\n */\nexport function getMidnightExplorerAddressUrl(\n  address: string,\n  networkConfig: NetworkConfig\n): string | null {\n  // Placeholder: Implement logic using networkConfig.explorerUrl if available\n  if (!address || !networkConfig.explorerUrl) {\n    return null;\n  }\n  // Example construction (adjust path as needed for Midnight)\n  const baseUrl = networkConfig.explorerUrl.replace(/\\/+$/, '');\n  return `${baseUrl}/address/${address}`; // Assuming similar path to others\n}\n\n/**\n * Gets a blockchain explorer URL for a transaction on Midnight.\n * Uses the explorerUrl from the network configuration.\n *\n * @param txHash - The hash of the transaction to get the explorer URL for\n * @param networkConfig The network configuration object.\n * @returns A URL to view the transaction on the configured Midnight explorer, or null.\n */\nexport function getMidnightExplorerTxUrl(\n  txHash: string,\n  networkConfig: NetworkConfig\n): string | null {\n  // Placeholder: Implement logic using networkConfig.explorerUrl if available\n  if (!txHash || !networkConfig.explorerUrl) {\n    return null;\n  }\n  // Example construction (adjust path as needed for Midnight)\n  const baseUrl = networkConfig.explorerUrl.replace(/\\/+$/, '');\n  return `${baseUrl}/tx/${txHash}`; // Assuming similar path to others\n}\n\n/**\n * Validates an explorer configuration for Midnight networks.\n * @param explorerConfig - The explorer configuration to validate\n * @returns True if the configuration is valid, false otherwise\n */\nexport function validateMidnightExplorerConfig(_explorerConfig: UserExplorerConfig): boolean {\n  // TODO: Implement Midnight-specific explorer validation when needed\n  logger.info('validateMidnightExplorerConfig', 'Midnight explorer validation not yet implemented');\n  return true;\n}\n\n/**\n * Tests the connection to a Midnight explorer API.\n * @param explorerConfig - The explorer configuration to test\n * @returns Connection test results including success status, latency, and any errors\n */\nexport async function testMidnightExplorerConnection(_explorerConfig: UserExplorerConfig): Promise<{\n  success: boolean;\n  latency?: number;\n  error?: string;\n}> {\n  // TODO: Implement explorer connection testing for Midnight\n  logger.info('testMidnightExplorerConnection', 'TODO: Implement explorer connection testing');\n  return { success: true };\n}\n","import type { UserRpcProviderConfig } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\n/**\n * Validates an RPC endpoint configuration for Midnight networks.\n * @param rpcConfig - The RPC provider configuration to validate\n * @returns True if the configuration is valid, false otherwise\n */\nexport function validateMidnightRpcEndpoint(_rpcConfig: UserRpcProviderConfig): boolean {\n  // TODO: Implement Midnight-specific RPC validation when needed\n  logger.info('validateMidnightRpcEndpoint', 'Midnight RPC validation not yet implemented');\n  return true;\n}\n\n/**\n * Tests the connection to a Midnight RPC endpoint.\n * @param rpcConfig - The RPC provider configuration to test\n * @returns Connection test results including success status, latency, and any errors\n */\nexport async function testMidnightRpcConnection(_rpcConfig: UserRpcProviderConfig): Promise<{\n  success: boolean;\n  latency?: number;\n  error?: string;\n}> {\n  // TODO: Implement RPC connection testing for Midnight\n  logger.info('testMidnightRpcConnection', 'TODO: Implement RPC connection testing');\n  return { success: true };\n}\n","// Barrel file for configuration modules\nexport * from './execution';\nexport * from './explorer';\nexport * from './network-services';\nexport * from './provider';\nexport * from './rpc';\n","import { Buffer } from 'buffer';\nimport type { MidnightProviders } from '@midnight-ntwrk/midnight-js-types';\n\nimport type { ContractSchema } from '@openzeppelin/ui-builder-types';\nimport { logger, withTimeout } from '@openzeppelin/ui-builder-utils';\n\nimport { validateContractAddress } from '../validation/address';\n\n/**\n * Default timeout for query operations in milliseconds (30 seconds)\n */\nexport const DEFAULT_QUERY_TIMEOUT = 30000;\n\n/**\n * Error thrown when contract state cannot be queried\n */\nexport class ContractQueryError extends Error {\n  constructor(\n    message: string,\n    public readonly contractAddress: string,\n    public readonly functionId?: string\n  ) {\n    super(message);\n    this.name = 'ContractQueryError';\n  }\n}\n\n/**\n * Browser-safe QueryExecutor for read-only contract queries.\n * Handles contract state reads via Midnight providers with timeout support.\n *\n * Rationale:\n * - EVM and Stellar adapters expose only functional handlers; Midnight requires extra orchestration.\n * - This class encapsulates Midnight-specific concerns that benefit from stateful caching:\n *   - Dynamic ledger() loading from the compiled contract module and reuse across calls\n *   - Heterogeneous state fetch/deserialization (raw hex vs pre-deserialized objects)\n *   - Network ID coordination for compact-runtime deserialization\n *   - Consistent timeout handling and structured error reporting\n * Keeping these concerns localized preserves a functional public boundary\n * (queryMidnightViewFunction) while isolating chain-specific complexity for maintainability.\n */\nexport class QueryExecutor {\n  private readonly contractAddressHex: string;\n  private readonly contractAddressBech32: string;\n  private readonly schema: ContractSchema;\n  private readonly providers: MidnightProviders;\n  private readonly timeout: number;\n  private readonly contractModule?: string;\n  private readonly numericNetworkId?: number;\n  private ledgerFunction?: (state: unknown) => unknown;\n  // Maximum allowed size (approximate, in characters) for compiled contract module code\n  private static readonly MAX_MODULE_CODE_SIZE = 2_000_000;\n\n  /**\n   * Create a new QueryExecutor instance\n   *\n   * @param contractAddress Hex-encoded contract address (68 chars, starts with 0200)\n   * @param schema Contract schema\n   * @param providers Midnight providers\n   * @param timeout Query timeout in milliseconds (defaults to 30 seconds)\n   * @param contractModule Optional compiled contract module code (for ledger() access)\n   */\n  constructor(\n    contractAddress: string,\n    schema: ContractSchema,\n    providers: MidnightProviders,\n    timeout: number = DEFAULT_QUERY_TIMEOUT,\n    contractModule?: string,\n    numericNetworkId?: number\n  ) {\n    // Validate the contract address\n    const validation = validateContractAddress(contractAddress);\n    if (!validation.isValid) {\n      throw new ContractQueryError(\n        `Invalid contract address: ${validation.error}`,\n        contractAddress\n      );\n    }\n\n    // Midnight addresses are already in hex format (68-char hex starting with 0200)\n    this.contractAddressHex = validation.normalized!;\n    this.contractAddressBech32 = validation.normalized!; // Same as hex for Midnight\n    this.schema = schema;\n    this.providers = providers;\n    this.timeout = timeout;\n    this.contractModule = contractModule;\n    this.numericNetworkId = numericNetworkId;\n\n    logger.debug('QueryExecutor', `Initialized for contract: ${this.contractAddressHex}`);\n  }\n\n  /**\n   * Execute a query against the contract\n   *\n   * @param functionId The function ID to query\n   * @param params Parameters for the query (if any)\n   * @param timeoutMs Optional custom timeout in milliseconds\n   * @returns The query result\n   * @throws {ContractQueryError} if the query fails or times out\n   */\n  async call(functionId: string, params: unknown[] = [], timeoutMs?: number): Promise<unknown> {\n    const effectiveTimeout = timeoutMs || this.timeout;\n\n    logger.debug(\n      'QueryExecutor',\n      `Executing query: ${functionId} with ${params.length} parameter(s), timeout ${effectiveTimeout}ms`\n    );\n\n    try {\n      // Find the function in the schema\n      const func = this.schema.functions.find((f) => f.id === functionId);\n      if (!func) {\n        throw new ContractQueryError(\n          `Function '${functionId}' not found in contract schema`,\n          this.contractAddressBech32,\n          functionId\n        );\n      }\n\n      // Verify it's a view function\n      if (func.modifiesState) {\n        throw new ContractQueryError(\n          `Function '${functionId}' is not a view function (modifies state)`,\n          this.contractAddressBech32,\n          functionId\n        );\n      }\n\n      // Execute the query with timeout\n      const queryPromise = this.executeQuery(func.name, params);\n      const result = await withTimeout(queryPromise, effectiveTimeout, `Query '${functionId}'`);\n\n      logger.debug('QueryExecutor', `Query completed: ${functionId}`);\n      return result;\n    } catch (error) {\n      if (error instanceof ContractQueryError) {\n        throw error;\n      }\n\n      // Wrap other errors (including timeout errors)\n      throw new ContractQueryError(\n        `Query execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        this.contractAddressBech32,\n        functionId\n      );\n    }\n  }\n\n  /**\n   * Internal method to execute the actual query\n   *\n   * @param methodName Name of the method to query\n   * @param params Parameters for the query\n   * @returns The query result\n   */\n  private async executeQuery(methodName: string, params: unknown[]): Promise<unknown> {\n    try {\n      logger.debug(\n        'QueryExecutor',\n        `Querying contract state for address: ${this.contractAddressHex}, method: ${methodName}, params:`,\n        params\n      );\n      await this.logCurrentNetwork();\n      const queryResult = await this.fetchContractState();\n\n      if (!queryResult) {\n        throw new ContractQueryError(\n          `Contract not found at address ${this.contractAddressBech32}. ` +\n            `Please verify the contract is deployed on this network and the address is correct.`,\n          this.contractAddressBech32\n        );\n      }\n\n      const contractState = await this.deserializeContractStateIfNeeded(queryResult);\n\n      // Extract the state data from ContractState\n      // ContractState.query() requires CostModel/circuits, so we access data directly\n      const stateData =\n        contractState && typeof contractState === 'object' && 'data' in contractState\n          ? contractState.data\n          : undefined;\n      logger.debug('QueryExecutor', `Extracted state data:`, stateData);\n\n      if (!stateData) {\n        throw new ContractQueryError(\n          `No state data found in contract at ${this.contractAddressBech32}`,\n          this.contractAddressBech32\n        );\n      }\n\n      await this.ensureLedgerFunctionLoaded();\n\n      const ledgerState = this.getLedgerState(stateData);\n      const result = this.getFieldOrCallMethodFromLedgerState(ledgerState, methodName, params);\n      logger.debug('QueryExecutor', `Extracted field '${methodName}':`, result);\n\n      // Convert to JSON-serializable format\n      return this.convertValueToSerializable(result);\n    } catch (error) {\n      if (error instanceof ContractQueryError) {\n        throw error;\n      }\n\n      // Provide more helpful error message\n      const errorMessage =\n        error instanceof Error\n          ? error.message\n          : typeof error === 'object' && error !== null\n            ? JSON.stringify(error)\n            : 'Unknown error';\n\n      throw new ContractQueryError(\n        `Failed to query contract state: ${errorMessage}. ` +\n          `Ensure the contract is deployed at ${this.contractAddressBech32} on the selected network.`,\n        this.contractAddressBech32\n      );\n    }\n  }\n\n  /**\n   * Convert a value to a JSON-serializable format\n   *\n   * Handles common Midnight types:\n   * - bigint -> string (for JSON serialization)\n   * - Uint8Array/Buffer -> hex string\n   * - Complex objects -> deep conversion\n   *\n   * @param value The value to convert\n   * @returns JSON-serializable value\n   */\n  private convertValueToSerializable(value: unknown): unknown {\n    // Handle primitives\n    if (value === null || value === undefined) {\n      return value;\n    }\n\n    if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n      return value;\n    }\n\n    // Handle bigint (convert to string for JSON serialization)\n    if (typeof value === 'bigint') {\n      return value.toString();\n    }\n\n    // Handle Uint8Array/Buffer (convert to hex)\n    if (value instanceof Uint8Array || Buffer.isBuffer(value)) {\n      return '0x' + Buffer.from(value).toString('hex');\n    }\n\n    // Handle arrays\n    if (Array.isArray(value)) {\n      return value.map((item) => this.convertValueToSerializable(item));\n    }\n\n    // Handle objects\n    if (typeof value === 'object') {\n      // Check if it's a WASM object\n      if ('__wbg_ptr' in value) {\n        // Try toJSON first\n        if ('toJSON' in value && typeof value.toJSON === 'function') {\n          return this.convertValueToSerializable(value.toJSON());\n        }\n\n        // Try to get properties from the prototype\n        const proto = Object.getPrototypeOf(value);\n        const getters = Object.entries(Object.getOwnPropertyDescriptors(proto))\n          .filter(\n            ([key, descriptor]) => typeof descriptor.get === 'function' && !key.startsWith('__')\n          )\n          .map(([key]) => key);\n\n        if (getters.length > 0) {\n          const result: Record<string, unknown> = {};\n          for (const key of getters) {\n            try {\n              // Call the getter\n              const val = (value as Record<string, unknown>)[key];\n              result[key] = this.convertValueToSerializable(val);\n            } catch (e) {\n              logger.debug('QueryExecutor', `Failed to get property '${key}':`, e);\n            }\n          }\n          return result;\n        }\n      }\n\n      // Regular object\n      const result: Record<string, unknown> = {};\n      for (const [key, val] of Object.entries(value)) {\n        // Skip internal properties (e.g., __wbg_ptr from WASM objects)\n        if (key.startsWith('__')) {\n          continue;\n        }\n        result[key] = this.convertValueToSerializable(val);\n      }\n      return result;\n    }\n\n    // Fallback: try to stringify\n    try {\n      return String(value);\n    } catch {\n      return '[Unserializable Value]';\n    }\n  }\n\n  /**\n   * Logs current network ID information for traceability\n   */\n  private async logCurrentNetwork(): Promise<void> {\n    const { getNetworkId, networkIdToHex } = await import('@midnight-ntwrk/midnight-js-network-id');\n    const currentNetworkId = getNetworkId();\n    const currentNetworkIdHex = networkIdToHex(currentNetworkId);\n    logger.debug(\n      'QueryExecutor',\n      `Current network ID: ${currentNetworkId} (hex: ${currentNetworkIdHex})`\n    );\n  }\n\n  /**\n   * Fetches raw contract state from the provider\n   */\n  private async fetchContractState(): Promise<unknown> {\n    const result = await this.providers.publicDataProvider.queryContractState(\n      this.contractAddressHex\n    );\n    logger.debug('QueryExecutor', `Received query result:`, result);\n    return result;\n  }\n\n  /**\n   * Deserializes contract state when the provider returns a raw hex payload\n   */\n  private async deserializeContractStateIfNeeded(raw: unknown): Promise<unknown> {\n    const looksLikeHexState =\n      typeof raw === 'object' &&\n      raw !== null &&\n      'state' in (raw as Record<string, unknown>) &&\n      typeof (raw as Record<string, unknown>).state === 'string';\n\n    if (!looksLikeHexState) {\n      logger.debug('QueryExecutor', `Using pre-deserialized ContractState:`, raw);\n      return raw;\n    }\n\n    const hex = (raw as Record<string, string>).state;\n    logger.debug('QueryExecutor', `Deserializing state from hex:`, hex.substring(0, 50) + '...');\n\n    const { ContractState } = await import('@midnight-ntwrk/compact-runtime');\n    const numericNetworkId = this.numericNetworkId ?? (await this.getNumericNetworkId());\n\n    const stateBytes = Buffer.from(hex, 'hex');\n    const deserialized = ContractState.deserialize(stateBytes, numericNetworkId);\n    logger.debug('QueryExecutor', `Deserialized ContractState:`, deserialized);\n    return deserialized;\n  }\n\n  /**\n   * Resolves the numeric network ID used by compact-runtime\n   */\n  private async getNumericNetworkId(): Promise<number> {\n    const { getNetworkId } = await import('@midnight-ntwrk/midnight-js-network-id');\n    const networkId = getNetworkId();\n    if (networkId === 'MainNet') return 3;\n    if (networkId === 'DevNet') return 1;\n    if (networkId === 'Undeployed') return 0;\n    return 2; // Default to TestNet\n  }\n\n  /**\n   * Ensures the ledger() function is loaded before use\n   */\n  private async ensureLedgerFunctionLoaded(): Promise<void> {\n    if (this.ledgerFunction) return;\n\n    if (!this.contractModule) {\n      throw new ContractQueryError(\n        `Contract module is required to query Midnight contracts. ` +\n          `Please provide the compiled contract module (.cjs file) when loading the contract.`,\n        this.contractAddressBech32\n      );\n    }\n\n    this.ledgerFunction = await this.loadLedgerFunction(this.contractModule);\n    logger.debug('QueryExecutor', 'Ledger function loaded successfully');\n  }\n\n  /**\n   * Returns the ledger object produced by ledger(stateData)\n   */\n  private getLedgerState(stateData: unknown): Record<string, unknown> {\n    const ledgerState = this.ledgerFunction ? this.ledgerFunction(stateData) : undefined;\n    if (!ledgerState || typeof ledgerState !== 'object') {\n      throw new ContractQueryError(\n        `ledger() function returned invalid state for contract at ${this.contractAddressBech32}`,\n        this.contractAddressBech32\n      );\n    }\n    return ledgerState as Record<string, unknown>;\n  }\n\n  /**\n   * Safely selects a field or calls a method from the ledger state, with helpful error messages.\n   * For parameterless queries, returns the field value directly.\n   * For queries with parameters, invokes the method if it's a function.\n   */\n  private getFieldOrCallMethodFromLedgerState(\n    ledgerState: Record<string, unknown>,\n    methodName: string,\n    params: unknown[]\n  ): unknown {\n    if (!(methodName in ledgerState)) {\n      throw new ContractQueryError(\n        `Field '${methodName}' not found in contract state. ` +\n          `Available fields: ${Object.keys(ledgerState).join(', ')}`,\n        this.contractAddressBech32\n      );\n    }\n\n    const field = ledgerState[methodName];\n\n    // If no params and field is not a function, return directly\n    if (params.length === 0 && typeof field !== 'function') {\n      return field;\n    }\n\n    // If params provided, field must be a function\n    if (params.length > 0 && typeof field !== 'function') {\n      throw new ContractQueryError(\n        `Field '${methodName}' is not a function but parameters were provided. ` +\n          `Cannot call a non-function field with parameters.`,\n        this.contractAddressBech32\n      );\n    }\n\n    // If field is a function, call it with params\n    if (typeof field === 'function') {\n      try {\n        return field(...params);\n      } catch (error) {\n        throw new ContractQueryError(\n          `Failed to call method '${methodName}' with parameters: ${error instanceof Error ? error.message : 'Unknown error'}`,\n          this.contractAddressBech32\n        );\n      }\n    }\n\n    // Default: return the field value\n    return field;\n  }\n  /**\n   * Loads the ledger() function from the compiled contract module.\n   *\n   * Limitation: compiled helpers must match the compact-runtime version bundled\n   * with the app. Consider multi-version runtime support for broader compatibility.\n   *\n   * @param moduleCode The compiled contract module code (CommonJS format)\n   * @returns The ledger function\n   * @throws Error if the ledger function cannot be loaded\n   */\n  private async loadLedgerFunction(moduleCode: string): Promise<(state: unknown) => unknown> {\n    try {\n      // Validate the module code before evaluation to reduce risk of executing untrusted input.\n      this.validateContractModuleCode(moduleCode);\n\n      // Import the compact-runtime dependency that the contract module needs\n      const compactRuntime = await import('@midnight-ntwrk/compact-runtime');\n\n      // Create a module exports object to capture the exports\n      const moduleExports: Record<string, unknown> = {};\n      const moduleObj = { exports: moduleExports };\n\n      // Create a Function constructor to evaluate the module code in a controlled scope\n      // This is safer than eval() as it doesn't have access to the local scope\n      const func = new Function('module', 'exports', 'require', moduleCode);\n\n      // Create a require function that provides runtime dependencies\n      const requireFunc = (id: string) => {\n        if (id === '@midnight-ntwrk/compact-runtime') {\n          // ES modules from dynamic import have exports as properties\n          // CommonJS expects them directly on the returned object\n          return 'default' in compactRuntime ? compactRuntime.default : compactRuntime;\n        }\n\n        // For other dependencies, return empty object (ledger typically only needs compact-runtime)\n        logger.debug('QueryExecutor', `Unknown dependency required: ${id}, returning empty object`);\n        return {};\n      };\n\n      // Execute the module code\n      func(moduleObj, moduleExports, requireFunc);\n\n      // Extract the ledger function from exports\n      const exports = moduleObj.exports;\n      const ledger =\n        ('ledger' in exports && exports.ledger) ||\n        ('default' in exports &&\n          typeof exports.default === 'object' &&\n          exports.default !== null &&\n          'ledger' in exports.default &&\n          exports.default.ledger);\n\n      if (!ledger || typeof ledger !== 'function') {\n        throw new Error('ledger() function not found in contract module exports');\n      }\n\n      return ledger as (state: unknown) => unknown;\n    } catch (error) {\n      logger.error('QueryExecutor', 'Failed to load ledger function:', error);\n      throw new Error(\n        `Failed to load ledger() function from contract module: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Performs basic validation of the compiled contract module code before evaluation.\n   *\n   * Security rationale:\n   * - The module code should come from a trusted source (e.g., user-provided artifacts).\n   * - We block usage of obvious dangerous globals/APIs (eval, Function constructor, DOM, fetch, etc.).\n   * - This is defense-in-depth and does not replace sandboxing or CSP.\n   *\n   * Consider enforcing a strict Content Security Policy (CSP) and/or evaluating in a sandboxed iframe\n   * if additional isolation is required for your deployment environment.\n   */\n  private validateContractModuleCode(moduleCode: string): void {\n    // Size guard (approximate; JS strings are UTF-16)\n    if (moduleCode.length > QueryExecutor.MAX_MODULE_CODE_SIZE) {\n      throw new ContractQueryError(\n        'Contract module code is too large to be evaluated safely',\n        this.contractAddressBech32\n      );\n    }\n\n    // Expected markers for Midnight compiled modules\n    if (!moduleCode.includes('@midnight-ntwrk/compact-runtime') || !moduleCode.includes('ledger')) {\n      logger.warn(\n        'QueryExecutor',\n        'Contract module code is missing expected markers; continuing with caution'\n      );\n    }\n\n    // Block obvious dangerous globals/APIs from being referenced\n    const blockedPatterns: RegExp[] = [\n      /\\beval\\s*\\(/,\n      /\\bFunction\\s*\\(/,\n      /\\bwindow\\./,\n      /\\bdocument\\./,\n      /\\bXMLHttpRequest\\b/,\n      /\\bfetch\\s*\\(/,\n      /\\blocalStorage\\b/,\n      /\\bsessionStorage\\b/,\n      /\\bnavigator\\./,\n      /\\bglobalThis\\./,\n      /\\bWebSocket\\b/,\n    ];\n\n    const hits = blockedPatterns.filter((re) => re.test(moduleCode));\n    if (hits.length > 0) {\n      throw new ContractQueryError(\n        `Contract module uses disallowed globals/APIs (${hits\n          .map((r) => r.source)\n          .join(', ')}); aborting evaluation`,\n        this.contractAddressBech32\n      );\n    }\n  }\n}\n","import type { ContractFunction } from '@openzeppelin/ui-builder-types';\n\nimport { isPureCircuit } from '../utils/circuit-type-utils';\n\n/**\n * Determines if a function is a view/pure function (read-only)\n *\n * A view function in Midnight is one that does not modify contract state.\n * These functions can be queried without submitting a transaction.\n *\n * @param functionDetails The function details from the contract schema\n * @returns True if the function is a view function (does not modify state)\n */\nexport function isMidnightViewFunction(functionDetails: ContractFunction): boolean {\n  // A function is a view function if it does NOT modify state\n  return !functionDetails.modifiesState;\n}\n\n/**\n * Determines if a function is a pure circuit (runs locally without blockchain interaction)\n *\n * Pure circuits in Midnight are computational functions that can run entirely client-side\n * without accessing or modifying blockchain state. They are defined in the PureCircuits type.\n *\n * @param functionDetails The function details from the contract schema\n * @returns True if the function is a pure circuit\n * @deprecated Use isPureCircuit from '../utils/circuit-type-utils' instead\n */\nexport function isMidnightPureCircuit(functionDetails: ContractFunction): boolean {\n  return isPureCircuit(functionDetails);\n}\n","import { indexerPublicDataProvider } from '@midnight-ntwrk/midnight-js-indexer-public-data-provider';\nimport type { MidnightProviders } from '@midnight-ntwrk/midnight-js-types';\n\nimport type {\n  ContractFunction,\n  ContractSchema,\n  MidnightNetworkConfig,\n  NetworkConfig,\n} from '@openzeppelin/ui-builder-types';\nimport {\n  logger,\n  userNetworkServiceConfigService,\n  userRpcConfigService,\n} from '@openzeppelin/ui-builder-utils';\n\nimport { getWalletConfigIfAvailable } from '../configuration';\nimport {\n  getNetworkId as getConfiguredNetworkId,\n  getNumericNetworkId as getConfiguredNumericId,\n} from '../utils';\nimport { validateContractAddress } from '../validation/address';\nimport { DEFAULT_QUERY_TIMEOUT, QueryExecutor } from './executor';\nimport { isMidnightViewFunction } from './view-checker';\n\n/**\n * Queries a view function on a Midnight contract\n *\n * This is the main entry point for querying view functions in the Midnight adapter.\n * It creates providers, sets up a query executor, and returns the decoded result.\n *\n * @param contractAddress The contract address (68-char hex starting with 0200)\n * @param functionId The function identifier to query\n * @param networkConfig The network configuration\n * @param params Parameters for the query (if any)\n * @param contractSchema The contract schema (required for function lookup)\n * @param contractModule Optional compiled contract module code (for ledger() access)\n * @returns The query result (decoded JS values)\n * @throws {Error} if the query fails or times out\n */\nexport async function queryMidnightViewFunction(\n  contractAddress: string,\n  functionId: string,\n  networkConfig: NetworkConfig,\n  params: unknown[] = [],\n  contractSchema?: ContractSchema,\n  contractModule?: string\n): Promise<unknown> {\n  if (networkConfig.ecosystem !== 'midnight') {\n    throw new Error('Invalid network configuration for Midnight query.');\n  }\n\n  if (!contractSchema) {\n    throw new Error('Contract schema is required for Midnight queries');\n  }\n\n  // Early validation to align with EVM/Stellar patterns (defense-in-depth with executor)\n  const addressValidation = validateContractAddress(contractAddress);\n  if (!addressValidation.isValid) {\n    throw new Error(`Invalid contract address provided: ${addressValidation.error}`);\n  }\n\n  // Confirm the function exists and is view-only\n  const targetFunction = contractSchema.functions.find(\n    (fn: ContractFunction) => fn.id === functionId\n  );\n  if (!targetFunction) {\n    throw new Error(`Function with ID ${functionId} not found in contract schema.`);\n  }\n  if (!isMidnightViewFunction(targetFunction)) {\n    throw new Error(`Function ${targetFunction.name} is not a view function.`);\n  }\n\n  const midnightConfig = networkConfig as MidnightNetworkConfig;\n\n  logger.info(\n    'queryMidnightViewFunction',\n    `Querying function '${functionId}' on contract ${contractAddress}`\n  );\n\n  try {\n    // Get wallet configuration if available (respects user privacy preferences)\n    const walletConfig = await getWalletConfigIfAvailable();\n\n    // Create Midnight providers for reading contract state\n    // Priority: user RPC override > wallet config > network config (defaults)\n    const { providers, numericNetworkId } = await getProvidersForQuery(\n      midnightConfig,\n      walletConfig\n    );\n\n    // Create a query executor\n    const executor = new QueryExecutor(\n      contractAddress,\n      contractSchema,\n      providers,\n      DEFAULT_QUERY_TIMEOUT,\n      contractModule, // Pass contract module for ledger() access\n      numericNetworkId\n    );\n\n    // Execute the query\n    const result = await executor.call(functionId, params);\n\n    logger.info(\n      'queryMidnightViewFunction',\n      `Query completed successfully for function '${functionId}'`\n    );\n\n    return result;\n  } catch (error) {\n    logger.error('queryMidnightViewFunction', `Query failed for function '${functionId}'`, error);\n    throw error;\n  }\n}\n\n/**\n * Private helper to build Midnight providers with precedence:\n * user RPC override > wallet config > network config\n */\nasync function getProvidersForQuery(\n  networkConfig: MidnightNetworkConfig,\n  walletConfig?: {\n    indexerUri?: string;\n    indexerWsUri?: string;\n    substrateNodeUri?: string;\n    proverServerUri?: string;\n    networkId?: string;\n  }\n): Promise<{ providers: MidnightProviders; numericNetworkId?: number }> {\n  // Resolve indexer endpoints with precedence\n  const userIndexer = userNetworkServiceConfigService.get(networkConfig.id, 'indexer') as {\n    httpUrl?: string;\n    wsUrl?: string;\n  } | null;\n  const customRpcConfig = userRpcConfigService.getUserRpcConfig(networkConfig.id);\n\n  let indexerUri: string;\n  let indexerWsUri: string;\n\n  if (userIndexer?.httpUrl && userIndexer?.wsUrl) {\n    indexerUri = userIndexer.httpUrl;\n    indexerWsUri = userIndexer.wsUrl;\n    logger.info('getProvidersForQuery', 'Using user Indexer override', { indexerUri });\n  } else if (customRpcConfig?.url) {\n    // Derive indexer endpoints from user RPC override\n    const derivedHttp = deriveIndexerUri(customRpcConfig.url);\n    const derivedWs = deriveIndexerWsUri(customRpcConfig.url);\n    indexerUri = derivedHttp;\n    indexerWsUri = derivedWs;\n    logger.info('getProvidersForQuery', 'Using user RPC override to derive indexer URIs', {\n      rpcUrl: customRpcConfig.url,\n      indexerUri,\n    });\n  } else if (walletConfig?.indexerUri && walletConfig?.indexerWsUri) {\n    // Respect user privacy preferences from wallet\n    indexerUri = walletConfig.indexerUri;\n    indexerWsUri = walletConfig.indexerWsUri;\n    logger.info('getProvidersForQuery', 'Using wallet-provided indexer URIs');\n  } else if (networkConfig.indexerUri && networkConfig.indexerWsUri) {\n    // Explicit network configuration\n    indexerUri = networkConfig.indexerUri;\n    indexerWsUri = networkConfig.indexerWsUri;\n    logger.info('getProvidersForQuery', 'Using explicit network-configured indexer URIs');\n  } else {\n    // Derive from default RPC endpoint as a fallback\n    const rpcUrl = getDefaultRpcUrl(networkConfig);\n    indexerUri = deriveIndexerUri(rpcUrl);\n    indexerWsUri = deriveIndexerWsUri(rpcUrl);\n    logger.info('getProvidersForQuery', 'Derived indexer URIs from network RPC endpoint', {\n      rpcUrl,\n      indexerUri,\n    });\n  }\n\n  // Set network ID in Midnight SDK and global override (workaround for provider patches)\n  const { NetworkId, setNetworkId } = await import('@midnight-ntwrk/midnight-js-network-id');\n  // Read mapping: expect a single entry, take [numeric, name]\n  let numericNetworkId: number | undefined = getConfiguredNumericId(networkConfig);\n  let networkName: string = getConfiguredNetworkId(networkConfig) || 'TestNet';\n  const resolvedEnum = (NetworkId as Record<string, unknown>)[networkName];\n  if (!resolvedEnum) {\n    throw new Error(\n      `Invalid networkIdMapping value '${networkName}' for network ${networkConfig.id}`\n    );\n  }\n  setNetworkId(resolvedEnum as never);\n  // Stash resolved networkId on a well-known global for patched providers\n  const globalMidnight = globalThis as unknown as {\n    __OPENZEPPELIN_MIDNIGHT__?: { networkId?: unknown };\n  };\n  if (!globalMidnight.__OPENZEPPELIN_MIDNIGHT__) {\n    globalMidnight.__OPENZEPPELIN_MIDNIGHT__ = {};\n  }\n  globalMidnight.__OPENZEPPELIN_MIDNIGHT__.networkId = resolvedEnum;\n  logger.debug('getProvidersForQuery', `Set network ID to: ${networkName} (${numericNetworkId})`);\n\n  // Create public data provider\n  const publicDataProvider = indexerPublicDataProvider(indexerUri, indexerWsUri);\n\n  return { providers: { publicDataProvider } as MidnightProviders, numericNetworkId };\n}\n\nfunction getDefaultRpcUrl(networkConfig: MidnightNetworkConfig): string {\n  const rpcUrl = networkConfig.rpcEndpoints?.default;\n  if (!rpcUrl) {\n    throw new Error(`No RPC endpoint configured for network: ${networkConfig.name}`);\n  }\n  return rpcUrl;\n}\n\nfunction deriveIndexerUri(rpcUrl: string): string {\n  const url = new URL(rpcUrl);\n  // Map ws/wss -> http/https explicitly to avoid accidental partial replacements\n  if (url.protocol === 'ws:') {\n    url.protocol = 'http:';\n  } else if (url.protocol === 'wss:') {\n    url.protocol = 'https:';\n  }\n  url.pathname = '/api/v1/graphql';\n  return url.toString();\n}\n\nfunction deriveIndexerWsUri(rpcUrl: string): string {\n  const url = new URL(rpcUrl);\n  // Map http/https -> ws/wss explicitly to avoid accidental partial replacements\n  if (url.protocol === 'http:') {\n    url.protocol = 'ws:';\n  } else if (url.protocol === 'https:') {\n    url.protocol = 'wss:';\n  }\n  url.pathname = '/api/v1/graphql/ws';\n  return url.toString();\n}\n","// Barrel file for query module\nexport * from './handler';\nexport * from './view-checker';\n","/**\n * Midnight Adapter Entry Point\n *\n * Browser Compatibility:\n *\n * This ensures Midnight-specific browser shims are only loaded when the user\n * selects the Midnight ecosystem, keeping other adapters lightweight.\n */\n\n// Initialize browser environment (Buffer + CommonJS polyfills) as soon as adapter is imported\nimport './browser-init';\n\nexport * from './adapter';\nexport { default } from './adapter'; // Default export for convenience\n\n// Re-export adapter-specific types\nexport type { MidnightContractArtifacts } from './types';\nexport { isMidnightContractArtifacts } from './types';\n\nexport { MidnightAdapter } from './adapter';\nexport {\n  midnightNetworks,\n  midnightTestnetNetworks,\n  // Individual networks\n  midnightTestnet,\n} from './networks';\n\n// Export adapter configuration\nexport { midnightAdapterConfig } from './config';\n","/**\n * Browser initialization for Midnight adapter\n *\n * This module provides polyfills and environment setup required for the Midnight SDK\n * to run in a browser environment. These are loaded lazily when the Midnight adapter\n * is first imported, rather than being bundled into the main application.\n *\n * This ensures other ecosystems (EVM, Solana, Stellar) don't pay the cost of\n * Midnight-specific browser compatibility shims.\n */\n\nlet isInitialized = false;\n\n/**\n * Minimal CommonJS module interface for browser contract evaluation\n * This is intentionally minimal - we only need exports, not the full Node.js Module interface\n */\ninterface MinimalCommonJSModule {\n  exports: Record<string, unknown>;\n}\n\n/**\n * Installs browser polyfills required for Midnight SDK and contract evaluation\n *\n * Includes:\n * 1. Buffer polyfill - Required for @dao-xyz/borsh (Midnight SDK serialization)\n * 2. CommonJS polyfills - Required for dynamic contract evaluation\n *\n * Called automatically when the adapter is first loaded.\n */\nexport function initializeMidnightBrowserEnvironment(): void {\n  if (isInitialized) {\n    return; // Already initialized\n  }\n\n  // Install Buffer polyfill for @dao-xyz/borsh compatibility\n  // This MUST be installed before any Midnight SDK modules load\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  if (typeof (globalThis as any).Buffer === 'undefined') {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (globalThis as any).Buffer = {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      from: function (data: any, encoding?: string) {\n        let uint8Array;\n        if (typeof data === 'string') {\n          if (encoding === 'hex') {\n            const bytes = [];\n            for (let i = 0; i < data.length; i += 2) {\n              bytes.push(parseInt(data.substring(i, i + 2), 16));\n            }\n            uint8Array = new Uint8Array(bytes);\n          } else if (encoding === 'base64') {\n            const binary = atob(data);\n            const bytes = new Uint8Array(binary.length);\n            for (let i = 0; i < binary.length; i++) {\n              bytes[i] = binary.charCodeAt(i);\n            }\n            uint8Array = bytes;\n          } else {\n            const encoder = new TextEncoder();\n            uint8Array = encoder.encode(data);\n          }\n        } else if (data instanceof ArrayBuffer || data instanceof Uint8Array) {\n          uint8Array = new Uint8Array(data);\n        } else {\n          uint8Array = new Uint8Array(data);\n        }\n        // Add toString method for hex/base64 encoding\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (uint8Array as any).toString = function (enc?: string) {\n          if (enc === 'hex') {\n            return Array.from(this as Uint8Array)\n              .map((b: number) => b.toString(16).padStart(2, '0'))\n              .join('');\n          }\n          if (enc === 'base64') {\n            let binary = '';\n            for (let i = 0; i < this.length; i++) {\n              binary += String.fromCharCode(this[i]);\n            }\n            return btoa(binary);\n          }\n          return new TextDecoder().decode(this);\n        };\n        return uint8Array;\n      },\n      alloc: function (size: number) {\n        return new Uint8Array(size);\n      },\n      allocUnsafe: function (size: number) {\n        return new Uint8Array(size);\n      },\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      isBuffer: function (obj: any) {\n        return obj instanceof Uint8Array;\n      },\n      byteLength: function (str: string, encoding?: string) {\n        if (encoding === 'utf8' || !encoding) return new TextEncoder().encode(str).length;\n        if (encoding === 'hex') return str.length / 2;\n        if (encoding === 'base64') return Math.floor((str.length * 3) / 4);\n        return new TextEncoder().encode(str).length;\n      },\n      concat: function (buffers: Uint8Array[]) {\n        const totalLength = buffers.reduce(function (acc, buf) {\n          return acc + buf.length;\n        }, 0);\n        const result = new Uint8Array(totalLength);\n        let offset = 0;\n        for (const buf of buffers) {\n          result.set(buf, offset);\n          offset += buf.length;\n        }\n        return result;\n      },\n    };\n  }\n\n  // Install CommonJS globals for contract evaluation\n  // TypeScript has strict types for these from @types/node, but we need minimal browser polyfills\n  // Use type assertions to bypass Node.js type checking\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  if (typeof (globalThis as any).exports === 'undefined') {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (globalThis as any).exports = {};\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  if (typeof (globalThis as any).module === 'undefined') {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (globalThis as any).module = { exports: (globalThis as any).exports } as MinimalCommonJSModule;\n  }\n\n  isInitialized = true;\n}\n\n// Auto-initialize when this module is imported\ninitializeMidnightBrowserEnvironment();\n","import type {\n  AdapterExportBootstrap,\n  AdapterExportContext,\n  AvailableUiKit,\n  Connector,\n  ContractAdapter,\n  ContractFunction,\n  ContractSchema,\n  EcosystemReactUiProviderProps,\n  EcosystemSpecificReactHooks,\n  EcosystemWalletComponents,\n  ExecutionConfig,\n  ExecutionMethodDetail,\n  FieldType,\n  FormFieldType,\n  FunctionDecorationsMap,\n  FunctionParameter,\n  MidnightNetworkConfig,\n  NetworkServiceForm,\n  RelayerDetails,\n  RelayerDetailsRich,\n  RuntimeSecretPropertyInput,\n  TransactionStatusUpdate,\n  UiKitConfiguration,\n} from '@openzeppelin/ui-builder-types';\nimport { isMidnightNetworkConfig } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { FunctionDecorationsService } from './analysis/function-decorations-service';\nimport {\n  getMidnightNetworkServiceForms,\n  testMidnightNetworkServiceConnection,\n  validateMidnightNetworkServiceConfig,\n} from './configuration/network-services';\nimport { getMidnightExportBootstrapFiles } from './export/bootstrap';\nimport { generateMidnightDefaultField } from './mapping/field-generator';\nimport {\n  getMidnightCompatibleFieldTypes,\n  mapMidnightParameterTypeToFieldType,\n} from './mapping/type-mapper';\nimport type { WriteContractParameters } from './types/transaction';\nimport { prepareArtifactsForFunction as prepareArtifacts } from './utils/artifact-preparation';\nimport { deriveIdentitySecretPropertyName } from './utils/identity-secret-derivation';\nimport { CustomAccountDisplay } from './wallet/components/account/AccountDisplay';\nimport { ConnectButton } from './wallet/components/connect/ConnectButton';\nimport { MidnightWalletUiRoot } from './wallet/components/MidnightWalletUiRoot';\nimport * as connection from './wallet/connection';\nimport { midnightFacadeHooks } from './wallet/hooks/facade-hooks';\n\nimport { loadMidnightContract, loadMidnightContractWithMetadata } from './contract';\nimport {\n  executeLocallyIfPossible,\n  formatMidnightTransactionData,\n  signAndBroadcastMidnightTransaction,\n} from './transaction';\nimport { formatMidnightFunctionResult } from './transform';\nimport type { MidnightContractArtifacts } from './types';\nimport { isPureCircuit, validateAndConvertMidnightArtifacts } from './utils';\nimport { isValidAddress } from './validation';\n\n/**\n * Midnight-specific adapter.\n *\n * Implements the full ContractAdapter interface to integrate with the builder application.\n * Wallet-related functionalities are implemented, while contract-specific methods\n * are placeholders to be built out in later phases.\n */\nexport class MidnightAdapter implements ContractAdapter {\n  readonly networkConfig: MidnightNetworkConfig;\n  readonly initialAppServiceKitName: UiKitConfiguration['kitName'];\n  private artifacts: MidnightContractArtifacts | null = null;\n  private functionDecorationsService: FunctionDecorationsService;\n\n  constructor(networkConfig: MidnightNetworkConfig) {\n    if (!isMidnightNetworkConfig(networkConfig)) {\n      throw new Error('MidnightAdapter requires a valid Midnight network configuration.');\n    }\n    this.networkConfig = networkConfig;\n    this.initialAppServiceKitName = 'custom';\n    this.functionDecorationsService = new FunctionDecorationsService();\n    logger.info(\n      'MidnightAdapter',\n      `Adapter initialized for network: ${networkConfig.name} (ID: ${networkConfig.id})`\n    );\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getEcosystemReactUiContextProvider(): React.FC<EcosystemReactUiProviderProps> {\n    return MidnightWalletUiRoot;\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getEcosystemReactHooks(): EcosystemSpecificReactHooks {\n    return midnightFacadeHooks;\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getEcosystemWalletComponents(): EcosystemWalletComponents {\n    return {\n      ConnectButton,\n      AccountDisplay: CustomAccountDisplay,\n    };\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public supportsWalletConnection(): boolean {\n    return connection.supportsMidnightWalletConnection();\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async getAvailableConnectors(): Promise<Connector[]> {\n    return connection.getMidnightAvailableConnectors();\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public connectWallet(\n    _connectorId: string\n  ): Promise<{ connected: boolean; address?: string; error?: string }> {\n    logger.warn(\n      'MidnightAdapter',\n      'The `connectWallet` method is not supported. Use the `ConnectButton` component from `getEcosystemWalletComponents()` instead.'\n    );\n    return Promise.resolve({ connected: false, error: 'Method not supported.' });\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public disconnectWallet(): Promise<{ disconnected: boolean; error?: string }> {\n    return connection.disconnectMidnightWallet();\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getWalletConnectionStatus(): { isConnected: boolean; address?: string; chainId?: string } {\n    const status = connection.getMidnightWalletConnectionStatus();\n    return {\n      isConnected: !!status.isConnected,\n      address: status.address,\n      chainId: this.networkConfig.id,\n    };\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getContractDefinitionInputs(): FormFieldType[] {\n    return [\n      {\n        id: 'contractAddress',\n        name: 'contractAddress',\n        label: 'Contract Address',\n        type: 'blockchain-address',\n        validation: { required: true },\n        placeholder: '0200326c95873182775840764ae28e8750f73a68f236800171ebd92520e96a9fffb6',\n        helperText:\n          'Enter the deployed Midnight contract address (68-character hex string starting with 0200).',\n      },\n      {\n        id: 'privateStateId',\n        name: 'privateStateId',\n        label: 'Private State ID',\n        type: 'text',\n        validation: { required: true },\n        placeholder: 'my-unique-state-id',\n        helperText:\n          'A unique identifier for your private state instance. This ID is used to manage your personal encrypted data.',\n      },\n      {\n        id: 'contractArtifactsZip',\n        name: 'contractArtifactsZip',\n        label: 'Contract Build Artifacts (ZIP)',\n        type: 'file-upload',\n        validation: { required: true },\n        accept: '.zip',\n        helperText:\n          \"Select a ZIP file containing your compiled Midnight contract artifacts. The ZIP should include: contract module (.cjs), TypeScript definitions (.d.ts), witness code (witnesses.js), and ZK proof files (.prover, .verifier, .bzkir). Typically created by zipping your project's dist/ directory after running `compact build`. All processing happens locally in your browser.\",\n        convertToBase64: true, // Convert to base64 for storage\n        maxSize: 10 * 1024 * 1024, // 10MB limit\n      },\n    ];\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async loadContract(source: string | Record<string, unknown>): Promise<ContractSchema> {\n    const artifacts = await validateAndConvertMidnightArtifacts(source);\n\n    this.artifacts = artifacts;\n    logger.info('MidnightAdapter', 'Contract artifacts stored.', this.artifacts);\n\n    const result = await loadMidnightContract(artifacts, this.networkConfig);\n    return result.schema;\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async loadContractWithMetadata(source: string | Record<string, unknown>): Promise<{\n    schema: ContractSchema;\n    source: 'fetched' | 'manual';\n    contractDefinitionOriginal?: string;\n    metadata?: {\n      fetchedFrom?: string;\n      contractName?: string;\n      verificationStatus?: 'verified' | 'unverified' | 'unknown';\n      fetchTimestamp?: Date;\n      definitionHash?: string;\n    };\n    proxyInfo?: undefined;\n    contractDefinitionArtifacts?: Record<string, unknown>;\n  }> {\n    const artifacts = await validateAndConvertMidnightArtifacts(source);\n\n    this.artifacts = artifacts;\n    logger.info('MidnightAdapter', 'Contract artifacts stored.', this.artifacts);\n\n    const result = await loadMidnightContractWithMetadata(artifacts, this.networkConfig);\n\n    return {\n      schema: result.schema,\n      source: result.source,\n      contractDefinitionOriginal: result.contractDefinitionOriginal,\n      metadata: result.metadata,\n      contractDefinitionArtifacts: result.contractDefinitionArtifacts,\n      proxyInfo: result.proxyInfo,\n    };\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getWritableFunctions(contractSchema: ContractSchema): ContractFunction[] {\n    return contractSchema.functions.filter((fn: ContractFunction): boolean => fn.modifiesState);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public mapParameterTypeToFieldType(parameterType: string): FieldType {\n    return mapMidnightParameterTypeToFieldType(parameterType);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getCompatibleFieldTypes(parameterType: string): FieldType[] {\n    return getMidnightCompatibleFieldTypes(parameterType);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public generateDefaultField(\n    parameter: FunctionParameter,\n    contractSchema?: ContractSchema\n  ): FormFieldType {\n    return generateMidnightDefaultField(parameter, contractSchema) as FormFieldType;\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public formatTransactionData(\n    contractSchema: ContractSchema,\n    functionId: string,\n    submittedInputs: Record<string, unknown>,\n    fields: FormFieldType[]\n  ): unknown {\n    return formatMidnightTransactionData(\n      contractSchema,\n      functionId,\n      submittedInputs,\n      fields,\n      this.artifacts\n    );\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async signAndBroadcast(\n    transactionData: unknown,\n    executionConfig: ExecutionConfig,\n    onStatusChange: (status: string, details: TransactionStatusUpdate) => void,\n    runtimeApiKey?: string,\n    runtimeSecret?: string\n  ): Promise<{ txHash: string; result?: unknown }> {\n    const txData = transactionData as WriteContractParameters;\n\n    // Try local execution first (for functions that can execute locally)\n    const localResult = await executeLocallyIfPossible(txData, this.artifacts, onStatusChange);\n\n    if (localResult) {\n      return localResult;\n    }\n\n    // Otherwise, route to blockchain transaction execution\n\n    return signAndBroadcastMidnightTransaction(\n      transactionData,\n      executionConfig,\n      this.networkConfig,\n      this.artifacts,\n      onStatusChange,\n      runtimeApiKey,\n      runtimeSecret // Use runtimeSecret only for organizer key (Midnight doesn't support relayers yet)\n    );\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async getFunctionDecorations(): Promise<FunctionDecorationsMap | undefined> {\n    if (!this.artifacts) {\n      logger.debug('MidnightAdapter', 'No artifacts loaded; skipping function decorations.');\n      return undefined;\n    }\n\n    return this.functionDecorationsService.analyzeFunctionDecorations(this.artifacts);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getRuntimeFieldBinding(): {\n    key: string;\n    label: string;\n    helperText?: string;\n    metadata?: Record<string, unknown>;\n    propertyNameInput?: RuntimeSecretPropertyInput;\n  } {\n    // Attempt to derive a sane default from artifacts; keep editable\n    const derivedProp =\n      this.artifacts?.identitySecretKeyPropertyName ||\n      deriveIdentitySecretPropertyName(this.artifacts) ||\n      undefined;\n\n    // Build helper text with proper empty string handling\n    const hasDetectedProperty = derivedProp && derivedProp.length > 0;\n    const generalGuidance =\n      'Midnight contracts differ: the identity secret may be stored under different private-state property names. You can find this in your generated types (PrivateState in .d.ts) or in witnesses code (privateState.<prop>). The secret is injected at runtime and never persisted.';\n\n    return {\n      key: 'organizerSecret',\n      label: 'Identity Secret',\n      helperText:\n        'Hex-encoded identity secret; used for identity-restricted circuits and never stored',\n      propertyNameInput: {\n        metadataKey: 'identitySecretKeyPropertyName',\n        label: 'Secret Key Property Name',\n        placeholder: 'e.g., secretKey',\n        defaultValue: derivedProp,\n        visible: true,\n        helperText: [\n          hasDetectedProperty &&\n            `Detected \"${derivedProp}\" in your artifacts. Change if your contract uses a different private-state property (e.g., organizerSecretKey, secretKey, ownerKey).`,\n          generalGuidance,\n        ]\n          .filter(Boolean)\n          .join(' '),\n      },\n    };\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public isViewFunction(functionDetails: ContractFunction): boolean {\n    // Pure circuits are not view functions - they're computational functions that run locally\n    // View functions are read-only state queries (ledger properties, queries)\n    return !functionDetails.modifiesState && !isPureCircuit(functionDetails);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async queryViewFunction(\n    contractAddress: string,\n    functionId: string,\n    params: unknown[],\n    contractSchema?: ContractSchema\n  ): Promise<unknown> {\n    // Query Midnight contracts using the indexer public data provider\n    const { queryMidnightViewFunction } = await import('./query');\n    return queryMidnightViewFunction(\n      contractAddress,\n      functionId,\n      this.networkConfig,\n      params,\n      contractSchema,\n      this.artifacts?.contractModule // Pass the contract module for ledger() access\n    );\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public formatFunctionResult(decodedValue: unknown, functionDetails: ContractFunction): string {\n    return formatMidnightFunctionResult(decodedValue, functionDetails);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async getSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n    const { getMidnightSupportedExecutionMethods } = await import('./configuration/execution');\n    return getMidnightSupportedExecutionMethods();\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async validateExecutionConfig(config: ExecutionConfig): Promise<true | string> {\n    const { validateMidnightExecutionConfig } = await import('./configuration/execution');\n    return validateMidnightExecutionConfig(config);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getExplorerUrl(_address: string): string | null {\n    return null; // No official explorer yet\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getExplorerTxUrl(_txHash: string): string | null {\n    return null; // No official explorer yet\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public isValidAddress(address: string): boolean {\n    // Validates both contract addresses (68-char hex) and user addresses (Bech32m)\n    return isValidAddress(address);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  async getAvailableUiKits(): Promise<AvailableUiKit[]> {\n    return [\n      {\n        id: 'custom',\n        name: 'OpenZeppelin Custom',\n        configFields: [],\n      },\n    ];\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async getRelayers(_serviceUrl: string, _accessToken: string): Promise<RelayerDetails[]> {\n    logger.warn('MidnightAdapter', 'getRelayers is not implemented for the Midnight adapter yet.');\n    return Promise.resolve([]);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async getRelayer(\n    _serviceUrl: string,\n    _accessToken: string,\n    _relayerId: string\n  ): Promise<RelayerDetailsRich> {\n    logger.warn('MidnightAdapter', 'getRelayer is not implemented for the Midnight adapter yet.');\n    return Promise.resolve({} as RelayerDetailsRich);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getNetworkServiceForms(): NetworkServiceForm[] {\n    return getMidnightNetworkServiceForms();\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async validateNetworkServiceConfig(\n    serviceId: string,\n    values: Record<string, unknown>\n  ): Promise<boolean> {\n    return validateMidnightNetworkServiceConfig(serviceId, values);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async testNetworkServiceConnection(\n    serviceId: string,\n    values: Record<string, unknown>\n  ): Promise<{ success: boolean; latency?: number; error?: string }> {\n    return testMidnightNetworkServiceConnection(serviceId, values);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async getExportBootstrapFiles(\n    context: AdapterExportContext\n  ): Promise<AdapterExportBootstrap | null> {\n    return getMidnightExportBootstrapFiles(context);\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public getArtifactPersistencePolicy():\n    | {\n        mode: 'immediate' | 'deferredUntilFunctionSelected';\n        sizeThresholdBytes?: number;\n      }\n    | undefined {\n    return {\n      mode: 'deferredUntilFunctionSelected',\n      sizeThresholdBytes: 15 * 1024 * 1024, // 15MB\n    };\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public async prepareArtifactsForFunction(args: {\n    functionId: string;\n    currentArtifacts: Record<string, unknown>;\n    definitionOriginal?: string | null;\n  }): Promise<{\n    persistableArtifacts?: Record<string, unknown>;\n    publicAssets?: Record<string, Uint8Array | Blob>;\n    bootstrapSource?: Record<string, unknown>;\n  }> {\n    return prepareArtifacts(args.functionId, args.currentArtifacts);\n  }\n}\n\n// Also export as default\nexport default MidnightAdapter;\n","import type { FunctionDecorationsMap } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { evaluateContractModule } from '../transaction/contract-evaluator';\nimport { evaluateWitnessCode } from '../transaction/witness-evaluator';\nimport type { MidnightContractArtifacts } from '../types';\nimport { extractPureCircuits } from '../utils/circuit-type-utils';\nimport { detectOrganizerOnlyBySource } from './organizer-only-detector';\n\nconst SYSTEM_LOG_TAG = 'FunctionDecorationsService';\n\n/**\n * Service to orchestrate function decoration analysis and detection\n * Handles caching, detection workflow, and results mapping\n */\nexport class FunctionDecorationsService {\n  private cache: Map<string, FunctionDecorationsMap> = new Map();\n\n  /**\n   * Analyzes artifacts and returns function decorations (badges, notes, etc.)\n   *\n   * @param artifacts - Contract artifacts to analyze\n   * @returns Map of function IDs to their decorations, or undefined if analysis failed\n   */\n  async analyzeFunctionDecorations(\n    artifacts: MidnightContractArtifacts | null\n  ): Promise<FunctionDecorationsMap | undefined> {\n    if (!artifacts) {\n      logger.debug(SYSTEM_LOG_TAG, 'No artifacts provided; skipping analysis.');\n      return undefined;\n    }\n\n    const cacheKey = this.generateCacheKey(artifacts);\n\n    // Check cache first\n    if (this.cache.has(cacheKey)) {\n      logger.debug(SYSTEM_LOG_TAG, 'Using cached function decorations');\n      return this.cache.get(cacheKey);\n    }\n\n    logger.info(SYSTEM_LOG_TAG, 'Analyzing contract functions for decorations...');\n\n    try {\n      const organizerOnlyResults = await this.detectOrganizerOnlyCircuits(artifacts);\n      const pureCircuitResults = await this.detectPureCircuits(artifacts);\n      const decorations = mapDetectionToDecorations(organizerOnlyResults, pureCircuitResults);\n\n      // Cache results\n      this.cache.set(cacheKey, decorations);\n\n      const organizerCount = Object.values(organizerOnlyResults).filter(Boolean).length;\n      const pureCount = Object.values(pureCircuitResults).filter(Boolean).length;\n      logger.info(\n        SYSTEM_LOG_TAG,\n        `Analysis complete: ${organizerCount} organizer-only circuits, ${pureCount} pure circuits identified`\n      );\n\n      return decorations;\n    } catch (error) {\n      logger.error(\n        SYSTEM_LOG_TAG,\n        'Function decoration analysis failed',\n        error instanceof Error ? error.message : String(error)\n      );\n      return undefined;\n    }\n  }\n\n  /**\n   * Detects organizer-only circuits from artifacts\n   * Orchestrates the workflow: evaluate witnesses → load runtime → evaluate contracts → detect\n   *\n   * @private\n   */\n  private async detectOrganizerOnlyCircuits(\n    artifacts: MidnightContractArtifacts\n  ): Promise<Record<string, boolean>> {\n    // Step 1: Evaluate witness code\n    logger.debug(SYSTEM_LOG_TAG, 'Step 1: Evaluating witness code');\n    const witnessCode = artifacts.witnessCode || '';\n    const baseWitnesses = evaluateWitnessCode(witnessCode);\n\n    // Step 2: Load and inject compact-runtime\n    logger.debug(SYSTEM_LOG_TAG, 'Step 2: Loading compact-runtime');\n    const runtimeNs = await import('@midnight-ntwrk/compact-runtime');\n    const compactRuntime = (runtimeNs as Record<string, unknown>)?.default ?? runtimeNs;\n\n    // Step 3: Evaluate contract module\n    logger.debug(SYSTEM_LOG_TAG, 'Step 3: Evaluating contract module');\n    const contractModule = artifacts.contractModule || '';\n    const contractInstance = evaluateContractModule(contractModule, baseWitnesses, {\n      '@midnight-ntwrk/compact-runtime': compactRuntime,\n    });\n\n    // Step 4: Extract impure circuits and run detection\n    if (!contractInstance || typeof contractInstance !== 'object') {\n      logger.warn(SYSTEM_LOG_TAG, 'Contract instance not available for detection');\n      return {};\n    }\n\n    const instance = contractInstance as Record<string, unknown>;\n    const circuitMap = instance.impureCircuits as Record<string, unknown> | undefined;\n\n    if (!circuitMap || Object.keys(circuitMap).length === 0) {\n      logger.info(SYSTEM_LOG_TAG, 'No impure circuits found');\n      return {};\n    }\n\n    logger.debug(\n      SYSTEM_LOG_TAG,\n      `Step 4: Analyzing ${Object.keys(circuitMap).length} impure circuits`\n    );\n\n    // Use source inspection to detect identity-witness calls\n    return detectOrganizerOnlyBySource(\n      circuitMap,\n      baseWitnesses,\n      instance as Record<string, unknown>\n    );\n  }\n\n  /**\n   * Detects pure circuits from artifacts\n   * Pure circuits are computational functions that run locally without blockchain interaction\n   * Detection is done by parsing the contract definition (.d.ts) to find PureCircuits type\n   *\n   * @private\n   */\n  private async detectPureCircuits(\n    artifacts: MidnightContractArtifacts\n  ): Promise<Record<string, boolean>> {\n    const results: Record<string, boolean> = {};\n\n    // Method 1: Parse contract definition to find PureCircuits type\n    if (artifacts.contractDefinition) {\n      logger.debug(SYSTEM_LOG_TAG, 'Detecting pure circuits from contract definition');\n\n      // Helper functions for extractPureCircuits\n      const parseParameters = (): [] => []; // Pure circuits don't need parameter parsing for detection\n      const capitalizeFirst = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\n\n      const pureCircuitsMap = extractPureCircuits(\n        artifacts.contractDefinition,\n        parseParameters,\n        capitalizeFirst\n      );\n\n      for (const circuitId of Object.keys(pureCircuitsMap)) {\n        results[circuitId] = true;\n        logger.debug(SYSTEM_LOG_TAG, `Found pure circuit in definition: ${circuitId}`);\n      }\n    }\n\n    // Method 2: Fallback to runtime evaluation if contract definition parsing didn't find any\n    if (Object.keys(results).length === 0 && artifacts.contractModule) {\n      logger.debug(SYSTEM_LOG_TAG, 'Falling back to runtime evaluation for pure circuit detection');\n      try {\n        // Step 1: Evaluate witness code\n        const witnessCode = artifacts.witnessCode || '';\n        const baseWitnesses = evaluateWitnessCode(witnessCode);\n\n        // Step 2: Load and inject compact-runtime\n        const runtimeNs = await import('@midnight-ntwrk/compact-runtime');\n        const compactRuntime = (runtimeNs as Record<string, unknown>)?.default ?? runtimeNs;\n\n        // Step 3: Evaluate contract module\n        const contractModule = artifacts.contractModule || '';\n        const contractInstance = evaluateContractModule(contractModule, baseWitnesses, {\n          '@midnight-ntwrk/compact-runtime': compactRuntime,\n        });\n\n        // Step 4: Extract pure circuits\n        if (contractInstance && typeof contractInstance === 'object') {\n          const instance = contractInstance as Record<string, unknown>;\n          const pureCircuitsMap = instance.pureCircuits as Record<string, unknown> | undefined;\n\n          if (pureCircuitsMap && Object.keys(pureCircuitsMap).length > 0) {\n            logger.debug(\n              SYSTEM_LOG_TAG,\n              `Found ${Object.keys(pureCircuitsMap).length} pure circuits via runtime evaluation`\n            );\n\n            // Map pure circuit names to true\n            for (const circuitName of Object.keys(pureCircuitsMap)) {\n              results[circuitName] = true;\n            }\n          }\n        }\n      } catch (error) {\n        logger.warn(\n          SYSTEM_LOG_TAG,\n          'Runtime evaluation failed for pure circuit detection',\n          error instanceof Error ? error.message : String(error)\n        );\n      }\n    }\n\n    if (Object.keys(results).length > 0) {\n      logger.debug(\n        SYSTEM_LOG_TAG,\n        `Detected ${Object.keys(results).length} pure circuits: ${Object.keys(results).join(', ')}`\n      );\n    } else {\n      logger.debug(SYSTEM_LOG_TAG, 'No pure circuits detected');\n    }\n\n    return results;\n  }\n\n  /**\n   * Generates a cache key from artifacts\n   *\n   * @private\n   */\n  private generateCacheKey(artifacts: MidnightContractArtifacts): string {\n    const contractAddress = artifacts.contractAddress ?? '';\n    const privateStateId = artifacts.privateStateId ?? '';\n    const artifactHash = JSON.stringify(artifacts).substring(0, 32);\n    return `${contractAddress}|${privateStateId}|${artifactHash}`;\n  }\n\n  /**\n   * Clears the cache (useful for testing or manual reset)\n   */\n  clearCache(): void {\n    this.cache.clear();\n  }\n}\n\n/**\n * Maps detection results to function decorations\n *\n * @internal\n */\nfunction mapDetectionToDecorations(\n  organizerOnlyResults: Record<string, boolean>,\n  pureCircuitResults: Record<string, boolean>\n): FunctionDecorationsMap {\n  const decorations: FunctionDecorationsMap = {};\n\n  // Map organizer-only circuits\n  for (const [circuitId, isOrganizerOnly] of Object.entries(organizerOnlyResults)) {\n    if (isOrganizerOnly) {\n      decorations[circuitId] = {\n        badges: [\n          {\n            text: 'Identity-restricted',\n            variant: 'warning',\n            tooltip:\n              'Detected based on code analysis. This function appears to require an identity secret. The system scans for identity witness calls in the compiled contract code.',\n          },\n        ],\n        note: {\n          title: 'Identity-restricted circuit (automated detection)',\n          body: 'This circuit requires an identity secret. A form field will be added automatically where you can enter it when executing the transaction. The secret is never stored and is only used for this transaction.\\n\\nNote: Detection is based on static code analysis and may occasionally produce false positives.',\n        },\n        requiresRuntimeSecret: true,\n      };\n    }\n  }\n\n  // Map pure circuits (may combine with organizer-only if both apply)\n  for (const [circuitId, isPureCircuit] of Object.entries(pureCircuitResults)) {\n    if (isPureCircuit) {\n      const existing = decorations[circuitId];\n      decorations[circuitId] = {\n        ...existing,\n        badges: [\n          ...(existing?.badges || []),\n          {\n            text: 'Pure Circuit',\n            variant: 'info',\n            tooltip:\n              'Runs locally without blockchain interaction. This function executes entirely client-side and returns a result immediately.',\n          },\n        ],\n        note: existing?.note || {\n          title: 'Pure Circuit',\n          body: 'This circuit runs locally without submitting a transaction to the blockchain. It executes entirely client-side and returns a result immediately. No wallet connection is required.',\n        },\n      };\n    }\n  }\n\n  return decorations;\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'ContractEvaluator';\n\n/**\n * Evaluates user-provided contract module code and creates a contract instance\n * Pattern: mirrors CLI's dynamic contract module loading\n *\n * @param contractModule - The contract module code (CommonJS format)\n * @param witnesses - Witness functions for zero-knowledge proofs\n * @param deps - Optional dependency map to inject specific modules (e.g., compact-runtime)\n */\nexport function evaluateContractModule(\n  contractModule: string,\n  witnesses: Record<string, unknown>,\n  deps?: Record<string, unknown>\n): unknown {\n  if (!contractModule || contractModule.trim() === '') {\n    throw new Error('Contract module code is required for transaction execution');\n  }\n\n  try {\n    logger.debug(SYSTEM_LOG_TAG, 'Evaluating contract module');\n\n    // Pre-process the contract module to fix multi-line statement issues\n    // TEMPORARY WORKAROUND: The Midnight compiler sometimes outputs multi-line\n    // chained calls that break Function() parsing. This joins them back together.\n    // Waiting for Midnight SDK compiler improvements to output Function()-compatible code.\n    let processedModule = contractModule;\n\n    // Fix all multi-line chained method calls - join lines that start with a dot\n    processedModule = processedModule.replace(/\\n\\s*\\./g, '.');\n\n    // Also fix multi-line array/object access\n    processedModule = processedModule.replace(/\\n\\s*\\[/g, '[');\n\n    // Contract modules are CommonJS format: module.exports = { Contract: ... }\n    // Create a sandboxed environment for evaluation\n    const moduleExports = {};\n    const sandbox = {\n      module: { exports: moduleExports },\n      exports: moduleExports,\n      require: function (id: string) {\n        logger.debug(SYSTEM_LOG_TAG, `Contract requires module: ${id}`);\n        // Priority 1: Use injected deps to guarantee shared runtime instances\n        if (deps && id in deps) {\n          logger.debug(SYSTEM_LOG_TAG, `Module ${id} loaded from injected deps`);\n          const mod = (deps as Record<string, unknown>)[id];\n          // Unwrap ESM default for CJS consumers to fix interop issues\n          return (mod as Record<string, unknown>)?.default ?? mod;\n        }\n        // Priority 2: Use global require if available\n        if (globalThis.require) {\n          const result = globalThis.require(id);\n          logger.debug(\n            SYSTEM_LOG_TAG,\n            `Module ${id} loaded:`,\n            result ? 'success' : 'null/undefined'\n          );\n          return result;\n        }\n        throw new Error('require is not available for module: ' + id);\n      },\n      process: {\n        env: { NODE_ENV: 'production' },\n        version: 'v16.0.0',\n        versions: {\n          node: '16.0.0',\n          v8: '9.0.0',\n          modules: '93',\n        },\n        platform: 'browser',\n        arch: 'wasm32',\n        release: {\n          name: 'node',\n          lts: 'Gallium',\n        },\n      },\n      global: globalThis,\n      globalThis: globalThis,\n      __dirname: '/',\n      __filename: '/contract.cjs',\n      console: console,\n      Buffer: globalThis.Buffer || {\n        from: (data: string | Uint8Array, encoding?: string) => {\n          let uint8Array: Uint8Array;\n          if (typeof data === 'string') {\n            if (encoding === 'hex') {\n              const bytes = [];\n              for (let i = 0; i < data.length; i += 2) {\n                bytes.push(parseInt(data.substring(i, i + 2), 16));\n              }\n              uint8Array = new Uint8Array(bytes);\n            } else {\n              uint8Array = new TextEncoder().encode(data);\n            }\n          } else {\n            uint8Array = new Uint8Array(data as Uint8Array);\n          }\n          // Add toString method to convert back to hex\n          (uint8Array as Uint8Array & { toString(encoding?: string): string }).toString = (\n            encoding?: string\n          ) => {\n            if (encoding === 'hex') {\n              return Array.from(uint8Array)\n                .map((b) => b.toString(16).padStart(2, '0'))\n                .join('');\n            }\n            return new TextDecoder().decode(uint8Array);\n          };\n          return uint8Array;\n        },\n        alloc: (size: number) => new Uint8Array(size),\n        isBuffer: (obj: unknown) => obj instanceof Uint8Array,\n      },\n      witnesses: witnesses,\n    };\n\n    // Create the evaluator function with the sandbox\n    const evaluator = new Function(\n      ...Object.keys(sandbox),\n      processedModule + '\\nreturn module.exports;'\n    );\n\n    // Call the evaluator with the sandbox values\n    const contractExports = evaluator(...Object.values(sandbox));\n\n    logger.debug(\n      SYSTEM_LOG_TAG,\n      `Contract exports → type:${typeof contractExports} keys:${\n        contractExports ? Object.keys(contractExports).join(',') : 'null'\n      }`\n    );\n\n    if (!contractExports || typeof contractExports !== 'object') {\n      throw new Error('Contract module did not export a valid object');\n    }\n\n    if (typeof contractExports.Contract !== 'function') {\n      logger.error(SYSTEM_LOG_TAG, 'Available exports:', Object.keys(contractExports));\n      logger.error(SYSTEM_LOG_TAG, 'Contract property type:', typeof contractExports.Contract);\n      logger.error(SYSTEM_LOG_TAG, 'Contract property value:', contractExports.Contract);\n      logger.error(\n        SYSTEM_LOG_TAG,\n        'Contract constructor check:',\n        contractExports.Contract?.constructor?.name\n      );\n      throw new Error('Contract module does not export a Contract class');\n    }\n\n    logger.debug(SYSTEM_LOG_TAG, 'Creating contract instance with witnesses');\n    const contractInstance = new contractExports.Contract(witnesses);\n\n    logger.info(SYSTEM_LOG_TAG, 'Contract instance created');\n    return contractInstance;\n  } catch (error) {\n    logger.error(SYSTEM_LOG_TAG, 'Failed to evaluate contract module:', error);\n    throw new Error(\n      `Failed to create contract instance: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'WitnessEvaluator';\n\n/**\n * Evaluates user-provided witness code and extracts witness functions\n * Pattern: mirrors WitnessManager from deploy CLI\n *\n * Security note: Uses Function() constructor to evaluate user code.\n * This is intentional to match CLI behavior and enable dynamic witness loading.\n */\nexport function evaluateWitnessCode(witnessCode: string): Record<string, unknown> {\n  if (!witnessCode || witnessCode.trim() === '') {\n    logger.debug(SYSTEM_LOG_TAG, 'No witness code provided, using empty witnesses');\n    return {};\n  }\n\n  try {\n    logger.debug(SYSTEM_LOG_TAG, 'Evaluating witness code');\n\n    // Sanitize ESM syntax so it evaluates in a Function (non-module) context\n    const sanitized = sanitizeWitnessCode(witnessCode);\n\n    // Create a sandboxed environment for witness evaluation\n    // Witnesses are pure functions that don't need external dependencies,\n    // but we sandbox them for consistency and to prevent unintended global access\n    const sandbox = {\n      console: console, // Allow logging for debugging\n      Buffer: (globalThis as unknown as { Buffer?: unknown }).Buffer,\n      crypto: (globalThis as unknown as { crypto?: unknown }).crypto,\n    };\n\n    // Create the evaluator function with the sandbox\n    const evaluator = new Function(...Object.keys(sandbox), sanitized + '\\nreturn witnesses;');\n\n    // Call the evaluator with the sandbox values\n    const witnesses = evaluator(...Object.values(sandbox));\n\n    if (typeof witnesses !== 'object' || witnesses === null) {\n      logger.warn(SYSTEM_LOG_TAG, 'Witness code did not export valid witnesses object');\n      return {};\n    }\n\n    const witnessCount = Object.keys(witnesses).length;\n    logger.info(SYSTEM_LOG_TAG, `Loaded ${witnessCount} witness functions`);\n    if (witnessCount > 0) {\n      Object.keys(witnesses).forEach((name) => {\n        logger.debug(SYSTEM_LOG_TAG, `- ${name}`);\n      });\n    }\n\n    return witnesses as Record<string, unknown>;\n  } catch (error) {\n    logger.error(SYSTEM_LOG_TAG, 'Failed to evaluate witness code:', error);\n    throw new Error(\n      `Failed to evaluate witness functions: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n/**\n * Remove ESM-specific syntax so the code can run inside Function().\n * - Replace `export const witnesses =` with `const witnesses =`\n * - Remove `export default ...` and `export { ... }` lines\n * - Remove/ignore top-level `import ... from` statements (not supported in Function context)\n *\n * TEMPORARY WORKAROUND: This regex-based sanitization is pragmatic but brittle.\n * Waiting for Midnight SDK to provide witnesses in CommonJS format or provide\n * a proper loader. Long-term, replace with AST-based transformation (esbuild/swc)\n * for more robust handling of edge cases.\n */\nfunction sanitizeWitnessCode(code: string): string {\n  let out = code;\n\n  // Normalize Windows newlines\n  out = out.replace(/\\r\\n/g, '\\n');\n\n  // Remove top-level import statements (simple cases)\n  out = out.replace(/^\\s*import\\s+[^;]+;?\\s*$/gm, '');\n\n  // Replace exported declaration of witnesses with non-exported\n  out = out.replace(/\\bexport\\s+(const|let|var)\\s+(witnesses)\\b/g, '$1 $2');\n\n  // Remove `export { witnesses }` or any named export lines\n  out = out.replace(/^\\s*export\\s*\\{[^}]*\\}\\s*;?\\s*$/gm, '');\n\n  // Remove `export default ...` lines (we rely on `witnesses` identifier instead)\n  out = out.replace(/^\\s*export\\s+default\\s+[^;]+;?\\s*$/gm, '');\n\n  // As a last resort, strip remaining leading `export ` keywords on declarations\n  out = out.replace(/^\\s*export\\s+/gm, '');\n\n  return out;\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'OrganizerOnlyDetector';\n\n/**\n * Identity witness aliases that indicate organizer/owner status\n * These witness names require the organizer's secret key\n */\nconst IDENTITY_ALIASES = [\n  'local_sk',\n  'local_secret_key',\n  'organizer_key',\n  'set_owner_from_local_sk',\n];\n\n/**\n * Sensitive witness names that indicate organizer-only access\n */\nconst SENSITIVE_WITNESSES = new Set([\n  'local_sk',\n  'set_owner_from_local_sk',\n  'compute_commitment_with_secret',\n  'check_pin',\n]);\n\n/**\n * State-modifying prefixes that often indicate organizer-only operations\n */\nconst STATE_MODIFYING_PREFIXES = [\n  'set',\n  'toggle',\n  'update',\n  'change',\n  'modify',\n  'admin',\n  'register',\n  'initialize',\n  'configure',\n  'manage',\n];\n\n/**\n * Detects organizer-only circuits using heuristic pattern analysis.\n *\n * Strategy:\n * - Analyzes circuit naming patterns (e.g., set*, toggle*, update*)\n * - Checks for presence of sensitive witnesses in the contract\n * - Marks circuits as organizer-only if they match both criteria\n *\n * This approach is reliable because:\n * 1. Contracts typically follow naming conventions for state-mutating functions\n * 2. Sensitive witnesses (local_sk, set_owner_from_local_sk) are only present when needed\n * 3. The combination of both signals high confidence\n *\n * @param circuitMap - Map of circuit IDs from contract.impureCircuits\n * @param witnesses - Loaded witness functions\n * @returns Map of circuit ID to organizer-only status\n */\nexport function detectOrganizerOnlyCircuits(\n  circuitMap: Record<string, unknown>,\n  witnesses: Record<string, unknown>\n): Record<string, boolean> {\n  const results: Record<string, boolean> = {};\n\n  // Check if sensitive witnesses are available\n  const hasSensitiveWitnesses = Array.from(SENSITIVE_WITNESSES).some((name) => name in witnesses);\n\n  if (!hasSensitiveWitnesses) {\n    logger.debug(SYSTEM_LOG_TAG, 'No sensitive witnesses found; all circuits treated as public');\n    return results;\n  }\n\n  logger.debug(\n    SYSTEM_LOG_TAG,\n    `Analyzing ${Object.keys(circuitMap).length} circuits with heuristic detection`\n  );\n\n  for (const [circuitId] of Object.entries(circuitMap)) {\n    const isOrganizerOnly = isLikelyOrganizerOnly(circuitId, witnesses);\n    if (isOrganizerOnly) {\n      results[circuitId] = true;\n      logger.debug(SYSTEM_LOG_TAG, `Circuit \"${circuitId}\" identified as organizer-only`);\n    }\n  }\n\n  const organizerOnlyCount = Object.values(results).filter(Boolean).length;\n  logger.info(\n    SYSTEM_LOG_TAG,\n    `Detection complete: ${organizerOnlyCount} organizer-only circuits identified`\n  );\n\n  return results;\n}\n\n/**\n * Heuristic check for organizer-only circuits based on naming patterns\n *\n * @param circuitId - The circuit identifier\n * @param witnesses - Available witness functions\n * @returns True if circuit is likely organizer-only\n */\nfunction isLikelyOrganizerOnly(circuitId: string, witnesses: Record<string, unknown>): boolean {\n  // Check if circuit name starts with a state-modifying prefix\n  const lowerCircuitId = circuitId.toLowerCase();\n  const hasModifyingPrefix = STATE_MODIFYING_PREFIXES.some((prefix) =>\n    lowerCircuitId.startsWith(prefix)\n  );\n\n  if (!hasModifyingPrefix) {\n    return false;\n  }\n\n  // Double-check that sensitive witnesses are available\n  // (should always be true if called from detectOrganizerOnlyCircuits, but belt-and-suspenders)\n  const hasSensitiveWitnesses = Array.from(SENSITIVE_WITNESSES).some((name) => name in witnesses);\n\n  // Mark as organizer-only if it has a modifying name pattern AND sensitive witnesses exist\n  return hasModifyingPrefix && hasSensitiveWitnesses;\n}\n\n/**\n * Detects organizer-only circuits by scanning compiled circuit implementations for identity-witness calls.\n *\n * Strategy:\n * - For each impure circuit, extract the implementation function text\n * - Search for calls to identity-witness functions (local_sk, organizer_key, etc.)\n * - Check for both direct calls (this.witnesses.local_sk()) and destructured patterns\n * - More accurate than naming heuristics; avoids runtime execution\n *\n * @param impureCircuits - Map of circuit IDs to their implementations\n * @param witnesses - Loaded witness functions\n * @returns Map of circuit ID to organizer-only status\n */\nexport function detectOrganizerOnlyBySource(\n  impureCircuits: Record<string, unknown>,\n  witnesses: Record<string, unknown>,\n  contractInstance?: Record<string, unknown>\n): Record<string, boolean> {\n  const results: Record<string, boolean> = {};\n\n  // Quick check: if no identity witnesses are present, no circuit needs organizer key\n  const hasIdentityWitnesses = IDENTITY_ALIASES.some((alias) => alias in witnesses);\n\n  if (!hasIdentityWitnesses) {\n    logger.debug(\n      SYSTEM_LOG_TAG,\n      'No identity witnesses found; all circuits treated as non-organizer-only'\n    );\n    return results;\n  }\n\n  logger.debug(\n    SYSTEM_LOG_TAG,\n    `Analyzing ${Object.keys(impureCircuits).length} circuits by source inspection`\n  );\n\n  for (const [circuitId, circuitFn] of Object.entries(impureCircuits)) {\n    if (callsIdentityWitness(circuitFn, circuitId, contractInstance)) {\n      results[circuitId] = true;\n      logger.debug(\n        SYSTEM_LOG_TAG,\n        `Circuit \"${circuitId}\" uses identity witness (source inspection)`\n      );\n    }\n  }\n\n  const organizerOnlyCount = Object.values(results).filter(Boolean).length;\n  logger.info(\n    SYSTEM_LOG_TAG,\n    `Source inspection complete: ${organizerOnlyCount} organizer-only circuits identified`\n  );\n\n  return results;\n}\n\n/**\n * Checks if a circuit implementation calls any identity witness, directly or via helper methods\n */\nfunction callsIdentityWitness(\n  circuitFn: unknown,\n  circuitId: string,\n  contractInstance?: Record<string, unknown>,\n  visited: Set<string> = new Set<string>(),\n  depth: number = 0\n): boolean {\n  if (typeof circuitFn !== 'function') {\n    return false;\n  }\n\n  try {\n    const src = circuitFn.toString();\n    if (!src || src.length === 0) {\n      return false;\n    }\n\n    // Direct witness calls\n    const directPattern = IDENTITY_ALIASES.some(\n      (alias) => src.includes(`this.witnesses.${alias}(`) || src.includes(`.witnesses.${alias}(`)\n    );\n\n    if (directPattern) {\n      return true;\n    }\n\n    // Destructured witness access\n    const destructPattern = IDENTITY_ALIASES.some((alias) => {\n      const hasDestructure = src.includes(`{ ${alias} }`) && src.includes(`this.witnesses`);\n      const hasUsage = src.includes(`${alias}(`);\n      return hasDestructure && hasUsage;\n    });\n\n    if (destructPattern) {\n      return true;\n    }\n\n    // Recursive scan of helper methods referenced in the function body\n    if (contractInstance && depth < 6) {\n      const helperNames = extractHelperCalls(src);\n      for (const helperName of helperNames) {\n        if (visited.has(helperName)) continue;\n        visited.add(helperName);\n        const helperFn = contractInstance[helperName];\n        if (typeof helperFn === 'function') {\n          if (\n            callsIdentityWitness(\n              helperFn as unknown as () => unknown,\n              helperName,\n              contractInstance,\n              visited,\n              depth + 1\n            )\n          ) {\n            return true;\n          }\n        }\n      }\n    }\n\n    return false;\n  } catch (error) {\n    logger.debug(\n      SYSTEM_LOG_TAG,\n      `Could not inspect source for circuit ${circuitId}:`,\n      error instanceof Error ? error.message : String(error)\n    );\n    return false;\n  }\n}\n\n/**\n * Extract helper method names called on `this` within a function source.\n * Matches patterns like: this._helperName( ... )\n */\nfunction extractHelperCalls(source: string): Set<string> {\n  const names = new Set<string>();\n  const regex = /this\\.([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g;\n  let match: RegExpExecArray | null;\n  while ((match = regex.exec(source)) !== null) {\n    const name = match[1];\n    // skip obvious non-helpers\n    if (name === 'witnesses' || name === 'circuits' || name === 'pureCircuits') continue;\n    names.add(name);\n  }\n  return names;\n}\n","import type { AdapterExportBootstrap, AdapterExportContext } from '@openzeppelin/ui-builder-types';\nimport { base64ToBytes, logger } from '@openzeppelin/ui-builder-utils';\n\nimport { stripZipForFunction } from '../utils/zip-slimmer';\n\nconst SYSTEM_LOG_TAG = 'MidnightAdapter:ExportBootstrap';\n\n/**\n * Generates bootstrap files for Midnight contract artifacts in exported applications.\n *\n * Instead of embedding massive artifact files, this bundles the original ZIP file\n * as a base64 string and lets the adapter parse it using the same logic as the builder.\n *\n * @param context - Export context with form config, schema, network, and artifacts\n * @returns Bootstrap configuration with ZIP data and initialization code\n */\nexport async function getMidnightExportBootstrapFiles(\n  context: AdapterExportContext\n): Promise<AdapterExportBootstrap | null> {\n  logger.info(SYSTEM_LOG_TAG, 'Generating Midnight export bootstrap files');\n\n  const artifacts = context.artifacts || {};\n  const functionId = context.formConfig.functionId;\n\n  const contractAddress =\n    context.formConfig.contractAddress || context.contractSchema.address || '';\n  const privateStateId = (artifacts['privateStateId'] as string) || '';\n\n  if (!contractAddress || !privateStateId) {\n    logger.error(SYSTEM_LOG_TAG, 'Missing contract address or private state ID.');\n    return null;\n  }\n\n  const base64Zip =\n    (artifacts['trimmedZipBase64'] as string | undefined) ||\n    (artifacts['originalZipData'] as string | undefined);\n\n  if (!base64Zip) {\n    logger.warn(SYSTEM_LOG_TAG, 'No ZIP data found in artifacts; cannot add public asset.');\n    return null;\n  }\n\n  const originalBytes = base64ToBytes(base64Zip);\n  const zipBytes = functionId\n    ? await stripZipForFunction(originalBytes, functionId).catch(() => originalBytes)\n    : originalBytes;\n\n  const artifactsFileContent = `\nexport const midnightArtifactsSource = {\n  contractAddress: '${contractAddress}',\n  privateStateId: '${privateStateId}',\n  contractArtifactsUrl: '/midnight/contract.zip',\n};\n`;\n\n  const initCode = `// Load Midnight contract from URL-based ZIP (same as builder does)\n    if (typeof (adapter as any).loadContractWithMetadata === 'function') {\n      await (adapter as any).loadContractWithMetadata(midnightArtifactsSource);\n    }`;\n\n  logger.info(SYSTEM_LOG_TAG, 'Successfully generated Midnight bootstrap files with URL');\n\n  return {\n    files: {\n      'src/midnight/artifacts.ts': artifactsFileContent,\n    },\n    binaryFiles: {\n      'public/midnight/contract.zip': zipBytes,\n    },\n    imports: [\"import { midnightArtifactsSource } from './midnight/artifacts';\"],\n    initAfterAdapterConstruct: initCode,\n  };\n}\n","import JSZip from 'jszip';\n\n/**\n * Produce a per-function trimmed ZIP that keeps core files (contract module, d.ts, witness)\n * and only the selected circuit's keys (prover, verifier) and zkir.\n */\nexport async function stripZipForFunction(\n  originalZipData: Uint8Array | ArrayBuffer | Blob | string,\n  functionId: string\n): Promise<Uint8Array> {\n  const zip = await JSZip.loadAsync(\n    originalZipData as Uint8Array | ArrayBuffer | Blob,\n    typeof originalZipData === 'string' ? { base64: true } : undefined\n  );\n  const out = new JSZip();\n\n  const files = Object.keys(zip.files);\n\n  // Include core files\n  for (const p of files) {\n    if (p.endsWith('.cjs') && p.includes('contract')) {\n      out.file(p, await zip.files[p].async('uint8array'));\n    } else if (p.endsWith('.d.ts') || p.endsWith('.d.cts')) {\n      out.file(p, await zip.files[p].async('string'));\n    } else if (\n      /witness/i.test(p) &&\n      (p.endsWith('.cjs') || p.endsWith('.js')) &&\n      !p.endsWith('.map')\n    ) {\n      out.file(p, await zip.files[p].async('string'));\n    }\n  }\n\n  // Keep only the selected circuit's artifacts\n  const f = functionId;\n  for (const p of files) {\n    if (\n      p.endsWith(`${f}.prover`) ||\n      p.endsWith(`${f}.verifier`) ||\n      p.endsWith(`${f}.bzkir`) ||\n      p.endsWith(`${f}.zkir`)\n    ) {\n      out.file(p, await zip.files[p].async('uint8array'));\n    }\n  }\n\n  return out.generateAsync({\n    type: 'uint8array',\n    compression: 'DEFLATE',\n    compressionOptions: { level: 6 },\n  });\n}\n","import { startCase } from 'lodash';\n\nimport type {\n  ContractSchema,\n  FieldType,\n  FieldValidation,\n  FormFieldType,\n  FunctionParameter,\n} from '@openzeppelin/ui-builder-types';\nimport { enhanceNumericValidation, type NumericBoundsMap } from '@openzeppelin/ui-builder-utils';\n\nimport { isUintType, isVectorType } from '../utils/type-helpers';\nimport { mapMidnightParameterTypeToFieldType } from './type-mapper';\n\n// --- Helpers --------------------------------------------------------------- //\nfunction isArrayType(type: string): { isArray: boolean; elementType?: string } {\n  const match = type.match(/^Array<\\s*(.+)\\s*>$/);\n  if (match) return { isArray: true, elementType: match[1] };\n  return { isArray: false };\n}\n\nfunction isMaybeType(type: string): { isMaybe: boolean; innerType?: string } {\n  const match = type.match(/^Maybe<\\s*(.+)\\s*>$/i);\n  if (match) return { isMaybe: true, innerType: match[1] };\n  return { isMaybe: false };\n}\n\nfunction isInlineObjectLiteral(type: string): boolean {\n  const trimmed = type.trim();\n  return trimmed.startsWith('{') && trimmed.endsWith('}');\n}\n\nfunction parseObjectLiteralComponents(type: string): FunctionParameter[] {\n  const inner = type.trim().replace(/^\\{/, '').replace(/\\}$/, '');\n  const components: FunctionParameter[] = [];\n  let current = '';\n  let braceDepth = 0;\n  for (let i = 0; i < inner.length; i++) {\n    const ch = inner[i];\n    if (ch === '{' || ch === '[' || ch === '(') braceDepth++;\n    if (ch === '}' || ch === ']' || ch === ')') braceDepth--;\n    if (ch === ';' && braceDepth === 0) {\n      const part = current.trim();\n      if (part) {\n        const cleaned = part.replace(/^readonly\\s+/, '');\n        const idx = cleaned.indexOf(':');\n        if (idx > -1) {\n          const name = cleaned.substring(0, idx).trim().replace(/\\?$/, '');\n          const t = cleaned.substring(idx + 1).trim();\n          if (name) components.push({ name, type: t });\n        }\n      }\n      current = '';\n    } else {\n      current += ch;\n    }\n  }\n  const tail = current.trim();\n  if (tail) {\n    const cleaned = tail.replace(/^readonly\\s+/, '');\n    const idx = cleaned.indexOf(':');\n    if (idx > -1) {\n      const name = cleaned.substring(0, idx).trim().replace(/\\?$/, '');\n      const t = cleaned.substring(idx + 1).trim();\n      if (name) components.push({ name, type: t });\n    }\n  }\n  return components;\n}\n\n/**\n * Extracts numeric bounds from Midnight Uint type strings (e.g., 'Uint<0..255>').\n * Returns bounds map for use with enhanceNumericValidation.\n */\nfunction extractUintBounds(type: string): NumericBoundsMap | null {\n  if (!isUintType(type)) {\n    return null;\n  }\n\n  // Match Uint<0..MAX> pattern\n  const match = type.match(/^Uint<\\s*0\\s*\\.\\.\\s*(\\d+)\\s*>$/i);\n  if (!match) {\n    return null;\n  }\n\n  const max = Number.parseInt(match[1], 10);\n  if (Number.isNaN(max)) {\n    return null;\n  }\n\n  // Return a bounds map keyed by the exact type string\n  return {\n    [type]: { min: 0, max },\n  };\n}\n\n/**\n * Get default validation rules for a parameter.\n */\nfunction getDefaultValidation(required = true): FieldValidation {\n  return { required };\n}\n\n/**\n * Generate default field configuration for a Midnight function parameter.\n * Handles arrays, inline object literals, and Maybe<T> optionality.\n *\n * NOTE: The Midnight compiler's `.d.ts` output loses Vector<N, T> type information,\n * converting it to simple `T[]` notation. This means we cannot automatically enforce\n * fixed-size array validation from the schema alone. Users must either:\n * 1. Manually set validation.min/max in the UI Builder's field editor, or\n * 2. Provide Vector metadata separately (if available from the .compact source)\n */\nexport function generateMidnightDefaultField<T extends FieldType = FieldType>(\n  parameter: FunctionParameter,\n  contractSchema?: ContractSchema\n): FormFieldType<T> {\n  const originalType = parameter.type || 'string';\n  const maybe = isMaybeType(originalType);\n  const baseType = maybe.isMaybe && maybe.innerType ? maybe.innerType : originalType;\n\n  const arrayInfo = isArrayType(baseType);\n  const vectorInfo = isVectorType(baseType);\n\n  // Check for Vector metadata in schema (if provided separately)\n  const vectorMetadata = (\n    contractSchema?.metadata as\n      | { vectorTypes?: Record<string, { size: number; elementType: string }> }\n      | undefined\n  )?.vectorTypes;\n  const vectorMeta = vectorMetadata?.[parameter.name];\n\n  // Base field mapping\n  let fieldType = mapMidnightParameterTypeToFieldType(baseType) as T;\n\n  // Enum detection via schema metadata\n  const enumsMeta = (\n    contractSchema?.metadata as\n      | { enums?: Record<string, Array<{ name: string; value?: number }>> }\n      | undefined\n  )?.enums;\n  if (enumsMeta && enumsMeta[baseType]) {\n    fieldType = 'enum' as T;\n  }\n\n  // Extract numeric bounds for Uint types\n  const uintBounds = extractUintBounds(baseType);\n  const midnightBounds: NumericBoundsMap = uintBounds || {};\n\n  // Build base validation\n  let baseValidation = getDefaultValidation(!maybe.isMaybe);\n  baseValidation = enhanceNumericValidation(baseValidation, baseType, midnightBounds);\n\n  const fieldBase: FormFieldType<T> = {\n    id: `${parameter.name}`,\n    name: parameter.name || 'param',\n    label: parameter.displayName || startCase(parameter.name || 'param'),\n    type: fieldType,\n    validation: baseValidation,\n  } as FormFieldType<T>;\n\n  // Attach enum metadata if available\n  if ((fieldType as unknown as string) === 'enum' && enumsMeta && enumsMeta[baseType]) {\n    const variantsRaw = enumsMeta[baseType];\n    const enumMetadata = {\n      name: baseType,\n      variants: variantsRaw.map((v) => ({\n        name: v.name,\n        type: 'integer' as const,\n        value: v.value,\n      })),\n      isUnitOnly: variantsRaw.every((v) => typeof v.value === 'number'),\n    };\n    return {\n      ...fieldBase,\n      enumMetadata,\n    } as FormFieldType<T>;\n  }\n\n  // Inline object literal (non-array)\n  if (!arrayInfo.isArray && isInlineObjectLiteral(baseType)) {\n    const components = parseObjectLiteralComponents(baseType);\n    return {\n      ...fieldBase,\n      type: 'object' as T,\n      components,\n    } as FormFieldType<T>;\n  }\n\n  // Array<T> and Vector<N, T>\n  if (arrayInfo.isArray || vectorInfo.isVector) {\n    const elementType = arrayInfo.elementType || vectorInfo.elementType || 'string';\n    if (isInlineObjectLiteral(elementType)) {\n      const components = parseObjectLiteralComponents(elementType);\n      return {\n        ...fieldBase,\n        type: 'array-object' as T,\n        components,\n      } as FormFieldType<T>;\n    }\n\n    // Simple arrays of primitives\n    const elementFieldType =\n      enumsMeta && enumsMeta[elementType]\n        ? ('enum' as FieldType)\n        : (mapMidnightParameterTypeToFieldType(elementType) as FieldType);\n\n    // Extract numeric bounds for array element Uint types\n    const elementUintBounds = extractUintBounds(elementType);\n    const elementBounds: NumericBoundsMap = elementUintBounds || {};\n\n    // Build element validation with bounds\n    let elementValidation = getDefaultValidation(true);\n    elementValidation = enhanceNumericValidation(elementValidation, elementType, elementBounds);\n\n    const baseArrayField: FormFieldType<T> = {\n      ...fieldBase,\n      type: 'array' as T,\n      elementType: elementFieldType,\n      // For Vector<N, T> enforce minimum number of items to N\n      // Try to get size from: 1) schema metadata, 2) vectorInfo (if Vector in type string)\n      validation: {\n        ...fieldBase.validation,\n        ...((vectorInfo.isVector && vectorInfo.size) || vectorMeta?.size\n          ? {\n              min: vectorInfo.size || vectorMeta?.size,\n              max: vectorInfo.size || vectorMeta?.size,\n            }\n          : {}),\n      },\n      elementFieldConfig: {\n        type: elementFieldType,\n        validation: elementValidation,\n      },\n    } as FormFieldType<T>;\n\n    if (elementFieldType === ('enum' as FieldType) && enumsMeta && enumsMeta[elementType]) {\n      const variantsRaw = enumsMeta[elementType];\n      const enumMetadata = {\n        name: elementType,\n        variants: variantsRaw.map((v) => ({\n          name: v.name,\n          type: 'integer' as const,\n          value: v.value,\n        })),\n        isUnitOnly: variantsRaw.every((v) => typeof v.value === 'number'),\n      };\n      return {\n        ...baseArrayField,\n        elementFieldConfig: {\n          ...baseArrayField.elementFieldConfig,\n          enumMetadata,\n        },\n      } as FormFieldType<T>;\n    }\n\n    return baseArrayField;\n  }\n\n  return fieldBase;\n}\n","/**\n * Common Midnight type helper utilities shared across mapping, parsing, and formatting.\n */\n\nexport function isArrayType(type: string): { isArray: boolean; elementType?: string } {\n  // Generic form: Array<T>\n  const generic = type.match(/^Array<\\s*(.+)\\s*>$/);\n  if (generic) return { isArray: true, elementType: generic[1].trim() };\n  // Brackets form: T[] or T[5]\n  const brackets = type.match(/^(.+?)\\s*\\[\\d*\\]$/);\n  if (brackets) return { isArray: true, elementType: brackets[1].trim() };\n  return { isArray: false };\n}\n\nexport function isMaybeType(type: string): { isMaybe: boolean; innerType?: string } {\n  const match = type.match(/^Maybe<\\s*(.+)\\s*>$/i);\n  if (match) return { isMaybe: true, innerType: match[1] };\n  return { isMaybe: false };\n}\n\nexport function isMapType(type: string): { isMap: boolean; keyType?: string; valueType?: string } {\n  const outer = type.match(/^Map<\\s*(.+)\\s*>$/);\n  if (!outer) return { isMap: false };\n  const inner = outer[1];\n  const parts = splitTopLevelParams(inner);\n  if (parts.length !== 2) return { isMap: false };\n  const [key, value] = parts;\n  return { isMap: true, keyType: key.trim(), valueType: value.trim() };\n}\n\nexport function isBytesType(type: string): boolean {\n  return (\n    type === 'Uint8Array' ||\n    type.toLowerCase() === 'bytes' ||\n    type.toLowerCase() === 'byteslike' ||\n    /^Bytes<\\d+>$/i.test(type) // Matches Bytes<32>, Bytes<64>, etc.\n  );\n}\n\n/**\n * Detects Midnight fixed-size vectors: Vector<N, T>\n */\nexport function isVectorType(type: string): {\n  isVector: boolean;\n  size?: number;\n  elementType?: string;\n} {\n  const match = type.match(/^Vector<\\s*(\\d+)\\s*,\\s*(.+)\\s*>$/i);\n  if (!match) return { isVector: false };\n  const size = Number.parseInt(match[1], 10);\n  const elementType = match[2].trim();\n  return { isVector: true, size, elementType };\n}\n\n/**\n * Detects unsigned integer types: Uint<0..MAX>\n */\nexport function isUintType(type: string): boolean {\n  return /^Uint<\\s*0\\s*\\.\\.\\s*\\d+\\s*>$/i.test(type);\n}\n\n// --- Internal helpers ------------------------------------------------------ //\nfunction splitTopLevelParams(input: string): string[] {\n  const parts: string[] = [];\n  let depth = 0;\n  let current = '';\n  for (let i = 0; i < input.length; i++) {\n    const ch = input[i];\n    if (ch === '<') {\n      depth++;\n      current += ch;\n      continue;\n    }\n    if (ch === '>') {\n      depth--;\n      current += ch;\n      continue;\n    }\n    if (ch === ',' && depth === 0) {\n      parts.push(current.trim());\n      current = '';\n      continue;\n    }\n    current += ch;\n  }\n  if (current.trim()) parts.push(current.trim());\n  return parts;\n}\n","import type { FieldType } from '@openzeppelin/ui-builder-types';\n\nimport {\n  isArrayType,\n  isBytesType,\n  isMapType,\n  isMaybeType,\n  isUintType,\n  isVectorType,\n} from '../utils/type-helpers';\n\n/**\n * Midnight Type Mapper\n *\n * Maps Midnight-specific types to UI Builder field types for form generation.\n *\n * IMPORTANT NOTES ON COMPACT LANGUAGE LIMITATIONS:\n *\n * While this adapter supports Map<K,V> and Struct types for parsing/formatting,\n * the Compact language has significant limitations that prevent their practical use:\n *\n * 1. Map<K,V>: Cannot be returned from export circuits due to lack of indexed iteration\n *    - Workaround: Use Vector<N, [K, V]> (array of tuples) instead\n *\n * 2. Struct: Construction fails in export circuits with \"invalid context\" error\n *    - Workaround: Use tuples [T1, T2, ...] instead of custom structs\n *\n * 3. Nested Tuples: [[T1,T2],[T3,T4]] rejected by Compact compiler\n *    - Workaround: Flatten to single-level tuples [T1, T2, T3, T4]\n *\n * For full details on Compact limitations, see:\n * - packages/adapter-midnight/TYPE-COVERAGE.md (section: \"Limited Support\")\n */\n\n// --- Helpers --------------------------------------------------------------- //\n\nfunction isPrimitive(type: string): 'bigint' | 'number' | 'boolean' | 'string' | null {\n  const t = type.toLowerCase();\n  if (t === 'bigint') return 'bigint';\n  if (t === 'number') return 'number';\n  if (t === 'boolean') return 'boolean';\n  if (t === 'string') return 'string';\n  return null;\n}\n\nfunction isOpaque(type: string): boolean {\n  return /^Opaque<.+>$/i.test(type) || /^opaque<.+>$/i.test(type);\n}\n\nfunction looksLikeCustomType(type: string): boolean {\n  // Heuristic: non-primitive, non-generic, starts with uppercase → custom type (enum/struct)\n  if (\n    isPrimitive(type) ||\n    isArrayType(type).isArray ||\n    isMaybeType(type).isMaybe ||\n    isMapType(type).isMap\n  ) {\n    return false;\n  }\n  return !!type && type[0] === type[0].toUpperCase();\n}\n\n/**\n * Map a Midnight-specific parameter type to a default form field type.\n * Supports primitives, Uint8Array bytes, Array<T>, Maybe<T>, Map<K,V>, opaque, and custom types.\n */\nexport function mapMidnightParameterTypeToFieldType(parameterType: string): FieldType {\n  // Maybe<T>: use inner type's default field\n  const maybe = isMaybeType(parameterType);\n  if (maybe.isMaybe && maybe.innerType) {\n    return mapMidnightParameterTypeToFieldType(maybe.innerType);\n  }\n\n  // Array<T>: default to array; array-object will be chosen in field generation when element type is object-like\n  const arr = isArrayType(parameterType);\n  if (arr.isArray) {\n    return 'array';\n  }\n\n  // Vector<N, T>\n  const vec = isVectorType(parameterType);\n  if (vec.isVector) {\n    return 'array';\n  }\n\n  // Map<K,V>\n  // NOTE: Map type is supported by the adapter for parsing/formatting, but Compact language\n  // does not support practical Map usage in circuits (cannot iterate with indices, cannot\n  // construct/return Maps from export circuits). Use Vector<N, [K, V]> instead.\n  // See: TYPE-COVERAGE.md \"Limited Support\" section\n  if (isMapType(parameterType).isMap) {\n    return 'map' as FieldType;\n  }\n\n  // Primitives\n  const prim = isPrimitive(parameterType);\n  if (prim === 'bigint') return 'bigint';\n  if (prim === 'number') return 'number';\n  if (prim === 'boolean') return 'checkbox';\n  if (prim === 'string') return 'text';\n\n  // Bytes\n  if (isBytesType(parameterType)) return 'bytes';\n\n  // Uint<...> → number\n  if (isUintType(parameterType)) return 'number';\n\n  // Opaque<T>\n  if (isOpaque(parameterType)) return 'text';\n\n  // Custom types (enum/struct). Default to object in generation step; here prefer text to be conservative.\n  if (looksLikeCustomType(parameterType)) {\n    return 'text';\n  }\n\n  // Fallback\n  return 'text';\n}\n\n/**\n * Get field types compatible with a specific parameter type.\n * Returns a prioritized list (first is the recommended default) and viable alternatives.\n */\nexport function getMidnightCompatibleFieldTypes(parameterType: string): FieldType[] {\n  // Maybe<T> → same as inner\n  const maybe = isMaybeType(parameterType);\n  if (maybe.isMaybe && maybe.innerType) {\n    return getMidnightCompatibleFieldTypes(maybe.innerType);\n  }\n\n  // Array<T>\n  const arr = isArrayType(parameterType);\n  if (arr.isArray) {\n    // Allow both array and array-object as UI choices, plus fallbacks\n    return ['array', 'array-object', 'textarea', 'text'];\n  }\n\n  // Map<K,V>\n  // NOTE: Map type is supported by the adapter, but Compact language limitations prevent\n  // practical Map usage in circuits. See Map<K,V> comment in mapMidnightParameterTypeToFieldType.\n  if (isMapType(parameterType).isMap) {\n    return ['map', 'textarea', 'text'];\n  }\n\n  // Primitives\n  const prim = isPrimitive(parameterType);\n  if (prim === 'bigint') return ['bigint', 'number', 'amount', 'text'];\n  if (prim === 'number') return ['number', 'amount', 'text'];\n  if (prim === 'boolean') return ['checkbox', 'select', 'radio', 'text'];\n  if (prim === 'string') return ['text', 'textarea', 'email', 'password'];\n\n  // Bytes\n  if (isBytesType(parameterType)) return ['bytes', 'textarea', 'text'];\n\n  // Opaque<T>\n  if (isOpaque(parameterType)) return ['text', 'textarea'];\n\n  // Custom types (enum/struct) → allow enum/object fallbacks plus text-based\n  // NOTE: Struct types are supported by the adapter for parsing, but Compact language does not\n  // support struct construction in export circuits (fails with \"invalid context for reference to\n  // struct name\"). Use tuples [T1, T2] instead. Enums work fine.\n  // See: TYPE-COVERAGE.md \"Limited Support\" section\n  if (looksLikeCustomType(parameterType)) {\n    return ['enum', 'object', 'textarea', 'text'];\n  }\n\n  // Fallback\n  return ['text'];\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { stripZipForFunction } from './zip-slimmer';\n\nconst SYSTEM_LOG_TAG = 'ArtifactPreparation';\n\n/**\n * Prepares artifacts for a specific function by trimming the ZIP to only include\n * necessary circuit keys and returning persistable data for storage.\n *\n * @param functionId - The function ID to prepare artifacts for\n * @param currentArtifacts - The current artifacts from the builder state\n * @returns Prepared artifacts with trimmed ZIP, public assets, and bootstrap source\n */\nexport async function prepareArtifactsForFunction(\n  functionId: string,\n  currentArtifacts: Record<string, unknown>\n): Promise<{\n  persistableArtifacts?: Record<string, unknown>;\n  publicAssets?: Record<string, Uint8Array | Blob>;\n  bootstrapSource?: Record<string, unknown>;\n}> {\n  // Prefer original file/blob if available, else base64\n  const zipSource: Blob | string | undefined =\n    (currentArtifacts.originalZipBlob as Blob) ??\n    (currentArtifacts.originalZipData as string) ??\n    undefined;\n\n  if (!zipSource) {\n    // Fallback: if we have no zip, persist existing small artifacts as-is\n    logger.info(SYSTEM_LOG_TAG, 'No ZIP source available, persisting existing artifacts');\n    return {\n      persistableArtifacts: {\n        privateStateId: currentArtifacts.privateStateId,\n        contractModule: currentArtifacts.contractModule,\n        contractDefinition: currentArtifacts.contractDefinition,\n        witnessCode: currentArtifacts.witnessCode,\n        identitySecretKeyPropertyName: currentArtifacts.identitySecretKeyPropertyName,\n      },\n    };\n  }\n\n  try {\n    logger.info(SYSTEM_LOG_TAG, `Trimming ZIP for function: ${functionId}`);\n    const slim = await stripZipForFunction(zipSource, functionId);\n    const assetPath = 'public/midnight/contract.zip';\n\n    return {\n      // Store only small fields; omit originalZipData\n      persistableArtifacts: {\n        privateStateId: currentArtifacts.privateStateId,\n        contractModule: currentArtifacts.contractModule,\n        contractDefinition: currentArtifacts.contractDefinition,\n        witnessCode: currentArtifacts.witnessCode,\n        identitySecretKeyPropertyName: currentArtifacts.identitySecretKeyPropertyName,\n        // Store the trimmed ZIP as base64 for later export\n        // Note: Buffer is available via the polyfill in browser-init.ts (loaded when adapter is imported)\n        trimmedZipBase64: Buffer.from(slim).toString('base64'),\n      },\n      publicAssets: {\n        [assetPath]: slim,\n      },\n      bootstrapSource: {\n        contractAddress: currentArtifacts.contractAddress,\n        privateStateId: currentArtifacts.privateStateId,\n        identitySecretKeyPropertyName: currentArtifacts.identitySecretKeyPropertyName,\n        contractArtifactsUrl: '/midnight/contract.zip',\n      },\n    };\n  } catch (error) {\n    logger.error(SYSTEM_LOG_TAG, 'Failed to trim ZIP for function; falling back:', error);\n    return {\n      persistableArtifacts: {\n        privateStateId: currentArtifacts.privateStateId,\n        contractModule: currentArtifacts.contractModule,\n        contractDefinition: currentArtifacts.contractDefinition,\n        witnessCode: currentArtifacts.witnessCode,\n        identitySecretKeyPropertyName: currentArtifacts.identitySecretKeyPropertyName,\n      },\n    };\n  }\n}\n","import { LogOut } from 'lucide-react';\nimport React from 'react';\n\nimport type { BaseComponentProps } from '@openzeppelin/ui-builder-types';\nimport { Button } from '@openzeppelin/ui-builder-ui';\nimport { cn, truncateMiddle } from '@openzeppelin/ui-builder-utils';\n\nimport { useAccount, useDisconnect } from '../../hooks/facade-hooks';\nimport { SafeMidnightComponent } from '../../utils/SafeMidnightComponent';\n\n/**\n * A component that displays the connected account address and network.\n * Also includes a disconnect button.\n */\nexport const CustomAccountDisplay: React.FC<BaseComponentProps> = ({ className }) => {\n  // Use the SafeMidnightComponent with null fallback\n  return (\n    <SafeMidnightComponent fallback={null}>\n      <AccountDisplayContent className={className} />\n    </SafeMidnightComponent>\n  );\n};\n\n/**\n * The inner component that contains the actual UI and uses the hooks.\n */\nconst AccountDisplayContent: React.FC<{ className?: string }> = ({ className }) => {\n  const { address, isConnected } = useAccount();\n  const { disconnect } = useDisconnect();\n\n  if (!isConnected || !address || !disconnect) {\n    return null;\n  }\n\n  return (\n    <div className={cn('flex items-center gap-2', className)}>\n      <div className=\"flex flex-col\">\n        <span className=\"text-xs font-medium\">{truncateMiddle(address, 4, 4)}</span>\n        <span className=\"text-[9px] text-muted-foreground -mt-0.5\">Midnight Network</span>\n      </div>\n      <Button\n        onClick={() => disconnect()}\n        variant=\"ghost\"\n        size=\"icon\"\n        className=\"size-6 p-0\"\n        title=\"Disconnect wallet\"\n      >\n        <LogOut className=\"size-3.5\" />\n      </Button>\n    </div>\n  );\n};\n","import { useContext } from 'react';\n\nimport { MidnightWalletContext, MidnightWalletContextType } from '../context/MidnightWalletContext';\n\n/**\n * Custom hook to access the Midnight wallet context.\n *\n * @returns The wallet context, including state and actions.\n * @throws If used outside of a `MidnightWalletUiRoot`.\n */\nexport const useMidnightWallet = (): MidnightWalletContextType => {\n  const context = useContext(MidnightWalletContext);\n  if (context === undefined) {\n    throw new Error(\n      'useMidnightWallet must be used within a MidnightWalletUiRoot.\\n' +\n        'MidnightWalletUiRoot is the context provider for the Midnight wallet. ' +\n        'Wrap your component tree with <MidnightWalletUiRoot> (import from \"packages/adapter-midnight/src/wallet/components/MidnightWalletUiRoot\") ' +\n        'to provide access to the wallet context.'\n    );\n  }\n  return context;\n};\n","import type { DAppConnectorWalletAPI } from '@midnight-ntwrk/dapp-connector-api';\nimport { createContext } from 'react';\n\n/**\n * Defines the shape of the state and actions for the Midnight wallet context.\n */\nexport interface MidnightWalletContextType {\n  isConnected: boolean;\n  isConnecting: boolean;\n  address?: string;\n  api: DAppConnectorWalletAPI | null;\n  error: Error | null;\n  connect: () => void;\n  disconnect: () => Promise<void>;\n}\n\n/**\n * React Context for the Midnight wallet.\n *\n * It's initialized with `undefined` and will be provided a value by `MidnightWalletUiRoot`.\n * A custom hook (`useMidnightWallet`) will ensure the context is accessed correctly\n * within the provider's component tree.\n */\nexport const MidnightWalletContext = createContext<MidnightWalletContextType | undefined>(\n  undefined\n);\n","import { useMidnightWallet } from './useMidnightWallet';\n\n/**\n * Facade hook to expose connection status and the connect action.\n * Adheres to the `DerivedConnectStatus` interface expected by the builder app.\n */\nexport const useConnect = () => {\n  const { connect, isConnecting, error } = useMidnightWallet();\n  // The adapter currently only supports Lace, so we return a static connector list.\n  const connectors = [{ id: 'mnLace', name: 'Lace (Midnight)' }];\n\n  return {\n    connect: connect,\n    connectors,\n    isConnecting,\n    error,\n    pendingConnector: undefined, // This adapter doesn't have a concept of a pending connector.\n  };\n};\n\n/**\n * Facade hook to expose disconnection status and the disconnect action.\n * Adheres to the `DerivedDisconnectStatus` interface expected by the builder app.\n */\nexport const useDisconnect = () => {\n  const { disconnect } = useMidnightWallet();\n  return {\n    disconnect,\n    isDisconnecting: false, // This adapter doesn't track disconnecting state.\n    error: null,\n  };\n};\n\n/**\n * Facade hook to expose the current account state.\n * Adheres to the `Account` interface expected by the builder app.\n */\nexport const useAccount = () => {\n  const { address, isConnected, isConnecting } = useMidnightWallet();\n\n  return {\n    address,\n    isConnected,\n    isConnecting,\n    isDisconnected: !isConnected && !isConnecting,\n    isReconnecting: false, // This adapter doesn't have a concept of reconnecting.\n    status: isConnected ? 'connected' : isConnecting ? 'connecting' : 'disconnected',\n  };\n};\n\n/**\n * An object containing all the facade hooks for the Midnight adapter.\n * This is the primary export that will be consumed by the builder application.\n */\nexport const midnightFacadeHooks = {\n  useAccount,\n  useConnect,\n  useDisconnect,\n  // Other hooks like useBalance, useSwitchChain, etc., can be added here\n  // in the future. For now, we only need the core connection hooks.\n};\n","import React, { useContext } from 'react';\n\nimport { MidnightWalletContext } from '../context/MidnightWalletContext';\n\n/**\n * A wrapper component that safely renders children that use Midnight hooks.\n * It checks if the MidnightWalletContext is available and renders a fallback\n * if it's not, preventing crashes when switching adapters.\n */\nexport const SafeMidnightComponent = ({\n  children,\n  fallback = null,\n}: {\n  children: React.ReactNode;\n  fallback?: React.ReactNode;\n}) => {\n  const context = useContext(MidnightWalletContext);\n\n  // If the context is not available, it means the MidnightWalletUiRoot\n  // (the component responsible for providing MidnightWalletContext to its descendants)\n  // is not in the tree. Render the fallback to prevent a crash.\n  if (!context) {\n    return <>{fallback}</>;\n  }\n\n  // If the context is available, render the actual component.\n  return <>{children}</>;\n};\n","import { Loader2, Wallet } from 'lucide-react';\nimport React from 'react';\n\nimport type { BaseComponentProps } from '@openzeppelin/ui-builder-types';\nimport { Button } from '@openzeppelin/ui-builder-ui';\nimport { cn } from '@openzeppelin/ui-builder-utils';\n\nimport { useAccount, useConnect } from '../../hooks/facade-hooks';\nimport { SafeMidnightComponent } from '../../utils/SafeMidnightComponent';\n\n/**\n * A button that allows users to connect their wallet.\n * @param hideWhenConnected - Whether to hide the button when wallet is connected (default: true)\n */\nexport interface ConnectButtonProps extends BaseComponentProps {\n  hideWhenConnected?: boolean;\n}\n\nexport const ConnectButton: React.FC<ConnectButtonProps> = ({\n  className,\n  hideWhenConnected = true,\n}) => {\n  const unavailableButton = (\n    <div className={cn('flex items-center', className)}>\n      <Button disabled={true} variant=\"outline\" size=\"sm\" className=\"h-8 px-2 text-xs\">\n        <Wallet className=\"size-3.5 mr-1\" />\n        Wallet Unavailable\n      </Button>\n    </div>\n  );\n\n  return (\n    <SafeMidnightComponent fallback={unavailableButton}>\n      <ConnectButtonContent className={className} hideWhenConnected={hideWhenConnected} />\n    </SafeMidnightComponent>\n  );\n};\n\n/**\n * The inner component that contains the actual UI and uses the hooks.\n */\nconst ConnectButtonContent: React.FC<{\n  className?: string;\n  hideWhenConnected: boolean;\n}> = ({ className, hideWhenConnected }) => {\n  const { isConnected } = useAccount();\n  const { connect, isConnecting, connectors, error: connectError } = useConnect();\n\n  const handleConnectClick = () => {\n    if (connect && !isConnected) {\n      connect();\n    }\n  };\n\n  if (isConnected && hideWhenConnected) {\n    return null;\n  }\n\n  const showButtonLoading = isConnecting;\n  const hasWallet = connectors.length > 0;\n\n  // Determine button text based on connection state\n  let buttonText = 'Connect Wallet';\n  if (!hasWallet) {\n    buttonText = 'No Wallet Found';\n  } else if (showButtonLoading) {\n    buttonText = 'Connecting...';\n  } else if (connectError) {\n    buttonText = 'Connect Wallet'; // Or 'Try Again'\n  }\n\n  return (\n    <div className={cn('flex flex-col items-start gap-1', className)}>\n      <div className=\"flex items-center\">\n        <Button\n          onClick={handleConnectClick}\n          disabled={showButtonLoading || isConnected || !hasWallet}\n          variant=\"outline\"\n          size=\"sm\"\n          className=\"h-8 px-2 text-xs\"\n        >\n          {showButtonLoading ? (\n            <Loader2 className=\"size-3.5 animate-spin mr-1\" />\n          ) : (\n            <Wallet className=\"size-3.5 mr-1\" />\n          )}\n          {buttonText}\n        </Button>\n      </div>\n\n      {connectError && !isConnecting && (\n        <p className=\"text-xs text-red-500 px-2\">\n          {connectError.message || 'Error connecting wallet'}\n        </p>\n      )}\n    </div>\n  );\n};\n","import { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { EcosystemReactUiProviderProps } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { onMidnightWalletConnectionChange } from '../connection';\nimport { MidnightWalletContext } from '../context/MidnightWalletContext';\nimport type { ExtendedDAppConnectorWalletAPI } from '../types';\nimport { getMidnightWalletImplementation } from '../utils';\n\nconst WALLET_CONNECTION_TIMEOUT_MS = 60000;\n\ninterface MidnightWalletUiRootProps extends EcosystemReactUiProviderProps {\n  children: ReactNode;\n}\n\n/**\n * MidnightWalletUiRoot\n *\n * Root provider for Midnight wallet UI state and connection management.\n *\n * DESIGN DECISIONS & LIMITATIONS:\n *\n * 1. **Focus/Blur Dismissal Detection**\n *    - Lace wallet popup does not expose a native \"onDismiss\" event.\n *    - We detect dismissal by monitoring window focus events:\n *      - When unlock flow starts, we mark awaitingAuth=true.\n *      - When window regains focus while still connecting and no address, we treat it as dismissal.\n *      - This clears \"Connecting…\" state and unsubscribes from polling to stop re-prompting.\n *    - LIMITATION: If user switches tabs instead of closing popup, dismissal won't be detected until focus returns.\n *\n * 2. **Fallback Timeout (60s)**\n *    - A defensive 60s timeout clears \"Connecting…\" state to avoid infinite loading.\n *    - This handles edge cases where:\n *      - Wallet never responds or gets stuck.\n *      - Popup is closed in a way we can't detect (rare browser scenarios).\n *      - User leaves popup open for a very long time.\n *    - This timeout is intentionally long to avoid prematurely canceling legitimate unlock flows.\n *\n * 3. **Event-Driven Connection Status**\n *    - We subscribe to onMidnightWalletConnectionChange (which internally polls api.state()).\n *    - When address becomes available, we update state and clear loading.\n *    - When user dismisses, we unsubscribe → polling stops → no more prompts.\n *\n * 4. **Auto-Reconnect on Mount**\n *    - If wallet is already enabled (isEnabled() === true) and user hasn't explicitly disconnected,\n *      we attempt auto-reconnect on page load.\n *    - This provides seamless UX for returning users with an unlocked wallet.\n *    - If wallet is locked, the unlock popup will appear once.\n *\n * 5. **No Immediate State Reads After enable()**\n *    - Calling api.state() immediately after enable() can re-prompt the user if wallet is locked.\n *    - We rely on the polling loop (started by listener subscription) to emit the address once ready.\n *\n * FUTURE IMPROVEMENTS:\n * - If Lace adds native onDismiss or onUnlock events, replace focus/blur heuristics.\n * - Configurable fallback timeout for different use cases (e.g., shorter for impatient UX).\n */\nexport function MidnightWalletUiRoot({ children }: MidnightWalletUiRootProps) {\n  const [api, setApi] = useState<ExtendedDAppConnectorWalletAPI | null>(null);\n  const [address, setAddress] = useState<string | undefined>(undefined);\n  const [error, setError] = useState<Error | null>(null);\n  const [isConnecting, setIsConnecting] = useState(false);\n  const [isInitializing, setIsInitializing] = useState(true);\n  const fallbackTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n  const awaitingAuthRef = useRef(false);\n  const activeUnsubscribeRef = useRef<(() => void) | null>(null);\n\n  const isConnected = !!address && !!api;\n\n  // DESIGN DECISION: Auto-reconnect on mount if the wallet is already enabled\n  // - Provides seamless UX for returning users with unlocked wallet\n  // - Respects explicit user disconnection (stored in localStorage)\n  // - If wallet is locked, unlock popup will appear once\n  useEffect(() => {\n    const attempt = async () => {\n      if (localStorage.getItem('midnight-hasExplicitlyDisconnected') === 'true') {\n        setIsInitializing(false);\n        return;\n      }\n      try {\n        const impl = await getMidnightWalletImplementation();\n        if (await impl.isEnabled()) {\n          setIsConnecting(true);\n          if (!impl.getApi()) {\n            await impl.connect();\n          }\n          // Subscribe to be notified when address becomes available after unlock\n          const unsubscribe = onMidnightWalletConnectionChange((curr) => {\n            if (!curr.address) return;\n            const activeApi = impl.getApi();\n            if (activeApi) setApi(activeApi as ExtendedDAppConnectorWalletAPI);\n            setAddress(curr.address);\n            setIsConnecting(false);\n            unsubscribe();\n            activeUnsubscribeRef.current = null;\n            awaitingAuthRef.current = false;\n          });\n          activeUnsubscribeRef.current = unsubscribe;\n          awaitingAuthRef.current = true;\n\n          // DESIGN DECISION: 60s fallback timeout\n          // - Prevents infinite \"Connecting…\" if wallet never responds or gets stuck\n          // - Long enough to avoid canceling legitimate unlock flows (user reading wallet prompts)\n          // - Cleared on success or dismissal detection\n          if (fallbackTimeoutRef.current) clearTimeout(fallbackTimeoutRef.current);\n          fallbackTimeoutRef.current = setTimeout(() => {\n            setIsConnecting(false);\n            if (activeUnsubscribeRef.current) {\n              activeUnsubscribeRef.current();\n              activeUnsubscribeRef.current = null;\n            }\n            awaitingAuthRef.current = false;\n          }, WALLET_CONNECTION_TIMEOUT_MS);\n        }\n      } catch (err) {\n        logger.warn('MidnightWalletUiRoot', 'Auto-reconnect failed:', err);\n      } finally {\n        setIsInitializing(false);\n      }\n    };\n    attempt();\n  }, []);\n\n  const connect = useCallback(async () => {\n    if (isConnecting || isInitializing) return;\n    localStorage.removeItem('midnight-hasExplicitlyDisconnected');\n    setIsConnecting(true);\n    setError(null);\n    try {\n      const impl = await getMidnightWalletImplementation();\n      // DESIGN DECISION: Avoid re-calling enable() if we already hold an API\n      // - LaceWalletImplementation.connect() internally checks this\n      // - Prevents re-triggering wallet popup on rapid button clicks\n      if (!impl.getApi()) {\n        await impl.connect();\n      }\n      const activeApi = impl.getApi();\n      if (!activeApi) throw new Error('Failed to connect');\n\n      // Subscribe to connection changes; polling will emit address when ready\n      const unsubscribe = impl.onWalletConnectionChange((curr) => {\n        if (!curr.address) return;\n        setApi(activeApi as ExtendedDAppConnectorWalletAPI);\n        setAddress(curr.address);\n        setIsConnecting(false);\n        awaitingAuthRef.current = false;\n        activeUnsubscribeRef.current = null;\n      });\n      activeUnsubscribeRef.current = unsubscribe;\n      awaitingAuthRef.current = true;\n\n      // DESIGN DECISION: 60s fallback timeout (same as auto-reconnect)\n      if (fallbackTimeoutRef.current) clearTimeout(fallbackTimeoutRef.current);\n      fallbackTimeoutRef.current = setTimeout(() => {\n        setIsConnecting(false);\n        if (activeUnsubscribeRef.current) {\n          activeUnsubscribeRef.current();\n          activeUnsubscribeRef.current = null;\n        }\n        awaitingAuthRef.current = false;\n      }, WALLET_CONNECTION_TIMEOUT_MS);\n\n      // DESIGN DECISION: No immediate state read\n      // - Calling api.state() here could re-prompt if wallet is locked\n      // - Polling loop (started by subscription) will emit address when wallet is ready\n    } catch (e) {\n      setError(e instanceof Error ? e : new Error('Failed to initiate connection.'));\n      setIsConnecting(false);\n    }\n  }, [isConnecting, isInitializing]);\n\n  const disconnect = useCallback(async () => {\n    try {\n      const impl = await getMidnightWalletImplementation();\n      impl.disconnect();\n      setApi(null);\n      setAddress(undefined);\n      setError(null);\n      localStorage.setItem('midnight-hasExplicitlyDisconnected', 'true');\n    } catch (err) {\n      logger.warn('MidnightWalletUiRoot', 'Disconnect error:', err);\n    }\n  }, []);\n\n  // Keep address synced if wallet changes accounts after connection\n  useEffect(() => {\n    let unsubscribe: (() => void) | undefined;\n    const sub = async () => {\n      if (!api) return;\n      unsubscribe = onMidnightWalletConnectionChange((curr) => {\n        setAddress(curr.address || undefined);\n      });\n    };\n    sub();\n    return () => {\n      if (unsubscribe) unsubscribe();\n      if (fallbackTimeoutRef.current) clearTimeout(fallbackTimeoutRef.current);\n    };\n  }, [api]);\n\n  // DESIGN DECISION: Focus-based dismissal detection\n  // - Lace wallet does not expose native onDismiss/onReject events\n  // - We infer dismissal by monitoring window focus:\n  //   1. Popup opens → window typically loses focus\n  //   2. User closes popup → window regains focus\n  //   3. If we're still connecting and no address, treat as dismissal\n  // - On dismissal: clear loading state, unsubscribe (stops polling), clear timeout\n  // - LIMITATION: If user switches tabs instead of closing popup, we won't detect dismissal\n  //   until they return to the tab. This is acceptable as it doesn't cause re-prompting.\n  useEffect(() => {\n    if (!isConnecting) return;\n    const onFocus = () => {\n      if (awaitingAuthRef.current && !address) {\n        // User likely dismissed the popup → cancel connection attempt\n        setIsConnecting(false);\n        if (activeUnsubscribeRef.current) {\n          activeUnsubscribeRef.current(); // Stops polling\n          activeUnsubscribeRef.current = null;\n        }\n        if (fallbackTimeoutRef.current) {\n          clearTimeout(fallbackTimeoutRef.current);\n          fallbackTimeoutRef.current = null;\n        }\n        awaitingAuthRef.current = false;\n      }\n    };\n    window.addEventListener('focus', onFocus);\n    return () => {\n      window.removeEventListener('focus', onFocus);\n    };\n  }, [isConnecting, address]);\n\n  const contextValue = useMemo(\n    () => ({\n      isConnected,\n      isConnecting: isConnecting || isInitializing,\n      isConnectPending: isConnecting || isInitializing,\n      address,\n      api,\n      error,\n      connect,\n      disconnect,\n    }),\n    [isConnected, isConnecting, isInitializing, address, api, error, connect, disconnect]\n  );\n\n  return (\n    <MidnightWalletContext.Provider value={contextValue}>{children}</MidnightWalletContext.Provider>\n  );\n}\n","/**\n * Midnight Wallet Connection Facade\n *\n * High-level API for Midnight wallet connection and status management.\n *\n * ARCHITECTURE:\n * - This module provides a facade over the LaceWalletImplementation.\n * - UI components call these functions; they delegate to the singleton wallet implementation.\n * - Event-driven architecture: callers subscribe to onMidnightWalletConnectionChange.\n *\n * DESIGN DECISIONS:\n * 1. **Event Emulation**\n *    - Lace DAppConnectorWalletAPI lacks native onAccountChange events.\n *    - LaceWalletImplementation emulates events by polling api.state().\n *    - Consumers use onMidnightWalletConnectionChange as if native events existed.\n *\n * 2. **Singleton Implementation**\n *    - getMidnightWalletImplementation() returns a single shared instance.\n *    - Ensures consistent state across all UI components.\n *\n * 3. **Lazy Initialization**\n *    - getInitializedMidnightWalletImplementation() returns undefined if not yet ready.\n *    - Used for non-blocking status checks.\n *\n * MIRRORS STELLAR ADAPTER:\n * - This architecture directly mirrors adapter-stellar/src/wallet/connection.ts.\n * - Provides consistent UX and API surface across ecosystem adapters.\n */\n\nimport type { Connector } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { LaceWalletImplementation } from './implementation/lace-implementation';\n\nimport type { MidnightWalletConnectionStatus } from './types';\nimport {\n  getInitializedMidnightWalletImplementation,\n  getMidnightWalletImplementation,\n} from './utils';\n\n/**\n * Indicates if this adapter supports wallet connection\n */\nexport const supportsMidnightWalletConnection = (): boolean => {\n  return typeof window !== 'undefined' && !!window.midnight?.mnLace;\n};\n\n/**\n * Get available Midnight wallet connectors\n */\nexport const getMidnightAvailableConnectors = async (): Promise<Connector[]> => {\n  if (!supportsMidnightWalletConnection()) {\n    return [];\n  }\n  return [{ id: 'mnLace', name: 'Lace (Midnight)' }];\n};\n\n/**\n * Disconnect from the Midnight wallet\n */\nexport async function disconnectMidnightWallet(): Promise<{\n  disconnected: boolean;\n}> {\n  try {\n    const impl = await getMidnightWalletImplementation();\n    impl.disconnect();\n    return { disconnected: true };\n  } catch (error) {\n    logger.warn('disconnectMidnightWallet', 'Unexpected error during disconnect', error);\n    return { disconnected: false };\n  }\n}\n\n/**\n * Subscribe to Midnight wallet connection (account) changes\n * @returns unsubscribe function\n */\nexport function getMidnightWalletConnectionStatus(): MidnightWalletConnectionStatus {\n  const impl = getInitializedMidnightWalletImplementation();\n  if (!impl) {\n    return { isConnected: false, status: 'disconnected' } as MidnightWalletConnectionStatus;\n  }\n  return impl.getWalletConnectionStatus();\n}\n\nexport function onMidnightWalletConnectionChange(\n  callback: (current: MidnightWalletConnectionStatus, prev: MidnightWalletConnectionStatus) => void\n): () => void {\n  const initialized = getInitializedMidnightWalletImplementation();\n  const impl = initialized || new LaceWalletImplementation();\n  return impl.onWalletConnectionChange(callback);\n}\n","import type { DAppConnectorWalletAPI } from '@midnight-ntwrk/dapp-connector-api';\n\nimport type { MidnightWalletConnectionStatus } from '../types';\n\nconst INITIAL_POLL_DELAY_MS = 2000;\nconst CONNECTED_POLL_DELAY_MS = 5000;\nconst MAX_POLL_DELAY_MS = 15000;\n\n/**\n * LaceWalletImplementation\n *\n * Core wallet adapter for the Lace Midnight wallet extension.\n *\n * DESIGN DECISIONS & LIMITATIONS:\n *\n * 1. **Event Emulation via Polling**\n *    - The Lace Midnight DAppConnectorWalletAPI does not expose native `onAccountChange` events.\n *    - We emulate an event-driven API by polling `api.state()` to detect account changes.\n *    - Polling starts only when listeners subscribe, and stops when all listeners unsubscribe.\n *\n * 2. **Exponential Backoff & Visibility-Aware Polling**\n *    - Initial poll: 2s after enabling.\n *    - When disconnected or erroring: backoff doubles up to 15s to reduce aggressive prompts.\n *    - When connected: poll every 5s to detect account switches.\n *    - When document is hidden (tab inactive): pause polling to avoid intrusive popups.\n *\n * 3. **Guard Against Multiple `enable()` Calls**\n *    - `connect()` uses `connectInFlight` flag to prevent re-triggering the wallet popup if called rapidly\n *      (e.g., by React Strict Mode double-effects or user double-clicks).\n *    - Once `enabledApi` is held, we reuse it until explicit disconnect.\n *\n * 4. **No Immediate State Read After `enable()`**\n *    - Calling `api.state()` immediately after `enable()` can re-prompt the user if the wallet is locked.\n *    - We rely on the polling loop to emit the initial address once the wallet is ready.\n *\n * 5. **Zero Listeners → Stop Polling**\n *    - If all listeners are removed (e.g., user dismisses popup and UI unsubscribes), polling stops immediately\n *      to avoid re-opening prompts indefinitely.\n *\n * FUTURE IMPROVEMENTS:\n * - If Lace Midnight adds native event handlers, replace polling with direct event subscriptions.\n * - Consider WebSocket or provider-side events if available in future versions.\n */\nexport class LaceWalletImplementation {\n  private enabledApi: DAppConnectorWalletAPI | null = null;\n  private connectPromise: Promise<{ connected: boolean; address?: string; error?: string }> | null =\n    null;\n  private accountChangeListeners = new Set<\n    (status: MidnightWalletConnectionStatus, prevStatus: MidnightWalletConnectionStatus) => void\n  >();\n  private accountPollTimeout: NodeJS.Timeout | null = null;\n  private nextPollDelayMs = INITIAL_POLL_DELAY_MS;\n  private lastKnownAddress: string | null = null;\n\n  public async isEnabled(): Promise<boolean> {\n    if (typeof window === 'undefined' || !window.midnight?.mnLace) return false;\n    return window.midnight.mnLace.isEnabled();\n  }\n\n  public async connect(): Promise<{ connected: boolean; address?: string; error?: string }> {\n    if (typeof window === 'undefined' || !window.midnight?.mnLace) {\n      return { connected: false, error: 'Lace wallet not found.' };\n    }\n\n    // DESIGN DECISION: Guard against multiple enable() calls\n    // - React Strict Mode can trigger effects twice in development\n    // - User might click \"Connect\" button rapidly\n    // - If a connection is already in progress, wait for it to complete\n    // - This prevents race conditions where a second caller receives false positive status\n    if (this.connectPromise) {\n      return this.connectPromise;\n    }\n\n    // If already connected, return immediately\n    if (this.enabledApi) {\n      return { connected: true, address: this.lastKnownAddress ?? undefined };\n    }\n\n    // Start new connection and store the promise\n    this.connectPromise = (async () => {\n      try {\n        const api = await window.midnight!.mnLace.enable();\n        this.enabledApi = api;\n        this.connectPromise = null;\n        // DESIGN DECISION: Do not start polling here; wait until a listener subscribes\n        // This prevents premature state() calls that could re-trigger popups during wallet unlock\n        return { connected: true, address: this.lastKnownAddress ?? undefined };\n      } catch (err) {\n        const message = err instanceof Error ? err.message : 'Failed to connect';\n        this.connectPromise = null;\n        return { connected: false, error: message };\n      }\n    })();\n\n    return this.connectPromise;\n  }\n\n  public disconnect(): void {\n    this.enabledApi = null;\n    this.connectPromise = null;\n    this.stopAccountPolling();\n    this.lastKnownAddress = null;\n  }\n\n  public getApi(): DAppConnectorWalletAPI | null {\n    return this.enabledApi;\n  }\n\n  public getWalletConnectionStatus(): MidnightWalletConnectionStatus {\n    return {\n      isConnected: this.lastKnownAddress !== null,\n      address: this.lastKnownAddress ?? undefined,\n      status: this.lastKnownAddress ? 'connected' : 'disconnected',\n    };\n  }\n\n  public onWalletConnectionChange(\n    listener: (\n      status: MidnightWalletConnectionStatus,\n      prevStatus: MidnightWalletConnectionStatus\n    ) => void\n  ): () => void {\n    this.accountChangeListeners.add(listener);\n    if (this.lastKnownAddress !== null) {\n      const curr = this.getWalletConnectionStatus();\n      listener(curr, curr);\n    }\n    this.startAccountPolling();\n    return () => {\n      this.accountChangeListeners.delete(listener);\n      if (this.accountChangeListeners.size === 0) this.stopAccountPolling();\n    };\n  }\n\n  public updateConnectionStatus(address: string | null): void {\n    const prev = this.getWalletConnectionStatus();\n    this.lastKnownAddress = address;\n    const curr = this.getWalletConnectionStatus();\n    if (prev.address !== curr.address) this.emit(curr, prev);\n  }\n\n  private startAccountPolling(): void {\n    if (this.accountPollTimeout || !this.enabledApi) return;\n    if (this.accountChangeListeners.size === 0) return;\n    this.nextPollDelayMs = INITIAL_POLL_DELAY_MS;\n    this.schedulePollOnce();\n  }\n\n  private schedulePollOnce(): void {\n    if (this.accountPollTimeout) return;\n    this.accountPollTimeout = setTimeout(async () => {\n      this.accountPollTimeout = null;\n      try {\n        if (!this.enabledApi) return;\n\n        // DESIGN DECISION: Pause polling when document is hidden\n        // - Reduces intrusive popups when user is on a different tab\n        // - Exponential backoff ensures we don't hammer the wallet while tab is inactive\n        // - Reset delay when tab becomes visible to restore responsive polling\n        if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n          this.nextPollDelayMs = Math.min(this.nextPollDelayMs * 2, MAX_POLL_DELAY_MS);\n          this.schedulePollOnce();\n          return;\n        }\n\n        // Reset delay if it was increased due to tab being hidden\n        // This ensures responsive polling when user returns to the tab\n        if (this.nextPollDelayMs > CONNECTED_POLL_DELAY_MS && this.lastKnownAddress !== null) {\n          this.nextPollDelayMs = CONNECTED_POLL_DELAY_MS;\n        }\n\n        // DESIGN DECISION: Stop polling if all listeners unsubscribe\n        // - This happens when user dismisses the unlock popup and UI cancels its subscription\n        // - Prevents indefinite polling that would keep re-prompting the user\n        if (this.accountChangeListeners.size === 0) {\n          this.stopAccountPolling();\n          return;\n        }\n\n        // LIMITATION: Must call api.state() to detect changes\n        // - No native onAccountChange event available in DAppConnectorWalletAPI\n        // - We avoid calling isEnabled() here as it can trigger prompts in some wallet builds\n        const state = await this.enabledApi.state();\n        const nextAddress = state?.address ?? null;\n        if (nextAddress !== this.lastKnownAddress) {\n          const prev = this.getWalletConnectionStatus();\n          this.lastKnownAddress = nextAddress;\n          const curr = this.getWalletConnectionStatus();\n          this.emit(curr, prev);\n        }\n\n        // DESIGN DECISION: Adaptive polling intervals\n        // - Connected: 5s (to detect account switches promptly)\n        // - Disconnected/error: exponential backoff up to 15s (to avoid aggressive prompting)\n        const connected = this.lastKnownAddress !== null;\n        this.nextPollDelayMs = connected\n          ? CONNECTED_POLL_DELAY_MS\n          : Math.min(this.nextPollDelayMs * 2, MAX_POLL_DELAY_MS);\n      } catch {\n        // DESIGN DECISION: Back off on error\n        // - Errors typically occur before user approves or if wallet is locked\n        // - Exponential backoff reduces prompt frequency during these states\n        this.nextPollDelayMs = Math.min(this.nextPollDelayMs * 2, MAX_POLL_DELAY_MS);\n      } finally {\n        this.schedulePollOnce();\n      }\n    }, this.nextPollDelayMs);\n  }\n\n  private stopAccountPolling(): void {\n    if (this.accountPollTimeout) {\n      clearTimeout(this.accountPollTimeout);\n      this.accountPollTimeout = null;\n    }\n    this.nextPollDelayMs = INITIAL_POLL_DELAY_MS;\n  }\n\n  private emit(\n    current: MidnightWalletConnectionStatus,\n    prev: MidnightWalletConnectionStatus\n  ): void {\n    this.accountChangeListeners.forEach((cb) => {\n      try {\n        cb(current, prev);\n      } catch {}\n    });\n  }\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { LaceWalletImplementation } from '../implementation/lace-implementation';\n\nlet initialized = false;\nlet instance: LaceWalletImplementation | undefined;\n\nconst LOG_SYSTEM = 'MidnightWalletImplementationManager';\n\n/**\n * Initialize the Midnight wallet system once. For now our implementation\n * is a thin wrapper around the Lace API with event shims, so there is no\n * heavy async setup. This manager exists to mirror Stellar's structure and\n * allow future expansion without changing public imports.\n */\nexport async function getMidnightWalletImplementation(): Promise<LaceWalletImplementation> {\n  if (!initialized) {\n    logger.info(LOG_SYSTEM, 'Initializing Midnight wallet implementation (lightweight).');\n    instance = new LaceWalletImplementation();\n    initialized = true;\n  }\n  return instance as LaceWalletImplementation;\n}\n\n/**\n * Synchronous getter for cases where initialization was already performed.\n */\nexport function getInitializedMidnightWalletImplementation(): LaceWalletImplementation | undefined {\n  if (!initialized) {\n    logger.warn(LOG_SYSTEM, 'getInitialized called before initialization.');\n    return undefined;\n  }\n  return instance;\n}\n","import type { ContractSchema, MidnightNetworkConfig } from '@openzeppelin/ui-builder-types';\nimport { logger, simpleHash } from '@openzeppelin/ui-builder-utils';\n\nimport type { MidnightContractArtifacts } from '../types/artifacts';\nimport { parseMidnightContractInterface } from '../utils/schema-parser';\n\nexport interface MidnightContractLoadResult {\n  schema: ContractSchema;\n  source: 'fetched' | 'manual';\n  contractDefinitionOriginal?: string;\n  metadata?: {\n    fetchedFrom?: string;\n    contractName?: string;\n    verificationStatus?: 'verified' | 'unverified' | 'unknown';\n    fetchTimestamp?: Date;\n    definitionHash?: string;\n  };\n  contractDefinitionArtifacts?: Record<string, unknown>;\n  proxyInfo?: undefined;\n}\n\nexport async function loadMidnightContract(\n  artifacts: MidnightContractArtifacts,\n  _networkConfig?: MidnightNetworkConfig\n): Promise<MidnightContractLoadResult> {\n  logger.info('loadMidnightContract', 'Loading Midnight contract from artifacts');\n\n  const { functions, events, metadata } = parseMidnightContractInterface(\n    artifacts.contractDefinition\n  );\n\n  const schema: ContractSchema = {\n    name: 'MyMidnightContract',\n    ecosystem: 'midnight',\n    address: artifacts.contractAddress,\n    functions,\n    events,\n    metadata,\n  };\n\n  const definition = artifacts.contractDefinition || '';\n  const loadMetadata = {\n    fetchedFrom: 'local',\n    verificationStatus: 'unknown' as const,\n    fetchTimestamp: new Date(),\n    definitionHash: definition ? simpleHash(definition) : undefined,\n  };\n\n  return {\n    schema,\n    source: 'manual',\n    contractDefinitionOriginal: artifacts.contractDefinition,\n    metadata: loadMetadata,\n  };\n}\n\nexport async function loadMidnightContractWithMetadata(\n  artifacts: MidnightContractArtifacts,\n  networkConfig?: MidnightNetworkConfig\n): Promise<MidnightContractLoadResult> {\n  const base = await loadMidnightContract(artifacts, networkConfig);\n\n  const artifactsRecord: Record<string, unknown> = {};\n  if (artifacts.privateStateId) artifactsRecord.privateStateId = artifacts.privateStateId;\n  if (artifacts.contractModule) artifactsRecord.contractModule = artifacts.contractModule;\n  if (artifacts.witnessCode) artifactsRecord.witnessCode = artifacts.witnessCode;\n  if (artifacts.verifierKeys) artifactsRecord.verifierKeys = artifacts.verifierKeys;\n  if (artifacts.originalZipData) artifactsRecord.originalZipData = artifacts.originalZipData;\n  if (artifacts.trimmedZipBase64) artifactsRecord.trimmedZipBase64 = artifacts.trimmedZipBase64;\n\n  return {\n    ...base,\n    contractDefinitionArtifacts:\n      Object.keys(artifactsRecord).length > 0 ? artifactsRecord : undefined,\n  };\n}\n","import type { TransactionStatusUpdate } from '@openzeppelin/ui-builder-types';\nimport { hexToBytes, logger } from '@openzeppelin/ui-builder-utils';\n\nimport type { WriteContractParameters } from '../types';\nimport { resolveSecretPropertyName } from '../utils/secret-property-helpers';\nimport type { LaceWalletImplementation } from '../wallet/implementation/lace-implementation';\nimport { callCircuit } from './call-circuit';\nimport { evaluateContractModule } from './contract-evaluator';\nimport type { ExecutionStrategy, MidnightExecutionConfig } from './execution-strategy';\nimport { createTransactionProviders } from './providers';\nimport { evaluateWitnessCode } from './witness-evaluator';\n\nconst SYSTEM_LOG_TAG = 'MidnightEoaExecutionStrategy';\n\n/**\n * Creates a runtime-only overlay for the private state provider that injects\n * the identity secret key without persisting it to IndexedDB.\n * This is by design to avoid storing the sensitive key due to security reasons.\n *\n * @param baseProvider - The underlying private state provider (IndexedDB-backed)\n * @param runtimeKeyHex - Optional runtime identity secret key in hex format\n * @param secretPropName - Name of the private state property that holds the secret (e.g., 'organizerSecretKey', 'secretKey')\n * @returns Wrapped provider that injects key in-memory and strips it on writes\n */\nexport function createPrivateStateOverlay(\n  baseProvider: {\n    get: (id: string) => Promise<unknown>;\n    set: (id: string, state: unknown) => Promise<void>;\n  },\n  runtimeKeyHex: string | undefined,\n  secretPropName: string\n): typeof baseProvider {\n  let overlayKeyBytes: Uint8Array | undefined;\n\n  if (runtimeKeyHex) {\n    try {\n      overlayKeyBytes = hexToBytes(runtimeKeyHex);\n    } catch {\n      logger.warn(SYSTEM_LOG_TAG, 'Invalid identity secret provided; ignoring at runtime');\n    }\n  }\n\n  return {\n    async get(id: string): Promise<unknown> {\n      let baseState: Record<string, unknown> | null | undefined;\n      try {\n        baseState = (await baseProvider.get(id)) as Record<string, unknown> | null | undefined;\n      } catch {\n        // Treat storage miss (e.g., IndexedDB \"Entry not found\") as no state present\n        baseState = null;\n      }\n\n      // Remove any persisted secret key to enforce runtime-only behavior\n      let sanitized: unknown = null;\n      if (baseState && typeof baseState === 'object') {\n        const rest = { ...(baseState as Record<string, unknown>) };\n        delete rest[secretPropName];\n        sanitized = Object.keys(rest).length > 0 ? rest : null;\n      }\n\n      if (overlayKeyBytes) {\n        // Return ephemeral state with secret injected; not persisted\n        const baseObj =\n          sanitized && typeof sanitized === 'object' ? (sanitized as Record<string, unknown>) : {};\n        return { ...baseObj, [secretPropName]: overlayKeyBytes };\n      }\n\n      // Without runtime key, return empty object if no state exists (some circuits need at least {} instead of null)\n      // Circuits that don't need state will handle empty object fine\n      return sanitized || {};\n    },\n\n    async set(id: string, state: unknown): Promise<void> {\n      // Strip secret before persisting updates\n      if (state && typeof state === 'object') {\n        const rest = { ...(state as Record<string, unknown>) };\n        delete rest[secretPropName];\n        return baseProvider.set(id, rest);\n      }\n      return baseProvider.set(id, state);\n    },\n  };\n}\n\n/**\n * Implements full EOA transaction execution for Midnight\n */\nexport class EoaExecutionStrategy implements ExecutionStrategy {\n  public async execute(\n    transactionData: WriteContractParameters,\n    executionConfig: MidnightExecutionConfig,\n    walletImplementation: LaceWalletImplementation,\n    onStatusChange: (status: string, details: TransactionStatusUpdate) => void,\n    _runtimeApiKey?: string,\n    runtimeSecret?: string\n  ): Promise<{ txHash: string; result?: unknown }> {\n    logger.info(SYSTEM_LOG_TAG, 'Executing EOA transaction', {\n      contractAddress: transactionData.contractAddress,\n      functionName: transactionData.functionName,\n    });\n\n    try {\n      // Step 0: Validate wallet connectivity\n      const api = walletImplementation.getApi();\n      if (!api) {\n        throw new Error('Wallet not connected. Please connect a wallet first.');\n      }\n\n      const walletState = await api.state();\n      if (!walletState || !walletState.address) {\n        throw new Error('Unable to retrieve wallet state. Wallet may be locked or disconnected.');\n      }\n\n      logger.info(SYSTEM_LOG_TAG, `Connected wallet address: ${walletState.address}`);\n\n      // Step 1: Set network ID (required for SDK operations)\n      // Pattern: query handler lines 161-180\n      const networkConfig = executionConfig.networkConfig;\n      if (!networkConfig || networkConfig.ecosystem !== 'midnight') {\n        throw new Error('Invalid network configuration');\n      }\n\n      // Dynamic import to avoid loading at module initialization\n      const { NetworkId, setNetworkId } = await import('@midnight-ntwrk/midnight-js-network-id');\n\n      const networkIdEntry = Object.entries(networkConfig.networkId || {})[0];\n      if (!networkIdEntry) {\n        throw new Error('Network ID not configured');\n      }\n      const [, networkName] = networkIdEntry;\n      const networkIdEnum = (NetworkId as Record<string, unknown>)[networkName as string];\n      if (!networkIdEnum) {\n        throw new Error(`Invalid network ID: ${networkName}`);\n      }\n      setNetworkId(networkIdEnum as never);\n\n      // Set global override for patched providers\n      const globalMidnight = globalThis as {\n        __OPENZEPPELIN_MIDNIGHT__?: {\n          networkId?: unknown;\n          compactRuntime?: unknown;\n        };\n      };\n      if (!globalMidnight.__OPENZEPPELIN_MIDNIGHT__) {\n        globalMidnight.__OPENZEPPELIN_MIDNIGHT__ = {};\n      }\n      globalMidnight.__OPENZEPPELIN_MIDNIGHT__.networkId = networkIdEnum;\n\n      logger.debug(SYSTEM_LOG_TAG, `Set network ID to: ${networkName}`);\n\n      // Step 2: Initialize providers\n      onStatusChange('preparing', {});\n      const providers = await createTransactionProviders(walletImplementation, networkConfig);\n\n      // Step 3: Load witness functions from artifacts\n      const artifacts = executionConfig.artifacts;\n      if (!artifacts || !artifacts.contractModule) {\n        throw new Error(\n          'Contract artifacts are missing the required \"contractModule\" field. ' +\n            'Please ensure your contract artifacts include the compiled contract code (contract.cjs content) ' +\n            'in the \"contractModule\" field when loading the contract.'\n        );\n      }\n\n      // Preflight validate critical identifiers before calling SDK (avoids opaque WASM errors)\n      const contractAddress =\n        typeof transactionData.contractAddress === 'string'\n          ? transactionData.contractAddress.trim()\n          : '';\n      if (!contractAddress) {\n        throw new Error('Invalid contract address: empty or non-string value');\n      }\n      const privateStateId =\n        typeof artifacts.privateStateId === 'string' ? artifacts.privateStateId.trim() : '';\n      if (!privateStateId) {\n        throw new Error('Invalid Private State ID: empty or non-string value');\n      }\n\n      const witnesses = evaluateWitnessCode(artifacts.witnessCode || '');\n\n      logger.debug(SYSTEM_LOG_TAG, 'Artifacts received for execution:', {\n        privateStateId,\n      });\n\n      // Step 4: Load and inject compact-runtime to ensure WASM context unity\n      // This forces the evaluated contract to use the SAME runtime instance as the SDK\n      const runtimeNs = await import('@midnight-ntwrk/compact-runtime');\n      // Unwrap ESM default for CJS consumers to avoid interop issues\n      const compactRuntime = (runtimeNs as Record<string, unknown>)?.default ?? runtimeNs;\n\n      // Expose globally for debugging and potential fallback mechanisms\n      // Reuse the existing globalMidnight variable from Step 1\n      globalMidnight.__OPENZEPPELIN_MIDNIGHT__!.compactRuntime = compactRuntime;\n\n      logger.debug(SYSTEM_LOG_TAG, 'Injecting shared compact-runtime', {\n        version: (compactRuntime as { versionString?: string })?.versionString,\n      });\n\n      // Step 4.1: Wrap private state provider with runtime-only secret overlay\n      // Extract function-specific property name from Customize step metadata.\n      // Falls back to 'organizerSecretKey' if not configured or empty.\n      const identitySecretProp = resolveSecretPropertyName(\n        (transactionData as { _secretConfig?: { identitySecretKeyPropertyName?: string } })\n          ._secretConfig,\n        'organizerSecretKey' // Provide explicit default for eoa.ts\n      )!; // Safe to assert non-null since we provide a default\n\n      const overlayPrivateStateProvider = createPrivateStateOverlay(\n        providers.privateStateProvider as {\n          get: (id: string) => Promise<unknown>;\n          set: (id: string, state: unknown) => Promise<void>;\n        },\n        runtimeSecret,\n        identitySecretProp\n      );\n\n      // Step 5: Create contract instance with injected dependencies\n      // evaluateContractModule internally instantiates new Contract(witnesses)\n      const contractInstance = evaluateContractModule(artifacts.contractModule, witnesses, {\n        '@midnight-ntwrk/compact-runtime': compactRuntime,\n      });\n\n      // Step 6: Verify runtime identity (sanity check)\n      const contractModule = contractInstance as Record<string, unknown>;\n      const runtimeCheck = contractModule.__compactRuntime as\n        | { versionString?: string }\n        | undefined;\n      const compactRuntimeVersion = (compactRuntime as { versionString?: string })?.versionString;\n      if (runtimeCheck?.versionString) {\n        logger.debug(SYSTEM_LOG_TAG, 'Runtime identity check:', {\n          contractVersion: runtimeCheck.versionString,\n          sdkVersion: compactRuntimeVersion,\n          matched: runtimeCheck.versionString === compactRuntimeVersion,\n        });\n      }\n\n      // Step 7: Signal transaction is about to be submitted\n      // Midnight SDK limitation: After the wallet signs, the SDK executes and polls the indexer internally.\n      // We cannot observe a distinct \"submitted\" vs \"confirming\" transition as separate lifecycle events.\n      // Adapters can provide a single combined message via TransactionStatusUpdate { title, message } for\n      // 'pendingSignature' to communicate both \"waiting for signature\" and \"auto-confirmation\" to users.\n      // Revisit when the Midnight SDK exposes more granular lifecycle events.\n      onStatusChange('pendingSignature', {\n        title: 'Waiting for Signature and Confirmation',\n        message:\n          'Please sign the transaction in your wallet. After signing, your transaction will be automatically submitted and confirmed by the Midnight network.',\n      });\n\n      logger.info(\n        SYSTEM_LOG_TAG,\n        `Executing transaction: ${transactionData.functionName}`,\n        transactionData.args\n      );\n\n      // Step 8: Use callCircuit helper with patched providers (runtime-only private state overlay)\n      const patchedProviders = {\n        ...providers,\n        privateStateProvider: overlayPrivateStateProvider,\n      } as typeof providers;\n\n      const result = await callCircuit({\n        contractInstance,\n        providers: patchedProviders,\n        contractAddress,\n        circuitId: transactionData.functionName,\n        privateStateId,\n        args: transactionData.args,\n        identitySecretKeyPropertyName: identitySecretProp,\n      });\n\n      logger.info(SYSTEM_LOG_TAG, `Transaction submitted: ${result.txHash}`);\n\n      onStatusChange('pendingConfirmation', {\n        txHash: result.txHash,\n        title: 'Confirming Transaction',\n        message: 'Your transaction is being confirmed on the Midnight network.',\n      });\n\n      return { txHash: result.txHash, result: result.result };\n    } catch (error) {\n      logger.error(SYSTEM_LOG_TAG, 'Transaction execution failed:', error);\n\n      // Re-throw with potentially cleaner error message\n      if (error instanceof Error) {\n        throw error;\n      }\n\n      throw new Error(`Transaction failed: Unknown error`);\n    }\n  }\n}\n","/**\n * Utility functions for handling identity secret key property names\n */\n\n/**\n * Resolves the identity secret key property name from configuration,\n * applying trim and empty string validation, with an optional fallback default.\n *\n * @param secretConfig - Optional secret configuration containing the property name\n * @param defaultName - Optional fallback property name if none configured (default: 'organizerSecretKey')\n * @returns The resolved property name (non-empty string), the default, or undefined if no default provided\n */\nexport function resolveSecretPropertyName(\n  secretConfig?: { identitySecretKeyPropertyName?: string },\n  defaultName?: string\n): string | undefined {\n  const configured = secretConfig?.identitySecretKeyPropertyName?.trim();\n  if (configured && configured.length > 0) {\n    return configured;\n  }\n  return defaultName;\n}\n","import type { MidnightProviders } from '@midnight-ntwrk/midnight-js-types';\n\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { resolveSecretPropertyName } from '../utils/secret-property-helpers';\nimport { enhanceMidnightError, formatEnhancedError } from './error-enhancer';\n\nconst SYSTEM_LOG_TAG = 'callCircuit';\n\n/**\n * Parameters for calling a Midnight circuit (transaction function)\n */\nexport interface CallCircuitParams {\n  /** The dynamically evaluated contract instance */\n  contractInstance: unknown;\n  /** All required Midnight providers (wallet, proof, indexer, etc.) */\n  providers: MidnightProviders;\n  /** The contract's deployed address */\n  contractAddress: string;\n  /** The circuit identifier (function name) */\n  circuitId: string;\n  /** The private state ID for this contract */\n  privateStateId: string;\n  /** Arguments to pass to the circuit */\n  args: unknown[];\n  /** Optional configured private-state property that holds the identity secret key */\n  identitySecretKeyPropertyName?: string;\n}\n\n/**\n * Result from a successful circuit call\n */\nexport interface CallCircuitResult {\n  /** The transaction hash */\n  txHash: string;\n  /** Next private state if the circuit modified it (optional) */\n  nextPrivateState?: unknown;\n  /** Return value from the circuit execution (if any) */\n  result?: unknown;\n}\n\n/**\n * Friendly circuit call wrapper that handles private state validation, error mapping, and tx hash extraction.\n *\n * This helper encapsulates the boilerplate of:\n * 1. Checking private state availability (participant-only circuits may not require it)\n * 2. Building transaction options with contractInstance, circuitId, and args\n * 3. Calling submitCallTx with private state ID always included\n * 4. Handling SDK errors and mapping them to friendly messages\n * 5. Persisting updated private state after the call\n * 6. Extracting and returning the transaction hash\n *\n * @param params Call parameters\n * @returns The transaction hash and optional updated private state\n * @throws Error with friendly message for common failure modes (proof generation, insufficient balance, missing private state for organizer-only circuits, etc.)\n */\nexport async function callCircuit(params: CallCircuitParams): Promise<CallCircuitResult> {\n  const { contractInstance, providers, contractAddress, circuitId, privateStateId, args } = params;\n\n  logger.info(SYSTEM_LOG_TAG, `Calling circuit: ${circuitId}`, {\n    contractAddress,\n    privateStateId,\n    argsLength: args.length,\n  });\n\n  try {\n    // Import submitCallTx at the start to avoid forward reference issues\n    const { submitCallTx } = await import('@midnight-ntwrk/midnight-js-contracts');\n\n    // Step 2: Build transaction options\n    logger.debug(SYSTEM_LOG_TAG, 'Step 2: Building transaction options');\n    const txOptions = {\n      contract: contractInstance,\n      circuitId,\n      contractAddress,\n      privateStateId,\n      args,\n    };\n\n    // Step 3: Check private state availability, but don't fail preemptively\n    // For participant-only circuits, private state may not exist initially, which is fine.\n    // For organizer-only circuits, the overlay will inject the organizer key.\n    // Let the SDK handle actual validation and report errors appropriately.\n    logger.debug(SYSTEM_LOG_TAG, 'Step 3: Checking private state availability');\n    let existingPrivateState: unknown = null;\n    try {\n      const state = await providers.privateStateProvider.get(privateStateId);\n      if (state == null) {\n        logger.debug(\n          SYSTEM_LOG_TAG,\n          'No existing private state found; proceeding (may be fine for participant-only circuits)'\n        );\n      } else {\n        existingPrivateState = state;\n        logger.debug(SYSTEM_LOG_TAG, 'Private state found');\n      }\n    } catch (err) {\n      // Treat storage read errors as missing state (not an error condition)\n      logger.debug(\n        SYSTEM_LOG_TAG,\n        'Failed to read private state (treating as missing and proceeding):',\n        err instanceof Error ? err.message : 'Unknown error'\n      );\n      existingPrivateState = null;\n    }\n\n    // Step 4: Build call options (always include privateStateId)\n    const callOptions = txOptions as Parameters<typeof submitCallTx>[1];\n\n    // Step 5: Execute the circuit call\n    logger.debug(SYSTEM_LOG_TAG, 'Step 5: Submitting circuit call');\n\n    // Use intersection type to preserve actual return type while allowing access to optional properties\n    type TxResult = Awaited<ReturnType<typeof submitCallTx>> & Record<string, unknown>;\n\n    let txResult: TxResult | undefined;\n    try {\n      txResult = (await submitCallTx(providers, callOptions)) as TxResult;\n      logger.debug(SYSTEM_LOG_TAG, 'Circuit call succeeded', {\n        hasTxHash:\n          !!(txResult?.public as { txHash?: string })?.txHash ||\n          !!(txResult as { txHash?: string })?.txHash,\n        hasNextState: !!txResult?.private?.nextPrivateState,\n        hasPublicResult: !!(txResult?.public as { result?: unknown })?.result,\n        hasResult: !!(txResult as { result?: unknown })?.result,\n        txResultKeys: txResult ? Object.keys(txResult) : [],\n      });\n    } catch (callError: unknown) {\n      const error = callError as { message?: string; code?: string };\n      const message = error?.message || 'Unknown error';\n\n      // Log the actual SDK error for debugging\n      logger.debug(SYSTEM_LOG_TAG, 'SDK error received:', {\n        message,\n        code: error?.code,\n        hasExistingState: existingPrivateState != null,\n      });\n\n      // Map common SDK errors to friendly messages\n      if (message.includes('proof')) {\n        throw new Error(`Zero-knowledge proof generation failed: ${message}`);\n      }\n      if (message.includes('User')) {\n        throw new Error('Transaction was rejected by the user');\n      }\n      if (message.includes('balance')) {\n        throw new Error('Insufficient balance or coins available for transaction');\n      }\n      if (message.includes('undeployed') || message.includes('Undeployed')) {\n        throw new Error(`Contract not deployed at address: ${contractAddress}`);\n      }\n\n      // Handle private state errors - be specific about what errors indicate missing organizer key\n      const prover400 =\n        /Failed Proof Server response:.*code=\"400\"/.test(message) ||\n        /status=\"Bad Request\"/.test(message);\n\n      // Only map to identity-secret error if it's a specific error about missing secret key\n      // The overlay now returns {} instead of null, so missing state errors indicate secret key is needed\n      const secretProp = resolveSecretPropertyName(\n        { identitySecretKeyPropertyName: params.identitySecretKeyPropertyName },\n        'organizerSecretKey'\n      )!; // Safe to assert non-null since we provide a default\n\n      const isIdentitySecretError =\n        message.includes(secretProp) ||\n        message.includes('No private state found at private state ID') ||\n        (message.includes('Private state') && message.includes('not initialized'));\n\n      if (\n        message.includes('Incorrect call transaction configuration') ||\n        isIdentitySecretError ||\n        (prover400 && !existingPrivateState && isIdentitySecretError)\n      ) {\n        throw new Error(\n          'Private state not initialized or identity secret key missing. ' +\n            'For identity-restricted circuits, provide the Identity Secret Key in the form ' +\n            'so the private state can be seeded.'\n        );\n      }\n\n      if (prover400) {\n        throw new Error(\n          'Proof server rejected the request (400). Please verify arguments and ZK artifacts are correct.'\n        );\n      }\n\n      throw new Error(`Circuit call failed: ${message}`);\n    }\n\n    // Step 6: Persist updated private state if it was omitted and is now available\n    if (txResult?.private?.nextPrivateState) {\n      logger.debug(SYSTEM_LOG_TAG, 'Step 6: Persisting updated private state');\n      try {\n        await providers.privateStateProvider.set(privateStateId, txResult.private.nextPrivateState);\n        logger.debug(SYSTEM_LOG_TAG, 'Private state persisted successfully');\n      } catch (persistErr) {\n        logger.warn(\n          SYSTEM_LOG_TAG,\n          'Failed to persist private state (non-fatal, transaction already submitted):',\n          persistErr\n        );\n      }\n    }\n\n    // Step 7: Extract transaction hash with fallback\n    const txHash =\n      (txResult?.public as { txHash?: string })?.txHash ||\n      (txResult as { txHash?: string })?.txHash ||\n      (txResult as { hash?: string })?.hash ||\n      (txResult as { deployTxData?: { public?: { txHash?: string } } })?.deployTxData?.public\n        ?.txHash ||\n      `midnight_tx_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\n    logger.info(SYSTEM_LOG_TAG, `Circuit call complete: ${txHash}`);\n\n    return {\n      txHash,\n      nextPrivateState: txResult?.private?.nextPrivateState,\n    };\n  } catch (error) {\n    const message = error instanceof Error ? error.message : 'Unknown error';\n    logger.error(SYSTEM_LOG_TAG, `Circuit call failed: ${message}`);\n\n    // Enhance error message with user-friendly information\n    const enhanced = enhanceMidnightError(error, circuitId);\n    const friendlyMessage = formatEnhancedError(enhanced);\n\n    // Throw enhanced error with friendly message\n    const enhancedError = new Error(friendlyMessage);\n    // Preserve original stack trace if available\n    if (error instanceof Error && error.stack) {\n      enhancedError.stack = error.stack;\n    }\n    throw enhancedError;\n  }\n}\n","import { logger } from '@openzeppelin/ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'MidnightErrorEnhancer';\n\n/**\n * Enhanced error information with user-friendly message and optional fix suggestions\n */\nexport interface EnhancedError {\n  /** The original error message from the SDK */\n  originalMessage: string;\n  /** User-friendly error message */\n  userMessage: string;\n  /** Optional suggestions for how to fix the error */\n  suggestions?: string[];\n  /** The error category for better handling */\n  category: 'type_mismatch' | 'validation' | 'network' | 'state' | 'proof' | 'unknown';\n}\n\n/**\n * Patterns for detecting specific Midnight SDK errors\n */\nconst ERROR_PATTERNS = {\n  // Vector size mismatch: \"expected value of type Vector<3, ...> but received [ ... ]\"\n  // Must handle nested generics like Vector<10, Maybe<Opaque<\"string\">>>\n  vectorSizeMismatch:\n    /expected value of type Vector<(\\d+),\\s*(.+?)>\\s*but received\\s*\\[([^\\]]*)\\]/is,\n\n  // Maybe type error (with or without \"struct\" prefix)\n  // Must handle nested generics like Maybe<Opaque<\"string\">>\n  maybeMismatch: /expected value of type\\s+(?:struct\\s+)?Maybe<(.+?)>\\s*but received\\s+(.+)/is,\n\n  // General type error: \"expected value of type X but received Y\"\n  // Must handle complex types like Map<string, Array<number>>\n  typeMismatch: /expected value of type\\s+(.+?)\\s+but received\\s+(.+)/is,\n\n  // Private state errors\n  privateStateError:\n    /No private state found|private state|organizer secret key|identity secret key/i,\n\n  // Proof generation errors\n  proofError: /proof|prover|zkSnark/i,\n\n  // Network errors\n  networkError: /network|timeout|connection/i,\n} as const;\n\n/**\n * Enhances Midnight SDK error messages to be more user-friendly\n *\n * @param error The error thrown by the Midnight SDK\n * @param functionName The name of the function/circuit being called\n * @returns Enhanced error information with user-friendly messages\n */\nexport function enhanceMidnightError(error: unknown, functionName?: string): EnhancedError {\n  const originalMessage = error instanceof Error ? error.message : String(error);\n  const fnContext = functionName ? ` in function \"${functionName}\"` : '';\n\n  // Vector size mismatch\n  const vectorMatch = originalMessage.match(ERROR_PATTERNS.vectorSizeMismatch);\n  if (vectorMatch) {\n    const [, expectedSize, elementType, receivedArray] = vectorMatch;\n\n    // Count items in the received array by counting commas at the top level\n    // We need to be careful with nested structures\n    let receivedCount = 0;\n    if (receivedArray.trim().length > 0) {\n      // Simple heuristic: count top-level commas + 1\n      // This works for most cases but might be inaccurate for deeply nested structures\n      let depth = 0;\n      let inString = false;\n      let items = 0;\n      for (let i = 0; i < receivedArray.length; i++) {\n        const char = receivedArray[i];\n        if (char === '\"' || char === \"'\") {\n          inString = !inString;\n        } else if (!inString) {\n          if (char === '{' || char === '[') {\n            depth++;\n          } else if (char === '}' || char === ']') {\n            depth--;\n          } else if (char === ',' && depth === 0) {\n            items++;\n          }\n        }\n      }\n      // Add 1 for the last item (after the last comma)\n      receivedCount = receivedArray.trim().length > 0 ? items + 1 : 0;\n    }\n\n    logger.debug(SYSTEM_LOG_TAG, 'Detected Vector size mismatch error', {\n      expectedSize,\n      elementType,\n      receivedCount,\n      functionName,\n    });\n\n    return {\n      originalMessage,\n      userMessage: `Invalid array size${fnContext}. Expected exactly ${expectedSize} items, but received ${receivedCount}.`,\n      suggestions: [\n        `Ensure your array has exactly ${expectedSize} elements of type ${elementType.trim()}.`,\n        receivedCount < Number(expectedSize)\n          ? `Add ${Number(expectedSize) - receivedCount} more item(s) to the array.`\n          : `Remove ${receivedCount - Number(expectedSize)} item(s) from the array.`,\n        'This is a fixed-size array (Vector) type that requires an exact number of elements.',\n      ],\n      category: 'type_mismatch',\n    };\n  }\n\n  // Maybe type mismatch (not using the correct struct format)\n  const maybeMatch = originalMessage.match(ERROR_PATTERNS.maybeMismatch);\n  if (maybeMatch) {\n    const [, innerType, received] = maybeMatch;\n\n    logger.debug(SYSTEM_LOG_TAG, 'Detected Maybe type mismatch error', {\n      innerType,\n      received,\n      functionName,\n    });\n\n    return {\n      originalMessage,\n      userMessage: `Invalid optional value format${fnContext}. The value should be empty or a valid ${innerType.trim()}.`,\n      suggestions: [\n        'If the field is optional and you want to skip it, leave it empty.',\n        'If providing a value, ensure it matches the expected type.',\n        'The UI Builder should handle this automatically - this may be an adapter bug.',\n      ],\n      category: 'type_mismatch',\n    };\n  }\n\n  // General type mismatch\n  const typeMatch = originalMessage.match(ERROR_PATTERNS.typeMismatch);\n  if (typeMatch) {\n    const [, expectedType, received] = typeMatch;\n\n    logger.debug(SYSTEM_LOG_TAG, 'Detected general type mismatch error', {\n      expectedType,\n      received,\n      functionName,\n    });\n\n    return {\n      originalMessage,\n      userMessage: `Type mismatch${fnContext}. Expected ${expectedType.trim()}, but received ${received.trim()}.`,\n      suggestions: [\n        `Ensure all input values match their expected types.`,\n        `Check that enum values, arrays, and complex types are formatted correctly.`,\n      ],\n      category: 'type_mismatch',\n    };\n  }\n\n  // Private state errors\n  if (ERROR_PATTERNS.privateStateError.test(originalMessage)) {\n    logger.debug(SYSTEM_LOG_TAG, 'Detected private state error', { functionName });\n\n    return {\n      originalMessage,\n      userMessage: `Private state not initialized${fnContext}.`,\n      suggestions: [\n        'If this function requires an identity secret, ensure the secret is configured in the form.',\n        'For participant functions, try calling a public function first to initialize state.',\n        'Check that the contract has been properly deployed and the private state ID is correct.',\n      ],\n      category: 'state',\n    };\n  }\n\n  // Proof generation errors\n  if (ERROR_PATTERNS.proofError.test(originalMessage)) {\n    logger.debug(SYSTEM_LOG_TAG, 'Detected proof generation error', { functionName });\n\n    return {\n      originalMessage,\n      userMessage: `Proof generation failed${fnContext}.`,\n      suggestions: [\n        'Verify that all ZK artifacts are correctly loaded.',\n        'Check that input values satisfy all circuit constraints.',\n        'Ensure the proof server is accessible and responsive.',\n      ],\n      category: 'proof',\n    };\n  }\n\n  // Network errors\n  if (ERROR_PATTERNS.networkError.test(originalMessage)) {\n    logger.debug(SYSTEM_LOG_TAG, 'Detected network error', { functionName });\n\n    return {\n      originalMessage,\n      userMessage: `Network error${fnContext}.`,\n      suggestions: [\n        'Check your internet connection.',\n        'Verify that the Midnight network nodes are accessible.',\n        'Try again in a few moments.',\n      ],\n      category: 'network',\n    };\n  }\n\n  // Unknown error - return as-is with minimal enhancement\n  logger.debug(SYSTEM_LOG_TAG, 'Unknown error type', { originalMessage, functionName });\n\n  return {\n    originalMessage,\n    userMessage: `Transaction failed${fnContext}: ${originalMessage}`,\n    suggestions: ['Check the developer console for more details.'],\n    category: 'unknown',\n  };\n}\n\n/**\n * Formats an enhanced error into a complete error message with suggestions\n *\n * @param enhanced The enhanced error information\n * @returns Formatted error message\n */\nexport function formatEnhancedError(enhanced: EnhancedError): string {\n  let message = enhanced.userMessage;\n\n  if (enhanced.suggestions && enhanced.suggestions.length > 0) {\n    message += '\\n\\nSuggestions:';\n    enhanced.suggestions.forEach((suggestion, idx) => {\n      message += `\\n  ${idx + 1}. ${suggestion}`;\n    });\n  }\n\n  return message;\n}\n","import type { ContractSchema, FormFieldType } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport { parseMidnightInput } from '../transform';\nimport type { MidnightContractArtifacts, WriteContractParameters } from '../types';\nimport { resolveSecretPropertyName } from '../utils/secret-property-helpers';\nimport { isArrayType, isMaybeType, isVectorType } from '../utils/type-helpers';\n\n/**\n * Extract identity secret key property name from runtime secret field metadata.\n * Returns undefined if no runtimeSecret field exists, if the property name is empty,\n * or if it's not a valid JavaScript identifier.\n */\nfunction extractSecretPropertyName(fields: FormFieldType[]): string | undefined {\n  const runtimeSecretField = fields.find(\n    (f) => f.type === 'runtimeSecret' && f.adapterBinding?.key\n  );\n\n  if (!runtimeSecretField?.adapterBinding?.metadata) {\n    return undefined;\n  }\n\n  const meta = runtimeSecretField.adapterBinding.metadata as {\n    identitySecretKeyPropertyName?: string;\n  };\n\n  // Use shared resolver to apply trim validation without default fallback\n  const propName = resolveSecretPropertyName(meta);\n\n  if (!propName) {\n    return undefined;\n  }\n\n  // Validate it's a valid JavaScript identifier\n  // Must start with letter, underscore, or $, followed by letters, digits, underscores, or $\n  if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(propName)) {\n    logger.warn(\n      'formatMidnightTransactionData',\n      `Invalid property name \"${propName}\". Must be a valid JavaScript identifier. Ignoring.`\n    );\n    return undefined;\n  }\n\n  return propName;\n}\n\n/**\n * Formats transaction data for Midnight chains based on parsed inputs.\n *\n * @param contractSchema The contract schema.\n * @param functionId The ID of the function being called.\n * @param submittedInputs The raw data submitted from the form.\n * @param fields The fields of the form schema.\n * @param artifacts Optional contract artifacts needed for execution\n * @returns The formatted data payload suitable for signAndBroadcast.\n */\nexport function formatMidnightTransactionData(\n  contractSchema: ContractSchema,\n  functionId: string,\n  submittedInputs: Record<string, unknown>,\n  fields: FormFieldType[],\n  artifacts?: MidnightContractArtifacts | null\n): WriteContractParameters {\n  logger.info(\n    'formatMidnightTransactionData',\n    `Formatting Midnight transaction data for function: ${functionId}`\n  );\n\n  // --- Step 1: Determine Argument Order --- //\n  const functionDetails = contractSchema.functions.find((fn) => fn.id === functionId);\n  if (!functionDetails) {\n    throw new Error(`Function definition for ${functionId} not found in provided contract schema.`);\n  }\n  const expectedArgs = functionDetails.inputs;\n\n  // --- Step 2: Iterate and Select Values --- //\n  const orderedRawValues: unknown[] = [];\n  for (const expectedArg of expectedArgs) {\n    const fieldConfig = fields.find((field: FormFieldType) => field.name === expectedArg.name);\n    if (!fieldConfig) {\n      throw new Error(`Configuration missing for argument: ${expectedArg.name} in provided fields`);\n    }\n    let value: unknown;\n    if (fieldConfig.isHardcoded) {\n      if (fieldConfig.hardcodedValue === undefined) {\n        throw new Error(\n          `Field '${fieldConfig.name}' is marked as hardcoded but has no hardcodedValue defined.`\n        );\n      }\n      value = fieldConfig.hardcodedValue;\n    } else if (fieldConfig.isHidden) {\n      throw new Error(`Field '${fieldConfig.name}' cannot be hidden without being hardcoded.`);\n    } else {\n      // Handle optional (Maybe<T>) parameters: allow missing input → null\n      const maybe =\n        typeof expectedArg.type === 'string' ? isMaybeType(expectedArg.type) : { isMaybe: false };\n      if (!(fieldConfig.name in submittedInputs)) {\n        if (maybe.isMaybe) {\n          value = null;\n        } else {\n          throw new Error(`Missing submitted input for required field: ${fieldConfig.name}`);\n        }\n      } else {\n        value = submittedInputs[fieldConfig.name];\n      }\n    }\n    orderedRawValues.push(value);\n  }\n\n  // --- Step 3: Parse/Transform Values using the imported parser --- //\n  const transformedArgs = expectedArgs.map((param, index) => {\n    let valueToParse = orderedRawValues[index];\n    const fieldConfig = fields.find((f) => f.name === param.name);\n\n    // Enum normalization: convert chain-agnostic enum value to Midnight enum number\n    function normalizeEnum(\n      value: unknown,\n      enumMeta?: {\n        name: string;\n        variants: Array<{ name: string; type: 'void' | 'tuple' | 'integer'; value?: number }>;\n      }\n    ): unknown {\n      if (!enumMeta) return value;\n      if (value && typeof value === 'object' && 'tag' in (value as Record<string, unknown>)) {\n        const tag = (value as { tag?: string }).tag;\n        const variant = enumMeta.variants.find((v) => v.name === tag);\n        if (variant) {\n          if (variant.type === 'integer' && typeof variant.value === 'number') return variant.value;\n          // Fallback: use index if numeric not provided\n          const idx = enumMeta.variants.findIndex((v) => v.name === tag);\n          return idx >= 0 ? idx : value;\n        }\n      }\n      if (typeof value === 'string') {\n        const variant = enumMeta.variants.find((v) => v.name === value);\n        if (variant) {\n          if (variant.type === 'integer' && typeof variant.value === 'number') return variant.value;\n          const idx = enumMeta.variants.findIndex((v) => v.name === value);\n          return idx >= 0 ? idx : value;\n        }\n      }\n      return value;\n    }\n\n    // If the parameter type is Array<T> and the raw value is already an array, pass through\n    if (typeof param.type === 'string') {\n      const arr = isArrayType(param.type);\n      const vec = isVectorType(param.type);\n      if ((arr.isArray || vec.isVector) && Array.isArray(valueToParse)) {\n        // Normalize enums inside arrays when elementType is enum\n        if (\n          fieldConfig &&\n          fieldConfig.type === 'array' &&\n          fieldConfig.elementType === 'enum' &&\n          fieldConfig.elementFieldConfig?.enumMetadata\n        ) {\n          valueToParse = (valueToParse as unknown[]).map((item) =>\n            normalizeEnum(item, fieldConfig.elementFieldConfig?.enumMetadata)\n          );\n        }\n      }\n    }\n\n    // Normalize single enum\n    if (fieldConfig && fieldConfig.type === 'enum' && fieldConfig.enumMetadata) {\n      valueToParse = normalizeEnum(valueToParse, fieldConfig.enumMetadata);\n    }\n\n    return parseMidnightInput(valueToParse, param.type);\n  });\n\n  // --- Step 4 & 5: Prepare Return Object --- //\n  if (!contractSchema.address) {\n    throw new Error('Contract address is missing or invalid in the provided schema.');\n  }\n\n  // Derive per-function secret configuration from runtimeSecret field metadata\n  const propName = extractSecretPropertyName(fields);\n  const secretConfig = propName ? { identitySecretKeyPropertyName: propName } : undefined;\n\n  const paramsForSignAndBroadcast: WriteContractParameters = {\n    contractAddress: contractSchema.address,\n    functionName: functionDetails.name,\n    args: transformedArgs,\n    argTypes: functionDetails.inputs.map((param) => param.type),\n    ...(secretConfig ? { _secretConfig: secretConfig } : {}),\n    transactionOptions: {\n      // Pass artifacts for execution (will be extracted by adapter's signAndBroadcast)\n      _artifacts: artifacts\n        ? {\n            privateStateId: artifacts.privateStateId,\n            contractModule: artifacts.contractModule,\n            witnessCode: artifacts.witnessCode,\n            verifierKeys: artifacts.verifierKeys,\n          }\n        : undefined,\n    },\n  };\n\n  return paramsForSignAndBroadcast;\n}\n","import { getBytesSize, isPlainObject, logger } from '@openzeppelin/ui-builder-utils';\n\nimport {\n  isArrayType,\n  isBytesType,\n  isMaybeType,\n  isUintType,\n  isVectorType,\n} from '../utils/type-helpers';\n\n// (shared helpers imported from ../utils/type-helpers)\n\nfunction parseHexToUint8Array(hex: string): Uint8Array {\n  const normalized = hex.startsWith('0x') ? hex.slice(2) : hex;\n  if (!/^[0-9a-fA-F]*$/.test(normalized) || normalized.length % 2 !== 0) {\n    throw new Error('Invalid hex string. Must be 0x-prefixed and even-length.');\n  }\n  const bytes = new Uint8Array(normalized.length / 2);\n  for (let i = 0; i < normalized.length; i += 2) {\n    bytes[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16);\n  }\n  return bytes;\n}\n\n/**\n * Parses a raw input value for Midnight based on a parameter type string.\n *\n * Supported:\n * - Primitives: bigint, number, boolean, string\n * - Bytes: Uint8Array and 0x-prefixed hex strings → Uint8Array\n * - Array<T>: JSON string or array → recursively parsed\n * - Maybe<T>: empty string/undefined/null → { is_some: false }, otherwise → { is_some: true, value: T }\n * - Enums/opaque/custom: pass-through (validated downstream)\n */\nexport function parseMidnightInput(value: unknown, parameterType: string): unknown {\n  try {\n    // Maybe<T> - check first to handle null/undefined/empty correctly\n    const maybe = isMaybeType(parameterType);\n    if (maybe.isMaybe && maybe.innerType) {\n      // Represent Option/Maybe as struct expected by Midnight: { is_some: boolean, value?: T }\n      if (value === '' || value === undefined || value === null) {\n        return { is_some: false };\n      }\n      const innerParsed = parseMidnightInput(value, maybe.innerType);\n      return { is_some: true, value: innerParsed };\n    }\n\n    // Early return for null/undefined only if not Maybe<T>\n    if (value === undefined || value === null) return null;\n\n    // Fixed-size vectors: Vector<N, T>\n    const vector = isVectorType(parameterType);\n    if (vector.isVector && vector.elementType) {\n      let items: unknown[];\n      if (typeof value === 'string') {\n        try {\n          const parsed = JSON.parse(value);\n          if (!Array.isArray(parsed)) throw new Error('Expected JSON array for Vector');\n          items = parsed;\n        } catch (e) {\n          throw new Error(`Invalid JSON for Vector: ${(e as Error).message}`);\n        }\n      } else if (Array.isArray(value)) {\n        items = value;\n      } else {\n        throw new Error('Vector input must be a JSON string or array');\n      }\n\n      let parsedItems = items.map((v) => parseMidnightInput(v, vector.elementType!));\n\n      // Enforce fixed size for Vector types (no padding, no truncation)\n      if (typeof vector.size === 'number') {\n        if (parsedItems.length !== vector.size) {\n          throw new Error(\n            `Vector of type ${parameterType} requires exactly ${vector.size} elements. Received ${parsedItems.length}.`\n          );\n        }\n      }\n      return parsedItems;\n    }\n\n    // Arrays\n    const arr = isArrayType(parameterType);\n    if (arr.isArray && arr.elementType) {\n      let items: unknown[];\n      if (typeof value === 'string') {\n        try {\n          const parsed = JSON.parse(value);\n          if (!Array.isArray(parsed)) throw new Error('Expected JSON array');\n          items = parsed;\n        } catch (e) {\n          throw new Error(`Invalid JSON for array: ${(e as Error).message}`);\n        }\n      } else if (Array.isArray(value)) {\n        items = value;\n      } else {\n        throw new Error('Array input must be a JSON string or array');\n      }\n      return items.map((v) => parseMidnightInput(v, arr.elementType!));\n    }\n\n    // Primitives\n    const t = parameterType.toLowerCase();\n    if (t === 'bigint') {\n      if (value === '' || value === null) throw new Error('Numeric value cannot be empty.');\n      try {\n        return BigInt(value as string | number | bigint);\n      } catch {\n        throw new Error(`Invalid bigint value: '${value as string}'.`);\n      }\n    }\n    if (t === 'number') {\n      const n = Number(value);\n      if (!Number.isFinite(n)) throw new Error(`Invalid number value: '${value as string}'.`);\n      return n;\n    }\n\n    // Uint<...> (unsigned integers): parse to JavaScript number\n    if (isUintType(parameterType)) {\n      if (value === '' || value === null) throw new Error('Numeric value cannot be empty.');\n      if (typeof value === 'number') {\n        if (!Number.isFinite(value) || value < 0) {\n          throw new Error(`Invalid Uint value: '${value}'. Must be a non-negative finite number.`);\n        }\n        return value;\n      }\n      if (typeof value === 'bigint') {\n        const num = Number(value);\n        if (!Number.isFinite(num) || num < 0 || num > Number.MAX_SAFE_INTEGER) {\n          throw new Error(`Uint value out of safe integer range: '${value.toString()}'.`);\n        }\n        return num;\n      }\n      const n = Number(value);\n      if (!Number.isFinite(n) || n < 0) {\n        throw new Error(`Invalid Uint value: '${value as string}'.`);\n      }\n      return n;\n    }\n    if (t === 'boolean') {\n      if (typeof value === 'boolean') return value;\n      if (typeof value === 'string') {\n        const lower = value.toLowerCase().trim();\n        if (lower === 'true') return true;\n        if (lower === 'false') return false;\n      }\n      return Boolean(value);\n    }\n    if (t === 'string') {\n      return String(value);\n    }\n\n    // Bytes\n    if (isBytesType(parameterType)) {\n      let bytes: Uint8Array;\n\n      if (value instanceof Uint8Array) {\n        bytes = value;\n      } else if (typeof value === 'string') {\n        if (!value.startsWith('0x')) {\n          throw new Error('Bytes must be a 0x-prefixed hex string or Uint8Array');\n        }\n        bytes = parseHexToUint8Array(value);\n      } else if (Array.isArray(value) && value.every((b) => typeof b === 'number')) {\n        // Accept array-like numeric bytes [0..255]\n        bytes = new Uint8Array(value as number[]);\n      } else {\n        throw new Error('Unsupported bytes input type');\n      }\n\n      // Validate size for Bytes<N> types\n      const expectedSize = getBytesSize(parameterType);\n      if (expectedSize !== undefined && bytes.length !== expectedSize) {\n        throw new Error(\n          `${parameterType} requires exactly ${expectedSize} bytes. Received ${bytes.length} bytes.`\n        );\n      }\n\n      return bytes;\n    }\n\n    // Enums and opaque/custom types: accept as-is; further conversion handled downstream if needed\n    if (\n      isPlainObject(value) ||\n      typeof value === 'string' ||\n      typeof value === 'number' ||\n      typeof value === 'boolean'\n    ) {\n      return value;\n    }\n\n    return value;\n  } catch (error) {\n    logger.error('MidnightInputParser', 'Failed to parse Midnight input', {\n      parameterType,\n      value,\n      error,\n    });\n    throw error;\n  }\n}\n","import type { ContractFunction } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\n/**\n * Formats the decoded result of a Midnight view function call into a user-friendly string.\n *\n * @param decodedValue The decoded value (can be primitive, array, object, BigInt).\n * @param functionDetails The contract function details.\n * @returns A string representation suitable for display.\n */\nexport function formatMidnightFunctionResult(\n  decodedValue: unknown,\n  functionDetails: ContractFunction\n): string {\n  // If outputs is undefined/null or not an array, treat as invalid schema\n  // Empty array (0 outputs) is valid and should be allowed\n  if (!Array.isArray(functionDetails.outputs)) {\n    logger.warn(\n      'formatMidnightFunctionResult',\n      `Invalid or missing outputs definition for function ${functionDetails.name}. If this function intentionally returns no values, set outputs: [] in the schema.`\n    );\n    return '[Error: Invalid outputs definition]';\n  }\n\n  try {\n    // Handle null/undefined values\n    if (decodedValue === null || decodedValue === undefined) {\n      return '(null)';\n    }\n\n    // Format based on type\n    if (typeof decodedValue === 'bigint') {\n      return decodedValue.toString();\n    } else if (\n      typeof decodedValue === 'string' ||\n      typeof decodedValue === 'number' ||\n      typeof decodedValue === 'boolean'\n    ) {\n      return String(decodedValue); // No quotes for primitives\n    } else {\n      // For complex objects/arrays, use JSON.stringify with BigInt support\n      return JSON.stringify(\n        decodedValue,\n        (_, value) => (typeof value === 'bigint' ? value.toString() : value),\n        2\n      );\n    }\n  } catch (error) {\n    const errorMessage = `Error formatting result for ${functionDetails.name}: ${(error as Error).message}`;\n    logger.error('formatMidnightFunctionResult', errorMessage, {\n      functionName: functionDetails.name,\n      decodedValue,\n      error,\n    });\n    return `[${errorMessage}]`;\n  }\n}\n","import type {\n  ExecutionConfig,\n  MidnightNetworkConfig,\n  TransactionStatusUpdate,\n} from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport type { MidnightContractArtifacts, WriteContractParameters } from '../types';\nimport { getMidnightWalletImplementation } from '../wallet';\nimport { EoaExecutionStrategy } from './eoa';\nimport type { ExecutionStrategy, MidnightExecutionConfig } from './execution-strategy';\n\nconst SYSTEM_LOG_TAG = 'adapter-midnight-sender';\n\n/**\n * Signs and broadcasts a Midnight transaction using the wallet implementation.\n *\n * This function coordinates the complete transaction lifecycle for Midnight:\n * 1. Validates the transaction data and network configuration\n * 2. Retrieves the wallet implementation\n * 3. Selects the appropriate execution strategy (currently only EOA)\n * 4. Merges artifacts from transaction data and adapter\n * 5. Executes the transaction via the selected strategy\n *\n * @param transactionData - The formatted transaction data\n * @param executionConfig - Execution configuration (method, settings)\n * @param networkConfig - Midnight network configuration\n * @param adapterArtifacts - Contract artifacts (ZK proofs, verifier keys, etc.)\n * @param onStatusChange - Optional callback for transaction status updates\n * @param runtimeApiKey - Optional session-only API key for execution methods (currently unused; Midnight doesn't support relayers yet)\n * @param runtimeSecret - Optional runtime secret for organizer-only circuits\n * @returns Promise resolving to the transaction hash and optional result\n */\nexport async function signAndBroadcastMidnightTransaction(\n  transactionData: unknown,\n  executionConfig: ExecutionConfig,\n  networkConfig: MidnightNetworkConfig,\n  adapterArtifacts: MidnightContractArtifacts | null,\n  onStatusChange?: (status: string, details: TransactionStatusUpdate) => void,\n  runtimeApiKey?: string,\n  runtimeSecret?: string\n): Promise<{ txHash: string; result?: unknown }> {\n  logger.info(SYSTEM_LOG_TAG, 'Sign & Broadcast Midnight Tx:', {\n    data: transactionData,\n    executionConfig,\n    networkId: networkConfig.id,\n  });\n\n  // --- Validation --- //\n  if (!networkConfig || networkConfig.ecosystem !== 'midnight') {\n    throw new Error('Invalid Midnight network configuration provided.');\n  }\n\n  const txData = transactionData as WriteContractParameters;\n  if (!txData.contractAddress || !txData.functionName) {\n    throw new Error('Transaction data is missing required fields (contractAddress, functionName).');\n  }\n\n  // --- Get Wallet Implementation --- //\n  const walletImplementation = await getMidnightWalletImplementation();\n  if (!walletImplementation) {\n    throw new Error('Midnight wallet implementation not available.');\n  }\n\n  // --- Select Execution Strategy --- //\n  let strategy: ExecutionStrategy;\n\n  switch (executionConfig.method) {\n    case 'eoa':\n    default:\n      strategy = new EoaExecutionStrategy();\n      break;\n  }\n\n  // --- Prepare Artifacts --- //\n  // Extract artifacts from transaction data and adapter instance\n  const txArtifacts = txData.transactionOptions?._artifacts;\n\n  /**\n   * Merge two artifact sources, preferring non-null values from either side.\n   */\n  const mergeArtifacts = (\n    a?: MidnightContractArtifacts | null,\n    b?: MidnightContractArtifacts | null\n  ): MidnightExecutionConfig['artifacts'] | undefined => {\n    if (!a && !b) return undefined;\n    const left = a ?? ({} as MidnightContractArtifacts);\n    const right = b ?? ({} as MidnightContractArtifacts);\n\n    const privateStateId = left.privateStateId || right.privateStateId;\n    const contractModule = left.contractModule || right.contractModule;\n    const witnessCode = left.witnessCode || right.witnessCode;\n    const verifierKeys = left.verifierKeys || right.verifierKeys;\n\n    // Must have at least contractModule and privateStateId to be valid\n    if (!contractModule || !privateStateId) {\n      return undefined;\n    }\n\n    // Type is safe now after validation\n    const combined: MidnightExecutionConfig['artifacts'] = {\n      privateStateId,\n      contractModule,\n      witnessCode,\n      verifierKeys,\n    };\n\n    return combined;\n  };\n\n  // Merge transaction artifacts with adapter artifacts, giving priority to transaction but filling gaps from adapter\n  const combinedArtifacts = mergeArtifacts(\n    (txArtifacts as MidnightContractArtifacts | undefined) ?? null,\n    adapterArtifacts ?? null\n  );\n\n  if (!combinedArtifacts) {\n    throw new Error('Contract artifacts are required for transaction execution but were not found');\n  }\n\n  const executionArtifacts: MidnightExecutionConfig['artifacts'] = combinedArtifacts;\n\n  // --- Augment Execution Config --- //\n  const augmentedConfig: MidnightExecutionConfig = {\n    executionConfig,\n    artifacts: executionArtifacts,\n    networkConfig,\n  };\n\n  // --- Execute using selected strategy --- //\n  return strategy.execute(\n    txData,\n    augmentedConfig,\n    walletImplementation,\n    onStatusChange || (() => {}),\n    runtimeApiKey,\n    runtimeSecret\n  );\n}\n\n/**\n * Waits for a transaction to be confirmed on the blockchain.\n * Currently not implemented for v1; deferred to future phases.\n *\n * @param _txHash - The hash of the transaction to wait for.\n * @returns A promise resolving to the final status and receipt/error.\n */\nexport const waitForMidnightTransactionConfirmation: undefined = undefined;\n","// Barrel file for transaction module\nexport * from './execution-strategy';\nexport * from './eoa';\nexport * from './formatter';\nexport * from './sender';\nexport * from './providers';\nexport * from './witness-evaluator';\nexport * from './contract-evaluator';\nexport * from './call-circuit';\nexport * from './local-execution-router';\n","import type { ContractSchema, TransactionStatusUpdate } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport type { MidnightContractArtifacts, WriteContractParameters } from '../types';\nimport { isPureCircuit } from '../utils/circuit-type-utils';\nimport { parseMidnightContractInterface } from '../utils/schema-parser';\nimport { executePureCircuit } from './pure-circuit-executor';\n\nconst SYSTEM_LOG_TAG = 'local-execution-router';\n\n/**\n * Gets contract schema from artifacts by parsing the contract definition\n *\n * @param artifacts - Contract artifacts containing contract definition\n * @returns Contract schema parsed from artifacts\n */\nasync function getContractSchemaFromArtifacts(\n  artifacts: MidnightContractArtifacts\n): Promise<ContractSchema> {\n  if (!artifacts.contractDefinition) {\n    throw new Error('Contract definition is required for local execution');\n  }\n\n  const parsed = parseMidnightContractInterface(artifacts.contractDefinition);\n\n  return {\n    name: 'MidnightContract',\n    ecosystem: 'midnight',\n    address: artifacts.contractAddress || '',\n    functions: parsed.functions,\n    events: parsed.events,\n    metadata: parsed.metadata,\n  };\n}\n\n/**\n * Gets function details from artifacts by parsing the contract definition\n *\n * @param artifacts - Contract artifacts containing contract definition\n * @param functionName - Name of the function to find\n * @returns Function details if found, null otherwise\n */\nasync function getFunctionFromArtifacts(\n  artifacts: MidnightContractArtifacts,\n  functionName: string\n): Promise<ContractSchema['functions'][0] | null> {\n  if (!artifacts.contractDefinition) {\n    return null;\n  }\n  const { functions } = parseMidnightContractInterface(artifacts.contractDefinition);\n  return functions.find((fn) => fn.id === functionName || fn.name === functionName) || null;\n}\n\n/**\n * Executes a function locally if it can execute locally (e.g., pure circuits)\n *\n * This function handles the complete lifecycle of local execution:\n * - Validates that the function can execute locally\n * - Gets contract schema from artifacts\n * - Executes the function locally\n * - Handles status updates and errors\n *\n * @param transactionData - The transaction data containing function name and args\n * @param artifacts - Contract artifacts\n * @param onStatusChange - Callback for status updates\n * @returns Transaction hash and result if execution was local, null otherwise\n */\nexport async function executeLocallyIfPossible(\n  transactionData: WriteContractParameters,\n  artifacts: MidnightContractArtifacts | null,\n  onStatusChange: (status: string, details: TransactionStatusUpdate) => void\n): Promise<{ txHash: string; result?: unknown } | null> {\n  if (!artifacts || !transactionData.functionName) {\n    return null;\n  }\n\n  const functionDetails = await getFunctionFromArtifacts(artifacts, transactionData.functionName);\n\n  if (!functionDetails || !isPureCircuit(functionDetails)) {\n    return null;\n  }\n\n  logger.info(SYSTEM_LOG_TAG, `Function ${transactionData.functionName} can execute locally`);\n\n  // Get contract schema from artifacts\n  const contractSchema = await getContractSchemaFromArtifacts(artifacts);\n\n  onStatusChange('pendingSignature', {\n    title: 'Executing Locally',\n    message: 'Function is executing locally without blockchain interaction...',\n  });\n\n  try {\n    const result = await executePureCircuit(transactionData, contractSchema, artifacts);\n\n    onStatusChange('success', {\n      title: 'Execution Complete',\n      message: 'Function executed successfully.',\n    });\n\n    // Return a placeholder txHash for local execution\n    return {\n      txHash: `local_execution_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,\n      result,\n    };\n  } catch (error) {\n    onStatusChange('error', {\n      title: 'Execution Failed',\n      message: error instanceof Error ? error.message : 'Unknown error occurred',\n    });\n    throw error;\n  }\n}\n","import type { ContractSchema } from '@openzeppelin/ui-builder-types';\nimport { logger } from '@openzeppelin/ui-builder-utils';\n\nimport type { MidnightContractArtifacts, WriteContractParameters } from '../types';\nimport { isPureCircuit } from '../utils/circuit-type-utils';\nimport { evaluateWitnessCode } from './witness-evaluator';\n\nconst SYSTEM_LOG_TAG = 'PureCircuitExecutor';\n\n/**\n * Executes a pure circuit locally without blockchain interaction\n *\n * Pure circuits run entirely client-side and return results immediately.\n * They don't require wallet connection or transaction submission.\n *\n * @param transactionData - The transaction data containing function name and args\n * @param contractSchema - The contract schema to find function details\n * @param artifacts - Contract artifacts containing contract module\n * @returns The execution result formatted for display\n */\nexport async function executePureCircuit(\n  transactionData: WriteContractParameters,\n  contractSchema: ContractSchema,\n  artifacts: MidnightContractArtifacts\n): Promise<unknown> {\n  const { functionName, args } = transactionData;\n\n  logger.info(SYSTEM_LOG_TAG, `Executing pure circuit: ${functionName}`, {\n    argsLength: args.length,\n  });\n\n  // Step 1: Verify function is actually a pure circuit\n  const functionDetails = contractSchema.functions.find((fn) => fn.id === functionName);\n  if (!functionDetails) {\n    throw new Error(`Function ${functionName} not found in contract schema`);\n  }\n\n  if (!isPureCircuit(functionDetails)) {\n    throw new Error(\n      `Function ${functionName} is not a pure circuit. Pure circuits must have stateMutability === 'pure'`\n    );\n  }\n\n  // Step 2: Evaluate witness code\n  logger.debug(SYSTEM_LOG_TAG, 'Step 1: Evaluating witness code');\n  const witnessCode = artifacts.witnessCode || '';\n  const baseWitnesses = evaluateWitnessCode(witnessCode);\n\n  // Step 3: Load and inject compact-runtime\n  logger.debug(SYSTEM_LOG_TAG, 'Step 2: Loading compact-runtime');\n  const runtimeNs = await import('@midnight-ntwrk/compact-runtime');\n  const compactRuntime = (runtimeNs as Record<string, unknown>)?.default ?? runtimeNs;\n\n  // Step 4: Evaluate contract module to get exports (pureCircuits is exported, not on instance)\n  // Reuse the same evaluation logic as evaluateContractModule but extract exports\n  logger.debug(SYSTEM_LOG_TAG, 'Step 3: Evaluating contract module for exports');\n  const contractModule = artifacts.contractModule || '';\n  if (!contractModule) {\n    throw new Error('Contract module is required for pure circuit execution');\n  }\n\n  // Pre-process the contract module to fix multi-line statement issues (same as evaluateContractModule)\n  let processedModule = contractModule;\n  processedModule = processedModule.replace(/\\n\\s*\\./g, '.');\n  processedModule = processedModule.replace(/\\n\\s*\\[/g, '[');\n\n  // Create sandbox exactly like evaluateContractModule\n  const moduleExports = {};\n  const sandbox = {\n    module: { exports: moduleExports },\n    exports: moduleExports,\n    require: function (id: string) {\n      logger.debug(SYSTEM_LOG_TAG, `Contract requires module: ${id}`);\n      if (id === '@midnight-ntwrk/compact-runtime') {\n        return compactRuntime;\n      }\n      if (globalThis.require) {\n        const result = globalThis.require(id);\n        logger.debug(SYSTEM_LOG_TAG, `Module ${id} loaded:`, result ? 'success' : 'null/undefined');\n        return result;\n      }\n      throw new Error('require is not available for module: ' + id);\n    },\n    process: {\n      env: { NODE_ENV: 'production' },\n      version: 'v16.0.0',\n      versions: {\n        node: '16.0.0',\n        v8: '9.0.0',\n        modules: '93',\n      },\n      platform: 'browser',\n      arch: 'wasm32',\n      release: {\n        name: 'node',\n        lts: 'Gallium',\n      },\n    },\n    global: globalThis,\n    globalThis: globalThis,\n    __dirname: '/',\n    __filename: '/contract.cjs',\n    console: console,\n    Buffer: globalThis.Buffer || {\n      from: (data: string | Uint8Array, encoding?: string) => {\n        let uint8Array: Uint8Array;\n        if (typeof data === 'string') {\n          if (encoding === 'hex') {\n            const bytes = [];\n            for (let i = 0; i < data.length; i += 2) {\n              bytes.push(parseInt(data.substring(i, i + 2), 16));\n            }\n            uint8Array = new Uint8Array(bytes);\n          } else {\n            uint8Array = new TextEncoder().encode(data);\n          }\n        } else {\n          uint8Array = new Uint8Array(data as Uint8Array);\n        }\n        (uint8Array as Uint8Array & { toString(encoding?: string): string }).toString = (\n          encoding?: string\n        ) => {\n          if (encoding === 'hex') {\n            return Array.from(uint8Array)\n              .map((b) => b.toString(16).padStart(2, '0'))\n              .join('');\n          }\n          return new TextDecoder().decode(uint8Array);\n        };\n        return uint8Array;\n      },\n      alloc: (size: number) => new Uint8Array(size),\n      isBuffer: (obj: unknown) => obj instanceof Uint8Array,\n    },\n    witnesses: baseWitnesses,\n  };\n\n  // Evaluate to get exports (same pattern as evaluateContractModule)\n  const evaluator = new Function(\n    ...Object.keys(sandbox),\n    processedModule + '\\nreturn module.exports;'\n  );\n  const contractExports = evaluator(...Object.values(sandbox)) as Record<string, unknown>;\n\n  logger.debug(\n    SYSTEM_LOG_TAG,\n    `Contract exports keys: ${contractExports ? Object.keys(contractExports).join(', ') : 'null'}`\n  );\n\n  // Step 5: Get pure circuits from exports\n  const pureCircuits = contractExports.pureCircuits as Record<string, unknown> | undefined;\n\n  if (!pureCircuits) {\n    logger.error(SYSTEM_LOG_TAG, 'Available exports:', Object.keys(contractExports));\n    throw new Error(\n      'Contract module does not export pureCircuits. Available exports: ' +\n        Object.keys(contractExports).join(', ')\n    );\n  }\n\n  logger.debug(\n    SYSTEM_LOG_TAG,\n    `Found pureCircuits with ${Object.keys(pureCircuits).length} circuits: ${Object.keys(pureCircuits).join(', ')}`\n  );\n\n  const circuitFunction = pureCircuits[functionName] as\n    | ((...args: unknown[]) => unknown)\n    | undefined;\n\n  if (!circuitFunction || typeof circuitFunction !== 'function') {\n    logger.error(\n      SYSTEM_LOG_TAG,\n      `Available pure circuits: ${Object.keys(pureCircuits).join(', ')}`\n    );\n    throw new Error(\n      `Pure circuit ${functionName} not found or is not a function. Available: ${Object.keys(pureCircuits).join(', ')}`\n    );\n  }\n\n  // Step 6: Execute the pure circuit\n  logger.debug(\n    SYSTEM_LOG_TAG,\n    `Step 4: Executing pure circuit ${functionName} with ${args.length} arguments`\n  );\n  try {\n    const result = circuitFunction(...args);\n    logger.info(SYSTEM_LOG_TAG, `Pure circuit execution complete: ${functionName}`);\n    return result;\n  } catch (error) {\n    logger.error(SYSTEM_LOG_TAG, `Pure circuit execution failed: ${functionName}`, error);\n    throw new Error(\n      `Pure circuit execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n","// Barrel file for types module\nexport * from './artifacts';\nexport * from './transaction';\n","import type { MidnightNetworkConfig } from '@openzeppelin/ui-builder-types';\n\nexport const midnightTestnet: MidnightNetworkConfig = {\n  id: 'midnight-testnet',\n  exportConstName: 'midnightTestnet',\n  name: 'Midnight Testnet',\n  ecosystem: 'midnight',\n  network: 'midnight-testnet',\n  type: 'testnet',\n  isTestnet: true,\n  networkId: { 2: 'TestNet' },\n  // Midnight Testnet RPC endpoints\n  rpcEndpoints: {\n    default: 'https://rpc.testnet-02.midnight.network',\n  },\n  // Indexer endpoints (used by the query provider)\n  indexerUri: 'https://indexer.testnet-02.midnight.network/api/v1/graphql',\n  indexerWsUri: 'wss://indexer.testnet-02.midnight.network/api/v1/graphql/ws',\n  // TODO: Add explorer URL when available\n};\n","import { MidnightNetworkConfig } from '@openzeppelin/ui-builder-types';\n\nimport { midnightTestnet } from './testnet';\n\n// All testnet/devnet networks\nexport const midnightTestnetNetworks: MidnightNetworkConfig[] = [midnightTestnet];\n\n// All Midnight networks - for now, this is just testnets\nexport const midnightNetworks: MidnightNetworkConfig[] = [...midnightTestnetNetworks];\n\n// Export individual networks as well\nexport { midnightTestnet };\n","/**\n * Configuration for the Midnight adapter\n *\n * This file defines the dependencies required by the Midnight adapter\n * when generating exported projects. It follows the AdapterConfig\n * interface to provide a structured approach to dependency management.\n */\nimport type { AdapterConfig } from '@openzeppelin/ui-builder-types';\n\nexport const midnightAdapterConfig: AdapterConfig = {\n  /**\n   * Dependencies required by the Midnight adapter\n   * These will be included in exported projects that use this adapter\n   */\n  dependencies: {\n    // Runtime dependencies\n    runtime: {\n      // Core Midnight SDK packages (with exact versions for patch compatibility)\n      '@midnight-ntwrk/compact-runtime': '0.9.0',\n      '@midnight-ntwrk/onchain-runtime': '^0.3.0',\n      '@midnight-ntwrk/ledger': '4.0.0',\n      '@midnight-ntwrk/zswap': '4.0.0',\n      '@midnight-ntwrk/wallet-sdk-address-format': '2.0.0',\n\n      // Midnight SDK JS libraries (with patches)\n      '@midnight-ntwrk/midnight-js-contracts': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-network-id': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-types': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-utils': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-indexer-public-data-provider': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-http-client-proof-provider': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-level-private-state-provider': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-fetch-zk-config-provider': '^2.0.2',\n      '@midnight-ntwrk/midnight-js-node-zk-config-provider': '^2.0.2',\n\n      // Wallet integration\n      '@midnight-ntwrk/dapp-connector-api': '^3.0.0',\n\n      // Reactive state management\n      rxjs: '^7.8.1',\n\n      // ZIP file handling for contract artifacts\n      jszip: '^3.10.1',\n\n      // Protocol Buffers (required for Midnight SDK serialization)\n      // These are transitive dependencies but must be explicit for Vite optimizeDeps\n      protobufjs: '^7.4.0',\n      '@protobufjs/float': '^1.0.2',\n      '@protobufjs/utf8': '^1.1.0',\n      '@protobufjs/base64': '^1.1.2',\n      '@protobufjs/inquire': '^1.1.0',\n      '@protobufjs/pool': '^1.1.0',\n      '@protobufjs/aspromise': '^1.1.2',\n      '@protobufjs/eventemitter': '^1.1.0',\n      '@protobufjs/fetch': '^1.1.0',\n      '@protobufjs/path': '^1.1.2',\n      '@protobufjs/codegen': '^2.0.4',\n\n      // Browser polyfills (required for Midnight SDK browser compatibility)\n      buffer: '^6.0.3',\n      events: '^3.3.0', // Node.js events polyfill for abstract-level\n\n      // Additional transitive dependencies required by Midnight SDK\n      'object-inspect': '^1.13.3',\n      'cross-fetch': '^4.1.0',\n      'fetch-retry': '^6.0.0',\n      lodash: '^4.17.21',\n      level: '^8.0.1',\n      'classic-level': '^1.4.1',\n      'abstract-level': '^2.0.0',\n      'browser-level': '^1.0.1',\n      '@apollo/client': '^3.14.0',\n\n      // UI framework\n      react: '^19.0.0',\n      'react-dom': '^19.0.0',\n    },\n\n    // Development dependencies\n    dev: {\n      '@types/react': '^19.0.0',\n      '@types/react-dom': '^19.0.0',\n    },\n\n    // Build tool dependencies (Vite plugins for WASM support)\n    build: {\n      'vite-plugin-wasm': '^3.3.0',\n      'vite-plugin-top-level-await': '^1.4.4',\n    },\n  },\n\n  /**\n   * Vite configuration for exported applications\n   * Provides the necessary build configuration for Midnight SDK's WASM modules\n   */\n  viteConfig: {\n    imports: [\n      \"import topLevelAwait from 'vite-plugin-top-level-await';\",\n      \"import wasm from 'vite-plugin-wasm';\",\n      '',\n      \"import { getMidnightViteConfig } from '@openzeppelin/ui-builder-adapter-midnight/vite-config';\",\n    ],\n    configInit: 'const midnightConfig = getMidnightViteConfig({ wasm, topLevelAwait });',\n    plugins: '...(midnightConfig.plugins || []),',\n    dedupe: 'dedupe: [...(midnightConfig.resolve?.dedupe || [])],',\n    optimizeDeps: {\n      include: 'include: [...(midnightConfig.optimizeDeps?.include || [])],',\n      exclude: 'exclude: [...(midnightConfig.optimizeDeps?.exclude || [])],',\n    },\n  },\n\n  /**\n   * Note: Midnight SDK patches are bundled with this adapter package.\n   * When this adapter is installed via npm/pnpm, the patches are automatically\n   * applied thanks to the pnpm.patchedDependencies configuration in this package's\n   * package.json. No additional configuration is needed in consuming applications.\n   *\n   * See packages/adapter-midnight/patches/ for the patch files.\n   * See packages/adapter-midnight/package.json \"pnpm.patchedDependencies\" for the configuration.\n   */\n};\n"],"mappings":"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","names":["parseParameters","capitalizeFirst","SYSTEM_LOG_TAG","import_ui_builder_utils","SYSTEM_LOG_TAG","import_ui_builder_utils","SYSTEM_LOG_TAG","import_ui_builder_utils","import_ui_builder_utils","BaseZKConfigProvider","indexerPublicDataProvider","import_ui_builder_utils","SYSTEM_LOG_TAG","JSZip","import_jszip","import_ui_builder_utils","SYSTEM_LOG_TAG","import_ui_builder_utils","init_artifacts","init_artifacts","import_ui_builder_utils","SYSTEM_LOG_TAG","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","result","getNetworkId","exports","deriveIndexerUri","deriveIndexerWsUri","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","encoding","import_ui_builder_utils","SYSTEM_LOG_TAG","import_ui_builder_utils","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","instance","parseParameters","capitalizeFirst","isPureCircuit","import_ui_builder_utils","JSZip","SYSTEM_LOG_TAG","import_ui_builder_utils","isArrayType","isMaybeType","import_ui_builder_utils","SYSTEM_LOG_TAG","import_ui_builder_utils","import_react","import_react","import_jsx_runtime","import_lucide_react","import_ui_builder_ui","import_ui_builder_utils","import_jsx_runtime","import_react","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","initialized","import_jsx_runtime","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","import_ui_builder_utils","SYSTEM_LOG_TAG","import_ui_builder_utils","import_ui_builder_utils","SYSTEM_LOG_TAG","encoding","SYSTEM_LOG_TAG","queryMidnightViewFunction","getMidnightSupportedExecutionMethods","validateMidnightExecutionConfig"]}