{"version":3,"sources":["../../src/testHelpers/index.ts","../../src/testHelpers/env.ts","../../src/utils/DebugLogger.ts","../../src/cache/InMemoryLRUDIDDocumentCache.ts","../../src/errors/IdentityKitError.ts","../../src/vdr/VDRRegistry.ts","../../src/vdr/roochVDR.ts","../../src/multibase/base.ts","../../src/utils/bytes.ts","../../src/types/crypto.ts","../../src/multibase/key.ts","../../src/multibase/did.ts","../../src/crypto/providers/ed25519.ts","../../src/crypto/providers/secp256k1.ts","../../src/crypto/providers/ecdsa_r1.ts","../../src/crypto/factory.ts","../../src/crypto/utils.ts","../../src/crypto/EcdsaR1PublicKey.ts","../../src/signers/keyStoreUtils.ts","../../src/signers/types.ts","../../src/signers/didAccountSigner.ts","../../src/utils/did.ts","../../src/vdr/abstractVDR.ts","../../src/vdr/roochVDRTypes.ts","../../src/utils/sessionScopes.ts","../../src/testHelpers/roochLocalNode.ts","../../src/testHelpers/rooch.ts","../../src/testHelpers/didFactory.ts","../../src/keys/KeyStore.ts","../../src/keys/StoredKeyCodec.ts","../../src/keys/KeyManager.ts","../../src/vdr/keyVDR.ts","../../src/vdr/index.ts","../../src/IdentityEnv.ts","../../src/IdentityKit.ts","../../src/CadopIdentityKit.ts"],"sourcesContent":["/**\n * Test helpers for Rooch DID integration testing\n *\n * This module provides utilities to simplify DID-related integration tests\n * by abstracting away the complexity of on-chain DID creation and management.\n *\n * @module testHelpers\n * @example\n * ```ts\n * import { TestEnv, createSelfDid, createCadopDid } from '@nuwa-ai/identity-kit/testHelpers';\n *\n * if (TestEnv.skipIfNoNode()) return;\n *\n * const env = await TestEnv.bootstrap();\n * const { did, keyManager } = await createSelfDid(env);\n * ```\n */\n\nexport * from './env';\nexport * from './rooch';\nexport * from './didFactory';\nexport * from './types';\n\n// Re-export key classes and functions for convenience\nexport { TestEnv } from './env';\nexport { createSelfDid, createCadopCustodian, createDidViaCadop } from './didFactory';\nexport { RoochLocalNode, startLocalRoochNode, ensureRoochReady } from './roochLocalNode';\n","import { RoochClient } from '@roochnetwork/rooch-sdk';\nimport { DebugLogger } from '../utils/DebugLogger';\nimport { VDRRegistry } from '../vdr/VDRRegistry';\nimport { RoochVDR } from '../vdr/roochVDR';\nimport { KeyManager } from '../keys/KeyManager';\nimport { MemoryKeyStore } from '../keys/KeyStore';\nimport { existsSync } from 'fs';\nimport {\n  TestEnvOptions,\n  EnvironmentCheck,\n  CreateSelfDidResult,\n  CreateSelfDidOptions,\n  CreateCadopDidOptions,\n  RoochNodeOptions,\n  RoochNodeHandle,\n} from './types';\nimport { RoochLocalNode } from './roochLocalNode';\n\n/**\n * Test environment for Rooch DID integration testing\n *\n * Provides a pre-configured environment with:\n * - Rooch client and VDR registry\n * - Helper methods for creating test identities\n *\n * Note: Each createSelfDid() call returns its own dedicated IdentityEnv,\n * which is preferred for multi-party testing scenarios to avoid conflicts.\n */\nexport class TestEnv {\n  private static instance?: TestEnv;\n  private logger: DebugLogger;\n\n  public readonly rpcUrl: string;\n  public readonly network: string;\n  public readonly client: RoochClient;\n  public readonly vdrRegistry: VDRRegistry;\n  public readonly roochVDR: RoochVDR;\n\n  private constructor(options: Required<TestEnvOptions>) {\n    this.logger = DebugLogger.get('TestEnv');\n    this.rpcUrl = options.rpcUrl;\n    this.network = options.network;\n\n    // Initialize Rooch client\n    this.client = new RoochClient({ url: this.rpcUrl });\n\n    // Initialize VDR\n    this.vdrRegistry = VDRRegistry.getInstance();\n    this.roochVDR = new RoochVDR({\n      rpcUrl: this.rpcUrl,\n      network: options.network as any,\n      debug: options.debug,\n    });\n\n    // Register VDR if not already registered\n    if (!this.vdrRegistry.getVDR('rooch')) {\n      this.vdrRegistry.registerVDR(this.roochVDR);\n    }\n\n    if (options.debug) {\n      this.logger.debug('TestEnv initialized', {\n        rpcUrl: this.rpcUrl,\n        network: this.network,\n      });\n    }\n  }\n\n  /**\n   * Bootstrap test environment\n   */\n  static async bootstrap(options: TestEnvOptions = {}): Promise<TestEnv> {\n    const resolvedOptions = await TestEnv.resolveOptions(options);\n    let localNode: RoochNodeHandle | undefined;\n\n    // If autoStartLocalNode is enabled, try to start a local node\n    if (resolvedOptions.autoStartLocalNode) {\n      try {\n        // First, check if existing node is available\n        const check = await TestEnv.checkEnvironment(resolvedOptions);\n        if (!check.shouldSkip) {\n          // Existing node is available, use it\n          return new TestEnv(resolvedOptions);\n        }\n      } catch (error) {\n        // Continue to start local node\n      }\n\n      try {\n        console.log('🚀 Starting local Rooch node for testing...');\n        localNode = await RoochLocalNode.start({\n          binaryPath: process.env.ROOCH_E2E_BIN,\n          network: resolvedOptions.network,\n          debug: resolvedOptions.debug\n        });\n\n        // Update RPC URL to use the local node\n        resolvedOptions.rpcUrl = localNode.rpcUrl;\n        console.log(`✅ Local Rooch node started at ${localNode.rpcUrl}`);\n\n        // Register cleanup handlers\n        const cleanup = async () => {\n          try {\n            if (localNode) {\n              console.log('🛑 Stopping local Rooch node...');\n              await localNode.stop();\n              console.log('✅ Local Rooch node stopped');\n            }\n          } catch (error) {\n            console.error('❌ Error stopping local node:', error);\n          }\n        };\n\n        // Register cleanup for various exit scenarios\n        process.once('exit', cleanup);\n        process.once('SIGINT', cleanup);\n        process.once('SIGTERM', cleanup);\n        process.once('SIGUSR2', cleanup); // nodemon restart\n\n      } catch (error) {\n        throw new Error(`Failed to start local Rooch node: ${error instanceof Error ? error.message : 'Unknown error'}`);\n      }\n    }\n\n    try {\n      // Check environment (will test connectivity to local node if started)\n      const check = await TestEnv.checkEnvironment(resolvedOptions);\n      if (check.shouldSkip) {\n        throw new Error(`Test environment not available: ${check.reason}`);\n      }\n\n      return new TestEnv(resolvedOptions);\n    } catch (error) {\n      // Cleanup local node if TestEnv creation failed\n      if (localNode) {\n        try {\n          await localNode.stop();\n        } catch {\n          // Ignore cleanup errors during failure cleanup\n        }\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Check if integration tests should be skipped\n   */\n  static skipIfNoNode(): boolean {\n    const check = TestEnv.checkEnvironmentSync();\n    return check.shouldSkip;\n  }\n\n  /**\n   * Synchronous environment check\n   */\n  static checkEnvironmentSync(): EnvironmentCheck {\n    const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true';\n    const hasRpcUrl = !!process.env.ROOCH_NODE_URL;\n\n    if (isCI && !hasRpcUrl) {\n      return {\n        shouldSkip: true,\n        reason: 'ROOCH_NODE_URL not set in CI environment',\n      };\n    }\n\n    return {\n      shouldSkip: false,\n      rpcUrl: process.env.ROOCH_NODE_URL || 'http://localhost:6767',\n    };\n  }\n\n  /**\n   * Async environment check with RPC connectivity test\n   */\n  static async checkEnvironment(options: Required<TestEnvOptions>): Promise<EnvironmentCheck> {\n    try {\n      const client = new RoochClient({ url: options.rpcUrl });\n      // Try to get chain ID to verify connectivity\n      await client.getChainId();\n\n      return {\n        shouldSkip: false,\n        rpcUrl: options.rpcUrl,\n      };\n    } catch (error) {\n      const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true';\n\n      if (isCI) {\n        return {\n          shouldSkip: true,\n          reason: `Cannot connect to Rooch node at ${options.rpcUrl}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        };\n      }\n\n      // For local development, we might want to continue with a warning\n      console.warn(\n        `Warning: Cannot connect to Rooch node at ${options.rpcUrl}. Some tests may fail.`\n      );\n      return {\n        shouldSkip: false,\n        rpcUrl: options.rpcUrl,\n      };\n    }\n  }\n\n  /**\n   * Resolve options with defaults\n   */\n  private static async resolveOptions(options: TestEnvOptions): Promise<Required<TestEnvOptions>> {\n    const defaults = {\n      rpcUrl: process.env.ROOCH_NODE_URL || 'http://localhost:6767',\n      network: 'test' as const,\n      autoStartLocalNode: false,\n      faucetAmount: BigInt(1000000), // 1M base units\n      debug: false,\n    };\n\n    const resolved = { ...defaults, ...options };\n\n    // If autoStartLocalNode is enabled, validate ROOCH_E2E_BIN\n    if (resolved.autoStartLocalNode) {\n      const binaryPath = process.env.ROOCH_E2E_BIN;\n      if (!binaryPath) {\n        throw new Error('ROOCH_E2E_BIN environment variable is required when autoStartLocalNode is enabled');\n      }\n\n      if (!existsSync(binaryPath)) {\n        throw new Error(`Rooch binary not found at: ${binaryPath}. Set ROOCH_E2E_BIN to a valid Rooch binary path.`);\n      }\n    }\n\n    return resolved;\n  }\n\n  /**\n   * Fund an account via faucet (placeholder for future implementation)\n   */\n  async fundAccount(address: string, amount?: bigint): Promise<void> {\n    // This is a placeholder - actual faucet implementation would depend on the network\n    this.logger.debug('Funding account', { address, amount });\n    // For now, we assume accounts have sufficient funds or skip funding\n  }\n}\n","/* eslint-disable no-console */\n/*\n * Lightweight environment-agnostic debug logger.\n *\n * ‑ Works in both Node.js and browser.\n * ‑ Supports level filtering (debug | info | warn | error | silent).\n * ‑ Namespaced: each module/class can request its own logger via DebugLogger.get(\"MyModule\").\n * ‑ Global level can be controlled at runtime via DebugLogger.setGlobalLevel() *or*\n *   environment variable NUWA_LOG_LEVEL (node) / window.__NUWA_LOG_LEVEL__ (browser).\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n  debug: 10,\n  info: 20,\n  warn: 30,\n  error: 40,\n  silent: 50,\n};\n\nfunction detectInitialGlobalLevel(): LogLevel {\n  // Node.js: use process.env if available\n  if (typeof process !== 'undefined' && (process as any).env) {\n    const envLevel = (process as any).env.NUWA_LOG_LEVEL as string | undefined;\n    if (envLevel && envLevel in LEVEL_ORDER) return envLevel as LogLevel;\n  }\n  // Browser: allow runtime override via global variable\n  if (typeof window !== 'undefined' && (window as any).__NUWA_LOG_LEVEL__) {\n    const envLevel = (window as any).__NUWA_LOG_LEVEL__ as string;\n    if (envLevel && envLevel in LEVEL_ORDER) return envLevel as LogLevel;\n  }\n  return 'info';\n}\n\nexport class DebugLogger {\n  // ---------------------------------------------------------------------------\n  // Static section\n  // ---------------------------------------------------------------------------\n  private static globalLevel: LogLevel = detectInitialGlobalLevel();\n  private static loggers = new Map<string, DebugLogger>();\n  private static defaultNamespace = 'global';\n\n  /** Acquire (or create) a logger for the given namespace. */\n  static get(namespace: string): DebugLogger {\n    if (!DebugLogger.loggers.has(namespace)) {\n      DebugLogger.loggers.set(namespace, new DebugLogger(namespace));\n    }\n    return DebugLogger.loggers.get(namespace)!;\n  }\n\n  /** Override global log level at runtime. */\n  static setGlobalLevel(level: LogLevel): void {\n    DebugLogger.globalLevel = level;\n    // Propagate to existing instances unless they explicitly override.\n    for (const logger of DebugLogger.loggers.values()) {\n      if (!logger.levelOverridden) {\n        logger.level = level;\n      }\n    }\n  }\n\n  /** Read current global level. */\n  static getGlobalLevel(): LogLevel {\n    return DebugLogger.globalLevel;\n  }\n\n  /** Set default namespace used by static convenience methods. */\n  static setDefaultNamespace(namespace: string): void {\n    DebugLogger.defaultNamespace = namespace;\n  }\n\n  // ---------------------------------------------------------------------------\n  // Static convenience logging methods\n  // ---------------------------------------------------------------------------\n  /**\n   * Log using the default namespace. Useful when callers don't need per-module loggers.\n   * Example: DebugLogger.debug('hello')\n   */\n  static debug(...args: unknown[]): void {\n    DebugLogger.get(DebugLogger.defaultNamespace).debug(...args);\n  }\n\n  static info(...args: unknown[]): void {\n    DebugLogger.get(DebugLogger.defaultNamespace).info(...args);\n  }\n\n  static warn(...args: unknown[]): void {\n    DebugLogger.get(DebugLogger.defaultNamespace).warn(...args);\n  }\n\n  static error(...args: unknown[]): void {\n    DebugLogger.get(DebugLogger.defaultNamespace).error(...args);\n  }\n\n  // ---------------------------------------------------------------------------\n  // Instance section\n  // ---------------------------------------------------------------------------\n  private level: LogLevel;\n  private levelOverridden = false;\n\n  private constructor(private namespace: string) {\n    this.level = DebugLogger.globalLevel;\n  }\n\n  /** Override level for this logger only. */\n  setLevel(level: LogLevel): void {\n    this.level = level;\n    this.levelOverridden = true;\n  }\n\n  // -------------------------------------------------------\n  // Logging helpers\n  // -------------------------------------------------------\n  debug(...args: unknown[]): void {\n    this._log('debug', args);\n  }\n\n  info(...args: unknown[]): void {\n    this._log('info', args);\n  }\n\n  warn(...args: unknown[]): void {\n    this._log('warn', args);\n  }\n\n  error(...args: unknown[]): void {\n    this._log('error', args);\n  }\n\n  // prettier-ignore\n  private _log(level: LogLevel, args: unknown[]): void {\n    if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) {\n      return; // filtered out\n    }\n\n    const prefix = `[${this.namespace}]`;\n\n    // Colorize in browser / modern terminal if desired; keep simple for now.\n    switch (level) {\n      case 'debug':\n        console.debug(prefix, ...args);\n        break;\n      case 'info':\n        console.info(prefix, ...args);\n        break;\n      case 'warn':\n        console.warn(prefix, ...args);\n        break;\n      case 'error':\n        console.error(prefix, ...args);\n        break;\n    }\n  }\n}\n","import { DIDDocument } from '../types';\nimport { DIDDocumentCache } from './index';\n\n/**\n * A lightweight in-memory LRU cache implementation for DID Documents.\n * It is intentionally dependency-free so that the SDK does not pull in\n * additional packages by default. You can replace it with your own\n * implementation (Redis, IndexedDB, etc.) by implementing the\n * `DIDDocumentCache` interface and providing it to `VDRRegistry.setCache()`.\n */\nexport class InMemoryLRUDIDDocumentCache implements DIDDocumentCache {\n  private readonly capacity: number;\n  private readonly map: Map<string, DIDDocument | null>;\n\n  constructor(maxEntries = 1000) {\n    this.capacity = maxEntries;\n    this.map = new Map<string, DIDDocument | null>();\n  }\n\n  get(did: string): DIDDocument | null | undefined {\n    if (!this.map.has(did)) return undefined;\n    const value = this.map.get(did) ?? null;\n    // Refresh the recently used key to the end.\n    this.map.delete(did);\n    this.map.set(did, value);\n    return value;\n  }\n\n  set(did: string, doc: DIDDocument | null): void {\n    if (this.map.has(did)) {\n      this.map.delete(did);\n    } else if (this.map.size >= this.capacity) {\n      // Evict the least-recently-used entry (Map iteration order is insertion order).\n      const lruKey = this.map.keys().next().value;\n      if (lruKey !== undefined) {\n        this.map.delete(lruKey);\n      }\n    }\n    this.map.set(did, doc);\n  }\n\n  has(did: string): boolean {\n    return this.map.has(did);\n  }\n\n  delete(did: string): void {\n    this.map.delete(did);\n  }\n\n  clear(): void {\n    this.map.clear();\n  }\n}\n","/**\n * Unified error handling for IdentityKit\n */\n\n/**\n * Error codes for IdentityKit operations\n */\nexport enum IdentityKitErrorCode {\n  // Configuration and initialization\n  INVALID_CONFIGURATION = 'INVALID_CONFIGURATION',\n  ENVIRONMENT_NOT_SUPPORTED = 'ENVIRONMENT_NOT_SUPPORTED',\n  INITIALIZATION_FAILED = 'INITIALIZATION_FAILED',\n\n  // DID operations\n  DID_NOT_FOUND = 'DID_NOT_FOUND',\n  DID_INVALID_FORMAT = 'DID_INVALID_FORMAT',\n  DID_METHOD_NOT_SUPPORTED = 'DID_METHOD_NOT_SUPPORTED',\n  DID_CREATION_FAILED = 'DID_CREATION_FAILED',\n  DID_RESOLUTION_FAILED = 'DID_RESOLUTION_FAILED',\n  DID_NOT_SET = 'DID_NOT_SET',\n  DID_SERVICE_NOT_FOUND = 'DID_SERVICE_NOT_FOUND',\n  DID_VERIFICATION_METHOD_NOT_FOUND = 'DID_VERIFICATION_METHOD_NOT_FOUND',\n\n  // VDR (Verifiable Data Registry) operations\n  VDR_NOT_AVAILABLE = 'VDR_NOT_AVAILABLE',\n  VDR_OPERATION_FAILED = 'VDR_OPERATION_FAILED',\n  VDR_NETWORK_ERROR = 'VDR_NETWORK_ERROR',\n  VDR_INVALID_RESPONSE = 'VDR_INVALID_RESPONSE',\n\n  // Key management\n  KEY_NOT_FOUND = 'KEY_NOT_FOUND',\n  KEY_INVALID_FORMAT = 'KEY_INVALID_FORMAT',\n  KEY_GENERATION_FAILED = 'KEY_GENERATION_FAILED',\n  KEY_IMPORT_FAILED = 'KEY_IMPORT_FAILED',\n  KEY_STORAGE_ERROR = 'KEY_STORAGE_ERROR',\n  KEY_PERMISSION_DENIED = 'KEY_PERMISSION_DENIED',\n  KEY_VALIDATION_FAILED = 'KEY_VALIDATION_FAILED',\n  KEY_PRIVATE_KEY_NOT_AVAILABLE = 'KEY_PRIVATE_KEY_NOT_AVAILABLE',\n  KEY_DID_MISMATCH = 'KEY_DID_MISMATCH',\n  KEY_ID_MISMATCH = 'KEY_ID_MISMATCH',\n  KEY_TYPE_NOT_SUPPORTED = 'KEY_TYPE_NOT_SUPPORTED',\n  KEY_ALREADY_EXISTS = 'KEY_ALREADY_EXISTS',\n\n  // Signing operations\n  SIGNING_FAILED = 'SIGNING_FAILED',\n  SIGNATURE_VERIFICATION_FAILED = 'SIGNATURE_VERIFICATION_FAILED',\n  SIGNER_NOT_AVAILABLE = 'SIGNER_NOT_AVAILABLE',\n  SIGNER_INVALID_DID = 'SIGNER_INVALID_DID',\n  SIGNER_NO_KEYS = 'SIGNER_NO_KEYS',\n\n  // Authentication (from existing AuthErrorCode)\n  AUTH_INVALID_HEADER = 'AUTH_INVALID_HEADER',\n  AUTH_INVALID_BASE64 = 'AUTH_INVALID_BASE64',\n  AUTH_INVALID_JSON = 'AUTH_INVALID_JSON',\n  AUTH_MISSING_SIGNATURE = 'AUTH_MISSING_SIGNATURE',\n  AUTH_TIMESTAMP_OUT_OF_WINDOW = 'AUTH_TIMESTAMP_OUT_OF_WINDOW',\n  AUTH_NONCE_REPLAYED = 'AUTH_NONCE_REPLAYED',\n  AUTH_DID_DOCUMENT_NOT_FOUND = 'AUTH_DID_DOCUMENT_NOT_FOUND',\n  AUTH_VERIFICATION_METHOD_NOT_FOUND = 'AUTH_VERIFICATION_METHOD_NOT_FOUND',\n  AUTH_INVALID_PUBLIC_KEY = 'AUTH_INVALID_PUBLIC_KEY',\n  AUTH_DID_MISMATCH = 'AUTH_DID_MISMATCH',\n\n  // Web-specific operations\n  WEB_BROWSER_NOT_SUPPORTED = 'WEB_BROWSER_NOT_SUPPORTED',\n  WEB_STORAGE_NOT_AVAILABLE = 'WEB_STORAGE_NOT_AVAILABLE',\n  WEB_DEEPLINK_FAILED = 'WEB_DEEPLINK_FAILED',\n  WEB_CADOP_CONNECTION_FAILED = 'WEB_CADOP_CONNECTION_FAILED',\n  WEB_OAUTH_CALLBACK_FAILED = 'WEB_OAUTH_CALLBACK_FAILED',\n  WEB_NOT_CONNECTED = 'WEB_NOT_CONNECTED',\n  WEB_CALLBACK_FAILED = 'WEB_CALLBACK_FAILED',\n\n  // React-specific operations\n  REACT_NOT_AVAILABLE = 'REACT_NOT_AVAILABLE',\n  REACT_HOOK_MISUSE = 'REACT_HOOK_MISUSE',\n\n  // Crypto operations\n  CRYPTO_PROVIDER_NOT_FOUND = 'CRYPTO_PROVIDER_NOT_FOUND',\n  CRYPTO_OPERATION_FAILED = 'CRYPTO_OPERATION_FAILED',\n  CRYPTO_KEY_DERIVATION_FAILED = 'CRYPTO_KEY_DERIVATION_FAILED',\n\n  // Multibase operations\n  MULTIBASE_DECODE_FAILED = 'MULTIBASE_DECODE_FAILED',\n  MULTIBASE_ENCODE_FAILED = 'MULTIBASE_ENCODE_FAILED',\n  MULTIBASE_INVALID_FORMAT = 'MULTIBASE_INVALID_FORMAT',\n\n  // Validation operations\n  SCOPE_VALIDATION_FAILED = 'SCOPE_VALIDATION_FAILED',\n  SCOPE_INVALID_FORMAT = 'SCOPE_INVALID_FORMAT',\n  VALIDATION_FAILED = 'VALIDATION_FAILED',\n  INVALID_INPUT_FORMAT = 'INVALID_INPUT_FORMAT',\n\n  // DeepLink operations\n  DEEPLINK_INVALID_STATE = 'DEEPLINK_INVALID_STATE',\n  DEEPLINK_CALLBACK_FAILED = 'DEEPLINK_CALLBACK_FAILED',\n\n  // Storage operations\n  STORAGE_QUOTA_EXCEEDED = 'STORAGE_QUOTA_EXCEEDED',\n  STORAGE_OPERATION_FAILED = 'STORAGE_OPERATION_FAILED',\n\n  // Signer operations\n  SIGNER_CONVERSION_FAILED = 'SIGNER_CONVERSION_FAILED',\n  SIGNER_OPERATION_FAILED = 'SIGNER_OPERATION_FAILED',\n\n  // Permission operations\n  PERMISSION_DENIED = 'PERMISSION_DENIED',\n  OPERATION_NOT_PERMITTED = 'OPERATION_NOT_PERMITTED',\n\n  // Generic errors\n  OPERATION_NOT_SUPPORTED = 'OPERATION_NOT_SUPPORTED',\n  INVALID_PARAMETER = 'INVALID_PARAMETER',\n  INTERNAL_ERROR = 'INTERNAL_ERROR',\n  NETWORK_ERROR = 'NETWORK_ERROR',\n  TIMEOUT_ERROR = 'TIMEOUT_ERROR',\n}\n\n/**\n * Base error class for all IdentityKit errors\n */\nexport class IdentityKitError extends Error {\n  public readonly code: IdentityKitErrorCode;\n  public readonly category: string;\n  public readonly details?: unknown;\n  public readonly cause?: Error;\n\n  constructor(\n    code: IdentityKitErrorCode,\n    message: string,\n    options?: {\n      category?: string;\n      details?: unknown;\n      cause?: Error;\n    }\n  ) {\n    super(message);\n    this.name = 'IdentityKitError';\n    this.code = code;\n    this.category = options?.category || this.inferCategory(code);\n    this.details = options?.details;\n    this.cause = options?.cause;\n\n    // Maintain proper stack trace\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, this.constructor);\n    }\n\n    // Chain the original error stack if available\n    if (options?.cause) {\n      this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\n    }\n  }\n\n  /**\n   * Infer error category from error code\n   */\n  private inferCategory(code: IdentityKitErrorCode): string {\n    if (code.startsWith('AUTH_')) return 'authentication';\n    if (code.startsWith('DID_')) return 'did';\n    if (code.startsWith('VDR_')) return 'vdr';\n    if (code.startsWith('KEY_')) return 'key-management';\n    if (code.startsWith('WEB_')) return 'web';\n    if (code.startsWith('REACT_')) return 'react';\n    if (code.startsWith('CRYPTO_')) return 'crypto';\n    if (code.startsWith('MULTIBASE_')) return 'multibase';\n    if (code.startsWith('SCOPE_') || code.startsWith('VALIDATION_')) return 'validation';\n    if (code.startsWith('DEEPLINK_')) return 'deeplink';\n    if (code.startsWith('STORAGE_')) return 'storage';\n    if (code.startsWith('SIGNER_')) return 'signer';\n    if (code.includes('SIGNING') || code.includes('SIGNATURE')) return 'signing';\n    if (code.includes('NETWORK')) return 'network';\n    if (code.includes('PERMISSION')) return 'permission';\n    return 'general';\n  }\n\n  /**\n   * Convert to a plain object for serialization\n   */\n  toJSON(): {\n    name: string;\n    code: string;\n    category: string;\n    message: string;\n    details?: unknown;\n    stack?: string;\n  } {\n    return {\n      name: this.name,\n      code: this.code,\n      category: this.category,\n      message: this.message,\n      details: this.details,\n      stack: this.stack,\n    };\n  }\n\n  /**\n   * Get a user-friendly error message with suggestions\n   */\n  getUserMessage(): string {\n    const suggestions = this.getSuggestions();\n    let message = this.message;\n\n    if (suggestions.length > 0) {\n      message += '\\n\\nSuggestions:\\n' + suggestions.map(s => `• ${s}`).join('\\n');\n    }\n\n    return message;\n  }\n\n  /**\n   * Get contextual suggestions based on error code\n   */\n  private getSuggestions(): string[] {\n    switch (this.code) {\n      case IdentityKitErrorCode.WEB_BROWSER_NOT_SUPPORTED:\n        return [\n          'Use a modern browser that supports required Web APIs',\n          \"Check if you're running in a browser environment\",\n        ];\n\n      case IdentityKitErrorCode.WEB_STORAGE_NOT_AVAILABLE:\n        return [\n          'Enable localStorage or IndexedDB in your browser',\n          \"Check if you're in private/incognito mode\",\n          'Consider using memory storage as fallback',\n        ];\n\n      case IdentityKitErrorCode.DID_METHOD_NOT_SUPPORTED:\n        return [\n          'Check if the DID method is registered with VDRRegistry',\n          'Verify the DID format is correct',\n        ];\n\n      case IdentityKitErrorCode.VDR_NETWORK_ERROR:\n        return [\n          'Check your network connection',\n          'Verify the RPC URL is correct and accessible',\n          'Check if the VDR service is running',\n        ];\n\n      case IdentityKitErrorCode.KEY_STORAGE_ERROR:\n        return [\n          'Check browser storage permissions',\n          'Verify storage quota is not exceeded',\n          'Try clearing browser storage and retry',\n        ];\n\n      case IdentityKitErrorCode.REACT_NOT_AVAILABLE:\n        return [\n          'Ensure React is properly installed and imported',\n          \"Check if you're using the hook in a React component\",\n        ];\n\n      case IdentityKitErrorCode.CRYPTO_PROVIDER_NOT_FOUND:\n        return [\n          'Check if the key type is supported',\n          'Verify the crypto provider factory configuration',\n        ];\n\n      case IdentityKitErrorCode.MULTIBASE_DECODE_FAILED:\n        return [\n          'Verify the encoded string format is correct',\n          'Check if the multibase prefix is valid',\n          'Ensure the input is not corrupted',\n        ];\n\n      case IdentityKitErrorCode.SCOPE_VALIDATION_FAILED:\n        return [\n          'Check the scope format: address::module::function',\n          'Verify the address format is valid',\n          'Ensure module and function names are correct',\n        ];\n\n      case IdentityKitErrorCode.DEEPLINK_INVALID_STATE:\n        return [\n          'Check if the state parameter matches the stored value',\n          'Verify the callback URL parameters are correct',\n          'Ensure the session storage is available',\n        ];\n\n      case IdentityKitErrorCode.STORAGE_QUOTA_EXCEEDED:\n        return [\n          'Clear unused data from browser storage',\n          'Check available storage quota',\n          'Consider using a different storage strategy',\n        ];\n\n      case IdentityKitErrorCode.SIGNER_CONVERSION_FAILED:\n        return [\n          'Verify the signer implements the required interface',\n          'Check if the key ID is available in the signer',\n          'Ensure the DID account signer is properly configured',\n        ];\n\n      default:\n        return [];\n    }\n  }\n}\n\n/**\n * Factory functions for creating specific error types\n */\n\nexport function createConfigurationError(\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(IdentityKitErrorCode.INVALID_CONFIGURATION, message, {\n    category: 'configuration',\n    details,\n    cause,\n  });\n}\n\nexport function createDIDError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'did',\n    details,\n    cause,\n  });\n}\n\nexport function createVDRError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'vdr',\n    details,\n    cause,\n  });\n}\n\nexport function createKeyManagementError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'key-management',\n    details,\n    cause,\n  });\n}\n\nexport function createAuthenticationError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'authentication',\n    details,\n    cause,\n  });\n}\n\nexport function createWebError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'web',\n    details,\n    cause,\n  });\n}\n\nexport function createReactError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'react',\n    details,\n    cause,\n  });\n}\n\nexport function createCryptoError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'crypto',\n    details,\n    cause,\n  });\n}\n\nexport function createMultibaseError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'multibase',\n    details,\n    cause,\n  });\n}\n\nexport function createStorageError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'storage',\n    details,\n    cause,\n  });\n}\n\nexport function createValidationError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'validation',\n    details,\n    cause,\n  });\n}\n\nexport function createSignerError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'signer',\n    details,\n    cause,\n  });\n}\n\nexport function createDeepLinkError(\n  code: IdentityKitErrorCode,\n  message: string,\n  details?: unknown,\n  cause?: Error\n): IdentityKitError {\n  return new IdentityKitError(code, message, {\n    category: 'deeplink',\n    details,\n    cause,\n  });\n}\n\n/**\n * Wrap unknown errors into IdentityKitError\n */\nexport function wrapUnknownError(\n  error: unknown,\n  context: string,\n  code: IdentityKitErrorCode = IdentityKitErrorCode.INTERNAL_ERROR\n): IdentityKitError {\n  const originalError = error instanceof Error ? error : new Error(String(error));\n\n  return new IdentityKitError(code, `${context}: ${originalError.message}`, {\n    cause: originalError,\n    details: { context },\n  });\n}\n\n/**\n * Type guard to check if an error is an IdentityKitError\n */\nexport function isIdentityKitError(error: unknown): error is IdentityKitError {\n  return error instanceof IdentityKitError;\n}\n\n/**\n * Legacy compatibility: map old AuthErrorCode to new IdentityKitErrorCode\n */\nexport const AuthErrorCodeMapping = {\n  INVALID_HEADER: IdentityKitErrorCode.AUTH_INVALID_HEADER,\n  INVALID_BASE64: IdentityKitErrorCode.AUTH_INVALID_BASE64,\n  INVALID_JSON: IdentityKitErrorCode.AUTH_INVALID_JSON,\n  MISSING_SIGNATURE: IdentityKitErrorCode.AUTH_MISSING_SIGNATURE,\n  TIMESTAMP_OUT_OF_WINDOW: IdentityKitErrorCode.AUTH_TIMESTAMP_OUT_OF_WINDOW,\n  NONCE_REPLAYED: IdentityKitErrorCode.AUTH_NONCE_REPLAYED,\n  SIGNATURE_VERIFICATION_FAILED: IdentityKitErrorCode.SIGNATURE_VERIFICATION_FAILED,\n  DID_DOCUMENT_NOT_FOUND: IdentityKitErrorCode.AUTH_DID_DOCUMENT_NOT_FOUND,\n  VERIFICATION_METHOD_NOT_FOUND: IdentityKitErrorCode.AUTH_VERIFICATION_METHOD_NOT_FOUND,\n  INVALID_PUBLIC_KEY: IdentityKitErrorCode.AUTH_INVALID_PUBLIC_KEY,\n  DID_MISMATCH: IdentityKitErrorCode.AUTH_DID_MISMATCH,\n} as const;\n","import { DIDDocument, DIDResolver } from '../types';\nimport { DIDDocumentCache } from '../cache';\nimport {\n  VDRInterface,\n  DIDCreationRequest,\n  DIDCreationResult,\n  CADOPCreationRequest,\n  CADOPControllerCreationRequest,\n} from './types';\n\nimport { InMemoryLRUDIDDocumentCache } from '../cache/InMemoryLRUDIDDocumentCache';\nimport { IdentityKitErrorCode, createVDRError } from '../errors';\n\n/**\n * Global registry for VDR (Verifiable Data Registry) implementations.\n * This singleton manages all registered VDRs and maintains a DID Document cache.\n */\nexport class VDRRegistry implements DIDResolver {\n  private static instance: VDRRegistry;\n  private vdrs: Map<string, VDRInterface> = new Map();\n\n  private cache: DIDDocumentCache;\n\n  private constructor() {\n    // Use the default in-memory cache unless overridden by the developer.\n    this.cache = new InMemoryLRUDIDDocumentCache();\n  }\n\n  static getInstance(): VDRRegistry {\n    if (!this.instance) {\n      this.instance = new VDRRegistry();\n    }\n    return this.instance;\n  }\n\n  /** Register a VDR implementation for its DID method (e.g., 'key', 'rooch'). */\n  registerVDR(vdr: VDRInterface) {\n    this.vdrs.set(vdr.getMethod(), vdr);\n  }\n\n  /** Retrieve a previously registered VDR implementation by its method. */\n  getVDR(method: string): VDRInterface | undefined {\n    return this.vdrs.get(method);\n  }\n\n  /**\n   * Override the default cache implementation.\n   * This allows developers to provide their own cache (e.g., Redis, browser storage).\n   */\n  setCache(cache: DIDDocumentCache) {\n    this.cache = cache;\n  }\n\n  /** Returns the currently configured cache instance. */\n  getCache(): DIDDocumentCache {\n    return this.cache;\n  }\n\n  async resolveDID(did: string, options?: { forceRefresh?: boolean }): Promise<DIDDocument | null> {\n    const method = did.split(':')[1];\n    const vdr = this.vdrs.get(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for method: ${method}`,\n        { method, availableMethods: Array.from(this.vdrs.keys()) }\n      );\n    }\n\n    // Attempt to serve from cache if allowed.\n    if (!options?.forceRefresh) {\n      const cached = this.cache.get(did);\n      if (cached !== undefined) {\n        return cached;\n      }\n    }\n\n    const resolved = await vdr.resolve(did);\n    // Cache the resolution result (including null for negative caching).\n    this.cache.set(did, resolved);\n    return resolved;\n  }\n\n  async createDID(\n    method: string,\n    creationRequest: DIDCreationRequest,\n    options?: Record<string, any>\n  ): Promise<DIDCreationResult> {\n    const vdr = this.vdrs.get(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for method: ${method}`,\n        { method, availableMethods: Array.from(this.vdrs.keys()) }\n      );\n    }\n    const result = await vdr.create(creationRequest, options);\n    if (result.success && result.didDocument) {\n      this.cache.set(result.didDocument.id, result.didDocument);\n    }\n    return result;\n  }\n\n  async createDIDViaCADOP(\n    method: string,\n    creationRequest: CADOPCreationRequest,\n    options?: Record<string, any>\n  ): Promise<DIDCreationResult> {\n    const vdr = this.vdrs.get(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for method: ${method}`,\n        { method, availableMethods: Array.from(this.vdrs.keys()) }\n      );\n    }\n    const result = await vdr.createViaCADOP(creationRequest, options);\n    if (result.success && result.didDocument) {\n      this.cache.set(result.didDocument.id, result.didDocument);\n    }\n    return result;\n  }\n\n  async createDIDViaCADOPWithController(\n    method: string,\n    creationRequest: CADOPControllerCreationRequest,\n    options?: Record<string, any>\n  ): Promise<DIDCreationResult> {\n    const vdr = this.vdrs.get(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for method: ${method}`,\n        { method, availableMethods: Array.from(this.vdrs.keys()) }\n      );\n    }\n    const result = await vdr.createViaCADOPWithController(creationRequest, options);\n    if (result.success && result.didDocument) {\n      this.cache.set(result.didDocument.id, result.didDocument);\n    }\n    return result;\n  }\n\n  async exists(did: string): Promise<boolean> {\n    const method = did.split(':')[1];\n    const vdr = this.vdrs.get(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for method: ${method}`,\n        { method, availableMethods: Array.from(this.vdrs.keys()) }\n      );\n    }\n\n    // If we have a positive cache entry, short-circuit the call.\n    if (this.cache.has(did)) {\n      const doc = this.cache.get(did);\n      return doc !== null;\n    }\n\n    const exists = await vdr.exists(did);\n    // We don't cache the existence check result here to avoid stale data.\n    return exists;\n  }\n}\n","import {\n  RoochClient,\n  Transaction,\n  Args,\n  getRoochNodeUrl as sdkGetRoochNodeUrl,\n  Signer,\n  RoochAddress,\n  SignatureScheme,\n  Keypair,\n  PublicKey,\n  Address,\n  Bytes,\n  Authenticator,\n  BitcoinAddress,\n  ObjectStateView,\n  Ed25519PublicKey,\n  Secp256k1PublicKey,\n  EventView,\n} from '@roochnetwork/rooch-sdk';\nimport {\n  DIDDocument,\n  VerificationMethod,\n  VerificationRelationship,\n  ServiceEndpoint,\n} from '../types/did';\nimport { SignerInterface, DidAccountSigner, isSignerInterface } from '../signers';\nimport { KeyType, keyTypeToRoochSignatureScheme } from '../types/crypto';\nimport {\n  DIDCreationRequest,\n  DIDCreationResult,\n  CADOPCreationRequest,\n  CADOPControllerCreationRequest,\n} from './types';\nimport { AbstractVDR } from './abstractVDR';\nimport {\n  convertMoveDIDDocumentToInterface,\n  formatDIDString,\n  parseDIDCreatedEvent,\n  resolveDidObjectID,\n} from './roochVDRTypes';\nimport { DebugLogger } from '../utils/DebugLogger';\nimport { parseDid, extractFragmentFromId } from '../utils/did';\nimport { validateScopes, combineScopes } from '../utils/sessionScopes';\nimport {\n  IdentityKitErrorCode,\n  createVDRError,\n  createValidationError,\n  createSignerError,\n  wrapUnknownError,\n} from '../errors';\n\nexport interface RoochClientConfig {\n  url: string;\n  transport?: any;\n}\n\nexport interface RoochTransactionResult {\n  execution_info: {\n    status: {\n      type: string; // 'executed' | 'failed'\n    };\n    gas_used: string;\n  };\n  output?: {\n    events?: Array<{\n      event_type: string;\n      event_data: string;\n      event_index: string;\n      decoded_event_data?: any;\n    }>;\n  };\n  transaction: any;\n}\n\n/**\n * Options for RoochVDR configuration\n */\nexport interface RoochVDROptions {\n  /**\n   * Rooch RPC endpoint URL\n   */\n  rpcUrl?: string;\n\n  /**\n   * Network type (local, dev, test, main)\n   */\n  network?: 'local' | 'dev' | 'test' | 'main';\n\n  /**\n   * Enable debug mode for detailed logging\n   */\n  debug?: boolean;\n}\n\n/**\n * Result of store operation with actual DID address\n */\nexport interface StoreResult {\n  success: boolean;\n  actualDIDAddress?: string;\n}\n\n/**\n * Options for Rooch VDR operations\n */\nexport interface RoochVDROperationOptions {\n  /**\n   * Signer to use for this operation\n   */\n  signer?: SignerInterface | Signer;\n\n  /**\n   * Key ID to use for this operation\n   */\n  keyId?: string;\n\n  /**\n   * Custom session key scopes (for authentication VM)\n   * Only used when adding a verification method with authentication relationship\n   */\n  scopes?: string[];\n\n  /**\n   * Advanced blockchain transaction options\n   * For high-level users who need fine-grained control over transaction parameters\n   */\n  advanced?: RoochTxnOptions;\n}\n\n/**\n * Advanced Rooch blockchain transaction options\n * These options are typically only needed for advanced use cases\n */\nexport interface RoochTxnOptions {\n  /**\n   * Maximum gas limit for the transaction\n   */\n  maxGas?: number;\n}\n\n/**\n * VDR implementation for did:rooch method\n *\n * This implementation integrates with Rooch network's DID contract system\n * to provide on-chain DID document storage and management.\n */\nexport class RoochVDR extends AbstractVDR {\n  private readonly options: RoochVDROptions;\n  private client: RoochClient;\n  private readonly didContractAddress: string;\n  private readonly debug: boolean;\n  private readonly logger: DebugLogger;\n  private lastCreatedDIDAddress?: string;\n\n  constructor(options: RoochVDROptions) {\n    super('rooch');\n    this.options = options;\n    this.didContractAddress = '0x3::did';\n    this.debug = options.debug || false;\n    this.logger = DebugLogger.get('RoochVDR');\n    if (this.debug) {\n      this.logger.setLevel('debug');\n    }\n\n    let rpcUrl = options.rpcUrl;\n    if (!rpcUrl) {\n      rpcUrl = RoochVDR.getRoochNodeUrl(options.network || 'test');\n    }\n    this.logger.debug(`RoochVDR initialized with rpcUrl: ${rpcUrl}`);\n    // Initialize Rooch client\n    this.client = new RoochClient({ url: rpcUrl });\n  }\n\n  /**\n   * Log message if debug mode is enabled\n   */\n  private debugLog(message: string, data?: any) {\n    if (data !== undefined) {\n      this.logger.debug(message, data);\n    } else {\n      this.logger.debug(message);\n    }\n  }\n\n  /**\n   * Log error message (always logged regardless of debug mode)\n   */\n  private errorLog(message: string, error?: any) {\n    if (error !== undefined) {\n      this.logger.error(message, error);\n    } else {\n      this.logger.error(message);\n    }\n  }\n\n  private async convertSigner(signer: SignerInterface | Signer, keyId?: string): Promise<Signer> {\n    // If it implements SignerInterface, convert it to DidAccountSigner\n    if (isSignerInterface(signer)) {\n      return DidAccountSigner.create(signer, keyId);\n    }\n    // Fallback: assume it's Signer\n    return signer;\n  }\n\n  /**\n   * Override create method to support Rooch dynamic DID generation\n   */\n  async create(\n    request: DIDCreationRequest,\n    options?: RoochVDROperationOptions\n  ): Promise<DIDCreationResult> {\n    try {\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No signer provided for create operation',\n          { operation: 'create', request }\n        );\n      }\n\n      this.debugLog('Creating DID with request:', request);\n\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Always combine base scopes with custom scopes\n      const finalScopes = combineScopes(request.customScopes || []);\n\n      // Validate all scopes\n      const scopeValidation = validateScopes(finalScopes);\n      if (!scopeValidation.valid) {\n        throw createValidationError(\n          IdentityKitErrorCode.SCOPE_VALIDATION_FAILED,\n          `Invalid scope format: ${scopeValidation.invalidScopes.join(', ')}`,\n          {\n            invalidScopes: scopeValidation.invalidScopes,\n            allScopes: finalScopes,\n            operation: 'create',\n          }\n        );\n      }\n\n      // Always use the scopes version since we always have scopes (at minimum base scopes)\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.didContractAddress}::create_did_object_for_self_with_custom_scopes_entry`,\n        args: [Args.string(request.publicKeyMultibase), Args.vec('string', finalScopes)],\n        maxGas: options?.advanced?.maxGas || 100000000,\n      });\n\n      this.debugLog('Creating DID with scopes:', finalScopes);\n\n      this.debugLog('Creating DID Transaction:', transaction);\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      const success = result.execution_info.status.type === 'executed';\n\n      if (!success) {\n        // Return preferredDID or generate a failure placeholder on failure\n        return {\n          success: false,\n          error:\n            'Transaction execution failed, execution_info: ' +\n            JSON.stringify(result.execution_info),\n          debug: {\n            requestedDID: request.preferredDID,\n            transactionResult: result.execution_info,\n          },\n        };\n      }\n\n      // Parse the actual created DID\n      const didCreatedEvent = result.output?.events?.find(\n        (event: EventView) => event.event_type === '0x3::did::DIDCreatedEvent'\n      );\n      if (!didCreatedEvent) {\n        throw createVDRError(\n          IdentityKitErrorCode.VDR_INVALID_RESPONSE,\n          'DIDCreatedEvent not found in transaction result',\n          { transactionResult: result, events: result.output?.events, operation: 'create' }\n        );\n      }\n      let actualDID = this.parseDIDCreatedEventAndGetDID(didCreatedEvent);\n\n      this.lastCreatedDIDAddress = actualDID;\n\n      let didDocument = await this.resolve(actualDID);\n      if (!didDocument) {\n        throw createVDRError(\n          IdentityKitErrorCode.DID_RESOLUTION_FAILED,\n          `DID document not found with DID: ${actualDID}`,\n          { did: actualDID, operation: 'create' }\n        );\n      }\n\n      return {\n        success: true,\n        didDocument: didDocument,\n        transactionHash: (result as any).transaction_hash,\n        debug: {\n          requestedDID: request.preferredDID,\n          actualDID: actualDID || undefined,\n          events: result.output?.events,\n        },\n      };\n    } catch (error) {\n      this.errorLog('Error creating DID:', error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  /**\n   * Override CADOP creation method\n   */\n  async createViaCADOP(\n    request: CADOPCreationRequest,\n    options?: RoochVDROperationOptions\n  ): Promise<DIDCreationResult> {\n    try {\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No custodian signer provided for CADOP operation',\n          { operation: 'createViaCADOP', request }\n        );\n      }\n\n      this.debugLog('Creating DID via CADOP with request:', request);\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Always combine base scopes with custom scopes\n      const finalScopes = combineScopes(request.customScopes || []);\n\n      // Validate all scopes\n      const scopeValidation = validateScopes(finalScopes);\n      if (!scopeValidation.valid) {\n        throw createValidationError(\n          IdentityKitErrorCode.SCOPE_VALIDATION_FAILED,\n          `Invalid scope format: ${scopeValidation.invalidScopes.join(', ')}`,\n          {\n            invalidScopes: scopeValidation.invalidScopes,\n            allScopes: finalScopes,\n            operation: 'createViaCADOP',\n          }\n        );\n      }\n\n      // Always use the scopes version since the contract will add base scopes\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.didContractAddress}::create_did_object_via_cadop_with_did_key_and_scopes_entry`,\n        args: [\n          Args.string(request.userDidKey),\n          Args.string(request.custodianServicePublicKey),\n          Args.string(request.custodianServiceVMType),\n          Args.vec('string', finalScopes),\n        ],\n        maxGas: options?.advanced?.maxGas || 100000000,\n      });\n\n      this.debugLog('Creating DID via CADOP with scopes:', finalScopes);\n\n      this.debugLog('Creating DID via CADOP Transaction:', transaction);\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      this.debugLog('Creating DID via CADOP Transaction Result:', result);\n\n      const success = result.execution_info.status.type === 'executed';\n\n      if (!success) {\n        return {\n          success: false,\n          error:\n            'CADOP transaction execution failed, execution_info: ' +\n            JSON.stringify(result.execution_info),\n        };\n      }\n\n      // Parse the created DID\n      const didCreatedEvent = result.output?.events?.find(\n        (event: any) => event.event_type === '0x3::did::DIDCreatedEvent'\n      );\n      if (!didCreatedEvent) {\n        throw createVDRError(\n          IdentityKitErrorCode.VDR_INVALID_RESPONSE,\n          'DIDCreatedEvent not found in transaction result',\n          { transactionResult: result, events: result.output?.events }\n        );\n      }\n      let actualDID = this.parseDIDCreatedEventAndGetDID(didCreatedEvent);\n      let didDocument = await this.resolve(actualDID);\n      if (!didDocument) {\n        throw createVDRError(\n          IdentityKitErrorCode.DID_RESOLUTION_FAILED,\n          `DID document not found with DID: ${actualDID}`,\n          { did: actualDID }\n        );\n      }\n      return {\n        success: true,\n        didDocument: didDocument,\n        transactionHash: (result as any).transaction_hash,\n      };\n    } catch (error) {\n      this.errorLog('Error creating DID via CADOP:', error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  /**\n   * Create DID via CADOP with controller (supports did:key, did:bitcoin, etc.)\n   */\n  async createViaCADOPWithController(\n    request: CADOPControllerCreationRequest,\n    options?: RoochVDROperationOptions\n  ): Promise<DIDCreationResult> {\n    try {\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No custodian signer provided for CADOP controller operation',\n          { operation: 'createViaCADOPWithController', request }\n        );\n      }\n\n      this.debugLog('Creating DID via CADOP with controller request:', request);\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Always combine base scopes with custom scopes\n      const finalScopes = combineScopes(request.customScopes || []);\n\n      // Validate all scopes\n      const scopeValidation = validateScopes(finalScopes);\n      if (!scopeValidation.valid) {\n        throw createValidationError(\n          IdentityKitErrorCode.SCOPE_VALIDATION_FAILED,\n          `Invalid scope format: ${scopeValidation.invalidScopes.join(', ')}`,\n          {\n            invalidScopes: scopeValidation.invalidScopes,\n            allScopes: finalScopes,\n            operation: 'createViaCADOPWithController',\n          }\n        );\n      }\n\n      // Use the new controller-based contract entry point\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.didContractAddress}::create_did_object_via_cadop_with_controller_and_scopes_entry`,\n        args: [\n          Args.string(request.controllerDid),\n          Args.string(request.controllerPublicKeyMultibase || ''),\n          Args.string(request.controllerVMType || ''),\n          Args.string(request.custodianServicePublicKey),\n          Args.string(request.custodianServiceVMType),\n          Args.vec('string', finalScopes),\n        ],\n        maxGas: options?.advanced?.maxGas || 100000000,\n      });\n\n      this.debugLog('Creating DID via CADOP with controller and scopes:', finalScopes);\n      this.debugLog('Controller DID:', request.controllerDid);\n      this.debugLog('Controller public key multibase:', request.controllerPublicKeyMultibase);\n      this.debugLog('Controller VM type:', request.controllerVMType);\n\n      this.debugLog('Creating DID via CADOP with controller Transaction:', transaction);\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      this.debugLog('Creating DID via CADOP with controller Transaction Result:', result);\n\n      const success = result.execution_info.status.type === 'executed';\n\n      if (!success) {\n        return {\n          success: false,\n          error:\n            'CADOP controller transaction execution failed, execution_info: ' +\n            JSON.stringify(result.execution_info),\n        };\n      }\n\n      // Parse the created DID\n      const didCreatedEvent = result.output?.events?.find(\n        (event: any) => event.event_type === '0x3::did::DIDCreatedEvent'\n      );\n      if (!didCreatedEvent) {\n        throw createVDRError(\n          IdentityKitErrorCode.VDR_INVALID_RESPONSE,\n          'DIDCreatedEvent not found in transaction result',\n          { transactionResult: result, events: result.output?.events }\n        );\n      }\n      let actualDID = this.parseDIDCreatedEventAndGetDID(didCreatedEvent);\n      let didDocument = await this.resolve(actualDID);\n      if (!didDocument) {\n        throw createVDRError(\n          IdentityKitErrorCode.DID_RESOLUTION_FAILED,\n          `DID document not found with DID: ${actualDID}`,\n          { did: actualDID }\n        );\n      }\n      return {\n        success: true,\n        didDocument: didDocument,\n        transactionHash: (result as any).transaction_hash,\n        debug: {\n          requestedDID: request.controllerDid,\n          actualDID: actualDID,\n          events: result.output?.events,\n        },\n      };\n    } catch (error) {\n      this.errorLog('Error creating DID via CADOP with controller:', error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  /**\n   * Resolve DID Document from Rooch blockchain\n   *\n   * @param did The DID to resolve (e.g., \"did:rooch:0x123...\")\n   * @returns Promise resolving to the DID Document or null if not found\n   */\n  async resolve(did: string): Promise<DIDDocument | null> {\n    try {\n      this.validateDIDMethod(did);\n\n      // Extract address from did:rooch:address format\n      const { method, identifier } = parseDid(did);\n      if (method !== 'rooch') {\n        throw createVDRError(\n          IdentityKitErrorCode.DID_INVALID_FORMAT,\n          'Invalid DID format. Expected did:rooch:address',\n          { did, expectedMethod: 'rooch', actualMethod: method }\n        );\n      }\n\n      // Calculate Object ID from identifier\n      const objectId = resolveDidObjectID(identifier);\n      this.debugLog(`Resolved DID object ID: ${objectId}`);\n      const objectStates = await this.client.getObjectStates({\n        ids: [objectId],\n      });\n\n      if (!objectStates || objectStates.length === 0) {\n        return null;\n      }\n\n      let didDocObject: ObjectStateView = objectStates[0];\n      if (!didDocObject) {\n        this.debugLog(`Resolved DID document by ${did} is null`);\n        return null;\n      }\n      return convertMoveDIDDocumentToInterface(didDocObject);\n    } catch (error) {\n      this.errorLog(`Error resolving DID from Rooch network:`, error);\n      return null;\n    }\n  }\n\n  /**\n   * Check if a DID exists on the Rooch network\n   *\n   * @param did The DID to check\n   * @returns Promise resolving to true if the DID exists\n   */\n  async exists(did: string): Promise<boolean> {\n    try {\n      this.validateDIDMethod(did);\n\n      // Extract address from did:rooch:address format\n      const { method, identifier } = parseDid(did);\n      if (method !== 'rooch') {\n        return false;\n      }\n\n      const address = identifier;\n\n      // Call DID contract's exists_did_for_address view function on Rooch network\n      const result = await this.client.executeViewFunction({\n        target: `${this.didContractAddress}::exists_did_for_address`,\n        args: [Args.address(address)],\n      });\n\n      return result?.vm_status === 'Executed' && result.return_values?.[0]?.decoded_value === true;\n    } catch (error) {\n      this.errorLog(`Error checking DID existence on Rooch network:`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Add a verification method to a DID document on Rooch blockchain\n   */\n  async addVerificationMethod(\n    did: string,\n    verificationMethod: VerificationMethod,\n    relationships?: VerificationRelationship[],\n    options?: RoochVDROperationOptions\n  ): Promise<boolean> {\n    try {\n      this.validateDIDMethod(did);\n\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No signer provided for addVerificationMethod operation',\n          { operation: 'addVerificationMethod', did }\n        );\n      }\n\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Pre-validate permissions by resolving the DID document\n      const currentDoc = await this.resolve(did);\n      if (!currentDoc) {\n        throw createVDRError(IdentityKitErrorCode.DID_NOT_FOUND, `DID document ${did} not found`, {\n          did,\n        });\n      }\n\n      this.debugLog(`Adding verification method to DID: ${did}`);\n      this.debugLog(\n        `Using signer with address: ${didAccountSigner.getRoochAddress().toBech32Address()}`\n      );\n\n      // Check if signer has capabilityDelegation permission\n      const signerAddress = didAccountSigner.getRoochAddress\n        ? didAccountSigner.getRoochAddress().toBech32Address()\n        : null;\n      if (\n        signerAddress &&\n        !this.hasPermissionForOperation(currentDoc, signerAddress, 'capabilityDelegation')\n      ) {\n        this.errorLog(`Signer does not have capabilityDelegation permission for ${did}`);\n        this.debugLog(\n          `Note: DID operations may require the DID account itself to sign, not the controller`\n        );\n        return false;\n      }\n\n      // Validate verification method\n      if (!verificationMethod.publicKeyMultibase) {\n        throw createValidationError(\n          IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n          'Verification method must have publicKeyMultibase',\n          { verificationMethod, did }\n        );\n      }\n\n      // Convert verification relationships to u8 values\n      const relationshipValues = this.convertVerificationRelationships(relationships || []);\n\n      // Check if we need to use scopes version for authentication relationship\n      const hasAuthentication = relationships?.includes('authentication');\n\n      // Create transaction\n      const transaction = this.createTransaction();\n\n      if (hasAuthentication) {\n        // When adding authentication VM, we need to handle scopes\n        const finalScopes = combineScopes(options?.scopes || []);\n\n        // Validate all scopes\n        const scopeValidation = validateScopes(finalScopes);\n        if (!scopeValidation.valid) {\n          throw createValidationError(\n            IdentityKitErrorCode.SCOPE_VALIDATION_FAILED,\n            `Invalid scope format: ${scopeValidation.invalidScopes.join(', ')}`,\n            {\n              invalidScopes: scopeValidation.invalidScopes,\n              allScopes: finalScopes,\n              operation: 'addVerificationMethod',\n            }\n          );\n        }\n\n        // Use the scopes version for authentication VM\n        transaction.callFunction({\n          target: `${this.didContractAddress}::add_verification_method_with_scopes_entry`,\n          args: [\n            Args.string(extractFragmentFromId(verificationMethod.id)),\n            Args.string(verificationMethod.type),\n            Args.string(verificationMethod.publicKeyMultibase),\n            Args.vec('u8', relationshipValues),\n            Args.vec('string', finalScopes),\n          ],\n          maxGas: options?.advanced?.maxGas || 100000000,\n        });\n\n        this.debugLog('Using add_verification_method_with_scopes_entry with scopes:', finalScopes);\n      } else {\n        // Use regular version for non-authentication VM\n        transaction.callFunction({\n          target: `${this.didContractAddress}::add_verification_method_entry`,\n          args: [\n            Args.string(extractFragmentFromId(verificationMethod.id)),\n            Args.string(verificationMethod.type),\n            Args.string(verificationMethod.publicKeyMultibase),\n            Args.vec('u8', relationshipValues),\n          ],\n          maxGas: options?.advanced?.maxGas || 100000000,\n        });\n\n        this.debugLog(\n          'Using regular add_verification_method_entry (no authentication relationship)'\n        );\n      }\n\n      this.debugLog(`Verification method transaction prepared`);\n      this.debugLog(`Fragment:`, extractFragmentFromId(verificationMethod.id));\n      this.debugLog(`Type:`, verificationMethod.type);\n      this.debugLog(`Relationships:`, relationshipValues);\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      this.debugLog(`Transaction execution result:`, {\n        status: result.execution_info.status,\n        gas_used: result.execution_info.gas_used,\n        events_count: result.output?.events?.length || 0,\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        this.errorLog(`Transaction failed:`, result.execution_info);\n        if (result.execution_info.status.type === 'moveabort') {\n          this.errorLog(`Move abort code:`, (result.execution_info.status as any).abort_code);\n          this.errorLog(`Move abort location:`, (result.execution_info.status as any).location);\n        }\n        return false;\n      }\n\n      this.debugLog(`Verification method added successfully`);\n      return true;\n    } catch (error) {\n      this.errorLog(`Error adding verification method to ${did}:`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Remove a verification method from a DID document on Rooch blockchain\n   */\n  async removeVerificationMethod(\n    did: string,\n    id: string,\n    options?: RoochVDROperationOptions\n  ): Promise<boolean> {\n    try {\n      this.validateDIDMethod(did);\n\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No signer provided for removeVerificationMethod operation',\n          { operation: 'removeVerificationMethod', did, id }\n        );\n      }\n\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Pre-validate permissions by resolving the DID document\n      const currentDoc = await this.resolve(did);\n      if (!currentDoc) {\n        throw createVDRError(IdentityKitErrorCode.DID_NOT_FOUND, `DID document ${did} not found`, {\n          did,\n        });\n      }\n\n      // Check if signer has capabilityDelegation permission\n      const signerAddress = didAccountSigner.getRoochAddress\n        ? didAccountSigner.getRoochAddress().toBech32Address()\n        : null;\n      if (\n        signerAddress &&\n        !this.hasPermissionForOperation(currentDoc, signerAddress, 'capabilityDelegation')\n      ) {\n        this.errorLog(`Signer does not have capabilityDelegation permission for ${did}`);\n        return false;\n      }\n\n      // Create transaction\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.didContractAddress}::remove_verification_method_entry`,\n        args: [Args.string(extractFragmentFromId(id))],\n        maxGas: options?.advanced?.maxGas || 100000000,\n      });\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      return result.execution_info.status.type === 'executed';\n    } catch (error) {\n      this.errorLog(`Error removing verification method from ${did}:`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Add a service to a DID document on Rooch blockchain\n   */\n  async addService(\n    did: string,\n    service: ServiceEndpoint,\n    options?: RoochVDROperationOptions\n  ): Promise<boolean> {\n    try {\n      this.validateDIDMethod(did);\n\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No signer provided for addService operation',\n          { operation: 'addService', did }\n        );\n      }\n\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n      // Pre-validate permissions by resolving the DID document\n      const currentDoc = await this.resolve(did);\n      if (!currentDoc) {\n        throw createVDRError(IdentityKitErrorCode.DID_NOT_FOUND, `DID document ${did} not found`, {\n          did,\n        });\n      }\n\n      this.debugLog(`Adding service to DID: ${did}`);\n      this.debugLog(\n        `🗝️ Using signer with address: ${didAccountSigner.getRoochAddress().toBech32Address()}`\n      );\n\n      // Check if signer has capabilityInvocation permission\n      const signerAddress = didAccountSigner.getRoochAddress\n        ? didAccountSigner.getRoochAddress().toBech32Address()\n        : null;\n      if (\n        signerAddress &&\n        !this.hasPermissionForOperation(currentDoc, signerAddress, 'capabilityInvocation')\n      ) {\n        this.errorLog(`Signer does not have capabilityInvocation permission for ${did}`);\n        this.debugLog(\n          `💡 Note: DID operations may require the DID account itself to sign, not the controller`\n        );\n        return false;\n      }\n\n      const standardKeys = ['id', 'type', 'serviceEndpoint'];\n      const additionalProperties = Object.entries(service).reduce(\n        (acc, [key, value]) => {\n          if (!standardKeys.includes(key)) {\n            acc[key] = value ? value.toString() : '';\n          }\n          return acc;\n        },\n        {} as Record<string, string>\n      );\n\n      const propertyKeys = Object.keys(additionalProperties);\n      const propertyValues = Object.values(additionalProperties).map(value =>\n        value ? value.toString() : ''\n      );\n      this.debugLog('service', service);\n      this.debugLog('additionalProperties', additionalProperties);\n      this.debugLog('propertyKeys', propertyKeys);\n      this.debugLog('propertyValues', propertyValues);\n\n      // Create transaction for simple service (without properties)\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.didContractAddress}::add_service_with_properties_entry`,\n        args: [\n          Args.string(extractFragmentFromId(service.id)),\n          Args.string(service.type),\n          Args.string(service.serviceEndpoint),\n          Args.vec('string', propertyKeys),\n          Args.vec('string', propertyValues),\n        ],\n        maxGas: options?.advanced?.maxGas || 100000000,\n      });\n\n      this.debugLog('Executing transaction: add_service_entry');\n      this.debugLog('Args:', [\n        extractFragmentFromId(service.id),\n        service.type,\n        service.serviceEndpoint,\n      ]);\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      this.debugLog('Transaction execution result:', {\n        status: result.execution_info.status,\n        gas_used: result.execution_info.gas_used,\n        events_count: result.output?.events?.length || 0,\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        this.errorLog('Transaction failed:', result.execution_info);\n        if (result.execution_info.status.type === 'moveabort') {\n          this.errorLog('Move abort code:', (result.execution_info.status as any).abort_code);\n          this.errorLog('Move abort location:', (result.execution_info.status as any).location);\n        }\n        return false;\n      }\n\n      this.debugLog('Service added successfully');\n      return true;\n    } catch (error) {\n      this.errorLog(`Error adding service to ${did}:`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Add a service with properties to a DID document on Rooch blockchain\n   */\n  async addServiceWithProperties(\n    did: string,\n    service: ServiceEndpoint & { properties?: Record<string, string> },\n    options?: RoochVDROperationOptions\n  ): Promise<boolean> {\n    try {\n      this.validateDIDMethod(did);\n\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No signer provided for addServiceWithProperties operation',\n          { operation: 'addServiceWithProperties', did }\n        );\n      }\n\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Pre-validate permissions by resolving the DID document\n      const currentDoc = await this.resolve(did);\n      if (!currentDoc) {\n        throw createVDRError(IdentityKitErrorCode.DID_NOT_FOUND, `DID document ${did} not found`, {\n          did,\n        });\n      }\n\n      // Check if signer has capabilityInvocation permission\n      const signerAddress = didAccountSigner.getRoochAddress\n        ? didAccountSigner.getRoochAddress().toBech32Address()\n        : null;\n      if (\n        signerAddress &&\n        !this.hasPermissionForOperation(currentDoc, signerAddress, 'capabilityInvocation')\n      ) {\n        this.errorLog(`Signer does not have capabilityInvocation permission for ${did}`);\n        return false;\n      }\n\n      const properties = service.properties || {};\n      const propertyKeys = Object.keys(properties);\n      const propertyValues = Object.values(properties);\n\n      // Create transaction for service with properties\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.didContractAddress}::add_service_with_properties_entry`,\n        args: [\n          Args.string(extractFragmentFromId(service.id)),\n          Args.string(service.type),\n          Args.string(service.serviceEndpoint),\n          Args.vec('string', propertyKeys),\n          Args.vec('string', propertyValues),\n        ],\n        maxGas: options?.advanced?.maxGas || 100000000,\n      });\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      return result.execution_info.status.type === 'executed';\n    } catch (error) {\n      this.errorLog(`Error adding service with properties to ${did}:`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Remove a service from a DID document on Rooch blockchain\n   */\n  async removeService(\n    did: string,\n    id: string,\n    options?: RoochVDROperationOptions\n  ): Promise<boolean> {\n    try {\n      this.validateDIDMethod(did);\n\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No signer provided for removeService operation',\n          { operation: 'removeService', did, id }\n        );\n      }\n\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Pre-validate permissions by resolving the DID document\n      const currentDoc = await this.resolve(did);\n      if (!currentDoc) {\n        throw createVDRError(IdentityKitErrorCode.DID_NOT_FOUND, `DID document ${did} not found`, {\n          did,\n        });\n      }\n\n      // Check if signer has capabilityInvocation permission\n      const signerAddress = didAccountSigner.getRoochAddress().toBech32Address();\n      if (\n        signerAddress &&\n        !this.hasPermissionForOperation(currentDoc, signerAddress, 'capabilityInvocation')\n      ) {\n        this.errorLog(`Signer does not have capabilityInvocation permission for ${did}`);\n        return false;\n      }\n\n      // Create transaction\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.didContractAddress}::remove_service_entry`,\n        args: [Args.string(extractFragmentFromId(id))],\n        maxGas: options?.advanced?.maxGas || 100000000,\n      });\n\n      // Execute transaction\n      const result = await this.client.signAndExecuteTransaction({\n        transaction,\n        signer: didAccountSigner,\n        option: { withOutput: true },\n      });\n\n      return result.execution_info.status.type === 'executed';\n    } catch (error) {\n      this.errorLog(`Error removing service from ${did}:`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Update verification relationships for a verification method on Rooch blockchain\n   */\n  async updateRelationships(\n    did: string,\n    id: string,\n    add: VerificationRelationship[],\n    remove: VerificationRelationship[],\n    options?: RoochVDROperationOptions\n  ): Promise<boolean> {\n    try {\n      this.validateDIDMethod(did);\n\n      const signer = options?.signer;\n      if (!signer) {\n        throw createSignerError(\n          IdentityKitErrorCode.SIGNER_NOT_AVAILABLE,\n          'No signer provided for updateRelationships operation',\n          { operation: 'updateRelationships', did, id }\n        );\n      }\n\n      const didAccountSigner = await this.convertSigner(signer, options?.keyId);\n\n      // Pre-validate permissions by resolving the DID document\n      const currentDoc = await this.resolve(did);\n      if (!currentDoc) {\n        throw createVDRError(IdentityKitErrorCode.DID_NOT_FOUND, `DID document ${did} not found`, {\n          did,\n        });\n      }\n\n      // Check if signer has capabilityDelegation permission\n      const signerAddress = didAccountSigner.getRoochAddress().toBech32Address();\n      if (\n        signerAddress &&\n        !this.hasPermissionForOperation(currentDoc, signerAddress, 'capabilityDelegation')\n      ) {\n        this.errorLog(`Signer does not have capabilityDelegation permission for ${did}`);\n        return false;\n      }\n\n      const fragment = extractFragmentFromId(id);\n\n      // Add relationships\n      for (const relationship of add) {\n        const relationshipValue = this.convertVerificationRelationship(relationship);\n        const transaction = this.createTransaction();\n        transaction.callFunction({\n          target: `${this.didContractAddress}::add_to_verification_relationship_entry`,\n          args: [Args.string(fragment), Args.u8(relationshipValue)],\n          maxGas: options?.advanced?.maxGas || 100000000,\n        });\n\n        const result = await this.client.signAndExecuteTransaction({\n          transaction,\n          signer: didAccountSigner,\n          option: { withOutput: true },\n        });\n\n        if (result.execution_info.status.type !== 'executed') {\n          return false;\n        }\n      }\n\n      // Remove relationships\n      for (const relationship of remove) {\n        const relationshipValue = this.convertVerificationRelationship(relationship);\n        const transaction = this.createTransaction();\n        transaction.callFunction({\n          target: `${this.didContractAddress}::remove_from_verification_relationship_entry`,\n          args: [Args.string(fragment), Args.u8(relationshipValue)],\n          maxGas: options?.advanced?.maxGas || 100000000,\n        });\n\n        const result = await this.client.signAndExecuteTransaction({\n          transaction,\n          signer: didAccountSigner,\n          option: { withOutput: true },\n        });\n\n        if (result.execution_info.status.type !== 'executed') {\n          return false;\n        }\n      }\n\n      return true;\n    } catch (error) {\n      this.errorLog(`Error updating relationships for ${did}:`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Create a new Rooch transaction instance\n   */\n  private createTransaction(): Transaction {\n    return new Transaction();\n  }\n\n  /**\n   * Convert verification relationships to u8 values based on did.move constants\n   */\n  private convertVerificationRelationships(relationships: VerificationRelationship[]): number[] {\n    return relationships.map(rel => this.convertVerificationRelationship(rel));\n  }\n\n  /**\n   * Convert a single verification relationship to u8 value\n   */\n  private convertVerificationRelationship(relationship: VerificationRelationship): number {\n    switch (relationship) {\n      case 'authentication':\n        return 0; // VERIFICATION_RELATIONSHIP_AUTHENTICATION\n      case 'assertionMethod':\n        return 1; // VERIFICATION_RELATIONSHIP_ASSERTION_METHOD\n      case 'capabilityInvocation':\n        return 2; // VERIFICATION_RELATIONSHIP_CAPABILITY_INVOCATION\n      case 'capabilityDelegation':\n        return 3; // VERIFICATION_RELATIONSHIP_CAPABILITY_DELEGATION\n      case 'keyAgreement':\n        return 4; // VERIFICATION_RELATIONSHIP_KEY_AGREEMENT\n      default:\n        throw createValidationError(\n          IdentityKitErrorCode.INVALID_PARAMETER,\n          `Unknown verification relationship: ${relationship}`,\n          {\n            relationship,\n            validRelationships: [\n              'authentication',\n              'assertionMethod',\n              'keyAgreement',\n              'capabilityInvocation',\n              'capabilityDelegation',\n            ],\n          }\n        );\n    }\n  }\n\n  /**\n   * Check if a signer has permission to perform an operation on a DID\n   */\n  private hasPermissionForOperation(\n    didDocument: DIDDocument,\n    signerAddress: string,\n    requiredRelationship: VerificationRelationship\n  ): boolean {\n    try {\n      this.debugLog(`Checking permission for signer ${signerAddress} on DID ${didDocument.id}`);\n      this.debugLog(`Required relationship: ${requiredRelationship}`);\n      this.debugLog(`DID controllers:`, didDocument.controller);\n\n      // Create possible DID formats for the signer\n      const signerDIDHex = `did:rooch:${signerAddress}`;\n      this.debugLog(`Signer DID (hex):`, signerDIDHex);\n\n      // Extract DID address from the DID document ID\n      const didMatch = didDocument.id.match(/did:rooch:(.+)$/);\n      const didAddress = didMatch ? didMatch[1] : null;\n\n      this.debugLog(`DID account address:`, didAddress);\n      this.debugLog(`Signer address:`, signerAddress);\n\n      // **CRITICAL**: In Rooch DID system, operations must be signed by the DID account itself\n      // The DID account is created by the contract and is different from the controller\n      if (didAddress && signerAddress.toLowerCase() === didAddress.toLowerCase()) {\n        this.debugLog(`Permission granted: Signer is the DID account itself`);\n        return true;\n      }\n\n      // If signer is not the DID account, this will fail at contract level\n      this.errorLog(`Permission issue: Signer is not the DID account`);\n      this.debugLog(`In Rooch DID system:`);\n      this.debugLog(`   - DID account address: ${didAddress}`);\n      this.debugLog(`   - Signer address: ${signerAddress}`);\n      this.debugLog(`   - Operations must be signed by the DID account, not the controller`);\n      this.debugLog(`   - DID accounts can only sign via SessionKey or similar mechanism`);\n\n      // Legacy permission check (will likely fail at contract level)\n      // According to Rooch DID documentation, controllers should have management permissions\n      // Check if the signer is in the controller list\n      if (Array.isArray(didDocument.controller)) {\n        for (const controller of didDocument.controller) {\n          this.debugLog(`Checking controller:`, controller);\n\n          // Direct match (hex format)\n          if (controller === signerDIDHex) {\n            this.debugLog(`Signer is a controller (hex format) but may fail at contract level`);\n            return true;\n          }\n\n          // Try to handle bech32 format controllers\n          if (controller.includes('rooch1')) {\n            // For bech32 controllers, we need to convert addresses\n            // For now, we'll be permissive for controllers since the Rooch DID system\n            // should handle the actual authorization at the blockchain level\n            this.debugLog(\n              `Signer appears to be a controller (bech32 format) but may fail at contract level`\n            );\n            return true;\n          }\n\n          // Extract address from controller DID and compare\n          const controllerMatch = controller.match(/did:rooch:(.+)$/);\n          if (controllerMatch) {\n            const controllerAddress = controllerMatch[1];\n            if (\n              controllerAddress === signerAddress ||\n              controllerAddress.toLowerCase() === signerAddress.toLowerCase()\n            ) {\n              this.debugLog(`Address match found but may fail at contract level`);\n              return true;\n            }\n          }\n        }\n      }\n\n      // Check if signer controls any verification method with the required relationship\n      if (!didDocument.verificationMethod) {\n        this.debugLog(`No verification methods found`);\n        return false;\n      }\n\n      for (const vm of didDocument.verificationMethod) {\n        this.debugLog(`Checking verification method: ${vm.id}, controller: ${vm.controller}`);\n\n        // Check if this verification method is controlled by the signer\n        const isControlledBySigner =\n          vm.controller === signerDIDHex ||\n          vm.controller === didDocument.id ||\n          (Array.isArray(didDocument.controller) && didDocument.controller.includes(signerDIDHex));\n\n        if (isControlledBySigner) {\n          this.debugLog(`VM ${vm.id} is controlled by signer, checking relationships...`);\n\n          // Check if this verification method has the required relationship\n          const relationshipArray = didDocument[requiredRelationship] as (string | object)[];\n          if (relationshipArray) {\n            this.debugLog(`Relationship array for ${requiredRelationship}:`, relationshipArray);\n\n            const hasRelationship = relationshipArray.some(item => {\n              if (typeof item === 'string') {\n                return item === vm.id;\n              } else if (typeof item === 'object' && (item as any).id) {\n                return (item as any).id === vm.id;\n              }\n              return false;\n            });\n\n            if (hasRelationship) {\n              this.debugLog(`VM has required relationship but signer may not be DID account`);\n              return true;\n            }\n          }\n        }\n      }\n\n      this.errorLog(`Permission denied: No matching controller or VM relationship found`);\n      return false;\n    } catch (error) {\n      this.errorLog('Error checking permission:', error);\n      return false;\n    }\n  }\n\n  /**\n   * Parse DIDCreatedEvent using BCS schema and return the DID address\n   */\n  private parseDIDCreatedEventAndGetDID(event: EventView): string {\n    try {\n      const eventData = parseDIDCreatedEvent(event.event_data);\n      return eventData.did;\n    } catch (error) {\n      this.errorLog('BCS parsing failed:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Get the last created DID address from the most recent store operation\n   */\n  getLastCreatedDIDAddress(): string | undefined {\n    return this.lastCreatedDIDAddress;\n  }\n\n  /**\n   * Create a RoochVDR instance with default configuration\n   */\n  static createDefault(\n    network: 'local' | 'dev' | 'test' | 'main' = 'test',\n    rpcUrl: string | undefined = undefined\n  ): RoochVDR {\n    return new RoochVDR({\n      rpcUrl: rpcUrl || RoochVDR.getRoochNodeUrl(network),\n      network,\n    });\n  }\n\n  /**\n   * Get network-specific RPC URL\n   */\n  private static getRoochNodeUrl(network: 'local' | 'dev' | 'test' | 'main'): string {\n    // Map our network names to Rooch SDK network names\n    const networkMap: { [key: string]: string } = {\n      local: 'localnet',\n      dev: 'devnet',\n      test: 'testnet',\n      main: 'mainnet',\n    };\n\n    const roochNetwork = networkMap[network] || network;\n    return sdkGetRoochNodeUrl(roochNetwork as any);\n  }\n}\n","import { base58btc } from 'multiformats/bases/base58';\nimport { base64pad, base64, base64url, base64urlpad } from 'multiformats/bases/base64';\nimport { base16 } from 'multiformats/bases/base16';\nimport { bytesToString, stringToBytes } from '../utils/bytes';\nimport { IdentityKitErrorCode, createMultibaseError } from '../errors';\n\n/**\n * Supported multibase names – use these with the generic `encode()` API.\n */\nexport type MultibaseName =\n  | 'base58btc'\n  | 'base64pad'\n  | 'base64'\n  | 'base64url'\n  | 'base64urlpad'\n  | 'base16';\n\ntype MultibaseCodecImpl = {\n  encode: (bytes: Uint8Array) => string;\n  decode: (encoded: string) => Uint8Array;\n};\n\nconst ENCODER_MAP: Record<MultibaseName, MultibaseCodecImpl> = {\n  base58btc,\n  base64pad,\n  base64,\n  base64url,\n  base64urlpad,\n  base16,\n};\n\n/**\n * Base multibase codec implementation\n * Provides basic encoding/decoding functionality without key type awareness\n */\nexport class MultibaseCodec {\n  /**\n   * Generic encode\n   * Example: `MultibaseCodec.encode(bytes, 'base64url')`\n   */\n  static encode(data: Uint8Array | string, base: MultibaseName): string {\n    const encoder = ENCODER_MAP[base];\n    if (!encoder) {\n      throw createMultibaseError(\n        IdentityKitErrorCode.MULTIBASE_ENCODE_FAILED,\n        `Unsupported multibase: ${base}`,\n        { base, supportedBases: Object.keys(ENCODER_MAP) }\n      );\n    }\n    const bytes = typeof data === 'string' ? stringToBytes(data) : data;\n    return encoder.encode(bytes);\n  }\n\n  /**\n   * Encode bytes to base58btc format\n   * @param bytes The bytes to encode\n   * @returns base58btc encoded string with 'z' prefix\n   */\n  static encodeBase58btc(bytes: Uint8Array): string {\n    return this.encode(bytes, 'base58btc');\n  }\n\n  /**\n   * Encode bytes to base64pad format\n   * @param bytes The bytes to encode\n   * @returns base64pad encoded string with 'M' prefix\n   */\n  static encodeBase64pad(data: Uint8Array | string): string {\n    return this.encode(data, 'base64pad');\n  }\n\n  /**\n   * Encode bytes to base16 (hex) format\n   * @param bytes The bytes to encode\n   * @returns base16 encoded string with 'f' prefix\n   */\n  static encodeBase16(bytes: Uint8Array): string {\n    return this.encode(bytes, 'base16');\n  }\n\n  /**\n   * Encode bytes to base64 format\n   * @param bytes The bytes to encode\n   * @returns base64 encoded string\n   */\n  static encodeBase64(data: Uint8Array | string): string {\n    return this.encode(data, 'base64');\n  }\n\n  /**\n   * Encode bytes to base64url format (RFC4648 URL-safe, no padding)\n   * @param bytes The bytes to encode\n   * @returns base64url encoded string with 'u' prefix\n   */\n  static encodeBase64url(data: Uint8Array | string): string {\n    return this.encode(data, 'base64url');\n  }\n\n  /**\n   * Encode bytes to base64urlpad format (URL-safe with padding)\n   * @param bytes The bytes to encode\n   * @returns base64urlpad encoded string with 'U' prefix\n   */\n  static encodeBase64urlpad(data: Uint8Array | string): string {\n    return this.encode(data, 'base64urlpad');\n  }\n\n  /**\n   * Decode base58btc string to bytes\n   * @param encoded The base58btc encoded string\n   * @returns decoded bytes\n   */\n  static decodeBase58btc(encoded: string): Uint8Array {\n    return base58btc.decode(encoded);\n  }\n\n  /**\n   * Decode base64pad string to bytes\n   * @param encoded The base64pad encoded string\n   * @returns decoded bytes\n   */\n  static decodeBase64pad(encoded: string): Uint8Array {\n    return base64pad.decode(encoded);\n  }\n\n  /**\n   * Decode base16 string to bytes\n   * @param encoded The base16 encoded string\n   * @returns decoded bytes\n   */\n  static decodeBase16(encoded: string): Uint8Array {\n    return base16.decode(encoded);\n  }\n\n  /**\n   * Decode base64 string to bytes\n   * @param encoded The base64 encoded string\n   * @returns decoded bytes\n   */\n  static decodeBase64(encoded: string): Uint8Array {\n    return base64.decode(encoded);\n  }\n\n  /**\n   * Decode base64url string to bytes\n   * @param encoded The base64url encoded string\n   * @returns decoded bytes\n   */\n  static decodeBase64url(encoded: string): Uint8Array {\n    return base64url.decode(encoded);\n  }\n\n  /**\n   * Decode base64url string to string\n   * @param encoded The base64url encoded string\n   * @returns decoded string\n   */\n  static decodeBase64urlToString(encoded: string): string {\n    return bytesToString(this.decodeBase64url(encoded));\n  }\n\n  /**\n   * Decode base64urlpad string to bytes\n   * @param encoded The base64urlpad encoded string\n   * @returns decoded bytes\n   */\n  static decodeBase64urlpad(encoded: string): Uint8Array {\n    return base64urlpad.decode(encoded);\n  }\n\n  /**\n   * Decode base64urlpad string to string\n   * @param encoded The base64urlpad encoded string\n   * @returns decoded string\n   */\n  static decodeBase64urlpadToString(encoded: string): string {\n    return bytesToString(this.decodeBase64urlpad(encoded));\n  }\n\n  /**\n   * Decode multibase encoded string to bytes\n   * After multiformats v9, there is no longer a single \"universal base\" object;\n   * the official recommendation is to manually dispatch prefixes between the few *.decoder objects you use.\n   * @param encoded The multibase encoded string\n   * @returns decoded bytes\n   */\n  static decode(encoded: string): Uint8Array {\n    // Multibase prefix is always the first character\n    const prefix = encoded[0];\n    switch (prefix) {\n      case 'z': // base58btc\n        return base58btc.decode(encoded);\n      case 'M': // base64pad (RFC4648 with padding)\n        return base64pad.decode(encoded);\n      case 'f': // base16 (hex, lowercase)\n        return base16.decode(encoded);\n      case 'm': // base64 (no padding)\n        return base64.decode(encoded);\n      case 'u': // base64url (no padding)\n        return base64url.decode(encoded);\n      case 'U': // base64urlpad (with padding)\n        return base64urlpad.decode(encoded);\n      default:\n        throw createMultibaseError(\n          IdentityKitErrorCode.MULTIBASE_DECODE_FAILED,\n          `Unsupported multibase prefix: ${prefix}`,\n          { prefix, supportedPrefixes: ['z', 'M', 'm', 'u', 'U', 'f'] }\n        );\n    }\n  }\n}\n","import { IdentityKitErrorCode, createValidationError } from '../errors';\n\nexport function stringToBytes(str: string): Uint8Array {\n  if (typeof TextEncoder !== 'undefined') {\n    return new TextEncoder().encode(str);\n  }\n  // Node.js < 16 fallback using Buffer\n  if (typeof Buffer !== 'undefined' && typeof Buffer.from === 'function') {\n    return Uint8Array.from(Buffer.from(str, 'utf-8'));\n  }\n  throw createValidationError(\n    IdentityKitErrorCode.ENVIRONMENT_NOT_SUPPORTED,\n    'No TextEncoder or Buffer available in this environment.',\n    {\n      environment: typeof globalThis,\n      textEncoderAvailable: typeof TextEncoder !== 'undefined',\n      bufferAvailable: typeof Buffer !== 'undefined',\n    }\n  );\n}\n\nexport function bytesToString(bytes: Uint8Array): string {\n  if (typeof TextDecoder !== 'undefined') {\n    return new TextDecoder('utf-8').decode(bytes);\n  }\n  // Node.js < 16 fallback using Buffer\n  if (typeof Buffer !== 'undefined' && typeof Buffer.from === 'function') {\n    return Buffer.from(bytes).toString('utf-8');\n  }\n  throw createValidationError(\n    IdentityKitErrorCode.ENVIRONMENT_NOT_SUPPORTED,\n    'No TextDecoder or Buffer available in this environment.',\n    {\n      environment: typeof globalThis,\n      textDecoderAvailable: typeof TextDecoder !== 'undefined',\n      bufferAvailable: typeof Buffer !== 'undefined',\n    }\n  );\n}\n\nexport function base64urlToBytes(base64url: string): Uint8Array {\n  // Add padding if needed\n  const padding = base64url.length % 4;\n  const paddedBase64url = base64url + '='.repeat(padding === 0 ? 0 : 4 - padding);\n\n  // Convert base64url to base64\n  const base64 = paddedBase64url.replace(/-/g, '+').replace(/_/g, '/');\n\n  // Decode to bytes\n  const binaryString = atob(base64);\n  const bytes = new Uint8Array(binaryString.length);\n  for (let i = 0; i < binaryString.length; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n  return bytes;\n}\n\nexport const Bytes = {\n  stringToBytes,\n  bytesToString,\n  base64urlToBytes,\n};\n\nexport default Bytes;\n","import { SignatureScheme } from '@roochnetwork/rooch-sdk';\nimport { IdentityKitErrorCode, createValidationError } from '../errors';\n\n// Cryptographic types and constants\n\n/**\n * Readable enum for supported verification key suites.\n *\n * NOTE: Replaces the old `KEY_TYPE` const object. Use this in new code to\n * improve clarity. Values keep the same long-form strings to avoid breaking\n * existing behavior when serialized into DID Documents.\n */\nexport enum KeyType {\n  ED25519 = 'Ed25519VerificationKey2020',\n  SECP256K1 = 'EcdsaSecp256k1VerificationKey2019',\n  ECDSAR1 = 'EcdsaSecp256r1VerificationKey2019',\n}\n\n/**\n * @deprecated Will be removed in the next major version. Use `KeyType` enum instead.\n */\nexport const KEY_TYPE = KeyType;\n\n/**\n * Type guard to check if a string is a valid KeyType\n */\nexport function isKeyType(value: string): value is KeyType {\n  return Object.values(KeyType).includes(value as KeyType);\n}\n\n/**\n * Convert a string to KeyType, with runtime validation\n * @throws Error if the string is not a valid KeyType\n */\nexport function toKeyType(value: string): KeyType {\n  if (isKeyType(value)) {\n    return value;\n  }\n  throw createValidationError(\n    IdentityKitErrorCode.KEY_TYPE_NOT_SUPPORTED,\n    `Invalid key type: ${value}`,\n    { value, supportedTypes: Object.values(KeyType) }\n  );\n}\n\nexport function roochSignatureSchemeToKeyType(scheme: SignatureScheme): KeyType {\n  if (scheme === 'Secp256k1') {\n    return KeyType.SECP256K1;\n  } else if (scheme === 'ED25519') {\n    return KeyType.ED25519;\n  } else if (scheme === 'EcdsaR1') {\n    return KeyType.ECDSAR1;\n  }\n  throw createValidationError(\n    IdentityKitErrorCode.KEY_TYPE_NOT_SUPPORTED,\n    `Unsupported Rooch signature scheme: ${scheme}`,\n    { scheme, supportedSchemes: ['Secp256k1', 'ED25519', 'EcdsaR1'] }\n  );\n}\n\nexport function keyTypeToRoochSignatureScheme(keyType: KeyType): SignatureScheme {\n  if (keyType === KeyType.SECP256K1) {\n    return 'Secp256k1';\n  } else if (keyType === KeyType.ED25519) {\n    return 'ED25519';\n  } else if (keyType === KeyType.ECDSAR1) {\n    return 'EcdsaR1';\n  }\n  throw createValidationError(\n    IdentityKitErrorCode.KEY_TYPE_NOT_SUPPORTED,\n    `Unsupported key type: ${keyType}`,\n    { keyType, supportedTypes: Object.values(KeyType) }\n  );\n}\n\n/**\n * https://www.w3.org/TR/webauthn-2/#typedefdef-cosealgorithmidentifier\n * Convert a WebAuthn public key algorithm to KeyType, with runtime validation\n * @throws Error if the string is not a valid KeyType\n */\nexport function algorithmToKeyType(algorithm: number): KeyType | undefined {\n  switch (algorithm) {\n    case -8:\n      return KeyType.ED25519;\n    case -7:\n      return KeyType.ECDSAR1;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Convert a KeyType to WebAuthn algorithm identifier\n */\nexport function keyTypeToAlgorithm(keyType: KeyType): number | undefined {\n  switch (keyType) {\n    case KeyType.ED25519:\n      return -8;\n    case KeyType.ECDSAR1:\n      return -7;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Get list of supported WebAuthn algorithms\n */\nexport function getSupportedAlgorithms(): number[] {\n  return [-8, -7];\n}\n\n/**\n * Type that represents either a KeyType or a string\n * Useful for functions that need to accept both strict KeyType and general string values\n */\nexport type KeyTypeInput = KeyType | string;\n\n/**\n * Represents the information needed to create a new operational key.\n */\nexport interface OperationalKeyInfo {\n  idFragment?: string; // Optional fragment for the key id (e.g., 'key-2'). If not provided, one might be generated.\n  type: string; // Cryptographic suite of the key, e.g., Ed25519VerificationKey2020\n  publicKeyMaterial: Uint8Array | JsonWebKey; // The public key material\n  controller?: string; // Defaults to the master DID if not provided\n}\n","import { KeyType, KEY_TYPE } from '../types/crypto';\nimport { MultibaseCodec } from './base';\nimport { IdentityKitErrorCode, createMultibaseError, createValidationError } from '../errors';\n\n/**\n * Key multibase codec implementation\n * Handles encoding/decoding of cryptographic keys with type information\n */\nexport class KeyMultibaseCodec {\n  private static readonly ED25519_PREFIX = new Uint8Array([0xed, 0x01]);\n  private static readonly SECP256K1_PREFIX = new Uint8Array([0xe7, 0x01]);\n  private static readonly ECDSA_R1_PREFIX = new Uint8Array([0x12, 0x00]);\n  private static readonly ED25519_KEY_LENGTH = 32;\n  private static readonly SECP256K1_KEY_LENGTH = 33;\n  private static readonly ECDSA_R1_KEY_LENGTH = 33;\n\n  /**\n   * Encode public key with multicodec prefix\n   * @param bytes The public key bytes\n   * @param keyType The key type\n   * @returns multibase encoded string\n   */\n  static encodeWithType(bytes: Uint8Array, keyType: KeyType): string {\n    // Validate key length\n    const expectedLength = this.getExpectedKeyLength(keyType);\n    if (bytes.length !== expectedLength) {\n      throw createValidationError(\n        IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n        `Invalid key length for ${keyType}. Expected ${expectedLength} bytes, got ${bytes.length}`,\n        { keyType, expectedLength, actualLength: bytes.length }\n      );\n    }\n\n    const prefix = this.getMulticodecPrefix(keyType);\n    const prefixedKey = this.concatenateBytes(prefix, bytes);\n    return MultibaseCodec.encodeBase58btc(prefixedKey);\n  }\n\n  /**\n   * Decode multibase encoded key\n   * @param encoded The multibase encoded string\n   * @returns The key type and public key bytes\n   */\n  static decodeWithType(encoded: string): { keyType: KeyType; bytes: Uint8Array } {\n    try {\n      const decoded = MultibaseCodec.decodeBase58btc(encoded);\n      if (decoded.length < 2) {\n        throw createMultibaseError(\n          IdentityKitErrorCode.MULTIBASE_DECODE_FAILED,\n          'Invalid key format: too short',\n          { encoded, minimumLength: 2, actualLength: decoded.length }\n        );\n      }\n\n      const keyType = this.extractKeyType(decoded);\n      const bytes = this.extractBytes(decoded);\n\n      // Validate key length\n      const expectedLength = this.getExpectedKeyLength(keyType);\n      if (bytes.length !== expectedLength) {\n        throw createValidationError(\n          IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n          `Invalid key length for ${keyType}. Expected ${expectedLength} bytes, got ${bytes.length}`,\n          { keyType, expectedLength, actualLength: bytes.length }\n        );\n      }\n\n      return { keyType, bytes };\n    } catch (error) {\n      if (error instanceof Error && error.message === 'Non-base58btc character') {\n        throw createMultibaseError(\n          IdentityKitErrorCode.MULTIBASE_DECODE_FAILED,\n          'Invalid multibase format',\n          { encoded }\n        );\n      }\n      throw error;\n    }\n  }\n\n  private static getMulticodecPrefix(keyType: KeyType): Uint8Array {\n    switch (keyType) {\n      case KEY_TYPE.ED25519:\n        return this.ED25519_PREFIX;\n      case KEY_TYPE.SECP256K1:\n        return this.SECP256K1_PREFIX;\n      case KEY_TYPE.ECDSAR1:\n        return this.ECDSA_R1_PREFIX;\n      default:\n        throw createValidationError(\n          IdentityKitErrorCode.KEY_TYPE_NOT_SUPPORTED,\n          `Unsupported key type: ${keyType}`,\n          { keyType, supportedTypes: [KEY_TYPE.ED25519, KEY_TYPE.SECP256K1, KEY_TYPE.ECDSAR1] }\n        );\n    }\n  }\n\n  private static concatenateBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n    const result = new Uint8Array(a.length + b.length);\n    result.set(a);\n    result.set(b, a.length);\n    return result;\n  }\n\n  private static extractKeyType(prefixedBytes: Uint8Array): KeyType {\n    if (prefixedBytes[0] === 0xed && prefixedBytes[1] === 0x01) {\n      return KEY_TYPE.ED25519;\n    } else if (prefixedBytes[0] === 0xe7 && prefixedBytes[1] === 0x01) {\n      return KEY_TYPE.SECP256K1;\n    } else if (prefixedBytes[0] === 0x12 && prefixedBytes[1] === 0x00) {\n      return KEY_TYPE.ECDSAR1;\n    }\n    throw createMultibaseError(\n      IdentityKitErrorCode.MULTIBASE_DECODE_FAILED,\n      'Unknown key type prefix',\n      { prefix: Array.from(prefixedBytes.slice(0, 2)) }\n    );\n  }\n\n  private static extractBytes(prefixedBytes: Uint8Array): Uint8Array {\n    return prefixedBytes.slice(2);\n  }\n\n  private static getExpectedKeyLength(keyType: KeyType): number {\n    switch (keyType) {\n      case KEY_TYPE.ED25519:\n        return this.ED25519_KEY_LENGTH;\n      case KEY_TYPE.SECP256K1:\n        return this.SECP256K1_KEY_LENGTH;\n      case KEY_TYPE.ECDSAR1:\n        return this.ECDSA_R1_KEY_LENGTH;\n      default:\n        throw createValidationError(\n          IdentityKitErrorCode.KEY_TYPE_NOT_SUPPORTED,\n          `Unsupported key type: ${keyType}`,\n          { keyType, supportedTypes: [KEY_TYPE.ED25519, KEY_TYPE.SECP256K1, KEY_TYPE.ECDSAR1] }\n        );\n    }\n  }\n}\n","import { KeyType } from '../types/crypto';\nimport { MultibaseCodec } from './base';\nimport { KeyMultibaseCodec } from './key';\nimport { IdentityKitErrorCode, createDIDError } from '../errors';\n\n/**\n * DID key codec implementation\n * Handles encoding/decoding of did:key identifiers\n */\nexport class DidKeyCodec {\n  /**\n   * Generate did:key from public key\n   * @param publicKey The public key bytes\n   * @param keyType The key type\n   * @returns did:key identifier\n   */\n  static generateDidKey(publicKey: Uint8Array, keyType: KeyType): string {\n    // KeyMultibaseCodec.encodeWithType will validate key length\n    const multibase = KeyMultibaseCodec.encodeWithType(publicKey, keyType);\n    return `did:key:${multibase}`;\n  }\n\n  /**\n   * Parse did:key to get key type and public key\n   * @param didKey The did:key identifier\n   * @returns The key type and public key bytes\n   */\n  static parseDidKey(didKey: string): { keyType: KeyType; publicKey: Uint8Array } {\n    if (!didKey.startsWith('did:key:')) {\n      throw createDIDError(IdentityKitErrorCode.DID_INVALID_FORMAT, 'Invalid did:key format', {\n        didKey,\n        expectedPrefix: 'did:key:',\n      });\n    }\n    const multibase = didKey.substring(8);\n    const { keyType, bytes } = KeyMultibaseCodec.decodeWithType(multibase);\n    return { keyType, publicKey: bytes };\n  }\n}\n","import { CryptoProvider } from '../providers';\nimport { KEY_TYPE, KeyType } from '../../types';\nimport { base64urlToBytes } from '../../utils/bytes';\nimport { IdentityKitErrorCode, createCryptoError } from '../../errors';\n\n// Universal helper to obtain a Web Crypto implementation in both browser and Node.js environments.\n// 1. In browsers (and newer versions of Node.js that expose `globalThis.crypto`) we return the global object.\n// 2. In other Node.js environments we fall back to the built-in `crypto.webcrypto` implementation that was\n//    imported above. This avoids using CommonJS `require`, which is not available in ESM bundles.\nfunction getCrypto(): Crypto {\n  // Use the built-in Web Crypto implementation exposed on globalThis.\n  if (typeof globalThis !== 'undefined' && (globalThis as any).crypto) {\n    return (globalThis as any).crypto as Crypto;\n  }\n\n  // If crypto is unavailable (e.g., very old Node versions), throw a descriptive error.\n  throw createCryptoError(\n    IdentityKitErrorCode.ENVIRONMENT_NOT_SUPPORTED,\n    'Web Crypto API is not available in the current runtime',\n    { environment: typeof globalThis, cryptoAvailable: false }\n  );\n}\n\nexport class Ed25519Provider implements CryptoProvider {\n  private crypto: Crypto;\n\n  constructor() {\n    this.crypto = getCrypto();\n  }\n\n  async generateKeyPair(): Promise<{ publicKey: Uint8Array; privateKey: Uint8Array }> {\n    const generated = await this.crypto.subtle.generateKey(\n      {\n        name: 'Ed25519',\n      },\n      true,\n      ['sign', 'verify']\n    );\n\n    if (!('publicKey' in generated)) {\n      throw createCryptoError(\n        IdentityKitErrorCode.CRYPTO_OPERATION_FAILED,\n        'Ed25519 generateKey did not return a key pair',\n        { keyType: 'Ed25519', operation: 'generateKeyPair' }\n      );\n    }\n    const { publicKey, privateKey } = generated;\n\n    const exportedPublic = new Uint8Array(await this.crypto.subtle.exportKey('raw', publicKey));\n    const exportedPrivate = new Uint8Array(await this.crypto.subtle.exportKey('pkcs8', privateKey));\n\n    return {\n      publicKey: exportedPublic,\n      privateKey: exportedPrivate,\n    };\n  }\n\n  async sign(data: Uint8Array, privateKey: Uint8Array | CryptoKey): Promise<Uint8Array> {\n    let key: CryptoKey;\n    if (privateKey instanceof Uint8Array) {\n      key = await this.crypto.subtle.importKey(\n        'pkcs8',\n        privateKey,\n        {\n          name: 'Ed25519',\n        },\n        false,\n        ['sign']\n      );\n    } else {\n      key = privateKey;\n    }\n\n    const signature = await this.crypto.subtle.sign('Ed25519', key, data);\n\n    return new Uint8Array(signature);\n  }\n\n  async verify(\n    data: Uint8Array,\n    signature: Uint8Array,\n    publicKey: Uint8Array | JsonWebKey\n  ): Promise<boolean> {\n    let key: CryptoKey;\n    if (publicKey instanceof Uint8Array) {\n      key = await this.crypto.subtle.importKey(\n        'raw',\n        publicKey,\n        {\n          name: 'Ed25519',\n        },\n        false,\n        ['verify']\n      );\n    } else {\n      key = await this.crypto.subtle.importKey(\n        'jwk',\n        publicKey,\n        {\n          name: 'Ed25519',\n        },\n        false,\n        ['verify']\n      );\n    }\n\n    return await this.crypto.subtle.verify('Ed25519', key, signature, data);\n  }\n\n  getKeyType(): KeyType {\n    return KEY_TYPE.ED25519;\n  }\n\n  async derivePublicKey(privateKey: Uint8Array): Promise<Uint8Array> {\n    // Import private key as exportable\n    const cryptoKey = await this.crypto.subtle.importKey(\n      'pkcs8',\n      privateKey,\n      { name: 'Ed25519' },\n      true,\n      ['sign']\n    );\n\n    // Generate a temporary key pair and use the same private key to get corresponding public key\n    // This is a workaround since Web Crypto API doesn't allow direct derivation\n    // We'll export as JWK and extract the public key coordinates\n    const jwk = await this.crypto.subtle.exportKey('jwk', cryptoKey);\n    if (!jwk.x) {\n      throw createCryptoError(\n        IdentityKitErrorCode.CRYPTO_KEY_DERIVATION_FAILED,\n        'Failed to derive public key from private key',\n        { keyType: 'Ed25519', operation: 'derivePublicKey' }\n      );\n    }\n\n    // Convert base64url public key to raw bytes\n    const publicKeyBytes = base64urlToBytes(jwk.x);\n    return publicKeyBytes;\n  }\n}\n","import { secp256k1 } from '@noble/curves/secp256k1';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { CryptoProvider } from '../providers';\nimport { KEY_TYPE, KeyType } from '../../types';\nimport { IdentityKitErrorCode, createCryptoError } from '../../errors';\n\nexport class Secp256k1Provider implements CryptoProvider {\n  async generateKeyPair(): Promise<{ publicKey: Uint8Array; privateKey: Uint8Array }> {\n    const privateKey = secp256k1.utils.randomPrivateKey();\n    const publicKey = secp256k1.getPublicKey(privateKey, true); // compressed format\n\n    return {\n      publicKey,\n      privateKey,\n    };\n  }\n\n  async sign(data: Uint8Array, privateKey: Uint8Array | CryptoKey): Promise<Uint8Array> {\n    if (privateKey instanceof CryptoKey) {\n      throw createCryptoError(\n        IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n        'CryptoKey is not supported for Secp256k1 signing',\n        { keyType: 'Secp256k1', operation: 'sign', privateKeyType: 'CryptoKey' }\n      );\n    }\n    const msgHash = sha256(data);\n    const signature = secp256k1.sign(msgHash, privateKey);\n    return signature.toCompactRawBytes();\n  }\n\n  async verify(\n    data: Uint8Array,\n    signature: Uint8Array,\n    publicKey: Uint8Array | JsonWebKey\n  ): Promise<boolean> {\n    if (!(publicKey instanceof Uint8Array)) {\n      throw createCryptoError(\n        IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n        'JsonWebKey is not supported for Secp256k1 verification',\n        { keyType: 'Secp256k1', operation: 'verify', publicKeyType: 'JsonWebKey' }\n      );\n    }\n    const msgHash = sha256(data);\n    return secp256k1.verify(signature, msgHash, publicKey);\n  }\n\n  getKeyType(): KeyType {\n    return KEY_TYPE.SECP256K1;\n  }\n\n  async derivePublicKey(privateKey: Uint8Array): Promise<Uint8Array> {\n    return secp256k1.getPublicKey(privateKey, true); // compressed format\n  }\n}\n","import { p256 } from '@noble/curves/p256';\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils';\nimport { CryptoProvider } from '../providers';\nimport { KEY_TYPE, KeyType } from '../../types';\nimport { base64urlToBytes } from '../../utils/bytes';\nimport { IdentityKitErrorCode, createCryptoError, createValidationError } from '../../errors';\n\n// Universal helper to obtain a Web Crypto implementation in both browser and Node.js environments.\nfunction getCrypto(): Crypto {\n  if (typeof globalThis !== 'undefined' && (globalThis as any).crypto) {\n    return (globalThis as any).crypto as Crypto;\n  }\n  throw createCryptoError(\n    IdentityKitErrorCode.ENVIRONMENT_NOT_SUPPORTED,\n    'Web Crypto API is not available in the current runtime',\n    { environment: typeof globalThis, cryptoAvailable: false }\n  );\n}\n\nexport class EcdsaR1Provider implements CryptoProvider {\n  private crypto: Crypto;\n\n  constructor() {\n    this.crypto = getCrypto();\n  }\n\n  async generateKeyPair(): Promise<{ publicKey: Uint8Array; privateKey: Uint8Array }> {\n    const generated = await this.crypto.subtle.generateKey(\n      {\n        name: 'ECDSA',\n        namedCurve: 'P-256',\n      },\n      true,\n      ['sign', 'verify']\n    );\n\n    if (!('publicKey' in generated)) {\n      throw createCryptoError(\n        IdentityKitErrorCode.CRYPTO_OPERATION_FAILED,\n        'ECDSA P-256 generateKey did not return a key pair',\n        { keyType: 'ECDSA-R1', operation: 'generateKeyPair' }\n      );\n    }\n    const { publicKey, privateKey } = generated;\n\n    const exportedPublic = new Uint8Array(await this.crypto.subtle.exportKey('raw', publicKey));\n    const exportedPrivate = new Uint8Array(await this.crypto.subtle.exportKey('pkcs8', privateKey));\n\n    // Compress the public key to 33 bytes\n    const compressedPublicKey = this.compressPublicKey(exportedPublic);\n\n    return {\n      publicKey: compressedPublicKey,\n      privateKey: exportedPrivate,\n    };\n  }\n\n  private compressPublicKey(publicKey: Uint8Array): Uint8Array {\n    if (publicKey.length !== 65) {\n      throw createValidationError(\n        IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n        `Invalid public key length. Expected 65 bytes, got ${publicKey.length}`,\n        { expectedLength: 65, actualLength: publicKey.length, keyType: 'ECDSA-R1' }\n      );\n    }\n\n    // First byte is the format (0x04 for uncompressed)\n    if (publicKey[0] !== 0x04) {\n      throw createValidationError(\n        IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n        'Invalid public key format. Expected uncompressed format (0x04)',\n        { actualPrefix: publicKey[0], expectedPrefix: 0x04, keyType: 'ECDSA-R1' }\n      );\n    }\n\n    // Extract x and y coordinates\n    const x = publicKey.slice(1, 33);\n    const y = publicKey.slice(33, 65);\n\n    // Create compressed format (0x02 or 0x03) + x coordinate\n    const compressedFormat = y[31] % 2 === 0 ? 0x02 : 0x03;\n\n    const compressed = new Uint8Array(33);\n    compressed[0] = compressedFormat;\n    compressed.set(x, 1);\n\n    return compressed;\n  }\n\n  private decompressPublicKey(compressedKey: Uint8Array): Uint8Array {\n    if (compressedKey.length !== 33) {\n      throw createValidationError(\n        IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n        `Invalid compressed public key length. Expected 33 bytes, got ${compressedKey.length}`,\n        { expectedLength: 33, actualLength: compressedKey.length, keyType: 'ECDSA-R1' }\n      );\n    }\n    const format = compressedKey[0];\n    if (format !== 0x02 && format !== 0x03) {\n      throw createValidationError(\n        IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n        'Invalid compressed public key format. Expected 0x02 or 0x03',\n        { actualPrefix: compressedKey[0], expectedPrefixes: [0x02, 0x03], keyType: 'ECDSA-R1' }\n      );\n    }\n    try {\n      const point = p256.ProjectivePoint.fromHex(compressedKey);\n      const x = point.x;\n      const y = point.y;\n      const xBytes = hexToBytes(x.toString(16).padStart(64, '0'));\n      const yBytes = hexToBytes(y.toString(16).padStart(64, '0'));\n      const decompressed = new Uint8Array(65);\n      decompressed[0] = 0x04;\n      decompressed.set(xBytes, 1);\n      decompressed.set(yBytes, 33);\n      return decompressed;\n    } catch (err) {\n      const error = err as Error;\n      throw createCryptoError(\n        IdentityKitErrorCode.CRYPTO_OPERATION_FAILED,\n        `Failed to decompress public key: ${error.message}`,\n        { keyType: 'ECDSA-R1', operation: 'decompressPublicKey', originalError: error.message }\n      );\n    }\n  }\n\n  async sign(data: Uint8Array, privateKey: Uint8Array | CryptoKey): Promise<Uint8Array> {\n    let key: CryptoKey;\n    if (privateKey instanceof Uint8Array) {\n      key = await this.crypto.subtle.importKey(\n        'pkcs8',\n        privateKey,\n        {\n          name: 'ECDSA',\n          namedCurve: 'P-256',\n        },\n        false,\n        ['sign']\n      );\n    } else {\n      key = privateKey;\n    }\n\n    const signature = await this.crypto.subtle.sign(\n      {\n        name: 'ECDSA',\n        hash: { name: 'SHA-256' },\n      },\n      key,\n      data\n    );\n\n    return new Uint8Array(signature);\n  }\n\n  private convertDERSignatureToRaw(derSignature: Uint8Array): Uint8Array {\n    // If DER -> convert to raw 64\n    const firstByte = derSignature[0];\n    if (firstByte === 0x30) {\n      // looks like DER\n      try {\n        const sig = p256.Signature.fromDER(derSignature);\n        return sig.toCompactRawBytes();\n      } catch (e) {\n        throw createValidationError(\n          IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n          'Invalid DER signature',\n          { keyType: 'ECDSA-R1', operation: 'parseDERSignature' }\n        );\n      }\n    }\n    // else assume already raw 64\n    return derSignature;\n  }\n\n  private convertRawToDER(raw: Uint8Array): Uint8Array {\n    if (raw.length !== 64) return raw;\n    const r = bytesToHex(raw.slice(0, 32));\n    const s = bytesToHex(raw.slice(32, 64));\n    const der = p256.Signature.fromCompact(hexToBytes(r + s)).toDERHex();\n    return hexToBytes(der);\n  }\n\n  async verify(\n    data: Uint8Array,\n    signature: Uint8Array,\n    publicKey: Uint8Array | JsonWebKey\n  ): Promise<boolean> {\n    let key: CryptoKey;\n    if (publicKey instanceof Uint8Array) {\n      // Decompress the public key before importing\n      const decompressedKey = this.decompressPublicKey(publicKey);\n      key = await this.crypto.subtle.importKey(\n        'raw',\n        decompressedKey,\n        {\n          name: 'ECDSA',\n          namedCurve: 'P-256',\n        },\n        false,\n        ['verify']\n      );\n    } else {\n      key = await this.crypto.subtle.importKey(\n        'jwk',\n        publicKey,\n        {\n          name: 'ECDSA',\n          namedCurve: 'P-256',\n        },\n        false,\n        ['verify']\n      );\n    }\n\n    return await this.crypto.subtle.verify(\n      {\n        name: 'ECDSA',\n        hash: { name: 'SHA-256' },\n      },\n      key,\n      signature,\n      data\n    );\n  }\n\n  getKeyType(): KeyType {\n    return KEY_TYPE.ECDSAR1;\n  }\n\n  async derivePublicKey(privateKey: Uint8Array): Promise<Uint8Array> {\n    // Import private key\n    const cryptoKey = await this.crypto.subtle.importKey(\n      'pkcs8',\n      privateKey,\n      { name: 'ECDSA', namedCurve: 'P-256' },\n      true,\n      ['sign']\n    );\n\n    // Export as JWK to get public key coordinates\n    const jwk = await this.crypto.subtle.exportKey('jwk', cryptoKey);\n    if (!jwk.x || !jwk.y) {\n      throw createCryptoError(\n        IdentityKitErrorCode.CRYPTO_KEY_DERIVATION_FAILED,\n        'Failed to derive public key from private key',\n        { keyType: 'ECDSA-R1', operation: 'derivePublicKey' }\n      );\n    }\n\n    // Convert base64url coordinates to raw bytes\n    const x = base64urlToBytes(jwk.x);\n    const y = base64urlToBytes(jwk.y);\n\n    // Reconstruct uncompressed public key (0x04 + x + y)\n    const uncompressed = new Uint8Array(65);\n    uncompressed[0] = 0x04;\n    uncompressed.set(x, 1);\n    uncompressed.set(y, 33);\n\n    // Compress the public key to match our standard format\n    return this.compressPublicKey(uncompressed);\n  }\n}\n","import { CryptoProvider, CryptoProviderFactory } from './providers';\nimport { Ed25519Provider } from './providers/ed25519';\nimport { Secp256k1Provider } from './providers/secp256k1';\nimport { EcdsaR1Provider } from './providers/ecdsa_r1';\nimport { KEY_TYPE, KeyType } from '../types/crypto';\nimport { IdentityKitErrorCode, createCryptoError } from '../errors';\n\nexport class DefaultCryptoProviderFactory implements CryptoProviderFactory {\n  private providers: Map<KeyType, CryptoProvider>;\n\n  constructor() {\n    this.providers = new Map();\n    this.providers.set(KEY_TYPE.ED25519, new Ed25519Provider());\n    this.providers.set(KEY_TYPE.SECP256K1, new Secp256k1Provider());\n    this.providers.set(KEY_TYPE.ECDSAR1, new EcdsaR1Provider());\n  }\n\n  createProvider(keyType: KeyType): CryptoProvider {\n    const provider = this.providers.get(keyType);\n    if (!provider) {\n      throw createCryptoError(\n        IdentityKitErrorCode.CRYPTO_PROVIDER_NOT_FOUND,\n        `No provider available for key type: ${keyType}`,\n        { keyType, availableTypes: Array.from(this.providers.keys()) }\n      );\n    }\n    return provider;\n  }\n\n  supports(keyType: KeyType): boolean {\n    return this.providers.has(keyType);\n  }\n}\n\n/**\n * Default instance of the crypto provider factory\n */\nexport const defaultCryptoProviderFactory = new DefaultCryptoProviderFactory();\n","import { KeyType, KeyTypeInput, toKeyType } from '../types/crypto';\nimport { defaultCryptoProviderFactory } from './factory';\n\n/**\n * CryptoUtils provides cross-platform cryptographic utilities for DID operations.\n * It abstracts the complexity of different key types and formats.\n */\nexport class CryptoUtils {\n  /**\n   * Generates a key pair based on the specified curve\n   * @param type The key type to generate (Ed25519VerificationKey2020 or EcdsaSecp256k1VerificationKey2019 or EcdsaSecp256r1VerificationKey2019)\n   * @returns A key pair containing public and private keys\n   */\n  static async generateKeyPair(\n    type: KeyTypeInput = KeyType.ED25519\n  ): Promise<{ publicKey: Uint8Array; privateKey: Uint8Array }> {\n    const keyType = typeof type === 'string' ? toKeyType(type) : type;\n    const provider = defaultCryptoProviderFactory.createProvider(keyType);\n    return provider.generateKeyPair();\n  }\n\n  /**\n   * Signs data using the specified private key\n   * @param data The data to sign\n   * @param privateKey The private key to use for signing (can be Uint8Array or CryptoKey)\n   * @param type The key type (Ed25519VerificationKey2020 or EcdsaSecp256k1VerificationKey2019)\n   * @returns The signature as a Uint8Array\n   */\n  static async sign(\n    data: Uint8Array,\n    privateKey: Uint8Array | CryptoKey,\n    type: KeyTypeInput\n  ): Promise<Uint8Array> {\n    const keyType = typeof type === 'string' ? toKeyType(type) : type;\n    const provider = defaultCryptoProviderFactory.createProvider(keyType);\n    return provider.sign(data, privateKey);\n  }\n\n  /**\n   * Verifies a signature using the specified public key\n   * @param data The original data\n   * @param signature The signature to verify\n   * @param publicKey The public key to use for verification (can be Uint8Array or JsonWebKey)\n   * @param type The key type (Ed25519VerificationKey2020 or EcdsaSecp256k1VerificationKey2019)\n   * @returns Whether the signature is valid\n   */\n  static async verify(\n    data: Uint8Array,\n    signature: Uint8Array,\n    publicKey: Uint8Array | JsonWebKey,\n    type: KeyTypeInput\n  ): Promise<boolean> {\n    const keyType = typeof type === 'string' ? toKeyType(type) : type;\n    const provider = defaultCryptoProviderFactory.createProvider(keyType);\n    return provider.verify(data, signature, publicKey);\n  }\n\n  /**\n   * Derive public key from private key\n   * @param privateKey The private key bytes\n   * @param keyType The key type\n   * @returns The corresponding public key bytes\n   */\n  static async derivePublicKey(privateKey: Uint8Array, keyType: KeyTypeInput): Promise<Uint8Array> {\n    const type = typeof keyType === 'string' ? toKeyType(keyType) : keyType;\n    const provider = defaultCryptoProviderFactory.createProvider(type);\n    return provider.derivePublicKey(privateKey);\n  }\n\n  /**\n   * Validate the consistency between a private key and public key pair\n   * @param privateKey The private key bytes\n   * @param publicKey The public key bytes\n   * @param keyType The key type\n   * @returns true if the keys are consistent, false otherwise\n   */\n  static async validateKeyPairConsistency(\n    privateKey: Uint8Array,\n    publicKey: Uint8Array,\n    keyType: KeyTypeInput\n  ): Promise<boolean> {\n    try {\n      // Derive public key from private key\n      const derivedPublicKey = await this.derivePublicKey(privateKey, keyType);\n\n      // Compare if public keys match\n      return this.areUint8ArraysEqual(derivedPublicKey, publicKey);\n    } catch (error) {\n      console.warn('Key pair consistency validation failed:', error);\n      return false;\n    }\n  }\n\n  /**\n   * Compare two Uint8Array for equality\n   * @param a First array\n   * @param b Second array\n   * @returns true if arrays are equal, false otherwise\n   */\n  private static areUint8ArraysEqual(a: Uint8Array, b: Uint8Array): boolean {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n      if (a[i] !== b[i]) return false;\n    }\n    return true;\n  }\n}\n","// Copyright (c) RoochNetwork\n// SPDX-License-Identifier: Apache-2.0\n\nimport { p256 } from '@noble/curves/p256';\nimport {\n  RoochAddress,\n  PublicKey,\n  PublicKeyInitData,\n  SIGNATURE_SCHEME_TO_FLAG,\n  Address,\n  Bytes,\n  blake2b,\n  fromB64,\n} from '@roochnetwork/rooch-sdk';\nimport { IdentityKitErrorCode, createValidationError } from '../errors';\n\nconst PUBLIC_KEY_SIZE = 33; // Compressed P-256 public key size\n\n/**\n * An ECDSA R1 (P-256) public key implementation for identity-kit\n * This is a temporary implementation until EcdsaR1PublicKey is available in rooch-sdk\n */\nexport class EcdsaR1PublicKey extends PublicKey<Address> {\n  static SIZE = PUBLIC_KEY_SIZE;\n\n  private readonly data: Uint8Array;\n\n  /**\n   * Create a new EcdsaR1PublicKey object\n   * @param value ECDSA R1 public key as buffer or base-64 encoded string\n   */\n  constructor(value: PublicKeyInitData) {\n    super();\n\n    if (typeof value === 'string') {\n      this.data = fromB64(value);\n    } else if (value instanceof Uint8Array) {\n      this.data = value;\n    } else {\n      this.data = Uint8Array.from(value);\n    }\n\n    if (this.data.length !== PUBLIC_KEY_SIZE) {\n      throw createValidationError(\n        IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n        `Invalid public key input. Expected ${PUBLIC_KEY_SIZE} bytes, got ${this.data.length}`,\n        { expectedSize: PUBLIC_KEY_SIZE, actualSize: this.data.length, keyType: 'ECDSA-R1' }\n      );\n    }\n  }\n\n  /**\n   * Checks if two EcdsaR1 public keys are equal\n   */\n  override equals(publicKey: EcdsaR1PublicKey): boolean {\n    return super.equals(publicKey);\n  }\n\n  /**\n   * Return the byte array representation of the ECDSA R1 public key\n   */\n  toBytes(): Uint8Array {\n    return this.data;\n  }\n\n  /**\n   * Return the signature scheme flag for ECDSA R1\n   */\n  flag(): number {\n    return SIGNATURE_SCHEME_TO_FLAG.EcdsaR1;\n  }\n\n  /**\n   * Verifies that the signature is valid for the provided message\n   */\n  async verify(message: Uint8Array, signature: Uint8Array): Promise<boolean> {\n    try {\n      // Verify signature using noble curves with compressed public key bytes\n      return p256.verify(signature, message, this.toBytes());\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Return the Rooch address associated with this ECDSA R1 public key\n   */\n  toAddress(): RoochAddress {\n    const tmp = new Uint8Array(PUBLIC_KEY_SIZE + 1);\n    tmp.set([SIGNATURE_SCHEME_TO_FLAG.EcdsaR1]);\n    tmp.set(this.toBytes(), 1);\n\n    // Each hex char represents half a byte, hence hex address doubles the length\n    const ROOCH_ADDRESS_LENGTH = 32;\n    return new RoochAddress(blake2b(tmp, { dkLen: 32 }).slice(0, ROOCH_ADDRESS_LENGTH * 2));\n  }\n}\n","import { KeyStore } from '../keys/KeyStore';\nimport { KeyType } from '../types/crypto';\nimport { MultibaseCodec } from '../multibase';\nimport { CryptoUtils } from '../crypto';\nimport { IdentityKitErrorCode, createKeyManagementError } from '../errors';\n\n/**\n * Sign data with the given KeyStore. If the KeyStore itself implements a\n * `sign()` method (e.g., for WebAuthn / non-extractable keys), that method\n * is preferred. Otherwise the private key is loaded and the signature is\n * produced via `CryptoUtils.sign()`.\n *\n * @param keyStore  The key store to use\n * @param data      The data to sign\n * @param keyId     Full verificationMethod id (did#fragment)\n */\nexport async function signWithKeyStore(\n  keyStore: KeyStore,\n  data: Uint8Array,\n  keyId: string\n): Promise<Uint8Array> {\n  if (typeof (keyStore as any).sign === 'function') {\n    // KeyStore 自带原子签名（例如 WebAuthn）\n    return (keyStore as any).sign(keyId, data);\n  }\n\n  const key = await keyStore.load(keyId);\n  if (!key) {\n    throw createKeyManagementError(IdentityKitErrorCode.KEY_NOT_FOUND, `Key not found: ${keyId}`, {\n      keyId,\n    });\n  }\n  if (!key.privateKeyMultibase) {\n    throw createKeyManagementError(\n      IdentityKitErrorCode.KEY_PRIVATE_KEY_NOT_AVAILABLE,\n      `No private key available for ${keyId}`,\n      { keyId }\n    );\n  }\n\n  const privateKeyBytes = MultibaseCodec.decode(key.privateKeyMultibase);\n  return CryptoUtils.sign(data, privateKeyBytes, key.keyType);\n}\n\n/**\n * Test whether a key can be used for signing in this KeyStore.\n */\nexport async function canSignWithKeyStore(keyStore: KeyStore, keyId: string): Promise<boolean> {\n  if (typeof (keyStore as any).sign === 'function') {\n    const keyExists = await keyStore.load(keyId);\n    return keyExists !== null;\n  }\n  const key = await keyStore.load(keyId);\n  return !!(key && key.privateKeyMultibase);\n}\n\n/**\n * Retrieve public key + type info from the KeyStore.\n */\nexport async function getKeyInfoFromKeyStore(\n  keyStore: KeyStore,\n  keyId: string\n): Promise<{ type: KeyType; publicKey: Uint8Array } | undefined> {\n  const key = await keyStore.load(keyId);\n  if (!key) return undefined;\n  const publicKeyBytes = MultibaseCodec.decode(key.publicKeyMultibase);\n  return { type: key.keyType, publicKey: publicKeyBytes };\n}\n","// Signer interfaces and types\n\nimport { KeyType } from '../types/crypto';\nimport { Signer } from '@roochnetwork/rooch-sdk';\n\n/**\n * Interface for external signers that can be used for master key operations\n * This allows the SDK to request signatures from external systems (wallets, HSMs, etc.)\n * without directly managing the private keys\n */\nexport interface SignerInterface {\n  /**\n   * List all available key IDs that this signer can use\n   * @returns Promise resolving to an array of key IDs\n   */\n  listKeyIds(): Promise<string[]>;\n\n  /**\n   * Signs data with a specified key\n   * @param data The data to sign\n   * @param keyId The ID of the key to use for signing\n   * @returns A promise that resolves to the signature\n   */\n  signWithKeyId(data: Uint8Array, keyId: string): Promise<Uint8Array>;\n\n  /**\n   * Checks if the signer can sign with a specific key\n   * @param keyId The ID of the key to check\n   * @returns A promise that resolves to true if the signer can sign with the key\n   */\n  canSignWithKeyId(keyId: string): Promise<boolean>;\n\n  /**\n   * Get the DID of the signer\n   * @returns The DID of the signer\n   */\n  getDid(): Promise<string>;\n\n  /**\n   * Get information about a specific key\n   * @param keyId The ID of the key to get information about\n   * @returns Key information or undefined if not found\n   */\n  getKeyInfo(keyId: string): Promise<{ type: KeyType; publicKey: Uint8Array } | undefined>;\n}\n\n/**\n * Type guard utilities for SignerInterface and Signer\n * These are more reliable than instanceof when dealing with cross-module dependencies\n */\n\n/**\n * Check if an object implements SignerInterface (but not Signer)\n * This is more reliable than instanceof when dealing with cross-module dependencies\n */\nexport function isSignerInterface(obj: any): obj is SignerInterface {\n  return (\n    obj &&\n    typeof obj === 'object' &&\n    typeof obj.listKeyIds === 'function' &&\n    typeof obj.signWithKeyId === 'function' &&\n    typeof obj.canSignWithKeyId === 'function' &&\n    typeof obj.getDid === 'function' &&\n    typeof obj.getKeyInfo === 'function' &&\n    // Check that it's NOT a Signer (which has different methods)\n    typeof obj.sign !== 'function'\n  );\n}\n","import {\n  RoochAddress,\n  SignatureScheme,\n  Signer,\n  Transaction,\n  Address,\n  Bytes,\n  Authenticator,\n  BitcoinAddress,\n  PublicKey,\n  Ed25519PublicKey,\n  Secp256k1PublicKey,\n} from '@roochnetwork/rooch-sdk';\nimport { SignerInterface } from './types';\nimport { KeyType, keyTypeToRoochSignatureScheme } from '../types/crypto';\nimport { parseDid } from '../utils/did';\nimport { EcdsaR1PublicKey } from '../crypto/EcdsaR1PublicKey';\nimport { IdentityKitErrorCode, createSignerError, createValidationError } from '../errors';\n\n/**\n * A Rooch Signer implementation that wraps a SignerInterface.\n * This class implements the Rooch Signer interface while delegating\n * actual signing operations to the wrapped SignerInterface.\n */\nexport class DidAccountSigner extends Signer implements SignerInterface {\n  private readonly __brandDidAccountSigner = true;\n  private did: string;\n  private keyId: string;\n  private didAddress: RoochAddress;\n  private keyType: KeyType;\n  private publicKey: Uint8Array;\n\n  private constructor(\n    private wrappedSigner: SignerInterface,\n    did: string,\n    keyId: string,\n    keyType: KeyType,\n    publicKey: Uint8Array\n  ) {\n    super();\n    this.keyId = keyId;\n    this.did = did;\n    if (!this.did.startsWith('did:rooch:')) {\n      throw createSignerError(\n        IdentityKitErrorCode.SIGNER_INVALID_DID,\n        'Signer DID must be a did:rooch DID',\n        { did: this.did, expectedMethod: 'rooch' }\n      );\n    }\n    const didParts = parseDid(did);\n    this.didAddress = new RoochAddress(didParts.identifier);\n    this.keyType = keyType;\n    this.publicKey = publicKey;\n  }\n\n  /**\n   * Create a DidAccountSigner instance from a SignerInterface\n   * @param signer The signer to wrap\n   * @param keyId Optional specific keyId to use\n   * @returns A new DidAccountSigner instance\n   */\n  /**\n   * Check if an object is a DidAccountSigner instance\n   * Safe to use instanceof within the same module\n   */\n  static isDidAccountSigner(obj: any): obj is DidAccountSigner {\n    return obj instanceof DidAccountSigner;\n  }\n\n  static async create(signer: SignerInterface, keyId?: string): Promise<DidAccountSigner> {\n    // If already a DidAccountSigner, return as is\n    if (DidAccountSigner.isDidAccountSigner(signer)) {\n      return signer;\n    }\n\n    // Get keyId if not provided\n    const actualKeyId = keyId || (await signer.listKeyIds())[0];\n    if (!actualKeyId) {\n      throw createSignerError(IdentityKitErrorCode.SIGNER_NO_KEYS, 'No available keys in signer', {\n        signer,\n      });\n    }\n\n    // Get key info\n    const keyInfo = await signer.getKeyInfo(actualKeyId);\n    if (!keyInfo) {\n      throw createSignerError(\n        IdentityKitErrorCode.KEY_NOT_FOUND,\n        `Key info not found for keyId: ${actualKeyId}`,\n        { keyId: actualKeyId, signer }\n      );\n    }\n\n    const did = await signer.getDid();\n\n    const didSigner = new DidAccountSigner(\n      signer,\n      did,\n      actualKeyId,\n      keyInfo.type,\n      keyInfo.publicKey\n    );\n\n    // If underlying signer supports WebAuthn, expose signAssertion so Authenticator picks WebAuthn envelope\n    const maybeWebAuthn = signer as any;\n    if (maybeWebAuthn && typeof maybeWebAuthn.signAssertion === 'function') {\n      (didSigner as any).signAssertion = (challenge: Bytes) =>\n        maybeWebAuthn.signAssertion(challenge);\n    }\n\n    return didSigner;\n  }\n\n  // Implement Rooch Signer interface\n  getRoochAddress(): RoochAddress {\n    return this.didAddress;\n  }\n\n  async sign(input: Bytes): Promise<Bytes> {\n    return this.wrappedSigner.signWithKeyId(input, this.keyId);\n  }\n\n  async signTransaction(input: Transaction): Promise<Authenticator> {\n    const txHash = input.hashData();\n    const vmFragment = this.getVmFragment();\n    return Authenticator.did(txHash, this, vmFragment);\n  }\n\n  getKeyScheme(): SignatureScheme {\n    return keyTypeToRoochSignatureScheme(this.keyType);\n  }\n\n  getPublicKey(): PublicKey<Address> {\n    if (this.keyType === KeyType.SECP256K1) {\n      return new Secp256k1PublicKey(this.publicKey);\n    } else if (this.keyType === KeyType.ED25519) {\n      return new Ed25519PublicKey(this.publicKey);\n    } else if (this.keyType === KeyType.ECDSAR1) {\n      return new EcdsaR1PublicKey(this.publicKey);\n    } else {\n      throw createSignerError(\n        IdentityKitErrorCode.KEY_TYPE_NOT_SUPPORTED,\n        `Unsupported key type: ${this.keyType}`,\n        { keyType: this.keyType, supportedTypes: ['Ed25519', 'Secp256k1', 'EcdsaR1'] }\n      );\n    }\n  }\n\n  getBitcoinAddress(): BitcoinAddress {\n    throw createSignerError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      'Bitcoin address is not supported for DID account',\n      { operation: 'getBitcoinAddress' }\n    );\n  }\n\n  // Implement SignerInterface\n  async signWithKeyId(data: Uint8Array, keyId: string): Promise<Uint8Array> {\n    if (keyId !== this.keyId) {\n      throw createValidationError(\n        IdentityKitErrorCode.KEY_ID_MISMATCH,\n        `Key ID mismatch. Expected ${this.keyId}, got ${keyId}`,\n        { expectedKeyId: this.keyId, actualKeyId: keyId }\n      );\n    }\n    return this.sign(data);\n  }\n\n  async canSignWithKeyId(keyId: string): Promise<boolean> {\n    return keyId === this.keyId;\n  }\n\n  async listKeyIds(): Promise<string[]> {\n    return [this.keyId];\n  }\n\n  async getDid(): Promise<string> {\n    return this.did;\n  }\n\n  async getKeyInfo(keyId: string): Promise<{ type: KeyType; publicKey: Uint8Array } | undefined> {\n    if (keyId !== this.keyId) {\n      return undefined;\n    }\n    return {\n      type: this.keyType,\n      publicKey: this.publicKey,\n    };\n  }\n\n  private getVmFragment(): string {\n    const parts = this.keyId.split('#');\n    if (parts.length !== 2) {\n      throw createValidationError(\n        IdentityKitErrorCode.INVALID_INPUT_FORMAT,\n        `Invalid keyId format: ${this.keyId}. Expected format: \"did:rooch:0x123#fragment\"`,\n        { keyId: this.keyId, expectedFormat: 'did:rooch:0x123#fragment' }\n      );\n    }\n    return parts[1];\n  }\n}\n\n/**\n * Exported function for checking DidAccountSigner instances\n */\nexport function isDidAccountSigner(obj: any): obj is DidAccountSigner {\n  return Boolean(obj && obj.__brandDidAccountSigner === true);\n}\n","/**\n * DID utility helpers (method, identifier & fragment parsing)\n * Used across SDK layers (VDR, Signer, KeyManager, etc.)\n */\n\nimport { IdentityKitErrorCode, createDIDError } from '../errors';\n\n/**\n * Parsed DID parts\n */\nexport interface ParsedDID {\n  /** DID method, e.g. 'key', 'rooch' */\n  method: string;\n  /** Unique identifier part (method-specific id, without fragment) */\n  identifier: string;\n  /** Optional fragment (ver. method / service id) */\n  fragment?: string;\n}\n\n/**\n * Parse a DID or DID-URL into its components.\n *\n * @param did Full DID string: `did:<method>:<identifier>[#fragment]`\n * @throws Error if input does not start with `did:` or lacks method / identifier parts.\n */\nexport function parseDid(did: string): ParsedDID {\n  if (!did.startsWith('did:')) {\n    throw createDIDError(IdentityKitErrorCode.DID_INVALID_FORMAT, `Invalid DID: ${did}`, {\n      did,\n      reason: 'DID must start with \"did:\"',\n    });\n  }\n\n  // Strip leading `did:` and split once by ':'\n  const afterPrefix = did.slice(4);\n  const methodEnd = afterPrefix.indexOf(':');\n  if (methodEnd === -1) {\n    throw createDIDError(\n      IdentityKitErrorCode.DID_INVALID_FORMAT,\n      `Invalid DID – missing method/identifier separator: ${did}`,\n      { did, reason: 'Missing method/identifier separator \":\"' }\n    );\n  }\n  const method = afterPrefix.slice(0, methodEnd);\n  const idPlusFrag = afterPrefix.slice(methodEnd + 1);\n  if (!method || !idPlusFrag) {\n    throw createDIDError(IdentityKitErrorCode.DID_INVALID_FORMAT, `Invalid DID: ${did}`, {\n      did,\n      reason: 'Empty method or identifier',\n    });\n  }\n\n  const hashIdx = idPlusFrag.indexOf('#');\n  return hashIdx === -1\n    ? { method, identifier: idPlusFrag }\n    : {\n        method,\n        identifier: idPlusFrag.slice(0, hashIdx),\n        fragment: idPlusFrag.slice(hashIdx + 1),\n      };\n}\n\n/** Get DID method string */\nexport function extractMethod(did: string): string {\n  return parseDid(did).method;\n}\n\n/** Get method-specific identifier (without fragment) */\nexport function extractIdentifier(did: string): string {\n  return parseDid(did).identifier;\n}\n\n/**\n * Extract the fragment from a DID URL or any string containing `#`.\n * Throws an error if no fragment present.\n */\nexport function extractFragment(idOrDid: string): string {\n  const idx = idOrDid.indexOf('#');\n  if (idx === -1) {\n    throw createDIDError(\n      IdentityKitErrorCode.DID_INVALID_FORMAT,\n      `No fragment found in ${idOrDid}`,\n      { idOrDid, reason: 'Missing fragment separator \"#\"' }\n    );\n  }\n  return idOrDid.slice(idx + 1);\n}\n\n/** Alias kept for back-compat with existing imports */\nexport const extractFragmentFromId = extractFragment;\n\n/** Build a canonical DID string from method & identifier */\nexport function buildDid(method: string, identifier: string): string {\n  return `did:${method}:${identifier}`;\n}\n\n/**\n * Compare two DIDs ignoring their fragments.\n */\nexport function sameDid(a: string, b: string): boolean {\n  const pa = parseDid(a);\n  const pb = parseDid(b);\n  return pa.method === pb.method && pa.identifier === pb.identifier;\n}\n\n/**\n * Return the canonical DID (strip any `#fragment`).\n */\nexport function getDidWithoutFragment(did: string): string {\n  const { method, identifier } = parseDid(did);\n  return buildDid(method, identifier);\n}\n","import {\n  DIDDocument,\n  VerificationMethod,\n  VerificationRelationship,\n  ServiceEndpoint,\n} from '../types/did';\nimport {\n  DIDCreationRequest,\n  DIDCreationResult,\n  CADOPCreationRequest,\n  CADOPControllerCreationRequest,\n  VDRInterface,\n} from './types';\nimport { parseDid } from '../utils/did';\nimport { DebugLogger } from '../utils/DebugLogger';\nimport {\n  IdentityKitErrorCode,\n  createDIDError,\n  createVDRError,\n  createValidationError,\n} from '../errors';\n\n// Unified logger for AbstractVDR\nconst logger = DebugLogger.get('AbstractVDR');\n\n/**\n * Abstract base class for implementing Verifiable Data Registry functionality\n * Provides common utility methods and enforces the VDRInterface contract\n */\nexport abstract class AbstractVDR implements VDRInterface {\n  // The DID method this VDR handles (e.g., 'key', 'web')\n  protected readonly method: string;\n\n  /**\n   * Creates a new AbstractVDR instance\n   *\n   * @param method The DID method this VDR handles\n   */\n  constructor(method: string) {\n    this.method = method;\n  }\n\n  /**\n   * Gets the DID method this VDR handles\n   *\n   * @returns The DID method string\n   */\n  getMethod(): string {\n    return this.method;\n  }\n\n  /**\n   * Validates that a given DID matches the method this VDR handles\n   *\n   * @param did The DID to validate\n   * @throws Error if the DID doesn't match this VDR's method\n   */\n  protected validateDIDMethod(did: string): void {\n    const parsedDid = parseDid(did);\n    if (parsedDid.method !== this.method) {\n      throw createDIDError(\n        IdentityKitErrorCode.DID_INVALID_FORMAT,\n        `DID ${did} is not a valid did:${this.method} identifier`,\n        { did, expectedMethod: this.method, actualMethod: parsedDid.method }\n      );\n    }\n  }\n\n  /**\n   * Validates a DID document's basic structure\n   *\n   * @param document The DID document to validate\n   * @returns true if valid, throws an error otherwise\n   */\n  protected validateDocument(document: DIDDocument): boolean {\n    if (!document.id) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'DID document must have an id',\n        { document }\n      );\n    }\n\n    this.validateDIDMethod(document.id);\n\n    if (!document['@context']) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'DID document must have a @context property',\n        { document }\n      );\n    }\n\n    if (!document.verificationMethod || document.verificationMethod.length === 0) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'DID document must have at least one verification method',\n        { document }\n      );\n    }\n\n    return true;\n  }\n\n  /**\n   * Check if a key has a specific verification relationship in a DID document\n   *\n   * @param didDocument The DID document to check\n   * @param keyId The ID of the verification method\n   * @param relationship The verification relationship to check\n   * @returns True if the key has the relationship\n   */\n  protected hasVerificationRelationship(\n    didDocument: DIDDocument,\n    keyId: string,\n    relationship: VerificationRelationship\n  ): boolean {\n    const relationshipArray = didDocument[relationship];\n    if (!relationshipArray) return false;\n\n    return relationshipArray.some(item => {\n      if (typeof item === 'string') {\n        return item === keyId;\n      } else if (typeof item === 'object' && item.id) {\n        return item.id === keyId;\n      }\n      return false;\n    });\n  }\n\n  /**\n   * Validates if a key has permission to perform an operation\n   *\n   * @param didDocument The DID document\n   * @param keyId The ID of the key\n   * @param requiredRelationship The required verification relationship\n   * @returns True if the key has permission\n   */\n  protected validateKeyPermission(\n    didDocument: DIDDocument,\n    keyId: string,\n    requiredRelationship: VerificationRelationship\n  ): boolean {\n    const keyExists = didDocument.verificationMethod?.some(vm => vm.id === keyId);\n    if (!keyExists) {\n      logger.error(`Key ${keyId} not found in DID document`);\n      return false;\n    }\n\n    const isPrimaryKey = didDocument.verificationMethod?.[0]?.id === keyId;\n    if (isPrimaryKey) {\n      return true;\n    }\n\n    const hasPermission = didDocument[requiredRelationship]?.includes(keyId);\n\n    if (!hasPermission) {\n      logger.error(`Key ${keyId} does not have ${requiredRelationship} permission`);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Default create implementation - throws not implemented error for base class\n   * Subclasses must override this method to provide actual implementation\n   */\n  async create(request: DIDCreationRequest, options?: any): Promise<DIDCreationResult> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `create method not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'create' }\n    );\n  }\n\n  /**\n   * Default CADOP implementation - throws not implemented error\n   */\n  async createViaCADOP(request: CADOPCreationRequest, options?: any): Promise<DIDCreationResult> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `createViaCADOP not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'createViaCADOP' }\n    );\n  }\n\n  /**\n   * Default CADOP with controller implementation - throws not implemented error\n   */\n  async createViaCADOPWithController(\n    request: CADOPControllerCreationRequest,\n    options?: any\n  ): Promise<DIDCreationResult> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `createViaCADOPWithController not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'createViaCADOPWithController' }\n    );\n  }\n\n  /**\n   * Build DID Document from creation request\n   */\n  protected buildDIDDocumentFromRequest(request: DIDCreationRequest): DIDDocument {\n    const did = request.preferredDID!;\n\n    // Extract the first controller for the verification method (which only accepts string)\n    const controllerForVM = Array.isArray(request.controller)\n      ? request.controller[0]\n      : request.controller || did;\n\n    const verificationMethod: VerificationMethod = {\n      id: `${did}#account-key`,\n      type: request.keyType || 'EcdsaSecp256k1VerificationKey2019',\n      controller: controllerForVM,\n      publicKeyMultibase: request.publicKeyMultibase,\n    };\n\n    const didDocument: DIDDocument = {\n      '@context': ['https://www.w3.org/ns/did/v1'],\n      id: did,\n      controller: request.controller\n        ? Array.isArray(request.controller)\n          ? request.controller\n          : [request.controller]\n        : [did],\n      verificationMethod: [verificationMethod, ...(request.additionalVerificationMethods || [])],\n      service: request.initialServices || [],\n    };\n\n    // Set initial relationships\n    const relationships = request.initialRelationships || [\n      'authentication',\n      'assertionMethod',\n      'capabilityInvocation',\n      'capabilityDelegation',\n    ];\n\n    const vmId = verificationMethod.id;\n    relationships.forEach(rel => {\n      if (!didDocument[rel]) {\n        didDocument[rel] = [];\n      }\n      (didDocument[rel] as string[]).push(vmId);\n    });\n\n    return didDocument;\n  }\n\n  /**\n   * Resolves a DID to its corresponding DID document\n   * Implementations must provide this functionality\n   */\n  abstract resolve(did: string): Promise<DIDDocument | null>;\n\n  /**\n   * Checks if a DID exists in the registry\n   * Default implementation tries to resolve and checks if result is not null\n   */\n  async exists(did: string): Promise<boolean> {\n    try {\n      const doc = await this.resolve(did);\n      return doc !== null;\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Add a verification method to a DID document\n   * Default implementation that should be overridden by specific VDR implementations\n   */\n  async addVerificationMethod(\n    did: string,\n    verificationMethod: VerificationMethod,\n    relationships?: VerificationRelationship[],\n    options?: any\n  ): Promise<boolean> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `addVerificationMethod not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'addVerificationMethod' }\n    );\n  }\n\n  /**\n   * Remove a verification method from a DID document\n   * Default implementation that should be overridden by specific VDR implementations\n   */\n  async removeVerificationMethod(did: string, id: string, options?: any): Promise<boolean> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `removeVerificationMethod not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'removeVerificationMethod' }\n    );\n  }\n\n  /**\n   * Add a service to a DID document\n   * Default implementation that should be overridden by specific VDR implementations\n   */\n  async addService(did: string, service: ServiceEndpoint, options?: any): Promise<boolean> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `addService not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'addService' }\n    );\n  }\n\n  /**\n   * Remove a service from a DID document\n   * Default implementation that should be overridden by specific VDR implementations\n   */\n  async removeService(did: string, id: string, options?: any): Promise<boolean> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `removeService not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'removeService' }\n    );\n  }\n\n  /**\n   * Update verification relationships for a verification method\n   * Default implementation that should be overridden by specific VDR implementations\n   */\n  async updateRelationships(\n    did: string,\n    id: string,\n    add: VerificationRelationship[],\n    remove: VerificationRelationship[],\n    options?: any\n  ): Promise<boolean> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `updateRelationships not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'updateRelationships' }\n    );\n  }\n\n  /**\n   * Update the controller of a DID document\n   * Default implementation that should be overridden by specific VDR implementations\n   */\n  async updateController(\n    did: string,\n    controller: string | string[],\n    options?: any\n  ): Promise<boolean> {\n    throw createVDRError(\n      IdentityKitErrorCode.OPERATION_NOT_SUPPORTED,\n      `updateController not implemented for ${this.method} VDR`,\n      { method: this.method, operation: 'updateController' }\n    );\n  }\n\n  /**\n   * Validates options for update operations and ensures proper permissions\n   *\n   * @param did The DID being operated on\n   * @param document The resolved DID document\n   * @param keyId The key ID used for signing\n   * @param requiredRelationship The required verification relationship for this operation\n   * @throws Error if validation fails\n   */\n  protected async validateUpdateOperation(\n    did: string,\n    document: DIDDocument | null,\n    keyId: string,\n    requiredRelationship: VerificationRelationship\n  ): Promise<DIDDocument> {\n    // Validate DID method\n    this.validateDIDMethod(did);\n\n    // Check if document exists\n    if (!document) {\n      throw createDIDError(IdentityKitErrorCode.DID_NOT_FOUND, `DID document ${did} not found`, {\n        did,\n        operation: 'validateUpdateOperation',\n      });\n    }\n\n    // Check permission\n    if (!this.validateKeyPermission(document, keyId, requiredRelationship)) {\n      throw createValidationError(\n        IdentityKitErrorCode.KEY_PERMISSION_DENIED,\n        `Key ${keyId} does not have ${requiredRelationship} permission required for this operation`,\n        { keyId, requiredRelationship, did }\n      );\n    }\n\n    return document;\n  }\n\n  /**\n   * Validates that inputs to addVerificationMethod are correct\n   *\n   * @param did The DID being operated on\n   * @param verificationMethod The verification method to validate\n   * @param document The current DID document\n   * @throws Error if validation fails\n   */\n  protected validateVerificationMethod(\n    did: string,\n    verificationMethod: VerificationMethod,\n    document: DIDDocument\n  ): void {\n    // Ensure ID starts with the DID\n    if (!verificationMethod.id.startsWith(did)) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        `Verification method ID ${verificationMethod.id} must start with DID ${did}`,\n        { verificationMethodId: verificationMethod.id, did }\n      );\n    }\n\n    // Check if method already exists\n    if (document.verificationMethod?.some(vm => vm.id === verificationMethod.id)) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        `Verification method ${verificationMethod.id} already exists`,\n        { verificationMethodId: verificationMethod.id, did }\n      );\n    }\n\n    // Validate required fields\n    if (!verificationMethod.type) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'Verification method must have a type',\n        { verificationMethod, did }\n      );\n    }\n\n    if (!verificationMethod.controller) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'Verification method must have a controller',\n        { verificationMethod, did }\n      );\n    }\n\n    // Check that at least one key material format is present\n    if (!verificationMethod.publicKeyMultibase && !verificationMethod.publicKeyJwk) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'Verification method must have at least one form of public key material',\n        { verificationMethod, did }\n      );\n    }\n  }\n\n  /**\n   * Validates that inputs to addService are correct\n   *\n   * @param did The DID being operated on\n   * @param service The service to validate\n   * @param document The current DID document\n   * @throws Error if validation fails\n   */\n  protected validateService(did: string, service: ServiceEndpoint, document: DIDDocument): void {\n    // Ensure ID starts with the DID\n    if (!service.id.startsWith(did)) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        `Service ID ${service.id} must start with DID ${did}`,\n        { serviceId: service.id, did }\n      );\n    }\n\n    // Check if service already exists\n    if (document.service?.some(s => s.id === service.id)) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        `Service ${service.id} already exists`,\n        { serviceId: service.id, did }\n      );\n    }\n\n    // Validate required fields\n    if (!service.type) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'Service must have a type',\n        { service, did }\n      );\n    }\n\n    if (!service.serviceEndpoint) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'Service must have a serviceEndpoint',\n        { service, did }\n      );\n    }\n  }\n\n  /**\n   * Makes a deep copy of a DID document for modification\n   *\n   * @param document The DID document to copy\n   * @returns A deep copy of the document\n   */\n  protected copyDocument(document: DIDDocument): DIDDocument {\n    return JSON.parse(JSON.stringify(document));\n  }\n}\n","import {\n  bcs,\n  address,\n  sha3_256,\n  toHEX,\n  stringToBytes,\n  Serializer,\n  StructTag,\n  ObjectStateView,\n} from '@roochnetwork/rooch-sdk';\nimport { DIDDocument, ServiceEndpoint, VerificationMethod } from '../types/did';\n\n/**\n * BCS type definitions for DID related structs\n */\n\n// SimpleMap schema generator\nexport function simpleMapSchema<K, V>(keySchema: any, valueSchema: any) {\n  return bcs.struct('SimpleMap', {\n    data: bcs.vector(\n      bcs.struct('Entry', {\n        key: keySchema,\n        value: valueSchema,\n      })\n    ),\n  });\n}\n\n// Basic DID struct\nexport interface DIDStruct {\n  method: string;\n  identifier: string;\n}\n\n// Helper function to format DID string\nexport function formatDIDString(did: DIDStruct): string {\n  return `did:${did.method}:${did.identifier}`;\n}\n\n// DID Document verification method\nexport interface MoveVerificationMethod {\n  id: {\n    did: DIDStruct;\n    fragment: string;\n  };\n  type: string;\n  controller: DIDStruct;\n  public_key_multibase: string;\n}\n\n// DID Document service\nexport interface MoveService {\n  id: {\n    did: DIDStruct;\n    fragment: string;\n  };\n  type: string;\n  service_endpoint: string;\n  properties: SimpleMap<string, string>;\n}\n\n// Complete DID Document struct from Move\nexport interface MoveDIDDocument {\n  id: DIDStruct;\n  controller: DIDStruct[];\n  verification_methods: Map<string, MoveVerificationMethod>;\n  authentication: string[];\n  assertion_method: string[];\n  capability_invocation: string[];\n  capability_delegation: string[];\n  key_agreement: string[];\n  services: Map<string, MoveService>;\n  also_known_as: string[];\n}\n\n// DID Created Event data\nexport interface DIDCreatedEventData {\n  did: string;\n  object_id: string;\n  controller: string[];\n  creator_address: address;\n}\n\n/**\n * BCS Schemas\n */\n\n// Basic DID schema\nexport const DIDSchema = bcs.struct('DID', {\n  method: bcs.string(),\n  identifier: bcs.string(),\n});\n\n// DID ID schema (with fragment)\nexport const DIDIdSchema = bcs.struct('DIDID', {\n  did: DIDSchema,\n  fragment: bcs.string(),\n});\n\n// Verification Method schema\nexport const VerificationMethodSchema = bcs.struct('VerificationMethod', {\n  id: DIDIdSchema,\n  type: bcs.string(),\n  controller: DIDSchema,\n  public_key_multibase: bcs.string(),\n});\n\n// Service schema\nexport const ServiceSchema = bcs.struct('Service', {\n  id: DIDIdSchema,\n  type: bcs.string(),\n  service_endpoint: bcs.string(),\n  properties: simpleMapSchema(bcs.string(), bcs.string()),\n});\n\nexport const AccountCapSchema = bcs.struct('AccountCap', {\n  addr: bcs.Address,\n});\n\n// Complete DID Document schema\nexport const DIDDocumentSchema = bcs.struct('DIDDocument', {\n  id: DIDSchema,\n  controller: bcs.vector(DIDSchema),\n  verification_methods: simpleMapSchema(bcs.string(), VerificationMethodSchema),\n  authentication: bcs.vector(bcs.string()),\n  assertion_method: bcs.vector(bcs.string()),\n  capability_invocation: bcs.vector(bcs.string()),\n  capability_delegation: bcs.vector(bcs.string()),\n  key_agreement: bcs.vector(bcs.string()),\n  services: simpleMapSchema(bcs.string(), ServiceSchema),\n  also_known_as: bcs.vector(bcs.string()),\n  account_cap: AccountCapSchema,\n});\n\n// DID Created Event schema\nexport const DIDCreatedEventSchema = bcs.struct('DIDCreatedEvent', {\n  did: bcs.string(),\n  object_id: bcs.ObjectId,\n  controller: bcs.vector(bcs.string()),\n  creator_address: bcs.Address,\n});\n\n/**\n * SimpleMap type and conversion helpers\n */\n\n// TypeScript interface for SimpleMap\nexport interface SimpleMap<K, V> {\n  data: Array<{\n    key: K;\n    value: V;\n  }>;\n}\n\n// Convert SimpleMap to standard Map\nexport function simpleMapToMap<K, V>(simpleMap: SimpleMap<K, V>): Map<K, V> {\n  return new Map(simpleMap.data.map(entry => [entry.key, entry.value]));\n}\n\n// Convert standard Map to SimpleMap\nexport function mapToSimpleMap<K, V>(map: Map<K, V>): SimpleMap<K, V> {\n  return {\n    data: Array.from(map.entries()).map(([key, value]) => ({\n      key,\n      value,\n    })),\n  };\n}\n\n/**\n * Convert Move DID Document to standard DID Document interface\n */\nexport function convertMoveDIDDocumentToInterface(didDocObject: ObjectStateView): DIDDocument {\n  // Parse BCS hex string to bytes and deserialize\n  let bcsHex = didDocObject.value;\n  // Remove '0x' prefix if present\n  bcsHex = bcsHex.startsWith('0x') ? bcsHex.slice(2) : bcsHex;\n  let bcsBytes = new Uint8Array(\n    bcsHex.match(/.{1,2}/g)?.map((byte: string) => parseInt(byte, 16)) || []\n  );\n  let didDoc = DIDDocumentSchema.parse(bcsBytes);\n\n  // Create DID string\n  const didId = formatDIDString(didDoc.id);\n\n  // Convert controllers\n  const controllers = didDoc.controller.map(c => formatDIDString(c));\n\n  // Convert verification methods\n  const verificationMethods: VerificationMethod[] = [];\n  const verificationMethodsMap = simpleMapToMap(didDoc.verification_methods) as Map<\n    string,\n    MoveVerificationMethod\n  >;\n  verificationMethodsMap.forEach(vm => {\n    verificationMethods.push({\n      id: `${formatDIDString(vm.id.did)}#${vm.id.fragment}`,\n      type: vm.type,\n      controller: formatDIDString(vm.controller),\n      publicKeyMultibase: vm.public_key_multibase,\n    });\n  });\n\n  // Helper function to convert fragment to full DID URL\n  const convertFragmentToDIDURL = (fragment: string) => `${didId}#${fragment}`;\n\n  // Convert services\n  const services: ServiceEndpoint[] = [];\n  const servicesMap = simpleMapToMap(didDoc.services) as Map<string, MoveService>;\n  servicesMap.forEach(service => {\n    const serviceEndpoint: ServiceEndpoint = {\n      id: `${formatDIDString(service.id.did)}#${service.id.fragment}`,\n      type: service.type,\n      serviceEndpoint: service.service_endpoint,\n    };\n    let properties = simpleMapToMap(service.properties);\n    // Add properties if they exist\n    if (properties.size > 0) {\n      Object.assign(serviceEndpoint, Object.fromEntries(properties));\n    }\n\n    services.push(serviceEndpoint);\n  });\n\n  return {\n    '@context': ['https://www.w3.org/ns/did/v1'],\n    id: didId,\n    controller: controllers,\n    verificationMethod: verificationMethods,\n    authentication: didDoc.authentication.map(convertFragmentToDIDURL),\n    assertionMethod: didDoc.assertion_method.map(convertFragmentToDIDURL),\n    capabilityInvocation: didDoc.capability_invocation.map(convertFragmentToDIDURL),\n    capabilityDelegation: didDoc.capability_delegation.map(convertFragmentToDIDURL),\n    keyAgreement: didDoc.key_agreement.map(convertFragmentToDIDURL),\n    service: services,\n    alsoKnownAs: didDoc.also_known_as,\n  };\n}\n\n/**\n * Parse DID Created Event data using BCS\n */\nexport function parseDIDCreatedEvent(eventData: string): DIDCreatedEventData {\n  const hexData = eventData.startsWith('0x') ? eventData.slice(2) : eventData;\n  const bytes = new Uint8Array(\n    hexData.match(/.{1,2}/g)?.map((byte: string) => parseInt(byte, 16)) || []\n  );\n  return DIDCreatedEventSchema.parse(bytes);\n}\n\n// Define StructTag for DIDDocument\nexport const DIDDocumentStructTag = {\n  address: '0x3',\n  module: 'did',\n  name: 'DIDDocument',\n  typeParams: [],\n};\n\n/**\n * Calculate DID Object ID from identifier\n * This matches the Move function custom_object_id<ID, T>(id: ID)\n */\nexport function resolveDidObjectID(identifier: string): string {\n  return customObjectID(identifier, DIDDocumentStructTag);\n}\n\nexport function customObjectID(id: string, structTag: StructTag): string {\n  const idBytes = bcs.String.serialize(id).toBytes();\n  const typeBytes = stringToBytes('utf8', Serializer.structTagToCanonicalString(structTag));\n  const bytes = new Uint8Array(idBytes.length + typeBytes.length);\n  bytes.set(idBytes);\n  bytes.set(typeBytes, idBytes.length);\n  const hash = sha3_256(bytes);\n  return `0x${toHEX(hash)}`;\n}\n","/**\n * Session-Key Scope utilities for Rooch DID\n *\n * This module provides utilities for managing Session-Key Scopes that control\n * which contract functions a Session-Key can call on the Rooch blockchain.\n */\n\n/**\n * Build base scopes that should be available to all Session-Keys\n * These provide essential DID and payment functionality.\n *\n * @returns Array of base scope strings in \"address::module::function\" format\n */\nexport function buildBaseScopes(): string[] {\n  return [\n    '0x3::did::*', // DID contract - all functions\n    '0x3::payment_channel::*', // Payment channel contract - all functions\n    '0xeb1deb6f1190f86cd4e05a82cfa5775a8a5929da49fac3ab8f5bf23e9181e625::*::*', // Cap Registry contract - all functions\n  ];\n}\n\n/**\n * Combine base scopes with custom scopes and remove duplicates\n *\n * @param customScopes - Additional scopes to include\n * @returns Deduplicated array of scope strings\n */\nexport function combineScopes(customScopes: string[] = []): string[] {\n  const baseScopes = buildBaseScopes();\n  const allScopes = [...baseScopes, ...customScopes];\n\n  // Remove duplicates while preserving order\n  return Array.from(new Set(allScopes));\n}\n\n/**\n * Validate that a scope string has the correct format\n * Expected format: \"address::module::function\"\n * Each part can use \"*\" as a wildcard\n *\n * @param scope - Scope string to validate\n * @returns true if valid, false otherwise\n */\nexport function validateScopeFormat(scope: string): boolean {\n  if (!scope || typeof scope !== 'string') {\n    return false;\n  }\n\n  const parts = scope.split('::');\n  if (parts.length !== 3) {\n    return false;\n  }\n\n  const [address, module, func] = parts;\n\n  // Each part must be non-empty\n  if (!address || !module || !func) {\n    return false;\n  }\n\n  // Address should be either '*' or valid hex/bech32 format (basic check)\n  if (address !== '*' && !isValidAddressFormat(address)) {\n    return false;\n  }\n\n  // Module and function can be any non-empty string or '*'\n  return true;\n}\n\n/**\n * Validate multiple scope strings\n *\n * @param scopes - Array of scope strings to validate\n * @returns Object with validation result and any invalid scopes\n */\nexport function validateScopes(scopes: string[]): {\n  valid: boolean;\n  invalidScopes: string[];\n} {\n  const invalidScopes = scopes.filter(scope => !validateScopeFormat(scope));\n\n  return {\n    valid: invalidScopes.length === 0,\n    invalidScopes,\n  };\n}\n\n/**\n * Basic validation for address format\n * Accepts hex addresses (0x...) and bech32 addresses (rooch1...)\n *\n * @param address - Address string to validate\n * @returns true if format appears valid\n */\nexport function isValidAddressFormat(address: string): boolean {\n  // Hex address format (0x followed by hex characters)\n  if (address.startsWith('0x')) {\n    return /^0x[0-9a-fA-F]+$/.test(address);\n  }\n\n  // Bech32 format (rooch1 followed by valid characters)\n  if (address.startsWith('rooch1')) {\n    return /^rooch1[0-9a-z]+$/.test(address);\n  }\n\n  // Only allow specific valid formats, reject everything else\n  return false;\n}\n\n/**\n * Convert a more readable scope object to string format\n * This provides a type-safe way to construct scopes\n */\nexport interface ScopeObject {\n  address: string;\n  module: string;\n  func: string;\n}\n\n/**\n * Convert scope object to string format\n *\n * @param scope - Scope object\n * @returns Scope string in \"address::module::function\" format\n */\nexport function scopeObjectToString(scope: ScopeObject): string {\n  return `${scope.address}::${scope.module}::${scope.func}`;\n}\n\n/**\n * Convert multiple scope objects to string format\n *\n * @param scopes - Array of scope objects\n * @returns Array of scope strings\n */\nexport function scopeObjectsToStrings(scopes: ScopeObject[]): string[] {\n  return scopes.map(scopeObjectToString);\n}\n","// Rooch Local Node Manager for test helpers\n// Provides lightweight local node management without external dependencies\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { createServer } from 'net';\nimport { mkdtemp, rm } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { promisify } from 'util';\nimport type { RoochNodeOptions, RoochNodeHandle } from './types';\n\n/**\n * Rooch Local Node Manager\n *\n * Provides lightweight local Rooch node management for testing scenarios.\n * Uses only Node.js built-in modules without external dependencies.\n */\nexport class RoochLocalNode {\n  /**\n   * Start a local Rooch node\n   *\n   * @param opts Configuration options\n   * @returns Handle to the running node\n   */\n  static async start(opts: RoochNodeOptions = {}): Promise<RoochNodeHandle> {\n    // 1. Validate binary path\n    const binaryPath = opts.binaryPath || process.env.ROOCH_E2E_BIN;\n    if (!binaryPath) {\n      throw new Error('Rooch binary path not found. Set ROOCH_E2E_BIN environment variable or provide binaryPath option.');\n    }\n\n    if (!existsSync(binaryPath)) {\n      throw new Error(`Rooch binary not found at: ${binaryPath}`);\n    }\n\n    // 2. Allocate port if not specified\n    const port = opts.port || await this.findAvailablePort();\n\n    // 3. Create temporary directories\n    const dataDir = opts.dataDir || await mkdtemp(join(tmpdir(), 'rooch-data-'));\n    const logsDir = opts.logsDir || await mkdtemp(join(tmpdir(), 'rooch-logs-'));\n\n    // 4. Initialize Rooch config (required before starting server)\n    await this.initializeConfig(binaryPath, dataDir);\n\n    // 5. Prepare spawn arguments\n    const args = [\n      'server', 'start',\n      '-n', opts.network || 'local',\n      '-d', dataDir,\n      '--port', port.toString(),\n      '--config-dir', dataDir,\n      ...(opts.serverArgs || [])\n    ];\n\n    const child: ChildProcess = spawn(binaryPath, args, {\n      stdio: ['ignore', 'pipe', 'pipe'],\n      env: {\n        ...process.env,\n        ROOCH_CONFIG_DIR: dataDir\n      }\n    });\n\n    // Handle stdout and stderr to prevent pipe buffer from filling up\n    if (child.stdout) {\n      child.stdout.on('data', (data) => {\n        console.log(`[Rooch ${port}] ${data.toString()}`);\n      });\n    }\n\n    if (child.stderr) {\n      child.stderr.on('data', (data) => {\n        console.error(`[Rooch ${port}] ${data.toString()}`);\n      });\n    }\n\n    try {\n\n      if (!child.pid) {\n        throw new Error('Failed to spawn Rooch process');\n      }\n\n      // 5. Wait for startup and perform health check\n      await this.ensureReady(`http://127.0.0.1:${port}`, child);\n\n      return {\n        rpcUrl: `http://127.0.0.1:${port}`,\n        port,\n        pid: child.pid,\n        dataDir,\n        logsDir,\n        stop: () => this.stop(child, port, dataDir, logsDir),\n        isRunning: () => this.isRunning(child.pid!)\n      };\n\n    } catch (error) {\n      // Cleanup on failure\n      try {\n        if (!child.killed) {\n          child.kill('SIGKILL');\n        }\n      } catch {}\n\n      // Cleanup directories unless TESTBOX_KEEP_TMP is set\n      if (process.env.TESTBOX_KEEP_TMP !== '1') {\n        try {\n          await rm(dataDir, { recursive: true, force: true });\n          await rm(logsDir, { recursive: true, force: true });\n        } catch {}\n      }\n\n      throw error;\n    }\n  }\n\n  /**\n   * Ensure a Rooch node is ready by checking chain ID\n   *\n   * @param rpcUrl RPC URL of the node\n   * @param child Optional child process to check for exit\n   * @param timeout Timeout in milliseconds\n   */\n  static async ensureReady(rpcUrl: string, child?: ChildProcess, timeout = 30000): Promise<void> {\n    const startTime = Date.now();\n    const method = 'rooch_getChainID';\n\n    while (Date.now() - startTime < timeout) {\n      // Check if process is still running (if provided)\n      if (child && (child.killed || child.exitCode !== null)) {\n        throw new Error(`Rooch node process exited unexpectedly with code ${child.exitCode}`);\n      }\n\n      try {\n        const response = await fetch(rpcUrl, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            jsonrpc: '2.0',\n            id: 1,\n            method,\n            params: []\n          }),\n          signal: AbortSignal.timeout(5000)\n        });\n\n        const data = await response.json();\n        if (!data.error && data.result !== null) {\n          return; // Node is ready\n        }\n      } catch (error) {\n        // Node not ready yet, continue waiting\n      }\n\n      // Wait before retrying (exponential backoff)\n      await new Promise(resolve => setTimeout(resolve, 1000));\n    }\n\n    throw new Error(`Rooch node not ready after ${timeout}ms at ${rpcUrl}`);\n  }\n\n  /**\n   * Initialize Rooch configuration in a directory\n   *\n   * @param binaryPath Path to rooch binary\n   * @param configDir Directory to initialize config in\n   */\n  private static async initializeConfig(binaryPath: string, configDir: string): Promise<void> {\n    const { execFileSync } = await import('child_process');\n\n    try {\n      execFileSync(binaryPath, ['init', '--config-dir', configDir, '--skip-password'], {\n        stdio: 'pipe'\n      });\n    } catch (error: any) {\n      throw new Error(`Failed to initialize Rooch config: ${error?.message || error}`);\n    }\n  }\n\n  /**\n   * Find an available port starting from the given port\n   *\n   * @param startPort Starting port number\n   * @returns Available port number\n   */\n  static async findAvailablePort(startPort = 6767): Promise<number> {\n    for (let port = startPort; port < startPort + 100; port++) {\n      if (await this.isPortAvailable(port)) {\n        return port;\n      }\n    }\n    throw new Error(`No available ports found starting from ${startPort}`);\n  }\n\n  /**\n   * Check if a port is available\n   *\n   * @param port Port number to check\n   * @returns True if port is available\n   */\n  static async isPortAvailable(port: number): Promise<boolean> {\n    return new Promise((resolve) => {\n      const server = createServer();\n\n      server.listen(port, () => {\n        server.close(() => resolve(true));\n      });\n\n      server.on('error', () => resolve(false));\n    });\n  }\n\n  /**\n   * Stop a running node with cleanup\n   *\n   * @param child Child process to stop\n   * @param port Port number to cleanup\n   * @param dataDir Data directory to cleanup\n   * @param logsDir Logs directory to cleanup\n   */\n  private static async stop(\n    child: ChildProcess,\n    port: number,\n    dataDir: string,\n    logsDir: string\n  ): Promise<void> {\n    // 1. Graceful shutdown with SIGTERM\n    if (!child.killed) {\n      child.kill('SIGTERM');\n\n      // Wait for graceful exit (max 10 seconds)\n      await new Promise<void>((resolve) => {\n        const timeout = setTimeout(() => {\n          if (!child.killed) {\n            child.kill('SIGKILL');\n          }\n          resolve();\n        }, 10000);\n\n        child.on('exit', () => {\n          clearTimeout(timeout);\n          resolve();\n        });\n      });\n    }\n\n    // 2. Ensure port is fully released\n    await this.waitForPortRelease(port);\n\n    // 3. Cleanup temporary directories (unless TESTBOX_KEEP_TMP)\n    if (process.env.TESTBOX_KEEP_TMP !== '1') {\n      try {\n        await Promise.all([\n          rm(dataDir, { recursive: true, force: true }),\n          rm(logsDir, { recursive: true, force: true })\n        ]);\n      } catch (error) {\n        // Log cleanup errors but don't fail\n        console.warn('Warning: Failed to cleanup temporary directories:', error);\n      }\n    }\n  }\n\n  /**\n   * Check if a process is running\n   *\n   * @param pid Process ID\n   * @returns True if process is running\n   */\n  private static isRunning(pid: number): boolean {\n    try {\n      process.kill(pid, 0); // Signal 0 just checks if process exists\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Wait for a port to be released\n   *\n   * @param port Port number\n   * @param maxWait Maximum wait time in milliseconds\n   */\n  private static async waitForPortRelease(port: number, maxWait = 5000): Promise<void> {\n    const startTime = Date.now();\n\n    while (Date.now() - startTime < maxWait) {\n      if (await this.isPortAvailable(port)) {\n        return; // Port is released\n      }\n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n\n    // Force cleanup on Unix-like systems\n    if (process.platform !== 'win32') {\n      try {\n        const { execSync } = await import('child_process');\n        execSync(`lsof -ti:${port} | xargs kill -9 2>/dev/null || true`, {\n          stdio: 'ignore',\n          timeout: 2000\n        });\n      } catch {\n        // Ignore cleanup errors\n      }\n    }\n  }\n}\n\n/**\n * Convenience function to start a local Rooch node\n *\n * @param opts Configuration options\n * @returns Handle to the running node\n */\nexport async function startLocalRoochNode(opts: RoochNodeOptions = {}): Promise<RoochNodeHandle> {\n  return await RoochLocalNode.start(opts);\n}\n\n/**\n * Convenience function to check if a Rooch node is ready\n *\n * @param rpcUrl RPC URL of the node\n * @param timeout Timeout in milliseconds\n */\nexport async function ensureRoochReady(rpcUrl: string, timeout = 30000): Promise<void> {\n  await RoochLocalNode.ensureReady(rpcUrl, undefined, timeout);\n}","import { TestEnv } from './env';\n\n/**\n * Utility functions for Rooch testing\n */\nexport const RoochTestUtils = {\n  /**\n   * Check if we should skip integration tests\n   */\n  shouldSkip(): boolean {\n    return TestEnv.skipIfNoNode();\n  },\n\n  /**\n   * Get environment check result\n   */\n  checkEnvironment(): any {\n    return TestEnv.checkEnvironmentSync();\n  },\n};\n\n/**\n * Convenience function to bootstrap a Rooch test environment\n * This is an alias for TestEnv.bootstrap() for backward compatibility\n */\nexport async function bootstrapRoochTestEnv(options: any = {}): Promise<TestEnv> {\n  return TestEnv.bootstrap(options);\n}\n","import { Secp256k1Keypair, Ed25519Keypair, Keypair } from '@roochnetwork/rooch-sdk';\nimport { KeyType } from '../types/crypto';\nimport { KeyManager } from '../keys/KeyManager';\nimport { MemoryKeyStore } from '../keys/KeyStore';\nimport { DidAccountSigner } from '../signers/didAccountSigner';\nimport { DIDCreationRequest } from '../vdr/types';\nimport { MultibaseCodec, DidKeyCodec } from '../multibase';\nimport { CryptoUtils } from '../crypto';\nimport { IdentityKit } from '../IdentityKit';\nimport { IdentityEnv } from '../IdentityEnv';\nimport { CreateSelfDidResult, CreateSelfDidOptions, CreateCadopDidOptions } from './types';\nimport { CadopServiceType } from '../CadopIdentityKit';\n\n// Forward declaration to avoid circular import\ninterface TestEnv {\n  rpcUrl: string;\n  network: string;\n  vdrRegistry: any;\n  roochVDR: any;\n  fundAccount(address: string, amount?: bigint): Promise<void>;\n}\n\n/**\n * Create a self-managed DID by calling the on-chain create_did_object_for_self function\n */\nexport async function createSelfDid(\n  env: TestEnv,\n  options: CreateSelfDidOptions = {}\n): Promise<CreateSelfDidResult> {\n  const { keyType = KeyType.SECP256K1, keyFragment = 'account-key', skipFunding = true } = options;\n\n  // Generate keypair based on type\n  let roochKeyPair: Keypair;\n  if (keyType === KeyType.SECP256K1) {\n    if (options.secretKey) {\n      roochKeyPair = Secp256k1Keypair.fromSecretKey(options.secretKey);\n    } else {\n      roochKeyPair = Secp256k1Keypair.generate();\n    }\n  } else if (keyType === KeyType.ED25519) {\n    if (options.secretKey) {\n      roochKeyPair = Ed25519Keypair.fromSecretKey(options.secretKey);\n    } else {\n      roochKeyPair = Ed25519Keypair.generate();\n    }\n  } else {\n    throw new Error(`Unsupported key type for Rooch: ${keyType}`);\n  }\n\n  const address = roochKeyPair.getRoochAddress();\n\n  // Fund the account if needed\n  if (!skipFunding) {\n    await env.fundAccount(address.toBech32Address());\n  }\n\n  // Create creation request\n  const publicKeyMultibase = MultibaseCodec.encodeBase58btc(roochKeyPair.getPublicKey().toBytes());\n  const creationRequest: DIDCreationRequest = {\n    publicKeyMultibase,\n    keyType: keyType,\n    initialRelationships: [\n      'authentication',\n      'assertionMethod',\n      'capabilityInvocation',\n      'capabilityDelegation',\n    ],\n    customScopes: options.customScopes,\n  };\n\n  // Create DID on-chain using VDR\n  const result = await env.vdrRegistry.createDID('rooch', creationRequest, {\n    signer: roochKeyPair,\n  });\n\n  if (!result.success || !result.didDocument) {\n    throw new Error(`Failed to create DID on-chain: ${result.error || 'Unknown error'}`);\n  }\n\n  const did = result.didDocument.id;\n\n  // Create KeyManager and import the keypair\n  const keyStore = new MemoryKeyStore();\n  const keyManager = KeyManager.createEmpty(did, keyStore);\n  const keyId = await keyManager.importRoochKeyPair(keyFragment, roochKeyPair);\n\n  // Create signer\n  const signer = await DidAccountSigner.create(keyManager, keyId);\n\n  // Create a dedicated IdentityEnv for this DID\n  const identityEnv = new IdentityEnv(env.vdrRegistry, keyManager);\n\n  return {\n    did,\n    vmIdFragment: keyFragment,\n    keyManager,\n    signer,\n    identityEnv,\n  };\n}\n\n/**\n * Create a custodian DID with CADOP service\n */\nexport async function createCadopCustodian(\n  env: TestEnv,\n  options: Pick<CreateCadopDidOptions, 'custodianKeyType' | 'skipFunding'> = {}\n): Promise<CreateSelfDidResult> {\n  const { custodianKeyType = KeyType.SECP256K1, skipFunding = false } = options;\n\n  // Create custodian DID\n  const custodian = await createSelfDid(env, {\n    keyType: custodianKeyType,\n    skipFunding,\n  });\n\n  // Add CADOP service using IdentityKit\n  const custodianKit = await IdentityKit.fromExistingDID(custodian.did, custodian.signer);\n\n  // Add CADOP custodian service to custodian DID\n  const custodianAuthMethods = custodianKit.getDIDDocument().verificationMethod || [];\n  const custodianAuthMethod = custodianAuthMethods[0];\n\n  if (!custodianAuthMethod) {\n    throw new Error('No authentication method found in custodian DID document');\n  }\n\n  await custodianKit.addService({\n    idFragment: 'cadop-custodian',\n    type: CadopServiceType.CUSTODIAN,\n    serviceEndpoint: 'https://example.com/cadop',\n    additionalProperties: {\n      custodianPublicKey: custodianAuthMethod.publicKeyMultibase,\n      custodianServiceVMType: custodianAuthMethod.type,\n    },\n  });\n\n  return custodian;\n}\n\n/**\n * Create a user DID via CADOP protocol using an existing custodian\n */\nexport async function createDidViaCadop(\n  env: TestEnv,\n  custodian: CreateSelfDidResult,\n  options: Pick<CreateCadopDidOptions, 'userKeyType'> = {}\n): Promise<CreateSelfDidResult> {\n  const { userKeyType = KeyType.ED25519 } = options;\n\n  const custodianKit = await IdentityKit.fromExistingDID(custodian.did, custodian.signer);\n\n  // Generate user's did:key\n  const userKeyPair = await CryptoUtils.generateKeyPair(userKeyType);\n  const userDidKey = DidKeyCodec.generateDidKey(userKeyPair.publicKey, userKeyType);\n\n  // Get custodian's authentication method for service key\n  const custodianAuthMethod = custodianKit.getDIDDocument().verificationMethod?.[0];\n  if (!custodianAuthMethod) {\n    throw new Error('No authentication method found in custodian DID document');\n  }\n\n  // Create user DID via CADOP\n  const cadopResult = await env.vdrRegistry.createDIDViaCADOP(\n    'rooch',\n    {\n      userDidKey,\n      custodianServicePublicKey: custodianAuthMethod.publicKeyMultibase!,\n      custodianServiceVMType: custodianAuthMethod.type,\n    },\n    {\n      signer: custodian.signer,\n    }\n  );\n\n  if (!cadopResult.success || !cadopResult.didDocument) {\n    throw new Error(`Failed to create user DID via CADOP: ${cadopResult.error || 'Unknown error'}`);\n  }\n\n  const userDid = cadopResult.didDocument.id;\n\n  // Create user's KeyManager with the did:key keypair\n  const userKeyStore = new MemoryKeyStore();\n  const userKeyManager = KeyManager.createEmpty(userDid, userKeyStore);\n  const userKeyFragment = 'account-key';\n  const userKeyId = await userKeyManager.importKeyPair(userKeyFragment, userKeyPair, userKeyType);\n\n  // Create user signer\n  const userSigner = await DidAccountSigner.create(userKeyManager, userKeyId);\n\n  // Create a dedicated IdentityEnv for this user DID\n  const userIdentityEnv = new IdentityEnv(env.vdrRegistry, userKeyManager);\n\n  return {\n    did: userDid,\n    vmIdFragment: userKeyFragment,\n    keyManager: userKeyManager,\n    signer: userSigner,\n    identityEnv: userIdentityEnv,\n  };\n}\n","import { KeyType } from '../types/crypto';\n\n/**\n * Represents a stored cryptographic key with its metadata\n */\nexport interface StoredKey {\n  /** Complete verification method ID (contains the DID + fragment) */\n  keyId: string;\n  /** Cryptographic curve/algorithm */\n  keyType: KeyType;\n  /** Multibase encoded public key */\n  publicKeyMultibase: string;\n  /** Optional multibase encoded private key */\n  privateKeyMultibase?: string;\n  /** Generic key-value metadata for implementation-specific extensions */\n  meta?: Record<string, any>;\n}\n\n/**\n * Interface for key storage implementations\n * Different environments (browser, node, react-native) can provide their own implementations\n */\nexport interface KeyStore {\n  /**\n   * List all available key IDs in this store\n   * @returns Promise resolving to array of key IDs\n   */\n  listKeyIds(): Promise<string[]>;\n\n  /**\n   * Load a key by its ID\n   * @param keyId Optional key ID to load (if omitted, may return a default key)\n   * @returns Promise resolving to the stored key or null if not found\n   */\n  load(keyId?: string): Promise<StoredKey | null>;\n\n  /**\n   * Save a key to storage\n   * @param key The key to save\n   */\n  save(key: StoredKey): Promise<void>;\n\n  /**\n   * Clear a specific key or all keys\n   * @param keyId Optional key ID to clear (if omitted, clears all keys)\n   */\n  clear(keyId?: string): Promise<void>;\n\n  /**\n   * Optional: Sign data directly using the specified key\n   * Implementations for WebAuthn or non-extractable CryptoKeys should provide this\n   * @param keyId ID of the key to use for signing\n   * @param data Data to sign\n   * @returns Signature as Uint8Array\n   */\n  sign?(keyId: string, data: Uint8Array): Promise<Uint8Array>;\n}\n\n/**\n * In-memory implementation of KeyStore\n * Useful for testing and SSR environments\n */\nexport class MemoryKeyStore implements KeyStore {\n  private map = new Map<string, StoredKey>();\n\n  /**\n   * List all available key IDs in this store\n   */\n  async listKeyIds(): Promise<string[]> {\n    return Array.from(this.map.keys());\n  }\n\n  /**\n   * Load a key by its ID\n   * @param keyId Key ID to load\n   */\n  async load(keyId?: string): Promise<StoredKey | null> {\n    if (!keyId) {\n      // Return first key if no specific ID requested\n      const firstKey = Array.from(this.map.values())[0];\n      return firstKey || null;\n    }\n    return this.map.get(keyId) || null;\n  }\n\n  /**\n   * Save a key to in-memory storage\n   * @param key The key to save\n   */\n  async save(key: StoredKey): Promise<void> {\n    this.map.set(key.keyId, key);\n  }\n\n  /**\n   * Clear a specific key or all keys\n   * @param keyId Optional key ID to clear (if omitted, clears all keys)\n   */\n  async clear(keyId?: string): Promise<void> {\n    if (keyId) {\n      this.map.delete(keyId);\n    } else {\n      this.map.clear();\n    }\n  }\n\n  // No sign implementation for MemoryKeyStore; relies on plaintext extraction.\n}\n","import { StoredKey } from './KeyStore';\nimport { MultibaseCodec } from '../multibase';\nimport { CryptoUtils } from '../crypto/utils';\nimport { stringToBytes, bytesToString } from '../utils/bytes';\nimport { IdentityKitErrorCode, createValidationError } from '../errors';\n\n/**\n * Codec for serializing and deserializing StoredKey objects\n * Uses base58btc multibase encoding (z prefix) for string representation\n */\nexport class StoredKeyCodec {\n  /**\n   * Encode a StoredKey to a base58btc multibase string\n   * @param key The StoredKey to encode\n   * @returns base58btc encoded string with 'z' prefix\n   */\n  static encode(key: StoredKey): string {\n    const json = JSON.stringify(key);\n    const jsonBytes = stringToBytes(json);\n    return MultibaseCodec.encodeBase58btc(jsonBytes);\n  }\n\n  /**\n   * Decode a multibase string to a StoredKey with automatic key consistency validation\n   * @param serialized The multibase encoded string\n   * @returns The decoded and validated StoredKey\n   * @throws Error if decoding fails or key validation fails\n   */\n  static async decode(serialized: string): Promise<StoredKey> {\n    const jsonBytes = MultibaseCodec.decode(serialized);\n    const jsonStr = bytesToString(jsonBytes);\n    const key = JSON.parse(jsonStr) as StoredKey;\n\n    // Automatically validate key consistency for security\n    const isValid = await this.validateKeyConsistency(key);\n    if (!isValid) {\n      throw createValidationError(\n        IdentityKitErrorCode.KEY_VALIDATION_FAILED,\n        'StoredKey validation failed: private and public keys are inconsistent',\n        { keyId: key.keyId, keyType: key.keyType }\n      );\n    }\n\n    return key;\n  }\n\n  /**\n   * Validate the consistency between private key and public key in StoredKey\n   * @param key The StoredKey to validate\n   * @returns true if keys are consistent or validation can be skipped, false otherwise\n   */\n  private static async validateKeyConsistency(key: StoredKey): Promise<boolean> {\n    if (\n      !key.privateKeyMultibase ||\n      !key.publicKeyMultibase ||\n      key.privateKeyMultibase.trim() === '' ||\n      key.publicKeyMultibase.trim() === ''\n    ) {\n      // Skip validation if either key is missing or empty\n      return true;\n    }\n\n    try {\n      // Decode private and public keys\n      const privateKeyBytes = MultibaseCodec.decode(key.privateKeyMultibase);\n      const publicKeyBytes = MultibaseCodec.decode(key.publicKeyMultibase);\n\n      // Use the centralized validation method from CryptoUtils\n      return await CryptoUtils.validateKeyPairConsistency(\n        privateKeyBytes,\n        publicKeyBytes,\n        key.keyType\n      );\n    } catch (error) {\n      console.warn('Key consistency validation failed:', error);\n      return false;\n    }\n  }\n}\n","import { SignerInterface } from '../signers/types';\nimport { KeyType, roochSignatureSchemeToKeyType } from '../types/crypto';\nimport { CryptoUtils } from '../crypto';\nimport { KeyStore, StoredKey, MemoryKeyStore } from './KeyStore';\nimport { StoredKeyCodec } from './StoredKeyCodec';\nimport {\n  signWithKeyStore,\n  canSignWithKeyStore,\n  getKeyInfoFromKeyStore,\n} from '../signers/keyStoreUtils';\nimport { MultibaseCodec, KeyMultibaseCodec } from '../multibase';\nimport { decodeRoochSercetKey, Keypair } from '@roochnetwork/rooch-sdk';\nimport { getDidWithoutFragment } from '../utils/did';\nimport { IdentityKitErrorCode, createKeyManagementError, createValidationError } from '../errors';\n\n/**\n * Options for initializing a KeyManager\n */\nexport interface KeyManagerOptions {\n  /** The key store to use (defaults to MemoryKeyStore) */\n  store?: KeyStore;\n  /** Default key type to use when generating keys (defaults to Ed25519) */\n  defaultKeyType?: KeyType;\n  /** DID to associate with keys */\n  did?: string;\n}\n\n/**\n * KeyManager provides unified key lifecycle management\n * It implements SignerInterface and delegates to an underlying KeyStoreSigner\n */\nexport class KeyManager implements SignerInterface {\n  private store: KeyStore;\n  private defaultKeyType: KeyType;\n  private did?: string;\n\n  /**\n   * Create a new KeyManager\n   * @param options Configuration options\n   */\n  constructor(options?: KeyManagerOptions) {\n    this.store = options?.store || new MemoryKeyStore();\n    this.did = options?.did;\n    this.defaultKeyType = options?.defaultKeyType || KeyType.ED25519;\n  }\n\n  /**\n   * Generate a new key and store it\n   * @param fragment Optional fragment for the key ID (e.g., 'key-1')\n   * @param keyType Optional key type (defaults to the manager's defaultKeyType)\n   * @returns The stored key information\n   */\n  async generateKey(fragment?: string, keyType?: KeyType): Promise<StoredKey> {\n    if (!this.did) {\n      throw createKeyManagementError(\n        IdentityKitErrorCode.DID_NOT_SET,\n        'DID must be set before generating keys',\n        { operation: 'generateKey' }\n      );\n    }\n\n    const type = keyType || this.defaultKeyType;\n    const keyPair = await CryptoUtils.generateKeyPair(type);\n\n    // Create a key ID with the provided fragment or a timestamp\n    const keyFragment = fragment || `key-${Date.now()}`;\n    const keyId = `${this.did}#${keyFragment}`;\n\n    // Encode the keys\n    const publicKeyEncoded = MultibaseCodec.encodeBase58btc(keyPair.publicKey);\n    const privateKeyEncoded = MultibaseCodec.encodeBase58btc(keyPair.privateKey);\n\n    // Create the stored key\n    const storedKey: StoredKey = {\n      keyId,\n      keyType: type,\n      publicKeyMultibase: publicKeyEncoded,\n      privateKeyMultibase: privateKeyEncoded,\n    };\n\n    // Save to the store\n    await this.store.save(storedKey);\n\n    return storedKey;\n  }\n\n  /**\n   * Import an existing key into the store\n   * @param key The key to import\n   */\n  async importKey(key: StoredKey): Promise<void> {\n    const didFromKey = getDidWithoutFragment(key.keyId);\n\n    if (this.did && didFromKey !== this.did) {\n      throw createKeyManagementError(\n        IdentityKitErrorCode.KEY_DID_MISMATCH,\n        `Key belongs to a different DID: ${didFromKey}`,\n        { expectedDid: this.did, actualDid: didFromKey, keyId: key.keyId }\n      );\n    }\n\n    if (!this.did) {\n      this.did = didFromKey;\n    }\n\n    await this.store.save(key);\n  }\n\n  /**\n   * Delete a key from the store\n   * @param keyId ID of the key to delete\n   */\n  async deleteKey(keyId: string): Promise<void> {\n    await this.store.clear(keyId);\n  }\n\n  /**\n   * Clear all keys from the store\n   */\n  async clear(): Promise<void> {\n    await this.store.clear();\n  }\n\n  /**\n   * List all available key IDs\n   */\n  async listKeyIds(): Promise<string[]> {\n    return this.store.listKeyIds();\n  }\n\n  /**\n   * Get a stored key by its ID\n   * @param keyId ID of the key to retrieve\n   * @returns The stored key or null if not found\n   */\n  async getStoredKey(keyId: string): Promise<StoredKey | null> {\n    return this.store.load(keyId);\n  }\n\n  /**\n   * Set the DID for this manager\n   * @param did The DID to set\n   */\n  setDid(did: string): void {\n    this.did = did;\n  }\n\n  /**\n   * Get the DID\n   * @returns The DID\n   */\n  async getDid(): Promise<string> {\n    if (this.did) return this.did;\n\n    // Attempt to derive from stored keys\n    const keyIds = await this.listKeyIds();\n    if (keyIds.length > 0) {\n      this.did = getDidWithoutFragment(keyIds[0]);\n      return this.did;\n    }\n\n    // No DID found\n    throw createKeyManagementError(\n      IdentityKitErrorCode.DID_NOT_SET,\n      'DID not initialised. Call setDid() or import a key first.',\n      { operation: 'getDidAccountSigner' }\n    );\n  }\n\n  /**\n   * Sign data with a specific key\n   * @param data Data to sign\n   * @param keyId ID of the key to use\n   * @returns The signature\n   */\n  async signWithKeyId(data: Uint8Array, keyId: string): Promise<Uint8Array> {\n    return signWithKeyStore(this.store, data, keyId);\n  }\n\n  /**\n   * Check if a key is available for signing\n   * @param keyId ID of the key to check\n   * @returns True if the key exists and can be used for signing\n   */\n  async canSignWithKeyId(keyId: string): Promise<boolean> {\n    return canSignWithKeyStore(this.store, keyId);\n  }\n\n  /**\n   * Get information about a specific key\n   * @param keyId ID of the key to get information about\n   * @returns Key information or undefined if not found\n   */\n  async getKeyInfo(keyId: string): Promise<{ type: KeyType; publicKey: Uint8Array } | undefined> {\n    return getKeyInfoFromKeyStore(this.store, keyId);\n  }\n\n  /**\n   * Find the first key with a specific key type\n   * @param keyType The key type to search for\n   * @returns The key ID or undefined if not found\n   */\n  async findKeyByType(keyType: KeyType): Promise<string | undefined> {\n    const keyIds = await this.listKeyIds();\n\n    for (const keyId of keyIds) {\n      const key = await this.getStoredKey(keyId);\n      if (key && key.keyType === keyType) {\n        return keyId;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get the underlying key store\n   * @returns The key store\n   */\n  getStore(): KeyStore {\n    return this.store;\n  }\n\n  /** Create an empty KeyManager instance and bind DID */\n  static createEmpty(did: string, store: KeyStore = new MemoryKeyStore()): KeyManager {\n    const km = new KeyManager({ store });\n    km.setDid(did);\n    return km;\n  }\n\n  /** Create KeyManager and immediately generate a key */\n  static async createWithNewKey(\n    did: string,\n    fragment = `key-${Date.now()}`,\n    type: KeyType = KeyType.ED25519,\n    store: KeyStore = new MemoryKeyStore()\n  ): Promise<{ keyManager: KeyManager; keyId: string }> {\n    const km = KeyManager.createEmpty(did, store);\n    const stored = await km.generateKey(fragment, type);\n    return { keyManager: km, keyId: stored.keyId };\n  }\n\n  /** Create KeyManager and import existing key pair */\n  static async createWithKeyPair(\n    did: string,\n    keyPair: { privateKey: Uint8Array; publicKey: Uint8Array },\n    fragment = 'account-key',\n    type: KeyType = KeyType.ED25519,\n    store: KeyStore = new MemoryKeyStore()\n  ): Promise<{ keyManager: KeyManager; keyId: string }> {\n    const km = KeyManager.createEmpty(did, store);\n    const keyId = await km.importKeyPair(fragment, keyPair, type);\n    return { keyManager: km, keyId };\n  }\n\n  /** Utility: generate did:key + master key */\n  static async createWithDidKey(): Promise<{ keyManager: KeyManager; keyId: string; did: string }> {\n    const { publicKey, privateKey } = await CryptoUtils.generateKeyPair(KeyType.ED25519);\n    const publicKeyMultibase = KeyMultibaseCodec.encodeWithType(publicKey, KeyType.ED25519);\n    const didKey = `did:key:${publicKeyMultibase}`;\n    const km = KeyManager.createEmpty(didKey);\n    const keyId = await km.importKeyPair('account-key', { privateKey, publicKey }, KeyType.ED25519);\n    return { keyManager: km, keyId, did: didKey };\n  }\n\n  /** Instance helper: import raw key pair (Uint8Array) */\n  async importKeyPair(\n    fragment: string,\n    keyPair: { privateKey: Uint8Array; publicKey: Uint8Array },\n    type: KeyType = KeyType.ED25519\n  ): Promise<string> {\n    const did = await this.getDid();\n    const keyId = `${did}#${fragment}`;\n\n    if (await this.getKeyInfo(keyId)) {\n      throw createKeyManagementError(\n        IdentityKitErrorCode.KEY_ALREADY_EXISTS,\n        `Key ID ${keyId} already exists in store`,\n        { keyId }\n      );\n    }\n\n    // Validate key pair consistency for security\n    const isConsistent = await CryptoUtils.validateKeyPairConsistency(\n      keyPair.privateKey,\n      keyPair.publicKey,\n      type\n    );\n    if (!isConsistent) {\n      throw createValidationError(\n        IdentityKitErrorCode.KEY_VALIDATION_FAILED,\n        'Key pair validation failed: private and public keys are inconsistent',\n        { keyId, keyType: type }\n      );\n    }\n\n    await this.importKey({\n      keyId,\n      keyType: type,\n      publicKeyMultibase: MultibaseCodec.encodeBase58btc(keyPair.publicKey),\n      privateKeyMultibase: MultibaseCodec.encodeBase58btc(keyPair.privateKey),\n    });\n\n    return keyId;\n  }\n\n  /** Instance helper: import Rooch Keypair */\n  async importRoochKeyPair(fragment: string, roochKeyPair: Keypair): Promise<string> {\n    const { secretKey, schema } = decodeRoochSercetKey(roochKeyPair.getSecretKey());\n    const keyType: KeyType = roochSignatureSchemeToKeyType(schema);\n    return this.importKeyPair(\n      fragment,\n      {\n        privateKey: secretKey,\n        publicKey: roochKeyPair.getPublicKey().toBytes(),\n      },\n      keyType\n    );\n  }\n\n  /**\n   * Export a stored key to a base58btc encoded string\n   * @param keyId The ID of the key to export\n   * @returns base58btc encoded string representation of the StoredKey\n   */\n  async exportKeyToString(keyId: string): Promise<string> {\n    const key = await this.getStoredKey(keyId);\n    if (!key) {\n      throw createKeyManagementError(IdentityKitErrorCode.KEY_NOT_FOUND, `Key ${keyId} not found`, {\n        keyId,\n      });\n    }\n    return StoredKeyCodec.encode(key);\n  }\n\n  /**\n   * Import a StoredKey from a base58btc encoded string into the current KeyManager\n   * @param serialized The base58btc encoded string representation of a StoredKey\n   * @returns The imported StoredKey\n   */\n  async importKeyFromString(serialized: string): Promise<StoredKey> {\n    const key = await StoredKeyCodec.decode(serialized);\n    await this.importKey(key);\n    return key;\n  }\n\n  /**\n   * Create a new KeyManager from a serialized StoredKey string\n   * @param serialized The base58btc encoded string representation of a StoredKey\n   * @param store Optional key store (defaults to MemoryKeyStore)\n   * @returns A new KeyManager instance with the imported key\n   */\n  static async fromSerializedKey(\n    serialized: string,\n    store: KeyStore = new MemoryKeyStore()\n  ): Promise<KeyManager> {\n    const key = await StoredKeyCodec.decode(serialized);\n    const km = KeyManager.createEmpty(getDidWithoutFragment(key.keyId), store);\n    await km.importKey(key);\n    return km;\n  }\n}\n","import {\n  DIDDocument,\n  VerificationMethod,\n  VerificationRelationship,\n  ServiceEndpoint,\n} from '../types/did';\nimport {\n  DIDCreationRequest,\n  DIDCreationResult,\n  CADOPCreationRequest,\n  CADOPControllerCreationRequest,\n} from './types';\nimport { AbstractVDR } from './abstractVDR';\nimport { MultibaseCodec, DidKeyCodec } from '../multibase';\nimport { DebugLogger } from '../utils/DebugLogger';\nimport {\n  IdentityKitErrorCode,\n  createDIDError,\n  createVDRError,\n  createValidationError,\n} from '../errors';\n\n/**\n * KeyVDR handles did:key DIDs\n *\n * did:key DIDs are self-resolving as they contain the public key material\n * embedded in the identifier. This implementation follows the did:key method\n * specification.\n *\n * Example did:key: did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK\n *\n * Reference: https://w3c-ccg.github.io/did-method-key/\n */\n\n// Unified logger for KeyVDR\nconst logger = DebugLogger.get('KeyVDR');\n\nexport class KeyVDR extends AbstractVDR {\n  // In-memory cache of documents, shared across all instances\n  private static documentCache: Map<string, DIDDocument> = new Map();\n\n  constructor() {\n    super('key');\n  }\n\n  /**\n   * Resets the document cache - primarily for testing purposes\n   * to ensure tests don't interfere with each other.\n   */\n  public reset(): void {\n    KeyVDR.documentCache.clear();\n  }\n\n  /**\n   * Override resolve to handle test mode\n   */\n  async resolve(did: string): Promise<DIDDocument | null> {\n    try {\n      // Check the cache first\n      if (KeyVDR.documentCache.has(did)) {\n        return KeyVDR.documentCache.get(did)!;\n      }\n\n      return null;\n    } catch (error) {\n      logger.error(`Error resolving ${did}:`, error);\n      return null;\n    }\n  }\n\n  /**\n   * Add a verification method to a did:key document\n   * For did:key, this is mostly a simulation as the document is derived from the key\n   * This operation will update the local cache but not the actual structure of the did:key\n   *\n   * @param did The DID to update\n   * @param verificationMethod The verification method to add\n   * @param relationships Optional relationships to add the verification method to\n   * @param options Additional options like keyId for signing\n   * @returns Promise resolving to true if successful in updating the cache\n   */\n  async addVerificationMethod(\n    did: string,\n    verificationMethod: VerificationMethod,\n    relationships: VerificationRelationship[] = [],\n    options?: any\n  ): Promise<boolean> {\n    try {\n      const originalDocument = await this.resolve(did);\n      if (!originalDocument) {\n        throw createDIDError(IdentityKitErrorCode.DID_NOT_FOUND, `DID ${did} not found`, { did });\n      }\n\n      // Use parent class validation methods\n      await this.validateUpdateOperation(\n        did,\n        originalDocument,\n        options?.keyId,\n        'capabilityDelegation'\n      );\n      this.validateVerificationMethod(did, verificationMethod, originalDocument);\n\n      // Check for duplicate verification method ID\n      if (originalDocument.verificationMethod?.some(vm => vm.id === verificationMethod.id)) {\n        throw createValidationError(\n          IdentityKitErrorCode.VALIDATION_FAILED,\n          `Verification method ${verificationMethod.id} already exists`,\n          { verificationMethodId: verificationMethod.id, did }\n        );\n      }\n\n      if (!originalDocument.verificationMethod) {\n        originalDocument.verificationMethod = [];\n      }\n\n      // Add the verification method\n      originalDocument.verificationMethod.push(verificationMethod);\n\n      // Add relationships without duplicates\n      relationships.forEach(relationship => {\n        if (!originalDocument[relationship]) {\n          originalDocument[relationship] = [];\n        }\n        if (!originalDocument[relationship]!.includes(verificationMethod.id)) {\n          originalDocument[relationship]!.push(verificationMethod.id);\n        }\n      });\n\n      // Update the cache\n      KeyVDR.documentCache.set(did, originalDocument);\n      return true;\n    } catch (error) {\n      logger.error(`Error adding verification method to ${did}:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Remove a verification method from a did:key document\n   * For did:key, this is mostly a simulation as the document is derived from the key\n   * This operation will update the local cache but not the actual structure of the did:key\n   *\n   * @param did The DID to update\n   * @param keyId The ID of the verification method to remove\n   * @param options Additional options\n   * @returns Promise resolving to true if successful in updating the cache\n   */\n  async removeVerificationMethod(did: string, keyId: string, options?: any): Promise<boolean> {\n    try {\n      const originalDocument = await this.resolve(did);\n      if (!originalDocument) {\n        throw createDIDError(IdentityKitErrorCode.DID_NOT_FOUND, `DID ${did} not found`, { did });\n      }\n\n      // Use parent class validation method\n      await this.validateUpdateOperation(\n        did,\n        originalDocument,\n        options?.keyId,\n        'capabilityDelegation'\n      );\n\n      const verificationMethods = originalDocument.verificationMethod || [];\n      const vmIndex = verificationMethods.findIndex(vm => vm.id === keyId);\n      if (vmIndex === -1) {\n        // Verification method not found, silently succeed\n        return true;\n      }\n\n      const isPrimaryKey = vmIndex === 0;\n      if (isPrimaryKey) {\n        throw createValidationError(\n          IdentityKitErrorCode.OPERATION_NOT_PERMITTED,\n          `Cannot remove the primary key ${keyId} from did:key document`,\n          { keyId, did, reason: 'Primary key cannot be removed from did:key documents' }\n        );\n      }\n\n      originalDocument.verificationMethod = verificationMethods.filter(vm => vm.id !== keyId);\n\n      const relationships: VerificationRelationship[] = [\n        'authentication',\n        'assertionMethod',\n        'capabilityInvocation',\n        'capabilityDelegation',\n      ];\n      relationships.forEach(relationship => {\n        if (originalDocument[relationship]) {\n          originalDocument[relationship] = originalDocument[relationship]!.filter(\n            id => id !== keyId\n          );\n        }\n      });\n\n      KeyVDR.documentCache.set(did, originalDocument);\n      return true;\n    } catch (error) {\n      logger.error(`Error removing verification method from ${did}:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Add a service to a did:key document\n   * For did:key, this is mostly a simulation as the document is derived from the key\n   * This operation will update the local cache but not the actual structure of the did:key\n   *\n   * @param did The DID to update\n   * @param service The service to add\n   * @param options Additional options\n   * @returns Promise resolving to true if successful in updating the cache\n   */\n  async addService(did: string, service: ServiceEndpoint, options?: any): Promise<boolean> {\n    try {\n      const originalDocument = await this.resolve(did);\n      if (!originalDocument) {\n        throw createDIDError(IdentityKitErrorCode.DID_NOT_FOUND, `DID ${did} not found`, { did });\n      }\n\n      // Use parent class validation methods\n      await this.validateUpdateOperation(\n        did,\n        originalDocument,\n        options?.keyId,\n        'capabilityInvocation'\n      );\n      this.validateService(did, service, originalDocument);\n\n      if (!originalDocument.service) {\n        originalDocument.service = [];\n      }\n      originalDocument.service.push(service);\n\n      KeyVDR.documentCache.set(did, originalDocument);\n      return true;\n    } catch (error) {\n      logger.error(`Error adding service to ${did}:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Remove a service from a did:key document\n   * For did:key, this is mostly a simulation as the document is derived from the key\n   * This operation will update the local cache but not the actual structure of the did:key\n   *\n   * @param did The DID to update\n   * @param id The ID of the service to remove\n   * @param options Additional options\n   * @returns Promise resolving to true if successful in updating the cache\n   */\n  async removeService(did: string, serviceId: string, options?: any): Promise<boolean> {\n    try {\n      const originalDocument = await this.resolve(did);\n      if (!originalDocument) {\n        throw createDIDError(IdentityKitErrorCode.DID_NOT_FOUND, `DID ${did} not found`, { did });\n      }\n\n      // Use parent class validation method\n      await this.validateUpdateOperation(\n        did,\n        originalDocument,\n        options?.keyId,\n        'capabilityInvocation'\n      );\n\n      if (!originalDocument.service || !originalDocument.service.some(s => s.id === serviceId)) {\n        // Service not found, silently succeed\n        return true;\n      }\n\n      originalDocument.service = originalDocument.service.filter(s => s.id !== serviceId);\n\n      KeyVDR.documentCache.set(did, originalDocument);\n      return true;\n    } catch (error) {\n      logger.error(`Error removing service from ${did}:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Override create method for did:key\n   * For did:key, we can generate the DID from the public key\n   */\n  async create(request: DIDCreationRequest): Promise<DIDCreationResult> {\n    try {\n      // Validate the key format\n      if (!request.publicKeyMultibase || !request.publicKeyMultibase.startsWith('z')) {\n        return {\n          success: false,\n          error: 'Invalid key format: publicKeyMultibase must start with \"z\"',\n        };\n      }\n\n      if (!request.preferredDID || !request.controller) {\n        return {\n          success: false,\n          error: 'Missing required parameters: preferredDID and controller',\n        };\n      }\n\n      // Use the parent class method to build the DID document\n      const didDocument = this.buildDIDDocumentFromRequest(request);\n\n      // Store the document\n      KeyVDR.documentCache.set(request.preferredDID, didDocument);\n\n      return {\n        success: true,\n        didDocument,\n      };\n    } catch (error) {\n      logger.error(`Error creating DID document:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  async createViaCADOP(request: CADOPCreationRequest, _options?: any): Promise<DIDCreationResult> {\n    let { keyType, publicKey } = DidKeyCodec.parseDidKey(request.userDidKey);\n    try {\n      const didCreationRequest: DIDCreationRequest = {\n        publicKeyMultibase: MultibaseCodec.encodeBase58btc(publicKey),\n        preferredDID: request.userDidKey,\n        keyType: keyType,\n        controller: request.userDidKey,\n        initialRelationships: ['authentication', 'capabilityDelegation'],\n      };\n\n      const didDocument = this.buildDIDDocumentFromRequest(didCreationRequest);\n      KeyVDR.documentCache.set(didDocument.id!, didDocument);\n      return {\n        success: true,\n        didDocument,\n      };\n    } catch (error) {\n      logger.error(`Error creating DID document via CADOP:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  async createViaCADOPWithController(\n    request: CADOPControllerCreationRequest,\n    _options?: any\n  ): Promise<DIDCreationResult> {\n    // For KeyVDR, we only support did:key controllers\n    if (!request.controllerDid.startsWith('did:key:')) {\n      return {\n        success: false,\n        error: 'KeyVDR only supports did:key controllers. Use RoochVDR for other controller types.',\n      };\n    }\n\n    try {\n      // For did:key controllers, delegate to the regular CADOP method\n      const cadopRequest: CADOPCreationRequest = {\n        userDidKey: request.controllerDid,\n        custodianServicePublicKey: request.custodianServicePublicKey,\n        custodianServiceVMType: request.custodianServiceVMType,\n        customScopes: request.customScopes,\n      };\n\n      return this.createViaCADOP(cadopRequest, _options);\n    } catch (error) {\n      logger.error(`Error creating DID document via CADOP with controller:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  /**\n   * Update verification relationships for a verification method\n   */\n  async updateRelationships(\n    did: string,\n    keyId: string,\n    add: VerificationRelationship[],\n    remove: VerificationRelationship[],\n    options?: any\n  ): Promise<boolean> {\n    try {\n      const originalDocument = await this.resolve(did);\n      if (!originalDocument) {\n        throw createDIDError(IdentityKitErrorCode.DID_NOT_FOUND, `DID ${did} not found`, { did });\n      }\n\n      // Use parent class validation method\n      await this.validateUpdateOperation(\n        did,\n        originalDocument,\n        options?.keyId,\n        'capabilityDelegation'\n      );\n\n      // Check if the verification method exists\n      const verificationMethod = originalDocument.verificationMethod?.find(vm => vm.id === keyId);\n      if (!verificationMethod) {\n        throw createValidationError(\n          IdentityKitErrorCode.KEY_NOT_FOUND,\n          `Verification method ${keyId} not found`,\n          { keyId, did }\n        );\n      }\n\n      // Remove relationships\n      remove.forEach(relationship => {\n        if (originalDocument[relationship]) {\n          originalDocument[relationship] = originalDocument[relationship]!.filter(\n            id => id !== keyId\n          );\n        }\n      });\n\n      // Add relationships without duplicates\n      add.forEach(relationship => {\n        if (!originalDocument[relationship]) {\n          originalDocument[relationship] = [];\n        }\n        if (!originalDocument[relationship]!.includes(keyId)) {\n          originalDocument[relationship]!.push(keyId);\n        }\n      });\n\n      // Update the cache\n      KeyVDR.documentCache.set(did, originalDocument);\n      return true;\n    } catch (error) {\n      logger.error(`Error updating relationships for ${did}:`, error);\n      throw error;\n    }\n  }\n}\n","import { VDRInterface } from './types';\nimport { KeyVDR } from './keyVDR';\nimport { RoochVDR } from './roochVDR';\nimport { VDRRegistry } from './VDRRegistry';\nimport { IdentityKitErrorCode, createVDRError } from '../errors';\n\n/**\n * Factory function to create a VDR instance based on the DID method\n *\n * @param method DID method to create a VDR for\n * @param options Optional configuration for the VDR\n * @returns A VDR instance for the specified method\n */\nexport function createVDR(method: string, options?: any): VDRInterface {\n  switch (method.toLowerCase()) {\n    case 'key':\n      return new KeyVDR();\n    case 'rooch':\n      return new RoochVDR(options);\n    // Add additional DID methods as needed\n    default:\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No built-in VDR implementation available for method '${method}'`,\n        { method, availableMethods: ['key', 'rooch'] }\n      );\n  }\n}\n\n/**\n * Helper function to create a standard set of VDRs for common methods\n *\n * @param options Configuration options for various VDRs\n * @returns An array of VDR instances\n */\nexport function createDefaultVDRs(options?: { rooch?: any }): VDRInterface[] {\n  return [new KeyVDR(), new RoochVDR(options?.rooch || {})];\n}\n\n/**\n * Quickly create a default RoochVDR instance and register it into a VDRRegistry.\n *\n * 1. If the registry (default: global singleton) already contains a `rooch` VDR,\n *    the existing instance is returned directly – calling this function is\n *    therefore idempotent.\n * 2. The `network` parameter is forwarded to `RoochVDR.createDefault`, defaulting\n *    to `'test'` for most development scenarios.\n *\n * @param network  Rooch network: 'dev' | 'test' | 'main'. Defaults to 'test'.\n * @param registry Optional registry to register into. Defaults to the global singleton.\n * @returns The (new or existing) RoochVDR instance.\n */\nexport function initRoochVDR(\n  network: 'local' | 'dev' | 'test' | 'main' = 'test',\n  rpcUrl: string | undefined = undefined,\n  registry: VDRRegistry = VDRRegistry.getInstance()\n): RoochVDR {\n  const existing = registry.getVDR('rooch');\n  if (existing) {\n    return existing as RoochVDR;\n  }\n\n  const vdr = RoochVDR.createDefault(network, rpcUrl);\n  registry.registerVDR(vdr);\n  return vdr;\n}\n\n// Export VDR implementations\nexport * from './types';\nexport * from './keyVDR';\nexport * from './abstractVDR';\nexport * from './roochVDR';\nexport * from './VDRRegistry';\n","import { VDRRegistry, createVDR, VDRInterface } from './vdr';\nimport { KeyManager } from './keys/KeyManager';\nimport { MemoryKeyStore, KeyStore } from './keys/KeyStore';\nimport { IdentityKit } from './IdentityKit';\nimport { DIDDocument } from './types/did';\nimport { SignerInterface } from './signers/types';\nimport { DIDCreationRequest } from './vdr/types';\nimport { getDidWithoutFragment } from './utils/did';\n\n/**\n * IdentityEnv – runtime environment prepared by the Builder/bootstrap.\n * It wires together VDRRegistry + KeyManager, but **does not** automatically create a DID.\n */\nexport class IdentityEnv {\n  constructor(\n    public registry: VDRRegistry,\n    public keyManager: KeyManager\n  ) {}\n\n  /**\n   * Load an existing DID and return a ready IdentityKit instance\n   */\n  async loadDid(did: string, signer?: SignerInterface): Promise<IdentityKit> {\n    const s = signer || this.keyManager;\n    if (!signer) {\n      // Ensure keyManager knows DID (it may be needed for key generation later)\n      try {\n        this.keyManager.setDid(did);\n      } catch (_) {\n        /* ignore */\n      }\n    }\n    return IdentityKit.fromExistingDID(did, s);\n  }\n\n  /**\n   * Load from a known DID Document\n   */\n  async fromDocument(doc: DIDDocument, signer?: SignerInterface): Promise<IdentityKit> {\n    const s = signer || this.keyManager;\n    if (!signer) {\n      this.keyManager.setDid(getDidWithoutFragment(doc.id));\n    }\n    return IdentityKit.fromDIDDocument(doc, s);\n  }\n\n  /**\n   * Create a new DID via the underlying VDR\n   */\n  async createDid(\n    method: string,\n    request: DIDCreationRequest,\n    signer?: SignerInterface,\n    options?: Record<string, any>\n  ): Promise<IdentityKit> {\n    const s = signer || this.keyManager;\n    return IdentityKit.createNewDID(method, request, s, options);\n  }\n}\n\n/**\n * Builder for configuring IdentityEnv step-by-step\n */\nexport class IdentityEnvBuilder {\n  private vdrConfigs: { method: string; options?: any }[] = [];\n  private keyStore?: KeyStore;\n  private keyManager?: KeyManager;\n\n  /** Register (or ensure) a VDR for given DID method */\n  useVDR(method: string, options?: any): this {\n    this.vdrConfigs.push({ method, options });\n    return this;\n  }\n\n  /** Provide a custom KeyStore implementation */\n  useKeyStore(store: KeyStore): this {\n    this.keyStore = store;\n    return this;\n  }\n\n  /** Provide a pre-built KeyManager (advanced) */\n  useKeyManager(manager: KeyManager): this {\n    this.keyManager = manager;\n    return this;\n  }\n\n  /** Finalise and return the environment */\n  async init(): Promise<IdentityEnv> {\n    const registry = VDRRegistry.getInstance();\n\n    // 1. Ensure requested VDRs are registered\n    for (const { method, options } of this.vdrConfigs) {\n      if (!registry.getVDR(method)) {\n        const vdr = createVDR(method, options);\n        registry.registerVDR(vdr as VDRInterface);\n      }\n    }\n\n    // 2. Prepare KeyManager\n    let km: KeyManager;\n    if (this.keyManager) {\n      km = this.keyManager;\n    } else {\n      const store = this.keyStore || new MemoryKeyStore();\n      km = new KeyManager({ store });\n    }\n\n    return new IdentityEnv(registry, km);\n  }\n}\n\n/** Convenience helper similar to the old `init()` but **without** auto-creating DID */\nexport async function bootstrapIdentityEnv(\n  opts: {\n    method?: string;\n    keyStore?: KeyStore;\n    vdrOptions?: any;\n  } = {}\n): Promise<IdentityEnv> {\n  const builder = new IdentityEnvBuilder();\n  const method = opts.method || 'rooch';\n  builder.useVDR(method, opts.vdrOptions);\n  if (opts.keyStore) builder.useKeyStore(opts.keyStore);\n  return builder.init();\n}\n","import {\n  DIDDocument,\n  VerificationMethod,\n  VerificationRelationship,\n  ServiceInfo,\n  ServiceEndpoint,\n} from './types/did';\nimport { SignerInterface } from './signers/types';\nimport { OperationalKeyInfo } from './types/crypto';\nimport { VDRInterface, DIDCreationRequest } from './vdr/types';\nimport { VDRRegistry } from './vdr/VDRRegistry';\n// Key management & crypto utilities\nimport { KeyStore } from './keys/KeyStore';\nimport { MultibaseCodec } from './multibase';\nimport { extractMethod, parseDid } from './utils/did';\nimport { bootstrapIdentityEnv, IdentityEnv } from './IdentityEnv';\nimport { DebugLogger } from './utils/DebugLogger';\nimport {\n  IdentityKitError,\n  IdentityKitErrorCode,\n  createDIDError,\n  createVDRError,\n  createKeyManagementError,\n  wrapUnknownError,\n} from './errors';\n\n/**\n * Main SDK class for implementing NIP-1 Agent Single DID Multi-Key Model\n */\nexport class IdentityKit {\n  private didDocument: DIDDocument;\n  private vdr: VDRInterface;\n  private signer: SignerInterface;\n\n  // Private constructor, force use of factory methods\n  private constructor(didDocument: DIDDocument, vdr: VDRInterface, signer: SignerInterface) {\n    this.didDocument = didDocument;\n    this.vdr = vdr;\n    this.signer = signer;\n  }\n\n  // Factory methods\n  /**\n   * Create an instance from an existing DID (for managing existing DIDs)\n   */\n  static async fromExistingDID(did: string, signer: SignerInterface): Promise<IdentityKit> {\n    const registry = VDRRegistry.getInstance();\n    const method = extractMethod(did);\n    const vdr = registry.getVDR(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for DID method '${method}'`,\n        { method, did }\n      );\n    }\n\n    // Resolve DID to get DID Document\n    // We force refresh to ensure we get the latest DID Document from the VDR\n    // Maybe we should find a better way to clear the cache when we add a service or verification method\n    const didDocument = await registry.resolveDID(did, { forceRefresh: true });\n    if (!didDocument) {\n      throw createDIDError(\n        IdentityKitErrorCode.DID_RESOLUTION_FAILED,\n        `Failed to resolve DID: ${did}`,\n        { did, method }\n      );\n    }\n\n    return new IdentityKit(didDocument, vdr, signer);\n  }\n\n  /**\n   * Create an instance from a DID Document (for scenarios with known DID Document)\n   */\n  static fromDIDDocument(didDocument: DIDDocument, signer: SignerInterface): IdentityKit {\n    const { method } = parseDid(didDocument.id);\n    const vdr = VDRRegistry.getInstance().getVDR(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for DID method '${method}'`,\n        { method, did: didDocument.id }\n      );\n    }\n\n    return new IdentityKit(didDocument, vdr, signer);\n  }\n\n  /**\n   * Create and publish a new DID\n   */\n  static async createNewDID(\n    method: string,\n    creationRequest: DIDCreationRequest,\n    signer: SignerInterface,\n    options?: Record<string, any>\n  ): Promise<IdentityKit> {\n    const registry = VDRRegistry.getInstance();\n    const vdr = registry.getVDR(method);\n    if (!vdr) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_NOT_AVAILABLE,\n        `No VDR available for DID method '${method}'`,\n        { method }\n      );\n    }\n\n    const result = await registry.createDID(method, creationRequest, options);\n    if (!result.success || !result.didDocument) {\n      throw createDIDError(\n        IdentityKitErrorCode.DID_CREATION_FAILED,\n        `Failed to create DID: ${result.error || 'Unknown error'}`,\n        { method, creationRequest, result }\n      );\n    }\n\n    return new IdentityKit(result.didDocument, vdr, signer);\n  }\n\n  /**\n   * Lightweight environment bootstrap – prepares VDR(s) & KeyManager without touching DID.\n   * It is a thin wrapper around `bootstrapIdentityEnv()` so that callers can simply do:\n   * ```ts\n   * const env = await IdentityKit.bootstrap({ method: 'rooch' });\n   * const kit = await env.loadDid(did);\n   * ```\n   */\n  static async bootstrap(\n    opts: {\n      method?: string;\n      keyStore?: KeyStore;\n      vdrOptions?: any;\n    } = {}\n  ): Promise<IdentityEnv> {\n    return bootstrapIdentityEnv(opts);\n  }\n\n  // Verification Method Management\n  /**\n   * Find a key that has the specified verification relationship and is available for signing\n   * @param relationship The required verification relationship\n   * @returns The key ID if found, undefined otherwise\n   */\n  private async findKeyWithRelationship(\n    relationship: VerificationRelationship\n  ): Promise<string | undefined> {\n    return this.findKeysWithRelationship(relationship).then(keys => keys[0]);\n  }\n\n  /**\n   * Find all keys that have the specified verification relationship and are available for signing\n   * @param relationship The required verification relationship\n   * @returns Array of key IDs that match the criteria\n   */\n  private async findKeysWithRelationship(\n    relationship: VerificationRelationship\n  ): Promise<string[]> {\n    const availableKeyIds = await this.signer.listKeyIds();\n    if (!availableKeyIds.length) {\n      return [];\n    }\n\n    const relationships = this.didDocument[relationship] as (string | { id: string })[];\n    if (!relationships?.length) {\n      return [];\n    }\n\n    return relationships\n      .map(item => (typeof item === 'string' ? item : item.id))\n      .filter(keyId => availableKeyIds.includes(keyId));\n  }\n\n  async addVerificationMethod(\n    keyInfo: OperationalKeyInfo,\n    relationships: VerificationRelationship[],\n    options?: {\n      keyId?: string;\n      scopes?: string[];\n    }\n  ): Promise<string> {\n    // 1. Get signing key\n    const signingKeyId =\n      options?.keyId || (await this.findKeyWithRelationship('capabilityDelegation'));\n    if (!signingKeyId) {\n      throw createKeyManagementError(\n        IdentityKitErrorCode.KEY_PERMISSION_DENIED,\n        'No key with capabilityDelegation permission available',\n        {\n          did: this.didDocument.id,\n          requiredRelationship: 'capabilityDelegation',\n          availableKeys: await this.signer.listKeyIds(),\n        }\n      );\n    }\n\n    // 2. Create verification method entry\n    const keyIdFragment = keyInfo.idFragment || `key-${Date.now()}`;\n    const keyId = `${this.didDocument.id}#${keyIdFragment}`;\n    const verificationMethodEntry = {\n      id: keyId,\n      type: keyInfo.type,\n      controller: keyInfo.controller || this.didDocument.id,\n      publicKeyMultibase:\n        keyInfo.publicKeyMaterial instanceof Uint8Array\n          ? await MultibaseCodec.encodeBase58btc(keyInfo.publicKeyMaterial)\n          : undefined,\n      publicKeyJwk: !(keyInfo.publicKeyMaterial instanceof Uint8Array)\n        ? keyInfo.publicKeyMaterial\n        : undefined,\n    };\n\n    // 3. Call VDR interface\n    const published = await this.vdr.addVerificationMethod(\n      this.didDocument.id,\n      verificationMethodEntry,\n      relationships,\n      {\n        signer: this.signer,\n        keyId: signingKeyId,\n        scopes: options?.scopes,\n      }\n    );\n\n    if (!published) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_OPERATION_FAILED,\n        `Failed to publish verification method ${keyId}`,\n        {\n          did: this.didDocument.id,\n          keyId,\n          relationships,\n          verificationMethod: verificationMethodEntry,\n        }\n      );\n    }\n\n    // 4. Update local state\n    await this.updateLocalDIDDocument();\n\n    return keyId;\n  }\n\n  async removeVerificationMethod(\n    keyId: string,\n    options?: {\n      keyId?: string;\n    }\n  ): Promise<boolean> {\n    const signingKeyId =\n      options?.keyId || (await this.findKeyWithRelationship('capabilityDelegation'));\n    if (!signingKeyId) {\n      throw createKeyManagementError(\n        IdentityKitErrorCode.KEY_PERMISSION_DENIED,\n        'No key with capabilityDelegation permission available',\n        {\n          did: this.didDocument.id,\n          requiredRelationship: 'capabilityDelegation',\n          targetKeyId: keyId,\n          availableKeys: await this.signer.listKeyIds(),\n        }\n      );\n    }\n\n    const published = await this.vdr.removeVerificationMethod(this.didDocument.id, keyId, {\n      signer: this.signer,\n    });\n\n    if (published) {\n      // Update local state\n      if (this.didDocument.verificationMethod) {\n        this.didDocument.verificationMethod = this.didDocument.verificationMethod.filter(\n          vm => vm.id !== keyId\n        );\n      }\n\n      const relationships: VerificationRelationship[] = [\n        'authentication',\n        'assertionMethod',\n        'keyAgreement',\n        'capabilityInvocation',\n        'capabilityDelegation',\n      ];\n\n      relationships.forEach(rel => {\n        if (this.didDocument[rel]) {\n          this.didDocument[rel] = (this.didDocument[rel] as any[]).filter(item => {\n            if (typeof item === 'string') return item !== keyId;\n            if (typeof item === 'object' && item.id) return item.id !== keyId;\n            return true;\n          });\n        }\n      });\n\n      return true;\n    }\n\n    return false;\n  }\n\n  async updateVerificationMethodRelationships(\n    keyId: string,\n    addRelationships: VerificationRelationship[],\n    removeRelationships: VerificationRelationship[],\n    options: {\n      signer?: SignerInterface;\n    }\n  ): Promise<boolean> {\n    const published = await this.vdr.updateRelationships(\n      this.didDocument.id,\n      keyId,\n      addRelationships,\n      removeRelationships,\n      {\n        signer: options.signer,\n      }\n    );\n\n    if (published) {\n      // Update local state\n      addRelationships.forEach(rel => {\n        if (!this.didDocument[rel]) {\n          this.didDocument[rel] = [];\n        }\n        const relationshipArray = this.didDocument[rel] as (string | object)[];\n        if (\n          !relationshipArray.some(item => {\n            return typeof item === 'string' ? item === keyId : (item as any).id === keyId;\n          })\n        ) {\n          relationshipArray.push(keyId);\n        }\n      });\n\n      removeRelationships.forEach(rel => {\n        if (this.didDocument[rel]) {\n          this.didDocument[rel] = (this.didDocument[rel] as any[]).filter(item => {\n            if (typeof item === 'string') return item !== keyId;\n            if (typeof item === 'object' && item.id) return item.id !== keyId;\n            return true;\n          });\n        }\n      });\n\n      return true;\n    }\n\n    return false;\n  }\n\n  // Service Management\n  async addService(\n    serviceInfo: ServiceInfo,\n    options?: {\n      keyId?: string;\n    }\n  ): Promise<string> {\n    const signingKeyId =\n      options?.keyId || (await this.findKeyWithRelationship('capabilityInvocation'));\n    if (!signingKeyId) {\n      throw createKeyManagementError(\n        IdentityKitErrorCode.KEY_PERMISSION_DENIED,\n        'No key with capabilityInvocation permission available',\n        {\n          did: this.didDocument.id,\n          requiredRelationship: 'capabilityInvocation',\n          serviceInfo,\n          availableKeys: await this.signer.listKeyIds(),\n        }\n      );\n    }\n\n    const serviceId = `${this.didDocument.id}#${serviceInfo.idFragment}`;\n    const serviceEntry = {\n      id: serviceId,\n      type: serviceInfo.type,\n      serviceEndpoint: serviceInfo.serviceEndpoint,\n      ...(serviceInfo.additionalProperties || {}),\n    };\n\n    const published = await this.vdr.addService(this.didDocument.id, serviceEntry, {\n      signer: this.signer,\n      keyId: signingKeyId,\n    });\n\n    if (!published) {\n      throw createVDRError(\n        IdentityKitErrorCode.VDR_OPERATION_FAILED,\n        `Failed to publish service ${serviceId}`,\n        {\n          did: this.didDocument.id,\n          serviceId,\n          serviceInfo,\n          serviceEntry,\n        }\n      );\n    }\n    // Update local state\n    this.didDocument = (await this.vdr.resolve(this.didDocument.id)) as DIDDocument;\n    IdentityKit.logger.debug('After addService', this.didDocument);\n    return serviceId;\n  }\n\n  async removeService(\n    serviceId: string,\n    options?: {\n      keyId?: string;\n    }\n  ): Promise<boolean> {\n    const signingKeyId =\n      options?.keyId || (await this.findKeyWithRelationship('capabilityInvocation'));\n    if (!signingKeyId) {\n      throw createKeyManagementError(\n        IdentityKitErrorCode.KEY_PERMISSION_DENIED,\n        'No key with capabilityInvocation permission available',\n        {\n          did: this.didDocument.id,\n          requiredRelationship: 'capabilityInvocation',\n          serviceId,\n          availableKeys: await this.signer.listKeyIds(),\n        }\n      );\n    }\n\n    const published = await this.vdr.removeService(this.didDocument.id, serviceId, {\n      signer: this.signer,\n      keyId: signingKeyId,\n    });\n\n    if (published) {\n      // Update local state\n      if (this.didDocument.service) {\n        this.didDocument.service = this.didDocument.service.filter(s => s.id !== serviceId);\n      }\n      return true;\n    }\n\n    return false;\n  }\n\n  // Document Access\n  getDIDDocument(): DIDDocument {\n    return this.didDocument;\n  }\n\n  // Service Discovery\n  findServiceByType(serviceType: string): ServiceEndpoint | undefined {\n    return this.didDocument.service?.find(s => s.type === serviceType);\n  }\n\n  findVerificationMethodsByRelationship(\n    relationship: VerificationRelationship\n  ): VerificationMethod[] {\n    const relationships = this.didDocument[relationship] as (string | { id: string })[];\n    if (!relationships?.length) {\n      return [];\n    }\n\n    return relationships\n      .map(item => (typeof item === 'string' ? item : item.id))\n      .map(id =>\n        this.didDocument.verificationMethod?.find(vm => vm.id === id)\n      ) as VerificationMethod[];\n  }\n\n  // State Checks\n  async canSignWithKey(keyId: string): Promise<boolean> {\n    return this.signer.canSignWithKeyId(keyId);\n  }\n\n  private async updateLocalDIDDocument(): Promise<void> {\n    this.didDocument = (await this.vdr.resolve(this.didDocument.id)) as DIDDocument;\n    IdentityKit.logger.debug('After updateLocalDIDDocument', this.didDocument);\n  }\n\n  getSigner(): SignerInterface {\n    return this.signer;\n  }\n\n  /**\n   * Get all key IDs that are both present in DID document and available via Signer,\n   * grouped by verification relationship.\n   */\n  async getAvailableKeyIds(): Promise<{ [key in VerificationRelationship]?: string[] }> {\n    const relationships: VerificationRelationship[] = [\n      'authentication',\n      'assertionMethod',\n      'keyAgreement',\n      'capabilityInvocation',\n      'capabilityDelegation',\n    ];\n\n    const availableFromSigner = await this.signer.listKeyIds();\n    const result: { [key in VerificationRelationship]?: string[] } = {};\n\n    for (const rel of relationships) {\n      const relArray = this.didDocument[rel] as (string | { id: string })[] | undefined;\n      if (!relArray?.length) continue;\n\n      const ids = relArray\n        .map(item => (typeof item === 'string' ? item : item.id))\n        .filter(id => availableFromSigner.includes(id));\n\n      if (ids.length) result[rel] = ids;\n    }\n    return result;\n  }\n\n  // Logger instance for this class\n  private static readonly logger = DebugLogger.get('IdentityKit');\n}\n\nexport { IdentityKit as NuwaIdentityKit };\n","import { ServiceEndpoint, DIDDocument, ServiceInfo, VerificationRelationship } from './types/did';\nimport { SignerInterface } from './signers/types';\nimport {\n  CADOPCreationRequest,\n  CADOPControllerCreationRequest,\n  DIDCreationResult,\n  AUTH_PROVIDERS,\n  AuthProvider,\n} from './vdr/types';\nimport { VDRRegistry } from './vdr/VDRRegistry';\nimport { IdentityKit } from './IdentityKit';\nimport { DebugLogger } from './utils/DebugLogger';\nimport { IdentityKitErrorCode, createDIDError, createValidationError } from './errors';\n\n/**\n * CADOP service types\n */\nexport enum CadopServiceType {\n  CUSTODIAN = 'CadopCustodianService',\n  IDP = 'CadopIdPService',\n  WEB2_PROOF = 'CadopWeb2ProofService',\n}\n\n/**\n * CADOP service validation rules\n */\nexport interface CadopServiceValidationRule {\n  requiredProperties: string[];\n  optionalProperties: string[];\n  propertyValidators?: Record<string, (value: any) => boolean>;\n}\n\n/**\n * CadopIdentityKit class for managing CADOP-specific functionality\n */\nexport class CadopIdentityKit {\n  private static readonly SERVICE_VALIDATION_RULES: Record<\n    CadopServiceType,\n    CadopServiceValidationRule\n  > = {\n    [CadopServiceType.CUSTODIAN]: {\n      requiredProperties: ['id', 'type', 'serviceEndpoint'],\n      optionalProperties: ['description', 'fees', 'custodianPublicKey', 'custodianServiceVMType'],\n      propertyValidators: {\n        custodianPublicKey: (value: any) => typeof value === 'string' && value.length > 0,\n        custodianServiceVMType: (value: any) => typeof value === 'string' && value.length > 0,\n        fees: (value: any) => typeof value === 'object' && value !== null,\n      },\n    },\n    [CadopServiceType.IDP]: {\n      requiredProperties: ['id', 'type', 'serviceEndpoint'],\n      optionalProperties: ['supportedCredentials', 'description', 'fees', 'termsOfService'],\n      propertyValidators: {\n        supportedCredentials: (value: any) =>\n          typeof value === 'string' || (Array.isArray(value) && value.length > 0),\n        fees: (value: any) => typeof value === 'object' && value !== null,\n        termsOfService: (value: any) => typeof value === 'string' && value.length > 0,\n      },\n    },\n    [CadopServiceType.WEB2_PROOF]: {\n      requiredProperties: ['id', 'type', 'serviceEndpoint'],\n      optionalProperties: ['supportedPlatforms', 'description', 'fees'],\n      propertyValidators: {\n        supportedPlatforms: (value: any) =>\n          typeof value === 'string' || (Array.isArray(value) && value.length > 0),\n        fees: (value: any) => typeof value === 'object' && value !== null,\n      },\n    },\n  };\n\n  private nuwaKit: IdentityKit;\n\n  private constructor(nuwaKit: IdentityKit) {\n    this.nuwaKit = nuwaKit;\n  }\n\n  private extractCustodianInfo(): ServiceEndpoint {\n    const custodianServices = this.findServicesByType(CadopServiceType.CUSTODIAN);\n    if (custodianServices.length > 0) {\n      const custodianService = custodianServices[0];\n      const logger = DebugLogger.get('CadopIdentityKit');\n      logger.debug('extractCustodianInfo', custodianService);\n      return custodianService;\n    }\n    throw createDIDError(\n      IdentityKitErrorCode.DID_SERVICE_NOT_FOUND,\n      'Custodian service not found in service document',\n      { serviceDocument: this.nuwaKit.getDIDDocument(), serviceType: CadopServiceType.CUSTODIAN }\n    );\n  }\n\n  /**\n   * Initialize a CadopIdentityKit instance from an existing CADOP service DID\n   */\n  static async fromServiceDID(\n    serviceDid: string,\n    signer: SignerInterface\n  ): Promise<CadopIdentityKit> {\n    const nuwaKit = await IdentityKit.fromExistingDID(serviceDid, signer);\n    return new CadopIdentityKit(nuwaKit);\n  }\n\n  /**\n   * Create a new DID via CADOP protocol\n   */\n  async createDID(\n    method: string,\n    userDid: string,\n    options?: Record<string, any> & { customScopes?: string[] }\n  ): Promise<DIDCreationResult> {\n    const custodianInfo = this.extractCustodianInfo();\n\n    const authenticationMethods =\n      this.nuwaKit.findVerificationMethodsByRelationship('authentication');\n    if (authenticationMethods.length === 0) {\n      throw createDIDError(\n        IdentityKitErrorCode.DID_VERIFICATION_METHOD_NOT_FOUND,\n        'No authentication method found in service document',\n        { serviceDocument: this.nuwaKit.getDIDDocument(), relationship: 'authentication' }\n      );\n    }\n    const authenticationMethod = authenticationMethods[0];\n\n    //if the custodianPublicKey and custodianServiceVMType are not found in the service document, use the first authentication method\n    const { custodianPublicKey, custodianServiceVMType } =\n      custodianInfo.custodianPublicKey && custodianInfo.custodianServiceVMType\n        ? {\n            custodianPublicKey: custodianInfo.custodianPublicKey,\n            custodianServiceVMType: custodianInfo.custodianServiceVMType,\n          }\n        : {\n            custodianPublicKey: authenticationMethod.publicKeyMultibase,\n            custodianServiceVMType: authenticationMethod.type,\n          };\n\n    if (!custodianPublicKey || !custodianServiceVMType) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'Custodian service configuration not found in service document',\n        { custodianPublicKey, custodianServiceVMType }\n      );\n    }\n\n    const creationRequest: CADOPCreationRequest = {\n      userDidKey: userDid,\n      custodianServicePublicKey: custodianPublicKey,\n      custodianServiceVMType: custodianServiceVMType,\n      customScopes: options?.customScopes,\n    };\n\n    return VDRRegistry.getInstance().createDIDViaCADOP(method, creationRequest, {\n      signer: this.nuwaKit.getSigner(),\n      ...options,\n    });\n  }\n\n  /**\n   * Create a new DID via CADOP protocol with controller\n   * Supports did:key (backward compatible), did:bitcoin, and other controller types\n   */\n  async createDIDWithController(\n    method: string,\n    controllerDid: string,\n    options?: {\n      controllerPublicKeyMultibase?: string;\n      controllerVMType?: string;\n      customScopes?: string[];\n    } & Record<string, any>\n  ): Promise<DIDCreationResult> {\n    const logger = DebugLogger.get('CadopIdentityKit');\n    logger.debug('createDIDWithController called', { method, controllerDid, options });\n\n    const custodianInfo = this.extractCustodianInfo();\n\n    const authenticationMethods =\n      this.nuwaKit.findVerificationMethodsByRelationship('authentication');\n    if (authenticationMethods.length === 0) {\n      throw createDIDError(\n        IdentityKitErrorCode.DID_VERIFICATION_METHOD_NOT_FOUND,\n        'No authentication method found in service document',\n        { serviceDocument: this.nuwaKit.getDIDDocument(), relationship: 'authentication' }\n      );\n    }\n    const authenticationMethod = authenticationMethods[0];\n\n    // Extract custodian service configuration\n    const { custodianPublicKey, custodianServiceVMType } =\n      custodianInfo.custodianPublicKey && custodianInfo.custodianServiceVMType\n        ? {\n            custodianPublicKey: custodianInfo.custodianPublicKey,\n            custodianServiceVMType: custodianInfo.custodianServiceVMType,\n          }\n        : {\n            custodianPublicKey: authenticationMethod.publicKeyMultibase,\n            custodianServiceVMType: authenticationMethod.type,\n          };\n\n    if (!custodianPublicKey || !custodianServiceVMType) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        'Custodian service configuration not found in service document',\n        { custodianPublicKey, custodianServiceVMType }\n      );\n    }\n\n    // Check if this is a did:key and we should use backward compatible path\n    if (controllerDid.startsWith('did:key:') && !options?.controllerPublicKeyMultibase) {\n      logger.debug('Using backward compatible did:key path');\n      // For did:key without explicit public key, use the legacy CADOP method\n      const creationRequest: CADOPCreationRequest = {\n        userDidKey: controllerDid,\n        custodianServicePublicKey: custodianPublicKey,\n        custodianServiceVMType: custodianServiceVMType,\n        customScopes: options?.customScopes,\n      };\n\n      return VDRRegistry.getInstance().createDIDViaCADOP(method, creationRequest, {\n        signer: this.nuwaKit.getSigner(),\n        ...options,\n      });\n    }\n\n    // Use the new controller-based path\n    logger.debug('Using controller-based CADOP path');\n    const creationRequest: CADOPControllerCreationRequest = {\n      controllerDid,\n      controllerPublicKeyMultibase: options?.controllerPublicKeyMultibase,\n      controllerVMType: options?.controllerVMType,\n      custodianServicePublicKey: custodianPublicKey,\n      custodianServiceVMType: custodianServiceVMType,\n      customScopes: options?.customScopes,\n    };\n\n    return VDRRegistry.getInstance().createDIDViaCADOPWithController(method, creationRequest, {\n      signer: this.nuwaKit.getSigner(),\n      ...options,\n    });\n  }\n\n  /**\n   * Add a new CADOP service to the service DID document\n   */\n  async addService(service: ServiceInfo): Promise<string> {\n    // Convert ServiceInfo to ServiceEndpoint format for validation\n    const serviceEndpoint: ServiceEndpoint = {\n      id: `${this.nuwaKit.getDIDDocument().id}#${service.idFragment}`,\n      type: service.type,\n      serviceEndpoint: service.serviceEndpoint,\n      ...(service.additionalProperties || {}),\n    };\n\n    if (!CadopIdentityKit.validateService(serviceEndpoint, service.type as CadopServiceType)) {\n      throw createValidationError(\n        IdentityKitErrorCode.VALIDATION_FAILED,\n        `Invalid CADOP service configuration for type: ${service.type}`,\n        { service, serviceType: service.type }\n      );\n    }\n    const result = await this.nuwaKit.addService(service);\n    return result;\n  }\n\n  /**\n   * Remove a CADOP service from the service DID document\n   */\n  async removeService(\n    serviceId: string,\n    options: {\n      keyId: string;\n      signer?: SignerInterface;\n    }\n  ): Promise<boolean> {\n    const result = await this.nuwaKit.removeService(serviceId, options);\n    return result;\n  }\n\n  /**\n   * Get the underlying IdentityKit instance\n   */\n  getNuwaIdentityKit(): IdentityKit {\n    return this.nuwaKit;\n  }\n\n  /**\n   * Find all custodian services in the service document\n   */\n  findCustodianServices(): ServiceEndpoint[] {\n    return this.findServicesByType(CadopServiceType.CUSTODIAN);\n  }\n\n  /**\n   * Find all IdP services in the service document\n   */\n  findIdPServices(): ServiceEndpoint[] {\n    return this.findServicesByType(CadopServiceType.IDP);\n  }\n\n  /**\n   * Find all Web2 proof services in the service document\n   */\n  findWeb2ProofServices(): ServiceEndpoint[] {\n    return this.findServicesByType(CadopServiceType.WEB2_PROOF);\n  }\n\n  /**\n   * Find services by type in the service document\n   */\n  private findServicesByType(type: CadopServiceType): ServiceEndpoint[] {\n    return (this.nuwaKit.getDIDDocument().service || [])\n      .filter(service => service.type === type)\n      .filter(service => CadopIdentityKit.validateService(service, type));\n  }\n\n  /**\n   * Validate a service against its type-specific validation rules\n   */\n  private static validateService(service: ServiceEndpoint, type: CadopServiceType): boolean {\n    const rules = CadopIdentityKit.SERVICE_VALIDATION_RULES[type];\n    if (!rules) {\n      return false;\n    }\n\n    // Check required properties\n    const hasAllRequired = rules.requiredProperties.every(\n      prop => prop in service && service[prop] !== undefined && service[prop] !== null\n    );\n    if (!hasAllRequired) {\n      return false;\n    }\n\n    // Check if there are any unknown properties\n    const allowedProperties = new Set([...rules.requiredProperties, ...rules.optionalProperties]);\n    const hasUnknownProps = Object.keys(service).some(prop => !allowedProperties.has(prop));\n    if (hasUnknownProps) {\n      return false;\n    }\n\n    // Run property-specific validators\n    if (rules.propertyValidators) {\n      return Object.entries(rules.propertyValidators).every(([prop, validator]) => {\n        if (prop in service) {\n          return validator(service[prop]);\n        }\n        return true; // Skip validation for optional properties that are not present\n      });\n    }\n\n    return true;\n  }\n}\n\n// Export additional types and constants for external use\nexport {\n  AUTH_PROVIDERS,\n  type AuthProvider,\n  type CADOPControllerCreationRequest,\n} from './vdr/types';\n"],"mappings":"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","names":["import_rooch_sdk","logger","import_rooch_sdk","base64url","base64","KeyType","getCrypto","import_p256","import_rooch_sdk","import_rooch_sdk","address","module","address","sdkGetRoochNodeUrl","import_fs","address","import_rooch_sdk","import_rooch_sdk","logger","logger","creationRequest","address"]}