{"version":3,"sources":["../../src/testHelpers/index.ts","../../src/testHelpers/env.ts","../../src/utils/DebugLogger.ts","../../src/cache/InMemoryLRUDIDDocumentCache.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/signers/keyStoreUtils.ts","../../src/signers/didAccountSigner.ts","../../src/utils/did.ts","../../src/vdr/abstractVDR.ts","../../src/vdr/roochVDRTypes.ts","../../src/utils/sessionScopes.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';\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 {\n  TestEnvOptions,\n  EnvironmentCheck,\n  CreateSelfDidResult,\n  CreateSelfDidOptions,\n  CreateCadopDidOptions,\n} from './types';\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\n    // Check environment\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  }\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    return { ...defaults, ...options };\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","import { DIDDocument, DIDResolver } from '../types';\nimport { DIDDocumentCache } from '../cache';\nimport { VDRInterface, DIDCreationRequest, DIDCreationResult, CADOPCreationRequest } from './types';\n\nimport { InMemoryLRUDIDDocumentCache } from '../cache/InMemoryLRUDIDDocumentCache';\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 new Error(`No VDR available for method: ${method}`);\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 new Error(`No VDR available for method: ${method}`);\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 new Error(`No VDR available for method: ${method}`);\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 exists(did: string): Promise<boolean> {\n    const method = did.split(':')[1];\n    const vdr = this.vdrs.get(method);\n    if (!vdr) {\n      throw new Error(`No VDR available for method: ${method}`);\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 } from '../signers';\nimport { KeyType, keyTypeToRoochSignatureScheme } from '../types/crypto';\nimport { DIDCreationRequest, DIDCreationResult, CADOPCreationRequest } 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';\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 (signer instanceof Signer) {\n      return signer;\n    }\n    return DidAccountSigner.create(signer, keyId);\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 new Error('No signer provided for create operation');\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 new Error(`Invalid scope format: ${scopeValidation.invalidScopes.join(', ')}`);\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 new Error('DIDCreatedEvent not found');\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 new Error('DID document not found with DID: ' + actualDID);\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 new Error('No custodian signer provided for CADOP operation');\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 new Error(`Invalid scope format: ${scopeValidation.invalidScopes.join(', ')}`);\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 new Error('DIDCreatedEvent not found');\n      }\n      let actualDID = this.parseDIDCreatedEventAndGetDID(didCreatedEvent);\n      let didDocument = await this.resolve(actualDID);\n      if (!didDocument) {\n        throw new Error('DID document not found with DID: ' + actualDID);\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   * 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 new Error('Invalid DID format. Expected did:rooch:address');\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      this.debugLog(`Resolved DID document Move Object:`, JSON.stringify(didDocObject, null, 2));\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 new Error('No signer provided for addVerificationMethod operation');\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 new Error(`DID document ${did} not found`);\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 new Error('Verification method must have publicKeyMultibase');\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 new Error(`Invalid scope format: ${scopeValidation.invalidScopes.join(', ')}`);\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 new Error('No signer provided for removeVerificationMethod operation');\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 new Error(`DID document ${did} not found`);\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 new Error('No signer provided for addService operation');\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 new Error(`DID document ${did} not found`);\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 new Error('No signer provided for addServiceWithProperties operation');\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 new Error(`DID document ${did} not found`);\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 new Error('No signer provided for removeService operation');\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 new Error(`DID document ${did} not found`);\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 new Error('No signer provided for updateRelationships operation');\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 new Error(`DID document ${did} not found`);\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 new Error(`Unknown verification relationship: ${relationship}`);\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';\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 new Error(`Unsupported multibase: ${base}`);\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 new Error(`Unsupported multibase prefix: ${prefix}`);\n    }\n  }\n}\n","export 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 new Error('No TextEncoder or Buffer available in this environment.');\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 new Error('No TextDecoder or Buffer available in this environment.');\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';\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 new Error(`Invalid key type: ${value}`);\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 new Error(`Unsupported Rooch signature scheme: ${scheme}`);\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 new Error(`Unsupported key type: ${keyType}`);\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';\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 new Error(\n        `Invalid key length for ${keyType}. Expected ${expectedLength} bytes, got ${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 new Error('Invalid key format: too short');\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 new Error(\n          `Invalid key length for ${keyType}. Expected ${expectedLength} bytes, got ${bytes.length}`\n        );\n      }\n\n      return { keyType, bytes };\n    } catch (error) {\n      if (error instanceof Error && error.message === 'Non-base58btc character') {\n        throw new Error('Invalid multibase format');\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 new Error(`Unsupported key type: ${keyType}`);\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 new Error('Unknown key type prefix');\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 new Error(`Unsupported key type: ${keyType}`);\n    }\n  }\n}\n","import { KeyType } from '../types/crypto';\nimport { MultibaseCodec } from './base';\nimport { KeyMultibaseCodec } from './key';\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 new Error('Invalid did:key format');\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';\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 new Error('Web Crypto API is not available in the current runtime');\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 { publicKey, privateKey } = await this.crypto.subtle.generateKey(\n      {\n        name: 'Ed25519',\n      },\n      true,\n      ['sign', 'verify']\n    );\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 new Error('Failed to derive public key from private key');\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';\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 new Error('CryptoKey is not supported for Secp256k1 signing');\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 new Error('JsonWebKey is not supported for Secp256k1 verification');\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';\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 new Error('Web Crypto API is not available in the current runtime');\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 { publicKey, privateKey } = await this.crypto.subtle.generateKey(\n      {\n        name: 'ECDSA',\n        namedCurve: 'P-256',\n      },\n      true,\n      ['sign', 'verify']\n    );\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 new Error(`Invalid public key length. Expected 65 bytes, got ${publicKey.length}`);\n    }\n\n    // First byte is the format (0x04 for uncompressed)\n    if (publicKey[0] !== 0x04) {\n      throw new Error('Invalid public key format. Expected uncompressed format (0x04)');\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 new Error(\n        `Invalid compressed public key length. Expected 33 bytes, got ${compressedKey.length}`\n      );\n    }\n    const format = compressedKey[0];\n    if (format !== 0x02 && format !== 0x03) {\n      throw new Error('Invalid compressed public key format. Expected 0x02 or 0x03');\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 new Error(`Failed to decompress public key: ${error.message}`);\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 new Error('Invalid DER signature');\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 new Error('Failed to derive public key from private key');\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';\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 new Error(`No provider available for key type: ${keyType}`);\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","import { KeyStore } from '../keys/KeyStore';\nimport { KeyType } from '../types/crypto';\nimport { MultibaseCodec } from '../multibase';\nimport { CryptoUtils } from '../crypto';\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 new Error(`Key not found: ${keyId}`);\n  }\n  if (!key.privateKeyMultibase) {\n    throw new Error(`No private key available for ${keyId}`);\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","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';\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 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 new Error('Signer DID must be a did:rooch DID');\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  static async create(signer: SignerInterface, keyId?: string): Promise<DidAccountSigner> {\n    // If already a DidAccountSigner, return as is\n    if (signer instanceof DidAccountSigner) {\n      return signer;\n    }\n\n    // Get keyId if not provided\n    const actualKeyId = keyId || (await signer.listKeyIds())[0];\n    if (!actualKeyId) {\n      throw new Error('No available keys in signer');\n    }\n\n    // Get key info\n    const keyInfo = await signer.getKeyInfo(actualKeyId);\n    if (!keyInfo) {\n      throw new Error(`Key info not found for keyId: ${actualKeyId}`);\n    }\n\n    const did = await signer.getDid();\n\n    return new DidAccountSigner(signer, did, actualKeyId, keyInfo.type, keyInfo.publicKey);\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    return Authenticator.rooch(input.hashData(), this);\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      throw new Error('ECDSAR1 is not supported for DID account');\n    } else {\n      throw new Error(`Unsupported key type: ${this.keyType}`);\n    }\n  }\n\n  getBitcoinAddress(): BitcoinAddress {\n    throw new Error('Bitcoin address is not supported for DID account');\n  }\n\n  // Implement SignerInterface\n  async signWithKeyId(data: Uint8Array, keyId: string): Promise<Uint8Array> {\n    if (keyId !== this.keyId) {\n      throw new Error(`Key ID mismatch. Expected ${this.keyId}, got ${keyId}`);\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","/**\n * DID utility helpers (method, identifier & fragment parsing)\n * Used across SDK layers (VDR, Signer, KeyManager, etc.)\n */\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 new Error(`Invalid DID: ${did}`);\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 new Error(`Invalid DID – missing method/identifier separator: ${did}`);\n  }\n  const method = afterPrefix.slice(0, methodEnd);\n  const idPlusFrag = afterPrefix.slice(methodEnd + 1);\n  if (!method || !idPlusFrag) {\n    throw new Error(`Invalid DID: ${did}`);\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 new Error(`No fragment found in ${idOrDid}`);\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 { DIDCreationRequest, DIDCreationResult, CADOPCreationRequest, VDRInterface } from './types';\nimport { parseDid } from '../utils/did';\nimport { DebugLogger } from '../utils/DebugLogger';\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 { method } = parseDid(did);\n    if (method !== this.method) {\n      throw new Error(`DID ${did} is not a valid did:${this.method} identifier`);\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 new Error('DID document must have an id');\n    }\n\n    this.validateDIDMethod(document.id);\n\n    if (!document['@context']) {\n      throw new Error('DID document must have a @context property');\n    }\n\n    if (!document.verificationMethod || document.verificationMethod.length === 0) {\n      throw new Error('DID document must have at least one verification method');\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 new Error(`create method not implemented for ${this.method} VDR`);\n  }\n\n  /**\n   * Default CADOP implementation - throws not implemented error\n   */\n  async createViaCADOP(request: CADOPCreationRequest, options?: any): Promise<DIDCreationResult> {\n    throw new Error(`createViaCADOP not implemented for ${this.method} VDR`);\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 new Error(`addVerificationMethod not implemented for ${this.method} VDR`);\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 new Error(`removeVerificationMethod not implemented for ${this.method} VDR`);\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 new Error(`addService not implemented for ${this.method} VDR`);\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 new Error(`removeService not implemented for ${this.method} VDR`);\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 new Error(`updateRelationships not implemented for ${this.method} VDR`);\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 new Error(`updateController not implemented for ${this.method} VDR`);\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 new Error(`DID document ${did} not found`);\n    }\n\n    // Check permission\n    if (!this.validateKeyPermission(document, keyId, requiredRelationship)) {\n      throw new Error(\n        `Key ${keyId} does not have ${requiredRelationship} permission required for this operation`\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 new Error(`Verification method ID ${verificationMethod.id} must start with DID ${did}`);\n    }\n\n    // Check if method already exists\n    if (document.verificationMethod?.some(vm => vm.id === verificationMethod.id)) {\n      throw new Error(`Verification method ${verificationMethod.id} already exists`);\n    }\n\n    // Validate required fields\n    if (!verificationMethod.type) {\n      throw new Error('Verification method must have a type');\n    }\n\n    if (!verificationMethod.controller) {\n      throw new Error('Verification method must have a controller');\n    }\n\n    // Check that at least one key material format is present\n    if (!verificationMethod.publicKeyMultibase && !verificationMethod.publicKeyJwk) {\n      throw new Error('Verification method must have at least one form of public key material');\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 new Error(`Service ID ${service.id} must start with DID ${did}`);\n    }\n\n    // Check if service already exists\n    if (document.service?.some(s => s.id === service.id)) {\n      throw new Error(`Service ${service.id} already exists`);\n    }\n\n    // Validate required fields\n    if (!service.type) {\n      throw new Error('Service must have a type');\n    }\n\n    if (!service.serviceEndpoint) {\n      throw new Error('Service must have a serviceEndpoint');\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","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';\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 new Error('StoredKey validation failed: private and public keys are inconsistent');\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';\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 new Error('DID must be set before generating keys');\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 new Error(`Key belongs to a different DID: ${didFromKey}`);\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 new Error('DID not initialised. Call setDid() or import a key first.');\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 new Error(`Key ID ${keyId} already exists in store`);\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 new Error('Key pair validation failed: private and public keys are inconsistent');\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 new Error(`Key ${keyId} not found`);\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 { DIDCreationRequest, DIDCreationResult, CADOPCreationRequest } from './types';\nimport { AbstractVDR } from './abstractVDR';\nimport { MultibaseCodec, DidKeyCodec } from '../multibase';\nimport { DebugLogger } from '../utils/DebugLogger';\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 new Error(`DID ${did} not found`);\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 new Error(`Verification method ${verificationMethod.id} already exists`);\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 new Error(`DID ${did} not found`);\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 new Error(`Cannot remove the primary key ${keyId} from did:key document`);\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 new Error(`DID ${did} not found`);\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 new Error(`DID ${did} not found`);\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  /**\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 new Error(`DID ${did} not found`);\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 new Error(`Verification method ${keyId} not found`);\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';\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 new Error(`No built-in VDR implementation available for method '${method}'`);\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';\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 new Error(`No VDR available for DID method '${method}'`);\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 new Error(`Failed to resolve DID ${did}`);\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 new Error(`No VDR available for DID method '${method}'`);\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 new Error(`No VDR available for DID method '${method}'`);\n    }\n\n    const result = await registry.createDID(method, creationRequest, options);\n    if (!result.success || !result.didDocument) {\n      throw new Error(`Failed to create DID: ${result.error || 'Unknown error'}`);\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 new Error('No key with capabilityDelegation permission available');\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 new Error(`Failed to publish verification method ${keyId}`);\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 new Error('No key with capabilityDelegation permission available');\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 new Error('No key with capabilityInvocation permission available');\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 new Error(`Failed to publish service ${serviceId}`);\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 new Error('No key with capabilityInvocation permission available');\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 { CADOPCreationRequest, DIDCreationResult } from './vdr/types';\nimport { VDRRegistry } from './vdr/VDRRegistry';\nimport { IdentityKit } from './IdentityKit';\nimport { DebugLogger } from './utils/DebugLogger';\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 new Error('Custodian service not found in service document');\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 new Error('No authentication method found in service document');\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 new Error('Custodian service configuration not found in service document');\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   * 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 new Error(`Invalid CADOP service configuration for type: ${service.type}`);\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"],"mappings":"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","names":["import_rooch_sdk","logger","import_rooch_sdk","base64url","base64","KeyType","getCrypto","import_rooch_sdk","address","module","address","sdkGetRoochNodeUrl","address","import_rooch_sdk","import_rooch_sdk","logger","logger","address"]}