{"version":3,"sources":["../../src/core/SubRav.ts","../../src/errors/codes.ts","../../src/billing/core/strategy-registry.ts","../../src/billing/rate/types.ts","../../src/billing/core/converter.ts","../../src/billing/strategies/base.ts","../../src/billing/strategies/perRequest.ts","../../src/billing/strategies/perToken.ts","../../src/billing/strategies/finalCost.ts","../../src/billing/strategies/index.ts","../../src/rooch/ChannelUtils.ts","../../src/core/RavVerifier.ts","../../src/core/PaymentProcessor.ts","../../src/billing/rate/contract.ts","../../src/client/PaymentHubClient.ts","../../src/client/PaymentRevenueClient.ts","../../src/client/PaymentChannelPayeeClient.ts","../../src/types/api.ts","../../src/errors/PaymentKitError.ts","../../src/errors/RoochErrorMapper.ts","../../src/rooch/RoochContractBase.ts","../../src/rooch/RoochPaymentChannelContract.ts","../../src/codecs/PaymentCodec.ts","../../src/middlewares/http/HttpPaymentCodec.ts","../../src/billing/core/rule-matcher.ts","../../src/errors/index.ts","../../src/schema/core/index.ts","../../src/utils/json.ts","../../src/storage/memory/channel.memory.ts","../../src/storage/indexeddb/channel.indexeddb.ts","../../src/storage/sql/channel.sql.ts","../../src/storage/factories/createChannelRepo.ts","../../src/storage/memory/rav.memory.ts","../../src/storage/indexeddb/rav.indexeddb.ts","../../src/storage/sql/serialization.ts","../../src/storage/sql/rav.sql.ts","../../src/storage/factories/createRAVRepo.ts","../../src/storage/memory/pendingSubRav.memory.ts","../../src/storage/indexeddb/pendingSubRav.indexeddb.ts","../../src/storage/sql/pendingSubRav.sql.ts","../../src/storage/factories/createPendingSubRAVRepo.ts","../../src/storage/memory/transaction.memory.ts","../../src/storage/indexeddb/transactions.indexeddb.ts","../../src/storage/factories/createTransactionStore.ts","../../src/storage/index.ts","../../src/schema/api/recovery.ts","../../src/schema/api/commit.ts","../../src/schema/api/discovery.ts","../../src/schema/api/health.ts","../../src/schema/api/subrav.ts","../../src/schema/api/admin.ts","../../src/schema/index.ts","../../src/helpers/fromIdentityEnv.ts","../../src/transport/express/BillableRouter.ts","../../src/api/handlers/recovery.ts","../../src/api/handlers/commit.ts","../../src/api/handlers/admin.ts","../../src/api/handlers/subrav.ts","../../src/api/handlers/health.ts","../../src/api/handlers/index.ts","../../src/api/utils.ts","../../src/api/index.ts","../../src/core/HubBalanceService.ts","../../src/core/ClaimTriggerService.ts","../../src/storage/sql/index.ts","../../src/middlewares/mcp/McpBillingMiddleware.ts","../../src/transport/mcp/McpPaymentKit.ts","../../src/transport/mcp/ToolSchema.ts","../../src/transport/mcp/FastMcpStarter.ts","../../src/transport/mcp/SdkMcpStarter.ts","../../src/index.node.ts","../../src/index.browser.ts","../../src/core/PaymentUtils.ts","../../src/client/PaymentChannelPayerClient.ts","../../src/factory/chainFactory.ts","../../src/middlewares/http/HttpBillingMiddleware.ts","../../src/rooch/RoochPaymentRevenueContract.ts","../../src/integrations/http/PaymentChannelHttpClient.ts","../../src/integrations/http/internal/DidAuthHelper.ts","../../src/integrations/http/internal/LocalStore.ts","../../src/integrations/http/internal/StreamPaymentFilter.ts","../../src/integrations/http/internal/utils.ts","../../src/integrations/http/internal/RequestScheduler.ts","../../src/integrations/http/core/PaymentState.ts","../../src/integrations/http/internal/codec.ts","../../src/integrations/http/core/PaymentProtocol.ts","../../src/integrations/http/core/RequestManager.ts","../../src/integrations/http/core/ChannelManager.ts","../../src/integrations/http/PaymentChannelAdminClient.ts","../../src/integrations/http/factory.ts","../../src/integrations/mcp/types.ts","../../src/integrations/mcp/ServerDetector.ts","../../src/integrations/mcp/PaymentChannelMcpClient.ts","../../src/integrations/mcp/McpChannelManager.ts","../../src/integrations/mcp/McpToolConverter.ts","../../src/integrations/mcp/UniversalMcpClient.ts","../../src/integrations/mcp/factory.ts","../../src/utils/index.ts","../../src/transport/express/HandlerRestAdapter.ts","../../src/transport/express/ExpressPaymentKit.ts","../../src/transport/express/utils.ts","../../src/transport/express/fromIdentityEnv.ts","../../src/transport/mcp/McpServerFactory.ts"],"sourcesContent":["/**\n * SubRAV encoding, decoding, signing and verification utilities\n */\n\nimport type {\n  SignerInterface,\n  DIDResolver,\n  DIDDocument,\n  KeyType,\n  VerificationMethod,\n} from '@nuwa-ai/identity-kit';\nimport { CryptoUtils, MultibaseCodec } from '@nuwa-ai/identity-kit';\nimport { bcs, type BcsType } from '@roochnetwork/rooch-sdk';\nimport type { SubRAV, SignedSubRAV } from './types';\n\n/**\n * Constants for SubRAV protocol versions\n */\nexport const SUBRAV_VERSION_1 = 1;\nexport const CURRENT_SUBRAV_VERSION = SUBRAV_VERSION_1;\n\n/**\n * BCS Schema for SubRAV serialization\n * Must match the Move contract SubRAV struct definition\n */\nexport const SubRAVBCSSchema: BcsType<any> = bcs.struct('SubRAV', {\n  version: bcs.u8(),\n  chain_id: bcs.u64(),\n  channel_id: bcs.ObjectId,\n  channel_epoch: bcs.u64(),\n  vm_id_fragment: bcs.string(),\n  accumulated_amount: bcs.u256(),\n  nonce: bcs.u64(),\n});\n\n/**\n * SubRAV codec for encoding and decoding using BCS\n */\nexport class SubRAVCodec {\n  /**\n   * Encode a SubRAV to bytes using BCS serialization\n   * This ensures cross-platform consistency with Move contracts\n   */\n  static encode(subRav: SubRAV): Uint8Array {\n    try {\n      // Convert to BCS-compatible format\n      // Note: BCS expects string representations for large numbers\n      const bcsSubRAV = {\n        version: subRav.version,\n        chain_id: subRav.chainId.toString(),\n        channel_id: subRav.channelId,\n        channel_epoch: subRav.channelEpoch.toString(),\n        vm_id_fragment: subRav.vmIdFragment,\n        accumulated_amount: subRav.accumulatedAmount.toString(),\n        nonce: subRav.nonce.toString(),\n      };\n\n      return SubRAVBCSSchema.serialize(bcsSubRAV).toBytes();\n    } catch (error) {\n      throw new Error(\n        `Failed to encode SubRAV: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Decode bytes to SubRAV using BCS deserialization\n   */\n  static decode(bytes: Uint8Array): SubRAV {\n    try {\n      const bcsSubRAV = SubRAVBCSSchema.parse(bytes);\n\n      return {\n        version: bcsSubRAV.version,\n        chainId: BigInt(bcsSubRAV.chain_id),\n        channelId: bcsSubRAV.channel_id,\n        channelEpoch: BigInt(bcsSubRAV.channel_epoch),\n        vmIdFragment: bcsSubRAV.vm_id_fragment,\n        accumulatedAmount: BigInt(bcsSubRAV.accumulated_amount),\n        nonce: BigInt(bcsSubRAV.nonce),\n      };\n    } catch (error) {\n      throw new Error(\n        `Failed to decode SubRAV: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Get the BCS hex string representation of a SubRAV (useful for debugging)\n   */\n  static toHex(subRav: SubRAV): string {\n    const bytes = this.encode(subRav);\n    return (\n      '0x' +\n      Array.from(bytes)\n        .map(byte => byte.toString(16).padStart(2, '0'))\n        .join('')\n    );\n  }\n\n  /**\n   * Create SubRAV from BCS hex string\n   */\n  static fromHex(hex: string): SubRAV {\n    const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n    const bytes = new Uint8Array(cleanHex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n    return this.decode(bytes);\n  }\n}\n\n/**\n * SubRAV signing and verification utilities\n */\nexport class SubRAVSigner {\n  /**\n   * Sign a SubRAV using the provided signer and key\n   */\n  static async sign(subRav: SubRAV, signer: SignerInterface, keyId: string): Promise<SignedSubRAV> {\n    const bytes = SubRAVCodec.encode(subRav);\n    const signature = await signer.signWithKeyId(bytes, keyId);\n    return { subRav, signature };\n  }\n\n  /**\n   * Verify a signed SubRAV using public key or DID document\n   */\n  static async verify(\n    signedSubRAV: SignedSubRAV,\n    verificationMethod:\n      | {\n          publicKey: Uint8Array;\n          keyType: KeyType;\n        }\n      | {\n          didDocument: DIDDocument;\n        }\n  ): Promise<boolean> {\n    try {\n      const bytes = SubRAVCodec.encode(signedSubRAV.subRav);\n\n      let publicKey: Uint8Array;\n      let keyType: KeyType;\n\n      if ('publicKey' in verificationMethod) {\n        // Direct public key verification\n        publicKey = verificationMethod.publicKey;\n        keyType = verificationMethod.keyType;\n      } else {\n        // DID document verification\n        const { didDocument } = verificationMethod;\n\n        // Construct keyId from didDocument.id and vmIdFragment from SubRAV\n        const keyId = `${didDocument.id}#${signedSubRAV.subRav.vmIdFragment}`;\n\n        const vm = didDocument.verificationMethod?.find(\n          (vm: VerificationMethod) => vm.id === keyId\n        );\n        if (!vm) return false;\n\n        keyType = vm.type as KeyType;\n\n        // Get public key material\n        if (vm.publicKeyMultibase) {\n          publicKey = MultibaseCodec.decodeBase58btc(vm.publicKeyMultibase);\n        } else if (vm.publicKeyJwk) {\n          // Handle JWK format - this would need proper JWK to raw key conversion\n          // For now, we don't support JWK format in this context\n          return false;\n        } else {\n          return false; // No supported key format\n        }\n      }\n\n      // Verify signature\n      return CryptoUtils.verify(bytes, signedSubRAV.signature, publicKey, keyType);\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Verify a signed SubRAV using DID resolver (convenience method)\n   */\n  static async verifyWithResolver(\n    signedSubRAV: SignedSubRAV,\n    payerDid: string,\n    resolver: DIDResolver\n  ): Promise<boolean> {\n    try {\n      // Resolve DID document\n      const didDocument = await resolver.resolveDID(payerDid);\n      if (!didDocument) return false;\n\n      // Use the flexible verify method\n      return this.verify(signedSubRAV, { didDocument });\n    } catch (error) {\n      return false;\n    }\n  }\n}\n\n/**\n * Helper functions for creating SubRAV instances\n */\nexport class SubRAVUtils {\n  /**\n   * Create a new SubRAV with default version\n   */\n  static create(params: Omit<SubRAV, 'version'> & { version?: number }): SubRAV {\n    return {\n      version: params.version ?? CURRENT_SUBRAV_VERSION,\n      chainId: params.chainId,\n      channelId: params.channelId,\n      channelEpoch: params.channelEpoch,\n      vmIdFragment: params.vmIdFragment,\n      accumulatedAmount: params.accumulatedAmount,\n      nonce: params.nonce,\n    };\n  }\n\n  /**\n   * Check if a SubRAV version is supported\n   */\n  static isSupportedVersion(version: number): boolean {\n    return version === SUBRAV_VERSION_1;\n  }\n}\n","export enum PaymentErrorCode {\n  // Auth\n  AUTH_MISSING = 'AUTH_MISSING',\n  AUTH_INVALID = 'AUTH_INVALID',\n  AUTH_ADMIN_FORBIDDEN = 'AUTH_ADMIN_FORBIDDEN',\n  DID_RESOLVE_FAILED = 'DID_RESOLVE_FAILED',\n\n  // Channel\n  CHANNEL_NOT_FOUND = 'CHANNEL_NOT_FOUND',\n  SUBCHANNEL_NOT_AUTHORIZED = 'SUBCHANNEL_NOT_AUTHORIZED',\n  CHANNEL_CONTEXT_MISSING = 'CHANNEL_CONTEXT_MISSING',\n\n  // RAV/SubRAV\n  PAYMENT_REQUIRED = 'PAYMENT_REQUIRED',\n  RAV_CONFLICT = 'RAV_CONFLICT',\n  INVALID_SIGNATURE = 'INVALID_SIGNATURE',\n  UNKNOWN_SUBRAV = 'UNKNOWN_SUBRAV',\n  TAMPERED_SUBRAV = 'TAMPERED_SUBRAV',\n\n  // Billing/Rate\n  BILLING_RATE_FETCH_FAILED = 'BILLING_RATE_FETCH_FAILED',\n  BILLING_RATE_NOT_AVAILABLE = 'BILLING_RATE_NOT_AVAILABLE',\n  BILLING_MAX_AMOUNT_EXCEEDED = 'BILLING_MAX_AMOUNT_EXCEEDED',\n  BILLING_CONFIG_ERROR = 'BILLING_CONFIG_ERROR',\n\n  // Hub Balance\n  HUB_INSUFFICIENT_FUNDS = 'HUB_INSUFFICIENT_FUNDS',\n  HUB_BALANCE_FETCH_FAILED = 'HUB_BALANCE_FETCH_FAILED',\n\n  // Channel state\n  CHANNEL_CLOSED = 'CHANNEL_CLOSED',\n  EPOCH_MISMATCH = 'EPOCH_MISMATCH',\n\n  // Internal\n  INTERNAL_SERVER_ERROR = 'INTERNAL_SERVER_ERROR',\n}\n\nexport interface PaymentError {\n  code: PaymentErrorCode;\n  message: string;\n  details?: Record<string, unknown>;\n}\n\nexport function httpStatusFor(code?: PaymentErrorCode | string): number {\n  switch (code as PaymentErrorCode) {\n    case PaymentErrorCode.PAYMENT_REQUIRED:\n    case PaymentErrorCode.HUB_INSUFFICIENT_FUNDS:\n      return 402;\n    case PaymentErrorCode.RAV_CONFLICT:\n    case PaymentErrorCode.CHANNEL_CONTEXT_MISSING:\n      return 409;\n\n    case PaymentErrorCode.INVALID_SIGNATURE:\n    case PaymentErrorCode.UNKNOWN_SUBRAV:\n    case PaymentErrorCode.TAMPERED_SUBRAV:\n    case PaymentErrorCode.CHANNEL_CLOSED:\n    case PaymentErrorCode.EPOCH_MISMATCH:\n    case PaymentErrorCode.BILLING_MAX_AMOUNT_EXCEEDED:\n    case PaymentErrorCode.AUTH_MISSING:\n    case PaymentErrorCode.AUTH_INVALID:\n    case PaymentErrorCode.AUTH_ADMIN_FORBIDDEN:\n    case PaymentErrorCode.DID_RESOLVE_FAILED:\n      return 400;\n\n    case PaymentErrorCode.CHANNEL_NOT_FOUND:\n    case PaymentErrorCode.SUBCHANNEL_NOT_AUTHORIZED:\n      return 404;\n\n    case PaymentErrorCode.BILLING_RATE_NOT_AVAILABLE:\n    case PaymentErrorCode.BILLING_RATE_FETCH_FAILED:\n    case PaymentErrorCode.BILLING_CONFIG_ERROR:\n    case PaymentErrorCode.HUB_BALANCE_FETCH_FAILED:\n    default:\n      return 500;\n  }\n}\n\nexport const Errors = {\n  paymentRequired: (msg?: string): PaymentError => ({\n    code: PaymentErrorCode.PAYMENT_REQUIRED,\n    message: msg ?? 'Signature required for pending proposal',\n  }),\n  ravConflict: (msg: string): PaymentError => ({\n    code: PaymentErrorCode.RAV_CONFLICT,\n    message: msg,\n  }),\n  channelContextMissing: (): PaymentError => ({\n    code: PaymentErrorCode.CHANNEL_CONTEXT_MISSING,\n    message: 'channelId or vmIdFragment not derivable. Check DID authentication.',\n  }),\n  channelNotFound: (id: string): PaymentError => ({\n    code: PaymentErrorCode.CHANNEL_NOT_FOUND,\n    message: `CHANNEL_NOT_FOUND: ${id}`,\n  }),\n  subchannelNotAuthorized: (id: string, vm: string): PaymentError => ({\n    code: PaymentErrorCode.SUBCHANNEL_NOT_AUTHORIZED,\n    message: `SUBCHANNEL_NOT_AUTHORIZED: ${id}#${vm}`,\n  }),\n  didResolveFailed: (did: string): PaymentError => ({\n    code: PaymentErrorCode.DID_RESOLVE_FAILED,\n    message: `DID_RESOLVE_FAILED: ${did}`,\n  }),\n  rateFetchFailed: (e: unknown): PaymentError => ({\n    code: PaymentErrorCode.BILLING_RATE_FETCH_FAILED,\n    message: String(e),\n  }),\n  rateNotAvailable: (assetId: string): PaymentError => ({\n    code: PaymentErrorCode.BILLING_RATE_NOT_AVAILABLE,\n    message: `Missing exchange rate for asset ${assetId}`,\n  }),\n  maxAmountExceeded: (finalCost: bigint, max: bigint): PaymentError => ({\n    code: PaymentErrorCode.BILLING_MAX_AMOUNT_EXCEEDED,\n    message: `Cost ${finalCost} exceeds maxAmount ${max}`,\n    details: { finalCost: finalCost.toString(), max: max.toString() },\n  }),\n  internal: (msg: string): PaymentError => ({\n    code: PaymentErrorCode.INTERNAL_SERVER_ERROR,\n    message: msg,\n  }),\n  hubInsufficientFunds: (balance: bigint, required: bigint, assetId: string): PaymentError => ({\n    code: PaymentErrorCode.HUB_INSUFFICIENT_FUNDS,\n    message: `PaymentHub balance insufficient: ${balance}, required: ${required} for asset ${assetId}`,\n    details: { balance: balance.toString(), required: required.toString(), assetId },\n  }),\n  hubBalanceFetchFailed: (error: unknown, ownerDid: string, assetId: string): PaymentError => ({\n    code: PaymentErrorCode.HUB_BALANCE_FETCH_FAILED,\n    message: `Failed to fetch PaymentHub balance for ${ownerDid}#${assetId}: ${String(error)}`,\n    details: { ownerDid, assetId, error: String(error) },\n  }),\n} as const;\n","import { BillingRule, Strategy, StrategyConfig } from './types';\n\nexport type StrategyBuilder<T extends StrategyConfig = StrategyConfig> = (cfg: T) => Strategy;\n\nconst registry = new Map<string, StrategyBuilder>();\n// Use WeakMap keyed by BillingRule object reference to avoid collisions when\n// different services re-use the same `rule.id`.\nlet cache: WeakMap<BillingRule, Strategy> = new WeakMap();\n\n/**\n * Register a strategy builder with the global registry.\n * This should be called exactly once per strategy type (during module init).\n */\nexport function register(type: string, builder: StrategyBuilder): void {\n  if (registry.has(type)) {\n    // eslint-disable-next-line no-console\n    console.warn(`Billing strategy type '${type}' is already registered – overwriting.`);\n  }\n  registry.set(type, builder);\n}\n\n/**\n * Resolve (and lazily cache) a strategy instance for the given rule.\n */\nexport function getStrategy(rule: BillingRule): Strategy {\n  const cached = cache.get(rule);\n  if (cached) {\n    return cached;\n  }\n\n  const builder = registry.get(rule.strategy.type);\n  if (!builder) {\n    throw new Error(\n      `Unknown billing strategy type '${rule.strategy.type}'. Make sure it has been registered.`\n    );\n  }\n\n  const strategy = builder(rule.strategy);\n  cache.set(rule, strategy);\n  return strategy;\n}\n\n/**\n * Clear cached strategy instances – mostly useful for hot-reloading.\n */\nexport function clearCache(rule?: BillingRule): void {\n  if (rule) {\n    cache.delete(rule);\n  } else {\n    cache = new WeakMap();\n  }\n}\n\n/**\n * Clear the entire strategy registry – useful for testing.\n * WARNING: This should only be used in test environments.\n */\nexport function clearRegistry(): void {\n  registry.clear();\n}\n","import { AssetInfo } from '../../core/types';\n\n/**\n * Rate provider types for USD pricing and multi-asset settlement\n */\n\n/**\n * Rate provider interface for fetching USD exchange rates\n */\nexport interface RateProvider {\n  /**\n   * Get the price of an asset in picoUSD per minimum unit\n   * @param assetId - Asset identifier (e.g. '0x3::gas_coin::RGas', 'ethereum', etc.)\n   * @returns Price in picoUSD per minimum unit (10^-12 USD)\n   */\n  getPricePicoUSD(assetId: string): Promise<bigint>;\n\n  /**\n   * Get asset information including decimals\n   * @param assetId - Asset identifier\n   * @returns Asset information or null if not found\n   */\n  getAssetInfo(assetId: string): Promise<AssetInfo | null>;\n\n  /**\n   * Get the timestamp of the last price update for an asset\n   * @param assetId - Asset identifier\n   * @returns Timestamp in milliseconds, or null if never updated\n   */\n  getLastUpdated(assetId: string): number | null;\n\n  /**\n   * Clear cached data for an asset\n   * @param assetId - Asset identifier, or undefined to clear all\n   */\n  clearCache(assetId?: string): void;\n}\n\n/**\n * Base rate provider with common functionality\n */\nexport abstract class BaseRateProvider implements RateProvider {\n  protected cache = new Map<\n    string,\n    {\n      price: bigint;\n      timestamp: number;\n      assetInfo?: AssetInfo;\n    }\n  >();\n  protected cacheTimeout: number;\n\n  constructor(\n    cacheTimeoutMs = 60000 // 1 minute default\n  ) {\n    this.cacheTimeout = cacheTimeoutMs;\n  }\n\n  abstract getPricePicoUSD(assetId: string): Promise<bigint>;\n\n  abstract getAssetInfo(assetId: string): Promise<AssetInfo | null>;\n\n  getLastUpdated(assetId: string): number | null {\n    const cached = this.cache.get(assetId);\n    return cached?.timestamp || null;\n  }\n\n  clearCache(assetId?: string): void {\n    if (assetId) {\n      this.cache.delete(assetId);\n    } else {\n      this.cache.clear();\n    }\n  }\n\n  protected updateCache(assetId: string, price: bigint, assetInfo?: AssetInfo): void {\n    this.cache.set(assetId, {\n      price,\n      timestamp: Date.now(),\n      assetInfo,\n    });\n  }\n\n  protected isCacheValid(assetId: string): boolean {\n    const cached = this.cache.get(assetId);\n    if (!cached) return false;\n    return Date.now() - cached.timestamp < this.cacheTimeout;\n  }\n\n  protected getCachedPrice(assetId: string): bigint | null {\n    const cached = this.cache.get(assetId);\n    if (!cached || !this.isCacheValid(assetId)) return null;\n    return cached.price;\n  }\n}\n\n/**\n * Rate fetch result with metadata\n */\nexport interface RateResult {\n  /** Price in picoUSD */\n  price: bigint;\n  /** Timestamp when fetched */\n  timestamp: number;\n  /** Data source identifier */\n  provider: string;\n  /** Asset identifier */\n  assetId: string;\n}\n\n/**\n * Conversion result with exchange rate information for audit trail\n */\nexport interface ConversionResult {\n  /** Final asset cost in minimum units */\n  assetCost: bigint;\n  /** Original USD cost in picoUSD */\n  usdCost: bigint;\n  /** Exchange rate used (picoUSD per minimum unit) */\n  priceUsed: bigint;\n  /** Timestamp when rate was fetched */\n  priceTimestamp: number;\n  /** Rate provider identifier */\n  rateProvider: string;\n  /** Asset identifier used */\n  assetId: string;\n}\n\n/**\n * Rate provider error types\n */\nexport class RateProviderError extends Error {\n  constructor(\n    message: string,\n    public readonly assetId?: string,\n    public readonly provider?: string\n  ) {\n    super(message);\n    this.name = 'RateProviderError';\n  }\n}\n\nexport class RateNotFoundError extends RateProviderError {\n  constructor(assetId: string, provider: string) {\n    super(`Rate not found for asset ${assetId}`, assetId, provider);\n    this.name = 'RateNotFoundError';\n  }\n}\n\nexport class RateStaleError extends RateProviderError {\n  constructor(assetId: string, provider: string, lastUpdated?: number) {\n    super(`Rate for asset ${assetId} is stale (last updated: ${lastUpdated})`, assetId, provider);\n    this.name = 'RateStaleError';\n  }\n}\n","import { RateProvider, ConversionResult, RateProviderError, RateResult } from '../rate/types';\n\n/**\n * Convert a USD cost (in picoUSD) to the smallest unit of the requested asset\n * using the supplied `RateProvider`.\n */\nexport async function convertUsdToAsset(\n  usdCost: bigint,\n  assetId: string,\n  rateProvider: RateProvider\n): Promise<ConversionResult> {\n  if (usdCost === 0n) {\n    return {\n      assetCost: 0n,\n      usdCost,\n      priceUsed: 0n,\n      priceTimestamp: Date.now(),\n      rateProvider: 'none',\n      assetId,\n    };\n  }\n\n  try {\n    const price = await rateProvider.getPricePicoUSD(assetId);\n    const priceTimestamp = rateProvider.getLastUpdated(assetId) ?? Date.now();\n\n    if (price <= 0n) {\n      throw new RateProviderError(`Invalid price for asset ${assetId}: ${price}`, assetId);\n    }\n\n    // Ceil division to avoid under-charging\n    const assetCost = (usdCost + price - 1n) / price;\n\n    return {\n      assetCost,\n      usdCost,\n      priceUsed: price,\n      priceTimestamp,\n      rateProvider: 'rate-provider',\n      assetId,\n    };\n  } catch (err) {\n    if (err instanceof RateProviderError) {\n      throw err;\n    }\n    throw new RateProviderError(`Failed to convert USD to asset ${assetId}: ${err}`, assetId);\n  }\n}\n\n/**\n * Convert using a pre-fetched price (synchronous, no I/O)\n */\nexport function convertUsdToAssetUsingPrice(usdCost: bigint, rate: RateResult): ConversionResult {\n  if (usdCost === 0n) {\n    return {\n      assetCost: 0n,\n      usdCost,\n      priceUsed: rate.price,\n      priceTimestamp: rate.timestamp,\n      rateProvider: rate.provider,\n      assetId: rate.assetId,\n    };\n  }\n\n  if (rate.price <= 0n) {\n    throw new RateProviderError(\n      `Invalid price for asset ${rate.assetId}: ${rate.price}`,\n      rate.assetId,\n      rate.provider\n    );\n  }\n\n  const assetCost = (usdCost + rate.price - 1n) / rate.price;\n  return {\n    assetCost,\n    usdCost,\n    priceUsed: rate.price,\n    priceTimestamp: rate.timestamp,\n    rateProvider: rate.provider,\n    assetId: rate.assetId,\n  };\n}\n","import { Strategy, BillingContext } from '../core/types';\n\n/**\n * Base class for all billing strategies\n */\nexport abstract class BaseStrategy implements Strategy {\n  /**\n   * Default implementation: most strategies don't require execution results\n   */\n  readonly deferred: boolean = false;\n  /**\n   * Convert string or bigint to bigint\n   * Handles scientific notation strings like \"5e12\"\n   */\n  protected toBigInt(value: string | bigint | number): bigint {\n    if (typeof value === 'bigint') {\n      return value;\n    }\n    if (typeof value === 'number') {\n      return BigInt(value);\n    }\n    // Handle scientific notation\n    if (value.includes('e') || value.includes('E')) {\n      const num = parseFloat(value);\n      return BigInt(Math.round(num));\n    }\n    return BigInt(value);\n  }\n\n  /**\n   * Abstract method to be implemented by concrete strategies\n   */\n  abstract evaluate(ctx: BillingContext, units: number): bigint;\n}\n","import { BaseStrategy } from './base';\nimport { BillingContext } from '../core/types';\n\n/**\n * Configuration for PerRequest strategy\n */\nexport interface PerRequestConfig {\n  /** Fixed price per request */\n  price: string | bigint | number;\n}\n\n/**\n * Per-request fixed pricing strategy\n * Charges a fixed amount for each request regardless of content\n */\nexport class PerRequestStrategy extends BaseStrategy {\n  private readonly price: bigint;\n\n  constructor(config: PerRequestConfig) {\n    super();\n    this.price = this.toBigInt(config.price);\n  }\n\n  override evaluate(ctx: BillingContext, units: number): bigint {\n    const u = Number.isFinite(units) && units > 0 ? Math.floor(units) : 1;\n    return this.price * BigInt(u);\n  }\n}\n","import type { BillingContext } from '../core/types';\nimport { BaseStrategy } from './base';\n\n/**\n * PerToken strategy configuration\n */\nexport interface PerTokenConfig {\n  /** Price per token in picoUSD */\n  unitPricePicoUSD: string | bigint;\n}\n\n/**\n * Per-token billing strategy\n *\n * Calculates cost based on token usage: unitPricePicoUSD × tokens\n */\nexport class PerTokenStrategy extends BaseStrategy {\n  /**\n   * PerToken strategy requires execution results (usage data) from LLM calls\n   */\n  readonly deferred: boolean = true;\n\n  private readonly unitPrice: bigint;\n\n  constructor(config: PerTokenConfig) {\n    super();\n    this.unitPrice = this.toBigInt(config.unitPricePicoUSD);\n  }\n\n  override evaluate(ctx: BillingContext, units: number): bigint {\n    const tokenCount = Number.isFinite(units) && units > 0 ? Math.floor(units) : 1;\n    return this.unitPrice * BigInt(tokenCount);\n  }\n}\n","import type { BillingContext } from '../core/types';\nimport { BaseStrategy } from './base';\n\n/**\n * FinalCost strategy configuration\n * - No options. Incoming usage MUST be picoUSD (integer) value.\n */\nexport interface FinalCostConfig {}\n\n/**\n * Final-cost passthrough billing strategy\n *\n * This strategy is used when the application already knows the final USD cost\n * (either computed internally or received from a provider). The application\n * MUST pass picoUSD (integer) via the `usage` parameter to `settle()`.\n * This strategy returns that picoUSD as bigint for downstream asset conversion.\n */\nexport class FinalCostStrategy extends BaseStrategy {\n  /** Requires post-flight usage to be available */\n  readonly deferred: boolean = true;\n\n  constructor(_config: FinalCostConfig = {}) {\n    super();\n  }\n\n  override evaluate(_ctx: BillingContext, units: number): bigint {\n    const value = Number.isFinite(units) && units > 0 ? Math.floor(units) : 0;\n    return BigInt(value);\n  }\n}\n","export { BaseStrategy } from './base';\nimport { PerRequestStrategy, PerRequestConfig } from './perRequest';\nimport { PerTokenStrategy, PerTokenConfig } from './perToken';\nimport { FinalCostStrategy, FinalCostConfig } from './finalCost';\nimport { register as registerStrategy } from '../core/strategy-registry';\n\nexport { PerRequestStrategy, PerRequestConfig, PerTokenStrategy, PerTokenConfig };\nexport { FinalCostStrategy, FinalCostConfig };\n\n// Explicit registration API to avoid side-effect imports\nexport function registerBuiltinStrategies(): void {\n  registerStrategy('PerRequest', cfg => new PerRequestStrategy(cfg as any));\n  registerStrategy('PerToken', cfg => new PerTokenStrategy(cfg as any));\n  registerStrategy('FinalCost', cfg => new FinalCostStrategy(cfg as any));\n}\n","/**\n * Channel utilities for payment channel operations\n *\n * Provides pure functions for channel ID derivation and other channel-related operations\n * that don't require blockchain interaction.\n */\n\nimport { parseDid } from '@nuwa-ai/identity-kit';\nimport {\n  bcs,\n  sha3_256,\n  toHEX,\n  Serializer,\n  RoochAddress,\n  normalizeRoochAddress,\n} from '@roochnetwork/rooch-sdk';\n\n/**\n * Channel key structure matching Move contract ChannelKey\n */\nexport interface ChannelKey {\n  sender: string;\n  receiver: string;\n  coin_type: string;\n}\n\n/**\n * BCS Schema for ChannelKey - matches Move contract exactly\n */\nexport const ChannelKeySchema: any = bcs.struct('ChannelKey', {\n  sender: bcs.Address,\n  receiver: bcs.Address,\n  coin_type: bcs.string(),\n});\n\n// ==================== BCS Schema Definitions ====================\n\n// CancellationInfo struct\nexport interface CancellationInfo {\n  initiated_time: bigint;\n  pending_amount: bigint;\n}\n\nexport const CancellationInfoSchema: any = bcs.struct('CancellationInfo', {\n  initiated_time: bcs.u64(),\n  pending_amount: bcs.u256(),\n});\n\n// SubChannel struct\nexport interface SubChannel {\n  pk_multibase: string;\n  method_type: string;\n  last_claimed_amount: bigint;\n  last_confirmed_nonce: bigint;\n}\n\nexport const SubChannelSchema: any = bcs.struct('SubChannel', {\n  pk_multibase: bcs.string(),\n  method_type: bcs.string(),\n  last_claimed_amount: bcs.u256(),\n  last_confirmed_nonce: bcs.u64(),\n});\n\n// PaymentChannel struct - matches Move contract exactly\nexport interface PaymentChannelData {\n  sender: string;\n  receiver: string;\n  coin_type: string;\n  sub_channels: string; // ObjectID as hex string (Table handle)\n  status: number;\n  channel_epoch: bigint;\n  cancellation_info: CancellationInfo | null;\n}\n\nexport const PaymentChannelSchema: any = bcs.struct('PaymentChannel', {\n  sender: bcs.Address,\n  receiver: bcs.Address,\n  coin_type: bcs.string(),\n  sub_channels: bcs.ObjectId, // Table<String, SubChannel> stored as ObjectID\n  status: bcs.u8(),\n  channel_epoch: bcs.u64(),\n  cancellation_info: bcs.option(CancellationInfoSchema),\n});\n\n// PaymentHub structure definition matching the Move contract\nexport interface PaymentHub {\n  multi_coin_store: string; // ObjectID as hex string\n  active_channels: string; // ObjectID as hex string\n}\n\nexport const PaymentHubSchema: any = bcs.struct('PaymentHub', {\n  multi_coin_store: bcs.ObjectId,\n  active_channels: bcs.ObjectId, // Table<String, u64>\n});\n\n// PaymentRevenueHub structure definition matching the Move contract\nexport interface PaymentRevenueHub {\n  multi_coin_store: string; // ObjectID as hex string\n  revenue_by_source: string; // ObjectID as hex string (Table<String, Table<String, u256>>)\n}\n\nexport const PaymentRevenueHubSchema: any = bcs.struct('PaymentRevenueHub', {\n  multi_coin_store: bcs.ObjectId,\n  revenue_by_source: bcs.ObjectId, // Table<String, Table<String, u256>>\n});\n\n// Balance struct - matches multi_coin_store.move\nexport interface BalanceData {\n  value: bigint;\n}\n\nexport const BalanceSchema: any = bcs.struct('Balance', {\n  value: bcs.u256(),\n});\n\n// CoinStoreField struct - matches multi_coin_store.move\nexport interface CoinStoreFieldData {\n  coin_type: string;\n  balance: BalanceData;\n  frozen: boolean;\n}\n\nexport const CoinStoreFieldSchema: any = bcs.struct('CoinStoreField', {\n  coin_type: bcs.string(),\n  balance: BalanceSchema,\n  frozen: bcs.bool(),\n});\n\n// DynamicField struct for parsing Table fields\nexport interface DynamicField<K, V> {\n  name: K;\n  value: V;\n}\n\nexport const DynamicFieldSubChannelSchema: any = bcs.struct('DynamicField', {\n  name: bcs.string(),\n  value: SubChannelSchema,\n});\n\nexport const DynamicFieldCoinStoreSchema: any = bcs.struct('DynamicField', {\n  name: bcs.string(),\n  value: CoinStoreFieldSchema,\n});\n\nexport const DynamicFieldU64Schema: any = bcs.struct('DynamicField', {\n  name: bcs.string(),\n  value: bcs.u64(),\n});\n\n/**\n * Derive channel ID from payer DID, payee DID, and asset ID\n *\n * This function replicates the exact same logic as the Move contract's\n * object::custom_object_id<ChannelKey, PaymentChannel>(key) calculation.\n *\n * @param payerDid - Payer DID (e.g., \"did:rooch:...\")\n * @param payeeDid - Payee DID (e.g., \"did:rooch:...\")\n * @param assetId - Asset ID (e.g., \"0x3::gas_coin::RGas\")\n * @returns Channel object ID as hex string\n */\nexport function deriveChannelId(payerDid: string, payeeDid: string, assetId: string): string {\n  // Parse and validate DIDs\n  const payerParsed = parseDid(payerDid);\n  const payeeParsed = parseDid(payeeDid);\n\n  if (payerParsed.method !== 'rooch') {\n    throw new Error(`Invalid payer DID method: expected 'rooch', got '${payerParsed.method}'`);\n  }\n  if (payeeParsed.method !== 'rooch') {\n    throw new Error(`Invalid payee DID method: expected 'rooch', got '${payeeParsed.method}'`);\n  }\n\n  return calcChannelObjectId(payerParsed.identifier, payeeParsed.identifier, assetId);\n}\n\n/**\n * Calculate channel object ID using the same logic as Move contract\n *\n * This replicates object::custom_object_id<ChannelKey, PaymentChannel>(key)\n * from payment_channel.move using proper BCS serialization.\n *\n * @param senderAddress - Sender address\n * @param receiverAddress - Receiver address\n * @param coinType - Coin type string\n * @returns Channel object ID as hex string\n */\nexport function calcChannelObjectId(\n  senderAddress: string,\n  receiverAddress: string,\n  coinType: string\n): string {\n  const normalizedCoinType = normalizeAssetId(coinType);\n\n  // Create ChannelKey struct - this must match the Move struct exactly\n  const channelKey: ChannelKey = {\n    sender: senderAddress,\n    receiver: receiverAddress,\n    coin_type: normalizedCoinType,\n  };\n\n  // Create PaymentChannel struct tag\n  const paymentChannelStructTag = {\n    address: '0x3',\n    module: 'payment_channel',\n    name: 'PaymentChannel',\n    type_params: [],\n  };\n\n  // Implement custom_object_id logic:\n  // 1. BCS serialize the ChannelKey struct (not JSON!)\n  // 2. Append the PaymentChannel struct tag canonical string as bytes\n  // 3. SHA3-256 hash the combined bytes\n  // 4. Return as ObjectID\n\n  // BCS serialize the ChannelKey\n  const idBytes = ChannelKeySchema.serialize(channelKey).toBytes();\n\n  // Get PaymentChannel struct tag canonical string as bytes\n  const typeBytes = new TextEncoder().encode(\n    Serializer.structTagToCanonicalString(paymentChannelStructTag)\n  );\n\n  // Concatenate: bcs(ChannelKey) + canonical_string(PaymentChannel)\n  const bytes = new Uint8Array(idBytes.length + typeBytes.length);\n  bytes.set(idBytes);\n  bytes.set(typeBytes, idBytes.length);\n\n  // SHA3-256 hash\n  const hash = sha3_256(bytes);\n  return `0x${toHEX(hash)}`;\n}\n\n/**\n * Normalize asset ID to canonical string representation\n * @param assetId Asset ID string\n * @returns Canonical asset ID string\n */\nexport function normalizeAssetId(assetId: string): string {\n  try {\n    // Use Rooch SDK's built-in parser with address normalization\n    const typeTag = Serializer.typeTagParseFromStr(assetId, true);\n\n    // Ensure it's a struct type (not a primitive type)\n    if (!('struct' in typeTag)) {\n      throw new Error(`Asset ID must be a struct type, got: ${assetId}`);\n    }\n\n    return Serializer.structTagToCanonicalString(typeTag.struct as any);\n  } catch (error) {\n    throw new Error(`Failed to parse asset ID: ${assetId} - ${error}`);\n  }\n}\n\n/**\n * Validate channel ID format\n * @param channelId Channel ID to validate\n * @returns True if valid format\n */\nexport function isValidChannelId(channelId: string): boolean {\n  // Channel ID should be a hex string starting with 0x\n  return /^0x[a-fA-F0-9]{64}$/.test(channelId);\n}\n\n/**\n * Extract channel information from channel ID (if possible)\n * Note: This is a one-way function, channel ID cannot be reversed to get original inputs\n * @param channelId Channel ID\n * @returns Basic channel info or null if invalid\n */\nexport function parseChannelIdInfo(\n  channelId: string\n): { isValid: boolean; objectId: string } | null {\n  if (!isValidChannelId(channelId)) {\n    return null;\n  }\n\n  return {\n    isValid: true,\n    objectId: channelId,\n  };\n}\n\n// ==================== PaymentHub Utilities ====================\n\n/**\n * Calculate PaymentHub ID using the same algorithm as in Move\n *\n * Replicates the logic from moveos_types::moveos_std::object::account_named_object_id\n * and payment_channel.move::get_payment_hub_id function\n *\n * @param ownerAddress - Owner address (DID identifier or hex address)\n * @returns PaymentHub object ID as hex string\n */\nexport function calculatePaymentHubId(ownerAddress: string): string {\n  // Create PaymentHub struct tag using the same approach as ChannelUtils\n  const paymentHubStructTag = {\n    address: '0x3',\n    module: 'payment_channel',\n    name: 'PaymentHub',\n    type_params: [],\n  };\n\n  // Get canonical string representation using Serializer\n  const canonicalStructTag = Serializer.structTagToCanonicalString(paymentHubStructTag);\n\n  const roochAddress = new RoochAddress(ownerAddress);\n\n  // Convert owner address to bytes - Rooch SDK handles the address format conversion\n  const ownerBytes = roochAddress.toBytes();\n\n  // Append struct tag bytes (canonical string format)\n  const structTagBytes = new TextEncoder().encode(canonicalStructTag);\n\n  // Combine owner address bytes + struct tag bytes (browser-friendly)\n  const combined = new Uint8Array(ownerBytes.length + structTagBytes.length);\n  combined.set(ownerBytes, 0);\n  combined.set(structTagBytes, ownerBytes.length);\n\n  // Calculate SHA3-256 hash\n  const hash = sha3_256(combined);\n\n  // Return as hex string with 0x prefix (ObjectID format)\n  return '0x' + toHEX(hash);\n}\n\n/**\n * Derive a FieldKey from a string value.\n * This follows Rooch's FieldKey::derive_from_string logic:\n * hash(bcs(MoveString) || canonical_type_tag_string)\n *\n * @param value - The string value to derive field key from\n * @returns FieldKey as hex string\n */\nexport function deriveFieldKeyFromString(value: string): string {\n  try {\n    // BCS serialize the value as MoveString using Rooch's bcs library\n    const keyBytes = bcs.string().serialize(value).toBytes();\n\n    // Get the canonical type tag string for String type\n    // Must use full canonical address format (32-byte) as specified in Rust implementation\n    const stringTypeTag =\n      '0x0000000000000000000000000000000000000000000000000000000000000001::string::String';\n    const typeTagBytes = new TextEncoder().encode(stringTypeTag);\n\n    // Concatenate: bcs(key) + canonical_type_tag_string\n    const combinedBytes = new Uint8Array(keyBytes.length + typeTagBytes.length);\n    combinedBytes.set(keyBytes);\n    combinedBytes.set(typeTagBytes, keyBytes.length);\n\n    // SHA3-256 hash\n    const hash = sha3_256(combinedBytes);\n    return `0x${toHEX(hash)}`;\n  } catch (error) {\n    throw new Error(`Failed to derive field key: ${error}`);\n  }\n}\n\n/**\n * Derive field key for coin type asset ID\n * @param coinType - Asset ID (e.g., \"0x3::gas_coin::RGas\")\n * @returns FieldKey as hex string\n */\nexport function deriveCoinTypeFieldKey(coinType: string): string {\n  const assetIdCanonical = normalizeAssetId(coinType);\n  return deriveFieldKeyFromString(assetIdCanonical);\n}\n\n// ==================== BCS Parsing Utilities ====================\n\n/**\n * Parse PaymentChannel data from BCS hex string\n * @param value BCS encoded hex string from object state\n * @returns Parsed PaymentChannelData\n */\nexport function parsePaymentChannelData(value: string): PaymentChannelData {\n  try {\n    // Remove '0x' prefix if present\n    const bcsHex = value.startsWith('0x') ? value.slice(2) : value;\n    const bcsBytes = new Uint8Array(\n      bcsHex.match(/.{1,2}/g)?.map((byte: string) => parseInt(byte, 16)) || []\n    );\n\n    // Parse using BCS schema\n    const parsed = PaymentChannelSchema.parse(bcsBytes);\n\n    return {\n      sender: parsed.sender,\n      receiver: parsed.receiver,\n      coin_type: parsed.coin_type,\n      sub_channels: parsed.sub_channels,\n      status: parsed.status,\n      channel_epoch: BigInt(parsed.channel_epoch),\n      cancellation_info: parsed.cancellation_info\n        ? {\n            initiated_time: BigInt(parsed.cancellation_info.initiated_time),\n            pending_amount: BigInt(parsed.cancellation_info.pending_amount),\n          }\n        : null,\n    };\n  } catch (error) {\n    throw new Error(`Failed to parse PaymentChannel data: ${error}`);\n  }\n}\n\n/**\n * Parse PaymentHub data from BCS hex string\n * @param value BCS encoded hex string from object state\n * @returns Parsed PaymentHub\n */\nexport function parsePaymentHubData(value: string): PaymentHub {\n  try {\n    if (typeof value === 'string' && value.startsWith('0x')) {\n      // Parse BCS bytes using PaymentHubSchema (browser-friendly hex decode)\n      const hex = value.slice(2);\n      const bcsBytes = new Uint8Array(hex.length / 2);\n      for (let i = 0; i < bcsBytes.length; i++) {\n        bcsBytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n      }\n      const parsed = PaymentHubSchema.parse(bcsBytes);\n\n      return {\n        multi_coin_store: parsed.multi_coin_store,\n        active_channels: parsed.active_channels,\n      };\n    } else {\n      throw new Error('Unexpected PaymentHub value format');\n    }\n  } catch (error) {\n    throw new Error(`Failed to parse PaymentHub data: ${error}`);\n  }\n}\n\n/**\n * Parse PaymentRevenueHub from BCS hex string\n * @param value BCS encoded hex string from object state\n * @returns Parsed PaymentRevenueHub\n */\nexport function parsePaymentRevenueHubData(value: string): PaymentRevenueHub {\n  try {\n    if (typeof value === 'string' && value.startsWith('0x')) {\n      // Parse BCS bytes using PaymentRevenueHubSchema (browser-friendly hex decode)\n      const hex = value.slice(2);\n      const bcsBytes = new Uint8Array(hex.length / 2);\n      for (let i = 0; i < bcsBytes.length; i++) {\n        bcsBytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n      }\n      const parsed = PaymentRevenueHubSchema.parse(bcsBytes);\n\n      return {\n        multi_coin_store: parsed.multi_coin_store,\n        revenue_by_source: parsed.revenue_by_source,\n      };\n    } else {\n      throw new Error('Unexpected PaymentRevenueHub value format');\n    }\n  } catch (error) {\n    throw new Error(`Failed to parse PaymentRevenueHub data: ${error}`);\n  }\n}\n\n/**\n * Parse a DynamicField<String, SubChannel> from BCS hex string\n * @param value BCS encoded hex string from a DynamicField\n * @returns Parsed DynamicField<String, SubChannel> object\n */\nexport function parseDynamicFieldSubChannel(value: string): DynamicField<string, SubChannel> {\n  try {\n    // Remove '0x' prefix if present\n    const bcsHex = value.startsWith('0x') ? value.slice(2) : value;\n    const bcsBytes = new Uint8Array(\n      bcsHex.match(/.{1,2}/g)?.map((byte: string) => parseInt(byte, 16)) || []\n    );\n\n    // Parse using DynamicField BCS schema\n    const parsed = DynamicFieldSubChannelSchema.parse(bcsBytes);\n\n    return {\n      name: parsed.name,\n      value: {\n        pk_multibase: parsed.value.pk_multibase,\n        method_type: parsed.value.method_type,\n        last_claimed_amount: BigInt(parsed.value.last_claimed_amount),\n        last_confirmed_nonce: BigInt(parsed.value.last_confirmed_nonce),\n      },\n    };\n  } catch (error) {\n    throw new Error(`Failed to parse DynamicField<String, SubChannel>: ${error}`);\n  }\n}\n\n/**\n * Parse a DynamicField<String, CoinStoreField> from BCS hex string\n * @param value BCS encoded hex string from a DynamicField\n * @returns Parsed DynamicField<String, CoinStoreField> object\n */\nexport function parseDynamicFieldCoinStore(\n  value: string\n): DynamicField<string, CoinStoreFieldData> {\n  try {\n    const hex = value.startsWith('0x') ? value.slice(2) : value;\n    const bcsBytes = new Uint8Array(hex.length / 2);\n    for (let i = 0; i < bcsBytes.length; i++) {\n      bcsBytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n    }\n    const parsed = DynamicFieldCoinStoreSchema.parse(bcsBytes);\n\n    return {\n      name: parsed.name as string,\n      value: parsed.value as CoinStoreFieldData,\n    };\n  } catch (error) {\n    throw new Error(`Failed to parse DynamicField<String, CoinStoreField>: ${error}`);\n  }\n}\n\n/**\n * Parse a DynamicField<String, u64> from BCS hex string\n * @param value BCS encoded hex string from a DynamicField\n * @returns Parsed DynamicField<String, u64> object\n */\nexport function parseDynamicFieldU64(value: string): DynamicField<string, number> {\n  try {\n    const hex = value.startsWith('0x') ? value.slice(2) : value;\n    const bcsBytes = new Uint8Array(hex.length / 2);\n    for (let i = 0; i < bcsBytes.length; i++) {\n      bcsBytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n    }\n    const parsed = DynamicFieldU64Schema.parse(bcsBytes);\n\n    return {\n      name: parsed.name as string,\n      value: Number(parsed.value), // Convert bigint to number for count\n    };\n  } catch (error) {\n    throw new Error(`Failed to parse DynamicField<String, u64>: ${error}`);\n  }\n}\n\n/**\n * Safely convert balance value to bigint\n * @param balanceValue - The balance value from BCS parsing (could be string or bigint)\n * @returns Balance as bigint\n */\nexport function safeBalanceToBigint(balanceValue: any): bigint {\n  if (typeof balanceValue === 'string') {\n    return BigInt(balanceValue);\n  } else if (typeof balanceValue === 'bigint') {\n    return balanceValue;\n  } else {\n    return BigInt(0);\n  }\n}\n\n// ==================== Revenue-related Utility Functions ====================\n\n/**\n * Calculate PaymentRevenueHub object ID for a given owner address\n * This matches the Move contract's object::account_named_object_id<PaymentRevenueHub>(owner)\n * Uses the same calculation approach as calculatePaymentHubId but for PaymentRevenueHub struct\n * @param ownerAddress The owner's address (without did:rooch: prefix)\n * @returns The calculated revenue hub object ID\n */\nexport function calculateRevenueHubId(ownerAddress: string): string {\n  try {\n    // Create PaymentRevenueHub struct tag using the same approach as PaymentHub\n    const paymentRevenueHubStructTag = {\n      address: '0x3',\n      module: 'payment_revenue',\n      name: 'PaymentRevenueHub',\n      type_params: [],\n    };\n\n    // Get canonical string representation using Serializer\n    const canonicalStructTag = Serializer.structTagToCanonicalString(paymentRevenueHubStructTag);\n\n    const roochAddress = new RoochAddress(ownerAddress);\n\n    // Convert owner address to bytes - Rooch SDK handles the address format conversion\n    const ownerBytes = roochAddress.toBytes();\n\n    // Append struct tag bytes (canonical string format)\n    const structTagBytes = new TextEncoder().encode(canonicalStructTag);\n\n    // Combine owner address bytes + struct tag bytes (browser-friendly)\n    const combined = new Uint8Array(ownerBytes.length + structTagBytes.length);\n    combined.set(ownerBytes, 0);\n    combined.set(structTagBytes, ownerBytes.length);\n\n    // Calculate SHA3-256 hash\n    const hash = sha3_256(combined);\n\n    // Return as hex string with 0x prefix (ObjectID format)\n    return '0x' + toHEX(hash);\n  } catch (error) {\n    // If address parsing fails, fall back to a deterministic hash approach\n    const normalizedAddress = normalizeRoochAddress(ownerAddress);\n    const typeIdentifier = 'PaymentRevenueHub';\n    const combined = `${normalizedAddress}::${typeIdentifier}`;\n    const hash = sha3_256(new TextEncoder().encode(combined));\n    return `0x${toHEX(hash)}`;\n  }\n}\n\n/**\n * Parse u256 value from BCS hex string\n * @param value BCS encoded hex string containing a u256 value\n * @returns Parsed u256 as bigint\n */\nexport function parseU256FromBCS(value: string): bigint {\n  try {\n    const hex = value.startsWith('0x') ? value.slice(2) : value;\n    const bcsBytes = new Uint8Array(hex.length / 2);\n    for (let i = 0; i < bcsBytes.length; i++) {\n      bcsBytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n    }\n\n    // Parse u256 using BCS\n    const parsed = bcs.u256().parse(bcsBytes);\n    return BigInt(parsed);\n  } catch (error) {\n    throw new Error(`Failed to parse u256 from BCS: ${error}`);\n  }\n}\n\n/**\n * Extract string value from a dynamic field key\n * @param fieldKey The field key to decode\n * @returns The extracted string value or null if parsing fails\n */\nexport function extractStringFromFieldKey(fieldKey: string): string | null {\n  try {\n    // This is a placeholder implementation\n    // The actual implementation would need to decode the BCS-encoded field key\n    // For now, we assume the field key contains the string in a decodable format\n\n    if (fieldKey.startsWith('0x')) {\n      const hex = fieldKey.slice(2);\n      const bcsBytes = new Uint8Array(hex.length / 2);\n      for (let i = 0; i < bcsBytes.length; i++) {\n        bcsBytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n      }\n\n      // Try to parse as string\n      const parsed = bcs.string().parse(bcsBytes);\n      return parsed;\n    }\n\n    return null;\n  } catch (error) {\n    return null;\n  }\n}\n\n/**\n * Extract asset ID from a coin store field key\n * @param fieldKey The field key to decode\n * @returns The extracted asset ID or null if parsing fails\n */\nexport function extractAssetIdFromFieldKey(fieldKey: string): string | null {\n  try {\n    // This is similar to extractStringFromFieldKey but specifically for asset IDs\n    return extractStringFromFieldKey(fieldKey);\n  } catch (error) {\n    return null;\n  }\n}\n\n/**\n * Extract table ID from a dynamic field value\n * @param fieldValue The field value containing a table reference\n * @returns The extracted table ID or null if parsing fails\n */\nexport function extractTableIdFromField(fieldValue: any): string | null {\n  try {\n    if (typeof fieldValue === 'string' && fieldValue.startsWith('0x')) {\n      // This is a placeholder implementation\n      // The actual implementation would parse the BCS data to extract the table ObjectID\n\n      const hex = fieldValue.slice(2);\n      const bcsBytes = new Uint8Array(hex.length / 2);\n      for (let i = 0; i < bcsBytes.length; i++) {\n        bcsBytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n      }\n\n      // Try to parse as ObjectId (assuming it's stored as the table reference)\n      const parsed = bcs.ObjectId.parse(bcsBytes);\n      return parsed;\n    }\n\n    return null;\n  } catch (error) {\n    return null;\n  }\n}\n","import type { ChannelInfo, SignedSubRAV, SubChannelInfo, SubRAV } from './types';\nimport type { BillingContext, BillingRule } from '../billing';\nimport { PaymentErrorCode } from '../errors/codes';\nimport type { PendingSubRAVRepository } from '../storage/interfaces/PendingSubRAVRepository';\nimport type { RAVRepository } from '../storage/interfaces/RAVRepository';\nimport type { DIDDocument } from '@nuwa-ai/identity-kit';\nimport { SubRAVSigner } from './SubRav';\n\nexport interface RavVerifyDeps {\n  pendingRepo: PendingSubRAVRepository;\n  ravRepo: RAVRepository;\n  debug?: boolean;\n}\n\nexport type RavDecision = 'ALLOW' | 'REQUIRE_SIGNATURE_402' | 'CONFLICT' | 'CHANNEL_NOT_FOUND';\n\nexport interface RavVerifyResult {\n  decision: RavDecision;\n  signedVerified: boolean;\n  pendingMatched: boolean;\n  error?: { code: string; message: string };\n}\n\nexport interface RavVerifyParams {\n  channelInfo: ChannelInfo;\n  subChannelInfo: SubChannelInfo;\n  billingRule: BillingRule;\n  payerDidDoc: DIDDocument;\n  /** Signed SubRAV from client (optional in FREE mode) */\n  signedSubRav?: SignedSubRAV;\n  /** Latest pending SubRAV from pending repository, it should match the signed SubRAV */\n  latestPendingSubRav?: SubRAV;\n  /** Latest signed SubRAV from repository, it is the previous version of the signed SubRAV */\n  latestSignedSubRav?: SignedSubRAV;\n  /** Debug mode */\n  debug?: boolean;\n}\n\nexport async function verify(params: RavVerifyParams): Promise<RavVerifyResult> {\n  const result: RavVerifyResult = {\n    decision: 'ALLOW',\n    signedVerified: !params.signedSubRav, // default to true if no signedSubRav is provided\n    pendingMatched: false,\n  };\n\n  const signed = params.signedSubRav;\n  const billingRule = params.billingRule;\n  const isFreeRoute = !!billingRule && billingRule.paymentRequired === false;\n\n  // 3) signature verification (if SignedSubRAV is provided)\n  if (signed) {\n    const ok = await SubRAVSigner.verify(signed, { didDocument: params.payerDidDoc });\n    result.signedVerified = !!ok;\n    if (!ok) {\n      result.error = {\n        code: PaymentErrorCode.INVALID_SIGNATURE,\n        message: `Invalid signature for signed SubRAV`,\n      } as any;\n      return finalize();\n    }\n  }\n\n  // 2) pending priority check\n\n  if (params.latestPendingSubRav) {\n    if (!signed) {\n      if (!isFreeRoute) {\n        result.decision = 'REQUIRE_SIGNATURE_402';\n        result.error = {\n          code: PaymentErrorCode.PAYMENT_REQUIRED,\n          message: `Signature required for pending proposal (channel: ${params.channelInfo.channelId}, nonce: ${params.latestPendingSubRav.nonce})`,\n        } as any;\n        return finalize();\n      }\n    } else {\n      const matches =\n        signed.subRav.channelId === params.latestPendingSubRav.channelId &&\n        signed.subRav.vmIdFragment === params.latestPendingSubRav.vmIdFragment &&\n        signed.subRav.nonce === params.latestPendingSubRav.nonce;\n      if (!matches) {\n        result.decision = 'CONFLICT';\n        result.error = {\n          code: PaymentErrorCode.RAV_CONFLICT,\n          message: `SignedSubRAV does not match pending proposal (expected nonce: ${params.latestPendingSubRav.nonce}, accumulatedAmount: ${params.latestPendingSubRav.accumulatedAmount}, received: ${signed.subRav.nonce}, ${signed.subRav.accumulatedAmount})`,\n        } as any;\n        return finalize();\n      }\n      result.pendingMatched = true;\n    }\n  } else {\n    //if no pending, it means the server lost the pending proposal.\n    //we check the signed subrav with the latest signed subrav or subchannel state\n    if (signed) {\n      if (params.latestSignedSubRav) {\n        if (\n          signed.subRav.channelId === params.latestSignedSubRav.subRav.channelId &&\n          signed.subRav.vmIdFragment === params.latestSignedSubRav.subRav.vmIdFragment &&\n          signed.subRav.nonce > params.latestSignedSubRav.subRav.nonce &&\n          signed.subRav.accumulatedAmount > params.latestSignedSubRav.subRav.accumulatedAmount\n        ) {\n          result.decision = 'ALLOW';\n        } else if (\n          // Special case: Allow nonce that is exactly +1 from latest signed SubRAV\n          // This handles the race condition where server sent a proposal via in-band frame\n          // but hasn't persisted it to pendingSubRAVStore yet\n          signed.subRav.channelId === params.latestSignedSubRav.subRav.channelId &&\n          signed.subRav.vmIdFragment === params.latestSignedSubRav.subRav.vmIdFragment &&\n          signed.subRav.nonce === params.latestSignedSubRav.subRav.nonce + 1n &&\n          signed.subRav.accumulatedAmount >= params.latestSignedSubRav.subRav.accumulatedAmount\n        ) {\n          // TODO: This is a temporary workaround for the race condition in streaming responses\n          // where the in-band payment frame is sent before the pending SubRAV is persisted.\n          // A proper fix would be to ensure the pending SubRAV is saved before sending the frame.\n          result.decision = 'ALLOW';\n        } else {\n          result.decision = 'CONFLICT';\n          result.error = {\n            code: PaymentErrorCode.RAV_CONFLICT,\n            message: `SignedSubRAV does not match latest signed SubRAV (expected nonce: ${params.latestSignedSubRav.subRav.nonce} accumulatedAmount: ${params.latestSignedSubRav.subRav.accumulatedAmount}, received: ${signed.subRav.nonce}, ${signed.subRav.accumulatedAmount})`,\n          } as any;\n          return finalize();\n        }\n      } else {\n        //there no latestSignedSubRav, it means the server lost the signed subrav.\n        //we check the signed subrav with the subchannel state\n        if (\n          signed.subRav.channelId === params.subChannelInfo.channelId &&\n          signed.subRav.vmIdFragment === params.subChannelInfo.vmIdFragment &&\n          signed.subRav.nonce > params.subChannelInfo.lastConfirmedNonce &&\n          signed.subRav.accumulatedAmount >= params.subChannelInfo.lastClaimedAmount\n        ) {\n          result.decision = 'ALLOW';\n        } else {\n          result.decision = 'CONFLICT';\n          result.error = {\n            code: PaymentErrorCode.RAV_CONFLICT,\n            message: `SignedSubRAV does not match subchannel state (expected nonce: ${params.subChannelInfo.lastConfirmedNonce}, accumulatedAmount: ${params.subChannelInfo.lastClaimedAmount}, received: ${signed.subRav.nonce}, ${signed.subRav.accumulatedAmount})`,\n          } as any;\n          return finalize();\n        }\n      }\n    }\n  }\n\n  return finalize();\n\n  function finalize(): RavVerifyResult {\n    // Leave detailed logging to caller using DebugLogger\n    return result;\n  }\n}\n\n/**\n * Assert monotonic progression between previous and next SubRAV deltas.\n * - next.nonce must equal prev.nonce + 1\n * - next.accumulatedAmount must be > prev.accumulatedAmount\n *   (set allowSameAccumulated=true to allow equality in special cases)\n */\nexport function assertRavProgression(\n  prevNonce: bigint,\n  prevAccumulatedAmount: bigint,\n  nextNonce: bigint,\n  nextAccumulatedAmount: bigint,\n  allowSameAccumulated: boolean = false\n): void {\n  const expectedNonce = prevNonce + 1n;\n  if (nextNonce !== expectedNonce) {\n    throw new Error(`Invalid nonce: expected ${expectedNonce}, got ${nextNonce}`);\n  }\n\n  if (allowSameAccumulated) {\n    if (nextAccumulatedAmount < prevAccumulatedAmount) {\n      throw new Error(\n        `Amount must not decrease: previous ${prevAccumulatedAmount}, new ${nextAccumulatedAmount}`\n      );\n    }\n  } else {\n    if (nextAccumulatedAmount <= prevAccumulatedAmount) {\n      throw new Error(\n        `Amount must increase: previous ${prevAccumulatedAmount}, new ${nextAccumulatedAmount}`\n      );\n    }\n  }\n}\n\n/**\n * Convenience helper to assert progression using SubRAV objects.\n */\nexport function assertSubRavProgression(\n  prev: Pick<SubRAV, 'nonce' | 'accumulatedAmount'>,\n  next: Pick<SubRAV, 'nonce' | 'accumulatedAmount'>,\n  allowSameAccumulated: boolean = false\n): void {\n  assertRavProgression(\n    prev.nonce,\n    prev.accumulatedAmount,\n    next.nonce,\n    next.accumulatedAmount,\n    allowSameAccumulated\n  );\n}\n","import type { SignedSubRAV, SubChannelInfo, SubRAV } from './types';\nimport { PaymentChannelPayeeClient } from '../client/PaymentChannelPayeeClient';\nimport type { VerificationResult } from '../client/PaymentChannelPayeeClient';\nimport type { BillingContext } from '../billing';\nimport { Errors, type PaymentError } from '../errors/codes';\nimport { getStrategy } from '../billing/core/strategy-registry';\nimport { convertUsdToAssetUsingPrice } from '../billing/core/converter';\nimport type { RateProvider, RateResult } from '../billing/rate/types';\n// Ensure built-in strategies are registered explicitly (no side-effect import)\nimport { registerBuiltinStrategies } from '../billing/strategies';\nimport type { PendingSubRAVRepository } from '../storage/interfaces/PendingSubRAVRepository';\nimport type { RAVRepository } from '../storage/interfaces/RAVRepository';\nimport { createPendingSubRAVRepo } from '../storage/factories/createPendingSubRAVRepo';\nimport { HttpPaymentCodec } from '../middlewares/http/HttpPaymentCodec';\nimport { PaymentUtils } from './PaymentUtils';\nimport { deriveChannelId } from '../rooch/ChannelUtils';\nimport { verify as verifyRav } from './RavVerifier';\nimport type { DIDResolver } from '@nuwa-ai/identity-kit';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport type { HubBalanceService } from './HubBalanceService';\nimport type { ClaimTriggerService } from './ClaimTriggerService';\n\n/**\n * Configuration for PaymentProcessor\n */\nexport interface PaymentProcessorConfig {\n  /** Payee client for payment operations */\n  payeeClient: PaymentChannelPayeeClient;\n\n  /** Service ID for billing configuration */\n  serviceId: string;\n\n  /** Rate provider for asset conversion */\n  rateProvider: RateProvider;\n\n  /** DID resolver used for signature verification (avoid accessing payeeClient internals) */\n  didResolver: DIDResolver;\n\n  /** Store for pending unsigned SubRAV proposals */\n  pendingSubRAVStore: PendingSubRAVRepository;\n  /** Repository for persisted SignedSubRAVs to retrieve latest baseline */\n  ravRepository: RAVRepository;\n\n  /** Default asset ID if not provided in request context */\n  defaultAssetId?: string;\n\n  /** Hub balance service for payer balance checks */\n  hubBalanceService: HubBalanceService;\n\n  /** Claim trigger service for reactive claims (optional) */\n  claimTriggerService?: ClaimTriggerService;\n\n  /** Minimum claim amount threshold */\n  minClaimAmount: bigint;\n\n  /** Debug logging */\n  debug?: boolean;\n}\n\n/**\n * Enhanced verification result with payer key ID\n */\nexport interface PaymentVerificationResult extends VerificationResult {\n  payerKeyId?: string;\n}\n\n/**\n * Payment processing statistics\n */\nexport interface PaymentProcessingStats {\n  totalRequests: number;\n  successfulPayments: number;\n  failedPayments: number;\n  autoClaimsTriggered: number;\n}\n\n// Strongly typed non-null state after preProcess\ntype PaymentState = NonNullable<BillingContext['state']>;\ntype PreprocessedBillingContext = BillingContext & { state: PaymentState };\n\n// Use centralized error factories from errors/codes\n\n/**\n * PaymentProcessor - Protocol-agnostic payment negotiation component\n *\n * This component handles the core payment logic that can be reused across\n * different protocols (HTTP, MCP, A2A, etc.) by abstracting away protocol-specific\n * details and focusing on the deferred payment model implementation.\n */\nexport class PaymentProcessor {\n  private config: PaymentProcessorConfig;\n  private pendingSubRAVStore: PendingSubRAVRepository;\n  private ravRepository: RAVRepository;\n  private stats: PaymentProcessingStats;\n  private logger: DebugLogger;\n\n  constructor(config: PaymentProcessorConfig) {\n    this.config = config;\n    // Register built-in billing strategies explicitly\n    try {\n      registerBuiltinStrategies();\n    } catch {}\n    this.pendingSubRAVStore = config.pendingSubRAVStore;\n    this.ravRepository = config.ravRepository;\n    this.stats = {\n      totalRequests: 0,\n      successfulPayments: 0,\n      failedPayments: 0,\n      autoClaimsTriggered: 0,\n    };\n\n    this.logger = DebugLogger.get('PaymentProcessor');\n    this.logger.setLevel(config.debug ? 'debug' : 'info');\n  }\n\n  getServiceId(): string {\n    return this.config.serviceId;\n  }\n\n  /**\n   * Step A: Pre-process request - complete all I/O operations and verification\n   * Returns context with state populated for both pre-flight and post-flight\n   */\n  async preProcess(ctx: BillingContext): Promise<PreprocessedBillingContext> {\n    this.stats.totalRequests++;\n\n    this.log('Pre-processing payment for operation:', ctx.meta.operation);\n\n    const pctx = this.asPreprocessed(ctx);\n\n    try {\n      const rule = pctx.meta.billingRule;\n      // For free routes without a SignedSubRAV, skip verification entirely in preProcess\n      if (rule && rule.paymentRequired === false && !pctx.meta.signedSubRav) {\n        this.log('Free route without SignedSubRAV - skipping preProcess verification');\n        return pctx;\n      }\n      // Step 0: Prefetch channel context (channelInfo, baseline, chainId)\n      // Determine channelId and vmIdFragment (must exist)\n      let channelId: string | undefined;\n      let vmIdFragment: string | undefined;\n\n      if (ctx.meta.signedSubRav) {\n        channelId = ctx.meta.signedSubRav.subRav.channelId;\n        vmIdFragment = ctx.meta.signedSubRav.subRav.vmIdFragment;\n      } else {\n        const didAuth = await this.tryDIDAuthFallback(ctx);\n        this.log('DIDAuth fallback result:', didAuth);\n        if (didAuth) {\n          channelId = didAuth.channelId;\n          vmIdFragment = didAuth.vmIdFragment;\n        }\n      }\n\n      if (!channelId || !vmIdFragment) {\n        return this.fail(pctx, Errors.channelContextMissing(), { attachHeader: false });\n      }\n\n      // Fetch channelInfo (must exist)\n      const channelInfo = await this.config.payeeClient.getChannelInfo(channelId);\n      if (!channelInfo) {\n        return this.fail(pctx, Errors.channelNotFound(channelId), { attachHeader: false });\n      }\n\n      const subChannelInfo = await this.config.payeeClient.getSubChannelState(\n        channelId,\n        vmIdFragment\n      );\n      if (!subChannelInfo) {\n        return this.fail(pctx, Errors.subchannelNotAuthorized(channelId, vmIdFragment), {\n          attachHeader: false,\n        });\n      }\n\n      // Latest signed RAV from repository\n      const latestSignedSubRav = await this.ravRepository.getLatest(channelId, vmIdFragment);\n\n      // Fetch and cache chainId for proposal generation\n      pctx.state.chainId = await this.config.payeeClient.getContract().getChainId();\n\n      const payerDidDoc = await this.config.didResolver.resolveDID(channelInfo.payerDid);\n      if (!payerDidDoc) {\n        return this.fail(pctx, Errors.didResolveFailed(channelInfo.payerDid), {\n          attachHeader: false,\n        });\n      }\n      // Latest pending SubRAV from pending repository\n      const latestPendingSubRav = await this.pendingSubRAVStore.findLatestBySubChannel(\n        channelId,\n        vmIdFragment\n      );\n\n      // Single-entry verification using prefetched context\n      const ravResult = await verifyRav({\n        channelInfo,\n        subChannelInfo,\n        billingRule: ctx.meta.billingRule!,\n        payerDidDoc,\n        signedSubRav: ctx.meta.signedSubRav,\n        latestSignedSubRav: latestSignedSubRav || undefined,\n        latestPendingSubRav: latestPendingSubRav || undefined,\n        debug: this.config.debug,\n      });\n\n      pctx.state.channelInfo = channelInfo;\n      pctx.state.subChannelInfo = subChannelInfo;\n      pctx.state.latestSignedSubRav = latestSignedSubRav || undefined;\n      pctx.state.latestPendingSubRav = latestPendingSubRav || undefined;\n\n      try {\n        const hubBalance = await this.config.hubBalanceService.getBalance(\n          channelInfo.payerDid,\n          channelInfo.assetId\n        );\n\n        // Compute outstanding withdrawable delta based on latest signed vs last claimed\n        const latestAccumulatedForDelta =\n          (latestSignedSubRav?.subRav?.accumulatedAmount as bigint | undefined) ??\n          subChannelInfo.lastClaimedAmount;\n        const lastClaimedAmount = subChannelInfo.lastClaimedAmount;\n        const deltaOutstanding =\n          latestAccumulatedForDelta > lastClaimedAmount\n            ? latestAccumulatedForDelta - lastClaimedAmount\n            : 0n;\n\n        this.log('Hub balance check (cached)', {\n          payerDid: channelInfo.payerDid,\n          assetId: channelInfo.assetId,\n          cachedBalance: hubBalance.toString(),\n          minClaimAmount: this.config.minClaimAmount.toString(),\n          deltaOutstanding: deltaOutstanding.toString(),\n          sufficient: hubBalance >= this.config.minClaimAmount && hubBalance >= deltaOutstanding,\n          source: 'HubBalanceService_cache',\n        });\n\n        // If withdrawable delta already crosses threshold but hub balance is insufficient, block with 402\n        if (deltaOutstanding >= this.config.minClaimAmount && hubBalance < deltaOutstanding) {\n          this.log('❌ Hub balance insufficient for outstanding delta - rejecting request', {\n            payerDid: channelInfo.payerDid,\n            assetId: channelInfo.assetId,\n            cachedBalance: hubBalance.toString(),\n            deltaOutstanding: deltaOutstanding.toString(),\n          });\n\n          return this.fail(\n            pctx,\n            Errors.hubInsufficientFunds(hubBalance, deltaOutstanding, channelInfo.assetId),\n            { attachHeader: true }\n          );\n        }\n\n        if (hubBalance < this.config.minClaimAmount) {\n          this.log('❌ Hub balance insufficient - rejecting request', {\n            payerDid: channelInfo.payerDid,\n            assetId: channelInfo.assetId,\n            cachedBalance: hubBalance.toString(),\n            minClaimAmount: this.config.minClaimAmount.toString(),\n            deficit: (this.config.minClaimAmount - hubBalance).toString(),\n          });\n\n          return this.fail(\n            pctx,\n            Errors.hubInsufficientFunds(\n              hubBalance,\n              this.config.minClaimAmount,\n              channelInfo.assetId\n            ),\n            { attachHeader: true }\n          );\n        }\n      } catch (error) {\n        this.log('⚠️ Hub balance check failed - proceeding anyway', {\n          payerDid: channelInfo.payerDid,\n          assetId: channelInfo.assetId,\n          error: error instanceof Error ? error.message : String(error),\n          source: 'HubBalanceService_cache',\n        });\n        // Don't fail the request on balance fetch errors - let it proceed\n        // The claim will fail later if balance is actually insufficient\n      }\n\n      // Handle early-return decisions\n      if (ravResult.decision === 'REQUIRE_SIGNATURE_402' || ravResult.decision === 'CONFLICT') {\n        this.log(\n          '⚠️ Early return from preProcess due to decision:',\n          ravResult.decision,\n          ravResult.error\n        );\n        // Do NOT generate new proposal here; just return error\n        // If we have latestPendingSubRav, attach it to payload for client to sign\n        if (pctx.state.latestPendingSubRav) {\n          try {\n            const decoded = {\n              version: 1,\n              clientTxRef: pctx.meta.clientTxRef,\n              serviceTxRef: pctx.state.serviceTxRef,\n              subRav: pctx.state.latestPendingSubRav,\n              error: ravResult.error,\n            };\n            // Store structured payload for later rendering (HTTP header or MCP JSON)\n            pctx.state.responsePayload = decoded;\n            this.log('✅ Attached pending SubRAV to PAYMENT_REQUIRED response:', {\n              channelId: pctx.state.latestPendingSubRav.channelId,\n              nonce: pctx.state.latestPendingSubRav.nonce.toString(),\n              accumulatedAmount: pctx.state.latestPendingSubRav.accumulatedAmount.toString(),\n              clientTxRef: pctx.meta.clientTxRef,\n            });\n          } catch (e) {\n            this.logger.error('⚠️ Failed to attach pending SubRAV to error payload:', e);\n            // Ensure we still set a responsePayload even if there's an error\n            pctx.state.responsePayload = {\n              version: 1,\n              clientTxRef: pctx.meta.clientTxRef,\n              serviceTxRef: pctx.state.serviceTxRef,\n              error: ravResult.error,\n            };\n          }\n        } else {\n          // No pending available: still expose an error payload without subRav\n          pctx.state.responsePayload = {\n            version: 1,\n            clientTxRef: pctx.meta.clientTxRef,\n            serviceTxRef: pctx.state.serviceTxRef,\n            error: ravResult.error,\n          };\n          // this should not happen, because if the pending SubRAV is not available,\n          // the rav verifier result should not be REQUIRE_SIGNATURE_402 or CONFLICT\n          this.logger.error('⚠️ No pending SubRAV available for PAYMENT_REQUIRED response:', {\n            channelId: pctx.meta.channelId,\n            vmIdFragment: pctx.meta.vmIdFragment,\n            clientTxRef: pctx.meta.clientTxRef,\n            decision: ravResult.decision,\n          });\n        }\n        // Avoid auto-attaching a separate error header here to prevent overwriting payload-based header later\n        return this.fail(\n          pctx,\n          {\n            code: (ravResult.error?.code as PaymentError['code']) ?? 'INTERNAL_SERVER_ERROR',\n            message: ravResult.error?.message ?? 'Verification decision error',\n          },\n          { attachHeader: false }\n        );\n      }\n\n      // Persist verification flags and apply side-effects on success\n      pctx.state.signedSubRavVerified = ravResult.signedVerified;\n      if (ravResult.signedVerified && pctx.meta.signedSubRav) {\n        this.log('🗑️ Removing matched pending SubRAV and persisting verified SignedSubRAV:', {\n          channelId: pctx.meta.signedSubRav.subRav.channelId,\n          vmIdFragment: pctx.meta.signedSubRav.subRav.vmIdFragment,\n          nonce: pctx.meta.signedSubRav.subRav.nonce.toString(),\n        });\n        if (ravResult.pendingMatched) {\n          try {\n            await this.pendingSubRAVStore.remove(\n              pctx.meta.signedSubRav.subRav.channelId,\n              pctx.meta.signedSubRav.subRav.vmIdFragment,\n              pctx.meta.signedSubRav.subRav.nonce\n            );\n          } catch (e) {\n            this.log('⚠️ Failed to remove matched pending:', e);\n          }\n        }\n        try {\n          await this.ravRepository.save(pctx.meta.signedSubRav);\n        } catch (e) {\n          this.log('⚠️ Failed to persist verified SignedSubRAV:', e);\n        }\n      }\n\n      const assetId = channelInfo.assetId;\n      // Step 3: Prefetch exchange rate only (no cost calculation here)\n      {\n        try {\n          const price = await this.config.rateProvider.getPricePicoUSD(assetId);\n          const timestamp = this.config.rateProvider.getLastUpdated(assetId) ?? Date.now();\n          const exchangeRate: RateResult = {\n            price,\n            timestamp,\n            provider: 'rate-provider',\n            assetId,\n          };\n          pctx.state.exchangeRate = exchangeRate;\n        } catch (e) {\n          pctx.state.error = Errors.rateFetchFailed(e);\n        }\n      }\n\n      this.log('✅ Pre-processing completed');\n      return pctx;\n    } catch (error) {\n      this.log('🚨 Pre-processing error:', error);\n      pctx.state.signedSubRavVerified = false;\n      return this.fail(pctx, Errors.internal(String(error)), {\n        attachHeader: false,\n      });\n    }\n  }\n\n  getPendingSubRAVRepository(): PendingSubRAVRepository {\n    return this.pendingSubRAVStore;\n  }\n\n  /**\n   * Step B & C: Settle billing - lightweight synchronous operations only\n   * For Pre-flight: essentially no-op (already completed in preProcess)\n   * For Post-flight: calculate cost based on usage and generate header\n   */\n  // Overloads to allow external call sites to pass BillingContext while we enforce state internally\n  settle(ctx: PreprocessedBillingContext, units?: number): PreprocessedBillingContext;\n  settle(ctx: BillingContext, units?: number): BillingContext;\n  settle(\n    ctx: BillingContext | PreprocessedBillingContext,\n    units?: number\n  ): BillingContext | PreprocessedBillingContext {\n    this.log('🔄 Settling billing with units:', units);\n\n    const pctx = this.asPreprocessed(ctx as BillingContext);\n\n    // Settling uses numeric units; no structured usage is attached to state\n\n    try {\n      const rule = pctx.meta.billingRule;\n\n      // If a protocol-level error was set during preProcess or earlier, generate error header now\n      if (pctx.state.error) {\n        return this.fail(pctx, pctx.state.error);\n      }\n\n      // Unified synchronous calculation for both pre-flight and post-flight\n      if (rule) {\n        this.log(\n          '📊 Processing billing rule:',\n          rule.id,\n          'paymentRequired:',\n          rule.paymentRequired,\n          'units:',\n          units\n        );\n        const usageUnits =\n          Number.isFinite(units) && (units as number) >= 0 ? Math.floor(units as number) : 0;\n\n        const strategy = getStrategy(rule);\n        const usdCost = strategy.evaluate(pctx, usageUnits);\n\n        // Convert to asset units only when needed\n        let finalCost = usdCost;\n        // Free routes: don't require channel context or exchange rate\n        if (rule.paymentRequired !== false) {\n          if (usdCost > 0n) {\n            const assetId = pctx.state?.channelInfo?.assetId;\n            if (!assetId) {\n              throw new Error('CHANNEL_INFO_MISSING: assetId not derivable. Check channelInfo.');\n            }\n            const rate = pctx.state.exchangeRate;\n            if (!rate) {\n              return this.fail(pctx, Errors.rateNotAvailable(String(assetId)));\n            }\n            const conversion = convertUsdToAssetUsingPrice(usdCost, rate);\n            finalCost = conversion.assetCost;\n          } else {\n            // Zero-cost paid route still generates SubRAV; cost stays 0\n            finalCost = 0n;\n          }\n        } else {\n          // Free route: ensure cost is zero regardless of USD price\n          finalCost = 0n;\n        }\n\n        pctx.state.cost = finalCost;\n\n        // Check maxAmount limit\n        if (pctx.meta.maxAmount && pctx.meta.maxAmount > 0n && finalCost > pctx.meta.maxAmount) {\n          this.log(`Cost ${finalCost} exceeds maxAmount ${pctx.meta.maxAmount}`);\n          return this.fail(pctx, Errors.maxAmountExceeded(finalCost, pctx.meta.maxAmount));\n        }\n\n        // Special handling for free routes (§4.3 of rav-handling.md)\n        if (rule.paymentRequired === false) {\n          // Free route: if client sent SignedSubRAV, verify but don't generate unsigned\n          if (pctx.meta.signedSubRav && finalCost === 0n) {\n            this.log(\n              '📝 Free route with SignedSubRAV - verified but not generating unsigned SubRAV'\n            );\n            // Set minimal response state for free routes\n            pctx.state.cost = finalCost;\n            // Don't generate unsignedSubRav or headerValue for free routes\n          } else if (pctx.meta.signedSubRav && finalCost > 0n) {\n            // This shouldn't happen - free routes should have cost=0\n            throw new Error('FREE_ROUTE_WITH_COST: free routes should have cost=0');\n          } else {\n            // Free route without SignedSubRAV - normal free processing\n            this.log('📝 Free route without SignedSubRAV - no payment processing needed');\n            pctx.state.cost = finalCost;\n          }\n        } else {\n          // Paid route: always generate SubRAV (even if cost=0 per §4.2)\n          // Require a baseline: SignedSubRAV, latestSignedSubRav, or subChannelInfo\n          const hasSigned = !!pctx.meta.signedSubRav;\n          const hasLatest = !!pctx.state && !!pctx.state.latestSignedSubRav;\n          const hasSubState = !!pctx.state && !!(pctx.state as any).subChannelInfo;\n\n          this.log('🔍 Baseline check:', {\n            hasSigned,\n            hasLatest,\n            hasSubState,\n            hasState: !!pctx.state,\n            stateKeys: pctx.state ? Object.keys(pctx.state) : [],\n          });\n\n          if (!hasSigned && !hasLatest && !hasSubState) {\n            return this.fail(pctx, Errors.channelContextMissing());\n          }\n\n          this.log('🔧 Generating SubRAV with finalCost:', finalCost);\n          const { unsignedSubRAV, serviceTxRef } = this.generateNextSubRAV({\n            signedSubRAV: pctx.meta.signedSubRav,\n            latestSignedSubRav: pctx.state?.latestSignedSubRav,\n            subChannelInfo: pctx.state?.subChannelInfo!,\n            chainId: pctx.state?.chainId!,\n            clientTxRef: pctx.meta.clientTxRef,\n            cost: finalCost,\n            costUsd: usdCost,\n          });\n          this.log('🔧 Generated SubRAV:', {\n            nonce: unsignedSubRAV.nonce,\n            accumulatedAmount: unsignedSubRAV.accumulatedAmount,\n          });\n          pctx.state.unsignedSubRav = unsignedSubRAV;\n          pctx.state.serviceTxRef = serviceTxRef;\n          pctx.state.nonce = unsignedSubRAV.nonce;\n          // Also persist structured payload for protocol-agnostic rendering\n          pctx.state.responsePayload = {\n            subRav: unsignedSubRAV,\n            cost: finalCost,\n            costUsd: usdCost,\n            clientTxRef: pctx.meta.clientTxRef,\n            serviceTxRef,\n            version: 1,\n          };\n        }\n\n        this.log('✅ Billing settled successfully');\n      }\n\n      return pctx as typeof ctx;\n    } catch (error) {\n      this.log('🚨 Billing settlement error:', error);\n      const p = this.asPreprocessed(ctx as BillingContext);\n      p.state.cost = 0n;\n      return this.fail(p, Errors.internal(String(error)));\n    }\n  }\n\n  /**\n   * Step D: Persist billing state to storage\n   */\n  async persist(ctx: PreprocessedBillingContext): Promise<void>;\n  async persist(ctx: BillingContext): Promise<void>;\n  async persist(ctx: BillingContext | PreprocessedBillingContext): Promise<void> {\n    const pctx = this.asPreprocessed(ctx as BillingContext);\n    if (!pctx.state?.unsignedSubRav) {\n      this.log('⚠️ No unsignedSubRAV to persist');\n      return;\n    }\n\n    try {\n      this.log('💾 Persisting billing state');\n\n      const newSubRAV = pctx.state.unsignedSubRav;\n\n      // the previous pending SubRAV is removed in the preProcess step.\n      // Clean up previous pending SubRAV (nonce - 1) to prevent accumulation\n      // if (newSubRAV.nonce > 1n) {\n      //   const prevNonce = newSubRAV.nonce - 1n;\n      //   try {\n      //     await this.pendingSubRAVStore.remove(\n      //       newSubRAV.channelId,\n      //       newSubRAV.vmIdFragment,\n      //       prevNonce\n      //     );\n      //     this.log('🗑️ Removed previous pending SubRAV:', {\n      //       channelId: newSubRAV.channelId,\n      //       nonce: prevNonce.toString(),\n      //     });\n      //   } catch (error) {\n      //     this.log('⚠️ Failed to remove previous pending SubRAV:', error);\n      //     // Don't fail the entire operation for cleanup errors\n      //   }\n      // }\n\n      // Store the new unsigned SubRAV for future verification\n      await this.pendingSubRAVStore.save(newSubRAV);\n\n      // Mark as persisted\n      pctx.state.persisted = true;\n\n      // Trigger reactive claim if enabled and conditions are met\n      if (\n        this.config.claimTriggerService &&\n        this.config.minClaimAmount &&\n        pctx.state.subChannelInfo &&\n        pctx.state.latestSignedSubRav\n      ) {\n        try {\n          // Calculate delta: latest signed accumulated amount - last claimed amount\n          const latestAccumulated = pctx.state.latestSignedSubRav.subRav.accumulatedAmount;\n          const lastClaimed = pctx.state.subChannelInfo.lastClaimedAmount;\n          const delta = latestAccumulated > lastClaimed ? latestAccumulated - lastClaimed : 0n;\n\n          this.log('Reactive claim evaluation', {\n            channelId: newSubRAV.channelId,\n            vmIdFragment: newSubRAV.vmIdFragment,\n            latestAccumulated: latestAccumulated.toString(),\n            lastClaimed: lastClaimed.toString(),\n            delta: delta.toString(),\n            minClaimAmount: this.config.minClaimAmount.toString(),\n          });\n\n          if (delta >= this.config.minClaimAmount) {\n            await this.config.claimTriggerService.maybeQueue(\n              newSubRAV.channelId,\n              newSubRAV.vmIdFragment,\n              delta\n            );\n            this.log('Reactive claim queued', {\n              channelId: newSubRAV.channelId,\n              vmIdFragment: newSubRAV.vmIdFragment,\n              delta: delta.toString(),\n            });\n          }\n        } catch (error) {\n          this.log('⚠️ Reactive claim trigger failed', { error });\n          // Don't fail the persist operation for claim trigger errors\n        }\n      }\n\n      this.log('✅ Billing state persisted successfully');\n    } catch (error) {\n      this.log('🚨 Persistence error:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Clear expired pending SubRAV proposals\n   */\n  async clearExpiredProposals(maxAgeMinutes: number = 30): Promise<number> {\n    const maxAge = maxAgeMinutes * 60 * 1000; // Convert to milliseconds\n    const clearedCount = await this.pendingSubRAVStore.cleanup(maxAge);\n\n    this.log(\n      `Cleared ${clearedCount} expired pending SubRAV proposals (older than ${maxAgeMinutes} minutes)`\n    );\n    return clearedCount;\n  }\n\n  /**\n   * Get payment processing statistics\n   */\n  getProcessingStats(): PaymentProcessingStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Find pending SubRAV proposal by channel and nonce\n   */\n  async findPendingProposal(\n    channelId: string,\n    vmIdFragment: string,\n    nonce: bigint\n  ): Promise<SubRAV | null> {\n    return await this.pendingSubRAVStore.find(channelId, vmIdFragment, nonce);\n  }\n\n  /**\n   * Find the latest pending SubRAV proposal for a channel (for recovery scenarios)\n   */\n  async findLatestPendingProposal(channelId: string, vmIdFragment: string): Promise<SubRAV | null> {\n    return await this.pendingSubRAVStore.findLatestBySubChannel(channelId, vmIdFragment);\n  }\n\n  /**\n   * Generate SubRAV and header synchronously for post-flight billing\n   */\n  private generateNextSubRAV(params: {\n    signedSubRAV?: SignedSubRAV;\n    latestSignedSubRav?: SignedSubRAV;\n    subChannelInfo: SubChannelInfo;\n    chainId: bigint;\n    clientTxRef: string;\n    cost: bigint;\n    costUsd: bigint;\n  }): {\n    unsignedSubRAV: SubRAV;\n    serviceTxRef: string;\n  } {\n    const serviceTxRef = `srv-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n    const current = params.signedSubRAV?.subRav ??\n      params.latestSignedSubRav?.subRav ?? {\n        channelId: params.subChannelInfo.channelId,\n        vmIdFragment: params.subChannelInfo.vmIdFragment,\n        nonce: params.subChannelInfo.lastConfirmedNonce,\n        accumulatedAmount: params.subChannelInfo.lastClaimedAmount,\n        chainId: params.chainId,\n        channelEpoch: params.subChannelInfo.epoch,\n        version: 1,\n      };\n\n    const next = this.buildNextUnsigned(current, params.cost);\n\n    // Generate header using HttpPaymentCodec (new payload shape)\n    const responsePayload = {\n      subRav: next,\n      cost: params.cost,\n      costUsd: params.costUsd,\n      clientTxRef: params.clientTxRef,\n      serviceTxRef,\n      version: 1,\n    } as any;\n\n    // Header construction moved to adapters (HTTP/MCP). Core returns payload parts only.\n    return { unsignedSubRAV: next, serviceTxRef };\n  }\n\n  /**\n   * Build next unsigned SubRAV following the prior signed SubRAV, reused by async/sync paths.\n   */\n  private buildNextUnsigned(current: SubRAV, cost: bigint): SubRAV {\n    const channelId = current.channelId;\n    const vmIdFragment = current.vmIdFragment;\n    const currentNonce = current.nonce;\n    const nextNonce = currentNonce + 1n;\n    const newAccumulatedAmount = current.accumulatedAmount + cost;\n\n    return {\n      version: 1,\n      chainId: current.chainId,\n      channelId,\n      channelEpoch: current.channelEpoch,\n      vmIdFragment,\n      nonce: nextNonce,\n      accumulatedAmount: newAccumulatedAmount,\n    };\n  }\n\n  /**\n   * Try to locate sub-channel using DIDAuth fallback (§4.4 of rav-handling.md)\n   */\n  private async tryDIDAuthFallback(\n    ctx: BillingContext\n  ): Promise<{ channelId: string; vmIdFragment: string } | null> {\n    try {\n      const didInfo = ctx.meta.didInfo;\n      if (!didInfo || !didInfo.did || !didInfo.keyId) {\n        this.log('No DIDAuth info available for fallback');\n        return null;\n      }\n\n      // Extract vmIdFragment from keyId (format: \"did:example:123#key-1\")\n      const keyIdParts = didInfo.keyId.split('#');\n      if (keyIdParts.length < 2) {\n        this.log('Invalid keyId format for DIDAuth fallback:', didInfo.keyId);\n        return null;\n      }\n      const vmIdFragment = keyIdParts[1];\n\n      // Get payee DID from the payee client\n      const payeeDid = await this.config.payeeClient.getPayeeDid();\n      const defaultAssetId = this.config.defaultAssetId || '0x3::gas_coin::RGas';\n\n      // Use actual cryptographic derivation matching Move contract logic\n      const channelId = deriveChannelId(didInfo.did, payeeDid, defaultAssetId);\n\n      this.log('DIDAuth fallback derived:', {\n        channelId,\n        vmIdFragment,\n        payerDid: didInfo.did,\n        payeeDid,\n      });\n      return { channelId, vmIdFragment };\n    } catch (error) {\n      this.log('Error in DIDAuth fallback:', error);\n      return null;\n    }\n  }\n\n  // ---------- Internal helpers ----------\n\n  private asPreprocessed(ctx: BillingContext): PreprocessedBillingContext {\n    if (!ctx.state) {\n      ctx.state = {};\n    }\n    return ctx as PreprocessedBillingContext;\n  }\n\n  private attachErrorHeader(ctx: PreprocessedBillingContext, error: PaymentError): void {\n    try {\n      if (!ctx.state.serviceTxRef) {\n        ctx.state.serviceTxRef = `srv-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n      }\n      // Prefer responsePayload, let adapters render headers at the edge\n      if (!ctx.state.responsePayload) {\n        ctx.state.responsePayload = {\n          error,\n          clientTxRef: ctx.meta.clientTxRef,\n          serviceTxRef: ctx.state.serviceTxRef,\n          version: 1,\n        } as any;\n      }\n    } catch (e) {\n      this.log('Failed to build error header:', e);\n    }\n  }\n\n  private fail(\n    ctx: PreprocessedBillingContext,\n    error: PaymentError,\n    options?: { attachHeader?: boolean }\n  ): PreprocessedBillingContext {\n    ctx.state.error = error;\n    if (options?.attachHeader !== false) {\n      this.attachErrorHeader(ctx, error);\n    }\n    return ctx;\n  }\n\n  /**\n   * Debug logging\n   */\n  private log(...args: any[]): void {\n    this.logger.debug(...args);\n  }\n\n  /**\n   * Destroy background services and release resources.\n   * - Stops ClaimTriggerService processing loop\n   * - Clears HubBalanceService cache\n   */\n  destroy(): void {\n    try {\n      this.config?.claimTriggerService?.destroy?.();\n    } catch {}\n    try {\n      (this.config.hubBalanceService as unknown as { clear?: () => void })?.clear?.();\n    } catch {}\n    try {\n      this.logger.info('PaymentProcessor destroyed');\n    } catch {}\n  }\n}\n","import { BaseRateProvider, RateProviderError, RateNotFoundError } from './types';\nimport { AssetInfo } from '../../core/types';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport type { IPaymentChannelContract } from '../../contracts/IPaymentChannelContract';\n\n/**\n * Contract-based rate provider that uses on-chain oracle/swap prices\n *\n * This provider leverages the payment channel contract's getAssetPrice() method\n * to fetch real-time prices from on-chain sources like oracles or DEX pools.\n */\nexport class ContractRateProvider extends BaseRateProvider {\n  private contract: IPaymentChannelContract;\n  private logger: DebugLogger;\n\n  constructor(\n    contract: IPaymentChannelContract,\n    cacheTimeoutMs = 30000 // 30 seconds default for on-chain data\n  ) {\n    super(cacheTimeoutMs);\n    this.contract = contract;\n    this.logger = DebugLogger.get('ContractRateProvider');\n  }\n\n  async getPricePicoUSD(assetId: string): Promise<bigint> {\n    // Check cache first\n    const cached = this.getCachedPrice(assetId);\n    if (cached !== null) {\n      return cached;\n    }\n\n    try {\n      // Get price from contract (already in picoUSD)\n      const pricePicoUsd = await this.contract.getAssetPrice(assetId);\n\n      if (pricePicoUsd <= 0n) {\n        throw new RateNotFoundError(\n          `Contract returned invalid price for ${assetId}: ${pricePicoUsd}`,\n          assetId\n        );\n      }\n\n      // Get asset info for caching\n      let assetInfo: AssetInfo | undefined;\n      try {\n        assetInfo = await this.contract.getAssetInfo(assetId);\n      } catch (error) {\n        this.logger.warn(`Failed to get asset info for ${assetId}, using price only:`, error);\n      }\n\n      // Cache the result\n      this.updateCache(assetId, pricePicoUsd, assetInfo);\n\n      return pricePicoUsd;\n    } catch (error) {\n      // Try to return stale cache as fallback\n      const staleCache = this.cache.get(assetId);\n      if (staleCache) {\n        this.logger.warn(`Using stale contract price cache for ${assetId} due to error:`, error);\n        return staleCache.price;\n      }\n\n      if (error instanceof RateProviderError) {\n        throw error;\n      }\n      throw new RateProviderError(`Failed to get contract price for ${assetId}: ${error}`, assetId);\n    }\n  }\n\n  async getAssetInfo(assetId: string): Promise<AssetInfo | null> {\n    // Check cache first\n    const cached = this.cache.get(assetId);\n    if (cached?.assetInfo) {\n      return cached.assetInfo;\n    }\n\n    try {\n      // Get asset info from contract\n      const info = await this.contract.getAssetInfo(assetId);\n\n      // Cache the result\n      this.updateCache(assetId, cached?.price || 0n, info);\n      return info;\n    } catch (error) {\n      this.logger.warn(`Failed to get asset info for ${assetId}:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Force refresh price from contract (bypass cache)\n   */\n  async refreshPrice(assetId: string): Promise<bigint> {\n    this.clearCache(assetId);\n    return this.getPricePicoUSD(assetId);\n  }\n\n  /**\n   * Get current chain ID from contract\n   */\n  async getChainId(): Promise<bigint> {\n    return this.contract.getChainId();\n  }\n}\n","/**\n * PaymentHub Client\n *\n * This client provides a unified interface for payment hub operations,\n * focusing solely on deposit, withdraw, and balance management.\n * It's designed to be created from PaymentChannelPayerClient or PaymentChannelPayeeClient\n * to reuse the same contract instance and signer.\n */\n\nimport type { SignerInterface } from '@nuwa-ai/identity-kit';\nimport type {\n  IPaymentChannelContract,\n  DepositParams,\n  WithdrawParams,\n} from '../contracts/IPaymentChannelContract';\nimport type { TransferToHubParams } from '../contracts/IPaymentChannelContract';\nimport type { RateProvider } from '../billing/rate/types';\nimport { ContractRateProvider } from '../billing/rate/contract';\n\nexport interface PaymentHubClientOptions {\n  contract: IPaymentChannelContract;\n  signer: SignerInterface;\n  defaultAssetId: string;\n  rateProvider?: RateProvider;\n}\n\nexport interface BalanceOptions {\n  ownerDid?: string;\n  assetId?: string;\n}\n\nexport interface HasBalanceOptions extends BalanceOptions {\n  requiredAmount?: bigint;\n}\n\n/**\n * Chain-agnostic Payment Hub Client\n *\n * Provides high-level APIs for payment hub operations:\n * - Depositing funds to hub\n * - Withdrawing funds from hub\n * - Querying hub balances\n *\n * This client operates independently of specific channels or VM keys,\n * focusing purely on the DID-level hub management.\n */\nexport class PaymentHubClient {\n  private contract: IPaymentChannelContract;\n  private signer: SignerInterface;\n  private defaultAssetId: string;\n  private rateProvider: RateProvider;\n\n  constructor(options: PaymentHubClientOptions) {\n    this.contract = options.contract;\n    this.signer = options.signer;\n    this.defaultAssetId = options.defaultAssetId;\n    this.rateProvider = options.rateProvider || new ContractRateProvider(this.contract);\n  }\n\n  // -------- Hub Operations --------\n\n  /**\n   * Deposit funds to the payment hub for the current signer\n   */\n  async deposit(assetId: string, amount: bigint, ownerDid?: string): Promise<{ txHash: string }> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n    const params: DepositParams = {\n      ownerDid,\n      assetId,\n      amount,\n      signer: this.signer,\n    };\n\n    const result = await this.contract.depositToHub(params);\n    return { txHash: result.txHash };\n  }\n\n  /**\n   * Withdraw funds from the payment hub to the owner's account\n   * @param assetId Asset to withdraw\n   * @param amount Amount to withdraw (0 = withdraw all)\n   * @param recipient Optional recipient address/DID (defaults to owner's account)\n   */\n  async withdraw(assetId: string, amount: bigint, recipient?: string): Promise<{ txHash: string }> {\n    const ownerDid = await this.signer.getDid();\n\n    const params: WithdrawParams = {\n      ownerDid,\n      assetId,\n      amount,\n      recipient,\n      signer: this.signer,\n    };\n\n    const result = await this.contract.withdrawFromHub(params);\n    return { txHash: result.txHash };\n  }\n\n  /**\n   * Get balance of a specific asset in the payment hub\n   */\n  async getBalance(options: BalanceOptions = {}): Promise<bigint> {\n    const ownerDid = options.ownerDid || (await this.signer.getDid());\n    const assetId = options.assetId || this.defaultAssetId;\n    return this.contract.getHubBalance(ownerDid, assetId);\n  }\n\n  /**\n   * Get balance and its value in picoUSD using a rate provider.\n   * Returns: { assetId, balance, pricePicoUSD, balancePicoUSD }\n   */\n  async getBalanceWithUsd(options: BalanceOptions = {}): Promise<{\n    assetId: string;\n    balance: bigint;\n    pricePicoUSD: bigint;\n    balancePicoUSD: bigint;\n  }> {\n    const ownerDid = options.ownerDid || (await this.signer.getDid());\n    const assetId = options.assetId || this.defaultAssetId;\n    const balance = await this.contract.getHubBalance(ownerDid, assetId);\n\n    const pricePicoUSD = await this.rateProvider.getPricePicoUSD(assetId);\n    const balancePicoUSD = balance * pricePicoUSD;\n\n    return { assetId, balance, pricePicoUSD, balancePicoUSD };\n  }\n\n  /**\n   * Get all balances in the hub for all assets\n   */\n  async getAllBalances(ownerDid?: string): Promise<Record<string, bigint>> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n    return this.contract.getAllHubBalances(ownerDid);\n  }\n\n  /**\n   * Get active channel count for an asset (defaults to client's default asset)\n   */\n  async getActiveChannelCount(assetId?: string, ownerDid?: string): Promise<number> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n    const targetAssetId = assetId || this.defaultAssetId;\n    return this.contract.getActiveChannelCount(ownerDid, targetAssetId);\n  }\n\n  /**\n   * Check if hub has sufficient balance for a payment\n   */\n  async hasBalance(options: HasBalanceOptions = {}): Promise<boolean> {\n    const { requiredAmount = BigInt(0), ...balanceOptions } = options;\n    const balance = await this.getBalance(balanceOptions);\n    return balance >= requiredAmount;\n  }\n\n  /**\n   * Transfer funds from this hub to another address's payment hub\n   * @param recipientDid DID of the recipient\n   * @param assetId Asset to transfer\n   * @param amount Amount to transfer\n   * @returns Transaction hash\n   */\n  async transfer(\n    recipientDid: string,\n    assetId: string,\n    amount: bigint\n  ): Promise<{ txHash: string }> {\n    const senderDid = await this.signer.getDid();\n\n    const params: TransferToHubParams = {\n      senderDid,\n      receiverDid: recipientDid,\n      assetId,\n      amount,\n      signer: this.signer,\n    };\n\n    const result = await this.contract.transferToHub(params);\n    return { txHash: result.txHash };\n  }\n\n  /**\n   * Get unlocked balance (available for transfer) from this hub\n   * @param options Optional balance options\n   * @returns Unlocked balance amount\n   */\n  async getUnlockedBalance(options: BalanceOptions = {}): Promise<bigint> {\n    const ownerDid = options.ownerDid || (await this.signer.getDid());\n    const assetId = options.assetId || this.defaultAssetId;\n    return this.contract.getUnlockedBalance(ownerDid, assetId);\n  }\n}\n","/**\n * PaymentRevenue Client\n *\n * This client provides a unified interface for payment revenue operations,\n * focusing on revenue management for service providers who earn through payment channels.\n * It's designed to be created from PaymentChannelPayeeClient to reuse the same contract\n * instance and signer.\n */\n\nimport type { SignerInterface } from '@nuwa-ai/identity-kit';\nimport type {\n  IPaymentRevenueContract,\n  WithdrawRevenueParams,\n  WithdrawalPreview,\n  RevenueSource,\n} from '../contracts/IPaymentRevenueContract';\nimport type { RateProvider } from '../billing/rate/types';\nimport type { AssetInfo } from '../core/types';\n\nexport interface PaymentRevenueClientOptions {\n  contract: IPaymentRevenueContract;\n  signer: SignerInterface;\n  defaultAssetId: string;\n  rateProvider?: RateProvider;\n}\n\nexport interface RevenueBalanceOptions {\n  ownerDid?: string;\n  assetId?: string;\n}\n\nexport interface RevenueBySourceOptions extends RevenueBalanceOptions {\n  sourceType: string;\n}\n\nexport interface HasRevenueOptions extends RevenueBalanceOptions {\n  requiredAmount?: bigint;\n}\n\n/**\n * Chain-agnostic Payment Revenue Client\n *\n * Provides high-level APIs for payment revenue operations:\n * - Creating revenue hubs\n * - Withdrawing revenue to owner accounts\n * - Querying revenue balances and statistics\n * - Preview withdrawal fees\n *\n * This client operates independently of specific channels,\n * focusing purely on the DID-level revenue management for service providers.\n */\nexport class PaymentRevenueClient {\n  private contract: IPaymentRevenueContract;\n  private signer: SignerInterface;\n  private defaultAssetId: string;\n  private rateProvider: RateProvider;\n\n  constructor(options: PaymentRevenueClientOptions) {\n    if (!options.contract) {\n      throw new Error('Contract is required');\n    }\n    if (!options.signer) {\n      throw new Error('Signer is required');\n    }\n    if (!options.defaultAssetId || options.defaultAssetId.trim() === '') {\n      throw new Error('Default asset ID is required');\n    }\n\n    this.contract = options.contract;\n    this.signer = options.signer;\n    this.defaultAssetId = options.defaultAssetId;\n\n    // Use provided rate provider or create a simple one\n    this.rateProvider = options.rateProvider || this.createDefaultRateProvider();\n  }\n\n  private createDefaultRateProvider(): RateProvider {\n    // Create a simple rate provider that returns a fixed price for testing\n    return {\n      getPricePicoUSD: async (assetId: string): Promise<bigint> => {\n        //TODO: Replace with actual price\n        // Return 1 RGas = 1,000,000 picoUSD\n        return BigInt(1000000);\n      },\n      getAssetInfo: async (assetId: string): Promise<AssetInfo | null> => {\n        return {\n          assetId,\n          symbol: assetId.split('::').pop() || 'UNKNOWN',\n          decimals: 8,\n        };\n      },\n      getLastUpdated: (assetId: string): number | null => {\n        return Date.now();\n      },\n      clearCache: async (): Promise<void> => {\n        // No-op for simple provider\n      },\n    };\n  }\n\n  // -------- Revenue Hub Management --------\n\n  /**\n   * Create a revenue hub for the current signer\n   */\n  async createRevenueHub(ownerDid?: string): Promise<{ txHash: string }> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n\n    const result = await this.contract.createRevenueHub(ownerDid, this.signer);\n    return { txHash: result.txHash };\n  }\n\n  /**\n   * Check if revenue hub exists for the current signer or specified owner\n   */\n  async revenueHubExists(ownerDid?: string): Promise<boolean> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n\n    return this.contract.revenueHubExists(ownerDid);\n  }\n\n  /**\n   * Ensure revenue hub exists, create if not (lazy creation)\n   */\n  async ensureRevenueHub(ownerDid?: string): Promise<void> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n\n    const exists = await this.revenueHubExists(ownerDid);\n    if (!exists) {\n      await this.createRevenueHub(ownerDid);\n    }\n  }\n\n  // -------- Revenue Operations --------\n\n  /**\n   * Withdraw revenue from hub to owner's account\n   * @param assetId Asset to withdraw\n   * @param amount Amount to withdraw (0 = withdraw all available)\n   * @param ownerDid Optional owner DID (defaults to signer's DID)\n   */\n  async withdraw(assetId: string, amount: bigint, ownerDid?: string): Promise<{ txHash: string }> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n\n    // If amount is 0, withdraw all available balance\n    if (amount === BigInt(0)) {\n      amount = await this.getRevenueBalance({ ownerDid, assetId });\n    }\n\n    const params: WithdrawRevenueParams = {\n      ownerDid,\n      assetId,\n      amount,\n      signer: this.signer,\n    };\n\n    const result = await this.contract.withdrawRevenue(params);\n    return { txHash: result.txHash };\n  }\n\n  /**\n   * Preview withdrawal fees and net amount\n   */\n  async previewWithdrawal(\n    assetId: string,\n    amount: bigint,\n    ownerDid?: string\n  ): Promise<WithdrawalPreview> {\n    if (!ownerDid) {\n      ownerDid = await this.signer.getDid();\n    }\n\n    return this.contract.previewWithdrawalFee(ownerDid, assetId, amount);\n  }\n\n  // -------- Balance Queries --------\n\n  /**\n   * Get revenue balance for a specific asset\n   */\n  async getRevenueBalance(options: RevenueBalanceOptions = {}): Promise<bigint> {\n    const ownerDid = options.ownerDid || (await this.signer.getDid());\n    const assetId = options.assetId || this.defaultAssetId;\n\n    return this.contract.getRevenueBalance(ownerDid, assetId);\n  }\n\n  /**\n   * Get revenue balance and its value in picoUSD using a rate provider.\n   * Returns: { assetId, balance, pricePicoUSD, balancePicoUSD }\n   */\n  async getRevenueBalanceWithUsd(options: RevenueBalanceOptions = {}): Promise<{\n    assetId: string;\n    balance: bigint;\n    pricePicoUSD: bigint;\n    balancePicoUSD: bigint;\n  }> {\n    const ownerDid = options.ownerDid || (await this.signer.getDid());\n    const assetId = options.assetId || this.defaultAssetId;\n    const balance = await this.contract.getRevenueBalance(ownerDid, assetId);\n\n    const pricePicoUSD = await this.rateProvider.getPricePicoUSD(assetId);\n    const balancePicoUSD = balance * pricePicoUSD;\n\n    return { assetId, balance, pricePicoUSD, balancePicoUSD };\n  }\n\n  /**\n   * Get revenue balance by source type\n   */\n  async getRevenueBySource(options: RevenueBySourceOptions): Promise<bigint> {\n    const ownerDid = options.ownerDid || (await this.signer.getDid());\n    const assetId = options.assetId || this.defaultAssetId;\n\n    return this.contract.getRevenueBySource(ownerDid, options.sourceType, assetId);\n  }\n\n  /**\n   * Check if revenue hub has sufficient balance for withdrawal\n   */\n  async hasRevenue(options: HasRevenueOptions = {}): Promise<boolean> {\n    const { requiredAmount = BigInt(0), ...balanceOptions } = options;\n    const balance = await this.getRevenueBalance(balanceOptions);\n    return balance >= requiredAmount;\n  }\n\n  // -------- Utility Methods --------\n\n  /**\n   * Create a revenue source for tracking purposes\n   */\n  createRevenueSource(sourceType: string, sourceId?: string, description?: string): RevenueSource {\n    return {\n      sourceType,\n      sourceId,\n      description: description || `Revenue from ${sourceType}`,\n    };\n  }\n}\n","/**\n * Chain-agnostic Payment Channel Payee Client\n *\n * This client provides a unified interface for payment channel operations\n * from the Payee perspective, using the IPaymentChannelContract abstraction.\n */\n\nimport type { AssetInfo, SubChannelInfo, ChannelInfo, SignedSubRAV, SubRAV } from '../core/types';\nimport type { IPaymentChannelContract, ClaimResult } from '../contracts/IPaymentChannelContract';\nimport type { SignerInterface, DIDResolver } from '@nuwa-ai/identity-kit';\nimport type { ChannelRepository, RAVRepository, PendingSubRAVRepository } from '../storage';\nimport { SubRAVUtils } from '../core/SubRav';\nimport { PaymentUtils } from '../core/PaymentUtils';\nimport { PaymentHubClient } from './PaymentHubClient';\nimport { PaymentRevenueClient } from './PaymentRevenueClient';\nimport type { IPaymentRevenueContract } from '../contracts/IPaymentRevenueContract';\n\n/**\n * Storage options for PaymentChannelPayeeClient\n */\nexport interface PayeeStorageOptions {\n  channelRepo: ChannelRepository;\n  ravRepo: RAVRepository;\n  pendingSubRAVRepo: PendingSubRAVRepository;\n}\n\nexport interface PaymentChannelPayeeClientOptions {\n  contract: IPaymentChannelContract;\n  signer: SignerInterface;\n  didResolver: DIDResolver; // Required for signature verification\n  storageOptions: PayeeStorageOptions;\n  revenueContract?: IPaymentRevenueContract; // Optional revenue contract for revenue operations\n}\n\nexport interface VerificationResult {\n  isValid: boolean;\n  error?: string;\n  details?: {\n    signatureValid: boolean;\n    channelExists: boolean;\n    epochMatches: boolean;\n    nonceProgression: boolean;\n    amountValid: boolean;\n  };\n}\n\nexport interface ClaimOptions {\n  signedSubRAV: SignedSubRAV;\n}\n\nexport interface GenerateSubRAVParams {\n  channelId: string;\n  payerKeyId: string; // Full keyId like \"did:example:payer#key1\"\n  amount: bigint;\n  description?: string; // Optional description for the charge\n}\n\nexport interface ListChannelsOptions {\n  status?: 'active' | 'closed' | 'closing';\n  offset?: number;\n  limit?: number;\n}\n\n/**\n * Chain-agnostic Payment Channel Payee Client\n *\n * Provides high-level APIs for payment channel operations from the Payee perspective:\n * - Verifying received SubRAVs\n * - Claiming payments from channels\n * - Managing channel lifecycle from payee side\n * - Monitoring channel states and balances\n *\n * This client is designed to be used by service providers who need to:\n * 1. Validate incoming payment receipts (SubRAVs)\n * 2. Submit claims to retrieve payments\n * 3. Monitor and manage payment channels\n */\nexport class PaymentChannelPayeeClient {\n  private contract: IPaymentChannelContract;\n  private signer: SignerInterface;\n  private didResolver: DIDResolver;\n  private channelRepo: ChannelRepository;\n  private ravRepo: RAVRepository;\n  private pendingSubRAVRepo: PendingSubRAVRepository;\n  private chainIdCache?: bigint;\n  private defaultAssetId: string;\n  private revenueContract?: IPaymentRevenueContract;\n\n  constructor(options: PaymentChannelPayeeClientOptions) {\n    this.contract = options.contract;\n    this.signer = options.signer;\n    this.didResolver = options.didResolver;\n    this.defaultAssetId = '0x3::gas_coin::RGas';\n    this.revenueContract = options.revenueContract;\n\n    // Initialize repositories\n    this.channelRepo = options.storageOptions.channelRepo;\n    this.ravRepo = options.storageOptions.ravRepo;\n    this.pendingSubRAVRepo = options.storageOptions.pendingSubRAVRepo;\n  }\n\n  // -------- Public accessors for internal components --------\n\n  /**\n   * Get the RAV repository used by this client\n   * This is needed for ClaimScheduler to access the same RAV data\n   */\n  getRAVRepository(): RAVRepository {\n    return this.ravRepo;\n  }\n\n  getDidResolver(): DIDResolver {\n    return this.didResolver;\n  }\n\n  /**\n   * Get the contract instance used by this client\n   * This is needed for ClaimScheduler to perform claims\n   */\n  getContract(): IPaymentChannelContract {\n    return this.contract;\n  }\n\n  /**\n   * Get the channel repository used by this client\n   */\n  getChannelRepository(): ChannelRepository {\n    return this.channelRepo;\n  }\n\n  /**\n   * Get sub-channel state by (channelId, vmIdFragment)\n   * If not found locally, try deriving from on-chain and sync into repository.\n   */\n  async getSubChannelState(\n    channelId: string,\n    vmIdFragment: string\n  ): Promise<SubChannelInfo | null> {\n    // 1) Try local repository first (no side effects)\n    const local = await this.channelRepo.getSubChannelState(channelId, vmIdFragment);\n    if (local) return local;\n\n    // 2) Fallback to chain: derive baseline (sync-from-chain is allowed to update repo)\n    try {\n      const [channelInfo, subInfo] = await Promise.all([\n        this.getChannelInfoCached(channelId),\n        this.contract.getSubChannel({ channelId, vmIdFragment }),\n      ]);\n\n      const derived: SubChannelInfo = {\n        channelId,\n        epoch: channelInfo.epoch,\n        vmIdFragment: subInfo.vmIdFragment,\n        lastClaimedAmount: subInfo.lastClaimedAmount,\n        lastConfirmedNonce: subInfo.lastConfirmedNonce,\n        lastUpdated: Date.now(),\n      };\n\n      // Sync to local repository as it's sourced from chain\n      await this.channelRepo.updateSubChannelState(channelId, vmIdFragment, derived);\n      return derived;\n    } catch {\n      // Chain fallback failed (e.g., sub-channel not authorized yet)\n      return null;\n    }\n  }\n\n  /**\n   * Get the payee DID from this client's signer\n   */\n  async getPayeeDid(): Promise<string> {\n    return await this.signer.getDid();\n  }\n\n  /**\n   * Get the pending SubRAV repository used by this client\n   */\n  getPendingSubRAVRepository(): PendingSubRAVRepository {\n    return this.pendingSubRAVRepo;\n  }\n\n  // -------- Claims Management --------\n\n  /**\n   * Claim payment from a channel using a signed SubRAV\n   */\n  async claimFromChannel(options: ClaimOptions): Promise<ClaimResult> {\n    const { signedSubRAV } = options;\n\n    // Submit claim to blockchain\n    const claimParams = {\n      signedSubRAV,\n      signer: this.signer,\n    };\n\n    const result = await this.contract.claimFromChannel(claimParams);\n    return result;\n  }\n\n  /**\n   * Batch claim multiple SubRAVs\n   * Falls back to individual claims\n   */\n  async batchClaimFromChannels(signedSubRAVs: SignedSubRAV[]): Promise<ClaimResult[]> {\n    const results: ClaimResult[] = [];\n\n    for (const signedSubRAV of signedSubRAVs) {\n      try {\n        const result = await this.claimFromChannel({ signedSubRAV });\n        results.push(result);\n      } catch (error) {\n        // Continue with other claims even if one fails\n        throw error;\n      }\n    }\n\n    return results;\n  }\n\n  // -------- Channel Management --------\n\n  /**\n   * Close a payment channel (from payee side)\n   */\n  async closeChannel(channelId: string, cooperative: boolean = true): Promise<{ txHash: string }> {\n    const result = await this.contract.closeChannel({\n      channelId,\n      cooperative,\n      signer: this.signer,\n    });\n\n    // Update local cache to mark channel as closed\n    const metadata = await this.channelRepo.getChannelMetadata(channelId);\n    if (metadata) {\n      metadata.status = 'closed';\n      await this.channelRepo.setChannelMetadata(channelId, metadata);\n    }\n\n    return { txHash: result.txHash };\n  }\n\n  /**\n   * Get channel information\n   */\n  async getChannelInfo(channelId: string): Promise<ChannelInfo> {\n    return this.contract.getChannelStatus({ channelId });\n  }\n\n  /**\n   * Get channel info with caching using ChannelRepository\n   * This checks local storage first, then falls back to chain if not found or stale\n   */\n  private async getChannelInfoCached(\n    channelId: string,\n    forceRefresh: boolean = false\n  ): Promise<ChannelInfo> {\n    // Try to get from local storage first (unless forced refresh)\n    if (!forceRefresh) {\n      const cachedMetadata = await this.channelRepo.getChannelMetadata(channelId);\n      if (cachedMetadata) {\n        // Convert ChannelMetadata to ChannelInfo\n        return cachedMetadata;\n      }\n    }\n\n    // Fetch from chain and cache\n    try {\n      const channelInfo = await this.contract.getChannelStatus({ channelId });\n\n      // Store in cache as ChannelMetadata\n      await this.channelRepo.setChannelMetadata(channelId, channelInfo);\n\n      return channelInfo;\n    } catch (error) {\n      // If chain call fails and we have stale cache, use it\n      if (!forceRefresh) {\n        const staleMetadata = await this.channelRepo.getChannelMetadata(channelId);\n        if (staleMetadata) {\n          return staleMetadata;\n        }\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * List active channels where this payee is involved\n   */\n  async listActiveChannels(options: ListChannelsOptions = {}): Promise<ChannelInfo[]> {\n    const payeeDid = await this.signer.getDid();\n\n    // Get channels from storage first\n    const storageResult = await this.channelRepo.listChannelMetadata(\n      {\n        payeeDid,\n        status: options.status || 'active',\n      },\n      {\n        offset: options.offset || 0,\n        limit: options.limit || 50,\n      }\n    );\n\n    // Get current status for each channel (using cache for efficiency)\n    const channelInfos: ChannelInfo[] = [];\n    for (const metadata of storageResult.items) {\n      try {\n        const info = await this.getChannelInfoCached(metadata.channelId);\n        channelInfos.push(info);\n      } catch (error) {}\n    }\n\n    return channelInfos;\n  }\n\n  /**\n   * Sync channel state from blockchain to local storage\n   * This force-refreshes the cached channel metadata\n   */\n  async syncChannelState(channelId: string): Promise<void> {\n    try {\n      // Force refresh from chain and update cache\n      await this.getChannelInfoCached(channelId, true);\n    } catch (error) {\n      throw error;\n    }\n  }\n\n  // -------- Asset Information --------\n\n  /**\n   * Get asset information\n   */\n  async getAssetInfo(assetId: string): Promise<AssetInfo> {\n    return this.contract.getAssetInfo(assetId);\n  }\n\n  /**\n   * Get asset price in pUSD\n   */\n  async getAssetPrice(assetId: string): Promise<bigint> {\n    return this.contract.getAssetPrice(assetId);\n  }\n\n  // -------- Private Helpers --------\n\n  /**\n   * Extract vmIdFragment from full keyId (e.g., \"did:example:payer#key1\" → \"key1\")\n   */\n  private extractVmIdFragment(keyId: string): string {\n    const parts = keyId.split('#');\n    if (parts.length !== 2) {\n      throw new Error(\n        `Invalid keyId format: ${keyId}. Expected format: \"did:example:payer#fragment\"`\n      );\n    }\n    return parts[1];\n  }\n\n  /**\n   * Get cached chain ID or fetch from contract\n   */\n  private async getChainId(): Promise<bigint> {\n    if (this.chainIdCache === undefined) {\n      this.chainIdCache = await this.contract.getChainId();\n    }\n    return this.chainIdCache;\n  }\n\n  /**\n   * Get a PaymentHubClient instance that reuses this client's contract and signer\n   * Primarily useful for balance queries and withdraw operations on the payee side\n   */\n  getHubClient(): PaymentHubClient {\n    return new PaymentHubClient({\n      contract: this.contract,\n      signer: this.signer,\n      defaultAssetId: this.defaultAssetId,\n    });\n  }\n\n  /**\n   * Get a PaymentRevenueClient instance for revenue management operations\n   * Requires revenueContract to be provided in constructor options\n   * @throws Error if revenueContract was not provided\n   */\n  getRevenueClient(): PaymentRevenueClient {\n    if (!this.revenueContract) {\n      throw new Error(\n        'PaymentRevenueClient requires revenueContract to be provided in PaymentChannelPayeeClientOptions'\n      );\n    }\n\n    return new PaymentRevenueClient({\n      contract: this.revenueContract,\n      signer: this.signer,\n      defaultAssetId: this.defaultAssetId,\n    });\n  }\n\n  /**\n   * Get channel health metrics\n   */\n  async getChannelHealth(channelId: string): Promise<{\n    isHealthy: boolean;\n    issues: string[];\n    lastActivity?: Date;\n    pendingClaims: number;\n  }> {\n    const issues: string[] = [];\n\n    try {\n      const channelInfo = await this.getChannelInfoCached(channelId);\n\n      // Check if channel is closed\n      if (channelInfo.status === 'closed') {\n        issues.push('Channel is closed');\n      }\n\n      // Check if channel is closing\n      if (channelInfo.status === 'closing') {\n        issues.push('Channel is in closing state');\n      }\n\n      // In production, add more health checks like:\n      // - Check for stuck transactions\n      // - Monitor claim success rates\n      // - Check for unusual nonce gaps\n\n      return {\n        isHealthy: issues.length === 0,\n        issues,\n        pendingClaims: 0, // Would query from contract/storage\n      };\n    } catch (error) {\n      return {\n        isHealthy: false,\n        issues: [`Channel access failed: ${error}`],\n        pendingClaims: 0,\n      };\n    }\n  }\n}\n","/**\n * Framework-level API types for Payment Kit\n *\n * This file contains types for the API framework itself (handlers, context, etc.)\n * rather than specific data models which are defined in schema/.\n */\n\nimport { RAVRepository } from '../storage/interfaces/RAVRepository';\nimport type { ErrorCodeType, ApiError } from '../schema/core';\nimport { ChannelRepository } from '../storage/interfaces/ChannelRepository';\nimport { PendingSubRAVRepository } from '../storage/interfaces/PendingSubRAVRepository';\nimport { ClaimTriggerService } from '../core/ClaimTriggerService';\nimport { PaymentChannelPayeeClient } from '../client/PaymentChannelPayeeClient';\nimport { RateProvider } from '../billing';\nimport { PaymentProcessor } from '../core/PaymentProcessor';\n\n/**\n * Standard API response envelope\n * Generic container for all API responses\n */\nexport interface ApiResponse<T = unknown> {\n  success: boolean;\n  data?: T;\n  error?: ApiError;\n  timestamp: string;\n}\n\n/**\n * Standard error codes enum for convenient access\n * Note: The authoritative schema is in schema/core/ErrorCodeSchema\n */\nexport const ErrorCode = {\n  // Authentication & Authorization\n  UNAUTHORIZED: 'UNAUTHORIZED' as const,\n  FORBIDDEN: 'FORBIDDEN' as const,\n\n  // Payment related\n  PAYMENT_REQUIRED: 'PAYMENT_REQUIRED' as const,\n  INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS' as const,\n  CONFLICT: 'CONFLICT' as const,\n\n  // General errors\n  NOT_FOUND: 'NOT_FOUND' as const,\n  BAD_REQUEST: 'BAD_REQUEST' as const,\n  INTERNAL_ERROR: 'INTERNAL_ERROR' as const,\n  SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE' as const,\n} as const;\n\nexport type ErrorCode = ErrorCodeType;\n\n/**\n * Handler context interface\n * Contains all dependencies and configuration needed by API handlers\n */\nexport interface ApiContext {\n  config: {\n    serviceId: string;\n    serviceDid: string;\n    defaultAssetId: string;\n    defaultPricePicoUSD?: string;\n    adminDid?: string | string[];\n    debug?: boolean;\n  };\n  payeeClient: PaymentChannelPayeeClient;\n  rateProvider: RateProvider;\n  claimTriggerService?: ClaimTriggerService;\n  processor: PaymentProcessor;\n  ravRepository: RAVRepository;\n  channelRepo: ChannelRepository;\n  pendingSubRAVStore: PendingSubRAVRepository;\n}\n\n/**\n * Framework-agnostic handler signature\n * All API handlers must conform to this signature\n */\nexport type Handler<Ctx = ApiContext, Req = any, Res = any> = (\n  ctx: Ctx,\n  req: Req\n) => Promise<ApiResponse<Res>>;\n","import { ErrorCode, type ErrorCode as ErrorCodeType } from '../types/api';\nimport type { ApiError } from '../schema';\n\n/**\n * Base error class for Payment Kit\n */\nexport class PaymentKitError extends Error {\n  public readonly code: ErrorCodeType;\n  public readonly httpStatus: number;\n  public readonly details?: unknown;\n\n  constructor(code: ErrorCodeType | string, message: string, httpStatus = 500, details?: unknown) {\n    super(message);\n    this.name = 'PaymentKitError';\n    this.code = code as ErrorCodeType;\n    this.httpStatus = httpStatus;\n    this.details = details;\n  }\n\n  /**\n   * Convert to standard API error format\n   */\n  toApiError(): ApiError {\n    return {\n      code: this.code,\n      message: this.message,\n      details: this.details,\n      httpStatus: this.httpStatus,\n    };\n  }\n}\n\n/**\n * Convert any error to standard API error format\n */\nexport function toApiError(error: unknown): ApiError {\n  if (error instanceof PaymentKitError) {\n    return error.toApiError();\n  }\n\n  if (error instanceof Error) {\n    return {\n      code: ErrorCode.INTERNAL_ERROR,\n      message: error.message,\n      details: error.stack,\n      httpStatus: 500,\n    };\n  }\n\n  return {\n    code: ErrorCode.INTERNAL_ERROR,\n    message: String(error),\n    httpStatus: 500,\n  };\n}\n\n/**\n * Create a success response\n */\nexport function createSuccessResponse<T>(data: T): { success: true; data: T; timestamp: string } {\n  return {\n    success: true,\n    data,\n    timestamp: new Date().toISOString(),\n  };\n}\n\n/**\n * Create an error response\n */\nexport function createErrorResponse(error: ApiError): {\n  success: false;\n  error: ApiError;\n  timestamp: string;\n} {\n  return {\n    success: false,\n    error,\n    timestamp: new Date().toISOString(),\n  };\n}\n","import { PaymentKitError } from './PaymentKitError';\nimport { ErrorCode, type ErrorCode as ErrorCodeType } from '../types/api';\nimport { TransactionExecutionInfoView } from '@roochnetwork/rooch-sdk';\n\ntype HttpStatus = 400 | 401 | 402 | 403 | 404 | 409 | 500 | 503;\n\nfunction httpStatusForErrorCode(code: ErrorCodeType | string): HttpStatus {\n  switch (code as ErrorCodeType) {\n    case ErrorCode.PAYMENT_REQUIRED:\n    case ErrorCode.INSUFFICIENT_FUNDS:\n      return 402;\n    case ErrorCode.BAD_REQUEST:\n      return 400;\n    case ErrorCode.UNAUTHORIZED:\n      return 401;\n    case ErrorCode.FORBIDDEN:\n      return 403;\n    case ErrorCode.NOT_FOUND:\n      return 404;\n    case ErrorCode.CONFLICT:\n      return 409;\n    case ErrorCode.SERVICE_UNAVAILABLE:\n      return 503;\n    case ErrorCode.INTERNAL_ERROR:\n    default:\n      return 500;\n  }\n}\n\nexport function createError(\n  code: ErrorCodeType | string,\n  message: string,\n  details?: unknown,\n  httpStatus?: number\n): PaymentKitError {\n  const status = (httpStatus ?? httpStatusForErrorCode(code)) as number;\n  return new PaymentKitError(code, message, status, details);\n}\n\nexport function badRequest(message: string, details?: unknown): PaymentKitError {\n  return createError(ErrorCode.BAD_REQUEST, message, details);\n}\n\nexport function notFound(message: string, details?: unknown): PaymentKitError {\n  return createError(ErrorCode.NOT_FOUND, message, details);\n}\n\nexport function conflict(message: string, details?: unknown): PaymentKitError {\n  return createError(ErrorCode.CONFLICT, message, details);\n}\n\nexport function serviceUnavailable(message: string, details?: unknown): PaymentKitError {\n  return createError(ErrorCode.SERVICE_UNAVAILABLE, message, details);\n}\n\nexport function internalError(message: string, details?: unknown): PaymentKitError {\n  return createError(ErrorCode.INTERNAL_ERROR, message, details);\n}\n\n/**\n * Normalize unknown errors into PaymentKitError with consistent shape\n */\nexport function wrapUnknownError(operation: string, error: unknown): PaymentKitError {\n  if (error instanceof PaymentKitError) {\n    return error;\n  }\n\n  // Try map Rooch RPC/transport-level errors (validation failures, maintenance mode, etc.)\n  const mapped = tryMapRoochRpcError(operation, error);\n  if (mapped) {\n    return mapped;\n  }\n\n  const details = normalizeUnknown(error);\n  const message = `[${operation}] ${details.message ?? 'Unexpected error'}`;\n  return internalError(message, { operation, error: details });\n}\n\nfunction normalizeUnknown(err: unknown): Record<string, unknown> {\n  if (err instanceof Error) {\n    return { name: err.name, message: err.message, stack: err.stack };\n  }\n  if (typeof err === 'object' && err !== null) {\n    try {\n      return JSON.parse(JSON.stringify(err));\n    } catch {\n      return { error: String(err) };\n    }\n  }\n  return { error: String(err) };\n}\n\n/**\n * Map Rooch execution_info.status failures to PaymentKitError\n * Accepts partial result from Rooch SDK signAndExecuteTransaction\n */\nexport function mapTxFailureToPaymentKitError(\n  operation: string,\n  executionInfo: TransactionExecutionInfoView\n): PaymentKitError {\n  const baseDetails = { operation, executionInfo };\n  const status = executionInfo?.status;\n  if (!status) {\n    return internalError(`[${operation}] Missing execution status`, baseDetails);\n  }\n\n  switch (status.type) {\n    case 'executed':\n      return internalError(`[${operation}] mapTxFailure called for executed tx`, baseDetails);\n    case 'outofgas':\n      return badRequest(`[${operation}] Out of gas`, baseDetails);\n    case 'moveabort': {\n      const abortCode = parseAbortCode(status.abort_code);\n      const location = status.location;\n      // If abort from payment_channel, map to specific ErrorCode\n      if (isPaymentChannelModule(location)) {\n        return mapPaymentChannelAbort(operation, abortCode, baseDetails);\n      }\n      return badRequest(\n        `[${operation}] Move abort ${String(status.abort_code)} at ${location}`,\n        baseDetails\n      );\n    }\n    case 'executionfailure': {\n      return internalError(\n        `[${operation}] Execution failure at ${status.location}#${status.function}@${status.code_offset}`,\n        baseDetails\n      );\n    }\n    case 'miscellaneouserror':\n    default:\n      return internalError(`[${operation}] Transaction failed`, baseDetails);\n  }\n}\n\nfunction isPaymentChannelModule(location: string | undefined): boolean {\n  if (!location) return false;\n  return location.includes('payment_channel');\n}\n\nfunction parseAbortCode(code: unknown): number | null {\n  if (typeof code === 'number') return code;\n  if (typeof code === 'string') {\n    // try decimal first, then hex like 0x..\n    if (/^0x[0-9a-fA-F]+$/.test(code)) {\n      try {\n        return parseInt(code, 16);\n      } catch {\n        return null;\n      }\n    }\n    const n = Number(code);\n    return Number.isFinite(n) ? n : null;\n  }\n  return null;\n}\n\nfunction mapPaymentChannelAbort(\n  operation: string,\n  abortCode: number | null,\n  details: Record<string, unknown>\n): PaymentKitError {\n  switch (abortCode) {\n    case 1: // ErrorNotReceiver\n      return createError(ErrorCode.FORBIDDEN, `[${operation}] Not receiver`, details);\n    case 2: // ErrorChannelNotActive\n      return createError(ErrorCode.CONFLICT, `[${operation}] Channel not active`, details);\n    case 3: // ErrorInvalidSenderSignature\n      return createError(ErrorCode.BAD_REQUEST, `[${operation}] Invalid sender signature`, details);\n    case 4: // ErrorVerificationMethodNotFound\n      return createError(ErrorCode.BAD_REQUEST, `[${operation}] VM not found`, details);\n    case 5: // ErrorInsufficientPermission\n      return createError(ErrorCode.FORBIDDEN, `[${operation}] Insufficient permission`, details);\n    case 6: // ErrorInvalidPaymentHub\n      return createError(ErrorCode.CONFLICT, `[${operation}] Invalid payment hub`, details);\n    case 7: // ErrorInvalidNonce\n      return createError(ErrorCode.CONFLICT, `[${operation}] Invalid nonce`, details);\n    case 8: // ErrorInvalidAmount\n      return createError(ErrorCode.CONFLICT, `[${operation}] Invalid amount`, details);\n    case 9: // ErrorHubOwnerMismatch\n      return createError(ErrorCode.FORBIDDEN, `[${operation}] Hub owner mismatch`, details);\n    case 10: // ErrorChallengePeriodNotElapsed\n      return createError(\n        ErrorCode.CONFLICT,\n        `[${operation}] Challenge period not elapsed`,\n        details\n      );\n    case 11: // ErrorChannelAlreadyCancelling\n      return createError(ErrorCode.CONFLICT, `[${operation}] Channel already cancelling`, details);\n    case 12: // ErrorChannelAlreadyClosed\n      return createError(ErrorCode.CONFLICT, `[${operation}] Channel already closed`, details);\n    case 13: // ErrorInsufficientBalance\n      return createError(\n        ErrorCode.INSUFFICIENT_FUNDS,\n        `[${operation}] Insufficient hub balance`,\n        details\n      );\n    case 14: // ErrorNotSender\n      return createError(ErrorCode.FORBIDDEN, `[${operation}] Not sender`, details);\n    case 15: // ErrorSubChannelNotAuthorized\n      return createError(ErrorCode.NOT_FOUND, `[${operation}] Sub-channel not authorized`, details);\n    case 16: // ErrorVMAuthorizeOnlySender\n      return createError(\n        ErrorCode.FORBIDDEN,\n        `[${operation}] Only sender can authorize VM`,\n        details\n      );\n    case 17: // ErrorVerificationMethodAlreadyExists\n      return createError(\n        ErrorCode.CONFLICT,\n        `[${operation}] Verification method already exists`,\n        details\n      );\n    case 18: // ErrorChannelAlreadyExists\n      return createError(ErrorCode.CONFLICT, `[${operation}] Channel already exists`, details);\n    case 19: // ErrorActiveChannelExists\n      return createError(\n        ErrorCode.CONFLICT,\n        `[${operation}] Active channel exists for coin`,\n        details\n      );\n    case 20: // ErrorSenderMustIsDID\n      return createError(ErrorCode.BAD_REQUEST, `[${operation}] Sender must have DID`, details);\n    case 21: // ErrorMismatchedCoinType\n      return createError(ErrorCode.BAD_REQUEST, `[${operation}] Mismatched coin type`, details);\n    case 22: // ErrorInvalidChannelEpoch\n      return createError(ErrorCode.CONFLICT, `[${operation}] Invalid channel epoch`, details);\n    case 23: // ErrorInvalidChainId\n      return createError(ErrorCode.BAD_REQUEST, `[${operation}] Invalid chain id`, details);\n    case 24: // ErrorUnsupportedVersion\n      return createError(\n        ErrorCode.BAD_REQUEST,\n        `[${operation}] Unsupported SubRAV version`,\n        details\n      );\n    default:\n      return badRequest(`[${operation}] Move abort ${String(abortCode)}`, details);\n  }\n}\n\n// --- RPC/Transport-level error mapping ---\nfunction tryMapRoochRpcError(operation: string, error: unknown): PaymentKitError | null {\n  const e = error as any;\n  const message: string = typeof e?.message === 'string' ? e.message : '';\n\n  // Maintenance mode or service unavailable indicators\n  if (\n    includesAny(message, ['maintenance mode', 'Service Maintenance', 'service is in maintenance'])\n  ) {\n    return serviceUnavailable(`[${operation}] Rooch service is in maintenance`, {\n      operation,\n      message,\n    });\n  }\n\n  // Parse sub status from message like: 'status ABORTED of type Execution with sub status 1004'\n  const subStatus = parseSubStatusFromMessage(message);\n  if (subStatus != null) {\n    switch (subStatus) {\n      case 1004: // User has no gas / insufficient balance for fee\n        return createError(ErrorCode.INSUFFICIENT_FUNDS, `[${operation}] Insufficient gas`, {\n          operation,\n          message,\n          subStatus,\n        });\n      default:\n        // Unknown execution abort sub status at validation time\n        return badRequest(`[${operation}] Execution aborted (sub status ${subStatus})`, {\n          operation,\n          message,\n          subStatus,\n        });\n    }\n  }\n\n  // Fallback: if error code exists and hints at balance/gas issues\n  if (typeof e?.code === 'number') {\n    const code = e.code as number;\n    if (code === 1004) {\n      return createError(ErrorCode.INSUFFICIENT_FUNDS, `[${operation}] Insufficient gas`, {\n        operation,\n        code,\n        message,\n      });\n    }\n  }\n\n  // Heuristic: textual hints\n  if (\n    includesAny(message.toLowerCase(), ['insufficient gas', 'out of gas', 'insufficient balance'])\n  ) {\n    return createError(ErrorCode.INSUFFICIENT_FUNDS, `[${operation}] Insufficient gas`, {\n      operation,\n      message,\n    });\n  }\n\n  return null;\n}\n\nfunction parseSubStatusFromMessage(message: string): number | null {\n  if (!message) return null;\n  const m = message.match(/sub status\\s+(\\d+)/i);\n  if (m && m[1]) {\n    const n = Number(m[1]);\n    return Number.isFinite(n) ? n : null;\n  }\n  return null;\n}\n\nfunction includesAny(str: string, needles: string[]): boolean {\n  for (const n of needles) {\n    if (str.includes(n)) return true;\n  }\n  return false;\n}\n","/**\n * Rooch Contract Base Class\n *\n * Base class for Rooch contract implementations that provides common functionality\n * such as client initialization, signer conversion, and transaction creation.\n */\n\nimport {\n  RoochClient,\n  Transaction,\n  Signer,\n  getRoochNodeUrl,\n  type NetworkType,\n} from '@roochnetwork/rooch-sdk';\n\nimport {\n  DebugLogger,\n  SignerInterface,\n  DidAccountSigner,\n  isSignerInterface,\n} from '@nuwa-ai/identity-kit';\n\nimport { badRequest } from '../errors/RoochErrorMapper';\n\nexport interface RoochContractOptions {\n  rpcUrl?: string;\n  network?: 'local' | 'dev' | 'test' | 'main';\n  contractAddress?: string;\n  debug?: boolean;\n}\n\n/**\n * Base class for Rooch contract implementations\n *\n * Provides common functionality shared across different Rooch contract clients:\n * - RoochClient initialization\n * - Signer conversion utilities\n * - Transaction creation\n * - Network URL resolution\n * - Debug logging setup\n */\nexport abstract class RoochContractBase {\n  protected client: RoochClient;\n  protected contractAddress: string;\n  protected logger: DebugLogger;\n\n  constructor(options: RoochContractOptions, defaultContractAddress: string, loggerName: string) {\n    const rpcUrl = options.rpcUrl || this.getDefaultRpcUrl(options.network || 'test');\n    this.client = new RoochClient({ url: rpcUrl });\n    this.contractAddress = options.contractAddress || defaultContractAddress;\n    this.logger = DebugLogger.get(loggerName);\n\n    if (options.debug) {\n      this.logger.setLevel('debug');\n    }\n\n    this.logger.debug(`${loggerName} initialized with rpcUrl: ${rpcUrl}`);\n  }\n\n  /**\n   * Create a new transaction instance\n   */\n  protected createTransaction(): Transaction {\n    return new Transaction();\n  }\n\n  /**\n   * Convert SignerInterface to Rooch Signer\n   * Handles both SignerInterface and direct Signer instances\n   */\n  protected async convertSigner(signer: SignerInterface | Signer): Promise<Signer> {\n    // If it implements SignerInterface, convert it to DidAccountSigner\n    if (isSignerInterface(signer)) {\n      if (signer instanceof DidAccountSigner) {\n        // DidAccountSigner should have a method to get the underlying Rooch signer\n        // For now, we'll cast it - this may need adjustment based on actual DidAccountSigner API\n        return signer as any as Signer;\n      }\n      // Use DidAccountSigner.create for other SignerInterface implementations\n      return DidAccountSigner.create(signer);\n    }\n    // Fallback: assume it's already a Signer\n    return signer as Signer;\n  }\n\n  /**\n   * Get default RPC URL for a given network\n   * Maps our network names to Rooch SDK network names\n   */\n  protected getDefaultRpcUrl(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 getRoochNodeUrl(roochNetwork as NetworkType);\n  }\n\n  /**\n   * Get the RoochClient instance\n   */\n  protected getClient(): RoochClient {\n    return this.client;\n  }\n\n  /**\n   * Get the contract address\n   */\n  protected getContractAddress(): string {\n    return this.contractAddress;\n  }\n\n  /**\n   * Get the logger instance\n   */\n  protected getLogger(): DebugLogger {\n    return this.logger;\n  }\n}\n","/**\n * Rooch Payment Channel Contract Implementation\n *\n * Implementation of IPaymentChannelContract for Rooch blockchain.\n * Provides concrete implementation of payment channel operations using Rooch SDK.\n */\n\nimport {\n  RoochClient,\n  Args,\n  EventView,\n  Serializer,\n  normalizeRoochAddress,\n  sha3_256,\n  toHEX,\n  RoochAddress,\n} from '@roochnetwork/rooch-sdk';\nimport { bcs } from '@roochnetwork/rooch-sdk';\n\nimport type {\n  IPaymentChannelContract,\n  OpenChannelParams,\n  OpenChannelResult,\n  OpenChannelWithSubChannelParams,\n  AuthorizeSubChannelParams,\n  TxResult,\n  ClaimParams,\n  ClaimResult,\n  CloseParams,\n  ChannelStatusParams,\n  SubChannelParams,\n  SubChannelInfo,\n  DepositParams,\n  WithdrawParams,\n  TransferToHubParams,\n} from '../contracts/IPaymentChannelContract';\nimport type { AssetInfo, SignedSubRAV, SubRAV, ChannelInfo } from '../core/types';\nimport { SubRAVCodec } from '../core/SubRav';\nimport { parseDid } from '@nuwa-ai/identity-kit';\nimport {\n  calcChannelObjectId,\n  normalizeAssetId,\n  calculatePaymentHubId,\n  deriveFieldKeyFromString,\n  deriveCoinTypeFieldKey,\n  parsePaymentChannelData,\n  parsePaymentHubData,\n  parseDynamicFieldSubChannel,\n  parseDynamicFieldCoinStore,\n  parseDynamicFieldU64,\n  safeBalanceToBigint,\n  parseU256FromBCS,\n  PaymentChannelData,\n  PaymentHub,\n  SubChannel,\n  DynamicField,\n  CoinStoreFieldData,\n} from './ChannelUtils';\nimport {\n  badRequest,\n  notFound,\n  wrapUnknownError,\n  mapTxFailureToPaymentKitError,\n  internalError,\n} from '../errors/RoochErrorMapper';\nimport { RoochContractBase, type RoochContractOptions } from './RoochContractBase';\n\n// BCS Schema definitions for Rooch Move types\nexport const CloseProofSchema: any = bcs.struct('CloseProof', {\n  vm_id_fragment: bcs.string(),\n  accumulated_amount: bcs.u256(),\n  nonce: bcs.u64(),\n  sender_signature: bcs.vector(bcs.u8()),\n});\n\nexport const CloseProofsSchema: any = bcs.struct('CloseProofs', {\n  proofs: bcs.vector(CloseProofSchema),\n});\n\nexport const CancelProofSchema: any = bcs.struct('CancelProof', {\n  vm_id_fragment: bcs.string(),\n  accumulated_amount: bcs.u256(),\n  nonce: bcs.u64(),\n});\n\nexport const CancelProofsSchema: any = bcs.struct('CancelProofs', {\n  proofs: bcs.vector(CancelProofSchema),\n});\n\n// BCS Schema definitions are now in ChannelUtils.ts\n\nconst RGAS_CANONICAL_TAG: string =\n  '0x0000000000000000000000000000000000000000000000000000000000000003::gas_coin::RGas';\n\n/**\n * Default contract address for Rooch payment channels\n */\nconst PAYMENT_CHANNEL_MODULE = 'payment_channel';\nconst DEFAULT_PAYMENT_CHANNEL_ADDRESS = '0x3';\n\n/**\n * Default lock amount per channel (asset units, e.g. 1 RGAS)\n */\nconst DEFAULT_LOCK_AMOUNT_PER_CHANNEL = 1_000_000n;\n\n/**\n * Rooch implementation of the Payment Channel Contract\n *\n * This implementation provides complete functionality for payment channels\n * using the Rooch blockchain and corresponding Move contracts.\n */\nexport class RoochPaymentChannelContract\n  extends RoochContractBase\n  implements IPaymentChannelContract\n{\n  constructor(options: RoochContractOptions = {}) {\n    // contractAddress here is address only; module appended per call\n    super(\n      { ...options, contractAddress: options.contractAddress || DEFAULT_PAYMENT_CHANNEL_ADDRESS },\n      DEFAULT_PAYMENT_CHANNEL_ADDRESS,\n      'RoochPaymentChannelContract'\n    );\n  }\n\n  async openChannel(params: OpenChannelParams): Promise<OpenChannelResult> {\n    try {\n      this.getLogger().debug('Opening payment channel with params:', params);\n\n      // Parse and validate DIDs first\n      const payerParsed = parseDid(params.payerDid);\n      const payeeParsed = parseDid(params.payeeDid);\n\n      if (payerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid payer DID method: expected 'rooch', got '${payerParsed.method}'`);\n      }\n      if (payeeParsed.method !== 'rooch') {\n        throw badRequest(`Invalid payee DID method: expected 'rooch', got '${payeeParsed.method}'`);\n      }\n\n      const signer = await this.convertSigner(params.signer);\n\n      // Create transaction to open channel\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::open_channel_entry`,\n        typeArgs: [params.assetId], // CoinType as type argument\n        args: [Args.address(payeeParsed.identifier)],\n        maxGas: 100000000,\n      });\n\n      this.getLogger().debug('Executing openChannel transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('openChannel', result.execution_info);\n      }\n\n      // Calculate the expected channel ID deterministically\n      const channelId = calcChannelObjectId(\n        payerParsed.identifier,\n        payeeParsed.identifier,\n        params.assetId\n      );\n\n      return {\n        channelId,\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0), // TODO: Extract from result if available\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.getLogger().error('Error opening channel:', error);\n      throw wrapUnknownError('openChannel', error);\n    }\n  }\n\n  async openChannelWithSubChannel(\n    params: OpenChannelWithSubChannelParams\n  ): Promise<OpenChannelResult> {\n    try {\n      this.getLogger().debug('Opening payment channel with sub-channel in one step:', params);\n\n      // Parse and validate DIDs first\n      const payerParsed = parseDid(params.payerDid);\n      const payeeParsed = parseDid(params.payeeDid);\n\n      if (payerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid payer DID method: expected 'rooch', got '${payerParsed.method}'`);\n      }\n      if (payeeParsed.method !== 'rooch') {\n        throw badRequest(`Invalid payee DID method: expected 'rooch', got '${payeeParsed.method}'`);\n      }\n\n      const signer = await this.convertSigner(params.signer);\n\n      // Create transaction to open channel with sub-channel\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::open_channel_with_sub_channel_entry`,\n        typeArgs: [params.assetId], // CoinType as type argument\n        args: [Args.address(payeeParsed.identifier), Args.string(params.vmIdFragment)],\n        maxGas: 100000000,\n      });\n\n      this.getLogger().debug('Executing openChannelWithSubChannel transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('openChannelWithSubChannel', result.execution_info);\n      }\n\n      // Calculate the expected channel ID deterministically\n      const channelId = calcChannelObjectId(\n        payerParsed.identifier,\n        payeeParsed.identifier,\n        params.assetId\n      );\n\n      return {\n        channelId,\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0), // TODO: Extract from result if available\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.getLogger().error('Error opening channel with sub-channel:', error);\n      throw wrapUnknownError('openChannelWithSubChannel', error);\n    }\n  }\n\n  async authorizeSubChannel(params: AuthorizeSubChannelParams): Promise<TxResult> {\n    try {\n      this.getLogger().debug('Authorizing sub-channel with params:', params);\n\n      const signer = await this.convertSigner(params.signer);\n\n      // Create transaction to authorize sub-channel\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::authorize_sub_channel_entry`,\n        args: [Args.objectId(params.channelId), Args.string(params.vmIdFragment)],\n        maxGas: 100000000,\n      });\n\n      this.getLogger().debug('Executing authorizeSubChannel transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('authorizeSubChannel', result.execution_info);\n      }\n\n      return {\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0),\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.getLogger().error('Error authorizing sub-channel:', error);\n      throw wrapUnknownError('authorizeSubChannel', error);\n    }\n  }\n\n  async claimFromChannel(params: ClaimParams): Promise<ClaimResult> {\n    try {\n      this.getLogger().debug('Claiming from channel with params:', params);\n\n      const signer = await this.convertSigner(params.signer);\n      const { subRav, signature } = params.signedSubRAV;\n\n      // Create transaction to claim from channel\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::claim_from_channel_entry`,\n        args: [\n          Args.objectId(subRav.channelId),\n          Args.string(subRav.vmIdFragment),\n          Args.u256(subRav.accumulatedAmount),\n          Args.u64(subRav.nonce),\n          Args.vec('u8', Array.from(signature)),\n        ],\n        maxGas: 100000000,\n      });\n\n      this.getLogger().debug('Executing claimFromChannel transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('claimFromChannel', result.execution_info);\n      }\n\n      // Parse claimed amount from events\n      const claimedAmount = this.parseClaimedAmountFromEvents(result.output?.events);\n\n      return {\n        txHash: result.execution_info.tx_hash || '',\n        claimedAmount,\n        blockHeight: BigInt(0),\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.getLogger().error('Error claiming from channel:', error);\n      throw wrapUnknownError('claimFromChannel', error);\n    }\n  }\n\n  async closeChannel(params: CloseParams): Promise<TxResult> {\n    try {\n      this.getLogger().debug('Closing channel with params:', params);\n\n      const signer = await this.convertSigner(params.signer);\n\n      const transaction = this.createTransaction();\n\n      if (params.cooperative && params.closeProofs) {\n        // Cooperative close with proofs\n        const serializedProofs = CloseProofsSchema.serialize(params.closeProofs).toBytes();\n\n        transaction.callFunction({\n          target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::close_channel_entry`,\n          args: [Args.objectId(params.channelId), Args.vec('u8', serializedProofs)],\n          maxGas: 100000000,\n        });\n      } else {\n        // Force close (initiate cancellation)\n        transaction.callFunction({\n          target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::initiate_cancellation_entry`,\n          args: [Args.objectId(params.channelId)],\n          maxGas: 100000000,\n        });\n      }\n\n      this.getLogger().debug('Executing closeChannel transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('closeChannel', result.execution_info);\n      }\n\n      return {\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0),\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.getLogger().error('Error closing channel:', error);\n      throw wrapUnknownError('closeChannel', error);\n    }\n  }\n\n  async getChannelStatus(params: ChannelStatusParams): Promise<ChannelInfo> {\n    try {\n      this.getLogger().debug('Getting channel status for channel:', params.channelId);\n\n      // Get channel state from blockchain\n      const channelObject = await this.getClient().getObjectStates({\n        ids: [params.channelId],\n      });\n\n      if (!channelObject || channelObject.length === 0 || !channelObject[0]) {\n        throw notFound(`Channel ${params.channelId} not found`);\n      }\n\n      const channelState = channelObject[0];\n\n      // Parse channel data from BCS - no need for view functions anymore\n      const channelData = parsePaymentChannelData(channelState.value);\n\n      // Convert status number to string\n      const statusString = this.convertChannelStatus(channelData.status);\n\n      const channel_sender = new RoochAddress(channelData.sender);\n      const channel_receiver = new RoochAddress(channelData.receiver);\n      return {\n        channelId: params.channelId,\n        payerDid: `did:rooch:${channel_sender.toBech32Address()}`,\n        payeeDid: `did:rooch:${channel_receiver.toBech32Address()}`,\n        assetId: channelData.coin_type,\n        epoch: channelData.channel_epoch,\n        status: statusString,\n      };\n    } catch (error) {\n      this.getLogger().error('Error getting channel status:', error);\n      throw wrapUnknownError('getChannelStatus', error);\n    }\n  }\n\n  async getSubChannel(params: SubChannelParams): Promise<SubChannelInfo> {\n    try {\n      this.getLogger().debug('Getting sub-channel info for:', params);\n\n      // First get the channel to obtain the sub_channels table ID\n      const channelObject = await this.getClient().getObjectStates({\n        ids: [params.channelId],\n      });\n\n      if (!channelObject || channelObject.length === 0 || !channelObject[0]) {\n        throw notFound(`Channel ${params.channelId} not found`);\n      }\n\n      const channelData = parsePaymentChannelData(channelObject[0].value);\n\n      // Get the sub-channel data from the sub_channels Table\n      const subChannelData = await this.getSubChannelData(\n        channelData.sub_channels,\n        params.vmIdFragment\n      );\n\n      if (!subChannelData) {\n        throw notFound(\n          `Sub-channel ${params.vmIdFragment} not found in channel ${params.channelId}`\n        );\n      }\n\n      return {\n        channelId: params.channelId,\n        epoch: channelData.channel_epoch,\n        vmIdFragment: params.vmIdFragment,\n        publicKey: subChannelData.pk_multibase,\n        methodType: subChannelData.method_type,\n        lastClaimedAmount: subChannelData.last_claimed_amount,\n        lastConfirmedNonce: subChannelData.last_confirmed_nonce,\n      };\n    } catch (error) {\n      this.getLogger().error('Error getting sub-channel info:', error);\n      throw wrapUnknownError('getSubChannel', error);\n    }\n  }\n\n  async getAssetInfo(assetId: string): Promise<AssetInfo> {\n    this.getLogger().debug('Getting asset info for:', assetId);\n    let canonicalAssetId = normalizeAssetId(assetId);\n    // TODO: Add support for other assets\n    if (canonicalAssetId === RGAS_CANONICAL_TAG) {\n      let assetInfo: AssetInfo = {\n        assetId: canonicalAssetId,\n        symbol: this.parseAssetSymbol(assetId),\n        decimals: 8,\n      };\n      return assetInfo;\n    }\n    throw badRequest(`Unsupported asset type: ${assetId}`);\n  }\n\n  async getAssetPrice(assetId: string): Promise<bigint> {\n    try {\n      this.getLogger().debug('Getting asset price for:', assetId);\n\n      // Normalize asset ID to canonical string\n      const canonicalAssetId = normalizeAssetId(assetId);\n\n      //Currently only support RGas\n      if (canonicalAssetId === RGAS_CANONICAL_TAG) {\n        // RGas pricing calculation:\n        // - 1 RGas = 0.01 USD\n        // - RGas has 8 decimals, so 1 RGas = 10^8 base units\n        // - 1 USD = 1,000,000,000,000 pUSD (pico-USD, not micro-USD!)\n        // - So 1 RGas = 0.01 * 1,000,000,000,000 = 10,000,000,000 pUSD\n        // - Therefore: 1 base unit = 10,000,000,000 pUSD / 10^8 = 100 pUSD\n        return BigInt(100); // 100 pUSD per smallest RGas unit\n      }\n\n      // Unknown asset type\n      throw badRequest(`Unsupported asset type: ${assetId}`);\n    } catch (error) {\n      this.getLogger().error('Error getting asset price:', error);\n      throw wrapUnknownError('getAssetPrice', error);\n    }\n  }\n\n  async getChainId(): Promise<bigint> {\n    try {\n      this.getLogger().debug('Getting chain ID');\n\n      // Use RoochClient's getChainId method\n      const chainId = await this.getClient().getChainId();\n      return BigInt(chainId);\n    } catch (error) {\n      this.getLogger().error('Error getting chain ID:', error);\n      throw wrapUnknownError('getChainId', error);\n    }\n  }\n\n  async depositToHub(params: DepositParams): Promise<TxResult> {\n    try {\n      this.getLogger().debug('Depositing to payment hub with params:', params);\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(params.ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      const signer = await this.convertSigner(params.signer);\n\n      // Create transaction to deposit to hub\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::deposit_to_hub_entry`,\n        typeArgs: [params.assetId], // CoinType as type argument\n        args: [Args.address(ownerParsed.identifier), Args.u256(params.amount)],\n        maxGas: 100000000,\n      });\n\n      this.getLogger().debug('Executing depositToHub transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('depositToHub', result.execution_info);\n      }\n\n      return {\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0),\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.getLogger().error('Error depositing to hub:', error);\n      throw wrapUnknownError('depositToHub', error);\n    }\n  }\n\n  async withdrawFromHub(params: WithdrawParams): Promise<TxResult> {\n    try {\n      this.getLogger().debug('Withdrawing from payment hub with params:', params);\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(params.ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      const signer = await this.convertSigner(params.signer);\n\n      // Create transaction to withdraw from hub\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::withdraw_from_hub_entry`,\n        typeArgs: [params.assetId], // CoinType as type argument\n        args: [Args.u256(params.amount)],\n        maxGas: 100000000,\n      });\n\n      this.getLogger().debug('Executing withdrawFromHub transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('withdrawFromHub', result.execution_info);\n      }\n\n      return {\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0),\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.getLogger().error('Error withdrawing from hub:', error);\n      throw wrapUnknownError('withdrawFromHub', error);\n    }\n  }\n\n  async getHubBalance(ownerDid: string, assetId: string): Promise<bigint> {\n    try {\n      this.getLogger().debug('Getting hub balance for DID:', ownerDid, 'asset:', assetId);\n\n      // Get PaymentHub object\n      const paymentHub = await this.getPaymentHub(ownerDid);\n      if (!paymentHub) {\n        this.getLogger().debug('PaymentHub not found for owner:', ownerDid);\n        return BigInt(0);\n      }\n\n      this.getLogger().debug('MultiCoinStore ID extracted:', paymentHub.multi_coin_store);\n      // Query the specific field for this coin type in the multi_coin_store\n      const fieldKey = deriveCoinTypeFieldKey(assetId);\n      const fieldStates = await this.getClient().getFieldStates({\n        objectId: paymentHub.multi_coin_store,\n        fieldKey: [fieldKey],\n      });\n\n      if (!fieldStates || fieldStates.length === 0 || !fieldStates[0]) {\n        // Asset not found in the store, balance is 0\n        this.getLogger().debug('Asset not found in multi_coin_store:', assetId);\n        return BigInt(0);\n      }\n\n      // Parse the DynamicField<String, CoinStoreField> to get balance\n      const fieldState = fieldStates[0];\n      const fieldValue = fieldState.value;\n\n      if (typeof fieldValue === 'string' && fieldValue.startsWith('0x')) {\n        // Parse BCS bytes using DynamicFieldCoinStoreSchema\n        try {\n          // this.logger.debug(\n          //   'Parsing DynamicField<String, CoinStoreField> from BCS hex:',\n          //   fieldValue\n          // );\n          const parsed = parseDynamicFieldCoinStore(fieldValue);\n\n          //this.logger.debug('Parsed DynamicField:', parsed);\n\n          // Extract balance from the parsed CoinStoreField and ensure it's bigint\n          return safeBalanceToBigint(parsed.value.balance.value);\n        } catch (parseError) {\n          this.getLogger().warn('Failed to parse CoinStoreField BCS data:', parseError);\n          return BigInt(0);\n        }\n      } else if (fieldValue && typeof fieldValue === 'object' && 'value' in fieldValue) {\n        // If already parsed\n        const coinStoreField = (fieldValue as any).value;\n        if (coinStoreField && typeof coinStoreField === 'object' && 'balance' in coinStoreField) {\n          return BigInt(coinStoreField.balance as string);\n        }\n      }\n\n      this.getLogger().warn('Could not parse balance from field state');\n      return BigInt(0);\n    } catch (error) {\n      this.getLogger().error('Error getting hub balance:', error);\n      // Return 0 instead of throwing for balance queries\n      return BigInt(0);\n    }\n  }\n\n  async getAllHubBalances(ownerDid: string): Promise<Record<string, bigint>> {\n    try {\n      this.getLogger().debug('Getting all hub balances for DID:', ownerDid);\n\n      // Get PaymentHub object\n      const paymentHub = await this.getPaymentHub(ownerDid);\n      if (!paymentHub) {\n        this.getLogger().debug('PaymentHub not found for owner:', ownerDid);\n        return {};\n      }\n\n      this.getLogger().debug(\n        'MultiCoinStore ID extracted for all balances:',\n        paymentHub.multi_coin_store\n      );\n\n      // List all field states in multi_coin_store to get all coin types and balances\n      const balances: Record<string, bigint> = {};\n      let cursor = null;\n      // We only need to get the first 100 fields for now\n      const pageSize = 100;\n\n      // while (true) {\n      const fieldStates = await this.getClient().listFieldStates({\n        objectId: paymentHub.multi_coin_store,\n        cursor,\n        limit: pageSize.toString(),\n      });\n\n      if (!fieldStates || !fieldStates.data) {\n        return balances;\n      }\n\n      for (const state of fieldStates.data) {\n        try {\n          // Parse DynamicField<String, CoinStoreField>\n          const fieldValue = state.state.value;\n\n          if (typeof fieldValue === 'string' && fieldValue.startsWith('0x')) {\n            // Parse BCS bytes using DynamicFieldCoinStoreSchema\n            try {\n              // this.logger.debug(\n              //   'Parsing DynamicField<String, CoinStoreField> from BCS hex:',\n              //   fieldValue\n              // );\n              const parsed = parseDynamicFieldCoinStore(fieldValue);\n\n              //this.logger.debug('Parsed DynamicField:', parsed);\n\n              // Extract coin type and balance from the parsed data\n              const coinType = parsed.name;\n              const balance = safeBalanceToBigint(parsed.value.balance.value);\n\n              if (coinType && balance > 0) {\n                balances[coinType] = balance;\n              }\n            } catch (parseError) {\n              this.getLogger().warn('Failed to parse CoinStoreField BCS data:', parseError);\n              continue;\n            }\n          } else {\n            this.getLogger().warn('Could not parse balance from field state');\n            throw new Error('Could not parse balance from field state');\n          }\n        } catch (parseError) {\n          this.getLogger().warn('Failed to parse field state for balance:', parseError);\n          continue;\n        }\n      }\n\n      // if (!fieldStates.has_next_page) {\n      //   break;\n      // }\n      // }\n      // cursor = fieldStates.next_cursor;\n      // }\n\n      return balances;\n    } catch (error) {\n      this.getLogger().error('Error getting all hub balances:', error);\n      // Return empty object instead of throwing\n      return {};\n    }\n  }\n\n  async getActiveChannelCount(ownerDid: string, assetId: string): Promise<number> {\n    try {\n      this.getLogger().debug('Getting active channel count for DID:', ownerDid, 'asset:', assetId);\n\n      const paymentHub = await this.getPaymentHub(ownerDid);\n      if (!paymentHub) {\n        this.getLogger().debug('PaymentHub not found for owner:', ownerDid);\n        return 0;\n      }\n\n      return await this.getActiveChannelCountFromHub(paymentHub, assetId);\n    } catch (error) {\n      this.getLogger().error('Error getting active channel count:', error);\n      return 0;\n    }\n  }\n\n  private async getActiveChannelCountFromHub(\n    paymentHub: PaymentHub,\n    assetId: string\n  ): Promise<number> {\n    try {\n      const fieldKey = deriveCoinTypeFieldKey(assetId);\n      const fieldStates = await this.getClient().getFieldStates({\n        objectId: paymentHub.active_channels,\n        fieldKey: [fieldKey],\n      });\n\n      if (!fieldStates || fieldStates.length === 0 || !fieldStates[0]) {\n        return 0;\n      }\n\n      const fieldValue = fieldStates[0].value;\n\n      try {\n        if (typeof fieldValue === 'string') {\n          const parsed = parseDynamicFieldU64(fieldValue);\n          return parsed.value;\n        }\n\n        if (fieldValue && typeof fieldValue === 'object' && 'value' in fieldValue) {\n          const parsedValue = (fieldValue as any).value;\n          if (typeof parsedValue === 'number') {\n            return parsedValue;\n          }\n          if (typeof parsedValue === 'bigint') {\n            return Number(parsedValue);\n          }\n          if (typeof parsedValue === 'string') {\n            return Number(parsedValue);\n          }\n        }\n      } catch (parseError) {\n        this.getLogger().warn('Failed to parse active channel count field:', parseError);\n        return 0;\n      }\n\n      return 0;\n    } catch (error) {\n      this.getLogger().error('Error querying active channel count from hub:', error);\n      return 0;\n    }\n  }\n\n  private async getLockedUnit(assetId: string): Promise<bigint> {\n    try {\n      const normalizedAssetId = normalizeAssetId(assetId);\n      const result = await this.getClient().executeViewFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::get_locked_unit`,\n        args: [Args.string(normalizedAssetId)],\n      });\n\n      const rv = (result as any)?.return_values?.[0];\n      const decoded = rv?.decoded_value ?? rv?.value;\n\n      if (typeof decoded === 'bigint') {\n        return decoded;\n      }\n      if (typeof decoded === 'number') {\n        return BigInt(decoded);\n      }\n      if (typeof decoded === 'string') {\n        if (decoded.startsWith('0x')) {\n          return parseU256FromBCS(decoded);\n        }\n        return BigInt(decoded);\n      }\n\n      return DEFAULT_LOCK_AMOUNT_PER_CHANNEL;\n    } catch (error) {\n      this.getLogger().warn('Failed to fetch locked unit from view, using default', error);\n      return DEFAULT_LOCK_AMOUNT_PER_CHANNEL;\n    }\n  }\n\n  /**\n   * Transfer funds from sender's payment hub to receiver's payment hub\n   * Calls the payment_channel::transfer_to_hub_entry function\n   */\n  async transferToHub(params: TransferToHubParams): Promise<TxResult> {\n    try {\n      this.getLogger().debug('Transferring from hub to hub:', {\n        senderDid: params.senderDid,\n        receiverDid: params.receiverDid,\n        assetId: params.assetId,\n        amount: params.amount.toString(),\n      });\n\n      // Validate parameters\n      const { senderDid, receiverDid, assetId, amount, signer } = params;\n\n      // Parse sender DID for method validation\n      const senderParsed = parseDid(senderDid);\n      if (senderParsed.method !== 'rooch') {\n        throw badRequest(\n          `Invalid sender DID method: expected 'rooch', got '${senderParsed.method}'`\n        );\n      }\n\n      // Parse receiver DID and convert to address\n      const receiverParsed = parseDid(receiverDid);\n      if (receiverParsed.method !== 'rooch') {\n        throw badRequest(\n          `Invalid receiver DID method: expected 'rooch', got '${receiverParsed.method}'`\n        );\n      }\n      const receiverAddress = receiverParsed.identifier;\n\n      // Convert signer to Rooch signer\n      const roochSigner = await this.convertSigner(signer);\n\n      // Create transaction\n      const tx = this.createTransaction();\n\n      // Call the payment_channel::transfer_to_hub_entry function\n      tx.callFunction({\n        target: `${this.getContractAddress()}::${PAYMENT_CHANNEL_MODULE}::transfer_to_hub_entry`,\n        typeArgs: [assetId],\n        args: [Args.address(receiverAddress), Args.u256(amount)],\n        maxGas: 100000000,\n      });\n\n      // Execute the transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction: tx,\n        signer: roochSigner,\n      });\n\n      // Check if the transaction was successful\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('transferToHub', result.execution_info);\n      }\n\n      const txHash = result.execution_info.tx_hash || '';\n      this.getLogger().debug('Hub transfer completed:', { txHash });\n\n      return { txHash };\n    } catch (error) {\n      this.getLogger().error('Error transferring from hub to hub:', error);\n      throw wrapUnknownError('transferToHub', error);\n    }\n  }\n\n  /**\n   * Get unlocked balance in payment hub (excluding locked amounts for active channels)\n   * This calculates the available balance by subtracting locked amounts from total balance\n   */\n  async getUnlockedBalance(ownerDid: string, assetId: string): Promise<bigint> {\n    try {\n      this.getLogger().debug('Getting unlocked balance:', { ownerDid, assetId });\n\n      // Get total balance\n      const totalBalance = await this.getHubBalance(ownerDid, assetId);\n\n      // Get active channels count for this asset\n      const activeChannelsCount = await this.getActiveChannelCount(ownerDid, assetId);\n\n      // Fetch per-coin locked unit from Move view; fallback to default if unavailable\n      const lockAmountPerChannel = await this.getLockedUnit(assetId);\n\n      const lockedBalance = BigInt(activeChannelsCount) * lockAmountPerChannel;\n      const unlockedBalance =\n        totalBalance > lockedBalance ? totalBalance - lockedBalance : BigInt(0);\n\n      this.getLogger().debug('Unlocked balance calculated:', {\n        totalBalance: totalBalance.toString(),\n        activeChannelsCount,\n        lockedBalance: lockedBalance.toString(),\n        unlockedBalance: unlockedBalance.toString(),\n      });\n\n      return unlockedBalance;\n    } catch (error) {\n      this.getLogger().error('Error getting unlocked balance:', error);\n      // Return 0 instead of throwing to be more graceful\n      return BigInt(0);\n    }\n  }\n\n  // PaymentHub ID calculation and field key derivation are now in ChannelUtils.ts\n\n  // Get PaymentHub object for a given owner DID\n  private async getPaymentHub(ownerDid: string): Promise<PaymentHub | null> {\n    try {\n      this.getLogger().debug('Getting PaymentHub for DID:', ownerDid);\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw new Error(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      // Calculate hub ID\n      const hubId = calculatePaymentHubId(ownerParsed.identifier);\n\n      // Get PaymentHub object state\n      const hubObjectViews = await this.getClient().getObjectStates({ ids: [hubId] });\n\n      if (!hubObjectViews || hubObjectViews.length === 0 || !hubObjectViews[0]) {\n        this.getLogger().debug('PaymentHub not found for owner:', ownerDid);\n        return null;\n      }\n\n      const hubObjectView = hubObjectViews[0];\n\n      // Parse PaymentHub using BCS deserialization\n      try {\n        const hubValue = hubObjectView.value;\n\n        if (typeof hubValue === 'string' && hubValue.startsWith('0x')) {\n          // Parse BCS bytes using PaymentHubSchema\n          //this.logger.debug('Parsing PaymentHub from BCS hex:', hubValue);\n          const parsed = parsePaymentHubData(hubValue);\n\n          //this.logger.debug('Parsed PaymentHub:', parsed);\n\n          return parsed;\n        } else {\n          throw new Error('Unexpected PaymentHub value format');\n        }\n      } catch (parseError) {\n        this.getLogger().error('Failed to parse PaymentHub object:', parseError);\n        return null;\n      }\n    } catch (error) {\n      this.getLogger().error('Error getting PaymentHub:', error);\n      return null;\n    }\n  }\n\n  // Helper methods\n\n  private parseChannelIdFromEvents(events?: EventView[]): string {\n    if (!events) {\n      throw internalError('No events found to parse channel ID');\n    }\n\n    for (const event of events) {\n      if (event.event_type.includes('PaymentChannelOpenedEvent')) {\n        // Parse the channel_id from event data using BCS\n        try {\n          // The event data contains the channel_id field\n          const eventDataHex = event.event_data.startsWith('0x')\n            ? event.event_data.slice(2)\n            : event.event_data;\n          const eventDataBytes = new Uint8Array(\n            eventDataHex.match(/.{1,2}/g)?.map((byte: string) => parseInt(byte, 16)) || []\n          );\n\n          // For now, extract channel_id manually - this would need proper BCS schema\n          // The PaymentChannelOpenedEvent should contain channel_id as first field\n          return event.event_data; // Return the raw event data for now\n        } catch (error) {\n          this.getLogger().error('Failed to parse channel ID from event:', error);\n          throw internalError(`Failed to parse channel ID from event: ${error}`);\n        }\n      }\n    }\n\n    throw internalError('PaymentChannelOpenedEvent not found in transaction events');\n  }\n\n  private parseClaimedAmountFromEvents(events?: EventView[]): bigint {\n    if (!events) {\n      return BigInt(0);\n    }\n\n    for (const event of events) {\n      if (event.event_type.includes('ChannelClaimedEvent')) {\n        // Parse the amount from event data\n        // TODO: Implement proper BCS event parsing\n        return BigInt(0);\n      }\n    }\n\n    return BigInt(0);\n  }\n\n  // parseChannelData method moved to ChannelUtils.parsePaymentChannelData\n\n  /**\n   * Get sub-channel data by VM ID fragment\n   * @param subChannelsTableId The ObjectID of the sub_channels Table\n   * @param vmIdFragment The VM ID fragment to query\n   * @returns SubChannel data or null if not found\n   */\n  private async getSubChannelData(\n    subChannelsTableId: string,\n    vmIdFragment: string\n  ): Promise<SubChannel | null> {\n    try {\n      this.getLogger().debug(\n        `Getting sub-channel data for: ${vmIdFragment} from table: ${subChannelsTableId}`\n      );\n\n      // Create field key from vm_id_fragment - this follows Rooch's FieldKey::derive_from_string logic\n      const fieldKey = deriveFieldKeyFromString(vmIdFragment);\n\n      // Query specific field by key using getFieldStates API\n      const fieldStates = await this.getClient().getFieldStates({\n        objectId: subChannelsTableId,\n        fieldKey: [fieldKey],\n      });\n\n      if (!fieldStates || fieldStates.length === 0 || !fieldStates[0]) {\n        this.getLogger().debug(\n          `Sub-channel ${vmIdFragment} not found in table ${subChannelsTableId}`\n        );\n        return null;\n      }\n\n      const fieldState = fieldStates[0];\n\n      // Parse the DynamicField<String, SubChannel> from BCS\n      const dynamicField = parseDynamicFieldSubChannel(fieldState.value);\n\n      return dynamicField.value;\n    } catch (error) {\n      this.getLogger().error('Error getting sub-channel data:', error);\n      return null;\n    }\n  }\n\n  private convertChannelStatus(status: number): 'active' | 'closing' | 'closed' {\n    switch (status) {\n      case 0:\n        return 'active';\n      case 1:\n        return 'closing';\n      case 2:\n        return 'closed';\n      default:\n        return 'closed';\n    }\n  }\n\n  private parseAssetSymbol(assetId: string): string {\n    // Extract symbol from asset ID\n    // Example: '0x3::gas_coin::RGas' -> 'RGas'\n    const parts = assetId.split('::');\n    return parts[parts.length - 1] || 'UNKNOWN';\n  }\n}\n","import type {\n  SignedSubRAV,\n  SubRAV,\n  PaymentRequestPayload,\n  PaymentResponsePayload,\n} from '../core/types';\n\n/**\n * Protocol-agnostic payment codec interface\n *\n * Implementations handle encoding/decoding of payment data\n * for specific protocols (HTTP, MCP, A2A, etc.)\n */\nexport interface PaymentCodec {\n  // Request-side encode/decode\n  encodePayload(payload: PaymentRequestPayload): string | Record<string, any>;\n  decodePayload(input: string | Record<string, any>): PaymentRequestPayload;\n\n  // Response-side encode/decode\n  encodeResponse(\n    subRAV: SubRAV,\n    cost: bigint,\n    serviceTxRef: string,\n    metadata?: any\n  ): string | Record<string, any>;\n\n  encodeError(\n    error: { code: string; message?: string },\n    metadata?: { clientTxRef?: string; serviceTxRef?: string; version?: number }\n  ): string | Record<string, any>;\n\n  decodeResponse(input: string | Record<string, any>): PaymentResponsePayload;\n}\n\n/**\n * Error types for codec operations\n */\nexport class CodecError extends Error {\n  constructor(\n    message: string,\n    public readonly cause?: Error\n  ) {\n    super(message);\n    this.name = 'CodecError';\n  }\n}\n\nexport class EncodingError extends CodecError {\n  constructor(message: string, cause?: Error) {\n    super(`Encoding failed: ${message}`, cause);\n    this.name = 'EncodingError';\n  }\n}\n\nexport class DecodingError extends CodecError {\n  constructor(message: string, cause?: Error) {\n    super(`Decoding failed: ${message}`, cause);\n    this.name = 'DecodingError';\n  }\n}\n","import { MultibaseCodec } from '@nuwa-ai/identity-kit';\nimport type { SignedSubRAV, SubRAV } from '../../core/types';\nimport type { PaymentCodec } from '../../codecs/PaymentCodec';\nimport { EncodingError, DecodingError } from '../../codecs/PaymentCodec';\nimport type {\n  PaymentRequestPayload,\n  HttpRequestPayload,\n  PaymentResponsePayload as HttpResponsePayload,\n  SerializableResponsePayload,\n  SerializableSubRAV,\n  SerializableSignedSubRAV,\n  SerializableRequestPayload,\n} from '../../core/types';\n\n/**\n * HTTP-specific payment codec\n *\n * Handles encoding/decoding of payment data for HTTP protocol\n * using X-Payment-Channel-Data header format\n */\nexport class HttpPaymentCodec implements PaymentCodec {\n  private static readonly HEADER_NAME = 'X-Payment-Channel-Data';\n  // MCP content constants\n  static readonly MCP_PAYMENT_URI = 'nuwa:payment';\n  static readonly MCP_PAYMENT_MIME = 'application/vnd.nuwa.payment+json';\n\n  /**\n   * Encode payment header payload for HTTP request header (new interface)\n   */\n  encodePayload(payload: PaymentRequestPayload): string {\n    try {\n      return HttpPaymentCodec.buildRequestHeader(payload);\n    } catch (error) {\n      throw new EncodingError(\n        'Failed to encode HTTP payment data',\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  /**\n   * Decode HTTP request header to payment header payload (new interface)\n   */\n  decodePayload(encoded: string): PaymentRequestPayload {\n    try {\n      return HttpPaymentCodec.parseRequestHeader(encoded);\n    } catch (error) {\n      throw new DecodingError(\n        'Failed to decode HTTP payment data',\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  /**\n   * Encode SubRAV proposal for HTTP response header\n   */\n  encodeResponse(subRAV: SubRAV, cost: bigint, serviceTxRef: string, metadata?: any): string {\n    try {\n      const payload: HttpResponsePayload = {\n        subRav: subRAV,\n        cost,\n        serviceTxRef,\n        version: 1,\n        ...metadata,\n      };\n\n      return HttpPaymentCodec.buildResponseHeader(payload);\n    } catch (error) {\n      throw new EncodingError(\n        'Failed to encode HTTP response payment data',\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  /**\n   * Encode protocol-level error for HTTP response header\n   */\n  encodeError(\n    error: { code: string; message?: string },\n    metadata?: { clientTxRef?: string; serviceTxRef?: string; version?: number }\n  ): string {\n    try {\n      const payload: HttpResponsePayload = {\n        error,\n        clientTxRef: metadata?.clientTxRef,\n        serviceTxRef: metadata?.serviceTxRef,\n        version: metadata?.version ?? 1,\n      } as HttpResponsePayload;\n      return HttpPaymentCodec.buildResponseHeader(payload);\n    } catch (error) {\n      throw new EncodingError(\n        'Failed to encode HTTP response error data',\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  /**\n   * Decode HTTP response header to SubRAV proposal\n   */\n  decodeResponse(encoded: string) {\n    try {\n      const payload = HttpPaymentCodec.parseResponseHeader(encoded);\n\n      const out: HttpResponsePayload = {\n        subRav: payload.subRav,\n        cost: payload.cost,\n        costUsd: payload.costUsd,\n        clientTxRef: payload.clientTxRef,\n        serviceTxRef: payload.serviceTxRef,\n        error: payload.error,\n        version: payload.version,\n      } as HttpResponsePayload;\n      return out;\n    } catch (error) {\n      throw new DecodingError(\n        'Failed to decode HTTP response payment data',\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  // ============================================================================\n  // Static HTTP Header Building Methods\n  // ============================================================================\n\n  /**\n   * Build HTTP request header value\n   */\n  static buildRequestHeader(payload: PaymentRequestPayload): string {\n    const serializable = this.toJSONRequest(payload);\n    const json = JSON.stringify(serializable);\n    return MultibaseCodec.encodeBase64url(json);\n  }\n\n  /**\n   * Parse HTTP request header value\n   */\n  static parseRequestHeader(headerValue: string): PaymentRequestPayload {\n    try {\n      const json = MultibaseCodec.decodeBase64urlToString(headerValue);\n      const data = JSON.parse(json);\n      return this.fromJSONRequest(data as SerializableRequestPayload);\n    } catch (error) {\n      throw new Error(`Failed to parse request header: ${error}`);\n    }\n  }\n\n  /**\n   * Build HTTP response header value\n   */\n  static buildResponseHeader(payload: HttpResponsePayload): string {\n    const serializable = this.toJSONResponse(payload);\n    const json = JSON.stringify(serializable);\n    return MultibaseCodec.encodeBase64url(json);\n  }\n\n  /**\n   * Parse HTTP response header value\n   */\n  static parseResponseHeader(headerValue: string): HttpResponsePayload {\n    try {\n      const json = MultibaseCodec.decodeBase64urlToString(headerValue);\n      const data: any = JSON.parse(json);\n      return this.fromJSONResponse(data as SerializableResponsePayload);\n    } catch (error) {\n      throw new Error(`Failed to parse response header: ${error}`);\n    }\n  }\n\n  // ============================================================================\n  // Structured JSON helpers for PaymentResponsePayload (for MCP and others)\n  // Note: subRav is serialized as JSON (not encoded string) for readability.\n  // In a future revision, we may add an additional encoded field (e.g., subRavHeader)\n  // without breaking compatibility.\n  // ============================================================================\n\n  static toJSONResponse(payload: HttpResponsePayload): SerializableResponsePayload {\n    const out: SerializableResponsePayload = {\n      version: payload.version ?? 1,\n      clientTxRef: payload.clientTxRef,\n      serviceTxRef: payload.serviceTxRef,\n    };\n    // Always include subRav when present, even if cost is undefined (e.g., PAYMENT_REQUIRED 402)\n    if (payload.subRav) {\n      out.subRav = this.serializeSubRAV(payload.subRav);\n    }\n    if (payload.cost !== undefined) {\n      out.cost = payload.cost.toString();\n    }\n    if (payload.costUsd !== undefined) {\n      out.costUsd = payload.costUsd.toString();\n    }\n    if (payload.error) {\n      out.error = payload.error;\n    }\n    return out;\n  }\n\n  static fromJSONResponse(data: SerializableResponsePayload): HttpResponsePayload {\n    const payload: HttpResponsePayload = {\n      version: data?.version ? Number(data.version) : 1,\n      clientTxRef: data?.clientTxRef,\n      serviceTxRef: data?.serviceTxRef,\n    } as HttpResponsePayload;\n\n    if (data?.subRav) {\n      payload.subRav = this.deserializeSubRAV(data.subRav as unknown as SerializableSubRAV);\n    }\n    const costStr = (data as any).cost;\n    if (costStr !== undefined) payload.cost = BigInt(costStr);\n    if (data.costUsd !== undefined) payload.costUsd = BigInt(data.costUsd);\n    if (data?.error) {\n      payload.error = data.error as any;\n    }\n    return payload;\n  }\n\n  // Structured JSON helpers for PaymentRequestPayload (for MCP and others)\n  static toJSONRequest(payload: PaymentRequestPayload): SerializableRequestPayload {\n    const out: SerializableRequestPayload = {\n      version: payload.version ?? 1,\n      clientTxRef: payload.clientTxRef,\n    };\n    if (payload.maxAmount !== undefined) out.maxAmount = payload.maxAmount.toString();\n    if (payload.signedSubRav) out.signedSubRav = this.serializeSignedSubRAV(payload.signedSubRav);\n    return out;\n  }\n\n  static fromJSONRequest(data: SerializableRequestPayload): PaymentRequestPayload {\n    if (!data?.clientTxRef) throw new Error('clientTxRef is required in payment header');\n    const out: PaymentRequestPayload = {\n      version: data.version ?? 1,\n      clientTxRef: data.clientTxRef,\n      maxAmount: data.maxAmount ? BigInt(data.maxAmount) : BigInt(0),\n      signedSubRav: data.signedSubRav ? this.deserializeSignedSubRAV(data.signedSubRav) : undefined,\n    };\n    return out;\n  }\n\n  /**\n   * Get HTTP header name for payment data\n   */\n  static getHeaderName(): string {\n    return this.HEADER_NAME;\n  }\n\n  /**\n   * Check if request contains payment data\n   */\n  static hasPaymentData(headers: Record<string, string | string[]>): boolean {\n    const headerName = this.getHeaderName();\n    return !!(headers[headerName.toLowerCase()] || headers[headerName]);\n  }\n\n  /**\n   * Extract payment header value from request headers\n   */\n  static extractPaymentHeader(\n    headers: Record<string, string | string[] | undefined>\n  ): string | null {\n    const headerName = this.getHeaderName();\n    const headerValue = headers[headerName.toLowerCase()] || headers[headerName];\n\n    if (Array.isArray(headerValue)) {\n      return headerValue[0] || null;\n    }\n\n    return headerValue || null;\n  }\n\n  /**\n   * Extract payment data from request headers\n   */\n  static extractPaymentData(headers: Record<string, string>): PaymentRequestPayload | null {\n    const headerValue =\n      headers[this.getHeaderName().toLowerCase()] || headers[this.getHeaderName()];\n\n    if (!headerValue) {\n      return null;\n    }\n\n    try {\n      return this.parseRequestHeader(headerValue);\n    } catch (error) {\n      throw new Error(`Invalid payment channel header: ${error}`);\n    }\n  }\n\n  /**\n   * Add payment data to response headers\n   */\n  static addPaymentData(\n    headers: Record<string, string>,\n    payload: HttpResponsePayload\n  ): Record<string, string> {\n    const headerValue = this.buildResponseHeader(payload);\n    return {\n      ...headers,\n      [this.getHeaderName()]: headerValue,\n    };\n  }\n\n  /**\n   * Validate payment requirements for a request\n   */\n  static validatePaymentRequirement(\n    paymentData: PaymentRequestPayload | null,\n    requiredAmount: bigint\n  ): { valid: boolean; error?: string } {\n    if (!paymentData) {\n      return { valid: false, error: 'Payment required' };\n    }\n\n    if (paymentData.maxAmount < requiredAmount) {\n      return { valid: false, error: 'Insufficient payment allowance' };\n    }\n\n    return { valid: true };\n  }\n\n  // ============================================================================\n  // Private Serialization Helpers\n  // ============================================================================\n\n  /**\n   * Helper: Serialize SubRAV for JSON transport\n   */\n  public static serializeSubRAV(subRav: SubRAV): SerializableSubRAV {\n    return {\n      version: subRav.version.toString(),\n      chainId: subRav.chainId.toString(),\n      channelId: subRav.channelId,\n      channelEpoch: subRav.channelEpoch.toString(),\n      vmIdFragment: subRav.vmIdFragment,\n      accumulatedAmount: subRav.accumulatedAmount.toString(),\n      nonce: subRav.nonce.toString(),\n    };\n  }\n\n  /**\n   * Helper: Deserialize SubRAV from JSON transport\n   */\n  public static deserializeSubRAV(data: SerializableSubRAV): SubRAV {\n    return {\n      version: parseInt(data.version),\n      chainId: BigInt(data.chainId),\n      channelId: data.channelId,\n      channelEpoch: BigInt(data.channelEpoch),\n      vmIdFragment: data.vmIdFragment,\n      accumulatedAmount: BigInt(data.accumulatedAmount),\n      nonce: BigInt(data.nonce),\n    };\n  }\n\n  /**\n   * Helper: Serialize SignedSubRAV for JSON transport\n   */\n  public static serializeSignedSubRAV(\n    signedSubRav: SignedSubRAV | undefined\n  ): SerializableSignedSubRAV | undefined {\n    if (!signedSubRav) {\n      return undefined;\n    }\n\n    return {\n      subRav: this.serializeSubRAV(signedSubRav.subRav),\n      signature: MultibaseCodec.encodeBase64url(signedSubRav.signature),\n    };\n  }\n\n  /**\n   * Helper: Deserialize SignedSubRAV from JSON transport\n   */\n  public static deserializeSignedSubRAV(\n    data: SerializableSignedSubRAV | undefined\n  ): SignedSubRAV | undefined {\n    if (!data) {\n      return undefined;\n    }\n\n    return {\n      subRav: this.deserializeSubRAV(data.subRav),\n      signature: MultibaseCodec.decodeBase64url(data.signature),\n    };\n  }\n\n  // ==========================================================================\n  // MCP Content helpers (resource content for payment payload)\n  // ==========================================================================\n\n  /** Build a FastMCP-compatible resource content item carrying payment payload */\n  static buildMcpPaymentResource(payload: SerializableResponsePayload): any {\n    return {\n      type: 'resource',\n      resource: {\n        uri: this.MCP_PAYMENT_URI,\n        mimeType: this.MCP_PAYMENT_MIME,\n        text: JSON.stringify(payload),\n      },\n    };\n  }\n\n  /** Try to parse payment payload from a FastMCP content array */\n  static parseMcpPaymentFromContents(\n    contents: any[] | undefined\n  ): SerializableResponsePayload | undefined {\n    if (!Array.isArray(contents)) return undefined;\n    const item = contents.find(\n      c =>\n        c &&\n        c.type === 'resource' &&\n        c.resource &&\n        (c.resource.uri === this.MCP_PAYMENT_URI || c.resource.mimeType === this.MCP_PAYMENT_MIME)\n    );\n    try {\n      const text = item?.resource?.text;\n      if (!text || typeof text !== 'string') return undefined;\n      return JSON.parse(text) as SerializableResponsePayload;\n    } catch {\n      return undefined;\n    }\n  }\n\n  /** Attach payment resource to an existing content array (non-mutating) */\n  static attachPaymentResource(\n    contents: any[] | undefined,\n    payload?: SerializableResponsePayload\n  ): any[] {\n    const out: any[] = Array.isArray(contents) ? [...contents] : [];\n    if (payload) {\n      out.push(this.buildMcpPaymentResource(payload));\n    }\n    return out;\n  }\n}\n","import { BillingRule } from './types';\n\n// Cache for compiled regex patterns to improve performance\nconst regexCache = new Map<string, RegExp>();\n\n/**\n * Pure functional implementation of rule matching used by all environments\n * (Express / Koa / Cloudflare Workers / …).\n *\n * The function iterates over the provided rule list and returns the **first**\n * rule that satisfies the matching conditions. If no rule matches it returns\n * `undefined`.\n */\nexport function findRule(meta: Record<string, any>, rules: BillingRule[]): BillingRule | undefined {\n  for (const rule of rules) {\n    if (matchesRule(meta, rule)) {\n      return rule;\n    }\n  }\n  return undefined;\n}\n\n/**\n * Get or create a cached RegExp object for the given pattern\n * @throws {Error} If the pattern is not a valid regular expression\n */\nfunction getCachedRegex(pattern: string): RegExp {\n  let regex = regexCache.get(pattern);\n  if (!regex) {\n    try {\n      regex = new RegExp(pattern);\n    } catch (error) {\n      // Provide a more user-friendly error message for invalid regex patterns\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      throw new Error(\n        `Invalid regular expression pattern \"${pattern}\": ${errorMessage}. ` +\n          'Please check your billing rule configuration and ensure the pathRegex field contains a valid regular expression.'\n      );\n    }\n\n    // Limit cache size to prevent memory leaks\n    if (regexCache.size >= 100) {\n      // Remove oldest entry when cache is full\n      const firstKey = regexCache.keys().next().value;\n      if (firstKey) {\n        regexCache.delete(firstKey);\n      }\n    }\n    regexCache.set(pattern, regex);\n  }\n  return regex;\n}\n\n/**\n * Internal helper that determines whether a single rule applies to the given\n * request metadata.\n */\nfunction matchesRule(meta: Record<string, any>, rule: BillingRule): boolean {\n  // Catch-all default rule\n  if (rule.default) {\n    return true;\n  }\n\n  if (!rule.when) {\n    return false;\n  }\n\n  const when = rule.when as Record<string, any>;\n\n  // Path exact match\n  if (when.path && meta.path !== when.path) {\n    return false;\n  }\n\n  // Path regex match (optimized with caching)\n  if (when.pathRegex) {\n    try {\n      // Check if we have an original RegExp with flags\n      if (rule.originalRegex && rule.originalRegex instanceof RegExp) {\n        if (!rule.originalRegex.test(meta.path || '')) {\n          return false;\n        }\n      } else {\n        const regex = getCachedRegex(when.pathRegex);\n        if (!regex.test(meta.path || '')) {\n          return false;\n        }\n      }\n    } catch (error) {\n      // If regex compilation fails, log the error and treat as non-matching\n      // This prevents invalid regex patterns from crashing the application\n      console.error(`[BillingRule] Failed to compile regex pattern for rule \"${rule.id}\":`, error);\n      return false;\n    }\n  }\n\n  if (when.method && meta.method !== when.method) {\n    return false;\n  }\n\n  // Fallback: check all remaining keys strictly equal\n  for (const [key, value] of Object.entries(when)) {\n    if (['path', 'pathRegex', 'model', 'method', 'assetId'].includes(key)) {\n      continue; // already handled above\n    }\n\n    if (meta[key] !== value) {\n      return false;\n    }\n  }\n\n  return true;\n}\n","export * from './PaymentKitError';\nexport * from './codes';\n","import { z } from 'zod';\nimport { LosslessNumber } from 'lossless-json';\n\n/**\n * Helper to create a schema that accepts either BigInt, string, number, or LosslessNumber\n * and transforms it to BigInt for our internal use\n */\nexport const createBigIntSchema = () =>\n  z.union([\n    z.bigint(),\n    z.string().transform(BigInt),\n    z.number().transform(BigInt),\n    z.instanceof(LosslessNumber).transform(val => BigInt(val.toString())),\n  ]);\n\nexport const SerializableSubRAVSchema = z.object({\n  version: z.string(),\n  chainId: z.string(),\n  channelId: z.string(),\n  channelEpoch: z.string(),\n  vmIdFragment: z.string(),\n  accumulatedAmount: z.string(),\n  nonce: z.string(),\n});\n\nexport const SerializableSignedSubRAVSchema = z.object({\n  subRav: SerializableSubRAVSchema,\n  signature: z.string(),\n});\n\n/**\n * SerializableRequestPayload (Zod) – client -> server request payload\n */\nexport const SerializableRequestPayloadSchema = z.object({\n  version: z.number(),\n  clientTxRef: z.string(),\n  maxAmount: z.string().optional(),\n  signedSubRav: SerializableSignedSubRAVSchema.optional(),\n});\n\n// SerializableResponsePayload (Zod) – mirrors SerializableResponsePayloadSchema\nexport const SerializableResponsePayloadSchema = z.object({\n  version: z.number(),\n  clientTxRef: z.string().optional(),\n  serviceTxRef: z.string().optional(),\n  subRav: SerializableSubRAVSchema.optional(),\n  cost: z.string().optional(),\n  costUsd: z.string().optional(),\n  error: z\n    .object({\n      code: z.string(),\n      message: z.string().optional(),\n    })\n    .optional(),\n});\n\n/**\n * Channel status enumeration (matches core/types.ts)\n */\nexport const ChannelStatusSchema = z.enum(['active', 'closing', 'closed']);\n\nexport type ChannelStatus = z.infer<typeof ChannelStatusSchema>;\n\n/**\n * Channel information schema (matches core/types.ts ChannelInfo interface)\n */\nexport const ChannelInfoSchema = z.object({\n  /** Channel identifier */\n  channelId: z.string(),\n  /** Payer DID */\n  payerDid: z.string(),\n  /** Payee DID */\n  payeeDid: z.string(),\n  /** Asset identifier */\n  assetId: z.string(),\n  /** Channel epoch */\n  epoch: createBigIntSchema(),\n  /** Channel status */\n  status: ChannelStatusSchema,\n});\n\nexport type ChannelInfo = z.infer<typeof ChannelInfoSchema>;\n\n/**\n * Sub-channel state schema (matches contracts/IPaymentChannelContract SubChannelInfo)\n * Exposed for API schemas that need to serialize sub-channel state (e.g., recovery endpoint)\n */\nexport const SubChannelStateSchema = z.object({\n  /** Associated channel ID */\n  channelId: z.string(),\n  /** Channel epoch */\n  epoch: createBigIntSchema(),\n  /** DID verification method fragment */\n  vmIdFragment: z.string(),\n  /** Optional public key for the verification method */\n  publicKey: z.string().optional(),\n  /** Optional DID method type for the verification method */\n  methodType: z.string().optional(),\n  /** Last on-chain claimed amount for this sub-channel */\n  lastClaimedAmount: createBigIntSchema(),\n  /** Last on-chain confirmed nonce for this sub-channel */\n  lastConfirmedNonce: createBigIntSchema(),\n  /** Optional last updated timestamp (ms) for local caches */\n  lastUpdated: z.number().optional(),\n});\n\n/**\n * Service discovery information schema\n */\nexport const ServiceDiscoverySchema = z.object({\n  /** Protocol version */\n  version: z.number(),\n  /** Service identifier */\n  serviceId: z.string(),\n  /** Service DID */\n  serviceDid: z.string(),\n  /** Network identifier */\n  network: z.string(),\n  /** Default asset identifier */\n  defaultAssetId: z.string(),\n  /** Default price in pico USD (optional) */\n  defaultPricePicoUSD: z.string().optional(),\n  /** API base path */\n  basePath: z.string(),\n});\n\nexport type ServiceDiscovery = z.infer<typeof ServiceDiscoverySchema>;\n\n/**\n * Health check response schema\n */\nexport const HealthCheckSchema = z.object({\n  /** Operation success status */\n  success: z.boolean(),\n  /** Health status description */\n  status: z.string(),\n  /** Response timestamp in ISO-8601 format */\n  timestamp: z.string(),\n  /** Whether payment kit is enabled */\n  paymentKitEnabled: z.boolean(),\n});\n\nexport type HealthCheck = z.infer<typeof HealthCheckSchema>;\n\n/**\n * Claims policy configuration schema\n */\nexport const ClaimTriggerPolicySchema = z.object({\n  /** Minimum accumulated amount to trigger claim (in smallest unit) */\n  minClaimAmount: createBigIntSchema(),\n  /** Maximum number of concurrent claim operations */\n  maxConcurrentClaims: z.number().optional(),\n  /** Retry attempts for failed claims */\n  maxRetries: z.number().optional(),\n  /** Delay between retries in milliseconds */\n  retryDelayMs: z.number().optional(),\n  /** Whether to check hub balance before triggering claims */\n  requireHubBalance: z.boolean().optional(),\n  /** Fixed backoff for insufficient funds (ms) */\n  insufficientFundsBackoffMs: z.number().optional(),\n  /** Count insufficient funds as failures */\n  countInsufficientAsFailure: z.boolean().optional(),\n});\n\nexport type ClaimTriggerPolicy = z.infer<typeof ClaimTriggerPolicySchema>;\n\n/**\n * Claim trigger service status schema (reactive)\n */\nexport const ClaimTriggerStatusSchema = z.object({\n  /** Number of active claims currently processing */\n  active: z.number(),\n  /** Number of tasks queued for processing */\n  queued: z.number(),\n  /** Total successful claims */\n  successCount: z.number(),\n  /** Total failed claims */\n  failedCount: z.number(),\n  /** Total skipped claims */\n  skippedCount: z.number(),\n  /** Total insufficient funds occurrences */\n  insufficientFundsCount: z.number(),\n  /** Number of tasks in backoff (waiting for retry) */\n  backoffCount: z.number(),\n  /** Average claim processing time in milliseconds */\n  avgProcessingTimeMs: z.number(),\n  /** Claim trigger policy (reactive) */\n  policy: ClaimTriggerPolicySchema,\n});\n\nexport type ClaimTriggerStatus = z.infer<typeof ClaimTriggerStatusSchema>;\n\n/**\n * Payment processing statistics schema\n */\nexport const PaymentProcessingStatsSchema = z.object({\n  /** Total number of payment requests processed */\n  totalRequests: z.number(),\n  /** Number of successful payments */\n  successfulPayments: z.number(),\n  /** Number of failed payments */\n  failedPayments: z.number(),\n  /** Number of auto claims triggered */\n  autoClaimsTriggered: z.number(),\n});\n\nexport type PaymentProcessingStats = z.infer<typeof PaymentProcessingStatsSchema>;\n\n/**\n * Claims status information schema\n */\nexport const SystemStatusSchema = z.object({\n  /** Reactive claim trigger status */\n  claims: ClaimTriggerStatusSchema,\n  /** Payment processing statistics */\n  processor: PaymentProcessingStatsSchema,\n  /** Response timestamp in ISO-8601 format */\n  timestamp: z.string(),\n});\n\nexport type SystemStatus = z.infer<typeof SystemStatusSchema>;\n\n/**\n * Claim trigger request schema\n */\nexport const ClaimTriggerRequestSchema = z.object({\n  /** Channel identifier to trigger claim for */\n  channelId: z.string(),\n});\n\nexport type ClaimTriggerRequest = z.infer<typeof ClaimTriggerRequestSchema>;\n\n// Reactive mode: return queued/skipped summary rather than on-chain tx results\nexport const ClaimTriggerQueuedSchema = z.object({\n  vmIdFragment: z.string(),\n  delta: createBigIntSchema(),\n});\n\nexport const ClaimTriggerSkippedSchema = z.object({\n  vmIdFragment: z.string(),\n  reason: z.enum(['no_delta', 'below_threshold']),\n  delta: createBigIntSchema().optional(),\n  threshold: createBigIntSchema().optional(),\n});\n\n/**\n * Claim trigger response schema\n */\nexport const ClaimTriggerResponseSchema = z.object({\n  channelId: z.string(),\n  queued: z.array(ClaimTriggerQueuedSchema),\n  skipped: z.array(ClaimTriggerSkippedSchema),\n});\n\nexport type ClaimTriggerResponse = z.infer<typeof ClaimTriggerResponseSchema>;\n\n/**\n * Standard error codes enumeration - kept here as it's used for validating error responses\n */\nexport const ErrorCodeSchema = z.enum([\n  // Authentication & Authorization\n  'UNAUTHORIZED',\n  'FORBIDDEN',\n\n  // Payment related\n  'PAYMENT_REQUIRED',\n  'INSUFFICIENT_FUNDS',\n  'CONFLICT',\n\n  // General errors\n  'NOT_FOUND',\n  'BAD_REQUEST',\n  'INTERNAL_ERROR',\n  'SERVICE_UNAVAILABLE',\n]);\n\nexport type ErrorCodeType = z.infer<typeof ErrorCodeSchema>;\n\n/**\n * Standard API error structure - kept here as it's validated in responses\n */\nexport const ApiErrorSchema = z.object({\n  code: ErrorCodeSchema,\n  message: z.string(),\n  details: z.any().optional(),\n  httpStatus: z.number().optional(),\n});\n\nexport type ApiError = z.infer<typeof ApiErrorSchema>;\n\n/**\n * Persisted HTTP client state schema for JSON serialization\n * Used by HostChannelMappingStore for safe BigInt handling\n */\nexport const PersistedHttpClientStateSchema = z.object({\n  /** Channel identifier */\n  channelId: z.string().optional(),\n  /** Pending SubRAV data */\n  pendingSubRAV: SerializableSubRAVSchema.optional(),\n  /** Last update timestamp (ISO string) */\n  lastUpdated: z.string().optional(),\n});\n\nexport type PersistedHttpClientState = z.infer<typeof PersistedHttpClientStateSchema>;\n","/**\n * JSON utilities with BigInt support using lossless-json\n *\n * This module provides unified JSON serialization/deserialization\n * that properly handles BigInt values without manual field conversion.\n */\n\nimport { stringify, parse, LosslessNumber } from 'lossless-json';\n\n/**\n * Serialize any object to JSON string with BigInt support\n */\nexport function serializeJson(value: any): string {\n  const result = stringify(value);\n  if (result === undefined) {\n    throw new Error('Failed to serialize value to JSON');\n  }\n  return result;\n}\n\n/**\n * Parse JSON string to object with minimal processing\n * Now that we use Zod schemas for validation and transformation,\n * this function only handles basic lossless parsing without field-specific logic\n */\nexport function parseJson<T = any>(text: string): T {\n  return parse(text, (key, value) => {\n    // Convert LosslessNumber to safe numbers where possible\n    if (value instanceof LosslessNumber) {\n      const str = value.toString();\n      // Check if it's an integer (no decimal point)\n      if (str.indexOf('.') === -1 && str.indexOf('e') === -1 && str.indexOf('E') === -1) {\n        // For integer fields, convert to regular number if within safe range\n        const num = Number(str);\n        if (Number.isSafeInteger(num)) {\n          return num;\n        }\n        // Keep as LosslessNumber for large integers - Zod will handle BigInt conversion\n        return value;\n      }\n    }\n    return value;\n  }) as T;\n}\n\n/**\n * Response helper for Express routes\n */\nexport function sendJsonResponse(res: any, data: any): void {\n  res.setHeader('Content-Type', 'application/json');\n  res.send(serializeJson(data));\n}\n\n/**\n * Parse Response object to JSON with BigInt support\n */\nexport async function parseJsonResponse<T = any>(response: Response): Promise<T> {\n  const text = await response.text();\n  return parseJson<T>(text);\n}\n\n/**\n * Safe JSON stringify that handles BigInt by converting to string\n * Useful for logging and debugging\n */\nexport function safeStringify(value: any, space?: string | number): string {\n  return JSON.stringify(\n    value,\n    (key, val) => {\n      return typeof val === 'bigint' ? val.toString() : val;\n    },\n    space\n  );\n}\n","/**\n * Memory-based implementation of ChannelRepository\n * For testing and development environments\n */\n\nimport type { ChannelInfo, SubChannelInfo } from '../../core/types';\nimport type { ChannelRepository } from '../interfaces/ChannelRepository';\nimport type {\n  PaginationParams,\n  ChannelFilter,\n  PaginatedResult,\n  CacheStats,\n} from '../types/pagination';\n\nexport class MemoryChannelRepository implements ChannelRepository {\n  private channelMetadata = new Map<string, ChannelInfo>();\n  private subChannelStates = new Map<string, SubChannelInfo>();\n  private hitCount = 0;\n  private missCount = 0;\n\n  private getSubChannelKey(channelId: string, vmIdFragment: string): string {\n    return `${channelId}:${vmIdFragment}`;\n  }\n\n  // -------- Channel Metadata Operations --------\n\n  async getChannelMetadata(channelId: string): Promise<ChannelInfo | null> {\n    const result = this.channelMetadata.get(channelId) || null;\n    if (result) {\n      this.hitCount++;\n    } else {\n      this.missCount++;\n    }\n    return result;\n  }\n\n  async setChannelMetadata(channelId: string, metadata: ChannelInfo): Promise<void> {\n    this.channelMetadata.set(channelId, { ...metadata });\n  }\n\n  async listChannelMetadata(\n    filter?: ChannelFilter,\n    pagination?: PaginationParams\n  ): Promise<PaginatedResult<ChannelInfo>> {\n    let channels = Array.from(this.channelMetadata.values());\n\n    // Apply filters\n    if (filter) {\n      channels = channels.filter(channel => {\n        if (filter.payerDid && channel.payerDid !== filter.payerDid) return false;\n        if (filter.payeeDid && channel.payeeDid !== filter.payeeDid) return false;\n        if (filter.status && channel.status !== filter.status) return false;\n        if (filter.assetId && channel.assetId !== filter.assetId) return false;\n        // Note: ChannelInfo doesn't have createdAt field in current definition\n        // These filters are not supported yet\n        // if (filter.createdAfter && channel.createdAt < filter.createdAfter) return false;\n        // if (filter.createdBefore && channel.createdAt > filter.createdBefore) return false;\n        return true;\n      });\n    }\n\n    const totalCount = channels.length;\n\n    // Apply pagination\n    const offset = pagination?.offset || 0;\n    const limit = pagination?.limit || 50;\n    const paginatedChannels = channels.slice(offset, offset + limit);\n\n    return {\n      items: paginatedChannels,\n      totalCount,\n      hasMore: offset + limit < totalCount,\n    };\n  }\n\n  async removeChannelMetadata(channelId: string): Promise<void> {\n    this.channelMetadata.delete(channelId);\n  }\n\n  // -------- Sub-Channel State Operations --------\n\n  async getSubChannelState(\n    channelId: string,\n    vmIdFragment: string\n  ): Promise<SubChannelInfo | null> {\n    const key = this.getSubChannelKey(channelId, vmIdFragment);\n    const existing = this.subChannelStates.get(key);\n\n    if (existing) {\n      this.hitCount++;\n      return { ...existing };\n    }\n\n    this.missCount++;\n    return null;\n  }\n\n  async updateSubChannelState(\n    channelId: string,\n    vmIdFragment: string,\n    updates: Partial<SubChannelInfo>\n  ): Promise<void> {\n    const key = this.getSubChannelKey(channelId, vmIdFragment);\n    const existing = this.subChannelStates.get(key) || {\n      channelId,\n      vmIdFragment,\n      epoch: BigInt(0),\n      lastConfirmedNonce: BigInt(0),\n      lastClaimedAmount: BigInt(0),\n      lastUpdated: Date.now(),\n    };\n\n    const updated = {\n      ...existing,\n      ...updates,\n      lastUpdated: Date.now(),\n    };\n\n    this.subChannelStates.set(key, updated);\n  }\n\n  async listSubChannelStates(channelId: string): Promise<Record<string, SubChannelInfo>> {\n    const result: Record<string, SubChannelInfo> = {};\n\n    for (const [key, state] of this.subChannelStates.entries()) {\n      if (key.startsWith(channelId + ':')) {\n        // Extract vmIdFragment from the key (format: channelId:vmIdFragment)\n        const vmIdFragment = key.substring(channelId.length + 1);\n        result[vmIdFragment] = { ...state };\n      }\n    }\n\n    return result;\n  }\n\n  async removeSubChannelState(channelId: string, vmIdFragment: string): Promise<void> {\n    const key = this.getSubChannelKey(channelId, vmIdFragment);\n    this.subChannelStates.delete(key);\n  }\n\n  // -------- Management Operations --------\n\n  async getStats(): Promise<CacheStats> {\n    const totalAccess = this.hitCount + this.missCount;\n\n    return {\n      channelCount: this.channelMetadata.size,\n      subChannelCount: this.subChannelStates.size,\n      hitRate: totalAccess > 0 ? this.hitCount / totalAccess : 0,\n      sizeBytes: this.estimateSize(),\n    };\n  }\n\n  async clear(): Promise<void> {\n    this.channelMetadata.clear();\n    this.subChannelStates.clear();\n    this.hitCount = 0;\n    this.missCount = 0;\n  }\n\n  private estimateSize(): number {\n    // Rough estimation of memory usage (avoiding BigInt serialization issues)\n    let size = 0;\n\n    for (const channel of this.channelMetadata.values()) {\n      // Simple estimation without JSON.stringify to avoid BigInt issues\n      size += channel.channelId.length * 2;\n      size += channel.payerDid.length * 2;\n      size += channel.payeeDid.length * 2;\n      size += channel.assetId.length * 2;\n      size += 100; // Rough estimate for bigint and other fields\n    }\n\n    for (const state of this.subChannelStates.values()) {\n      // Simple estimation without JSON.stringify to avoid BigInt issues\n      size += state.channelId.length * 2;\n      size += 200; // Rough estimate for bigint fields and numbers\n    }\n\n    return size;\n  }\n}\n","/**\n * Browser IndexedDB-based ChannelRepository implementation\n */\n\nimport type { ChannelInfo, SubChannelInfo } from '../../core/types';\nimport type { ChannelRepository } from '../interfaces/ChannelRepository';\nimport type {\n  PaginationParams,\n  ChannelFilter,\n  PaginatedResult,\n  CacheStats,\n} from '../types/pagination';\n\nexport class IndexedDBChannelRepository implements ChannelRepository {\n  private dbName = 'nuwa-payment-kit-channels';\n  private version = 1;\n\n  private async getDB(): Promise<IDBDatabase> {\n    return new Promise((resolve, reject) => {\n      const request = indexedDB.open(this.dbName, this.version);\n\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve(request.result);\n\n      request.onupgradeneeded = event => {\n        const db = (event.target as IDBOpenDBRequest).result;\n\n        // Channel metadata store\n        if (!db.objectStoreNames.contains('channels')) {\n          const store = db.createObjectStore('channels', { keyPath: 'channelId' });\n          store.createIndex('payerDid', 'payerDid', { unique: false });\n          store.createIndex('payeeDid', 'payeeDid', { unique: false });\n          store.createIndex('status', 'status', { unique: false });\n        }\n\n        // Sub-channel states store\n        if (!db.objectStoreNames.contains('subChannelStates')) {\n          const store = db.createObjectStore('subChannelStates', {\n            keyPath: ['channelId', 'vmIdFragment'],\n          });\n          store.createIndex('channelId', 'channelId', { unique: false });\n        }\n      };\n    });\n  }\n\n  // -------- Channel Metadata Operations --------\n\n  async getChannelMetadata(channelId: string): Promise<ChannelInfo | null> {\n    const db = await this.getDB();\n    const tx = db.transaction(['channels'], 'readonly');\n    const store = tx.objectStore('channels');\n\n    return new Promise((resolve, reject) => {\n      const request = store.get(channelId);\n      request.onsuccess = () => resolve(request.result || null);\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async setChannelMetadata(channelId: string, metadata: ChannelInfo): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['channels'], 'readwrite');\n    const store = tx.objectStore('channels');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.put({ ...metadata, channelId });\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async listChannelMetadata(\n    filter?: ChannelFilter,\n    pagination?: PaginationParams\n  ): Promise<PaginatedResult<ChannelInfo>> {\n    const db = await this.getDB();\n    const tx = db.transaction(['channels'], 'readonly');\n    const store = tx.objectStore('channels');\n\n    const channels: ChannelInfo[] = [];\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.openCursor();\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const channel = cursor.value as ChannelInfo;\n\n          // Apply filters\n          let includeChannel = true;\n          if (filter) {\n            if (filter.payerDid && channel.payerDid !== filter.payerDid) includeChannel = false;\n            if (filter.payeeDid && channel.payeeDid !== filter.payeeDid) includeChannel = false;\n            if (filter.status && channel.status !== filter.status) includeChannel = false;\n            if (filter.assetId && channel.assetId !== filter.assetId) includeChannel = false;\n            // Note: ChannelInfo doesn't have createdAt field in current definition\n            // These filters are not supported yet\n            // if (filter.createdAfter && channel.createdAt < filter.createdAfter) includeChannel = false;\n            // if (filter.createdBefore && channel.createdAt > filter.createdBefore) includeChannel = false;\n          }\n\n          if (includeChannel) {\n            channels.push(channel);\n          }\n\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n\n    const totalCount = channels.length;\n\n    // Apply pagination\n    const offset = pagination?.offset || 0;\n    const limit = pagination?.limit || 50;\n    const paginatedChannels = channels.slice(offset, offset + limit);\n\n    return {\n      items: paginatedChannels,\n      totalCount,\n      hasMore: offset + limit < totalCount,\n    };\n  }\n\n  async removeChannelMetadata(channelId: string): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['channels'], 'readwrite');\n    const store = tx.objectStore('channels');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.delete(channelId);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  // -------- Sub-Channel State Operations --------\n\n  async getSubChannelState(\n    channelId: string,\n    vmIdFragment: string\n  ): Promise<SubChannelInfo | null> {\n    const db = await this.getDB();\n    const tx = db.transaction(['subChannelStates'], 'readonly');\n    const store = tx.objectStore('subChannelStates');\n\n    const existing = await new Promise<SubChannelInfo | null>((resolve, reject) => {\n      const request = store.get([channelId, vmIdFragment]);\n      request.onsuccess = () => resolve(request.result || null);\n      request.onerror = () => reject(request.error);\n    });\n\n    if (existing) {\n      return {\n        ...existing,\n        lastConfirmedNonce: BigInt(\n          (existing as any).lastConfirmedNonce ?? (existing as any).nonce ?? 0\n        ),\n        lastClaimedAmount: BigInt(\n          (existing as any).lastClaimedAmount ?? (existing as any).accumulatedAmount ?? 0\n        ),\n      } as any;\n    }\n\n    return null;\n  }\n\n  async updateSubChannelState(\n    channelId: string,\n    vmIdFragment: string,\n    updates: Partial<SubChannelInfo>\n  ): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['subChannelStates'], 'readwrite');\n    const store = tx.objectStore('subChannelStates');\n\n    // Get existing state first\n    const existing = await new Promise<SubChannelInfo | null>((resolve, reject) => {\n      const request = store.get([channelId, vmIdFragment]);\n      request.onsuccess = () => resolve(request.result || null);\n      request.onerror = () => reject(request.error);\n    });\n\n    const baseState =\n      existing ||\n      ({\n        channelId,\n        vmIdFragment,\n        epoch: BigInt(0),\n        lastConfirmedNonce: BigInt(0),\n        lastClaimedAmount: BigInt(0),\n        lastUpdated: Date.now(),\n      } as any);\n\n    const updated = {\n      ...baseState,\n      ...updates,\n      channelId,\n      vmIdFragment,\n      lastUpdated: Date.now(),\n      // Convert bigints to strings for storage\n      lastConfirmedNonce:\n        (updates as any).lastConfirmedNonce?.toString() ||\n        (baseState as any).lastConfirmedNonce?.toString() ||\n        '0',\n      lastClaimedAmount:\n        (updates as any).lastClaimedAmount?.toString() ||\n        (baseState as any).lastClaimedAmount?.toString() ||\n        '0',\n    };\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.put(updated);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async listSubChannelStates(channelId: string): Promise<Record<string, SubChannelInfo>> {\n    const db = await this.getDB();\n    const tx = db.transaction(['subChannelStates'], 'readonly');\n    const store = tx.objectStore('subChannelStates');\n    const index = store.index('channelId');\n\n    const result: Record<string, SubChannelInfo> = {};\n\n    await new Promise<void>((resolve, reject) => {\n      const request = index.openCursor(IDBKeyRange.only(channelId));\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const state = cursor.value as any;\n          result[state.vmIdFragment] = {\n            ...state,\n            lastConfirmedNonce: BigInt((state as any).lastConfirmedNonce ?? state.nonce ?? 0),\n            lastClaimedAmount: BigInt(\n              (state as any).lastClaimedAmount ?? state.accumulatedAmount ?? 0\n            ),\n          } as any;\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n\n    return result;\n  }\n\n  async removeSubChannelState(channelId: string, vmIdFragment: string): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['subChannelStates'], 'readwrite');\n    const store = tx.objectStore('subChannelStates');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.delete([channelId, vmIdFragment]);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  // -------- Management Operations --------\n\n  async getStats(): Promise<CacheStats> {\n    const db = await this.getDB();\n\n    const channelCount = await new Promise<number>((resolve, reject) => {\n      const tx = db.transaction(['channels'], 'readonly');\n      const store = tx.objectStore('channels');\n      const request = store.count();\n\n      request.onsuccess = () => resolve(request.result);\n      request.onerror = () => reject(request.error);\n    });\n\n    const subChannelCount = await new Promise<number>((resolve, reject) => {\n      const tx = db.transaction(['subChannelStates'], 'readonly');\n      const store = tx.objectStore('subChannelStates');\n      const request = store.count();\n\n      request.onsuccess = () => resolve(request.result);\n      request.onerror = () => reject(request.error);\n    });\n\n    return {\n      channelCount,\n      subChannelCount,\n      hitRate: undefined, // Not tracked in IndexedDB implementation\n      sizeBytes: undefined, // Hard to estimate in IndexedDB\n    };\n  }\n\n  async clear(): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['channels', 'subChannelStates'], 'readwrite');\n\n    await Promise.all([\n      new Promise<void>((resolve, reject) => {\n        const request = tx.objectStore('channels').clear();\n        request.onsuccess = () => resolve();\n        request.onerror = () => reject(request.error);\n      }),\n      new Promise<void>((resolve, reject) => {\n        const request = tx.objectStore('subChannelStates').clear();\n        request.onsuccess = () => resolve();\n        request.onerror = () => reject(request.error);\n      }),\n    ]);\n  }\n}\n","/**\n * SQL-based ChannelRepository implementation for PostgreSQL/Supabase\n */\n\nimport type { Pool, PoolClient } from 'pg';\nimport type { ChannelRepository } from '../interfaces/ChannelRepository';\nimport type { ChannelInfo, SubChannelInfo } from '../../core/types';\nimport type {\n  PaginationParams,\n  ChannelFilter,\n  PaginatedResult,\n  CacheStats,\n} from '../types/pagination';\n\nexport interface SqlChannelRepositoryOptions {\n  /** PostgreSQL connection pool */\n  pool: Pool;\n  /** Table name prefix (default: 'nuwa_') */\n  tablePrefix?: string;\n  /** Auto-create tables if they don't exist */\n  autoMigrate?: boolean;\n  /** Allow unsafe auto-migration in production */\n  allowUnsafeAutoMigrateInProd?: boolean;\n}\n\n/**\n * PostgreSQL/Supabase implementation of ChannelRepository\n */\nexport class SqlChannelRepository implements ChannelRepository {\n  private pool: Pool;\n  private tablePrefix: string;\n  private autoMigrate: boolean;\n  private allowUnsafeAutoMigrateInProd: boolean;\n\n  constructor(options: SqlChannelRepositoryOptions) {\n    this.pool = options.pool;\n    this.tablePrefix = options.tablePrefix || 'nuwa_';\n    this.autoMigrate = options.autoMigrate ?? true;\n    this.allowUnsafeAutoMigrateInProd = options.allowUnsafeAutoMigrateInProd ?? false;\n\n    // Only auto-migrate in development or when explicitly allowed in production\n    if (\n      this.autoMigrate &&\n      (process.env.NODE_ENV !== 'production' || this.allowUnsafeAutoMigrateInProd)\n    ) {\n      this.initialize().catch(console.error);\n    }\n  }\n\n  private get channelsTable(): string {\n    return `${this.tablePrefix}channels`;\n  }\n\n  private get subChannelStatesTable(): string {\n    return `${this.tablePrefix}sub_channel_states`;\n  }\n\n  /**\n   * Initialize database tables if they don't exist\n   */\n  async initialize(): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      // Create channels table\n      await client.query(`\n        CREATE TABLE IF NOT EXISTS ${this.channelsTable} (\n          channel_id        TEXT PRIMARY KEY,\n          payer_did         TEXT NOT NULL,\n          payee_did         TEXT NOT NULL,\n          asset_id          TEXT NOT NULL,\n          status            TEXT NOT NULL,\n          balance           NUMERIC(78,0) NOT NULL,\n          created_at        BIGINT NOT NULL,\n          updated_at        BIGINT NOT NULL,\n          metadata          JSONB\n        )\n      `);\n\n      // Create sub-channel states table\n      await client.query(`\n        CREATE TABLE IF NOT EXISTS ${this.subChannelStatesTable} (\n          channel_id          TEXT NOT NULL,\n          vm_id_fragment      TEXT NOT NULL,\n          channel_id_ref      TEXT NOT NULL,\n          epoch               NUMERIC(78,0) NOT NULL DEFAULT 0,\n          last_confirmed_nonce NUMERIC(78,0) NOT NULL DEFAULT 0,\n          last_claimed_amount NUMERIC(78,0) NOT NULL DEFAULT 0,\n          last_update_time    BIGINT NOT NULL,\n          PRIMARY KEY(channel_id, vm_id_fragment)\n        )\n      `);\n\n      // Create indexes\n      await client.query(`\n        CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}channels_payer \n        ON ${this.channelsTable}(payer_did)\n      `);\n\n      await client.query(`\n        CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}channels_payee \n        ON ${this.channelsTable}(payee_did)\n      `);\n    } finally {\n      client.release();\n    }\n  }\n\n  // -------- Channel Metadata Operations --------\n\n  async getChannelMetadata(channelId: string): Promise<ChannelInfo | null> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT channel_id, payer_did, payee_did, asset_id, status, balance, created_at, updated_at, metadata\n        FROM ${this.channelsTable}\n        WHERE channel_id = $1\n      `,\n        [channelId]\n      );\n\n      if (result.rows.length === 0) {\n        return null;\n      }\n\n      const row = result.rows[0];\n      return {\n        channelId: row.channel_id,\n        payerDid: row.payer_did,\n        payeeDid: row.payee_did,\n        assetId: row.asset_id,\n        status: row.status,\n        epoch: row.metadata?.epoch ? BigInt(row.metadata.epoch) : BigInt(0),\n      };\n    } finally {\n      client.release();\n    }\n  }\n\n  async setChannelMetadata(channelId: string, metadata: ChannelInfo): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      const metadataJson = {\n        epoch: metadata.epoch?.toString(),\n        // Add any other metadata fields that aren't in the main columns\n      };\n\n      await client.query(\n        `\n        INSERT INTO ${this.channelsTable} \n        (channel_id, payer_did, payee_did, asset_id, status, balance, created_at, updated_at, metadata)\n        VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n        ON CONFLICT (channel_id) \n        DO UPDATE SET\n          payer_did = EXCLUDED.payer_did,\n          payee_did = EXCLUDED.payee_did,\n          asset_id = EXCLUDED.asset_id,\n          status = EXCLUDED.status,\n          balance = EXCLUDED.balance,\n          updated_at = EXCLUDED.updated_at,\n          metadata = EXCLUDED.metadata\n      `,\n        [\n          channelId,\n          metadata.payerDid,\n          metadata.payeeDid,\n          metadata.assetId,\n          metadata.status,\n          '0', // balance not in ChannelInfo\n          Date.now().toString(), // created_at\n          Date.now().toString(), // updated_at\n          JSON.stringify(metadataJson),\n        ]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  async listChannelMetadata(\n    filter?: ChannelFilter,\n    pagination?: PaginationParams\n  ): Promise<PaginatedResult<ChannelInfo>> {\n    const client = await this.pool.connect();\n    try {\n      let whereClause = '';\n      const params: any[] = [];\n      let paramIndex = 1;\n\n      // Build WHERE clause from filter\n      if (filter) {\n        const conditions: string[] = [];\n\n        if (filter.payerDid) {\n          conditions.push(`payer_did = $${paramIndex++}`);\n          params.push(filter.payerDid);\n        }\n\n        if (filter.payeeDid) {\n          conditions.push(`payee_did = $${paramIndex++}`);\n          params.push(filter.payeeDid);\n        }\n\n        if (filter.status) {\n          conditions.push(`status = $${paramIndex++}`);\n          params.push(filter.status);\n        }\n\n        if (conditions.length > 0) {\n          whereClause = `WHERE ${conditions.join(' AND ')}`;\n        }\n      }\n\n      // Build pagination\n      const limit = pagination?.limit || 50;\n      const offset = pagination?.offset || 0;\n\n      // Get total count\n      const countQuery = `SELECT COUNT(*) as total FROM ${this.channelsTable} ${whereClause}`;\n      const countResult = await client.query(countQuery, params);\n      const total = parseInt(countResult.rows[0].total);\n\n      // Get data\n      const dataQuery = `\n        SELECT channel_id, payer_did, payee_did, asset_id, status, balance, created_at, updated_at, metadata\n        FROM ${this.channelsTable} \n        ${whereClause}\n        ORDER BY created_at DESC\n        LIMIT $${paramIndex++} OFFSET $${paramIndex++}\n      `;\n      params.push(limit, offset);\n\n      const dataResult = await client.query(dataQuery, params);\n\n      const items = dataResult.rows.map(row => ({\n        channelId: row.channel_id,\n        payerDid: row.payer_did,\n        payeeDid: row.payee_did,\n        assetId: row.asset_id,\n        status: row.status,\n        epoch: row.metadata?.epoch ? BigInt(row.metadata.epoch) : BigInt(0),\n      }));\n\n      return {\n        items,\n        totalCount: total,\n        hasMore: offset + limit < total,\n      };\n    } finally {\n      client.release();\n    }\n  }\n\n  async removeChannelMetadata(channelId: string): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      await client.query(\n        `\n        DELETE FROM ${this.channelsTable} WHERE channel_id = $1\n      `,\n        [channelId]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  // -------- Sub-Channel State Operations --------\n\n  async getSubChannelState(\n    channelId: string,\n    vmIdFragment: string\n  ): Promise<SubChannelInfo | null> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT channel_id_ref, epoch, last_confirmed_nonce, last_claimed_amount, last_update_time, vm_id_fragment\n        FROM ${this.subChannelStatesTable}\n        WHERE channel_id = $1 AND vm_id_fragment = $2\n      `,\n        [channelId, vmIdFragment]\n      );\n\n      if (result.rows.length === 0) {\n        return null;\n      }\n\n      const row = result.rows[0];\n      return {\n        channelId: row.channel_id_ref,\n        vmIdFragment: row.vm_id_fragment,\n        epoch: BigInt(row.epoch),\n        lastConfirmedNonce: BigInt(row.last_confirmed_nonce),\n        lastClaimedAmount: BigInt(row.last_claimed_amount),\n        lastUpdated: parseInt(row.last_update_time),\n      } as any;\n    } finally {\n      client.release();\n    }\n  }\n\n  async updateSubChannelState(\n    channelId: string,\n    vmIdFragment: string,\n    updates: Partial<SubChannelInfo>\n  ): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      // First, get current state or create default\n      const current =\n        (await this.getSubChannelState(channelId, vmIdFragment)) ||\n        ({\n          channelId,\n          vmIdFragment,\n          epoch: BigInt(0),\n          lastConfirmedNonce: BigInt(0),\n          lastClaimedAmount: BigInt(0),\n          lastUpdated: Date.now(),\n        } as any);\n\n      // Apply updates\n      const newState: any = {\n        channelId: (updates as any).channelId ?? current.channelId,\n        epoch: (updates as any).epoch ?? current.epoch,\n        lastConfirmedNonce: (updates as any).lastConfirmedNonce ?? current.lastConfirmedNonce,\n        lastClaimedAmount: (updates as any).lastClaimedAmount ?? current.lastClaimedAmount,\n        lastUpdated: (updates as any).lastUpdated ?? Date.now(),\n      };\n\n      await client.query(\n        `\n        INSERT INTO ${this.subChannelStatesTable} \n        (channel_id, vm_id_fragment, channel_id_ref, epoch, last_confirmed_nonce, last_claimed_amount, last_update_time)\n        VALUES ($1, $2, $3, $4, $5, $6, $7)\n        ON CONFLICT (channel_id, vm_id_fragment) \n        DO UPDATE SET\n          channel_id_ref = EXCLUDED.channel_id_ref,\n          epoch = EXCLUDED.epoch,\n          last_confirmed_nonce = EXCLUDED.last_confirmed_nonce,\n          last_claimed_amount = EXCLUDED.last_claimed_amount,\n          last_update_time = EXCLUDED.last_update_time\n      `,\n        [\n          channelId,\n          vmIdFragment,\n          newState.channelId,\n          newState.epoch.toString(),\n          newState.lastConfirmedNonce.toString(),\n          newState.lastClaimedAmount.toString(),\n          newState.lastUpdated.toString(),\n        ]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  async listSubChannelStates(channelId: string): Promise<Record<string, SubChannelInfo>> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT vm_id_fragment, channel_id_ref, epoch, last_confirmed_nonce, last_claimed_amount, last_update_time\n        FROM ${this.subChannelStatesTable}\n        WHERE channel_id = $1\n      `,\n        [channelId]\n      );\n\n      const states: Record<string, SubChannelInfo> = {};\n\n      for (const row of result.rows) {\n        states[row.vm_id_fragment] = {\n          channelId: row.channel_id_ref,\n          vmIdFragment: row.vm_id_fragment,\n          epoch: BigInt(row.epoch),\n          lastConfirmedNonce: BigInt(row.last_confirmed_nonce),\n          lastClaimedAmount: BigInt(row.last_claimed_amount),\n          lastUpdated: parseInt(row.last_update_time),\n        } as any;\n      }\n\n      return states;\n    } finally {\n      client.release();\n    }\n  }\n\n  async removeSubChannelState(channelId: string, vmIdFragment: string): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      await client.query(\n        `\n        DELETE FROM ${this.subChannelStatesTable} \n        WHERE channel_id = $1 AND vm_id_fragment = $2\n      `,\n        [channelId, vmIdFragment]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  // -------- Management Operations --------\n\n  async getStats(): Promise<CacheStats> {\n    const client = await this.pool.connect();\n    try {\n      const channelResult = await client.query(`\n        SELECT COUNT(*) as total_channels FROM ${this.channelsTable}\n      `);\n\n      const subChannelResult = await client.query(`\n        SELECT COUNT(*) as total_sub_channels FROM ${this.subChannelStatesTable}\n      `);\n\n      return {\n        channelCount: parseInt(channelResult.rows[0].total_channels),\n        subChannelCount: parseInt(subChannelResult.rows[0].total_sub_channels),\n        hitRate: 0, // TODO: Could calculate actual size if needed\n        sizeBytes: 0, // TODO: Could calculate actual size if needed\n      };\n    } finally {\n      client.release();\n    }\n  }\n\n  async clear(): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      await client.query(`DELETE FROM ${this.subChannelStatesTable}`);\n      await client.query(`DELETE FROM ${this.channelsTable}`);\n    } finally {\n      client.release();\n    }\n  }\n}\n","/**\n * Factory function for creating ChannelRepository instances\n */\n\nimport type { Pool } from 'pg';\nimport type { ChannelRepository } from '../interfaces/ChannelRepository';\nimport { MemoryChannelRepository } from '../memory/channel.memory';\nimport { IndexedDBChannelRepository } from '../indexeddb/channel.indexeddb';\nimport { SqlChannelRepository, type SqlChannelRepositoryOptions } from '../sql/channel.sql';\n\nexport interface ChannelRepositoryOptions {\n  /** Backend type to use */\n  backend?: 'memory' | 'indexeddb' | 'sql';\n  /** Database connection string for SQL backends */\n  connectionString?: string;\n  /** PostgreSQL connection pool (alternative to connectionString) */\n  pool?: Pool;\n  /** Table name prefix for SQL backends */\n  tablePrefix?: string;\n  /** Auto-create tables if they don't exist */\n  autoMigrate?: boolean;\n  /** Allow unsafe auto-migration in production */\n  allowUnsafeAutoMigrateInProd?: boolean;\n}\n\n/**\n * Create a ChannelRepository instance based on the specified backend\n */\nexport function createChannelRepo(options: ChannelRepositoryOptions = {}): ChannelRepository {\n  const { backend = 'memory' } = options;\n\n  switch (backend) {\n    case 'memory':\n      return new MemoryChannelRepository();\n\n    case 'indexeddb':\n      if (typeof window === 'undefined' || !window.indexedDB) {\n        throw new Error('IndexedDB is not available in this environment');\n      }\n      return new IndexedDBChannelRepository();\n\n    case 'sql':\n      // Do not create pool here; caller must provide a Pool (Node-only)\n      if (!options.pool) {\n        throw new Error('SQL backend requires a PostgreSQL connection pool');\n      }\n\n      const sqlOptions: SqlChannelRepositoryOptions = {\n        pool: options.pool,\n        tablePrefix: options.tablePrefix,\n        autoMigrate: options.autoMigrate,\n        allowUnsafeAutoMigrateInProd: options.allowUnsafeAutoMigrateInProd,\n      };\n\n      return new SqlChannelRepository(sqlOptions);\n\n    default:\n      throw new Error(`Unknown backend type: ${backend}`);\n  }\n}\n","/**\n * Memory-based implementation of RAVRepository\n * For testing and development environments\n */\n\nimport type { SignedSubRAV } from '../../core/types';\nimport type { RAVRepository } from '../interfaces/RAVRepository';\n\nexport class MemoryRAVRepository implements RAVRepository {\n  private ravs = new Map<string, SignedSubRAV[]>();\n  private claimedNonces = new Map<string, bigint>();\n\n  private getKey(channelId: string, vmIdFragment: string): string {\n    return `${channelId}:${vmIdFragment}`;\n  }\n\n  async save(rav: SignedSubRAV): Promise<void> {\n    const key = this.getKey(rav.subRav.channelId, rav.subRav.vmIdFragment);\n\n    if (!this.ravs.has(key)) {\n      this.ravs.set(key, []);\n    }\n\n    const ravList = this.ravs.get(key)!;\n\n    // Check if RAV with same nonce already exists (idempotent)\n    const existing = ravList.find(r => r.subRav.nonce === rav.subRav.nonce);\n    if (existing) {\n      return; // Already exists\n    }\n\n    // Insert in sorted order by nonce\n    ravList.push(rav);\n    ravList.sort((a, b) => Number(a.subRav.nonce - b.subRav.nonce));\n  }\n\n  async get(channelId: string, vmIdFragment: string, nonce: bigint): Promise<SignedSubRAV | null> {\n    const key = this.getKey(channelId, vmIdFragment);\n    const ravList = this.ravs.get(key);\n    if (!ravList) {\n      return null;\n    }\n\n    const rav = ravList.find(r => r.subRav.nonce === nonce);\n    if (!rav) {\n      return null;\n    }\n    return rav;\n  }\n\n  async getLatest(channelId: string, vmIdFragment: string): Promise<SignedSubRAV | null> {\n    const key = this.getKey(channelId, vmIdFragment);\n    const ravList = this.ravs.get(key);\n\n    if (!ravList || ravList.length === 0) {\n      return null;\n    }\n\n    return ravList[ravList.length - 1];\n  }\n\n  async *list(channelId: string): AsyncIterable<SignedSubRAV> {\n    for (const [key, ravList] of this.ravs.entries()) {\n      if (key.startsWith(channelId + ':')) {\n        for (const rav of ravList) {\n          yield rav;\n        }\n      }\n    }\n  }\n\n  async getUnclaimedRAVs(channelId: string): Promise<Map<string, SignedSubRAV>> {\n    const result = new Map<string, SignedSubRAV>();\n\n    for (const [key, ravList] of this.ravs.entries()) {\n      if (key.startsWith(channelId + ':')) {\n        const vmIdFragment = key.split(':')[1];\n        const claimedNonce = this.claimedNonces.get(key) || BigInt(0);\n\n        // Find the latest unclaimed RAV\n        for (let i = ravList.length - 1; i >= 0; i--) {\n          const rav = ravList[i];\n          if (rav.subRav.nonce > claimedNonce) {\n            result.set(vmIdFragment, rav);\n            break;\n          }\n        }\n      }\n    }\n\n    return result;\n  }\n\n  async markAsClaimed(channelId: string, vmIdFragment: string, nonce: bigint): Promise<void> {\n    const key = this.getKey(channelId, vmIdFragment);\n    this.claimedNonces.set(key, nonce);\n  }\n\n  async getStats(): Promise<{ totalRAVs: number; unclaimedRAVs: number }> {\n    let totalRAVs = 0;\n    let unclaimedRAVs = 0;\n\n    for (const [key, ravList] of this.ravs.entries()) {\n      totalRAVs += ravList.length;\n\n      const claimedNonce = this.claimedNonces.get(key) || BigInt(0);\n      for (const rav of ravList) {\n        if (rav.subRav.nonce > claimedNonce) {\n          unclaimedRAVs++;\n        }\n      }\n    }\n\n    return { totalRAVs, unclaimedRAVs };\n  }\n\n  async cleanup(): Promise<number> {\n    let cleanedCount = 0;\n\n    for (const [key, ravList] of this.ravs.entries()) {\n      const claimedNonce = this.claimedNonces.get(key);\n      if (claimedNonce !== undefined) {\n        const originalLength = ravList.length;\n\n        // Remove claimed RAVs\n        this.ravs.set(\n          key,\n          ravList.filter(rav => rav.subRav.nonce > claimedNonce)\n        );\n\n        cleanedCount += originalLength - this.ravs.get(key)!.length;\n      }\n    }\n\n    return cleanedCount;\n  }\n}\n","/**\n * Browser IndexedDB-based RAVRepository implementation\n */\n\nimport type { SignedSubRAV } from '../../core/types';\nimport type { RAVRepository } from '../interfaces/RAVRepository';\n\nexport class IndexedDBRAVRepository implements RAVRepository {\n  private dbName = 'nuwa-payment-kit-ravs';\n  private version = 1;\n\n  private async getDB(): Promise<IDBDatabase> {\n    return new Promise((resolve, reject) => {\n      const request = indexedDB.open(this.dbName, this.version);\n\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve(request.result);\n\n      request.onupgradeneeded = event => {\n        const db = (event.target as IDBOpenDBRequest).result;\n\n        // RAVs store\n        if (!db.objectStoreNames.contains('ravs')) {\n          const store = db.createObjectStore('ravs', {\n            keyPath: ['channelId', 'vmIdFragment', 'nonce'],\n          });\n          store.createIndex('channelId', 'channelId', { unique: false });\n          store.createIndex('channel_vm', ['channelId', 'vmIdFragment'], { unique: false });\n        }\n\n        // Claims tracking store\n        if (!db.objectStoreNames.contains('claims')) {\n          db.createObjectStore('claims', {\n            keyPath: ['channelId', 'vmIdFragment'],\n          });\n        }\n      };\n    });\n  }\n\n  async save(rav: SignedSubRAV): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['ravs'], 'readwrite');\n    const store = tx.objectStore('ravs');\n\n    const record = {\n      channelId: rav.subRav.channelId,\n      vmIdFragment: rav.subRav.vmIdFragment,\n      nonce: rav.subRav.nonce.toString(),\n      accumulatedAmount: rav.subRav.accumulatedAmount.toString(),\n      ravData: rav,\n      timestamp: Date.now(),\n    };\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.put(record);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async get(channelId: string, vmIdFragment: string, nonce: bigint): Promise<SignedSubRAV | null> {\n    const db = await this.getDB();\n    const tx = db.transaction(['ravs'], 'readonly');\n    const store = tx.objectStore('ravs');\n\n    return new Promise((resolve, reject) => {\n      const key = [channelId, vmIdFragment, nonce.toString()];\n      const request = store.get(key);\n      request.onsuccess = () => {\n        if (request.result) {\n          resolve(request.result.ravData);\n        } else {\n          resolve(null);\n        }\n      };\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async getLatest(channelId: string, vmIdFragment: string): Promise<SignedSubRAV | null> {\n    const db = await this.getDB();\n    const tx = db.transaction(['ravs'], 'readonly');\n    const store = tx.objectStore('ravs');\n    const index = store.index('channel_vm');\n\n    return new Promise((resolve, reject) => {\n      const request = index.openCursor(\n        IDBKeyRange.only([channelId, vmIdFragment]),\n        'prev' // Latest first\n      );\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          resolve(cursor.value.ravData);\n        } else {\n          resolve(null);\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async *list(channelId: string): AsyncIterable<SignedSubRAV> {\n    const db = await this.getDB();\n    const tx = db.transaction(['ravs'], 'readonly');\n    const store = tx.objectStore('ravs');\n    const index = store.index('channelId');\n\n    const request = index.openCursor(IDBKeyRange.only(channelId));\n\n    while (true) {\n      const cursor = await new Promise<IDBCursorWithValue | null>((resolve, reject) => {\n        request.onsuccess = () => resolve(request.result);\n        request.onerror = () => reject(request.error);\n      });\n\n      if (!cursor) break;\n\n      yield cursor.value.ravData;\n      cursor.continue();\n    }\n  }\n\n  async getUnclaimedRAVs(channelId: string): Promise<Map<string, SignedSubRAV>> {\n    const result = new Map<string, SignedSubRAV>();\n\n    // Get claimed nonces first\n    const claimedNonces = await this.getClaimedNonces(channelId);\n\n    for await (const rav of this.list(channelId)) {\n      const vmIdFragment = rav.subRav.vmIdFragment;\n      const claimedNonce = claimedNonces.get(vmIdFragment) || BigInt(0);\n\n      if (rav.subRav.nonce > claimedNonce) {\n        const existing = result.get(vmIdFragment);\n        if (!existing || rav.subRav.nonce > existing.subRav.nonce) {\n          result.set(vmIdFragment, rav);\n        }\n      }\n    }\n\n    return result;\n  }\n\n  private async getClaimedNonces(channelId: string): Promise<Map<string, bigint>> {\n    const db = await this.getDB();\n    const tx = db.transaction(['claims'], 'readonly');\n    const store = tx.objectStore('claims');\n\n    const result = new Map<string, bigint>();\n\n    return new Promise((resolve, reject) => {\n      const request = store.openCursor();\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const record = cursor.value;\n          if (record.channelId === channelId) {\n            result.set(record.vmIdFragment, BigInt(record.claimedNonce));\n          }\n          cursor.continue();\n        } else {\n          resolve(result);\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async markAsClaimed(channelId: string, vmIdFragment: string, nonce: bigint): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['claims'], 'readwrite');\n    const store = tx.objectStore('claims');\n\n    const record = {\n      channelId,\n      vmIdFragment,\n      claimedNonce: nonce.toString(),\n      timestamp: Date.now(),\n    };\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.put(record);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async getStats(): Promise<{ totalRAVs: number; unclaimedRAVs: number }> {\n    const db = await this.getDB();\n\n    // Count total RAVs\n    const totalRAVs = await new Promise<number>((resolve, reject) => {\n      const tx = db.transaction(['ravs'], 'readonly');\n      const store = tx.objectStore('ravs');\n      const request = store.count();\n\n      request.onsuccess = () => resolve(request.result);\n      request.onerror = () => reject(request.error);\n    });\n\n    // Count unclaimed RAVs (this is an approximation - could be more precise)\n    let unclaimedRAVs = 0;\n    const channelVMs = new Set<string>();\n\n    // First pass: collect all channel-vm combinations\n    const tx1 = db.transaction(['ravs'], 'readonly');\n    const store1 = tx1.objectStore('ravs');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store1.openCursor();\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const record = cursor.value;\n          channelVMs.add(`${record.channelId}:${record.vmIdFragment}`);\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n\n    // For each channel-vm combination, check if there are unclaimed RAVs\n    for (const channelVM of channelVMs) {\n      const [channelId, vmIdFragment] = channelVM.split(':');\n      const unclaimed = await this.getUnclaimedRAVs(channelId);\n      if (unclaimed.has(vmIdFragment)) {\n        unclaimedRAVs++;\n      }\n    }\n\n    return { totalRAVs, unclaimedRAVs };\n  }\n\n  async cleanup(): Promise<number> {\n    // For IndexedDB, we can implement cleanup by removing claimed RAVs\n    let cleanedCount = 0;\n    const db = await this.getDB();\n\n    // Get all claimed nonces\n    const claimedNonces = new Map<string, bigint>();\n    const tx1 = db.transaction(['claims'], 'readonly');\n    const store1 = tx1.objectStore('claims');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store1.openCursor();\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const record = cursor.value;\n          claimedNonces.set(\n            `${record.channelId}:${record.vmIdFragment}`,\n            BigInt(record.claimedNonce)\n          );\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n\n    // Remove claimed RAVs\n    const tx2 = db.transaction(['ravs'], 'readwrite');\n    const store2 = tx2.objectStore('ravs');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store2.openCursor();\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const record = cursor.value;\n          const key = `${record.channelId}:${record.vmIdFragment}`;\n          const claimedNonce = claimedNonces.get(key);\n\n          if (claimedNonce && BigInt(record.nonce) <= claimedNonce) {\n            cursor.delete();\n            cleanedCount++;\n          }\n\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n\n    return cleanedCount;\n  }\n}\n","/**\n * BCS serialization utilities for SQL storage\n * Uses SubRAVCodec to ensure consistency with Move contracts\n */\n\nimport { SubRAVCodec } from '../../core/SubRav';\nimport type { SubRAV } from '../../core/types';\n\n/**\n * Encode SubRAV to Buffer using BCS serialization\n * This ensures cross-platform consistency with Move contracts\n */\nexport function encodeSubRAV(subRav: SubRAV): Buffer {\n  try {\n    const bytes = SubRAVCodec.encode(subRav);\n    return Buffer.from(bytes);\n  } catch (error) {\n    throw new Error(\n      `Failed to encode SubRAV: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n/**\n * Decode Buffer to SubRAV using BCS deserialization\n */\nexport function decodeSubRAV(buffer: Buffer): SubRAV {\n  try {\n    const bytes = new Uint8Array(buffer);\n    return SubRAVCodec.decode(bytes);\n  } catch (error) {\n    throw new Error(\n      `Failed to decode SubRAV: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n/**\n * Get BCS hex representation of SubRAV (useful for debugging and contract calls)\n */\nexport function getSubRAVHex(subRav: SubRAV): string {\n  return SubRAVCodec.toHex(subRav);\n}\n","/**\n * SQL-based RAVRepository implementation for PostgreSQL/Supabase\n */\n\n// Note: 'pg' is an optional dependency. Install with: npm install pg @types/pg\nimport type { Pool, PoolClient } from 'pg';\nimport { encodeSubRAV, decodeSubRAV } from './serialization';\nimport type { RAVRepository } from '../interfaces/RAVRepository';\nimport type { SignedSubRAV } from '../../core/types';\n\nexport interface SqlRAVRepositoryOptions {\n  /** PostgreSQL connection pool */\n  pool: Pool;\n  /** Table name prefix (default: 'nuwa_') */\n  tablePrefix?: string;\n  /** Auto-create tables if they don't exist */\n  autoMigrate?: boolean;\n  /** Allow unsafe auto-migration in production */\n  allowUnsafeAutoMigrateInProd?: boolean;\n}\n\n/**\n * PostgreSQL/Supabase implementation of RAVRepository\n *\n * Compatible with both self-hosted Postgres and Supabase\n * Uses standard SQL that works across both platforms\n */\nexport class SqlRAVRepository implements RAVRepository {\n  private pool: Pool;\n  private tablePrefix: string;\n  private autoMigrate: boolean;\n  private allowUnsafeAutoMigrateInProd: boolean;\n\n  constructor(options: SqlRAVRepositoryOptions) {\n    this.pool = options.pool;\n    this.tablePrefix = options.tablePrefix || 'nuwa_';\n    this.autoMigrate = options.autoMigrate ?? true;\n    this.allowUnsafeAutoMigrateInProd = options.allowUnsafeAutoMigrateInProd ?? false;\n\n    // Only auto-migrate in development or when explicitly allowed in production\n    if (this.autoMigrate) {\n      if (process.env.NODE_ENV === 'production' && this.allowUnsafeAutoMigrateInProd) {\n        // Unsafe auto-migration in production – proceed only if explicitly allowed\n      } else if (process.env.NODE_ENV === 'production') {\n        throw new Error(\n          \"Auto-migration is disabled in production by default. To enable it, set 'allowUnsafeAutoMigrateInProd' to true \" +\n            'and acknowledge the risks.'\n        );\n      }\n      this.initialize().catch(() => {});\n    }\n  }\n\n  private get ravsTable(): string {\n    return `${this.tablePrefix}ravs`;\n  }\n\n  private get claimsTable(): string {\n    return `${this.tablePrefix}claims`;\n  }\n\n  /**\n   * Initialize database tables if they don't exist\n   */\n  async initialize(): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      // Create RAVs table\n      await client.query(`\n        CREATE TABLE IF NOT EXISTS ${this.ravsTable} (\n          id                SERIAL PRIMARY KEY,\n          channel_id        TEXT NOT NULL,\n          vm_id_fragment    TEXT NOT NULL,\n          nonce             NUMERIC(78,0) NOT NULL,\n          accumulated_amount NUMERIC(78,0) NOT NULL,\n          sub_rav_bcs       BYTEA NOT NULL,\n          signature         BYTEA NOT NULL,\n          created_at        TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n          UNIQUE(channel_id, vm_id_fragment, nonce)\n        )\n      `);\n\n      // Create index for efficient queries\n      await client.query(`\n        CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}ravs_channel \n        ON ${this.ravsTable}(channel_id)\n      `);\n\n      await client.query(`\n        CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}ravs_channel_vm \n        ON ${this.ravsTable}(channel_id, vm_id_fragment)\n      `);\n\n      // Create claims tracking table\n      await client.query(`\n        CREATE TABLE IF NOT EXISTS ${this.claimsTable} (\n          channel_id        TEXT NOT NULL,\n          vm_id_fragment    TEXT NOT NULL,\n          claimed_nonce     NUMERIC(78,0) NOT NULL,\n          claimed_at        TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n          tx_hash          TEXT,\n          PRIMARY KEY(channel_id, vm_id_fragment)\n        )\n      `);\n    } finally {\n      client.release();\n    }\n  }\n\n  async save(rav: SignedSubRAV): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      // Encode SubRAV using BCS serialization\n      const subRavBcs = encodeSubRAV(rav.subRav);\n      const signature = Buffer.from(rav.signature);\n\n      await client.query(\n        `\n        INSERT INTO ${this.ravsTable} \n        (channel_id, vm_id_fragment, nonce, accumulated_amount, sub_rav_bcs, signature)\n        VALUES ($1, $2, $3, $4, $5, $6)\n        ON CONFLICT (channel_id, vm_id_fragment, nonce) \n        DO NOTHING\n      `,\n        [\n          rav.subRav.channelId,\n          rav.subRav.vmIdFragment,\n          rav.subRav.nonce.toString(),\n          rav.subRav.accumulatedAmount.toString(),\n          subRavBcs,\n          signature,\n        ]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  async get(channelId: string, vmIdFragment: string, nonce: bigint): Promise<SignedSubRAV | null> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT sub_rav_bcs, signature \n        FROM ${this.ravsTable}\n        WHERE channel_id = $1 AND vm_id_fragment = $2 AND nonce = $3\n      `,\n        [channelId, vmIdFragment, nonce.toString()]\n      );\n\n      if (result.rows.length === 0) {\n        return null;\n      }\n\n      const subRavBcs = result.rows[0].sub_rav_bcs as Buffer;\n      const signature = result.rows[0].signature as Buffer;\n\n      const subRav = decodeSubRAV(subRavBcs);\n      return {\n        subRav,\n        signature: new Uint8Array(signature),\n      };\n    } finally {\n      client.release();\n    }\n  }\n\n  async getLatest(channelId: string, vmIdFragment: string): Promise<SignedSubRAV | null> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT sub_rav_bcs, signature \n        FROM ${this.ravsTable}\n        WHERE channel_id = $1 AND vm_id_fragment = $2\n        ORDER BY nonce DESC\n        LIMIT 1\n      `,\n        [channelId, vmIdFragment]\n      );\n\n      if (result.rows.length === 0) {\n        return null;\n      }\n\n      const subRavBcs = result.rows[0].sub_rav_bcs as Buffer;\n      const signature = result.rows[0].signature as Buffer;\n\n      const subRav = decodeSubRAV(subRavBcs);\n      return {\n        subRav,\n        signature: new Uint8Array(signature),\n      };\n    } finally {\n      client.release();\n    }\n  }\n\n  async *list(channelId: string): AsyncIterable<SignedSubRAV> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT sub_rav_bcs, signature\n        FROM ${this.ravsTable}\n        WHERE channel_id = $1\n        ORDER BY vm_id_fragment, nonce\n      `,\n        [channelId]\n      );\n\n      for (const row of result.rows) {\n        const subRavBcs = row.sub_rav_bcs as Buffer;\n        const signature = row.signature as Buffer;\n\n        const subRav = decodeSubRAV(subRavBcs);\n        yield {\n          subRav,\n          signature: new Uint8Array(signature),\n        };\n      }\n    } finally {\n      client.release();\n    }\n  }\n\n  async getUnclaimedRAVs(channelId: string): Promise<Map<string, SignedSubRAV>> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT DISTINCT ON (r.vm_id_fragment) \n               r.vm_id_fragment, r.sub_rav_bcs, r.signature\n        FROM ${this.ravsTable} r\n        LEFT JOIN ${this.claimsTable} c \n          ON r.channel_id = c.channel_id \n          AND r.vm_id_fragment = c.vm_id_fragment\n        WHERE r.channel_id = $1 \n          AND (c.claimed_nonce IS NULL OR r.nonce > c.claimed_nonce)\n        ORDER BY r.vm_id_fragment, r.nonce DESC\n      `,\n        [channelId]\n      );\n\n      const unclaimedRAVs = new Map<string, SignedSubRAV>();\n\n      for (const row of result.rows) {\n        const subRavBcs = row.sub_rav_bcs as Buffer;\n        const signature = row.signature as Buffer;\n\n        const subRav = decodeSubRAV(subRavBcs);\n        const signedSubRAV = {\n          subRav,\n          signature: new Uint8Array(signature),\n        };\n\n        unclaimedRAVs.set(row.vm_id_fragment, signedSubRAV);\n      }\n\n      return unclaimedRAVs;\n    } finally {\n      client.release();\n    }\n  }\n\n  async markAsClaimed(channelId: string, vmIdFragment: string, nonce: bigint): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      await client.query(\n        `\n        INSERT INTO ${this.claimsTable} \n        (channel_id, vm_id_fragment, claimed_nonce)\n        VALUES ($1, $2, $3)\n        ON CONFLICT (channel_id, vm_id_fragment) \n        DO UPDATE SET \n          claimed_nonce = GREATEST(${this.claimsTable}.claimed_nonce, EXCLUDED.claimed_nonce),\n          claimed_at = NOW()\n      `,\n        [channelId, vmIdFragment, nonce.toString()]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  async getStats(): Promise<{ totalRAVs: number; unclaimedRAVs: number }> {\n    const client = await this.pool.connect();\n    try {\n      // Get total RAVs count\n      const totalResult = await client.query(`\n        SELECT COUNT(*) as total_ravs FROM ${this.ravsTable}\n      `);\n      const totalRAVs = parseInt(totalResult.rows[0].total_ravs);\n\n      // Get unclaimed RAVs count (count distinct vm_id_fragments with unclaimed RAVs)\n      const unclaimedResult = await client.query(`\n        SELECT COUNT(DISTINCT r.vm_id_fragment) as unclaimed_ravs\n        FROM ${this.ravsTable} r\n        LEFT JOIN ${this.claimsTable} c \n          ON r.channel_id = c.channel_id \n          AND r.vm_id_fragment = c.vm_id_fragment\n        WHERE c.claimed_nonce IS NULL OR r.nonce > c.claimed_nonce\n      `);\n      const unclaimedRAVs = parseInt(unclaimedResult.rows[0].unclaimed_ravs);\n\n      return { totalRAVs, unclaimedRAVs };\n    } finally {\n      client.release();\n    }\n  }\n\n  async cleanup(): Promise<number> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(`\n        DELETE FROM ${this.ravsTable} r\n        WHERE EXISTS (\n          SELECT 1 FROM ${this.claimsTable} c\n          WHERE c.channel_id = r.channel_id \n            AND c.vm_id_fragment = r.vm_id_fragment\n            AND r.nonce <= c.claimed_nonce\n        )\n      `);\n\n      return result.rowCount || 0;\n    } finally {\n      client.release();\n    }\n  }\n}\n","/**\n * Factory function for creating RAV repositories\n */\n\nimport type { Pool } from 'pg';\nimport type { RAVRepository } from '../interfaces/RAVRepository';\nimport { MemoryRAVRepository } from '../memory/rav.memory';\nimport { IndexedDBRAVRepository } from '../indexeddb/rav.indexeddb';\nimport { SqlRAVRepository, type SqlRAVRepositoryOptions } from '../sql/rav.sql';\n\nexport interface RAVRepositoryOptions {\n  /** Backend type to use */\n  backend?: 'memory' | 'indexeddb' | 'sql';\n  /** Database connection string for SQL backends */\n  connectionString?: string;\n  /** PostgreSQL connection pool (alternative to connectionString) */\n  pool?: Pool;\n  /** Table name prefix for SQL backends */\n  tablePrefix?: string;\n  /** Auto-create tables if they don't exist */\n  autoMigrate?: boolean;\n  /** Allow unsafe auto-migration in production */\n  allowUnsafeAutoMigrateInProd?: boolean;\n}\n\n/**\n * Create a RAV repository instance based on the specified backend\n */\nexport function createRAVRepo(options: RAVRepositoryOptions = {}): RAVRepository {\n  const { backend = 'memory' } = options;\n\n  switch (backend) {\n    case 'memory':\n      return new MemoryRAVRepository();\n\n    case 'indexeddb':\n      if (typeof window === 'undefined' || !window.indexedDB) {\n        throw new Error('IndexedDB is not available in this environment');\n      }\n      return new IndexedDBRAVRepository();\n\n    case 'sql':\n      // Do not create pool here; caller must provide a Pool (Node-only)\n      if (!options.pool) {\n        throw new Error('SQL backend requires a PostgreSQL connection pool');\n      }\n\n      const sqlOptions: SqlRAVRepositoryOptions = {\n        pool: options.pool,\n        tablePrefix: options.tablePrefix,\n        autoMigrate: options.autoMigrate,\n        allowUnsafeAutoMigrateInProd: options.allowUnsafeAutoMigrateInProd,\n      };\n\n      return new SqlRAVRepository(sqlOptions);\n\n    default:\n      throw new Error(`Unknown backend type: ${backend}`);\n  }\n}\n","/**\n * Memory-based implementation of PendingSubRAVRepository\n * For testing and development environments\n */\n\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport type { SubRAV } from '../../core/types';\nimport type { PendingSubRAVRepository } from '../interfaces/PendingSubRAVRepository';\nimport type { PendingSubRAVStats } from '../types/pagination';\n\nexport class MemoryPendingSubRAVRepository implements PendingSubRAVRepository {\n  private proposals = new Map<string, { subRAV: SubRAV; timestamp: number }>();\n  private logger: DebugLogger = DebugLogger.get('pendingSubRavMemory');\n  private getKey(channelId: string, vmIdFragment: string, nonce: bigint): string {\n    return `${channelId}:${vmIdFragment}:${nonce}`;\n  }\n\n  async save(subRAV: SubRAV): Promise<void> {\n    const key = this.getKey(subRAV.channelId, subRAV.vmIdFragment, subRAV.nonce);\n    this.logger.debug('Saving sub-RAV', { key, subRAV });\n    this.proposals.set(key, {\n      subRAV: { ...subRAV }, // Deep copy to avoid mutations\n      timestamp: Date.now(),\n    });\n  }\n\n  async find(channelId: string, vmIdFragment: string, nonce: bigint): Promise<SubRAV | null> {\n    const key = this.getKey(channelId, vmIdFragment, nonce);\n    const entry = this.proposals.get(key);\n\n    if (!entry) {\n      return null;\n    }\n\n    return { ...entry.subRAV }; // Return copy to avoid mutations\n  }\n\n  async findLatestBySubChannel(channelId: string, vmIdFragment: string): Promise<SubRAV | null> {\n    let latestSubRAV: SubRAV | null = null;\n    let maxNonce = BigInt(-1);\n\n    for (const [key, entry] of this.proposals) {\n      if (key.startsWith(`${channelId}:${vmIdFragment}:`)) {\n        const subRAV = entry.subRAV;\n        if (subRAV.nonce > maxNonce) {\n          maxNonce = subRAV.nonce;\n          latestSubRAV = subRAV;\n        }\n      }\n    }\n    this.logger.debug('Latest sub-RAV', { channelId, vmIdFragment, latestSubRAV });\n    return latestSubRAV ? { ...latestSubRAV } : null; // Return copy to avoid mutations\n  }\n\n  async remove(channelId: string, vmIdFragment: string, nonce: bigint): Promise<void> {\n    this.logger.debug('Removing sub-RAV', { channelId, vmIdFragment, nonce });\n    const key = this.getKey(channelId, vmIdFragment, nonce);\n    this.proposals.delete(key);\n  }\n\n  async cleanup(maxAgeMs: number = 30 * 60 * 1000): Promise<number> {\n    const now = Date.now();\n    const cutoff = now - maxAgeMs;\n    let cleanedCount = 0;\n\n    for (const [key, entry] of this.proposals.entries()) {\n      if (entry.timestamp < cutoff) {\n        this.proposals.delete(key);\n        cleanedCount++;\n      }\n    }\n\n    return cleanedCount;\n  }\n\n  async getStats(): Promise<PendingSubRAVStats> {\n    const byChannel: Record<string, number> = {};\n    let oldestTimestamp: number | undefined;\n    let newestTimestamp: number | undefined;\n\n    for (const [key, entry] of this.proposals.entries()) {\n      const channelId = key.split(':')[0];\n      byChannel[channelId] = (byChannel[channelId] || 0) + 1;\n\n      if (oldestTimestamp === undefined || entry.timestamp < oldestTimestamp) {\n        oldestTimestamp = entry.timestamp;\n      }\n      if (newestTimestamp === undefined || entry.timestamp > newestTimestamp) {\n        newestTimestamp = entry.timestamp;\n      }\n    }\n\n    return {\n      totalCount: this.proposals.size,\n      byChannel,\n      oldestTimestamp,\n      newestTimestamp,\n    };\n  }\n\n  async clear(): Promise<void> {\n    this.proposals.clear();\n  }\n}\n","/**\n * Browser IndexedDB-based PendingSubRAVRepository implementation\n */\n\nimport type { SubRAV } from '../../core/types';\nimport type { PendingSubRAVRepository } from '../interfaces/PendingSubRAVRepository';\nimport type { PendingSubRAVStats } from '../types/pagination';\n\nexport class IndexedDBPendingSubRAVRepository implements PendingSubRAVRepository {\n  private dbName = 'nuwa-payment-kit-pending-subravs';\n  private version = 2;\n\n  private async getDB(): Promise<IDBDatabase> {\n    return new Promise((resolve, reject) => {\n      const request = indexedDB.open(this.dbName, this.version);\n\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve(request.result);\n\n      request.onupgradeneeded = event => {\n        const db = (event.target as IDBOpenDBRequest).result;\n        const oldVersion = (event as any).oldVersion as number | undefined;\n\n        // If upgrading from v1 (or creating fresh), ensure store has new keyPath including vmIdFragment\n        if (db.objectStoreNames.contains('pendingSubRAVs')) {\n          // For old schemas, drop and recreate with the new composite key\n          try {\n            db.deleteObjectStore('pendingSubRAVs');\n          } catch (_) {\n            // ignore if delete fails\n          }\n        }\n\n        const store = db.createObjectStore('pendingSubRAVs', {\n          keyPath: ['channelId', 'vmIdFragment', 'nonce'],\n        });\n        store.createIndex('channelId', 'channelId', { unique: false });\n        store.createIndex('subChannel', ['channelId', 'vmIdFragment'], { unique: false });\n        store.createIndex('timestamp', 'timestamp', { unique: false });\n      };\n    });\n  }\n\n  async save(subRAV: SubRAV): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['pendingSubRAVs'], 'readwrite');\n    const store = tx.objectStore('pendingSubRAVs');\n\n    const record = {\n      channelId: subRAV.channelId,\n      vmIdFragment: subRAV.vmIdFragment,\n      nonce: subRAV.nonce.toString(),\n      subRAVData: {\n        ...subRAV,\n        nonce: subRAV.nonce.toString(),\n        accumulatedAmount: subRAV.accumulatedAmount.toString(),\n      },\n      timestamp: Date.now(),\n    };\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.put(record);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async find(channelId: string, vmIdFragment: string, nonce: bigint): Promise<SubRAV | null> {\n    const db = await this.getDB();\n    const tx = db.transaction(['pendingSubRAVs'], 'readonly');\n    const store = tx.objectStore('pendingSubRAVs');\n\n    const record = await new Promise<any>((resolve, reject) => {\n      const request = store.get([channelId, vmIdFragment, nonce.toString()]);\n      request.onsuccess = () => resolve(request.result);\n      request.onerror = () => reject(request.error);\n    });\n\n    if (!record) {\n      return null;\n    }\n\n    // Convert back to SubRAV with proper bigint types\n    return {\n      ...record.subRAVData,\n      nonce: BigInt(record.subRAVData.nonce),\n      accumulatedAmount: BigInt(record.subRAVData.accumulatedAmount),\n    };\n  }\n\n  async findLatestBySubChannel(channelId: string, vmIdFragment: string): Promise<SubRAV | null> {\n    const db = await this.getDB();\n    const tx = db.transaction(['pendingSubRAVs'], 'readonly');\n    const store = tx.objectStore('pendingSubRAVs');\n    const subChannelIndex = store.index('subChannel');\n\n    let latestSubRAV: SubRAV | null = null;\n    let maxNonce = BigInt(-1);\n\n    // Use cursor to iterate through all records for this channel\n    const cursorRequest = subChannelIndex.openCursor(IDBKeyRange.only([channelId, vmIdFragment]));\n\n    await new Promise<void>((resolve, reject) => {\n      cursorRequest.onsuccess = () => {\n        const cursor = cursorRequest.result;\n        if (cursor) {\n          const record = cursor.value;\n          const subRAV = {\n            ...record.subRAVData,\n            nonce: BigInt(record.subRAVData.nonce),\n            accumulatedAmount: BigInt(record.subRAVData.accumulatedAmount),\n          };\n\n          if (subRAV.nonce > maxNonce) {\n            maxNonce = subRAV.nonce;\n            latestSubRAV = subRAV;\n          }\n\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n      cursorRequest.onerror = () =>\n        reject(\n          new Error(\n            `Failed to iterate through pending SubRAVs for channel '${channelId}': ${cursorRequest.error?.message || 'Unknown error'}`\n          )\n        );\n    });\n\n    return latestSubRAV;\n  }\n\n  async remove(channelId: string, vmIdFragment: string, nonce: bigint): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['pendingSubRAVs'], 'readwrite');\n    const store = tx.objectStore('pendingSubRAVs');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.delete([channelId, vmIdFragment, nonce.toString()]);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async cleanup(maxAgeMs: number = 30 * 60 * 1000): Promise<number> {\n    const db = await this.getDB();\n    const tx = db.transaction(['pendingSubRAVs'], 'readwrite');\n    const store = tx.objectStore('pendingSubRAVs');\n    const index = store.index('timestamp');\n\n    const cutoff = Date.now() - maxAgeMs;\n    let cleanedCount = 0;\n\n    await new Promise<void>((resolve, reject) => {\n      const request = index.openCursor(IDBKeyRange.upperBound(cutoff));\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          cursor.delete();\n          cleanedCount++;\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n\n    return cleanedCount;\n  }\n\n  async getStats(): Promise<PendingSubRAVStats> {\n    const db = await this.getDB();\n    const tx = db.transaction(['pendingSubRAVs'], 'readonly');\n    const store = tx.objectStore('pendingSubRAVs');\n\n    const byChannel: Record<string, number> = {};\n    let oldestTimestamp: number | undefined;\n    let newestTimestamp: number | undefined;\n    let totalCount = 0;\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.openCursor();\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const record = cursor.value;\n          totalCount++;\n\n          byChannel[record.channelId] = (byChannel[record.channelId] || 0) + 1;\n\n          if (oldestTimestamp === undefined || record.timestamp < oldestTimestamp) {\n            oldestTimestamp = record.timestamp;\n          }\n          if (newestTimestamp === undefined || record.timestamp > newestTimestamp) {\n            newestTimestamp = record.timestamp;\n          }\n\n          cursor.continue();\n        } else {\n          resolve();\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n\n    return {\n      totalCount,\n      byChannel,\n      oldestTimestamp,\n      newestTimestamp,\n    };\n  }\n\n  async clear(): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['pendingSubRAVs'], 'readwrite');\n    const store = tx.objectStore('pendingSubRAVs');\n\n    await new Promise<void>((resolve, reject) => {\n      const request = store.clear();\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n}\n","/**\n * SQL-based PendingSubRAVRepository implementation for PostgreSQL/Supabase\n */\n\nimport type { Pool, PoolClient } from 'pg';\nimport { encodeSubRAV, decodeSubRAV } from './serialization';\nimport type { PendingSubRAVRepository } from '../interfaces/PendingSubRAVRepository';\nimport type { SubRAV } from '../../core/types';\nimport type { PendingSubRAVStats } from '../types/pagination';\n\nexport interface SqlPendingSubRAVRepositoryOptions {\n  /** PostgreSQL connection pool */\n  pool: Pool;\n  /** Table name prefix (default: 'nuwa_') */\n  tablePrefix?: string;\n  /** Auto-create tables if they don't exist */\n  autoMigrate?: boolean;\n  /** Allow unsafe auto-migration in production */\n  allowUnsafeAutoMigrateInProd?: boolean;\n}\n\n/**\n * PostgreSQL/Supabase implementation of PendingSubRAVRepository\n */\nexport class SqlPendingSubRAVRepository implements PendingSubRAVRepository {\n  private pool: Pool;\n  private tablePrefix: string;\n  private autoMigrate: boolean;\n  private allowUnsafeAutoMigrateInProd: boolean;\n\n  constructor(options: SqlPendingSubRAVRepositoryOptions) {\n    this.pool = options.pool;\n    this.tablePrefix = options.tablePrefix || 'nuwa_';\n    this.autoMigrate = options.autoMigrate ?? true;\n    this.allowUnsafeAutoMigrateInProd = options.allowUnsafeAutoMigrateInProd ?? false;\n\n    // Only auto-migrate in development or when explicitly allowed in production\n    if (\n      this.autoMigrate &&\n      (process.env.NODE_ENV !== 'production' || this.allowUnsafeAutoMigrateInProd)\n    ) {\n      this.initialize().catch(console.error);\n    }\n  }\n\n  private get pendingSubRAVsTable(): string {\n    return `${this.tablePrefix}pending_sub_ravs`;\n  }\n\n  /**\n   * Initialize database tables if they don't exist\n   */\n  async initialize(): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      // Create pending SubRAVs table\n      await client.query(`\n        CREATE TABLE IF NOT EXISTS ${this.pendingSubRAVsTable} (\n          channel_id        TEXT NOT NULL,\n          vm_id_fragment    TEXT NOT NULL,\n          nonce             NUMERIC(78,0) NOT NULL,\n          sub_rav_bcs       BYTEA NOT NULL,\n          created_at        TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n          PRIMARY KEY(channel_id, vm_id_fragment, nonce)\n        )\n      `);\n\n      // Create index for cleanup operations\n      await client.query(`\n        CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}pending_sub_ravs_created_at \n        ON ${this.pendingSubRAVsTable}(created_at)\n      `);\n      await client.query(`\n        CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}pending_sub_ravs_sub_channel \n        ON ${this.pendingSubRAVsTable}(channel_id, vm_id_fragment)\n      `);\n    } finally {\n      client.release();\n    }\n  }\n\n  async save(subRAV: SubRAV): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      // Encode SubRAV using BCS serialization\n      const subRavBcs = encodeSubRAV(subRAV);\n\n      await client.query(\n        `\n        INSERT INTO ${this.pendingSubRAVsTable} \n        (channel_id, vm_id_fragment, nonce, sub_rav_bcs)\n        VALUES ($1, $2, $3, $4)\n        ON CONFLICT (channel_id, vm_id_fragment, nonce) \n        DO UPDATE SET \n          sub_rav_bcs = EXCLUDED.sub_rav_bcs,\n          created_at = NOW()\n      `,\n        [subRAV.channelId, subRAV.vmIdFragment, subRAV.nonce.toString(), subRavBcs]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  async find(channelId: string, vmIdFragment: string, nonce: bigint): Promise<SubRAV | null> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT sub_rav_bcs \n        FROM ${this.pendingSubRAVsTable}\n        WHERE channel_id = $1 AND vm_id_fragment = $2 AND nonce = $3\n      `,\n        [channelId, vmIdFragment, nonce.toString()]\n      );\n\n      if (result.rows.length === 0) {\n        return null;\n      }\n\n      const subRavBcs = result.rows[0].sub_rav_bcs as Buffer;\n      return decodeSubRAV(subRavBcs);\n    } finally {\n      client.release();\n    }\n  }\n\n  async findLatestBySubChannel(channelId: string, vmIdFragment: string): Promise<SubRAV | null> {\n    const client = await this.pool.connect();\n    try {\n      const result = await client.query(\n        `\n        SELECT sub_rav_bcs \n        FROM ${this.pendingSubRAVsTable}\n        WHERE channel_id = $1 AND vm_id_fragment = $2\n        ORDER BY nonce DESC\n        LIMIT 1\n      `,\n        [channelId, vmIdFragment]\n      );\n\n      if (result.rows.length === 0) {\n        return null;\n      }\n\n      const subRavBcs = result.rows[0].sub_rav_bcs as Buffer;\n      return decodeSubRAV(subRavBcs);\n    } finally {\n      client.release();\n    }\n  }\n\n  async remove(channelId: string, vmIdFragment: string, nonce: bigint): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      await client.query(\n        `\n        DELETE FROM ${this.pendingSubRAVsTable} \n        WHERE channel_id = $1 AND vm_id_fragment = $2 AND nonce = $3\n      `,\n        [channelId, vmIdFragment, nonce.toString()]\n      );\n    } finally {\n      client.release();\n    }\n  }\n\n  /**\n   * Clean up expired pending SubRAVs\n   *\n   * Note: This method uses database server time (NOW()) instead of client time\n   * to avoid issues with time drift between client and database server.\n   * This ensures that cleanup works correctly even when client and server\n   * clocks are not perfectly synchronized.\n   *\n   * @param maxAgeMs Maximum age in milliseconds (default: 30 minutes)\n   * @returns Number of records deleted\n   */\n  async cleanup(maxAgeMs: number = 30 * 60 * 1000): Promise<number> {\n    const client = await this.pool.connect();\n    try {\n      // Use database server time to avoid client-server time drift issues\n      const result = await client.query(\n        `\n        DELETE FROM ${this.pendingSubRAVsTable} \n        WHERE created_at < NOW() - (make_interval(secs => $1 / 1000))\n      `,\n        [maxAgeMs]\n      );\n\n      return result.rowCount || 0;\n    } finally {\n      client.release();\n    }\n  }\n\n  async getStats(): Promise<PendingSubRAVStats> {\n    const client = await this.pool.connect();\n    try {\n      // Get total count\n      const totalResult = await client.query(`\n        SELECT COUNT(*) as total_count FROM ${this.pendingSubRAVsTable}\n      `);\n      const totalCount = parseInt(totalResult.rows[0].total_count);\n\n      // Get count by channel\n      const byChannelResult = await client.query(`\n        SELECT channel_id, COUNT(*) as count \n        FROM ${this.pendingSubRAVsTable}\n        GROUP BY channel_id\n      `);\n\n      const byChannel: Record<string, number> = {};\n      for (const row of byChannelResult.rows) {\n        byChannel[row.channel_id] = parseInt(row.count);\n      }\n\n      // Get oldest and newest timestamps\n      const timestampResult = await client.query(`\n        SELECT \n          MIN(EXTRACT(EPOCH FROM created_at) * 1000) as oldest,\n          MAX(EXTRACT(EPOCH FROM created_at) * 1000) as newest\n        FROM ${this.pendingSubRAVsTable}\n      `);\n\n      const oldestTimestamp = timestampResult.rows[0].oldest\n        ? parseInt(timestampResult.rows[0].oldest)\n        : undefined;\n      const newestTimestamp = timestampResult.rows[0].newest\n        ? parseInt(timestampResult.rows[0].newest)\n        : undefined;\n\n      return {\n        totalCount,\n        byChannel,\n        oldestTimestamp,\n        newestTimestamp,\n      };\n    } finally {\n      client.release();\n    }\n  }\n\n  async clear(): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      await client.query(`DELETE FROM ${this.pendingSubRAVsTable}`);\n    } finally {\n      client.release();\n    }\n  }\n}\n","/**\n * Factory function for creating PendingSubRAVRepository instances\n */\n\nimport type { Pool } from 'pg';\nimport type { PendingSubRAVRepository } from '../interfaces/PendingSubRAVRepository';\nimport { MemoryPendingSubRAVRepository } from '../memory/pendingSubRav.memory';\nimport { IndexedDBPendingSubRAVRepository } from '../indexeddb/pendingSubRav.indexeddb';\nimport {\n  SqlPendingSubRAVRepository,\n  type SqlPendingSubRAVRepositoryOptions,\n} from '../sql/pendingSubRav.sql';\n\nexport interface PendingSubRAVRepositoryOptions {\n  /** Backend type to use */\n  backend?: 'memory' | 'indexeddb' | 'sql';\n  /** Database connection string for SQL backends */\n  connectionString?: string;\n  /** PostgreSQL connection pool (alternative to connectionString) */\n  pool?: Pool;\n  /** Table name prefix for SQL backends */\n  tablePrefix?: string;\n  /** Auto-create tables if they don't exist */\n  autoMigrate?: boolean;\n  /** Allow unsafe auto-migration in production */\n  allowUnsafeAutoMigrateInProd?: boolean;\n}\n\n/**\n * Create a PendingSubRAVRepository instance based on the specified backend\n */\nexport function createPendingSubRAVRepo(\n  options: PendingSubRAVRepositoryOptions = {}\n): PendingSubRAVRepository {\n  const { backend = 'memory' } = options;\n\n  switch (backend) {\n    case 'memory':\n      return new MemoryPendingSubRAVRepository();\n\n    case 'indexeddb':\n      if (typeof window === 'undefined' || !window.indexedDB) {\n        throw new Error('IndexedDB is not available in this environment');\n      }\n      return new IndexedDBPendingSubRAVRepository();\n\n    case 'sql':\n      // Do not create pool here; caller must provide a Pool (Node-only)\n      if (!options.pool) {\n        throw new Error('SQL backend requires a PostgreSQL connection pool');\n      }\n\n      const sqlOptions: SqlPendingSubRAVRepositoryOptions = {\n        pool: options.pool,\n        tablePrefix: options.tablePrefix,\n        autoMigrate: options.autoMigrate,\n        allowUnsafeAutoMigrateInProd: options.allowUnsafeAutoMigrateInProd,\n      };\n\n      return new SqlPendingSubRAVRepository(sqlOptions);\n\n    default:\n      throw new Error(`Unknown backend type: ${backend}`);\n  }\n}\n","import type {\n  TransactionRecord,\n  TransactionStore,\n  TransactionStatus,\n} from '../interfaces/TransactionStore';\n\nexport class MemoryTransactionStore implements TransactionStore {\n  private records = new Map<string, TransactionRecord>();\n  private order: string[] = [];\n  private listeners = new Set<\n    (e: { type: 'created' | 'updated'; record: TransactionRecord }) => void\n  >();\n\n  constructor(private readonly maxRecords: number = 500) {}\n\n  async create(record: TransactionRecord): Promise<void> {\n    this.records.set(record.clientTxRef, record);\n    this.order.push(record.clientTxRef);\n    this.trim();\n    this.emit({ type: 'created', record });\n  }\n\n  async update(clientTxRef: string, updates: Partial<TransactionRecord>): Promise<void> {\n    const existing = this.records.get(clientTxRef);\n    if (!existing) return;\n    const updated = { ...existing, ...updates } as TransactionRecord;\n    this.records.set(clientTxRef, updated);\n    this.emit({ type: 'updated', record: updated });\n  }\n\n  async get(clientTxRef: string): Promise<TransactionRecord | null> {\n    return this.records.get(clientTxRef) || null;\n  }\n\n  async list(\n    filter?: {\n      status?: TransactionStatus;\n      channelId?: string;\n      protocol?: 'http' | 'mcp' | 'other';\n      since?: number;\n      until?: number;\n    },\n    pagination?: { offset?: number; limit?: number }\n  ): Promise<{ items: TransactionRecord[]; total: number; hasMore: boolean }> {\n    const offset = pagination?.offset ?? 0;\n    const limit = pagination?.limit ?? 50;\n    const items: TransactionRecord[] = [];\n    for (let i = this.order.length - 1; i >= 0; i--) {\n      const id = this.order[i];\n      const rec = this.records.get(id);\n      if (!rec) continue;\n      if (filter?.status && rec.status !== filter.status) continue;\n      if (filter?.channelId && rec.channelId !== filter.channelId) continue;\n      if (filter?.protocol && rec.protocol !== filter.protocol) continue;\n      if (typeof filter?.since === 'number' && rec.timestamp < filter.since) continue;\n      if (typeof filter?.until === 'number' && rec.timestamp > filter.until) continue;\n      items.push(rec);\n      if (items.length >= offset + limit) break;\n    }\n    const window = items.slice(offset, offset + limit);\n    const total = items.length;\n    const hasMore = total > offset + window.length;\n    return { items: window, total, hasMore };\n  }\n\n  async clear(): Promise<void> {\n    this.records.clear();\n    this.order = [];\n  }\n\n  subscribe(\n    cb: (e: { type: 'created' | 'updated'; record: TransactionRecord }) => void\n  ): () => void {\n    this.listeners.add(cb);\n    return () => this.listeners.delete(cb);\n  }\n\n  private trim(): void {\n    while (this.order.length > this.maxRecords) {\n      const oldest = this.order.shift();\n      if (oldest) this.records.delete(oldest);\n    }\n  }\n\n  private emit(e: { type: 'created' | 'updated'; record: TransactionRecord }): void {\n    for (const l of this.listeners) {\n      try {\n        l(e);\n      } catch {}\n    }\n  }\n}\n","import type {\n  TransactionRecord,\n  TransactionStatus,\n  TransactionStore,\n} from '../interfaces/TransactionStore';\n\n/**\n * IndexedDB-based TransactionStore\n */\nexport class IndexedDBTransactionStore implements TransactionStore {\n  private dbName = 'nuwa-payment-kit-transactions';\n  private version = 1;\n\n  private async getDB(): Promise<IDBDatabase> {\n    return new Promise((resolve, reject) => {\n      const request = indexedDB.open(this.dbName, this.version);\n\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve(request.result);\n\n      request.onupgradeneeded = event => {\n        const db = (event.target as IDBOpenDBRequest).result;\n        if (!db.objectStoreNames.contains('transactions')) {\n          const store = db.createObjectStore('transactions', { keyPath: 'clientTxRef' });\n          store.createIndex('timestamp', 'timestamp', { unique: false });\n          store.createIndex('channelId', 'channelId', { unique: false });\n          store.createIndex('status', 'status', { unique: false });\n          store.createIndex('protocol', 'protocol', { unique: false });\n          store.createIndex('vmIdFragment', 'vmIdFragment', { unique: false });\n        }\n      };\n    });\n  }\n\n  async create(record: TransactionRecord): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['transactions'], 'readwrite');\n    const store = tx.objectStore('transactions');\n    await new Promise<void>((resolve, reject) => {\n      const req = store.put(this.serialize(record));\n      req.onsuccess = () => resolve();\n      req.onerror = () => reject(req.error);\n    });\n  }\n\n  async update(clientTxRef: string, updates: Partial<TransactionRecord>): Promise<void> {\n    const existing = await this.get(clientTxRef);\n    if (!existing) return;\n    const updated: TransactionRecord = { ...existing, ...updates } as TransactionRecord;\n    await this.create(updated);\n  }\n\n  async get(clientTxRef: string): Promise<TransactionRecord | null> {\n    const db = await this.getDB();\n    const tx = db.transaction(['transactions'], 'readonly');\n    const store = tx.objectStore('transactions');\n    return new Promise((resolve, reject) => {\n      const req = store.get(clientTxRef);\n      req.onsuccess = () => resolve(req.result ? this.deserialize(req.result) : null);\n      req.onerror = () => reject(req.error);\n    });\n  }\n\n  async list(\n    filter?: {\n      status?: TransactionStatus;\n      channelId?: string;\n      protocol?: 'http' | 'mcp' | 'other';\n      since?: number;\n      until?: number;\n    },\n    pagination?: { offset?: number; limit?: number }\n  ): Promise<{ items: TransactionRecord[]; total: number; hasMore: boolean }> {\n    const db = await this.getDB();\n    const tx = db.transaction(['transactions'], 'readonly');\n    const store = tx.objectStore('transactions');\n    const index = store.index('timestamp');\n\n    const items: TransactionRecord[] = [];\n    await new Promise<void>((resolve, reject) => {\n      const range = undefined; // full scan by time, we will filter in code\n      const req = index.openCursor(range, 'prev'); // newest first\n      req.onsuccess = () => {\n        const cursor = req.result as IDBCursorWithValue | null;\n        if (!cursor) return resolve();\n        const rec = this.deserialize(cursor.value);\n        if (filter?.status && rec.status !== filter.status) return cursor.continue();\n        if (filter?.channelId && rec.channelId !== filter.channelId) return cursor.continue();\n        if (filter?.protocol && rec.protocol !== filter.protocol) return cursor.continue();\n        if (typeof filter?.since === 'number' && rec.timestamp < filter.since)\n          return cursor.continue();\n        if (typeof filter?.until === 'number' && rec.timestamp > filter.until)\n          return cursor.continue();\n        items.push(rec);\n        cursor.continue();\n      };\n      req.onerror = () => reject(req.error);\n    });\n\n    const offset = pagination?.offset ?? 0;\n    const limit = pagination?.limit ?? 50;\n    const window = items.slice(offset, offset + limit);\n    const total = items.length;\n    const hasMore = total > offset + window.length;\n    return { items: window, total, hasMore };\n  }\n\n  async clear(): Promise<void> {\n    const db = await this.getDB();\n    const tx = db.transaction(['transactions'], 'readwrite');\n    const store = tx.objectStore('transactions');\n    await new Promise<void>((resolve, reject) => {\n      const req = store.clear();\n      req.onsuccess = () => resolve();\n      req.onerror = () => reject(req.error);\n    });\n  }\n\n  subscribe(): () => void {\n    // no-op; IndexedDB doesn't have native notifications; implement in caller if needed\n    return () => {};\n  }\n\n  private serialize(rec: TransactionRecord): any {\n    // Convert bigint fields inside payment snapshot to strings\n    const copy: any = { ...rec };\n    if (copy.payment) {\n      copy.payment = {\n        ...copy.payment,\n        cost: copy.payment.cost.toString(),\n        costUsd: copy.payment.costUsd.toString(),\n        nonce: copy.payment.nonce.toString(),\n      };\n    }\n    return copy;\n  }\n\n  private deserialize(obj: any): TransactionRecord {\n    const copy: any = { ...obj };\n    if (copy.payment) {\n      copy.payment = {\n        ...copy.payment,\n        cost: BigInt(copy.payment.cost),\n        costUsd: BigInt(copy.payment.costUsd),\n        nonce: BigInt(copy.payment.nonce),\n      };\n    }\n    return copy as TransactionRecord;\n  }\n}\n","import type { TransactionStore } from '../interfaces/TransactionStore';\nimport { MemoryTransactionStore } from '../memory/transaction.memory';\nimport { IndexedDBTransactionStore } from '../indexeddb/transactions.indexeddb';\n\nexport interface TransactionStoreOptions {\n  backend?: 'memory' | 'indexeddb';\n  maxRecords?: number; // memory only\n}\n\nexport function createTransactionStore(options: TransactionStoreOptions = {}): TransactionStore {\n  const backend = options.backend ?? 'memory';\n  switch (backend) {\n    case 'indexeddb':\n      return new IndexedDBTransactionStore();\n    case 'memory':\n    default:\n      return new MemoryTransactionStore(options.maxRecords);\n  }\n}\n","/**\n * Payment Kit Storage Layer\n *\n * Unified storage abstractions for channels, RAVs, and pending SubRAVs\n * with support for multiple backends (memory, IndexedDB, SQL)\n */\n\n// ==================== Type Exports ====================\nexport type {\n  PaginationParams,\n  PaginatedResult,\n  ChannelFilter,\n  CacheStats,\n  PendingSubRAVStats,\n} from './types/pagination';\n\n// ==================== Interface Exports ====================\nexport type { ChannelRepository } from './interfaces/ChannelRepository';\nexport type { RAVRepository } from './interfaces/RAVRepository';\nexport type { PendingSubRAVRepository } from './interfaces/PendingSubRAVRepository';\n\n// ==================== Factory Function Exports ====================\nexport { createChannelRepo, type ChannelRepositoryOptions } from './factories/createChannelRepo';\n\nexport { createRAVRepo, type RAVRepositoryOptions } from './factories/createRAVRepo';\n\nexport {\n  createPendingSubRAVRepo,\n  type PendingSubRAVRepositoryOptions,\n} from './factories/createPendingSubRAVRepo';\n\n// ==================== Implementation Exports (Optional) ====================\n// Export implementations for advanced use cases or testing\n\n// Memory implementations\nexport { MemoryChannelRepository } from './memory/channel.memory';\nexport { MemoryRAVRepository } from './memory/rav.memory';\nexport { MemoryPendingSubRAVRepository } from './memory/pendingSubRav.memory';\n\n// IndexedDB implementations\nexport { IndexedDBChannelRepository } from './indexeddb/channel.indexeddb';\nexport { IndexedDBRAVRepository } from './indexeddb/rav.indexeddb';\nexport { IndexedDBPendingSubRAVRepository } from './indexeddb/pendingSubRav.indexeddb';\n\n// SQL implementations\nexport { SqlChannelRepository, type SqlChannelRepositoryOptions } from './sql/channel.sql';\nexport { SqlRAVRepository, type SqlRAVRepositoryOptions } from './sql/rav.sql';\nexport {\n  SqlPendingSubRAVRepository,\n  type SqlPendingSubRAVRepositoryOptions,\n} from './sql/pendingSubRav.sql';\n\n// SQL serialization utilities\nexport { encodeSubRAV, decodeSubRAV, getSubRAVHex } from './sql/serialization';\n\n// ==================== Transaction Store Exports ====================\nexport type {\n  TransactionStore,\n  TransactionRecord,\n  TransactionStatus,\n  PaymentSnapshot,\n} from './interfaces/TransactionStore';\nexport { MemoryTransactionStore } from './memory/transaction.memory';\nexport { IndexedDBTransactionStore } from './indexeddb/transactions.indexeddb';\nexport {\n  createTransactionStore,\n  type TransactionStoreOptions,\n} from './factories/createTransactionStore';\n\n// ==================== Convenience Functions ====================\n\nimport { createChannelRepo as _createChannelRepo } from './factories/createChannelRepo';\nimport { createRAVRepo as _createRAVRepo } from './factories/createRAVRepo';\nimport { createPendingSubRAVRepo as _createPendingSubRAVRepo } from './factories/createPendingSubRAVRepo';\n\n/**\n * Create all repositories with the same backend configuration\n */\nexport function createStorageRepositories(options: {\n  backend?: 'memory' | 'indexeddb' | 'sql';\n  pool?: any; // Pool from 'pg'\n  connectionString?: string; // e.g., SUPABASE_DB_URL\n  tablePrefix?: string;\n  autoMigrate?: boolean;\n}) {\n  const opts: any = { ...options };\n  // Note: keep this module browser-safe; do not load 'pg' here.\n  return {\n    channelRepo: _createChannelRepo(opts),\n    ravRepo: _createRAVRepo(opts),\n    pendingSubRAVRepo: _createPendingSubRAVRepo(opts),\n  };\n}\n","import { z } from 'zod';\nimport { SerializableSubRAVSchema, ChannelInfoSchema, SubChannelStateSchema } from '../core';\n\n/**\n * Schema for GET /recovery response\n * Uses core schemas for proper type safety and validation\n */\nexport const RecoveryResponseSchema = z.object({\n  /** Channel information if channel exists */\n  channel: ChannelInfoSchema.nullable(),\n  /** Pending SubRAV if any exists for recovery */\n  pendingSubRav: SerializableSubRAVSchema.nullable(),\n  /** Optional sub-channel state for current key fragment (if authorized) */\n  subChannel: SubChannelStateSchema.nullable().optional(),\n  /** Response timestamp in ISO-8601 format */\n  timestamp: z.string(),\n});\n\nexport type RecoveryResponse = z.infer<typeof RecoveryResponseSchema>;\n\n/**\n * The recovery endpoint currently does not accept any request body.\n * We still declare an empty schema so that the helper utilities work\n * consistently across every endpoint.\n */\nexport const RecoveryRequestSchema = z.object({}).passthrough();\n\nexport type RecoveryRequest = z.infer<typeof RecoveryRequestSchema>;\n","import { z } from 'zod';\nimport { SerializableSignedSubRAVSchema } from '../core';\n\n/**\n * Schema for POST /commit request\n */\nexport const CommitRequestSchema = z.object({\n  /** Signed SubRAV to be committed */\n  subRav: SerializableSignedSubRAVSchema,\n});\n\nexport type CommitRequest = z.infer<typeof CommitRequestSchema>;\n\n/**\n * Schema for POST /commit response\n */\nexport const CommitResponseSchema = z.object({\n  success: z.boolean(),\n});\n\nexport type CommitResponse = z.infer<typeof CommitResponseSchema>;\n","import { z } from 'zod';\nimport { ServiceDiscoverySchema } from '../core';\n\n/**\n * Schema for GET /.well-known/payment-service response (Discovery)\n * Uses the core ServiceDiscoverySchema for consistency\n */\nexport const DiscoveryResponseSchema = ServiceDiscoverySchema;\n\nexport type DiscoveryResponse = z.infer<typeof DiscoveryResponseSchema>;\n\n/**\n * Discovery endpoint doesn't accept request parameters\n */\nexport const DiscoveryRequestSchema = z.object({}).passthrough();\n\nexport type DiscoveryRequest = z.infer<typeof DiscoveryRequestSchema>;\n","import { z } from 'zod';\nimport { HealthCheckSchema } from '../core';\n\n/**\n * Schema for GET /health response\n * Uses the core HealthCheckSchema for consistency\n */\nexport const HealthResponseSchema = HealthCheckSchema;\n\nexport type HealthResponse = z.infer<typeof HealthResponseSchema>;\n\n/**\n * Health endpoint doesn't accept request parameters\n */\nexport const HealthRequestSchema = z.object({}).passthrough();\n\nexport type HealthRequest = z.infer<typeof HealthRequestSchema>;\n","import { z } from 'zod';\nimport { SerializableSignedSubRAVSchema } from '../core';\n\n/**\n * Schema for GET /subrav request (query parameters)\n */\nexport const SubRavRequestSchema = z.object({\n  /** Nonce as string (from query params), will be converted to BigInt in handler */\n  nonce: z.string(),\n});\n\nexport type SubRavRequest = z.infer<typeof SubRavRequestSchema>;\n\n/**\n * Schema for GET /subrav response - returns a SignedSubRAV if found\n * Uses the core SignedSubRAVSchema for consistency\n */\nexport const SubRavResponseSchema = SerializableSignedSubRAVSchema;\n\nexport type SubRavResponse = z.infer<typeof SubRavResponseSchema>;\n","import { z } from 'zod';\nimport {\n  SystemStatusSchema,\n  ClaimTriggerRequestSchema as CoreClaimTriggerRequestSchema,\n  ClaimTriggerResponseSchema as CoreClaimTriggerResponseSchema,\n} from '../core';\n\n/**\n * Schema for GET /admin/status response\n */\nexport const SystemStatusResponseSchema = SystemStatusSchema;\n\nexport type SystemStatusResponse = z.infer<typeof SystemStatusResponseSchema>;\n\n/**\n * Schema for POST /admin/claim-trigger request\n * Uses the core ClaimTriggerRequestSchema for consistency\n */\nexport const ClaimTriggerRequestSchema = CoreClaimTriggerRequestSchema;\n\nexport type ClaimTriggerRequest = z.infer<typeof ClaimTriggerRequestSchema>;\n\n/**\n * Schema for POST /admin/claim-trigger response\n * Uses the core ClaimTriggerResponseSchema for consistency\n */\nexport const ClaimTriggerResponseSchema = CoreClaimTriggerResponseSchema;\n\nexport type ClaimTriggerResponse = z.infer<typeof ClaimTriggerResponseSchema>;\n\n/**\n * Admin endpoints that don't accept request parameters use passthrough empty objects\n */\nexport const AdminRequestSchema = z.object({}).passthrough();\n\nexport type AdminRequest = z.infer<typeof AdminRequestSchema>;\n","// Export core schemas first\nexport * from './core';\n\n// Export API schemas and their inferred types\nexport {\n  RecoveryRequestSchema,\n  RecoveryResponseSchema,\n  type RecoveryRequest,\n  type RecoveryResponse,\n} from './api/recovery';\n\nexport {\n  CommitRequestSchema,\n  CommitResponseSchema,\n  type CommitRequest,\n  type CommitResponse,\n} from './api/commit';\n\nexport {\n  DiscoveryRequestSchema,\n  DiscoveryResponseSchema,\n  type DiscoveryRequest,\n  type DiscoveryResponse,\n} from './api/discovery';\n\nexport {\n  HealthRequestSchema,\n  HealthResponseSchema,\n  type HealthRequest,\n  type HealthResponse,\n} from './api/health';\n\nexport {\n  SubRavRequestSchema,\n  SubRavResponseSchema,\n  type SubRavRequest,\n  type SubRavResponse,\n} from './api/subrav';\n\nexport {\n  AdminRequestSchema,\n  SystemStatusResponseSchema,\n  type AdminRequest,\n  type SystemStatusResponse,\n} from './api/admin';\n","/**\n * Core helper functions for IdentityEnv integration\n *\n * This module provides the shared utility function to extract chain configuration\n * from IdentityEnv instances. Specific integration functions are located in their\n * respective modules for better discoverability:\n *\n * - createHttpClientFromEnv: integrations/http/fromIdentityEnv\n * - createExpressPaymentKitFromEnv: transport/express/fromIdentityEnv\n */\n\nimport type { IdentityEnv } from '@nuwa-ai/identity-kit';\nimport { ChainConfig } from '../factory/chainFactory';\n\n/**\n * Extract ChainConfig from IdentityEnv's registered VDRs\n *\n * @param env IdentityEnv instance with registered VDRs\n * @returns ChainConfig for payment channel operations\n * @throws Error if no supported VDR is found\n */\nexport function getChainConfigFromEnv(env: IdentityEnv): ChainConfig {\n  const roochVdr = env.registry.getVDR('rooch');\n\n  if (!roochVdr) {\n    throw new Error(\n      'RoochVDR not registered in IdentityEnv. Please ensure bootstrapIdentityEnv was called with method=\"rooch\" or useVDR(\"rooch\") was called.'\n    );\n  }\n\n  // Access the options from RoochVDR instance\n  // Note: This assumes RoochVDR has an 'options' property with the configuration\n  const vdrOptions = (roochVdr as any).options || {};\n  const rpcUrl = vdrOptions.rpcUrl || undefined;\n\n  return {\n    chain: 'rooch' as const,\n    rpcUrl,\n    network: vdrOptions.network || 'test',\n    debug: vdrOptions.debug || false,\n  };\n}\n","import express, { Router, RequestHandler } from 'express';\nimport { pathToRegexp } from 'path-to-regexp';\nimport { findRule as coreFindRule } from '../../billing/core/rule-matcher';\nimport type { BillingRule, StrategyConfig, RuleProvider } from '../../billing';\n\n/**\n * Route options for registering routes with billing\n */\nexport interface RouteOptions {\n  /**\n   * Pricing strategy.\n   * 0 / '0' means free (skip billing logic)\n   */\n  pricing: bigint | string | StrategyConfig;\n\n  /**\n   * Whether DID authentication is required.\n   * Default rules:\n   *   pricing == 0  → false\n   *   pricing  > 0  → true\n   * If developer explicitly sets false with pricing>0, framework will throw error during startup.\n   */\n  authRequired?: boolean;\n\n  /**\n   * Whether admin authorization is required (implies authRequired: true).\n   * Admin routes require both DID authentication and admin permission check.\n   */\n  adminOnly?: boolean;\n}\n\n/**\n * Options when creating a BillableRouter\n */\nexport interface BillableRouterOptions {\n  /** Service identifier used in billing config */\n  serviceId: string;\n  /** Default price (picoUSD) when no rule matches. Optional */\n  defaultPricePicoUSD?: bigint | string;\n  /** Config version – defaults to 1 */\n  version?: number;\n}\n\n/**\n * BillableRouter helps you declare Express routes and their pricing in one place.\n *\n */\nexport class BillableRouter implements RuleProvider {\n  /** The underlying Express Router you should mount into your app */\n  public readonly router: Router;\n  /** Collected billing rules */\n  private readonly rules: BillingRule[] = [];\n  private readonly opts: BillableRouterOptions;\n\n  constructor(opts: BillableRouterOptions) {\n    this.opts = { version: 1, ...opts };\n    this.router = express.Router();\n\n    // Add default rule if provided\n    if (opts.defaultPricePicoUSD !== undefined) {\n      const pricing =\n        typeof opts.defaultPricePicoUSD === 'string'\n          ? BigInt(opts.defaultPricePicoUSD)\n          : opts.defaultPricePicoUSD;\n      const authRequired = pricing > 0n;\n      const paymentRequired = pricing > 0n;\n\n      this.rules.push({\n        id: 'default-pricing',\n        default: true,\n        strategy: {\n          type: 'PerRequest',\n          price: opts.defaultPricePicoUSD.toString(),\n        },\n        authRequired,\n        adminOnly: false,\n        paymentRequired,\n      });\n    }\n  }\n\n  // ---------------------------------------------------------------------\n  // Public helpers for HTTP verbs\n  // ---------------------------------------------------------------------\n\n  get(\n    path: string | RegExp,\n    options: RouteOptions | bigint | string | StrategyConfig,\n    handler: RequestHandler,\n    id?: string\n  ) {\n    return this.register('get', path, options, handler, id);\n  }\n\n  post(\n    path: string | RegExp,\n    options: RouteOptions | bigint | string | StrategyConfig,\n    handler: RequestHandler,\n    id?: string\n  ) {\n    return this.register('post', path, options, handler, id);\n  }\n\n  put(\n    path: string | RegExp,\n    options: RouteOptions | bigint | string | StrategyConfig,\n    handler: RequestHandler,\n    id?: string\n  ) {\n    return this.register('put', path, options, handler, id);\n  }\n\n  delete(\n    path: string | RegExp,\n    options: RouteOptions | bigint | string | StrategyConfig,\n    handler: RequestHandler,\n    id?: string\n  ) {\n    return this.register('delete', path, options, handler, id);\n  }\n\n  patch(\n    path: string | RegExp,\n    options: RouteOptions | bigint | string | StrategyConfig,\n    handler: RequestHandler,\n    id?: string\n  ) {\n    return this.register('patch', path, options, handler, id);\n  }\n\n  /**\n   * Access the collected billing rules (mainly for testing)\n   */\n  getRules(): BillingRule[] {\n    return [...this.rules];\n  }\n\n  /**\n   * Find a billing rule that matches the given HTTP method + path using the\n   * shared core rule-matcher (single source of truth).\n   */\n  findRule(method: string, path: string): BillingRule | undefined {\n    return coreFindRule({ method: method.toUpperCase(), path }, this.rules);\n  }\n\n  // ---------------------------------------------------------------------\n  // Internal helper to collect rule + register to Express\n  // ---------------------------------------------------------------------\n  private register(\n    method: string,\n    path: string | RegExp,\n    options: RouteOptions | bigint | string | StrategyConfig,\n    handler: RequestHandler,\n    id?: string\n  ) {\n    // Route registration\n\n    // Normalize options to RouteOptions\n    let routeOptions: RouteOptions;\n    if (typeof options === 'object' && 'pricing' in options) {\n      // It's already RouteOptions\n      routeOptions = options as RouteOptions;\n    } else {\n      // Legacy usage: pricing only (bigint, string, or StrategyConfig)\n      routeOptions = { pricing: options as bigint | string | StrategyConfig };\n    }\n\n    // Handle path conversion to regex for billing rules\n    let pathRegex: string;\n    let pathForId: string;\n    let originalRegex: RegExp | undefined;\n\n    if (path instanceof RegExp) {\n      // Already a RegExp - use its source and preserve flags\n      pathRegex = path.source;\n      pathForId = path.toString();\n      originalRegex = path;\n    } else {\n      // String path - convert using path-to-regexp\n      try {\n        const regexp = pathToRegexp(path);\n        pathRegex = regexp.source;\n        pathForId = path;\n      } catch (error) {\n        // pathToRegexp failed - provide clear error message to user\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        throw new Error(\n          `Invalid route path \"${path}\": ${errorMessage}. ` +\n            'Please use a valid Express.js route pattern. ' +\n            'Common issues: ' +\n            '• Use \"/*\" instead of \"*\" for wildcards ' +\n            '• Ensure parentheses are properly balanced ' +\n            '• Use \":param\" syntax for parameters ' +\n            'For more details, see: https://github.com/pillarjs/path-to-regexp#usage'\n        );\n      }\n    }\n\n    // Determine strategy config\n    let strategy: StrategyConfig;\n    if (typeof routeOptions.pricing === 'object' && 'type' in routeOptions.pricing) {\n      // It's already a strategy config\n      strategy = routeOptions.pricing;\n    } else {\n      // It's a fixed price, create PerRequest strategy\n      strategy = {\n        type: 'PerRequest',\n        price: routeOptions.pricing.toString(),\n      };\n    }\n\n    // Validate and determine auth and payment requirements\n    const adminOnly = routeOptions.adminOnly || false;\n    let authRequired = routeOptions.authRequired;\n\n    // Validation: adminOnly implies authRequired\n    if (adminOnly && authRequired === false) {\n      throw new Error(\n        `Route ${method.toUpperCase()} ${pathForId}: adminOnly requires authRequired to be true or undefined`\n      );\n    }\n\n    // Auto-determine payment requirement based on pricing strategy\n    const pricing =\n      typeof routeOptions.pricing === 'string'\n        ? BigInt(routeOptions.pricing)\n        : routeOptions.pricing;\n    let paymentRequired: boolean;\n    if (typeof pricing === 'bigint') {\n      // Fixed price: only require payment if price > 0\n      paymentRequired = pricing > 0n;\n    } else {\n      // Dynamic strategy: always require payment\n      paymentRequired = true;\n    }\n\n    // Determine final auth requirement\n    if (authRequired === undefined) {\n      if (adminOnly) {\n        // Admin routes always require auth\n        authRequired = true;\n      } else {\n        // Default behavior: payment requires auth\n        if (paymentRequired) {\n          authRequired = true;\n        } else {\n          // Free endpoints don't require auth by default\n          authRequired = false;\n        }\n      }\n    }\n\n    // Collect billing rule\n    const rule: BillingRule = {\n      id: id || `${method.toUpperCase()}:${pathForId}`,\n      when: {\n        pathRegex,\n        method: method.toUpperCase(),\n      },\n      strategy,\n      authRequired,\n      adminOnly,\n      paymentRequired,\n      // Store original RegExp with flags if available for proper matching\n      originalRegex,\n    };\n\n    // Rule created\n\n    // Insert rule with proper ordering:\n    // 1. Specific rules (non-default) should be added in registration order\n    // 2. Default rules should always be at the end\n    if (rule.default) {\n      // Keep default pricing rule at the end\n      // Keep default rule at end\n      this.rules.push(rule);\n    } else {\n      // Find the position to insert: before the first default rule, or at the end\n      const firstDefaultIndex = this.rules.findIndex(r => r.default);\n      if (firstDefaultIndex >= 0) {\n        // Insert before the first default rule\n        // Insert before default\n        this.rules.splice(firstDefaultIndex, 0, rule);\n      } else {\n        // No default rules yet, add to the end\n        // Add to end\n        this.rules.push(rule);\n      }\n    }\n\n    // Registration done\n\n    // Delegate to Express Router\n    (this.router as any)[method](path, handler);\n    return this;\n  }\n}\n\n// Re-export express so consumers don’t have to import twice\nexport { express as _express };\n","import type { InternalRecoveryRequest } from '../../types/internal';\nimport { PaymentKitError, createSuccessResponse } from '../../errors';\nimport type { Handler, ApiContext } from '../../types/api';\nimport { ErrorCode } from '../../types/api';\nimport type { RecoveryResponse } from '../../schema';\nimport { deriveChannelId } from '../../rooch/ChannelUtils';\nimport { HttpPaymentCodec } from '../../middlewares/http/HttpPaymentCodec';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\n\nconst logger = DebugLogger.get('recovery');\n/**\n * Handle recovery endpoint requests\n * Requires DID authentication\n */\nexport const handleRecovery: Handler<ApiContext, {}, RecoveryResponse> = async (ctx, req) => {\n  try {\n    const internalReq = req as InternalRecoveryRequest;\n    if (!internalReq.didInfo || !internalReq.didInfo.did || !internalReq.didInfo.keyId) {\n      throw new PaymentKitError(ErrorCode.UNAUTHORIZED, 'DID authentication required', 401);\n    }\n\n    const clientDid = internalReq.didInfo.did;\n\n    // Derive channelId deterministically using ChannelUtils\n    const defaultAssetId = ctx.config.defaultAssetId ?? '0x3::gas_coin::RGas';\n    const channelId = deriveChannelId(clientDid, ctx.config.serviceDid, defaultAssetId);\n\n    let channel: any = null;\n    try {\n      channel = await ctx.payeeClient.getChannelInfo(channelId);\n    } catch (_) {\n      // Channel doesn't exist yet - this is normal for first-time clients\n    }\n\n    // Extract vmIdFragment from DID keyId and find latest pending for sub-channel\n    const keyParts = internalReq.didInfo.keyId.split('#');\n    const vmIdFragment = keyParts.length > 1 ? keyParts[1] : '';\n    const pending = vmIdFragment\n      ? await ctx.pendingSubRAVStore.findLatestBySubChannel(channelId, vmIdFragment)\n      : null;\n\n    // Try to get sub-channel state for this vmIdFragment (authorized -> state exists)\n    let subChannel = null as any;\n    if (channel && vmIdFragment) {\n      try {\n        const state = await ctx.payeeClient.getSubChannelState(channelId, vmIdFragment);\n        if (state) {\n          subChannel = state;\n        }\n      } catch (_) {\n        // sub-channel may not be authorized yet; that's fine\n      }\n    }\n    const serializedPending = pending ? HttpPaymentCodec.serializeSubRAV(pending) : null;\n    const response: RecoveryResponse = {\n      channel: channel ?? null,\n      pendingSubRav: serializedPending,\n      subChannel: subChannel ?? null,\n      timestamp: new Date().toISOString(),\n    };\n\n    return createSuccessResponse(response);\n  } catch (error) {\n    if (error instanceof PaymentKitError) {\n      throw error;\n    }\n    throw new PaymentKitError(\n      ErrorCode.INTERNAL_ERROR,\n      'Failed to perform recovery',\n      500,\n      error instanceof Error ? error.message : String(error)\n    );\n  }\n};\n","import type { InternalCommitRequest } from '../../types/internal';\nimport { createSuccessResponse, PaymentKitError } from '../../errors';\nimport type { Handler, ApiContext } from '../../types/api';\nimport { ErrorCode } from '../../types/api';\nimport type { CommitResponse, CommitRequest } from '../../schema';\n\n/**\n * Handle commit endpoint requests\n * Requires DID authentication\n */\nexport const handleCommit: Handler<ApiContext, CommitRequest, CommitResponse> = async (\n  ctx,\n  req\n) => {\n  try {\n    if (!req.subRav) {\n      throw new PaymentKitError(ErrorCode.BAD_REQUEST, 'subRav required', 400);\n    }\n\n    try {\n      //await ctx.payeeClient.processSignedSubRAV(req.subRav);\n      //TODO: Implement commit\n      return createSuccessResponse({ success: false });\n    } catch (e) {\n      throw new PaymentKitError(ErrorCode.CONFLICT, (e as Error).message, 409);\n    }\n  } catch (error) {\n    if (error instanceof PaymentKitError) {\n      throw error;\n    }\n    throw new PaymentKitError(\n      ErrorCode.INTERNAL_ERROR,\n      'Failed to commit SubRAV',\n      500,\n      error instanceof Error ? error.message : String(error)\n    );\n  }\n};\n","import type { InternalClaimTriggerRequest, InternalSubRavRequest } from '../../types/internal';\nimport { createSuccessResponse, PaymentKitError } from '../../errors';\nimport type { Handler, ApiContext } from '../../types/api';\nimport { ErrorCode } from '../../types/api';\nimport type {\n  HealthResponse,\n  SystemStatusResponse,\n  ClaimTriggerRequest,\n  ClaimTriggerResponse,\n} from '../../schema';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\n\n/**\n * Handle admin system status endpoint requests\n * Admin only endpoint\n */\nexport const handleAdminStatus: Handler<ApiContext, {}, SystemStatusResponse> = async (\n  ctx,\n  req\n) => {\n  try {\n    // Prefer reactive claim trigger status when available; fallback to legacy scheduler\n    const stats = ctx.claimTriggerService?.getStatus();\n    const claimsStatus = stats\n      ? {\n          active: stats.active,\n          queued: stats.queued,\n          successCount: stats.successCount,\n          failedCount: stats.failedCount,\n          skippedCount: stats.skippedCount,\n          insufficientFundsCount: stats.insufficientFundsCount,\n          backoffCount: stats.backoffCount,\n          avgProcessingTimeMs: stats.avgProcessingTimeMs,\n          policy: {\n            minClaimAmount: stats.policy.minClaimAmount,\n            maxConcurrentClaims: stats.policy.maxConcurrentClaims,\n            maxRetries: stats.policy.maxRetries,\n            retryDelayMs: stats.policy.retryDelayMs,\n            requireHubBalance: stats.policy.requireHubBalance,\n            insufficientFundsBackoffMs: stats.policy.insufficientFundsBackoffMs,\n            countInsufficientAsFailure: stats.policy.countInsufficientAsFailure,\n          },\n        }\n      : {\n          active: 0,\n          queued: 0,\n          successCount: 0,\n          failedCount: 0,\n          skippedCount: 0,\n          insufficientFundsCount: 0,\n          backoffCount: 0,\n          avgProcessingTimeMs: 0,\n          policy: {\n            minClaimAmount: 0n,\n            maxConcurrentClaims: 0,\n            maxRetries: 0,\n            retryDelayMs: 0,\n            requireHubBalance: false,\n            insufficientFundsBackoffMs: 0,\n            countInsufficientAsFailure: false,\n          },\n        };\n    const processingStats = ctx.processor.getProcessingStats();\n\n    const result: SystemStatusResponse = {\n      claims: claimsStatus,\n      processor: processingStats,\n      timestamp: new Date().toISOString(),\n    };\n\n    return createSuccessResponse(result);\n  } catch (error) {\n    throw new PaymentKitError(\n      ErrorCode.INTERNAL_ERROR,\n      'Failed to retrieve system status',\n      500,\n      error instanceof Error ? error.message : String(error)\n    );\n  }\n};\n\n/**\n * Handle admin claim trigger endpoint requests\n * Admin only endpoint\n */\nexport const handleAdminClaimTrigger: Handler<\n  ApiContext,\n  ClaimTriggerRequest,\n  ClaimTriggerResponse\n> = async (ctx, req) => {\n  try {\n    // Diagnostic/manual trigger: enqueue a reactive claim for all known sub-channels under the channelId\n    // Behavior:\n    // - Reads latest SignedSubRAVs for each vmIdFragment under the channel (from ravRepo)\n    // - Computes delta vs current SubChannelInfo\n    // - If delta >= minClaimAmount, queue claim via ClaimTriggerService\n    // - Returns an empty results array immediately; status can be observed via /admin/status\n\n    if (!ctx.claimTriggerService) {\n      return createSuccessResponse({ channelId: req.channelId, queued: [], skipped: [] });\n    }\n\n    const channelId = req.channelId;\n    const queued: { vmIdFragment: string; delta: bigint }[] = [];\n    const skipped: {\n      vmIdFragment: string;\n      reason: 'no_delta' | 'below_threshold';\n      delta?: bigint;\n      threshold?: bigint;\n    }[] = [];\n\n    try {\n      // List all sub-channels we have state for\n      const subStates = await ctx.channelRepo.listSubChannelStates(channelId);\n      const vmIds = Object.keys(subStates);\n\n      for (const vmIdFragment of vmIds) {\n        const latest = await ctx.ravRepository.getLatest(channelId, vmIdFragment);\n        const state = subStates[vmIdFragment];\n        if (!latest || !state) continue;\n\n        const accumulated = latest.subRav.accumulatedAmount;\n        const lastClaimed = state.lastClaimedAmount;\n        const delta = accumulated > lastClaimed ? accumulated - lastClaimed : 0n;\n\n        if (delta <= 0n) {\n          skipped.push({ vmIdFragment, reason: 'no_delta' });\n          continue;\n        }\n        // enqueue regardless of threshold; ClaimTriggerService will decide to skip/queue by policy\n        await ctx.claimTriggerService.maybeQueue(channelId, vmIdFragment, delta);\n        queued.push({ vmIdFragment, delta });\n      }\n    } catch (e) {\n      DebugLogger.error('Failed to trigger claim', e);\n      // swallow diagnostic errors; return partial\n    }\n\n    // Response schema expects ScheduledClaimResult[]; in reactive mode we return an empty list\n    // and rely on /admin/status for detailed progress.\n    return createSuccessResponse({ channelId, queued, skipped });\n  } catch (error) {\n    throw new PaymentKitError(\n      ErrorCode.INTERNAL_ERROR,\n      'Failed to trigger claim',\n      500,\n      error instanceof Error ? error.message : String(error)\n    );\n  }\n};\n","import type { InternalSubRavRequest } from '../../types/internal';\nimport { PaymentKitError, createSuccessResponse } from '../../errors';\nimport type { Handler, ApiContext } from '../../types/api';\nimport { ErrorCode } from '../../types/api';\nimport type { SubRavRequest } from '../../schema';\nimport { deriveChannelId } from '../../rooch/ChannelUtils';\n\n/**\n * Handle SubRAV query endpoint requests\n * Requires DID authentication\n * Users can only query SubRAVs from channels they own\n */\nexport const handleSubRavQuery: Handler<ApiContext, SubRavRequest, any> = async (ctx, req) => {\n  try {\n    // Keep handler free of direct console logging\n\n    // Check if user is authenticated\n    const internalReq = req as InternalSubRavRequest;\n    if (!internalReq.didInfo || !internalReq.didInfo.did || !internalReq.didInfo.keyId) {\n      throw new PaymentKitError(ErrorCode.UNAUTHORIZED, 'DID authentication required', 401);\n    }\n\n    const clientDid = internalReq.didInfo.did;\n\n    // Derive the expected channelId for this user\n    const defaultAssetId = ctx.config.defaultAssetId ?? '0x3::gas_coin::RGas';\n    const channelId = deriveChannelId(clientDid, ctx.config.serviceDid, defaultAssetId);\n\n    // Extract vmIdFragment from DID keyId (format: did:...#fragment)\n    // Extract vmIdFragment from DID keyId (format: did:...#fragment)\n    const keyParts = internalReq.didInfo.keyId.split('#');\n    const vmIdFragment = keyParts.length > 1 ? keyParts[1] : '';\n    if (!vmIdFragment) {\n      throw new PaymentKitError(ErrorCode.BAD_REQUEST, 'Invalid DID keyId: missing fragment', 400);\n    }\n    const subRAV = await ctx.ravRepository.get(channelId, vmIdFragment, BigInt(req.nonce));\n\n    if (subRAV) {\n      return createSuccessResponse(subRAV);\n    } else {\n      throw new PaymentKitError(ErrorCode.NOT_FOUND, 'SubRAV not found', 404);\n    }\n  } catch (error) {\n    if (error instanceof PaymentKitError) {\n      throw error;\n    }\n\n    throw new PaymentKitError(\n      ErrorCode.INTERNAL_ERROR,\n      'Failed to retrieve SubRAV',\n      500,\n      error instanceof Error ? error.message : String(error)\n    );\n  }\n};\n","import { createSuccessResponse } from '../../errors';\nimport type { ApiContext, Handler } from '../../types/api';\nimport type { HealthResponse } from '../../schema';\n\n/**\n * Handle admin health endpoint requests\n * Public endpoint, no authentication required\n */\nexport const handleHealth: Handler<ApiContext, {}, HealthResponse> = async (ctx, req) => {\n  const response: HealthResponse = {\n    success: true,\n    status: 'healthy',\n    timestamp: new Date().toISOString(),\n    paymentKitEnabled: true,\n  };\n\n  return createSuccessResponse(response);\n};\n","/**\n * Built-in API handlers for Payment Kit\n */\n\nexport * from './recovery';\nexport * from './commit';\nexport * from './admin';\nexport * from './subrav';\nexport * from './health';\n","import type { Handler, ApiContext } from '../types/api';\nimport type { RouteOptions } from '../transport/express/BillableRouter';\nimport type { z } from 'zod';\n\n/**\n * Pair of Zod schemas for request / response.\n */\nexport type ZodSchemaPair<Req, Res> = {\n  request: z.ZodType<Req, any, any>;\n  response: z.ZodType<Res, any, any>;\n};\n\n/**\n * Wrap a business handler with runtime Zod validation.\n *\n * 1. Validate the raw request against the provided request schema. If parsing\n *    fails Zod will throw a descriptive error that will propagate up the call\n *    chain.\n * 2. Delegate to the underlying business handler.\n * 3. (Optional – not yet implemented) Validate the handler's response against\n *    the response schema. This step will be enabled once all handlers return\n *    plain data objects instead of the ApiResponse envelope.\n */\nexport function createValidatedHandler<Req, Res>(params: {\n  schema: ZodSchemaPair<Req, Res>;\n  handler: Handler<ApiContext, Req, Res>;\n}): Handler<ApiContext, Req, Res> {\n  const { schema, handler } = params;\n\n  return async (ctx, rawReq) => {\n    // 1️⃣ Validate & transform the incoming request.\n    const req = schema.request.parse(rawReq);\n\n    // Preserve auth context injected by middleware (e.g., didInfo) that\n    // may be stripped by schema parsing. Handlers may read it via Internal*Request.\n    const enrichedReq: any = { ...req };\n    if ((rawReq as any) && (rawReq as any).didInfo) {\n      enrichedReq.didInfo = (rawReq as any).didInfo;\n    }\n\n    // 2️⃣ Execute business logic.\n    const rawRes = await handler(ctx, enrichedReq as any);\n\n    // TODO: 3️⃣ Response validation once migration is complete.\n    return rawRes;\n  };\n}\n","/**\n * Built-in API handlers registry for Payment Kit\n */\n\nimport type { Handler, ApiContext } from '../types/api';\nimport type { RouteOptions } from '../transport/express/BillableRouter';\nimport {\n  handleRecovery,\n  handleCommit,\n  handleHealth,\n  handleAdminStatus,\n  handleAdminClaimTrigger,\n  handleSubRavQuery,\n} from './handlers';\n\nimport { createValidatedHandler } from './utils';\nimport {\n  RecoveryRequestSchema,\n  RecoveryResponseSchema,\n  CommitRequestSchema,\n  CommitResponseSchema,\n  HealthRequestSchema,\n  HealthResponseSchema,\n  SubRavRequestSchema,\n  SubRavResponseSchema,\n  AdminRequestSchema,\n  SystemStatusResponseSchema,\n  ClaimTriggerRequestSchema,\n  ClaimTriggerResponseSchema,\n} from '../schema';\n\n/**\n * Configuration for a built-in API handler\n */\nexport interface ApiHandlerConfig {\n  handler: Handler<ApiContext, any, any>;\n  options: RouteOptions;\n  description?: string;\n  // HTTP method for REST adapters (MCP/JSON-RPC adapters may ignore this)\n  method?: 'GET' | 'POST' | 'DELETE';\n  // REST path for HTTP adapters (other adapters may ignore this)\n  path?: string;\n}\n\n/**\n * Registry of built-in API handlers with their configuration\n * Key format: semantic handler name (protocol agnostic)\n */\nexport const BuiltInApiHandlers: Record<string, ApiHandlerConfig> = {\n  // Note: Discovery endpoint is handled directly in ExpressPaymentKit at root level\n  // to comply with well-known URI RFC specifications\n\n  // Core payment operations\n  recovery: {\n    handler: createValidatedHandler({\n      schema: {\n        request: RecoveryRequestSchema,\n        response: RecoveryResponseSchema,\n      },\n      handler: handleRecovery,\n    }),\n    method: 'GET',\n    path: '/recovery',\n    options: { pricing: '0', authRequired: true },\n    description: 'Recover channel state and pending SubRAV',\n  },\n\n  commit: {\n    handler: createValidatedHandler({\n      schema: {\n        request: CommitRequestSchema,\n        response: CommitResponseSchema,\n      },\n      handler: handleCommit,\n    }),\n    method: 'POST',\n    path: '/commit',\n    options: { pricing: '0', authRequired: true },\n    description: 'Commit a signed SubRAV to the service',\n  },\n\n  // System operations\n  health: {\n    handler: createValidatedHandler({\n      schema: {\n        request: HealthRequestSchema,\n        response: HealthResponseSchema,\n      },\n      handler: handleHealth,\n    }),\n    method: 'GET',\n    path: '/health',\n    options: { pricing: '0', authRequired: false },\n    description: 'Health check endpoint (public)',\n  },\n\n  subravQuery: {\n    handler: createValidatedHandler({\n      schema: {\n        request: SubRavRequestSchema,\n        response: SubRavResponseSchema,\n      },\n      handler: handleSubRavQuery,\n    }),\n    method: 'GET',\n    path: '/subrav',\n    options: { pricing: '0', authRequired: true },\n    description: 'Get SubRAV details (requires auth, users can only query their own)',\n  },\n\n  // Admin operations\n  adminStatus: {\n    handler: createValidatedHandler({\n      schema: {\n        request: AdminRequestSchema,\n        response: SystemStatusResponseSchema,\n      },\n      handler: handleAdminStatus,\n    }),\n    method: 'GET',\n    path: '/admin/status',\n    options: { pricing: '0', adminOnly: true },\n    description: 'Get system internal status (claims, processor, etc.) (admin only)',\n  },\n\n  adminClaimTrigger: {\n    handler: createValidatedHandler({\n      schema: {\n        request: ClaimTriggerRequestSchema,\n        response: ClaimTriggerResponseSchema,\n      },\n      handler: handleAdminClaimTrigger,\n    }),\n    method: 'POST',\n    path: '/admin/claim-trigger',\n    options: { pricing: '0', adminOnly: true },\n    description: 'Manually trigger claim for a specific channel (admin only)',\n  },\n} as const;\n\nexport * from './handlers';\n","import type { IPaymentChannelContract } from '../contracts/IPaymentChannelContract';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { Errors } from '../errors/codes';\n\n/**\n * Cache key for PaymentHub balance\n */\nexport interface HubBalanceCacheKey {\n  ownerDid: string;\n  assetId: string;\n}\n\n/**\n * Cached balance value with metadata\n */\nexport interface HubBalanceCacheValue {\n  balance: bigint;\n  updatedAt: number; // ms epoch\n  source: 'onchain' | 'adjusted';\n}\n\n/**\n * Configuration options for HubBalanceService\n */\nexport interface HubBalanceServiceOptions {\n  /** Contract instance for on-chain operations */\n  contract: IPaymentChannelContract;\n\n  /** Default asset ID if not specified in requests */\n  defaultAssetId: string;\n\n  /** Normal cache TTL in milliseconds (default: 5000ms = 5s) */\n  ttlMs?: number;\n\n  /** Negative cache TTL in milliseconds for zero balances (default: 2000ms = 2s) */\n  negativeTtlMs?: number;\n\n  /** Stale-while-revalidate window in milliseconds (default: 30000ms = 30s) */\n  staleWhileRevalidateMs?: number;\n\n  /** Maximum cache entries (LRU eviction, default: 10000) */\n  maxEntries?: number;\n\n  /** Debug logging */\n  debug?: boolean;\n}\n\n/**\n * Internal cache entry with expiration and staleness tracking\n */\ninterface CacheEntry extends HubBalanceCacheValue {\n  expiresAt: number;\n  staleAt: number;\n  isRefreshing?: boolean;\n}\n\n/**\n * Statistics for observability\n */\nexport interface HubBalanceStats {\n  size: number;\n  hits: number;\n  misses: number;\n  staleHits: number;\n  refreshes: number;\n  errors: number;\n}\n\n/**\n * PaymentHub balance service with short TTL caching and SWR (Stale-While-Revalidate)\n *\n * Features:\n * - Short TTL for balance freshness (2-5s recommended)\n * - Negative caching for zero balances (1-2s recommended)\n * - SWR: serve stale data while refreshing in background\n * - LRU eviction to prevent memory leaks\n * - No adjust() method to avoid local truth drift\n */\nexport class HubBalanceService {\n  private readonly contract: IPaymentChannelContract;\n  private readonly defaultAssetId: string;\n  private readonly ttlMs: number;\n  private readonly negativeTtlMs: number;\n  private readonly staleWhileRevalidateMs: number;\n  private readonly maxEntries: number;\n  private readonly logger: DebugLogger;\n\n  // LRU cache: Map maintains insertion order, we'll manage LRU manually\n  private readonly cache = new Map<string, CacheEntry>();\n  private readonly stats: HubBalanceStats = {\n    size: 0,\n    hits: 0,\n    misses: 0,\n    staleHits: 0,\n    refreshes: 0,\n    errors: 0,\n  };\n\n  constructor(options: HubBalanceServiceOptions) {\n    this.contract = options.contract;\n    this.defaultAssetId = options.defaultAssetId;\n    this.ttlMs = options.ttlMs ?? 5000; // 5s\n    this.negativeTtlMs = options.negativeTtlMs ?? 2000; // 2s\n    this.staleWhileRevalidateMs = options.staleWhileRevalidateMs ?? 30000; // 30s\n    this.maxEntries = options.maxEntries ?? 10000;\n\n    this.logger = DebugLogger.get('HubBalanceService');\n    this.logger.setLevel(options.debug ? 'debug' : 'info');\n\n    this.logger.info('HubBalanceService initialized', {\n      ttlMs: this.ttlMs,\n      negativeTtlMs: this.negativeTtlMs,\n      staleWhileRevalidateMs: this.staleWhileRevalidateMs,\n      maxEntries: this.maxEntries,\n    });\n  }\n\n  /**\n   * Get PaymentHub balance with caching and SWR\n   * Priority: cache hit > stale hit (with background refresh) > on-chain fetch\n   */\n  async getBalance(ownerDid: string, assetId?: string): Promise<bigint> {\n    const effectiveAssetId = assetId ?? this.defaultAssetId;\n    const cacheKey = this.buildCacheKey(ownerDid, effectiveAssetId);\n    const now = Date.now();\n\n    const entry = this.cache.get(cacheKey);\n\n    if (entry) {\n      // Move to end (LRU)\n      this.cache.delete(cacheKey);\n      this.cache.set(cacheKey, entry);\n\n      if (now < entry.expiresAt) {\n        // Fresh hit\n        this.stats.hits++;\n        this.logger.debug('Cache hit (fresh)', {\n          ownerDid,\n          assetId: effectiveAssetId,\n          balance: entry.balance.toString(),\n        });\n        return entry.balance;\n      } else if (now < entry.staleAt) {\n        // Stale hit - serve stale data while refreshing in background\n        this.stats.staleHits++;\n        this.logger.debug('Cache hit (stale)', {\n          ownerDid,\n          assetId: effectiveAssetId,\n          balance: entry.balance.toString(),\n        });\n\n        // Trigger background refresh if not already refreshing\n        if (!entry.isRefreshing) {\n          entry.isRefreshing = true;\n          this.refreshInBackground(ownerDid, effectiveAssetId, cacheKey).finally(() => {\n            if (this.cache.has(cacheKey)) {\n              this.cache.get(cacheKey)!.isRefreshing = false;\n            }\n          });\n        }\n\n        return entry.balance;\n      }\n      // Entry is too stale, fall through to fresh fetch\n    }\n\n    // Cache miss or entry too stale\n    this.stats.misses++;\n    this.logger.debug('Cache miss', { ownerDid, assetId: effectiveAssetId });\n\n    return this.fetchAndCache(ownerDid, effectiveAssetId, cacheKey);\n  }\n\n  /**\n   * Force refresh balance from on-chain (bypass cache)\n   */\n  async refresh(ownerDid: string, assetId: string): Promise<bigint> {\n    const cacheKey = this.buildCacheKey(ownerDid, assetId);\n    this.logger.debug('Force refresh', { ownerDid, assetId });\n\n    // Remove existing cache entry\n    this.cache.delete(cacheKey);\n    this.stats.refreshes++;\n\n    return this.fetchAndCache(ownerDid, assetId, cacheKey);\n  }\n\n  /**\n   * Get cache statistics for observability\n   */\n  getStats(): HubBalanceStats {\n    return {\n      ...this.stats,\n      size: this.cache.size,\n    };\n  }\n\n  /**\n   * Clear all cached entries\n   */\n  clear(): void {\n    this.cache.clear();\n    this.logger.info('Cache cleared');\n  }\n\n  /**\n   * Remove specific entry from cache\n   */\n  invalidate(ownerDid: string, assetId?: string): void {\n    const effectiveAssetId = assetId ?? this.defaultAssetId;\n    const cacheKey = this.buildCacheKey(ownerDid, effectiveAssetId);\n    this.cache.delete(cacheKey);\n    this.logger.debug('Cache entry invalidated', { ownerDid, assetId: effectiveAssetId });\n  }\n\n  private buildCacheKey(ownerDid: string, assetId: string): string {\n    return `${ownerDid}:${assetId}`;\n  }\n\n  private async fetchAndCache(\n    ownerDid: string,\n    assetId: string,\n    cacheKey: string\n  ): Promise<bigint> {\n    try {\n      this.logger.debug('Fetching balance from on-chain', { ownerDid, assetId });\n\n      const balance = await this.contract.getHubBalance(ownerDid, assetId);\n      const now = Date.now();\n\n      // Use negative TTL for zero balances\n      const ttl = balance === 0n ? this.negativeTtlMs : this.ttlMs;\n\n      const entry: CacheEntry = {\n        balance,\n        updatedAt: now,\n        source: 'onchain',\n        expiresAt: now + ttl,\n        staleAt: now + this.staleWhileRevalidateMs,\n        isRefreshing: false,\n      };\n\n      this.setCache(cacheKey, entry);\n\n      this.logger.debug('Balance cached', {\n        ownerDid,\n        assetId,\n        balance: balance.toString(),\n        ttl,\n        expiresAt: new Date(entry.expiresAt).toISOString(),\n      });\n\n      return balance;\n    } catch (error) {\n      this.stats.errors++;\n      this.logger.error('Failed to fetch balance', { ownerDid, assetId, error });\n      throw Errors.hubBalanceFetchFailed(error, ownerDid, assetId);\n    }\n  }\n\n  private async refreshInBackground(\n    ownerDid: string,\n    assetId: string,\n    cacheKey: string\n  ): Promise<void> {\n    try {\n      this.logger.debug('Background refresh started', { ownerDid, assetId });\n      await this.fetchAndCache(ownerDid, assetId, cacheKey);\n      this.logger.debug('Background refresh completed', { ownerDid, assetId });\n    } catch (error) {\n      this.logger.warn('Background refresh failed', { ownerDid, assetId, error });\n      // Don't throw - background refresh failures should not affect the response\n    }\n  }\n\n  private setCache(key: string, entry: CacheEntry): void {\n    // Implement LRU eviction\n    if (this.cache.size >= this.maxEntries) {\n      // Remove oldest entry (first in Map)\n      const firstKey = this.cache.keys().next().value;\n      if (firstKey) {\n        this.cache.delete(firstKey);\n        this.logger.debug('LRU eviction', { evictedKey: firstKey });\n      }\n    }\n\n    this.cache.set(key, entry);\n  }\n}\n","import type { IPaymentChannelContract } from '../contracts/IPaymentChannelContract';\nimport type { RAVRepository } from '../storage/interfaces/RAVRepository';\nimport type { ChannelRepository } from '../storage/interfaces/ChannelRepository';\nimport type { SignedSubRAV } from './types';\nimport { DebugLogger, type SignerInterface } from '@nuwa-ai/identity-kit';\n\n/**\n * Claim policy configuration\n */\nexport interface ClaimPolicy {\n  /** Minimum accumulated amount to trigger a claim */\n  minClaimAmount: bigint;\n\n  /** Maximum number of concurrent claims across all sub-channels */\n  maxConcurrentClaims: number;\n\n  /** Maximum retry attempts for failed claims */\n  maxRetries: number;\n\n  /** Delay between retry attempts in milliseconds */\n  retryDelayMs: number;\n\n  /** Whether to check PaymentHub balance before triggering claims */\n  requireHubBalance: boolean;\n\n  /** Fixed backoff when insufficient funds detected (ms) */\n  insufficientFundsBackoffMs: number;\n\n  /** Whether to count insufficient funds as failures in stats */\n  countInsufficientAsFailure: boolean;\n}\n\n/**\n * Default claim policy for reactive claims\n */\nexport const DEFAULT_REACTIVE_CLAIM_POLICY: ClaimPolicy = {\n  // 1 RGas minimum (10,000,000 base units)\n  minClaimAmount: BigInt('10000000'),\n  // Reactive mode can be more aggressive with concurrency\n  maxConcurrentClaims: 10,\n  maxRetries: 3,\n  retryDelayMs: 60_000,\n  requireHubBalance: true,\n  insufficientFundsBackoffMs: 30_000,\n  countInsufficientAsFailure: false,\n};\n\n/**\n * Configuration for ClaimTriggerService\n */\n// Input shape accepts string for minClaimAmount for convenience\nexport type ClaimPolicyInput = Omit<ClaimPolicy, 'minClaimAmount'> & {\n  minClaimAmount: bigint | string;\n};\n\nexport interface ClaimTriggerOptions {\n  /** Claim triggering policy (optional, uses DEFAULT_REACTIVE_CLAIM_POLICY if not provided) */\n  policy?: Partial<ClaimPolicyInput>;\n\n  /** Contract instance for on-chain claim operations */\n  contract: IPaymentChannelContract;\n\n  /** Signer for claim transactions (payee signer) */\n  signer: SignerInterface;\n\n  /** RAV repository to get latest signed SubRAVs */\n  ravRepo: RAVRepository;\n\n  /** Channel repository for SubChannelInfo state updates */\n  channelRepo: ChannelRepository;\n\n  /** Debug logging */\n  debug?: boolean;\n}\n\n/**\n * Claim task in the queue\n */\ninterface ClaimTask {\n  channelId: string;\n  vmIdFragment: string;\n  delta: bigint;\n  attempts: number;\n  nextRetryAt: number;\n  createdAt: number;\n}\n\n/**\n * Statistics for observability\n */\nexport interface ClaimTriggerStats {\n  /** Number of active claims currently processing */\n  active: number;\n\n  /** Number of tasks queued for processing */\n  queued: number;\n\n  /** Total successful claims */\n  successCount: number;\n\n  /** Total failed claims */\n  failedCount: number;\n\n  /** Total skipped claims (e.g., insufficient funds precheck) */\n  skippedCount: number;\n\n  /** Total insufficient funds occurrences */\n  insufficientFundsCount: number;\n\n  /** Number of tasks in backoff (waiting for retry) */\n  backoffCount: number;\n\n  /** Average claim processing time in milliseconds */\n  avgProcessingTimeMs: number;\n\n  /** Claim policy snapshot */\n  policy: ClaimPolicy;\n}\n\n/**\n * Result of a single claim execution attempt\n */\ntype ClaimExecutionResult =\n  | {\n      status: 'skipped';\n      reason:\n        | 'insufficient_funds'\n        | 'below_threshold'\n        | 'concurrency_limit'\n        | 'already_processing'\n        | 'already_queued';\n      context?: Record<string, unknown>;\n    }\n  | {\n      status: 'succeeded';\n      txHash: string;\n      claimedAmount?: bigint;\n    };\n\n/**\n * Event-driven Claim Trigger Service\n *\n * Replaces polling-based ClaimScheduler with reactive claim triggering.\n * Claims are triggered by incoming requests when delta reaches threshold.\n *\n * Features:\n * - Concurrent claim processing with limits\n * - Retry with exponential backoff\n * - Prevents duplicate claims for same sub-channel\n * - Comprehensive statistics and observability\n */\nexport class ClaimTriggerService {\n  private readonly policy: ClaimPolicy;\n  private readonly contract: IPaymentChannelContract;\n  private readonly signer: SignerInterface;\n  private readonly ravRepo: RAVRepository;\n  private readonly channelRepo: ChannelRepository;\n  private readonly logger: DebugLogger;\n\n  // Concurrency control\n  private readonly activeClaims = new Set<string>(); // \"${channelId}:${vmIdFragment}\"\n  private readonly claimQueue = new Map<string, ClaimTask>();\n\n  // Statistics\n  private readonly stats = {\n    successCount: 0,\n    failedCount: 0,\n    skippedCount: 0,\n    insufficientFundsCount: 0,\n    totalProcessingTime: 0,\n  };\n\n  // Processing workers\n  private processingInterval?: NodeJS.Timeout;\n  private readonly processingIntervalMs = 1000; // Check queue every 1s\n\n  constructor(options: ClaimTriggerOptions) {\n    // Merge user policy with defaults, ignoring null/undefined overrides\n    const overrides = options.policy ? this.sanitizePolicy(options.policy) : undefined;\n    this.policy = {\n      ...DEFAULT_REACTIVE_CLAIM_POLICY,\n      ...(overrides || {}),\n    };\n\n    this.contract = options.contract;\n    this.signer = options.signer;\n    this.ravRepo = options.ravRepo;\n    this.channelRepo = options.channelRepo;\n\n    this.logger = DebugLogger.get('ClaimTriggerService');\n    this.logger.setLevel(options.debug ? 'debug' : 'info');\n\n    this.logger.info('ClaimTriggerService initialized', {\n      minClaimAmount: this.policy.minClaimAmount.toString(),\n      maxConcurrentClaims: this.policy.maxConcurrentClaims,\n      maxRetries: this.policy.maxRetries,\n      requireHubBalance: this.policy.requireHubBalance,\n    });\n\n    // Start background processing\n    this.startProcessing();\n  }\n\n  private sanitizePolicy(policy: Partial<ClaimPolicyInput>): Partial<ClaimPolicy> {\n    const result: Partial<ClaimPolicy> = {};\n    for (const [key, value] of Object.entries(policy) as [keyof ClaimPolicyInput, any][]) {\n      if (value == null) continue;\n      if (key === 'minClaimAmount') {\n        (result as any)[key] = typeof value === 'string' ? BigInt(value) : value;\n      } else {\n        (result as any)[key] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Maybe queue a claim based on delta and policy\n   * Called from PaymentProcessor.persist()\n   */\n  async maybeQueue(channelId: string, vmIdFragment: string, delta: bigint): Promise<void> {\n    const key = this.buildKey(channelId, vmIdFragment);\n\n    this.logger.debug('maybeQueue called', {\n      channelId,\n      vmIdFragment,\n      delta: delta.toString(),\n      minClaimAmount: this.policy.minClaimAmount.toString(),\n    });\n\n    // Check if delta meets minimum threshold\n    if (delta < this.policy.minClaimAmount) {\n      this.logger.debug('Delta below threshold, skipping', {\n        delta: delta.toString(),\n        threshold: this.policy.minClaimAmount.toString(),\n      });\n      this.stats.skippedCount++;\n      return;\n    }\n\n    // Check if already processing this sub-channel\n    if (this.activeClaims.has(key)) {\n      this.logger.debug('Claim already in progress, skipping', { channelId, vmIdFragment });\n      this.stats.skippedCount++;\n      return;\n    }\n\n    // Check if already queued\n    if (this.claimQueue.has(key)) {\n      this.logger.debug('Claim already queued, updating delta', {\n        channelId,\n        vmIdFragment,\n        oldDelta: this.claimQueue.get(key)!.delta.toString(),\n        newDelta: delta.toString(),\n      });\n      // Update delta in existing task\n      this.claimQueue.get(key)!.delta = delta;\n      return;\n    }\n\n    // Check global concurrency limit (active + queued)\n    const totalInFlight = this.activeClaims.size + this.claimQueue.size;\n    if (totalInFlight >= this.policy.maxConcurrentClaims) {\n      this.logger.debug('Concurrent claims limit reached, skipping', {\n        totalInFlight,\n        limit: this.policy.maxConcurrentClaims,\n      });\n      this.stats.skippedCount++;\n      return;\n    }\n\n    // Queue the claim task\n    const task: ClaimTask = {\n      channelId,\n      vmIdFragment,\n      delta,\n      attempts: 0,\n      nextRetryAt: Date.now(),\n      createdAt: Date.now(),\n    };\n\n    this.claimQueue.set(key, task);\n    this.logger.info('Claim queued', { channelId, vmIdFragment, delta: delta.toString() });\n  }\n\n  /**\n   * Get current status and statistics\n   */\n  getStatus(): ClaimTriggerStats {\n    const now = Date.now();\n    const backoffCount = Array.from(this.claimQueue.values()).filter(\n      task => task.nextRetryAt > now\n    ).length;\n\n    return {\n      active: this.activeClaims.size,\n      queued: this.claimQueue.size,\n      successCount: this.stats.successCount,\n      failedCount: this.stats.failedCount,\n      skippedCount: this.stats.skippedCount,\n      insufficientFundsCount: this.stats.insufficientFundsCount,\n      backoffCount,\n      avgProcessingTimeMs:\n        this.stats.successCount > 0 ? this.stats.totalProcessingTime / this.stats.successCount : 0,\n      policy: {\n        minClaimAmount: this.policy.minClaimAmount,\n        maxConcurrentClaims: this.policy.maxConcurrentClaims,\n        maxRetries: this.policy.maxRetries,\n        retryDelayMs: this.policy.retryDelayMs,\n        requireHubBalance: this.policy.requireHubBalance,\n        insufficientFundsBackoffMs: this.policy.insufficientFundsBackoffMs,\n        countInsufficientAsFailure: this.policy.countInsufficientAsFailure,\n      },\n    };\n  }\n\n  /**\n   * Getter for current claim policy\n   */\n  getPolicy(): ClaimPolicy {\n    return this.policy;\n  }\n\n  /**\n   * Stop background processing\n   */\n  destroy(): void {\n    if (this.processingInterval) {\n      clearInterval(this.processingInterval);\n      this.processingInterval = undefined;\n    }\n    this.logger.info('ClaimTriggerService destroyed');\n  }\n\n  private buildKey(channelId: string, vmIdFragment: string): string {\n    return `${channelId}:${vmIdFragment}`;\n  }\n\n  /**\n   * Test helper: process the queue immediately once without waiting for interval\n   */\n  async processNow(): Promise<void> {\n    await this.processQueue();\n  }\n\n  private startProcessing(): void {\n    this.processingInterval = setInterval(() => {\n      this.processQueue().catch(error => {\n        this.logger.error('Queue processing error', { error });\n      });\n    }, this.processingIntervalMs);\n  }\n\n  private async processQueue(): Promise<void> {\n    const now = Date.now();\n\n    // Find tasks ready for processing\n    const readyTasks: ClaimTask[] = [];\n    for (const [key, task] of this.claimQueue) {\n      if (task.nextRetryAt <= now && !this.activeClaims.has(key)) {\n        readyTasks.push(task);\n      }\n    }\n\n    if (readyTasks.length === 0) {\n      return;\n    }\n\n    this.logger.debug('Processing queue', { readyTasks: readyTasks.length });\n\n    // Process tasks up to concurrency limit\n    const slotsAvailable = this.policy.maxConcurrentClaims - this.activeClaims.size;\n    const tasksToProcess = readyTasks.slice(0, slotsAvailable);\n\n    for (const task of tasksToProcess) {\n      const key = this.buildKey(task.channelId, task.vmIdFragment);\n\n      // Remove from queue and mark as active\n      this.claimQueue.delete(key);\n      this.activeClaims.add(key);\n\n      // Process task asynchronously\n      this.processClaimTask(task, key).finally(() => {\n        this.activeClaims.delete(key);\n      });\n    }\n  }\n\n  private async processClaimTask(task: ClaimTask, key: string): Promise<void> {\n    const startTime = Date.now();\n    task.attempts++;\n\n    this.logger.info('Processing claim', {\n      channelId: task.channelId,\n      vmIdFragment: task.vmIdFragment,\n      delta: task.delta.toString(),\n      attempt: task.attempts,\n    });\n\n    try {\n      const result = await this.executeClaim(task.channelId, task.vmIdFragment);\n\n      if (result.status === 'succeeded') {\n        // Success\n        const processingTime = Date.now() - startTime;\n        this.stats.successCount++;\n        this.stats.totalProcessingTime += processingTime;\n\n        this.logger.info('Claim successful', {\n          channelId: task.channelId,\n          vmIdFragment: task.vmIdFragment,\n          processingTimeMs: processingTime,\n          txHash: result.txHash,\n        });\n        return;\n      }\n\n      if (result.status === 'skipped') {\n        // Skipped due to preconditions (e.g., insufficient funds)\n        this.stats.skippedCount++;\n        if (result.reason === 'insufficient_funds') {\n          this.stats.insufficientFundsCount++;\n        }\n        // Schedule backoff for insufficient funds\n        const backoffMs =\n          result.reason === 'insufficient_funds'\n            ? this.policy.insufficientFundsBackoffMs\n            : this.policy.retryDelayMs;\n        task.nextRetryAt = Date.now() + backoffMs;\n        this.logger.warn('Claim skipped due to precondition', {\n          channelId: task.channelId,\n          vmIdFragment: task.vmIdFragment,\n          reason: result.reason,\n          backoffMs,\n        });\n        // Re-queue for later\n        this.claimQueue.set(key, task);\n        return;\n      }\n    } catch (error) {\n      this.logger.error('Claim failed', {\n        channelId: task.channelId,\n        vmIdFragment: task.vmIdFragment,\n        attempt: task.attempts,\n        error,\n      });\n\n      // Check if should retry\n      if (task.attempts < this.policy.maxRetries) {\n        // Uniform exponential backoff for unexpected errors.\n        const backoffMs = this.policy.retryDelayMs * Math.pow(2, task.attempts - 1);\n\n        task.nextRetryAt = Date.now() + backoffMs;\n\n        // Re-queue for retry\n        this.claimQueue.set(key, task);\n\n        this.logger.info('Claim scheduled for retry', {\n          channelId: task.channelId,\n          vmIdFragment: task.vmIdFragment,\n          attempt: task.attempts,\n          nextRetryAt: new Date(task.nextRetryAt).toISOString(),\n          backoffMs,\n        });\n      } else {\n        // Max retries reached\n        this.stats.failedCount++;\n        this.logger.error('Claim failed permanently after max retries', {\n          channelId: task.channelId,\n          vmIdFragment: task.vmIdFragment,\n          maxRetries: this.policy.maxRetries,\n        });\n      }\n    }\n  }\n\n  private async executeClaim(\n    channelId: string,\n    vmIdFragment: string\n  ): Promise<ClaimExecutionResult> {\n    this.logger.debug('Executing claim', { channelId, vmIdFragment });\n\n    // Get latest signed SubRAV\n    const latestSignedRAV = await this.ravRepo.getLatest(channelId, vmIdFragment);\n    if (!latestSignedRAV) {\n      throw new Error(`No signed SubRAV found for ${channelId}:${vmIdFragment}`);\n    }\n\n    // Get current sub-channel info for delta calculation\n    const subChannelInfo = await this.channelRepo.getSubChannelState(channelId, vmIdFragment);\n    if (!subChannelInfo) {\n      throw new Error(`No SubChannelInfo found for channel ${channelId}:${vmIdFragment}`);\n    }\n\n    // Get channel metadata to access assetId and payerDid\n    const channelMetadata = await this.channelRepo.getChannelMetadata(channelId);\n    if (!channelMetadata) {\n      throw new Error(`No ChannelInfo found for channel ${channelId}`);\n    }\n\n    // Calculate delta (amount to claim)\n    const accumulatedAmount = latestSignedRAV.subRav.accumulatedAmount;\n    const lastClaimedAmount = subChannelInfo.lastClaimedAmount;\n    const delta =\n      accumulatedAmount > lastClaimedAmount ? accumulatedAmount - lastClaimedAmount : 0n;\n\n    this.logger.debug('Found latest signed SubRAV with detailed info', {\n      channelId,\n      vmIdFragment,\n      nonce: latestSignedRAV.subRav.nonce.toString(),\n      accumulatedAmount: accumulatedAmount.toString(),\n      lastClaimedAmount: lastClaimedAmount.toString(),\n      delta: delta.toString(),\n      assetId: channelMetadata.assetId,\n      payerDid: channelMetadata.payerDid,\n      payeeDid: channelMetadata.payeeDid,\n    });\n\n    // Verify on-chain balance before attempting claim\n    try {\n      const onChainBalance = await this.contract.getHubBalance(\n        channelMetadata.payerDid,\n        channelMetadata.assetId\n      );\n      this.logger.debug('On-chain hub balance verification', {\n        channelId,\n        payerDid: channelMetadata.payerDid,\n        assetId: channelMetadata.assetId,\n        onChainBalance: onChainBalance.toString(),\n        deltaToWithdraw: delta.toString(),\n        sufficient: onChainBalance >= delta,\n        minClaimAmount: this.policy.minClaimAmount.toString(),\n      });\n\n      if (onChainBalance < delta) {\n        this.logger.warn('Insufficient on-chain hub balance detected before claim', {\n          channelId,\n          payerDid: channelMetadata.payerDid,\n          assetId: channelMetadata.assetId,\n          onChainBalance: onChainBalance.toString(),\n          deltaToWithdraw: delta.toString(),\n          deficit: (delta - onChainBalance).toString(),\n        });\n\n        // Return skipped result instead of throwing\n        return {\n          status: 'skipped',\n          reason: 'insufficient_funds',\n          context: {\n            onChainBalance: onChainBalance.toString(),\n            delta: delta.toString(),\n            payerDid: channelMetadata.payerDid,\n            assetId: channelMetadata.assetId,\n          },\n        };\n      }\n    } catch (balanceError) {\n      // For balance API errors, log and continue (do not skip)\n      this.logger.warn('Failed to verify on-chain balance before claim', {\n        channelId,\n        payerDid: channelMetadata.payerDid,\n        assetId: channelMetadata.assetId,\n        error: balanceError instanceof Error ? balanceError.message : String(balanceError),\n      });\n      // Continue with claim attempt\n    }\n\n    // Execute claim on-chain\n    this.logger.debug('Attempting claim on-chain', {\n      channelId,\n      vmIdFragment,\n    });\n\n    const claimResult = await this.contract.claimFromChannel({\n      signedSubRAV: latestSignedRAV,\n      signer: this.signer,\n    });\n\n    this.logger.debug('Claim transaction submitted', {\n      channelId,\n      vmIdFragment,\n      txHash: claimResult.txHash,\n      claimedAmount: claimResult.claimedAmount?.toString(),\n    });\n\n    // Update local state after successful claim\n    await Promise.all([\n      // Update SubChannelInfo state\n      this.channelRepo.updateSubChannelState(channelId, vmIdFragment, {\n        lastClaimedAmount: latestSignedRAV.subRav.accumulatedAmount,\n        lastConfirmedNonce: latestSignedRAV.subRav.nonce,\n        lastUpdated: Date.now(),\n      }),\n\n      // Mark RAV as claimed\n      this.ravRepo.markAsClaimed(channelId, vmIdFragment, latestSignedRAV.subRav.nonce),\n    ]);\n\n    this.logger.debug('Successfully updated local state after claim', {\n      channelId,\n      vmIdFragment,\n      newLastClaimedAmount: latestSignedRAV.subRav.accumulatedAmount.toString(),\n      newLastConfirmedNonce: latestSignedRAV.subRav.nonce.toString(),\n    });\n\n    this.logger.info('Local state updated after claim', {\n      channelId,\n      vmIdFragment,\n      lastClaimedAmount: latestSignedRAV.subRav.accumulatedAmount.toString(),\n      lastConfirmedNonce: latestSignedRAV.subRav.nonce.toString(),\n    });\n\n    return {\n      status: 'succeeded',\n      txHash: claimResult.txHash,\n      claimedAmount: claimResult.claimedAmount,\n    };\n  }\n}\n","export { SqlChannelRepository, type SqlChannelRepositoryOptions } from './channel.sql';\n\nexport { SqlRAVRepository, type SqlRAVRepositoryOptions } from './rav.sql';\n\nexport {\n  SqlPendingSubRAVRepository,\n  type SqlPendingSubRAVRepositoryOptions,\n} from './pendingSubRav.sql';\n\nexport { encodeSubRAV, decodeSubRAV, getSubRAVHex } from './serialization';\n\n// Node-only async factory to create repositories with a pg Pool loaded via dynamic import\nimport type { ChannelRepository } from '../interfaces/ChannelRepository';\nimport type { RAVRepository } from '../interfaces/RAVRepository';\nimport type { PendingSubRAVRepository } from '../interfaces/PendingSubRAVRepository';\nimport { SqlChannelRepository } from './channel.sql';\nimport { SqlRAVRepository } from './rav.sql';\nimport { SqlPendingSubRAVRepository } from './pendingSubRav.sql';\n\nexport async function createSqlStorageRepositories(options: {\n  connectionString: string;\n  tablePrefix?: string;\n  autoMigrate?: boolean;\n  allowUnsafeAutoMigrateInProd?: boolean;\n}): Promise<{\n  channelRepo: ChannelRepository;\n  ravRepo: RAVRepository;\n  pendingSubRAVRepo: PendingSubRAVRepository;\n}> {\n  const { connectionString, tablePrefix, autoMigrate, allowUnsafeAutoMigrateInProd } = options;\n  const { Pool } = await import('pg');\n  const isSupabase = connectionString.includes('supabase');\n  const pool = new Pool({\n    connectionString,\n    ssl: isSupabase ? { rejectUnauthorized: false } : false,\n  });\n\n  return {\n    channelRepo: new SqlChannelRepository({\n      pool,\n      tablePrefix,\n      autoMigrate,\n      allowUnsafeAutoMigrateInProd,\n    }),\n    ravRepo: new SqlRAVRepository({\n      pool,\n      tablePrefix,\n      autoMigrate,\n      allowUnsafeAutoMigrateInProd,\n    }),\n    pendingSubRAVRepo: new SqlPendingSubRAVRepository({\n      pool,\n      tablePrefix,\n      autoMigrate,\n      allowUnsafeAutoMigrateInProd,\n    }),\n  };\n}\n","import { PaymentProcessor } from '../../core/PaymentProcessor';\nimport type { BillingContext } from '../../billing';\nimport type { BillingRule, RuleProvider } from '../../billing';\nimport { findRule } from '../../billing/core/rule-matcher';\nimport type {\n  PaymentRequestPayload,\n  PaymentResponsePayload,\n  SerializableResponsePayload,\n  SerializableRequestPayload,\n} from '../../core/types';\nimport { HttpPaymentCodec } from '../http/HttpPaymentCodec';\nimport { DebugLogger, type DIDResolver, DIDAuth } from '@nuwa-ai/identity-kit';\n\nexport interface McpBillingMiddlewareConfig {\n  processor: PaymentProcessor;\n  ruleProvider: RuleProvider;\n  didResolver: DIDResolver;\n  debug?: boolean;\n}\n\nexport interface McpRequestContext {\n  method: string; // tool name, e.g., 'nuwa.health' or business tool\n  params: Record<string, any> & {\n    __nuwa_auth?: string;\n    __nuwa_payment?: SerializableRequestPayload;\n  };\n}\n\nexport interface McpResponseContext<T = any> {\n  data: T;\n  __nuwa_payment?: SerializableResponsePayload | undefined;\n}\n\nexport class McpBillingMiddleware {\n  private readonly processor: PaymentProcessor;\n  private readonly ruleProvider: RuleProvider;\n  private readonly didResolver: DIDResolver;\n  private readonly logger: DebugLogger;\n\n  constructor(cfg: McpBillingMiddlewareConfig) {\n    this.processor = cfg.processor;\n    this.ruleProvider = cfg.ruleProvider;\n    this.didResolver = cfg.didResolver;\n    this.logger = DebugLogger.get('McpBillingMiddleware');\n    this.logger.setLevel(cfg.debug ? 'debug' : 'info');\n  }\n\n  /** Pre-process to build BillingContext (align with HTTP new API) */\n  async handleWithNewAPI(method: string, params: any, meta?: any): Promise<BillingContext | null> {\n    const rule = this.findBillingRule(method);\n    if (!rule) return null;\n\n    const paymentData = this.extractPaymentData(params);\n    const didInfo = await this.extractDidInfo(params?.__nuwa_auth);\n    this.logger.debug('extract paymentData and didInfo from params', {\n      params,\n      paymentData,\n      didInfo,\n    });\n    // Enforce auth when rule requires it (note: recovery requires auth)\n    if ((rule as any)?.authRequired && !params?.__nuwa_auth) {\n      const unauthorizedCtx = this.buildBillingContext(method, paymentData || undefined, rule, {\n        ...(meta || {}),\n        didInfo,\n      });\n      (unauthorizedCtx as any).state = {\n        error: { code: 'UNAUTHORIZED', message: 'Authorization required' },\n      };\n      return unauthorizedCtx;\n    }\n    // (no-op)\n    const ctx = this.buildBillingContext(method, paymentData || undefined, rule, {\n      ...(meta || {}),\n      didInfo,\n    });\n    const processed = await this.processor.preProcess(ctx);\n    return processed;\n  }\n\n  /** After business handler returns, settle and inject payment data */\n  async settle<T = any>(\n    ctx: BillingContext,\n    businessResult: T,\n    usage?: number\n  ): Promise<McpResponseContext<T>> {\n    const settled = this.processor.settle(ctx, usage);\n\n    let structured: SerializableResponsePayload | undefined;\n\n    // Prefer structured payload on state for protocol-agnostic rendering\n    const payload = settled.state?.responsePayload;\n    if (payload) {\n      structured = HttpPaymentCodec.toJSONResponse(payload);\n    }\n\n    // Persist if needed\n    if (settled.state?.unsignedSubRav) {\n      await this.processor.persist(settled);\n    }\n\n    return { data: businessResult, __nuwa_payment: structured };\n  }\n\n  private findBillingRule(toolName: string): BillingRule | undefined {\n    // Match BillableRouter's HTTP-style rules\n    const meta = { method: 'POST', path: `/tool/${toolName}` } as any;\n    return findRule(meta, this.ruleProvider.getRules());\n  }\n\n  private extractPaymentData(params: any): PaymentRequestPayload | null {\n    const p = params?.__nuwa_payment;\n    if (!p) return null;\n    const signed = p.signedSubRav\n      ? ((HttpPaymentCodec as any).deserializeSignedSubRAV?.(p.signedSubRav) ?? p.signedSubRav)\n      : undefined;\n    return {\n      version: p.version || 1,\n      clientTxRef: p.clientTxRef,\n      maxAmount: p.maxAmount ? BigInt(p.maxAmount) : BigInt(0),\n      signedSubRav: signed,\n    } as PaymentRequestPayload;\n  }\n\n  private buildBillingContext(\n    toolName: string,\n    paymentData: PaymentRequestPayload | undefined,\n    billingRule: BillingRule | undefined,\n    meta?: any\n  ): BillingContext {\n    return {\n      serviceId: this.processor.getServiceId(),\n      meta: {\n        operation: `MCP:tool/${toolName}`,\n        billingRule,\n        maxAmount: paymentData?.maxAmount,\n        signedSubRav: paymentData?.signedSubRav,\n        clientTxRef: paymentData?.clientTxRef || crypto.randomUUID(),\n        didInfo: meta?.didInfo,\n        mcpMethod: toolName,\n      },\n    };\n  }\n\n  async extractDidInfo(authHeader?: string): Promise<{ did: string; keyId: string } | undefined> {\n    if (!authHeader) {\n      this.logger.debug('extractDidInfo: no authHeader provided');\n      return undefined;\n    }\n\n    this.logger.debug('extractDidInfo: processing authHeader', {\n      authHeaderLength: authHeader.length,\n      authHeaderPrefix: authHeader.substring(0, 50) + '...',\n    });\n\n    try {\n      // Verify and parse DIDAuthV1 header using the injected didResolver\n      this.logger.debug('extractDidInfo: calling DIDAuth.v1.verifyAuthHeader');\n      const verify = await DIDAuth.v1.verifyAuthHeader(authHeader, this.didResolver);\n\n      this.logger.debug('extractDidInfo: verifyAuthHeader result', {\n        ok: verify.ok,\n        hasSignedObject: !!verify.signedObject,\n        error: !verify.ok ? verify.error : undefined,\n      });\n\n      if (!verify.ok) {\n        this.logger.warn('extractDidInfo: DIDAuth verification failed', { error: verify.error });\n        return undefined;\n      }\n\n      if (!verify.signedObject) {\n        this.logger.warn('extractDidInfo: no signedObject in verification result');\n        return undefined;\n      }\n\n      const sig = verify.signedObject.signature;\n      this.logger.debug('extractDidInfo: signature info', {\n        hasSignature: !!sig,\n        signerDid: sig?.signer_did,\n        keyId: sig?.key_id,\n      });\n\n      if (!sig?.signer_did || !sig?.key_id) {\n        this.logger.warn('extractDidInfo: missing signer_did or key_id in signature', {\n          signerDid: sig?.signer_did,\n          keyId: sig?.key_id,\n        });\n        return undefined;\n      }\n\n      const result = { did: sig.signer_did, keyId: sig.key_id };\n      this.logger.debug('extractDidInfo: successfully extracted didInfo', result);\n      return result;\n    } catch (error) {\n      this.logger.error('extractDidInfo: exception occurred', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return undefined;\n    }\n  }\n}\n","import { BillableRouter } from '../express/BillableRouter';\nimport type { RouteOptions } from '../express/BillableRouter';\nimport type { SignerInterface, DIDResolver, IdentityEnv } from '@nuwa-ai/identity-kit';\nimport { VDRRegistry, RoochVDR, DIDAuth, DebugLogger } from '@nuwa-ai/identity-kit';\nimport { RoochPaymentChannelContract } from '../../rooch/RoochPaymentChannelContract';\nimport type { IPaymentChannelContract } from '../../contracts/IPaymentChannelContract';\nimport { PaymentChannelPayeeClient } from '../../client/PaymentChannelPayeeClient';\nimport { ContractRateProvider } from '../../billing/rate/contract';\nimport type { RateProvider } from '../../billing';\nimport {\n  createStorageRepositories,\n  type ChannelRepository,\n  type RAVRepository,\n  type PendingSubRAVRepository,\n} from '../../storage';\nimport { PaymentProcessor } from '../../core/PaymentProcessor';\nimport { HubBalanceService } from '../../core/HubBalanceService';\nimport { ClaimTriggerService, DEFAULT_REACTIVE_CLAIM_POLICY } from '../../core/ClaimTriggerService';\nimport { McpBillingMiddleware } from '../../middlewares/mcp/McpBillingMiddleware';\nimport { BuiltInApiHandlers } from '../../api';\nimport { ErrorCode, type ApiContext } from '../../types/api';\nimport { registerBuiltinStrategies } from '../../billing/strategies';\nimport { HttpPaymentCodec } from '../../middlewares/http/HttpPaymentCodec';\nimport { serializeJson } from '../../utils/json';\nimport { PaymentKitError } from '../../errors/PaymentKitError';\nimport { getChainConfigFromEnv } from '../../helpers/fromIdentityEnv';\n\nexport interface McpPaymentKitOptions {\n  serviceId: string;\n  signer: SignerInterface;\n  rpcUrl?: string;\n  network?: 'local' | 'dev' | 'test' | 'main';\n  defaultAssetId?: string;\n  defaultPricePicoUSD?: string | bigint;\n  adminDid?: string | string[];\n  debug?: boolean;\n}\n\nexport class McpPaymentKit {\n  private readonly billableRouter: BillableRouter;\n  private readonly middleware: McpBillingMiddleware;\n  private readonly logger: DebugLogger;\n  private readonly handlers: Map<\n    string,\n    {\n      handler: (params: any, context?: any) => Promise<any>;\n      options: RouteOptions;\n      ruleId?: string;\n    }\n  >;\n\n  constructor(\n    private readonly opts: McpPaymentKitOptions,\n    private readonly deps: {\n      contract: IPaymentChannelContract;\n      signer: SignerInterface;\n      didResolver: DIDResolver;\n      rateProvider: RateProvider;\n      serviceDid: string;\n      processor: PaymentProcessor;\n      payeeClient: PaymentChannelPayeeClient;\n      channelRepo: ChannelRepository;\n      ravRepo: RAVRepository;\n      pendingSubRAVRepo: PendingSubRAVRepository;\n    }\n  ) {\n    this.logger = DebugLogger.get('McpPaymentKit');\n    this.logger.setLevel(opts.debug ? 'debug' : 'info');\n    this.billableRouter = new BillableRouter({\n      serviceId: opts.serviceId,\n      defaultPricePicoUSD: opts.defaultPricePicoUSD,\n    });\n    this.middleware = new McpBillingMiddleware({\n      processor: deps.processor,\n      ruleProvider: this.billableRouter,\n      didResolver: deps.didResolver,\n      debug: opts.debug,\n    });\n    this.handlers = new Map();\n  }\n\n  register(\n    name: string,\n    options: RouteOptions,\n    handler: (params: any, context?: any) => Promise<any>,\n    ruleId?: string\n  ): this {\n    // Register a synthetic HTTP rule for matcher reuse\n    const path = `/tool/${name}`;\n    (this.billableRouter as any).post(\n      path,\n      options,\n      ((_req: any, _res: any, next: any) => next?.()) as any,\n      ruleId\n    );\n    // Store handler mapping\n    this.handlers.set(name, { handler, options, ruleId });\n    return this;\n  }\n\n  async invoke(name: string, params: any, context?: any): Promise<any> {\n    const rid = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\n    const entry = this.handlers.get(name);\n    if (!entry) {\n      return {\n        error: {\n          code: 'METHOD_NOT_FOUND',\n          message: `Tool '${name}' not found`,\n        },\n      } as any;\n    }\n\n    // Step A: preProcess (billable or other tools)\n    const contextWithRid = { ...(context || {}), requestId: rid } as any;\n    const safeParams = params ?? {};\n    const ctx = await this.middleware.handleWithNewAPI(name, safeParams, contextWithRid);\n    if (!ctx) {\n      const content: any[] = [];\n      try {\n        const result = await entry.handler(safeParams, context);\n\n        if (result && typeof result === 'object' && Array.isArray((result as any).content)) {\n          content.push(...(result as any).content);\n        } else if (result !== undefined) {\n          content.push({ type: 'text', text: serializeJson(result) });\n        }\n      } catch (e) {\n        // Log error with full stack trace\n        this.logger.error('Failed to invoke tool', {\n          cause: e,\n          name,\n          params,\n          stack: e instanceof Error ? e.stack : undefined,\n          message: e instanceof Error ? e.message : String(e),\n        });\n        \n        // Return error to client\n        content.push({\n          type: 'text',\n          text: JSON.stringify({\n            code: 500,\n            error: e instanceof Error ? e.message : String(e),\n            details: {\n              tool: name,\n              timestamp: new Date().toISOString(),\n            }\n          })\n        });\n      }\n\n      return { content } as any;\n    }\n    if (ctx.state?.error) {\n      // Prefer structured response payload populated in preProcess (includes pending subRav)\n      if (ctx.state.responsePayload) {\n        const payment = HttpPaymentCodec.toJSONResponse(ctx.state.responsePayload);\n        const content: any[] = [HttpPaymentCodec.buildMcpPaymentResource(payment as any)];\n        return { content } as any;\n      }\n      // No header fallback in MCP path\n      // Final fallback to minimal structured error (no subRAV)\n      const decoded = {\n        error: ctx.state.error,\n        clientTxRef: ctx.meta.clientTxRef,\n        version: 1,\n      } as any;\n      const paymentOnly = HttpPaymentCodec.toJSONResponse(decoded);\n      return { content: [HttpPaymentCodec.buildMcpPaymentResource(paymentOnly as any)] } as any;\n    }\n\n    // Step B: business handler — pass didInfo via FastMCP context rather than mutating params\n    const contextWithDid = ctx?.meta?.didInfo\n      ? { ...(context || {}), didInfo: ctx.meta.didInfo }\n      : context;\n    \n    let result;\n    try {\n      result = await entry.handler(safeParams, contextWithDid);\n    } catch (e) {\n      // Log error with full stack trace\n      this.logger.error('Tool handler execution failed', {\n        cause: e,\n        name,\n        params,\n        stack: e instanceof Error ? e.stack : undefined,\n        message: e instanceof Error ? e.message : String(e),\n        context: contextWithDid,\n      });\n      \n      // Return error in MCP format\n      const errorContent = {\n        type: 'text',\n        text: JSON.stringify({\n          code: 500,\n          error: e instanceof Error ? e.message : String(e),\n          details: {\n            tool: name,\n            timestamp: new Date().toISOString(),\n          }\n        })\n      };\n      \n      return { content: [errorContent] } as any;\n    }\n\n    // Step C/D: settle + persist\n    // If middleware flagged to skip billing (e.g., nuwa.recovery), return plain result\n    if ((ctx as any).__skipBilling) {\n      const content: any[] = [];\n      if (result && typeof result === 'object' && Array.isArray((result as any).content)) {\n        content.push(...(result as any).content);\n      } else if (result !== undefined) {\n        content.push({ type: 'text', text: serializeJson(result) });\n      }\n\n      return { content } as any;\n    }\n    const settled = await this.middleware.settle(ctx, result, (result as any)?.__usage);\n\n    // Build MCP content array, separating payment info as a dedicated resource item\n    const content: any[] = [];\n    const dataPayload = settled?.data ?? result;\n    if (\n      dataPayload &&\n      typeof dataPayload === 'object' &&\n      Array.isArray((dataPayload as any).content)\n    ) {\n      content.push(...(dataPayload as any).content);\n    } else if (dataPayload !== undefined) {\n      content.push({ type: 'text', text: serializeJson(dataPayload) });\n    }\n    if ((settled as any)?.__nuwa_payment) {\n      content.push(\n        HttpPaymentCodec.buildMcpPaymentResource((settled as any).__nuwa_payment as any)\n      );\n    }\n    this.logger.debug('MCP invoke end', { rid, name } as any);\n    return { content } as any;\n  }\n\n  listTools(): string[] {\n    return Array.from(this.handlers.keys());\n  }\n\n  // getHandlers removed in favor of listTools() + invoke()\n\n  /** Register built-in Nuwa handlers as MCP tools with billing options */\n  registerBuiltIns(): this {\n    const ctx: ApiContext = {\n      config: {\n        serviceId: this.opts.serviceId,\n        serviceDid: this.getServiceDid(),\n        defaultAssetId: this.opts.defaultAssetId || '0x3::gas_coin::RGas',\n        defaultPricePicoUSD: this.opts.defaultPricePicoUSD?.toString(),\n        adminDid: this.opts.adminDid,\n        debug: this.opts.debug,\n      },\n      payeeClient: this.getPayeeClient(),\n      rateProvider: this.getRateProvider(),\n      claimTriggerService: undefined,\n      processor: this.getProcessor(),\n      ravRepository: this.getRepositories().ravRepo,\n      channelRepo: this.getRepositories().channelRepo,\n      pendingSubRAVStore: this.getRepositories().pendingSubRAVRepo,\n    } as ApiContext;\n\n    const mapName = (key: string): string => {\n      switch (key) {\n        case 'health':\n          return 'nuwa.health';\n        case 'discovery':\n          return 'nuwa.discovery';\n        case 'recovery':\n          return 'nuwa.recovery';\n        case 'commit':\n          return 'nuwa.commit';\n        case 'adminStatus':\n          return 'nuwa.admin.status';\n        case 'adminClaimTrigger':\n          return 'nuwa.admin.claimTrigger';\n        case 'subravQuery':\n          return 'nuwa.subrav.query';\n        default:\n          return `nuwa.${key}`;\n      }\n    };\n\n    for (const [key, cfg] of Object.entries(BuiltInApiHandlers)) {\n      const methodName = mapName(key);\n      const routeOptions = cfg.options;\n      const handler = async (params: any, context?: any) => {\n        // Built-in handlers expect DID info on the request object; enrich from FastMCP context\n        const req = context?.didInfo ? { ...params, didInfo: context.didInfo } : params;\n        const res = await cfg.handler(ctx as any, req);\n        // If handler follows ApiResponse envelope, normalize:\n        if (res && typeof res === 'object' && 'success' in (res as any)) {\n          const ok = Boolean((res as any).success);\n          if (!ok) {\n            const e = (res as any).error;\n            // Throw error → FastMCP 将按 JSON-RPC error 返回\n            throw new PaymentKitError(\n              e?.code || 'INTERNAL_ERROR',\n              e?.message || 'Error',\n              e?.httpStatus || 500,\n              e?.details\n            );\n          }\n          return (res as any).data;\n        } else {\n          this.logger.error('Unexpect api response:', res);\n          throw new PaymentKitError(ErrorCode.INTERNAL_ERROR, 'Unexpect api response');\n        }\n      };\n      this.register(methodName, routeOptions, handler, key);\n    }\n\n    // Add MCP discovery tool (FREE). Express variant lives at well-known path, so we add here for MCP\n    this.register(\n      'nuwa.discovery',\n      { pricing: '0', authRequired: false } as any,\n      async () => {\n        this.logger.debug('MCP built-in nuwa.discovery executed');\n        return {\n          serviceId: this.opts.serviceId,\n          serviceDid: this.getServiceDid(),\n          defaultAssetId: this.opts.defaultAssetId || '0x3::gas_coin::RGas',\n        } as any;\n      },\n      'discovery'\n    );\n\n    this.logger.debug('MCP built-in tools registered', {\n      tools: this.listTools(),\n      total: this.listTools().length,\n    } as any);\n\n    return this;\n  }\n\n  getPayeeClient(): PaymentChannelPayeeClient {\n    return this.deps.payeeClient;\n  }\n\n  getRateProvider(): RateProvider {\n    return this.deps.rateProvider;\n  }\n\n  getProcessor(): PaymentProcessor {\n    return this.deps.processor;\n  }\n\n  getServiceDid(): string {\n    return this.deps.serviceDid;\n  }\n\n  getRepositories() {\n    return {\n      channelRepo: this.deps.channelRepo,\n      ravRepo: this.deps.ravRepo,\n      pendingSubRAVRepo: this.deps.pendingSubRAVRepo,\n    };\n  }\n\n  /**\n   * Cleanup background resources (timers, caches, etc.) started by the kit\n   */\n  destroy(): void {\n    try {\n      this.deps.processor?.destroy?.();\n    } catch {}\n  }\n}\n\nexport async function createMcpPaymentKit(config: McpPaymentKitOptions) {\n  const serviceDid = await (async () => {\n    const maybe = (config.signer as any).getDid?.();\n    return typeof maybe?.then === 'function' ? await maybe : maybe;\n  })();\n\n  const rpcUrl = config.rpcUrl;\n  const network = config.network || 'test';\n  const contract = new RoochPaymentChannelContract({\n    rpcUrl,\n    network,\n    debug: config.debug || false,\n  });\n  const roochVDR = new RoochVDR({ rpcUrl, network });\n  const vdrRegistry = VDRRegistry.getInstance();\n  vdrRegistry.registerVDR(roochVDR);\n  const rateProvider = new ContractRateProvider(contract, 30_000);\n\n  // Storage (memory by default)\n  const { channelRepo, ravRepo, pendingSubRAVRepo } = createStorageRepositories({\n    backend: 'memory',\n    tablePrefix: 'nuwa_',\n    autoMigrate: true,\n  });\n\n  const payeeClient = new PaymentChannelPayeeClient({\n    contract,\n    signer: config.signer,\n    didResolver: vdrRegistry,\n    storageOptions: { channelRepo, ravRepo, pendingSubRAVRepo },\n  });\n\n  const hubBalanceService = new HubBalanceService({\n    contract,\n    defaultAssetId: config.defaultAssetId || '0x3::gas_coin::RGas',\n  });\n  const claimTriggerService = new ClaimTriggerService({\n    policy: {},\n    contract,\n    signer: config.signer,\n    ravRepo,\n    channelRepo,\n  });\n\n  const processor = new PaymentProcessor({\n    payeeClient,\n    serviceId: config.serviceId,\n    defaultAssetId: config.defaultAssetId,\n    rateProvider,\n    pendingSubRAVStore: pendingSubRAVRepo,\n    ravRepository: ravRepo,\n    didResolver: vdrRegistry,\n    hubBalanceService,\n    claimTriggerService,\n    minClaimAmount: DEFAULT_REACTIVE_CLAIM_POLICY.minClaimAmount,\n    debug: config.debug,\n  });\n\n  return new McpPaymentKit(config, {\n    contract,\n    signer: config.signer,\n    didResolver: vdrRegistry,\n    rateProvider,\n    serviceDid,\n    processor,\n    payeeClient,\n    channelRepo,\n    ravRepo,\n    pendingSubRAVRepo,\n  }).registerBuiltIns();\n}\n\n/**\n * Convenience: create McpPaymentKit from IdentityEnv (uses env.keyManager as signer and chain config from VDR)\n */\nexport async function createMcpPaymentKitFromEnv(\n  env: IdentityEnv,\n  cfg: Omit<McpPaymentKitOptions, 'signer' | 'rpcUrl' | 'network'>\n) {\n  const chain = getChainConfigFromEnv(env);\n  return createMcpPaymentKit({\n    ...cfg,\n    signer: env.keyManager,\n    rpcUrl: chain.rpcUrl,\n    network: chain.network,\n    debug: cfg.debug ?? chain.debug,\n  });\n}\n","import { z } from 'zod';\nimport { SerializableRequestPayloadSchema } from '../../schema/core';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\n\n/**\n * Extend a Zod object schema with Nuwa reserved fields used in MCP calls.\n * - __nuwa_auth: DIDAuth header (string), optional\n * - __nuwa_payment: structured payment payload, optional\n */\nexport function extendZodWithNuwaReserved<T extends z.ZodRawShape>(\n  schema: z.ZodObject<T>\n): z.ZodObject<any> {\n  return (schema as any).extend({\n    __nuwa_auth: z.string().optional(),\n    __nuwa_payment: SerializableRequestPayloadSchema.optional(),\n  });\n}\n\n/**\n * Convert JSON Schema property to Zod schema\n */\nfunction jsonSchemaPropertyToZod(property: any): z.ZodTypeAny {\n  if (!property || typeof property !== 'object') {\n    return z.any();\n  }\n\n  const { type, description, enum: enumValues, items, properties, required = [] } = property;\n\n  switch (type) {\n    case 'string':\n      if (enumValues && Array.isArray(enumValues)) {\n        return z.enum(enumValues as [string, ...string[]]);\n      }\n      return z.string();\n\n    case 'number':\n      return z.number();\n\n    case 'integer':\n      return z.number().int();\n\n    case 'boolean':\n      return z.boolean();\n\n    case 'array':\n      if (items) {\n        const itemSchema = jsonSchemaPropertyToZod(items);\n        return z.array(itemSchema);\n      }\n      return z.array(z.any());\n\n    case 'object':\n      if (properties && typeof properties === 'object') {\n        const zodShape: z.ZodRawShape = {};\n        for (const [key, prop] of Object.entries(properties)) {\n          let propSchema = jsonSchemaPropertyToZod(prop);\n          // Make optional if not in required array\n          if (!required.includes(key)) {\n            propSchema = propSchema.optional();\n          }\n          zodShape[key] = propSchema;\n        }\n        return z.object(zodShape);\n      }\n      return z.object({}).passthrough();\n\n    default:\n      return z.any();\n  }\n}\n\n/**\n * Convert JSON Schema to Zod object schema\n */\nexport function jsonSchemaToZodObject(jsonSchema: any): z.ZodObject<any> | undefined {\n  try {\n    if (!jsonSchema || typeof jsonSchema !== 'object') {\n      return undefined;\n    }\n\n    // Handle MCP tool inputSchema format\n    if (jsonSchema.type === 'object') {\n      const { properties = {}, required = [] } = jsonSchema;\n      const zodShape: z.ZodRawShape = {};\n\n      for (const [key, prop] of Object.entries(properties)) {\n        let propSchema = jsonSchemaPropertyToZod(prop);\n        // Make optional if not in required array\n        if (!required.includes(key)) {\n          propSchema = propSchema.optional();\n        }\n        zodShape[key] = propSchema;\n      }\n\n      return z.object(zodShape);\n    }\n\n    return undefined;\n  } catch (error) {\n    DebugLogger.warn('Failed to convert JSON Schema to Zod:', error);\n    return undefined;\n  }\n}\n\n/**\n * Best-effort normalization: accept either a Zod object schema, a plain\n * Zod raw shape (e.g., { name: z.string() }), or a JSON Schema and convert it to z.object(...).\n * Returns undefined if input cannot be recognized as a valid schema.\n */\nexport function normalizeToZodObject(schema: any): z.ZodObject<any> | undefined {\n  try {\n    // Case 1: already a Zod object\n    if (schema && typeof (schema as any).extend === 'function' && (schema as any)._def?.typeName) {\n      return schema as z.ZodObject<any>;\n    }\n\n    // Case 2: plain object raw shape with zod types as values\n    if (schema && typeof schema === 'object' && !Array.isArray(schema)) {\n      const entries = Object.entries(schema);\n      if (entries.length === 0) return z.object({});\n      const isAllZod = entries.every(([, v]) => !!(v as any)?._def);\n      if (isAllZod) {\n        return z.object(schema as z.ZodRawShape);\n      }\n    }\n\n    // Case 3: JSON Schema (MCP tool inputSchema format)\n    const zodFromJson = jsonSchemaToZodObject(schema);\n    if (zodFromJson) {\n      return zodFromJson;\n    }\n  } catch {}\n  return undefined;\n}\n","// Optional convenience starter for FastMCP\n// Users can import this to quickly start an MCP server with billing enabled.\n\nimport { McpPaymentKit, createMcpPaymentKit, McpPaymentKitOptions } from './McpPaymentKit';\nimport { z } from 'zod';\nimport type { IdentityEnv } from '@nuwa-ai/identity-kit';\nimport { getChainConfigFromEnv } from '../../helpers/fromIdentityEnv';\nimport type { Server } from 'http';\nimport { FastMCP, FastMCPSession } from 'fastmcp';\nimport { startHTTPServer } from 'mcp-proxy';\nimport { extendZodWithNuwaReserved, normalizeToZodObject } from './ToolSchema';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { RouteOptions } from '../express';\n\n// Server type with explicit stop method used by tests and callers\nexport type StoppableServer = Server & { stop: () => Promise<void> };\n\nexport interface FastMcpServerOptions extends McpPaymentKitOptions {\n  port?: number;\n  endpoint?: `/${string}`;\n  register?: (registrar: PaymentMcpToolRegistrar) => void;\n  wellKnown?: {\n    enabled?: boolean;\n    path?: `/${string}`; // default: '/.well-known/nuwa-payment/info'\n  };\n  customRouteHandler?: (req: any, res: any) => Promise<boolean> | boolean;\n}\n\n/**\n * Convenience: start FastMCP server using IdentityEnv (env.keyManager + VDR chain config)\n */\nexport async function createFastMcpServerFromEnv(\n  env: IdentityEnv,\n  opts: Omit<FastMcpServerOptions, 'signer' | 'rpcUrl' | 'network'>\n) {\n  const chain = getChainConfigFromEnv(env);\n  return createFastMcpServer({\n    ...opts,\n    signer: env.keyManager,\n    rpcUrl: chain.rpcUrl,\n    network: chain.network,\n    debug: opts.debug ?? chain.debug,\n  });\n}\n\nexport class PaymentMcpToolRegistrar {\n  private started = false;\n  registeredTools: any[] = [];\n  registeredPrompts: any[] = [];\n  registeredResources: any[] = [];\n  registeredResourceTemplates: any[] = [];\n  constructor(\n    private readonly server: FastMCP,\n    private readonly kit: McpPaymentKit\n  ) {}\n\n  markStarted(): void {\n    this.started = true;\n  }\n\n  private ensureNotStarted(): void {\n    if (this.started) {\n      throw new Error(\n        'MCP server already started; tool registration is closed. Register tools before start().'\n      );\n    }\n  }\n\n  addTool(args: {\n    name: string;\n    description: string;\n    handler: (params: any, context?: any) => Promise<any>;\n    schema?: any;\n    options?: RouteOptions;\n  }): void {\n    this.ensureNotStarted();\n    const { name, description, handler, schema, options } = args;\n    // Register with billing (enables pricing/settlement)\n    this.kit.register(name, options || { pricing: 0n }, handler);\n    // Register with FastMCP (expose tool) via unified kit.invoke\n    const kitRef = this.kit;\n    const paramsSchema = (() => {\n      if (!schema) return undefined;\n      const zodObj = normalizeToZodObject(schema);\n      if (zodObj) return extendZodWithNuwaReserved(zodObj);\n      return undefined;\n    })();\n    const toolDef = {\n      name,\n      description,\n      parameters: paramsSchema,\n      async execute(params: any, context: any) {\n        return await kitRef.invoke(name, params, context);\n      },\n    } as any;\n    this.server.addTool(toolDef);\n    this.registeredTools.push(toolDef);\n  }\n\n  freeTool(args: {\n    name: string;\n    description: string;\n    handler: (params: any, context?: any) => Promise<any>;\n    schema?: any;\n  }): void {\n    this.addTool({ ...args, options: { pricing: 0n } });\n  }\n\n  paidTool(args: {\n    name: string;\n    description: string;\n    pricePicoUSD: bigint;\n    handler: (params: any, context?: any) => Promise<any>;\n    schema?: any;\n  }): void {\n    this.addTool({ ...args, options: { pricing: args.pricePicoUSD } });\n  }\n\n  getTools(): any[] {\n    return this.registeredTools.slice();\n  }\n\n  addPrompt(def: {\n    name: string;\n    description: string;\n    arguments?: any[];\n    load: (args: any) => Promise<string> | string;\n  }): void {\n    this.ensureNotStarted();\n    const promptDef = {\n      name: def.name,\n      description: def.description,\n      arguments: def.arguments || [],\n      async load(args: any) {\n        return await def.load(args);\n      },\n    } as any;\n    this.server.addPrompt(promptDef);\n    this.registeredPrompts.push(promptDef);\n  }\n\n  addResource(def: {\n    uri: string;\n    name: string;\n    mimeType: string;\n    load: () => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }): void {\n    this.ensureNotStarted();\n    const resDef = {\n      uri: def.uri,\n      name: def.name,\n      mimeType: def.mimeType,\n      async load() {\n        return await def.load();\n      },\n    } as any;\n    this.server.addResource(resDef);\n    this.registeredResources.push(resDef);\n  }\n\n  addResourceTemplate(def: {\n    uriTemplate: string;\n    name: string;\n    mimeType: string;\n    arguments?: any[];\n    load: (args: any) => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }): void {\n    this.ensureNotStarted();\n    const tplDef = {\n      uriTemplate: def.uriTemplate,\n      name: def.name,\n      mimeType: def.mimeType,\n      arguments: def.arguments || [],\n      async load(args: any) {\n        return await def.load(args);\n      },\n    } as any;\n    this.server.addResourceTemplate(tplDef);\n    this.registeredResourceTemplates.push(tplDef);\n  }\n\n  getPrompts(): any[] {\n    return this.registeredPrompts.slice();\n  }\n  getResources(): any[] {\n    return this.registeredResources.slice();\n  }\n  getResourceTemplates(): any[] {\n    return this.registeredResourceTemplates.slice();\n  }\n}\n\nexport async function createFastMcpServer(opts: FastMcpServerOptions): Promise<{\n  addTool: (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n    options?: RouteOptions;\n  }) => void;\n  freeTool: (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => void;\n  paidTool: (def: {\n    name: string;\n    description: string;\n    pricePicoUSD: bigint;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => void;\n  addPrompt: (def: {\n    name: string;\n    description: string;\n    arguments?: any[];\n    load: (args: any) => Promise<string> | string;\n  }) => void;\n  addResource: (def: {\n    uri: string;\n    name: string;\n    mimeType: string;\n    load: () => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => void;\n  addResourceTemplate: (def: {\n    uriTemplate: string;\n    name: string;\n    mimeType: string;\n    arguments?: any[];\n    load: (args: any) => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => void;\n  start: () => Promise<StoppableServer>;\n  getInner: () => { server: FastMCP; kit: McpPaymentKit };\n}> {\n  const logger = DebugLogger.get('FastMcpStarter');\n  const server = new FastMCP({\n    name: opts.serviceId || 'nuwa-mcp-server',\n    version: '1.0.0',\n  });\n  const kit = await createMcpPaymentKit(opts);\n\n  // Register built-in payment tools (FREE) via registrar to ensure new sessions include them\n  const bootstrapRegistrar = new PaymentMcpToolRegistrar(server, kit);\n  // Register each tool from kit, but the handler will delegate to kit.invoke\n  // This ensures tools are available to FastMCP sessions\n  for (const name of kit.listTools()) {\n    const toolDef = {\n      name,\n      description: `Built-in payment tool: ${name}`,\n      // Ensure FastMCP passes through arguments for built-ins\n      // Use permissive schema to avoid stripping reserved params\n      parameters: z.object({}).passthrough(),\n      async execute(params: any, context: any) {\n        return await kit.invoke(name, params, context);\n      },\n    } as any;\n    server.addTool(toolDef);\n    bootstrapRegistrar.registeredTools.push(toolDef);\n  }\n\n  const registrar = bootstrapRegistrar;\n\n  const start = async () => {\n    const sessions: FastMCPSession[] = [];\n    let sessionCounter = 0;\n    const port = opts.port ?? 8080;\n    const endpoint = opts.endpoint || '/mcp';\n    // Well-known is enabled by default for payment-enabled MCP servers\n    const wellKnownEnabled = opts.wellKnown?.enabled !== false;\n    const wellKnownPath = (opts.wellKnown?.path ||\n      '/.well-known/nuwa-payment/info') as `/${string}`;\n\n    const httpServer = await startHTTPServer({\n      port,\n      streamEndpoint: endpoint,\n      createServer: async (req: any) => {\n        logger.debug('Creating new MCP session', {\n          method: req.method,\n          url: req.url,\n          headers: req.headers,\n        } as any);\n        \n        try {\n          const session = new FastMCPSession({\n            name: opts.serviceId || 'nuwa-mcp-server',\n            version: '1.0.0',\n            ping: undefined,\n            prompts: registrar.getPrompts(),\n            resources: registrar.getResources(),\n            resourcesTemplates: registrar.getResourceTemplates(),\n            roots: { enabled: true },\n            tools: registrar.getTools(),\n            transportType: 'httpStream',\n          } as any);\n          (session as any).__sessionId = ++sessionCounter;\n          \n          logger.debug('MCP session created', {\n            sessionId: (session as any).__sessionId,\n            toolCount: registrar.getTools().length,\n          } as any);\n          \n          return session;\n        } catch (e) {\n          logger.error('Failed to create MCP session', {\n            error: e instanceof Error ? e.message : String(e),\n            stack: e instanceof Error ? e.stack : undefined,\n            method: req.method,\n            url: req.url,\n          } as any);\n          throw e;\n        }\n      },\n      onConnect: async (session: any) => {\n        sessions.push(session);\n        logger.info('MCP session connected', {\n          sessionId: (session as any).__sessionId,\n          totalSessions: sessions.length,\n        } as any);\n        // Register all tools to the new session via FastMCP internal handlers\n        // We rely on FastMCP having already had tools added via registrar\n        // Emit-like behavior is not exposed; sessions will receive handlers on creation\n      },\n      onClose: async (session: any) => {\n        const idx = sessions.indexOf(session as any);\n        if (idx >= 0) sessions.splice(idx, 1);\n        logger.info('MCP session closed', {\n          sessionId: (session as any).__sessionId,\n          totalSessions: sessions.length,\n        } as any);\n      },\n      onUnhandledRequest: async (req: any, res: any) => {\n        // Handle preflight requests\n        if (req.method === 'OPTIONS') {\n          res.writeHead(204);\n          res.end();\n          return;\n        }\n\n        try {\n          const url = new URL(req.url || '', 'http://localhost');\n          \n          logger.debug('Unhandled request', {\n            method: req.method,\n            pathname: url.pathname,\n            headers: req.headers,\n          } as any);\n          \n          // Health endpoint (parity with FastMCP default)\n          if (req.method === 'GET' && url.pathname === '/health') {\n            res.writeHead(200, { 'Content-Type': 'text/plain' }).end('✓ Ok');\n            return;\n          }\n          // Ready endpoint (parity with FastMCP default)\n          if (req.method === 'GET' && url.pathname === '/ready') {\n            const readySessions = sessions.filter(s => (s as any).isReady).length;\n            const totalSessions = sessions.length;\n            const allReady = readySessions === totalSessions && totalSessions > 0;\n            const payload = {\n              ready: readySessions,\n              status: allReady ? 'ready' : totalSessions === 0 ? 'no_sessions' : 'initializing',\n              total: totalSessions,\n            };\n            res\n              .writeHead(allReady ? 200 : 503, { 'Content-Type': 'application/json' })\n              .end(JSON.stringify(payload));\n            return;\n          }\n          // Well-known discovery endpoint (no auth)\n          if (wellKnownEnabled && req.method === 'GET' && url.pathname === wellKnownPath) {\n            try {\n              // Auto-generate service discovery info from kit conforming to ServiceDiscoverySchema\n              const serviceDid = await kit.getServiceDid();\n              const body = {\n                version: 1,\n                serviceId: opts.serviceId || 'nuwa-mcp-server',\n                serviceDid,\n                network: opts.network || 'test',\n                defaultAssetId: opts.defaultAssetId || '0x3::gas_coin::RGas',\n                defaultPricePicoUSD: opts.defaultPricePicoUSD?.toString(),\n                basePath: endpoint,\n              };\n              res.writeHead(200, { 'Content-Type': 'application/json' }).end(JSON.stringify(body));\n            } catch (e: any) {\n              logger.error('Failed to generate service discovery info', {\n                error: e?.message,\n                stack: e?.stack,\n              } as any);\n              \n              res\n                .writeHead(500, { 'Content-Type': 'application/json' })\n                .end(JSON.stringify({ error: e?.message || 'internal error' }));\n            }\n            return;\n          }\n\n          // Try custom route handler first\n          if (opts.customRouteHandler) {\n            const handled = await opts.customRouteHandler(req, res);\n            if (handled) {\n              return;\n            }\n          }\n\n          logger.warn('No handler found for request', {\n            method: req.method,\n            pathname: url.pathname,\n          } as any);\n          \n          res.writeHead(404).end();\n        } catch (e) {\n          logger.error('Error in onUnhandledRequest', {\n            error: e instanceof Error ? e.message : String(e),\n            stack: e instanceof Error ? e.stack : undefined,\n            method: req?.method,\n            url: req?.url,\n          } as any);\n          \n          try {\n            res.writeHead(500, { 'Content-Type': 'application/json' }).end(\n              JSON.stringify({\n                error: e instanceof Error ? e.message : 'Internal server error',\n                timestamp: new Date().toISOString(),\n              })\n            );\n          } catch (writeError) {\n            logger.error('Failed to write error response', {\n              error: writeError instanceof Error ? writeError.message : String(writeError),\n            } as any);\n          }\n        }\n      },\n    });\n\n    registrar.markStarted();\n    logger.debug('registered tools', {\n      tools: registrar.getTools().map(t => t.name),\n      total: registrar.getTools().length,\n    } as any);\n    const srv = httpServer as any as StoppableServer;\n    logger.info(`FastMCP HTTP server listening at http://localhost:${port}`);\n    // Track sockets to force-close on shutdown and avoid hanging closes\n    const sockets = new Set<any>();\n    try {\n      (srv as any).on?.('connection', (socket: any) => {\n        sockets.add(socket);\n        socket.on?.('close', () => sockets.delete(socket));\n      });\n    } catch {}\n    // Wrap stop/close to ensure kit resources are destroyed\n    const originalClose = (srv as any).close?.bind(srv);\n    (srv as any).stop = async () => {\n      try {\n        kit.destroy();\n      } catch {}\n      // Attempt to terminate open sessions\n      try {\n        for (const s of sessions.slice()) {\n          try {\n            (s as any).close?.();\n          } catch {}\n          try {\n            (s as any).terminate?.();\n          } catch {}\n          try {\n            (s as any).dispose?.();\n          } catch {}\n        }\n      } catch {}\n      // Close idle and all connections if supported\n      try {\n        (srv as any).closeIdleConnections?.();\n      } catch {}\n      try {\n        (srv as any).closeAllConnections?.();\n      } catch {}\n      // Destroy any tracked sockets to ensure shutdown\n      try {\n        for (const sock of sockets) {\n          try {\n            sock.destroy?.();\n          } catch {}\n        }\n      } catch {}\n      // Finally, close the server with a timeout fallback\n      await new Promise<void>(resolve => {\n        let done = false;\n        const finish = () => {\n          if (done) return;\n          done = true;\n          resolve();\n        };\n        try {\n          if (typeof originalClose === 'function') {\n            originalClose(() => finish());\n          } else {\n            (srv as any).close?.();\n            finish();\n          }\n        } catch {\n          finish();\n        }\n        // Fallback timeout to avoid hanging forever\n        setTimeout(finish, 2000);\n      });\n    };\n    return srv;\n  };\n\n  const addTool = (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n    options?: RouteOptions;\n  }) => {\n    registrar.addTool({\n      name: def.name,\n      description: def.description,\n      schema: def.parameters,\n      options: def.options,\n      handler: async (params, context) => def.execute(params, context),\n    });\n  };\n\n  const freeTool = (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => {\n    registrar.freeTool({\n      name: def.name,\n      description: def.description,\n      schema: def.parameters,\n      handler: async (params, context) => def.execute(params, context),\n    });\n  };\n\n  const paidTool = (def: {\n    name: string;\n    description: string;\n    pricePicoUSD: bigint;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => {\n    registrar.paidTool({\n      name: def.name,\n      description: def.description,\n      pricePicoUSD: def.pricePicoUSD,\n      schema: def.parameters,\n      handler: async (params, context) => def.execute(params, context),\n    });\n  };\n\n  const getInner = () => ({ server, kit });\n\n  const addPrompt = (def: {\n    name: string;\n    description: string;\n    arguments?: any[];\n    load: (args: any) => Promise<string> | string;\n  }) => {\n    registrar.addPrompt(def);\n  };\n\n  const addResource = (def: {\n    uri: string;\n    name: string;\n    mimeType: string;\n    load: () => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => {\n    registrar.addResource(def);\n  };\n\n  const addResourceTemplate = (def: {\n    uriTemplate: string;\n    name: string;\n    mimeType: string;\n    arguments?: any[];\n    load: (args: any) => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => {\n    registrar.addResourceTemplate(def);\n  };\n\n  return {\n    addTool,\n    freeTool,\n    paidTool,\n    addPrompt,\n    addResource,\n    addResourceTemplate,\n    start,\n    getInner,\n  };\n}\n","// SdkMcpStarter: MCP Server implementation using the official MCP SDK engine (@modelcontextprotocol/sdk).\n// This server is designed to provide drop-in compatibility with FastMcpStarter, but uses the official SDK rather than the FastMcpStarter engine.\n\nimport { McpPaymentKit, createMcpPaymentKit, McpPaymentKitOptions } from './McpPaymentKit';\nimport { z } from 'zod';\nimport type { IdentityEnv } from '@nuwa-ai/identity-kit';\nimport { getChainConfigFromEnv } from '../../helpers/fromIdentityEnv';\nimport type { Server } from 'http';\nimport {\n  Server as McpServer\n} from '@modelcontextprotocol/sdk/server/index.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport {\n  CallToolRequestSchema,\n  GetPromptRequestSchema,\n  ListPromptsRequestSchema,\n  ListResourcesRequestSchema,\n  ListResourceTemplatesRequestSchema,\n  ListToolsRequestSchema,\n  ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { extendZodWithNuwaReserved, normalizeToZodObject } from './ToolSchema';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { RouteOptions } from '../express';\nimport { createServer as createHttpServer } from 'http';\nimport { parse as parseUrl } from 'url';\nimport { randomBytes } from 'crypto';\n\n// Server type with explicit stop method used by tests and callers\nexport type StoppableServer = Server & { stop: () => Promise<void> };\n\nexport interface SdkMcpServerOptions extends McpPaymentKitOptions {\n  port?: number;\n  endpoint?: `/${string}`;\n  register?: (registrar: PaymentMcpToolRegistrar) => void;\n  wellKnown?: {\n    enabled?: boolean;\n    path?: `/${string}`; // default: '/.well-known/nuwa-payment/info'\n  };\n  customRouteHandler?: (req: any, res: any) => Promise<boolean> | boolean;\n}\n\n/**\n * Convenience: start SDK MCP server using IdentityEnv (env.keyManager + VDR chain config)\n */\nexport async function createSdkMcpServerFromEnv(\n  env: IdentityEnv,\n  opts: Omit<SdkMcpServerOptions, 'signer' | 'rpcUrl' | 'network'>\n) {\n  const chain = getChainConfigFromEnv(env);\n  return createSdkMcpServer({\n    ...opts,\n    signer: env.keyManager,\n    rpcUrl: chain.rpcUrl,\n    network: chain.network,\n    debug: opts.debug ?? chain.debug,\n  });\n}\n\nexport class PaymentMcpToolRegistrar {\n  private started = false;\n  registeredTools: any[] = [];\n  registeredPrompts: any[] = [];\n  registeredResources: any[] = [];\n  registeredResourceTemplates: any[] = [];\n  constructor(\n    private readonly server: McpServer,\n    private readonly kit: McpPaymentKit\n  ) {}\n\n  markStarted(): void {\n    this.started = true;\n  }\n\n  private ensureNotStarted(): void {\n    if (this.started) {\n      throw new Error(\n        'MCP server already started; tool registration is closed. Register tools before start().'\n      );\n    }\n  }\n\n  addTool(args: {\n    name: string;\n    description: string;\n    handler: (params: any, context?: any) => Promise<any>;\n    schema?: any;\n    options?: RouteOptions;\n  }): void {\n    this.ensureNotStarted();\n    const { name, description, handler, schema, options } = args;\n\n    // Register with billing (enables pricing/settlement)\n    this.kit.register(name, options || { pricing: 0n }, handler);\n\n    const paramsSchema = (() => {\n      if (!schema) return undefined;\n      const zodObj = normalizeToZodObject(schema);\n      if (zodObj) return extendZodWithNuwaReserved(zodObj);\n      return undefined;\n    })();\n\n    const toolDef = {\n      name,\n      description,\n      inputSchema: paramsSchema ? zodToJsonSchema(paramsSchema) : undefined,\n    };\n\n    this.registeredTools.push({\n      ...toolDef,\n      handler: async (params: any, context?: any) => {\n        return await this.kit.invoke(name, params, context);\n      },\n    });\n  }\n\n  freeTool(args: {\n    name: string;\n    description: string;\n    handler: (params: any, context?: any) => Promise<any>;\n    schema?: any;\n  }): void {\n    this.addTool({ ...args, options: { pricing: 0n } });\n  }\n\n  paidTool(args: {\n    name: string;\n    description: string;\n    pricePicoUSD: bigint;\n    handler: (params: any, context?: any) => Promise<any>;\n    schema?: any;\n  }): void {\n    this.addTool({ ...args, options: { pricing: args.pricePicoUSD } });\n  }\n\n  getTools(): any[] {\n    return this.registeredTools.slice();\n  }\n\n  addPrompt(def: {\n    name: string;\n    description: string;\n    arguments?: any[];\n    load: (args: any) => Promise<string> | string;\n  }): void {\n    this.ensureNotStarted();\n    const promptDef = {\n      name: def.name,\n      description: def.description,\n      arguments: def.arguments || [],\n    } as any;\n    this.registeredPrompts.push({\n      ...promptDef,\n      load: def.load,\n    });\n  }\n\n  addResource(def: {\n    uri: string;\n    name: string;\n    mimeType: string;\n    load: () => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }): void {\n    this.ensureNotStarted();\n    const resDef = {\n      uri: def.uri,\n      name: def.name,\n      mimeType: def.mimeType,\n    } as any;\n    this.registeredResources.push({\n      ...resDef,\n      load: def.load,\n    });\n  }\n\n  addResourceTemplate(def: {\n    uriTemplate: string;\n    name: string;\n    mimeType: string;\n    arguments?: any[];\n    load: (args: any) => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }): void {\n    this.ensureNotStarted();\n    const tplDef = {\n      uriTemplate: def.uriTemplate,\n      name: def.name,\n      mimeType: def.mimeType,\n      arguments: def.arguments || [],\n    } as any;\n    this.registeredResourceTemplates.push({\n      ...tplDef,\n      load: def.load,\n    });\n  }\n\n  getPrompts(): any[] {\n    return this.registeredPrompts.slice();\n  }\n  getResources(): any[] {\n    return this.registeredResources.slice();\n  }\n  getResourceTemplates(): any[] {\n    return this.registeredResourceTemplates.slice();\n  }\n}\n\n// Helper to convert Zod schema to JSON Schema\nfunction zodToJsonSchema(zodSchema: any): any {\n  try {\n    // Import zod-to-json-schema dynamically\n    const { zodToJsonSchema: convert } = require('zod-to-json-schema');\n    return convert(zodSchema);\n  } catch {\n    // Fallback if conversion fails\n    return undefined;\n  }\n}\n\nexport async function createSdkMcpServer(opts: SdkMcpServerOptions): Promise<{\n  addTool: (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n    options?: RouteOptions;\n  }) => void;\n  freeTool: (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => void;\n  paidTool: (def: {\n    name: string;\n    description: string;\n    pricePicoUSD: bigint;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => void;\n  addPrompt: (def: {\n    name: string;\n    description: string;\n    arguments?: any[];\n    load: (args: any) => Promise<string> | string;\n  }) => void;\n  addResource: (def: {\n    uri: string;\n    name: string;\n    mimeType: string;\n    load: () => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => void;\n  addResourceTemplate: (def: {\n    uriTemplate: string;\n    name: string;\n    mimeType: string;\n    arguments?: any[];\n    load: (args: any) => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => void;\n  start: () => Promise<StoppableServer>;\n  getInner: () => { server: McpServer; kit: McpPaymentKit };\n}> {\n  const logger = DebugLogger.get('SdkMcpStarter');\n\n  // We don't create a global server anymore - each session gets its own server\n  // But we still need a placeholder server for the registrar to work\n  const placeholderServer = new McpServer(\n    {\n      name: opts.serviceId || 'nuwa-mcp-server',\n      version: '1.0.0',\n    },\n    {\n      capabilities: {\n        tools: {},\n        prompts: {},\n        resources: {},\n        resourceTemplates: {},\n      },\n    }\n  );\n\n  const kit = await createMcpPaymentKit(opts);\n\n  // Register built-in payment tools via registrar\n  const bootstrapRegistrar = new PaymentMcpToolRegistrar(placeholderServer, kit);\n\n  // Register each tool from kit\n  for (const name of kit.listTools()) {\n    const toolDef = {\n      name,\n      description: `Built-in payment tool: ${name}`,\n      inputSchema: {\n        type: 'object',\n        additionalProperties: true, // Allow reserved fields\n        properties: {},\n      }, // Use permissive schema that supports reserved fields\n    };\n\n    bootstrapRegistrar.registeredTools.push({\n      ...toolDef,\n      handler: async (params: any, context?: any) => {\n        return await kit.invoke(name, params, context);\n      },\n    });\n  }\n\n  const registrar = bootstrapRegistrar;\n\n  // Session management for StreamableHTTPServerTransport\n  const sessions = new Map<string, { transport: StreamableHTTPServerTransport; server: McpServer }>();\n\n  // Helper to generate session IDs\n  const generateSessionId = (): string => {\n    return randomBytes(16).toString('hex');\n  };\n\n  // Helper to clean up a session\n  const cleanupSession = async (sessionId: string) => {\n    const session = sessions.get(sessionId);\n    if (session) {\n      try {\n        await session.server.close();\n        sessions.delete(sessionId);\n        logger.debug('Cleaned up session', { sessionId } as any);\n      } catch (error) {\n        logger.error('Error cleaning up session', {\n          sessionId,\n          error: error instanceof Error ? error.message : String(error)\n        } as any);\n      }\n    }\n  };\n\n  // Helper to set up request handlers for a session server\n  const setupRequestHandlers = (sessionServer: McpServer) => {\n    sessionServer.setRequestHandler(ListToolsRequestSchema, async () => {\n      return {\n        tools: registrar.getTools().map(tool => ({\n          name: tool.name,\n          description: tool.description,\n          inputSchema: tool.inputSchema,\n        })),\n      };\n    });\n\n    sessionServer.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n      const { name, arguments: args } = request.params;\n      const tool = registrar.getTools().find(t => t.name === name);\n\n      if (!tool) {\n        throw new Error(`Tool '${name}' not found`);\n      }\n\n      try {\n        const result = await tool.handler(args, request.context);\n        // Return MCP-native format - prefer returning kit.invoke() directly when it returns { content: [...] }\n        if (result && typeof result === 'object' && Array.isArray(result.content)) {\n          return result;\n        }\n        return {\n          content: [\n            {\n              type: 'text',\n              text: typeof result === 'string' ? result : JSON.stringify(result),\n            },\n          ],\n        };\n      } catch (error) {\n        throw new Error(`Tool execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n      }\n    });\n\n    sessionServer.setRequestHandler(ListPromptsRequestSchema, async () => {\n      return {\n        prompts: registrar.getPrompts(),\n      };\n    });\n\n    sessionServer.setRequestHandler(GetPromptRequestSchema, async (request: any) => {\n      const { name, arguments: args } = request.params;\n      const prompt = registrar.getPrompts().find((p: any) => p.name === name);\n\n      if (!prompt) {\n        throw new Error(`Prompt '${name}' not found`);\n      }\n\n      const result = await prompt.load(args);\n      return {\n        description: prompt.description,\n        messages: [\n          {\n            role: 'user',\n            content: {\n              type: 'text',\n              text: result,\n            },\n          },\n        ],\n      };\n    });\n\n    sessionServer.setRequestHandler(ListResourcesRequestSchema, async () => {\n      return {\n        resources: registrar.getResources(),\n      };\n    });\n\n    sessionServer.setRequestHandler(ReadResourceRequestSchema, async (request: any) => {\n      const { uri } = request.params;\n      const resource = registrar.getResources().find((r: any) => r.uri === uri);\n\n      if (!resource) {\n        throw new Error(`Resource '${uri}' not found`);\n      }\n\n      const result = await resource.load();\n      return {\n        contents: [\n          {\n            uri,\n            mimeType: resource.mimeType,\n            ...result,\n          },\n        ],\n      };\n    });\n\n    sessionServer.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {\n      return {\n        resourceTemplates: registrar.getResourceTemplates(),\n      };\n    });\n  };\n\n  const start = async () => {\n    const port = opts.port ?? 8080;\n    const endpoint = opts.endpoint || '/mcp';\n    const wellKnownEnabled = opts.wellKnown?.enabled !== false;\n    const wellKnownPath = (opts.wellKnown?.path ||\n      '/.well-known/nuwa-payment/info') as `/${string}`;\n\n    const httpServer = createHttpServer(async (req: any, res: any) => {\n      const url = parseUrl(req.url || '', true);\n\n      // Set CORS headers for all responses\n      const setCorsHeaders = (origin?: string) => {\n        if (origin) {\n          res.setHeader('Access-Control-Allow-Origin', origin);\n        }\n        res.setHeader('Access-Control-Allow-Credentials', 'true');\n        res.setHeader('Access-Control-Expose-Headers', 'mcp-session-id');\n      };\n\n      // Handle preflight requests\n      if (req.method === 'OPTIONS') {\n        const origin = req.headers.origin;\n        setCorsHeaders(origin);\n        res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');\n        res.setHeader('Access-Control-Allow-Headers', '*');\n        res.writeHead(204);\n        res.end();\n        return;\n      }\n\n      const origin = req.headers.origin;\n      setCorsHeaders(origin);\n\n      // Helper to read request body\n      const readRequestBody = async (): Promise<any> => {\n        return new Promise((resolve, reject) => {\n          let body = '';\n          req.on('data', (chunk: any) => {\n            body += chunk.toString();\n          });\n          req.on('end', () => {\n            try {\n              if (body) {\n                resolve(JSON.parse(body));\n              } else {\n                resolve(undefined);\n              }\n            } catch (error) {\n              reject(new Error('Invalid JSON in request body'));\n            }\n          });\n          req.on('error', reject);\n        });\n      };\n\n      // Health endpoint\n      if (req.method === 'GET' && url.pathname === '/health') {\n        res.writeHead(200, { 'Content-Type': 'text/plain' }).end('✓ Ok');\n        return;\n      }\n\n      // Ready endpoint\n      if (req.method === 'GET' && url.pathname === '/ready') {\n        const payload = {\n          ready: 1,\n          status: 'ready',\n          total: 1,\n        };\n        res.writeHead(200, { 'Content-Type': 'application/json' }).end(JSON.stringify(payload));\n        return;\n      }\n\n      // Well-known discovery endpoint\n      if (wellKnownEnabled && req.method === 'GET' && url.pathname === wellKnownPath) {\n        try {\n          const serviceDid = await kit.getServiceDid();\n          const body = {\n            version: 1,\n            serviceId: opts.serviceId || 'nuwa-mcp-server',\n            serviceDid,\n            network: opts.network || 'test',\n            defaultAssetId: opts.defaultAssetId || '0x3::gas_coin::RGas',\n            defaultPricePicoUSD: opts.defaultPricePicoUSD?.toString(),\n            basePath: endpoint,\n          };\n          res.writeHead(200, { 'Content-Type': 'application/json' }).end(JSON.stringify(body));\n        } catch (e: any) {\n          logger.error('Failed to generate service discovery info', {\n            error: e?.message,\n            stack: e?.stack,\n          } as any);\n          res.writeHead(500, { 'Content-Type': 'application/json' })\n            .end(JSON.stringify({ error: e?.message || 'internal error' }));\n        }\n        return;\n      }\n\n      // Handle MCP endpoint with session routing\n      if (url.pathname === endpoint) {\n        const sessionId = req.headers['mcp-session-id'] as string;\n\n        if (req.method === 'POST') {\n          // Initialize new session for POST requests without session ID\n          if (!sessionId) {\n            let newSessionId = generateSessionId();\n            // Ensure session ID uniqueness\n            while (sessions.has(newSessionId)) {\n              newSessionId = generateSessionId();\n            }\n\n            const sessionServer = new McpServer(\n              {\n                name: opts.serviceId || 'nuwa-mcp-server',\n                version: '1.0.0',\n              },\n              {\n                capabilities: {\n                  tools: {},\n                  prompts: {},\n                  resources: {},\n                  resourceTemplates: {},\n                },\n              }\n            );\n\n            // Set up request handlers for this session using the helper function\n            setupRequestHandlers(sessionServer);\n\n            // We manage session IDs manually via the 'mcp-session-id' header,\n            // so we intentionally disable the built-in session ID generation here.\n            const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n            await sessionServer.connect(transport);\n\n            // Store the session\n            sessions.set(newSessionId, { transport, server: sessionServer });\n\n            // Set the session ID in response header\n            res.setHeader('mcp-session-id', newSessionId);\n\n            logger.debug('Created new MCP session', { sessionId: newSessionId } as any);\n\n            // Handle the request with proper hijacking\n            try {\n              const body = await readRequestBody();\n              // Simulate reply.hijack() behavior\n              res.setHeader('Content-Type', 'application/json');\n              await transport.handleRequest(req, res, body);\n            } catch (error) {\n              logger.error('Error handling MCP request', {\n                sessionId: newSessionId,\n                error: error instanceof Error ? error.message : String(error),\n              } as any);\n              if (!res.headersSent) {\n                res.writeHead(500, { 'Content-Type': 'application/json' })\n                  .end(JSON.stringify({ error: 'Internal server error' }));\n              }\n            }\n          } else {\n            // Route to existing session\n            const session = sessions.get(sessionId);\n            if (!session) {\n              res.writeHead(404, { 'Content-Type': 'application/json' })\n                .end(JSON.stringify({ error: 'Session not found' }));\n              return;\n            }\n\n            try {\n              const body = await readRequestBody();\n              res.setHeader('Content-Type', 'application/json');\n              await session.transport.handleRequest(req, res, body);\n            } catch (error) {\n              logger.error('Error handling MCP request for existing session', {\n                sessionId,\n                error: error instanceof Error ? error.message : String(error),\n              } as any);\n              if (!res.headersSent) {\n                res.writeHead(500, { 'Content-Type': 'application/json' })\n                  .end(JSON.stringify({ error: 'Internal server error' }));\n              }\n            }\n          }\n          return;\n        } else if (req.method === 'GET' || req.method === 'DELETE') {\n          // Route to existing session for GET/DELETE\n          if (!sessionId) {\n            res.writeHead(400, { 'Content-Type': 'application/json' })\n              .end(JSON.stringify({ error: 'mcp-session-id header required' }));\n            return;\n          }\n\n          const session = sessions.get(sessionId);\n          if (!session) {\n            res.writeHead(404, { 'Content-Type': 'application/json' })\n              .end(JSON.stringify({ error: 'Session not found' }));\n            return;\n          }\n\n          try {\n            // DELETE requests typically don't have a body, so only parse body for GET requests\n            const body = req.method === 'DELETE' ? undefined : await readRequestBody();\n            res.setHeader('Content-Type', 'application/json');\n            await session.transport.handleRequest(req, res, body);\n\n            // Clean up session after DELETE request\n            if (req.method === 'DELETE') {\n              await cleanupSession(sessionId);\n            }\n          } catch (error) {\n            logger.error('Error handling MCP request for existing session', {\n              sessionId,\n              method: req.method,\n              error: error instanceof Error ? error.message : String(error),\n            } as any);\n            if (!res.headersSent) {\n              res.writeHead(500, { 'Content-Type': 'application/json' })\n                .end(JSON.stringify({ error: 'Internal server error' }));\n            }\n          }\n          return;\n        }\n      }\n\n      // Try custom route handler\n      if (opts.customRouteHandler) {\n        try {\n          const result = opts.customRouteHandler(req, res);\n          if (result instanceof Promise) {\n            result.then((handled: any) => {\n              if (!handled) {\n                res.writeHead(404).end();\n              }\n            }).catch(() => {\n              res.writeHead(500).end();\n            });\n          } else {\n            if (!result) {\n              res.writeHead(404).end();\n            }\n          }\n        } catch {\n          res.writeHead(500).end();\n        }\n        return;\n      }\n\n      res.writeHead(404).end();\n    });\n\n    registrar.markStarted();\n\n    logger.debug('registered tools', {\n      tools: registrar.getTools().map(t => t.name),\n      total: registrar.getTools().length,\n    } as any);\n\n    const srv = httpServer as any as StoppableServer;\n\n    // Start listening for connections\n    await new Promise<void>((resolve, reject) => {\n      srv.listen(port, (err?: Error) => {\n        if (err) {\n          reject(err);\n        } else {\n          resolve();\n        }\n      });\n    });\n\n    logger.info(`SDK MCP HTTP server listening at http://localhost:${port}`);\n\n    // Wrap stop/close to ensure kit resources and sessions are destroyed\n    const originalClose = srv.close?.bind(srv);\n    (srv as any).stop = async () => {\n      // Clean up all sessions\n      const sessionIds = Array.from(sessions.keys());\n      await Promise.all(sessionIds.map(cleanupSession));\n\n      try {\n        kit.destroy();\n      } catch {}\n      try {\n        await placeholderServer.close();\n      } catch {}\n      try {\n        await new Promise<void>((resolve) => {\n          if (typeof originalClose === 'function') {\n            originalClose(() => resolve());\n          } else {\n            resolve();\n          }\n        });\n      } catch {}\n    };\n    return srv;\n  };\n\n  const addTool = (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n    options?: RouteOptions;\n  }) => {\n    registrar.addTool({\n      name: def.name,\n      description: def.description,\n      schema: def.parameters,\n      options: def.options,\n      handler: async (params, context) => def.execute(params, context),\n    });\n  };\n\n  const freeTool = (def: {\n    name: string;\n    description: string;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => {\n    registrar.freeTool({\n      name: def.name,\n      description: def.description,\n      schema: def.parameters,\n      handler: async (params, context) => def.execute(params, context),\n    });\n  };\n\n  const paidTool = (def: {\n    name: string;\n    description: string;\n    pricePicoUSD: bigint;\n    parameters?: any;\n    execute: (params: any, context?: any) => Promise<any> | any;\n  }) => {\n    registrar.paidTool({\n      name: def.name,\n      description: def.description,\n      pricePicoUSD: def.pricePicoUSD,\n      schema: def.parameters,\n      handler: async (params, context) => def.execute(params, context),\n    });\n  };\n\n  const getInner = () => ({ server: placeholderServer, kit });\n\n  const addPrompt = (def: {\n    name: string;\n    description: string;\n    arguments?: any[];\n    load: (args: any) => Promise<string> | string;\n  }) => {\n    registrar.addPrompt(def);\n  };\n\n  const addResource = (def: {\n    uri: string;\n    name: string;\n    mimeType: string;\n    load: () => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => {\n    registrar.addResource(def);\n  };\n\n  const addResourceTemplate = (def: {\n    uriTemplate: string;\n    name: string;\n    mimeType: string;\n    arguments?: any[];\n    load: (args: any) => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n  }) => {\n    registrar.addResourceTemplate(def);\n  };\n\n  return {\n    addTool,\n    freeTool,\n    paidTool,\n    addPrompt,\n    addResource,\n    addResourceTemplate,\n    start,\n    getInner,\n  };\n}","// Node bundle entry: export isomorphic modules + Node-only modules\n\n// Isomorphic exports\nexport * from './index.browser';\n\n// Node-only: Express transport & API handlers\nexport * from './transport/express';\nexport * from './api';\n\n// Node-only: SQL storage aggregator (provided via subpath as well)\nexport * from './storage/sql';\n\n// Node-only: MCP server/client (FastMCP adapter lazily loads ai/sdk at runtime)\nexport * from './transport/mcp/McpPaymentKit';\nexport * from './transport/mcp/FastMcpStarter';\nexport * from './transport/mcp/McpServerFactory';\n\n// Explicit re-exports to ensure they're available in main package\nexport { createMcpServer, createMcpServerFromEnv, McpServerFactory } from './transport/mcp/McpServerFactory';\n// Note: MCP client exports are already included via ./index.browser -> ./integrations/mcp\n","// Browser bundle entry: export only isomorphic + browser-safe modules\n\n// Core types and utilities\nexport * from './core/types';\nexport * from './core/SubRav';\n// Legacy ClaimScheduler export removed in favor of reactive claims\nexport * from './core/PaymentProcessor';\nexport * from './core/PaymentUtils';\n\n// Contract interfaces\nexport * from './contracts/IPaymentChannelContract';\nexport * from './contracts/IPaymentRevenueContract';\n\n// Chain-agnostic clients\nexport * from './client/PaymentChannelPayerClient';\nexport * from './client/PaymentChannelPayeeClient';\nexport * from './client/PaymentHubClient';\nexport * from './client/PaymentRevenueClient';\n\n// Factory for creating clients\nexport * from './factory/chainFactory';\n\n// HTTP codec and middleware (browser-safe parts)\nexport { HttpPaymentCodec } from './middlewares/http/HttpPaymentCodec';\nexport { HttpBillingMiddleware } from './middlewares/http/HttpBillingMiddleware';\n\n// Rooch implementation (rooch-sdk is browser-compatible)\nexport * from './rooch/RoochPaymentChannelContract';\nexport * from './rooch/RoochPaymentRevenueContract';\nexport * from './rooch/RoochContractBase';\n\n// HTTP Payer Client integration\nexport * from './integrations/http';\n\n// MCP Client (browser-safe): only client-side MCP pieces\nexport * from './integrations/mcp';\n\n// Storage: browser-safe exports (types, memory, IndexedDB, and factory)\nexport type {\n  TransactionStore,\n  TransactionRecord,\n  TransactionStatus,\n  PaymentSnapshot,\n} from './storage/interfaces/TransactionStore';\nexport { MemoryTransactionStore } from './storage/memory/transaction.memory';\nexport { IndexedDBTransactionStore } from './storage/indexeddb/transactions.indexeddb';\nexport {\n  createTransactionStore,\n  type TransactionStoreOptions,\n} from './storage/factories/createTransactionStore';\n\n// Framework-agnostic API types and errors (data-only)\nexport * from './types/api';\nexport * from './errors';\n\n// Zod schemas for validation and serialization (core/api)\nexport {\n  PersistedHttpClientStateSchema,\n  ServiceDiscoverySchema,\n  SystemStatusSchema,\n  ClaimTriggerRequestSchema,\n  ClaimTriggerResponseSchema,\n  RecoveryRequestSchema,\n  RecoveryResponseSchema,\n  CommitRequestSchema,\n  CommitResponseSchema,\n  HealthRequestSchema,\n  HealthResponseSchema,\n  SubRavRequestSchema,\n  SubRavResponseSchema,\n  AdminRequestSchema,\n  SystemStatusResponseSchema,\n  DiscoveryRequestSchema,\n  DiscoveryResponseSchema,\n} from './schema';\n\n// Utilities\nexport {\n  generateNonce,\n  extractFragment,\n  isValidHex,\n  formatAmount,\n  generateChannelId,\n  bigintToString,\n  stringToBigint,\n  formatUsdAmount,\n  DebugLogger,\n} from './utils';\n\n// IdentityEnv helpers\nexport { getChainConfigFromEnv } from './helpers/fromIdentityEnv';\n","import type { SubRAV } from './types';\n\n/**\n * Payment utility functions that are used across different payment processors\n */\nexport class PaymentUtils {\n  /**\n   * Generate transaction reference\n   */\n  static generateTxRef(): string {\n    return `tx_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n  }\n\n  /**\n   * Check if two SubRAVs match (ignoring signature)\n   */\n  static subRAVsMatch(subRAV1: SubRAV, subRAV2: SubRAV): boolean {\n    return (\n      subRAV1.version === subRAV2.version &&\n      subRAV1.chainId === subRAV2.chainId &&\n      subRAV1.channelId === subRAV2.channelId &&\n      subRAV1.channelEpoch === subRAV2.channelEpoch &&\n      subRAV1.vmIdFragment === subRAV2.vmIdFragment &&\n      subRAV1.accumulatedAmount === subRAV2.accumulatedAmount &&\n      subRAV1.nonce === subRAV2.nonce\n    );\n  }\n\n  /**\n   * Generate unique ID for tracking\n   */\n  static generateId(prefix: string = ''): string {\n    const timestamp = Date.now().toString(36);\n    const random = Math.random().toString(36).substring(2, 9);\n    return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n  }\n\n  /**\n   * Safe BigInt comparison\n   */\n  static compareBigInt(a: bigint, b: bigint): number {\n    if (a < b) return -1;\n    if (a > b) return 1;\n    return 0;\n  }\n}\n","/**\n * Chain-agnostic Payment Channel Payer Client\n *\n * This client provides a unified interface for payment channel operations\n * from the Payer perspective, using the IPaymentChannelContract abstraction.\n */\n\nimport type { AssetInfo, SubChannelInfo, ChannelInfo, SignedSubRAV, SubRAV } from '../core/types';\nimport type {\n  IPaymentChannelContract,\n  OpenChannelResult as ContractOpenChannelResult,\n  OpenChannelParams as ContractOpenChannelParams,\n  OpenChannelWithSubChannelParams as ContractOpenChannelWithSubChannelParams,\n  TxResult,\n} from '../contracts/IPaymentChannelContract';\nimport type { SignerInterface } from '@nuwa-ai/identity-kit';\nimport type { ChannelRepository } from '../storage/interfaces/ChannelRepository';\nimport { SubRAVSigner } from '../core/SubRav';\nimport { PaymentHubClient } from './PaymentHubClient';\n\nexport interface PayerOpenChannelParams {\n  payeeDid: string;\n  assetId: string;\n}\n\nexport interface PayerOpenChannelWithSubChannelParams {\n  payeeDid: string;\n  assetId: string;\n  vmIdFragment?: string;\n}\n\n/**\n * Storage options for PaymentChannelPayerClient\n */\nexport interface PayerStorageOptions {\n  channelRepo: ChannelRepository;\n}\n\nexport interface PaymentChannelPayerClientOptions {\n  contract: IPaymentChannelContract;\n  signer: SignerInterface;\n  keyId: string;\n  storageOptions: PayerStorageOptions;\n}\n\nexport interface NextSubRAVOptions {\n  channelId?: string;\n  keyId?: string;\n}\n\nexport interface SignSubRAVOptions {\n  validateBeforeSigning?: boolean;\n  maxAmount?: bigint; // Optional: refuse to sign if amount exceeds this limit\n}\n\nexport interface OpenChannelResultWithInfo extends ContractOpenChannelResult {\n  channelInfo: ChannelInfo;\n}\n\nexport interface OpenChannelResultWithSubChannelInfo extends ContractOpenChannelResult {\n  channelInfo: ChannelInfo;\n  subChannelInfo: SubChannelInfo;\n}\n\nexport interface AuthorizeSubChannelResult extends TxResult {\n  subChannelInfo: SubChannelInfo;\n}\n\n/**\n * Chain-agnostic Payment Channel Payer Client\n *\n * Provides high-level APIs for payment channel operations from the Payer perspective:\n * - Opening channels and authorizing sub-channels\n * - Generating and managing SubRAVs\n * - Multi-channel support with flexible switching\n *\n * Uses composite keys (channelId:keyId) to avoid conflicts between channels.\n * Supports both single-channel (auto-select first active) and multi-channel usage.\n */\nexport class PaymentChannelPayerClient {\n  private contract: IPaymentChannelContract;\n  private signer: SignerInterface;\n  private keyId: string;\n  private channelRepo: ChannelRepository;\n  private chainIdCache?: bigint;\n  private activeChannelId?: string;\n  private defaultAssetId: string;\n\n  constructor(options: PaymentChannelPayerClientOptions) {\n    this.contract = options.contract;\n    this.signer = options.signer;\n    this.keyId = options.keyId;\n    this.defaultAssetId = '0x3::gas_coin::RGas';\n    // Initialize storage\n    this.channelRepo = options.storageOptions.channelRepo;\n  }\n\n  // -------- Channel Management --------\n\n  /**\n   * Open a new payment channel\n   */\n  async openChannel(params: PayerOpenChannelParams): Promise<OpenChannelResultWithInfo> {\n    const payerDid = await this.signer.getDid();\n\n    const openParams: ContractOpenChannelParams = {\n      payerDid,\n      payeeDid: params.payeeDid,\n      assetId: params.assetId,\n      signer: this.signer,\n    };\n\n    const result = await this.contract.openChannel(openParams);\n\n    const channelInfo: ChannelInfo = {\n      channelId: result.channelId,\n      payerDid,\n      payeeDid: params.payeeDid,\n      assetId: params.assetId,\n      epoch: BigInt(0),\n      status: 'active',\n    };\n\n    // Cache channel metadata using channelId as key\n    await this.channelRepo.setChannelMetadata(result.channelId, channelInfo);\n\n    // Set as active channel if no active channel is set\n    if (!this.activeChannelId) {\n      this.activeChannelId = result.channelId;\n    }\n\n    return {\n      channelId: result.channelId,\n      channelInfo,\n      txHash: result.txHash,\n      events: result.events,\n    };\n  }\n\n  /**\n   * Open a payment channel with a sub-channel in one transaction\n   */\n  async openChannelWithSubChannel(\n    params: PayerOpenChannelWithSubChannelParams\n  ): Promise<OpenChannelResultWithSubChannelInfo> {\n    const payerDid = await this.signer.getDid();\n    const useFragment = params.vmIdFragment || this.extractFragment(this.keyId);\n\n    const openParams: ContractOpenChannelWithSubChannelParams = {\n      payerDid,\n      payeeDid: params.payeeDid,\n      assetId: params.assetId,\n      vmIdFragment: useFragment,\n      signer: this.signer,\n    };\n\n    const result = await this.contract.openChannelWithSubChannel(openParams);\n\n    // Cache channel metadata\n    const channelInfo: ChannelInfo = {\n      channelId: result.channelId,\n      payerDid,\n      payeeDid: params.payeeDid,\n      assetId: params.assetId,\n      epoch: BigInt(0),\n      status: 'active',\n    };\n\n    await this.channelRepo.setChannelMetadata(result.channelId, channelInfo);\n\n    const subChannelInfo: SubChannelInfo = {\n      channelId: result.channelId,\n      epoch: BigInt(0),\n      vmIdFragment: useFragment,\n      lastClaimedAmount: BigInt(0),\n      lastConfirmedNonce: BigInt(0),\n      lastUpdated: Date.now(),\n    };\n    // Initialize sub-channel state for this key\n    await this.channelRepo.updateSubChannelState(result.channelId, useFragment, subChannelInfo);\n\n    // Set as active channel if no active channel is set\n    if (!this.activeChannelId) {\n      this.activeChannelId = result.channelId;\n    }\n\n    return {\n      channelId: result.channelId,\n      channelInfo: channelInfo,\n      subChannelInfo: subChannelInfo,\n      txHash: result.txHash,\n      events: result.events,\n    };\n  }\n\n  /**\n   * Authorize a sub-channel for an existing channel\n   */\n  async authorizeSubChannel(params: {\n    channelId: string;\n    vmIdFragment?: string;\n  }): Promise<AuthorizeSubChannelResult> {\n    const payerDid = await this.signer.getDid();\n    const useFragment = params.vmIdFragment || this.extractFragment(this.keyId);\n\n    const result = await this.contract.authorizeSubChannel({\n      channelId: params.channelId,\n      vmIdFragment: useFragment,\n      signer: this.signer,\n    });\n\n    const subChannelInfo: SubChannelInfo = {\n      channelId: params.channelId,\n      epoch: BigInt(0),\n      vmIdFragment: useFragment,\n      lastClaimedAmount: BigInt(0),\n      lastConfirmedNonce: BigInt(0),\n      lastUpdated: Date.now(),\n    };\n\n    // Initialize sub-channel state\n    await this.channelRepo.updateSubChannelState(params.channelId, useFragment, subChannelInfo);\n\n    return {\n      subChannelInfo,\n      txHash: result.txHash,\n      events: result.events,\n    };\n  }\n\n  /**\n   * Set the active channel for subsequent operations\n   * This is a convenience method for single-channel usage patterns\n   */\n  async setActiveChannel(channelId: string): Promise<void> {\n    // Verify the channel exists and is active\n    const metadata = await this.channelRepo.getChannelMetadata(channelId);\n    if (!metadata) {\n      throw new Error(`Channel ${channelId} not found in local storage`);\n    }\n    if (metadata.status !== 'active') {\n      throw new Error(`Channel ${channelId} is not active (status: ${metadata.status})`);\n    }\n\n    this.activeChannelId = channelId;\n  }\n\n  // -------- SubRAV Signing (for API clients) --------\n\n  /**\n   * Sign a SubRAV generated by a service provider\n   * The caller should validate the SubRAV with previous rav before signing it\n   * This is used by API clients to approve payment requests from services\n   */\n  async signSubRAV(subRAV: SubRAV): Promise<SignedSubRAV> {\n    await this.validateSubRAV(subRAV);\n\n    // Verify that our keyId matches the SubRAV\n    const ourFragment = this.extractFragment(this.keyId);\n    if (ourFragment !== subRAV.vmIdFragment) {\n      throw new Error(`Key fragment mismatch: our ${ourFragment}, SubRAV ${subRAV.vmIdFragment}`);\n    }\n\n    // Sign the SubRAV\n    const signedSubRAV = SubRAVSigner.sign(subRAV, this.signer, this.keyId);\n\n    return signedSubRAV;\n  }\n\n  /**\n   * Validate a SubRAV via on chain information\n   */\n  private async validateSubRAV(subRAV: SubRAV): Promise<void> {\n    // 1. Verify channel exists and is active\n    const channelInfo = await this.contract.getChannelStatus({ channelId: subRAV.channelId });\n\n    // 2. Verify epoch matches\n    if (channelInfo.epoch !== subRAV.channelEpoch) {\n      throw new Error(\n        `Epoch mismatch: channel ${channelInfo.epoch}, SubRAV ${subRAV.channelEpoch}`\n      );\n    }\n\n    // When the subchannel is created, the nonce is 0\n    if (subRAV.nonce === BigInt(0)) {\n      throw new Error(`SubRAV nonce cannot be 0`);\n    }\n\n    const expectedChainId = await this.getChainId();\n    if (subRAV.chainId !== expectedChainId) {\n      throw new Error(`Chain ID mismatch: expected ${expectedChainId}, got ${subRAV.chainId}`);\n    }\n  }\n\n  /**\n   * Get a PaymentHubClient instance that reuses this client's contract and signer\n   * This is the recommended way to access payment hub operations\n   */\n  getHubClient(): PaymentHubClient {\n    return new PaymentHubClient({\n      contract: this.contract,\n      signer: this.signer,\n      defaultAssetId: this.defaultAssetId,\n    });\n  }\n\n  /**\n   * Close a payment channel\n   */\n  async closeChannel(channelId: string, cooperative: boolean = true): Promise<{ txHash: string }> {\n    const result = await this.contract.closeChannel({\n      channelId,\n      cooperative,\n      signer: this.signer,\n    });\n\n    // Update cache to mark channel as closed\n    const metadata = await this.channelRepo.getChannelMetadata(channelId);\n    if (metadata) {\n      metadata.status = 'closed';\n      await this.channelRepo.setChannelMetadata(channelId, metadata);\n    }\n\n    // Clear active channel if this was the active one\n    if (this.activeChannelId === channelId) {\n      this.activeChannelId = undefined;\n    }\n\n    return { txHash: result.txHash };\n  }\n\n  /**\n   * Get channel information\n   */\n  async getChannelInfo(channelId: string): Promise<ChannelInfo> {\n    return this.contract.getChannelStatus({ channelId });\n  }\n\n  /**\n   * Get channels for the current payer\n   */\n  async getChannelsByPayer(payerDid: string): Promise<ChannelInfo[]> {\n    const result = await this.channelRepo.listChannelMetadata({ payerDid });\n    return result.items;\n  }\n\n  /**\n   * Get the currently active channel ID\n   */\n  getActiveChannelId(): string | undefined {\n    return this.activeChannelId;\n  }\n\n  getContract(): IPaymentChannelContract {\n    return this.contract;\n  }\n\n  // -------- Asset Information --------\n\n  /**\n   * Get asset information\n   */\n  async getAssetInfo(assetId: string): Promise<AssetInfo> {\n    return this.contract.getAssetInfo(assetId);\n  }\n\n  /**\n   * Get asset price in pUSD\n   */\n  async getAssetPrice(assetId: string): Promise<bigint> {\n    return this.contract.getAssetPrice(assetId);\n  }\n\n  public async getChainId(): Promise<bigint> {\n    if (this.chainIdCache === undefined) {\n      this.chainIdCache = await this.contract.getChainId();\n    }\n    return this.chainIdCache;\n  }\n\n  /**\n   * Get on-chain sub-channel info (state) for the specified vmIdFragment\n   */\n  async getSubChannelInfo(channelId: string, vmIdFragment: string): Promise<SubChannelInfo> {\n    return this.contract.getSubChannel({ channelId, vmIdFragment });\n  }\n\n  // -------- Private Helpers --------\n\n  /**\n   * Extract fragment from full key ID\n   */\n  private extractFragment(keyId: string): string {\n    const parts = keyId.split('#');\n    return parts[parts.length - 1] || keyId;\n  }\n}\n","/**\n * Chain Factory for Payment Channel Contracts\n *\n * Provides factory methods to create chain-specific contract implementations\n * and payment channel clients based on configuration.\n */\n\nimport type { SignerInterface } from '@nuwa-ai/identity-kit';\nimport type { IPaymentChannelContract } from '../contracts/IPaymentChannelContract';\nimport {\n  PaymentChannelPayerClient,\n  type PaymentChannelPayerClientOptions,\n} from '../client/PaymentChannelPayerClient';\nimport { RoochPaymentChannelContract } from '../rooch/RoochPaymentChannelContract';\nimport { type RoochContractOptions } from '../rooch/RoochContractBase';\n\n/**\n * Supported blockchain networks\n */\nexport type SupportedChain = 'rooch';\n\n/**\n * Chain configuration for Rooch\n */\nexport interface RoochChainConfig {\n  chain: 'rooch';\n  rpcUrl?: string;\n  network?: 'local' | 'dev' | 'test' | 'main';\n  contractAddress?: string;\n  debug?: boolean;\n}\n\n/**\n * Union type for all supported chain configurations\n */\nexport type ChainConfig = RoochChainConfig;\n\n/**\n * Factory options for creating payment channel clients\n */\nexport interface PaymentChannelFactoryOptions {\n  chainConfig: ChainConfig;\n  signer: SignerInterface;\n  keyId: string;\n  storageOptions: PaymentChannelPayerClientOptions['storageOptions'];\n}\n\n/**\n * Chain Factory for creating payment channel contracts and clients\n */\nexport class PaymentChannelFactory {\n  /**\n   * Create a chain-specific contract implementation\n   */\n  static createContract(config: ChainConfig): IPaymentChannelContract {\n    switch (config.chain) {\n      case 'rooch':\n        return new RoochPaymentChannelContract({\n          rpcUrl: config.rpcUrl,\n          network: config.network,\n          contractAddress: config.contractAddress,\n          debug: config.debug,\n        });\n\n      default:\n        throw new Error(`Unsupported chain: ${(config as any).chain}`);\n    }\n  }\n\n  /**\n   * Create a payment channel client with chain-specific contract\n   */\n  static createClient(options: PaymentChannelFactoryOptions): PaymentChannelPayerClient {\n    const contract = this.createContract(options.chainConfig);\n\n    return new PaymentChannelPayerClient({\n      contract,\n      signer: options.signer,\n      keyId: options.keyId,\n      storageOptions: options.storageOptions,\n    });\n  }\n}\n\n/**\n * Convenience function to create a payment channel client\n */\nexport function createPaymentChannelClient(\n  options: PaymentChannelFactoryOptions\n): PaymentChannelPayerClient {\n  return PaymentChannelFactory.createClient(options);\n}\n","/**\n * Refactored HTTP Payment Middleware\n *\n * This middleware now serves as a protocol adapter that delegates payment\n * processing to the PaymentProcessor component. It focuses only on HTTP-specific\n * concerns like request/response handling and error mapping.\n */\n\nimport { PaymentProcessor } from '../../core/PaymentProcessor';\nimport type { PaymentProcessorConfig } from '../../core/PaymentProcessor';\nimport type { BillingContext } from '../../billing';\nimport { HttpPaymentCodec } from './HttpPaymentCodec';\nimport type {\n  PaymentRequestPayload,\n  HttpRequestPayload,\n  HttpResponsePayload,\n  SignedSubRAV,\n} from '../../core/types';\nimport { PaymentChannelPayeeClient } from '../../client/PaymentChannelPayeeClient';\nimport type { BillingRule, RuleProvider } from '../../billing';\nimport type { RateProvider } from '../../billing/rate/types';\nimport { findRule } from '../../billing/core/rule-matcher';\nimport type { PendingSubRAVRepository } from '../../storage/interfaces/PendingSubRAVRepository';\n// Legacy ClaimScheduler removed\nimport type { RAVRepository } from '../../storage/interfaces/RAVRepository';\nimport { DIDResolver, DebugLogger } from '@nuwa-ai/identity-kit';\nimport { httpStatusFor, PaymentErrorCode } from '../../errors/codes';\n\n// Generic HTTP interfaces (framework-agnostic)\nexport interface GenericHttpRequest {\n  path: string;\n  method: string;\n  headers: Record<string, string | string[] | undefined>;\n  query: Record<string, any>;\n  body?: any;\n}\n\nexport interface ResponseAdapter {\n  setStatus(code: number): ResponseAdapter;\n  json(obj: any): ResponseAdapter | void;\n  setHeader(name: string, value: string): ResponseAdapter;\n}\n\ninterface ExpressResponse {\n  status(code: number): ExpressResponse;\n  json(obj: any): ExpressResponse;\n  setHeader(name: string, value: string): ExpressResponse;\n  headersSent: boolean;\n}\n\n/**\n * Configuration for the HTTP billing middleware\n */\nexport interface HttpBillingMiddlewareConfig {\n  /** Payment processor for handling billing */\n  processor: PaymentProcessor;\n\n  /** Rule provider for pre-matching billing rules (V2 optimization) */\n  ruleProvider: RuleProvider;\n\n  /** Debug logging */\n  debug?: boolean;\n  /** Reactive claim stats are exposed via ClaimTriggerService on admin APIs */\n}\n\n/**\n * HTTP-specific error codes mapped to HTTP status codes\n */\n// Deprecated: Use PaymentErrorCode from errors/codes\n// Keeping the name for potential external imports, but aligned to centralized enum\nexport const HttpPaymentErrorCode = PaymentErrorCode;\n\n/**\n * Refactored HTTP Billing Middleware\n *\n * Now serves as a thin protocol adapter that:\n * 1. Extracts HTTP-specific request data\n * 2. Delegates payment processing to PaymentProcessor\n * 3. Maps results back to HTTP responses\n * 4. Handles HTTP-specific error formatting\n */\nexport class HttpBillingMiddleware {\n  private processor: PaymentProcessor;\n  private codec: HttpPaymentCodec;\n  private config: HttpBillingMiddlewareConfig;\n  private logger: DebugLogger;\n\n  constructor(config: HttpBillingMiddlewareConfig) {\n    this.config = config;\n    this.processor = config.processor;\n    // Initialize HTTP codec\n    this.codec = new HttpPaymentCodec();\n    this.logger = DebugLogger.get('HttpBillingMiddleware');\n    this.logger.setLevel(config.debug ? 'debug' : 'info');\n  }\n\n  /**\n   * New unified billing handler using the three-step process\n   */\n  async handleWithNewAPI(req: GenericHttpRequest): Promise<BillingContext | null> {\n    try {\n      this.log('🔍 Processing HTTP payment request with new API:', req.method, req.path);\n\n      // Step 1: Find matching billing rule\n      const rule = this.findBillingRule(req);\n\n      if (!rule) {\n        this.log('📝 No billing rule matched - proceeding without payment processing');\n        return null;\n      }\n\n      // Step 2: Build initial billing context\n      const paymentData = this.extractPaymentData(req.headers);\n      const ctx = this.buildBillingContext(req, paymentData || undefined, rule);\n\n      // Step 3: Pre-process the request\n      const processedCtx = await this.processor.preProcess(ctx);\n\n      // Step 4: Check if verification failed\n      if (processedCtx.state && processedCtx.state.signedSubRavVerified === false) {\n        this.log('🚨 Payment verification failed during pre-processing');\n        return null;\n      }\n\n      this.log(`📋 Request pre-processed for ${rule.strategy.type}`);\n      if (processedCtx.state) {\n        this.log(`📋 Context state:`, {\n          signedSubRavVerified: processedCtx.state.signedSubRavVerified,\n          cost: processedCtx.state.cost,\n          responsePayload: !!processedCtx.state.responsePayload,\n        });\n      }\n      return processedCtx;\n    } catch (error) {\n      this.log('🚨 New API payment processing error:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Complete billing settlement synchronously (Step B & C) - for on-headers use\n   */\n  settleBillingSync(ctx: BillingContext, usage?: number, resAdapter?: ResponseAdapter): boolean {\n    try {\n      this.log('🔄 Settling billing synchronously with usage:', usage);\n\n      // Use the processor's synchronous settle method\n      const settledCtx = this.processor.settle(ctx, usage);\n\n      // Check if this is a free route that should not generate headers\n      if (ctx.meta.billingRule && !ctx.meta.billingRule.paymentRequired) {\n        this.log('📝 Free route - skipping payment header generation');\n        return true; // Successfully handled, no header needed\n      }\n\n      // Prefer responsePayload; fallback to legacy headerValue\n      const payload = settledCtx.state?.responsePayload;\n      const header = payload ? HttpPaymentCodec.buildResponseHeader(payload as any) : undefined;\n      if (!header) {\n        this.log('⚠️ No payment header generated during settlement');\n        return false;\n      }\n      if (resAdapter) {\n        resAdapter.setHeader('X-Payment-Channel-Data', header);\n        this.log('✅ Payment header added to response synchronously');\n      }\n\n      return true;\n    } catch (error) {\n      this.log('🚨 Synchronous billing settlement error:', error);\n      return false;\n    }\n  }\n\n  /** Save settlement payload for later polling by client (streaming scenarios) */\n  saveSettlement(ctx: BillingContext): void {\n    const state = ctx.state || {};\n    const payload = {\n      subRav: state.unsignedSubRav,\n      cost: state.cost,\n      // costUsd is not persisted in state; optional\n      clientTxRef: ctx.meta.clientTxRef,\n      serviceTxRef: state.serviceTxRef,\n      version: 1,\n    };\n    if (!payload.clientTxRef) return;\n  }\n\n  /**\n   * Persist billing results (Step D) - async persistence only\n   */\n  async persistBilling(ctx: BillingContext): Promise<void> {\n    try {\n      this.log('💾 Persisting billing results');\n\n      if (ctx.state?.unsignedSubRav) {\n        await this.processor.persist(ctx);\n        this.log('✅ Billing results persisted successfully');\n      } else {\n        this.log('⚠️ No SubRAV to persist');\n      }\n    } catch (error) {\n      this.log('🚨 Billing persistence error:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Find matching billing rule for the request\n   */\n  private findBillingRule(req: GenericHttpRequest): BillingRule | undefined {\n    if (!this.config.ruleProvider) {\n      throw new Error(\n        'RuleProvider is required for auto-detection. Please configure it in HttpBillingMiddlewareConfig.'\n      );\n    }\n\n    const meta = {\n      path: req.path,\n      method: req.method,\n      // Include other relevant metadata for rule matching\n      httpQuery: req.query,\n      httpBody: req.body,\n      httpHeaders: req.headers,\n    };\n\n    return findRule(meta, this.config.ruleProvider.getRules());\n  }\n\n  /**\n   * Extract payment data from HTTP request headers\n   */\n  extractPaymentData(\n    headers: Record<string, string | string[] | undefined>\n  ): PaymentRequestPayload | null {\n    const headerValue = HttpPaymentCodec.extractPaymentHeader(headers);\n\n    if (!headerValue) {\n      return null;\n    }\n\n    try {\n      return this.codec.decodePayload(headerValue);\n    } catch (error) {\n      throw new Error(`Invalid payment channel header: ${error}`);\n    }\n  }\n\n  /**\n   * Build billing context from HTTP request\n   */\n  private buildBillingContext(\n    req: GenericHttpRequest,\n    paymentData?: PaymentRequestPayload,\n    billingRule?: BillingRule\n  ): BillingContext {\n    return {\n      serviceId: this.processor.getServiceId(),\n      meta: {\n        operation: `${req.method.toLowerCase()}:${req.path}`,\n\n        // Pre-matched billing rule (V2 optimization)\n        billingRule,\n\n        // Payment data from HTTP headers\n        maxAmount: paymentData?.maxAmount,\n        signedSubRav: paymentData?.signedSubRav,\n        clientTxRef: paymentData?.clientTxRef || crypto.randomUUID(),\n        // DIDAuth (ExpressPaymentKit attaches didInfo onto req)\n        didInfo: (req as any).didInfo,\n\n        // HTTP-specific metadata for billing rules\n        method: req.method,\n        path: req.path,\n\n        // Also keep HTTP-prefixed versions for other uses\n        httpMethod: req.method,\n        httpPath: req.path,\n        httpQuery: req.query,\n        httpBody: req.body,\n        httpHeaders: req.headers,\n      },\n    };\n  }\n\n  /**\n   * Map error code to HTTP status code\n   */\n  private mapErrorToHttpStatus(errorCode?: string): number {\n    return httpStatusFor(errorCode as PaymentErrorCode);\n  }\n\n  /**\n   * Get payment processing statistics\n   */\n  getProcessingStats() {\n    return this.processor.getProcessingStats();\n  }\n\n  /**\n   * Find pending SubRAV proposal\n   */\n  async findPendingProposal(channelId: string, vmIdFragment: string, nonce: bigint): Promise<any> {\n    return await this.processor.findPendingProposal(channelId, vmIdFragment, nonce);\n  }\n\n  /**\n   * Find the latest pending SubRAV proposal for a channel\n   */\n  async findLatestPendingProposal(channelId: string, vmIdFragment: string): Promise<any> {\n    return await this.processor.findLatestPendingProposal(channelId, vmIdFragment);\n  }\n\n  /**\n   * Create ExpressJS ResponseAdapter\n   */\n  private createExpressResponseAdapter(res: ExpressResponse): ResponseAdapter {\n    return {\n      setStatus: (code: number) => {\n        res.status(code);\n        return this.createExpressResponseAdapter(res); // Return adapter for chaining\n      },\n      json: (obj: any) => {\n        res.json(obj);\n        // Note: Express res.json() returns void, so we return void to match interface\n      },\n      setHeader: (name: string, value: string) => {\n        res.setHeader(name, value);\n        return this.createExpressResponseAdapter(res); // Return adapter for chaining\n      },\n    };\n  }\n\n  /**\n   * Debug logging\n   */\n  private log(...args: any[]): void {\n    this.logger.debug(...args);\n  }\n\n  /**\n   * Static factory method for creating middleware\n   */\n  static create(config: HttpBillingMiddlewareConfig): HttpBillingMiddleware {\n    return new HttpBillingMiddleware(config);\n  }\n}\n\n/**\n * Utility function to create ExpressJS ResponseAdapter\n */\nexport function createExpressResponseAdapter(res: any): ResponseAdapter {\n  return {\n    setStatus: (code: number) => {\n      res.status(code);\n      return createExpressResponseAdapter(res);\n    },\n    json: (obj: any) => {\n      res.json(obj);\n    },\n    setHeader: (name: string, value: string) => {\n      res.setHeader(name, value);\n      return createExpressResponseAdapter(res);\n    },\n  };\n}\n\n// No longer re-export ProcessorPaymentResult; results are available via BillingContext.state\n\n/**\n * Utility function to create Koa ResponseAdapter (example for other frameworks)\n */\nexport function createKoaResponseAdapter(ctx: any): ResponseAdapter {\n  return {\n    setStatus: (code: number) => {\n      ctx.status = code;\n      return createKoaResponseAdapter(ctx);\n    },\n    json: (obj: any) => {\n      ctx.body = obj;\n    },\n    setHeader: (name: string, value: string) => {\n      ctx.set(name, value);\n      return createKoaResponseAdapter(ctx);\n    },\n  };\n}\n","/**\n * Rooch Payment Revenue Contract Implementation\n *\n * Implementation of IPaymentRevenueContract for Rooch blockchain.\n * Provides concrete implementation of payment revenue operations using Rooch SDK\n * and the rooch_framework::payment_revenue Move module.\n */\n\nimport { Args } from '@roochnetwork/rooch-sdk';\n\nimport type {\n  IPaymentRevenueContract,\n  WithdrawRevenueParams,\n  WithdrawalPreview,\n  RevenueSource,\n} from '../contracts/IPaymentRevenueContract';\nimport type { TxResult } from '../contracts/IPaymentChannelContract';\nimport { SignerInterface, parseDid } from '@nuwa-ai/identity-kit';\nimport {\n  badRequest,\n  wrapUnknownError,\n  mapTxFailureToPaymentKitError,\n} from '../errors/RoochErrorMapper';\nimport {\n  deriveFieldKeyFromString,\n  deriveCoinTypeFieldKey,\n  parseDynamicFieldCoinStore,\n  safeBalanceToBigint,\n  calculateRevenueHubId,\n  parsePaymentRevenueHubData,\n  parseU256FromBCS,\n  extractStringFromFieldKey,\n  extractAssetIdFromFieldKey,\n  extractTableIdFromField,\n  PaymentRevenueHub,\n} from './ChannelUtils';\nimport { RoochContractBase, type RoochContractOptions } from './RoochContractBase';\n\n/**\n * Default contract address for Rooch payment revenue\n */\nconst DEFAULT_PAYMENT_REVENUE_MODULE = '0x3::payment_revenue';\n\n/**\n * Rooch implementation of the Payment Revenue Contract\n *\n * This implementation provides complete functionality for payment revenue management\n * using the Rooch blockchain and corresponding Move contracts.\n */\nexport class RoochPaymentRevenueContract\n  extends RoochContractBase\n  implements IPaymentRevenueContract\n{\n  constructor(options: RoochContractOptions = {}) {\n    super(options, DEFAULT_PAYMENT_REVENUE_MODULE, 'RoochPaymentRevenueContract');\n  }\n\n  // -------- Revenue Hub Management --------\n\n  async createRevenueHub(ownerDid: string, signer: SignerInterface): Promise<TxResult> {\n    try {\n      this.logger.debug('Creating revenue hub for DID:', ownerDid);\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      const roochSigner = await this.convertSigner(signer);\n\n      // Create transaction to create revenue hub\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::create_revenue_hub`,\n        typeArgs: [],\n        args: [],\n        maxGas: 100000000,\n      });\n\n      this.logger.debug('Executing createRevenueHub transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer: roochSigner,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('createRevenueHub', result.execution_info);\n      }\n\n      return {\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0),\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.logger.error('Error creating revenue hub:', error);\n      throw wrapUnknownError('createRevenueHub', error);\n    }\n  }\n\n  async revenueHubExists(ownerDid: string): Promise<boolean> {\n    try {\n      this.logger.debug('Checking if revenue hub exists for DID:', ownerDid);\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      // Calculate revenue hub object ID\n      const revenueHubId = calculateRevenueHubId(ownerParsed.identifier);\n\n      // Check if object exists\n      const objectState = await this.getClient().getObjectStates({\n        ids: [revenueHubId],\n      });\n\n      return objectState && objectState.length > 0 && objectState[0] !== null;\n    } catch (error) {\n      this.logger.error('Error checking revenue hub existence:', error);\n      // If error is \"object not found\", return false\n      if (\n        error &&\n        typeof error === 'object' &&\n        'toString' in error &&\n        error.toString().includes('not found')\n      ) {\n        return false;\n      }\n      throw wrapUnknownError('revenueHubExists', error);\n    }\n  }\n\n  // -------- Revenue Operations --------\n\n  async withdrawRevenue(params: WithdrawRevenueParams): Promise<TxResult> {\n    try {\n      this.logger.debug('Withdrawing revenue with params:', params);\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(params.ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      const signer = await this.convertSigner(params.signer);\n\n      // Create transaction to withdraw revenue\n      const transaction = this.createTransaction();\n      transaction.callFunction({\n        target: `${this.getContractAddress()}::withdraw_revenue_entry`,\n        typeArgs: [params.assetId], // CoinType as type argument\n        args: [Args.u256(params.amount)],\n        maxGas: 100000000,\n      });\n\n      this.logger.debug('Executing withdrawRevenue transaction');\n\n      // Execute transaction\n      const result = await this.getClient().signAndExecuteTransaction({\n        transaction,\n        signer,\n        option: { withOutput: true },\n      });\n\n      if (result.execution_info.status.type !== 'executed') {\n        throw mapTxFailureToPaymentKitError('withdrawRevenue', result.execution_info);\n      }\n\n      return {\n        txHash: result.execution_info.tx_hash || '',\n        blockHeight: BigInt(0),\n        events: result.output?.events,\n      };\n    } catch (error) {\n      this.logger.error('Error withdrawing revenue:', error);\n      throw wrapUnknownError('withdrawRevenue', error);\n    }\n  }\n\n  async previewWithdrawalFee(\n    ownerDid: string,\n    assetId: string,\n    amount: bigint\n  ): Promise<WithdrawalPreview> {\n    try {\n      this.logger.debug(\n        'Previewing withdrawal fee for DID:',\n        ownerDid,\n        'asset:',\n        assetId,\n        'amount:',\n        amount\n      );\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      // Currently, the Move contract returns zero fees\n      // This is a placeholder for future fee mechanism implementation\n      return {\n        grossAmount: amount,\n        feeAmount: BigInt(0),\n        netAmount: amount,\n        feeRateBps: 0,\n      };\n    } catch (error) {\n      this.logger.error('Error previewing withdrawal fee:', error);\n      throw wrapUnknownError('previewWithdrawalFee', error);\n    }\n  }\n\n  // -------- Balance Queries --------\n\n  async getRevenueBalance(ownerDid: string, assetId: string): Promise<bigint> {\n    try {\n      this.logger.debug('Getting revenue balance for DID:', ownerDid, 'asset:', assetId);\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      // Get PaymentRevenueHub object\n      const revenueHub = await this.getRevenueHub(ownerParsed.identifier);\n      if (!revenueHub) {\n        this.logger.debug('Revenue hub not found for owner:', ownerDid);\n        return BigInt(0);\n      }\n\n      this.logger.debug('MultiCoinStore ID extracted:', revenueHub.multi_coin_store);\n\n      // Query the specific field for this coin type in the multi_coin_store\n      const fieldKey = deriveCoinTypeFieldKey(assetId);\n      const fieldStates = await this.getClient().getFieldStates({\n        objectId: revenueHub.multi_coin_store,\n        fieldKey: [fieldKey],\n      });\n\n      if (!fieldStates || fieldStates.length === 0 || !fieldStates[0]) {\n        // Asset not found in the store, balance is 0\n        this.logger.debug('Asset not found in multi_coin_store:', assetId);\n        return BigInt(0);\n      }\n\n      // Parse the DynamicField<String, CoinStoreField> to get balance\n      const fieldState = fieldStates[0];\n      const fieldValue = fieldState.value;\n\n      if (typeof fieldValue === 'string' && fieldValue.startsWith('0x')) {\n        // Parse BCS data\n        const coinStoreField = parseDynamicFieldCoinStore(fieldValue);\n        return safeBalanceToBigint(coinStoreField.value.balance.value);\n      } else {\n        this.logger.warn('Unexpected field value format:', fieldValue);\n        return BigInt(0);\n      }\n    } catch (error) {\n      this.logger.error('Error getting revenue balance:', error);\n      // If error is related to object not found, return 0\n      if (\n        error &&\n        typeof error === 'object' &&\n        'toString' in error &&\n        error.toString().includes('not found')\n      ) {\n        return BigInt(0);\n      }\n      throw wrapUnknownError('getRevenueBalance', error);\n    }\n  }\n\n  async getRevenueBySource(ownerDid: string, sourceType: string, assetId: string): Promise<bigint> {\n    try {\n      this.logger.debug(\n        'Getting revenue by source for DID:',\n        ownerDid,\n        'source:',\n        sourceType,\n        'asset:',\n        assetId\n      );\n\n      // Parse and validate owner DID\n      const ownerParsed = parseDid(ownerDid);\n      if (ownerParsed.method !== 'rooch') {\n        throw badRequest(`Invalid owner DID method: expected 'rooch', got '${ownerParsed.method}'`);\n      }\n\n      // Get PaymentRevenueHub object\n      const revenueHub = await this.getRevenueHub(ownerParsed.identifier);\n      if (!revenueHub) {\n        this.logger.debug('Revenue hub not found for owner:', ownerDid);\n        return BigInt(0);\n      }\n\n      // Query the revenue_by_source table\n      const sourceFieldKey = deriveFieldKeyFromString(sourceType);\n      const sourceFieldStates = await this.getClient().getFieldStates({\n        objectId: revenueHub.revenue_by_source,\n        fieldKey: [sourceFieldKey],\n      });\n\n      if (!sourceFieldStates || sourceFieldStates.length === 0 || !sourceFieldStates[0]) {\n        // Source type not found\n        this.logger.debug('Source type not found in revenue_by_source:', sourceType);\n        return BigInt(0);\n      }\n\n      // Parse the source table and query for the specific asset\n      const sourceTableId = extractTableIdFromField(sourceFieldStates[0].value);\n      if (!sourceTableId) {\n        return BigInt(0);\n      }\n\n      const assetFieldKey = deriveFieldKeyFromString(assetId);\n      const assetFieldStates = await this.getClient().getFieldStates({\n        objectId: sourceTableId,\n        fieldKey: [assetFieldKey],\n      });\n\n      if (!assetFieldStates || assetFieldStates.length === 0 || !assetFieldStates[0]) {\n        // Asset not found in source table\n        this.logger.debug('Asset not found in source table:', assetId);\n        return BigInt(0);\n      }\n\n      // Parse the u256 value\n      const fieldValue = assetFieldStates[0].value;\n      if (typeof fieldValue === 'string' && fieldValue.startsWith('0x')) {\n        // Parse u256 from BCS data\n        return parseU256FromBCS(fieldValue);\n      } else {\n        this.logger.warn('Unexpected field value format for revenue amount:', fieldValue);\n        return BigInt(0);\n      }\n    } catch (error) {\n      this.logger.error('Error getting revenue by source:', error);\n      // If error is related to object not found, return 0\n      if (\n        error &&\n        typeof error === 'object' &&\n        'toString' in error &&\n        error.toString().includes('not found')\n      ) {\n        return BigInt(0);\n      }\n      throw wrapUnknownError('getRevenueBySource', error);\n    }\n  }\n\n  // -------- Helper Methods --------\n\n  private async getRevenueHub(ownerAddress: string): Promise<PaymentRevenueHub | null> {\n    try {\n      const revenueHubId = calculateRevenueHubId(ownerAddress);\n      const objectState = await this.getClient().getObjectStates({\n        ids: [revenueHubId],\n      });\n\n      if (!objectState || objectState.length === 0 || !objectState[0]) {\n        return null;\n      }\n\n      // Parse the PaymentRevenueHub from BCS data\n      return parsePaymentRevenueHubData(objectState[0].value);\n    } catch (error) {\n      this.logger.debug('Error getting revenue hub:', error);\n      return null;\n    }\n  }\n}\n","import type {\n  HttpPayerOptions,\n  FetchLike,\n  PaymentRequestContext,\n  PaymentRequestHandle,\n} from './types';\nimport type {\n  SubRAV,\n  SignedSubRAV,\n  PaymentInfo,\n  PaymentResult,\n  SubChannelInfo,\n} from '../../core/types';\nimport type { ApiResponse } from '../../types/api';\nimport type {\n  DiscoveryResponse,\n  HealthResponse,\n  RecoveryResponse,\n  CommitResponse,\n} from '../../schema';\nimport { ErrorCode } from '../../types/api';\nimport { PaymentKitError } from '../../errors';\nimport { PaymentChannelPayerClient } from '../../client/PaymentChannelPayerClient';\nimport { assertSubRavProgression } from '../../core/RavVerifier';\nimport { PaymentChannelFactory } from '../../factory/chainFactory';\nimport { DidAuthHelper } from './internal/DidAuthHelper';\nimport {\n  createDefaultMappingStore,\n  extractHost,\n  createDefaultChannelRepo,\n  createDefaultTransactionStore,\n  createNamespacedMappingStore,\n} from './internal/LocalStore';\nimport { parseJsonResponse, serializeJson } from '../../utils/json';\nimport { RecoveryResponseSchema, HealthResponseSchema } from '../../schema';\nimport type { z } from 'zod';\nimport { PaymentHubClient } from '../../client/PaymentHubClient';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { TransactionStore, type ChannelRepository } from '../../storage';\nimport { PaymentErrorCode } from '../../errors/codes';\nimport { wrapAndFilterInBandFrames } from './internal/StreamPaymentFilter';\nimport { isStreamLikeResponse } from './internal/utils';\nimport { RateProvider } from '../../billing/rate/types';\nimport { ContractRateProvider } from '../../billing/rate/contract';\nimport { RequestScheduler } from './internal/RequestScheduler';\n\n// Import new core modules\nimport { PaymentState } from './core/PaymentState';\nimport { PaymentProtocol } from './core/PaymentProtocol';\nimport { RequestManager } from './core/RequestManager';\nimport { ChannelManager } from './core/ChannelManager';\n\n/**\n * PaymentChannelHttpClient provides a high-level HTTP interface\n * for making requests with integrated payment channel functionality.\n *\n * This refactored version uses modular architecture while maintaining\n * backward compatibility with the original API.\n */\nexport class PaymentChannelHttpClient {\n  private payerClient: PaymentChannelPayerClient;\n  private options: HttpPayerOptions;\n  private fetchImpl: FetchLike;\n  private host: string;\n  private logger: DebugLogger;\n  private requestTimeoutMs: number;\n  private rateProvider: RateProvider;\n  private scheduler: RequestScheduler = new RequestScheduler();\n  private isCleanedUp = false;\n  private transactionStore: TransactionStore;\n  private channelRepo: ChannelRepository;\n  /**\n   * Associates protocol errors with HTTP responses to avoid double-throwing errors.\n   * This WeakMap tracks errors encountered during the response handling flow,\n   * ensuring that only one error is thrown per response and preventing duplicate\n   * error propagation. This is especially important in asynchronous flows where\n   * multiple handlers may process the same response.\n   */\n  private protocolErrorByResponse: WeakMap<Response, PaymentKitError> = new WeakMap();\n\n  // New modular components\n  private paymentState: PaymentState;\n  private paymentProtocol: PaymentProtocol;\n  private requestManager: RequestManager;\n  private channelManager: ChannelManager;\n\n  constructor(options: HttpPayerOptions) {\n    this.options = options;\n    this.fetchImpl = options.fetchImpl || (globalThis as any).fetch?.bind(globalThis);\n    this.host = extractHost(options.baseUrl);\n    this.channelRepo = options.channelRepo || createDefaultChannelRepo();\n    this.transactionStore = options.transactionStore || createDefaultTransactionStore();\n\n    if (!this.fetchImpl) {\n      throw new Error('fetch implementation not available. Please provide fetchImpl option.');\n    }\n\n    // Initialize payment channel client\n    this.payerClient = PaymentChannelFactory.createClient({\n      chainConfig: options.chainConfig,\n      signer: options.signer,\n      keyId: options.keyId,\n      storageOptions: {\n        channelRepo: this.channelRepo,\n      },\n    });\n\n    this.rateProvider = new ContractRateProvider(this.payerClient.getContract());\n\n    this.logger = DebugLogger.get('PaymentChannelHttpClient');\n    this.logger.setLevel(this.options.debug ? 'debug' : 'info');\n\n    // Initialize configurable timeout\n    this.requestTimeoutMs = this.options.timeoutMs ?? 30000;\n    if (this.options.timeoutMsStream === undefined) {\n      this.options.timeoutMsStream = this.requestTimeoutMs;\n    }\n\n    // Initialize modular components\n    this.paymentState = new PaymentState();\n    this.paymentProtocol = new PaymentProtocol();\n    this.requestManager = new RequestManager(this.paymentState, this.requestTimeoutMs);\n\n    // Initialize mapping store\n    const baseMapping = options.mappingStore || createDefaultMappingStore();\n    const mappingStore = createNamespacedMappingStore(baseMapping, {\n      getPayerDid: async () => this.options.payerDid || (await this.options.signer.getDid()),\n    });\n\n    this.channelManager = new ChannelManager({\n      host: this.host,\n      baseUrl: options.baseUrl,\n      payerClient: this.payerClient,\n      paymentState: this.paymentState,\n      mappingStore,\n      fetchImpl: this.fetchImpl,\n      signer: options.signer,\n      keyId: options.keyId,\n      payerDid: options.payerDid,\n      payeeDid: options.payeeDid,\n      defaultAssetId: options.defaultAssetId,\n    });\n  }\n\n  /**\n   * Primary API – returns a handle with separate response and payment promises.\n   */\n  async requestWithPayment(\n    method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n    path: string,\n    init?: RequestInit\n  ): Promise<PaymentRequestHandle<Response>> {\n    return this.createRequestHandle(method, path, init);\n  }\n\n  /**\n   * Convenience: return only the HTTP response (non-blocking for payment).\n   */\n  async request(\n    method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n    path: string,\n    init?: RequestInit\n  ): Promise<Response> {\n    const handle = await this.createRequestHandle(method, path, init);\n    return handle.response;\n  }\n\n  /**\n   * Convenience: wait for response and payment (recommended for non-streaming endpoints).\n   */\n  async requestAndWaitForPayment(\n    method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n    path: string,\n    init?: RequestInit\n  ): Promise<PaymentResult<Response>> {\n    const handle = await this.createRequestHandle(method, path, init);\n    const data = await handle.response;\n    let payment: PaymentInfo | undefined = undefined;\n    try {\n      payment = await handle.payment;\n    } catch (e) {\n      this.log('[payment.error]', e);\n    }\n    return { data, payment };\n  }\n\n  /**\n   * Convenience methods for common HTTP verbs\n   */\n  async get<T = any>(path: string, init?: RequestInit): Promise<PaymentResult<T>> {\n    const result = await this.requestAndWaitForPayment('GET', path, init);\n    const data = await this.parseJsonAuto<T>(result.data);\n    return { data, payment: result.payment };\n  }\n\n  async post<T = any>(path: string, body?: any, init?: RequestInit): Promise<PaymentResult<T>> {\n    const requestInit = {\n      ...init,\n      body: body ? JSON.stringify(body) : undefined,\n      headers: {\n        'Content-Type': 'application/json',\n        ...init?.headers,\n      },\n    };\n    const result = await this.requestAndWaitForPayment('POST', path, requestInit);\n    const data = await this.parseJsonAuto<T>(result.data);\n    return { data, payment: result.payment };\n  }\n\n  async put<T = any>(path: string, body?: any, init?: RequestInit): Promise<PaymentResult<T>> {\n    const requestInit = {\n      ...init,\n      body: body ? JSON.stringify(body) : undefined,\n      headers: {\n        'Content-Type': 'application/json',\n        ...init?.headers,\n      },\n    };\n    const result = await this.requestAndWaitForPayment('PUT', path, requestInit);\n    const data = await this.parseJsonAuto<T>(result.data);\n    return { data, payment: result.payment };\n  }\n\n  async patch<T = any>(path: string, body?: any, init?: RequestInit): Promise<PaymentResult<T>> {\n    const requestInit = {\n      ...init,\n      body: body ? JSON.stringify(body) : undefined,\n      headers: {\n        'Content-Type': 'application/json',\n        ...init?.headers,\n      },\n    };\n    const result = await this.requestAndWaitForPayment('PATCH', path, requestInit);\n    const data = await this.parseJsonAuto<T>(result.data);\n    return { data, payment: result.payment };\n  }\n\n  async delete<T = any>(path: string, init?: RequestInit): Promise<PaymentResult<T>> {\n    const result = await this.requestAndWaitForPayment('DELETE', path, init);\n    const data = await this.parseJsonAuto<T>(result.data);\n    return { data, payment: result.payment };\n  }\n\n  /**\n   * Get the currently cached pending SubRAV\n   */\n  getPendingSubRAV(): SubRAV | null {\n    return this.paymentState.getPendingSubRAV() || null;\n  }\n\n  /**\n   * Clear the pending SubRAV cache\n   */\n  clearPendingSubRAV(): void {\n    this.paymentState.clearPendingSubRAV();\n    void this.persistClientState();\n  }\n\n  /**\n   * Get the current channel ID\n   */\n  getChannelId(): string | undefined {\n    return this.paymentState.getChannelId();\n  }\n\n  getPayerClient(): PaymentChannelPayerClient {\n    return this.payerClient;\n  }\n\n  getHubClient(): PaymentHubClient {\n    return this.payerClient.getHubClient();\n  }\n\n  getTransactionStore(): TransactionStore {\n    return this.transactionStore;\n  }\n\n  /**\n   * Discover service information\n   */\n  async discoverService(): Promise<DiscoveryResponse> {\n    return this.channelManager.discoverService();\n  }\n\n  async healthCheck(): Promise<HealthResponse> {\n    const healthUrl = this.channelManager.buildPaymentUrl('/health');\n    const response = await this.fetchImpl(healthUrl, { method: 'GET' });\n    return this.parseJsonAuto(response, HealthResponseSchema);\n  }\n\n  /**\n   * Recover channel state and pending SubRAV from service\n   */\n  async recoverFromService(): Promise<RecoveryResponse> {\n    return this.channelManager.recoverFromService();\n  }\n\n  /**\n   * Commit a signed SubRAV to the service\n   */\n  async commitSubRAV(signedSubRAV: SignedSubRAV): Promise<CommitResponse> {\n    await this.channelManager.commitSubRAV(signedSubRAV);\n    return { success: true };\n  }\n\n  buildPaymentUrl(endpoint: string): string {\n    return this.channelManager.buildPaymentUrl(endpoint);\n  }\n\n  getPersistedState(): any {\n    return this.paymentState.getPersistedState();\n  }\n\n  // NOTE: Additional methods will be added in subsequent parts\n  // This is a partial implementation to demonstrate the integration\n\n  private log(...args: any[]): void {\n    this.logger.debug(...args);\n  }\n\n  private async parseJsonAuto<T>(response: Response, schema?: z.ZodType<T>): Promise<T> {\n    // If protocol-level error was recorded for this response, prefer it\n    const protoErr = this.protocolErrorByResponse.get(response);\n    if (protoErr) {\n      throw protoErr;\n    }\n\n    const contentType = response.headers.get('content-type');\n    if (!contentType || !contentType.includes('application/json')) {\n      throw new Error('Response is not JSON');\n    }\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    let responseData: any;\n    try {\n      responseData = await parseJsonResponse<any>(response);\n    } catch (error) {\n      throw new Error('Failed to parse JSON response');\n    }\n\n    if (schema) {\n      if (responseData && typeof responseData === 'object' && 'success' in responseData) {\n        const apiResponse = responseData as ApiResponse<any>;\n        if (apiResponse.success) {\n          return schema.parse(apiResponse.data);\n        } else {\n          const error = apiResponse.error;\n          throw new PaymentKitError(\n            error?.code || ErrorCode.INTERNAL_ERROR,\n            error?.message || 'Unknown error',\n            error?.httpStatus || response.status,\n            error?.details\n          );\n        }\n      }\n      return schema.parse(responseData);\n    }\n\n    if (responseData && typeof responseData === 'object' && 'success' in responseData) {\n      const apiResponse = responseData as ApiResponse<T>;\n      if (apiResponse.success) {\n        return apiResponse.data as T;\n      } else {\n        const error = apiResponse.error;\n        throw new PaymentKitError(\n          error?.code || ErrorCode.INTERNAL_ERROR,\n          error?.message || 'Unknown error',\n          error?.httpStatus || response.status,\n          error?.details\n        );\n      }\n    }\n\n    return responseData as T;\n  }\n\n  /**\n   * Create a handle containing both response and payment promises\n   */\n  private async createRequestHandle(\n    method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n    path: string,\n    init?: RequestInit\n  ): Promise<PaymentRequestHandle<Response>> {\n    const fullUrl = path.startsWith('http') ? path : new URL(path, this.options.baseUrl).toString();\n    const clientTxRef = this.extractOrGenerateClientTxRef(init?.headers);\n\n    // Record trace origin for debugging\n    try {\n      const err = new Error(`[origin] ${method} ${fullUrl}`);\n      const stack = err.stack ? err.stack.split('\\n').slice(1, 10).join('\\n') : 'no stack';\n      this.requestManager.recordTraceOrigin(clientTxRef, stack);\n    } catch {}\n\n    // Use scheduler to serialize payable requests\n    let requestContext!: PaymentRequestContext;\n    let paymentResolve!: (v: PaymentInfo | undefined) => void;\n    let paymentReject!: (e: any) => void;\n    const paymentPromise: Promise<PaymentInfo | undefined> = new Promise((res, rej) => {\n      paymentResolve = res;\n      paymentReject = rej;\n    });\n    let paymentBridgeAttached = false;\n\n    // Setup abort support\n    let scheduledHandle: { cancel: (reason?: any) => void; promise: Promise<Response> } | undefined;\n    let abort: (() => void) | undefined = () => {\n      // Defer to next tick to avoid surfacing abort synchronously at call-site\n      setTimeout(() => {\n        try {\n          // Pass undefined reason to minimize external reporting\n          scheduledHandle?.cancel(undefined);\n          if (!paymentBridgeAttached) {\n            try {\n              paymentResolve(undefined);\n            } catch {}\n          } else {\n            try {\n              void this.requestManager.resolveByRef(clientTxRef, undefined);\n            } catch {}\n          }\n        } catch {}\n      }, 0);\n    };\n\n    if (init?.signal instanceof AbortSignal) {\n      const onInitAbort = () => {\n        abort?.();\n      };\n      if (init.signal.aborted) {\n        onInitAbort();\n      } else {\n        init.signal.addEventListener('abort', onInitAbort, { once: true });\n      }\n    }\n\n    const responsePromise: Promise<Response> = (scheduledHandle = this.scheduler.enqueue(\n      async (release, signal) => {\n        // Check if client has been cleaned up or aborted\n        if (this.isCleanedUp || signal.aborted) {\n          throw new Error('Client has been cleaned up');\n        }\n\n        // Ensure prerequisites\n        if (signal.aborted) throw new Error('Request aborted');\n        await this.channelManager.ensureChannelReady();\n        if (signal.aborted) throw new Error('Request aborted');\n        await this.channelManager.discoverService();\n        if (signal.aborted) throw new Error('Request aborted');\n\n        // Try to recover pending SubRAV if needed\n        try {\n          await this.tryRecoverPendingIfNeeded();\n        } catch (e) {\n          this.log('[serialized.recover.error]', e);\n        }\n        if (signal.aborted) throw new Error('Request aborted');\n\n        // Prepare headers with payment data\n        const { headers, sentedSubRav } = await this.prepareHeaders(\n          fullUrl,\n          method,\n          clientTxRef,\n          init?.headers\n        );\n        if (signal.aborted) throw new Error('Request aborted');\n\n        // Build request context\n        requestContext = {\n          method,\n          url: fullUrl,\n          headers,\n          body: init?.body,\n          clientTxRef,\n        };\n\n        // Create payment promise\n        const channelId = this.paymentState.getChannelId();\n        const assetId = this.options.defaultAssetId || '0x3::gas_coin::RGas';\n\n        if (!channelId) {\n          throw new Error('Channel not initialized');\n        }\n\n        const pp = this.requestManager.createPaymentPromise(\n          clientTxRef,\n          requestContext,\n          sentedSubRav,\n          channelId,\n          assetId\n        );\n\n        // Attach release function\n        const pending = this.paymentState.getPendingPayment(clientTxRef);\n        if (pending) {\n          pending.release = () => {\n            try {\n              release();\n            } catch (e) {\n              this.log?.('[release.error]', e);\n            }\n            pending.release = undefined;\n          };\n        }\n\n        // Bridge internal promise to external one\n        paymentBridgeAttached = true;\n        void pp.then(paymentResolve).catch(paymentReject);\n\n        // Transaction logging\n        try {\n          await this.logTransaction(clientTxRef, requestContext, sentedSubRav);\n        } catch (e) {\n          this.log('[txlog.create.error]', e);\n        }\n        if (signal.aborted) throw new Error('Request aborted');\n\n        // Execute request with abort support; ensure fetchImpl receives AbortSignal\n        const fetchInit: RequestInit = { ...init, signal };\n        return this.executeRequest(requestContext, fetchInit);\n      }\n    )).promise;\n\n    // Prophylactic catch to prevent unhandled rejection before user attaches handlers\n    // This avoids unhandled rejection warnings/errors if abort happens immediately\n    responsePromise.catch(() => {});\n\n    // No external controller. Abort flows handled via handle.abort() and init.signal above\n\n    this.log(\n      '[request.start]',\n      method,\n      fullUrl,\n      'clientTxRef=',\n      clientTxRef,\n      'channelId=',\n      this.paymentState.getChannelId()\n    );\n\n    // Handle response errors\n    responsePromise.catch(err => {\n      this.log('[response.error]', err);\n      try {\n        const settled = this.requestManager.resolveByRef(clientTxRef, undefined);\n        if (!settled) {\n          // No pending in manager (likely pre-bridge) → resolve local promise to avoid hang\n          try {\n            paymentResolve(undefined);\n          } catch {}\n        }\n      } catch (settleErr) {\n        this.log('[response.error.settle]', settleErr);\n      }\n    });\n\n    const startTs = Date.now();\n    const done = responsePromise.then(async (data: Response) => {\n      let payment: PaymentInfo | undefined = undefined;\n      try {\n        payment = await paymentPromise;\n      } catch (e) {\n        this.log?.('[payment.error]', e);\n      }\n      return { data, payment };\n    });\n\n    // Avoid unhandled rejections if caller never awaits these\n    void paymentPromise.catch(() => {});\n    void done.catch(() => {});\n\n    // Update transaction on response\n    void responsePromise\n      .then(res => {\n        const durationMs = Date.now() - startTs;\n        this.transactionStore?.update(clientTxRef, {\n          statusCode: res.status,\n          durationMs,\n        });\n        return res;\n      })\n      .catch(err => this.log('[txlog.update.error]', err));\n\n    return {\n      clientTxRef,\n      response: responsePromise,\n      payment: paymentPromise,\n      done,\n      abort,\n    };\n  }\n\n  /**\n   * Cleanup client state on logout\n   */\n  async logoutCleanup(\n    options: { clearMapping: boolean; reason?: string } = { clearMapping: true }\n  ): Promise<void> {\n    const reason = options?.reason || 'Logout cleanup';\n\n    // Mark client as cleaned up\n    this.isCleanedUp = true;\n\n    // Try to commit pending SubRAV\n    try {\n      const pending = this.paymentState.getPendingSubRAV();\n      if (pending) {\n        const vmIdFragment = this.paymentState.getVmIdFragment();\n        if (vmIdFragment && vmIdFragment === pending.vmIdFragment) {\n          //TODO: Implement commit and commit api\n          //const signed = await this.payerClient.signSubRAV(pending);\n          //await this.channelManager.commitSubRAV(signed);\n          this.log('logoutCleanup: committed pending SubRAV on logout:', pending.nonce);\n        }\n      }\n    } catch (e) {\n      this.log('logoutCleanup: failed to commit pending SubRAV:', e);\n    }\n\n    // Clear scheduler and reject pending payments\n    this.scheduler.clear();\n    this.requestManager.rejectAll(new Error(reason));\n\n    // Reset state\n    this.paymentState.reset();\n\n    // Clear persisted mapping if requested\n    if (options?.clearMapping !== false) {\n      try {\n        const mappingStore = this.options.mappingStore || createDefaultMappingStore();\n        const namespacedStore = createNamespacedMappingStore(mappingStore, {\n          getPayerDid: async () => this.options.payerDid || (await this.options.signer.getDid()),\n        });\n        await namespacedStore.deleteState(this.host);\n      } catch (e) {\n        this.log('logoutCleanup: deleteState(mapping) failed:', e);\n      }\n    }\n\n    await this.persistClientState();\n  }\n\n  /**\n   * Compute unsettled amount for the current sub-channel\n   */\n  async getUnsettledAmountForSubChannel(): Promise<{\n    channelId: string;\n    vmIdFragment: string;\n    authorizedAccumulated: bigint;\n    lastClaimed: bigint;\n    unsettled: bigint;\n    unsettledUsd: bigint;\n    subChannelInfo: SubChannelInfo;\n    latestSubRavNonce?: bigint;\n  }> {\n    await this.channelManager.ensureChannelReady();\n\n    const channelInfo = this.paymentState.getChannelInfo();\n    const vmIdFragment = this.paymentState.getVmIdFragment();\n\n    if (!channelInfo || !vmIdFragment) {\n      throw new Error('Channel or vmIdFragment not initialized');\n    }\n\n    const assetId = channelInfo.assetId;\n    const channelId = channelInfo.channelId;\n\n    // Fetch on-chain sub-channel state\n    let subChannelInfo = this.paymentState.getSubChannelInfo();\n    if (!subChannelInfo) {\n      subChannelInfo = await this.payerClient.getSubChannelInfo(channelId, vmIdFragment);\n      this.paymentState.setSubChannelInfo(subChannelInfo);\n    }\n    const lastClaimed = subChannelInfo.lastClaimedAmount;\n\n    // Determine latest authorized accumulated value\n    let authorizedAccumulated: bigint | undefined = undefined;\n    let latestSubRavNonce: bigint | undefined = undefined;\n\n    const pending = this.paymentState.getPendingSubRAV();\n    if (pending && pending.channelId === channelId && pending.vmIdFragment === vmIdFragment) {\n      authorizedAccumulated = pending.accumulatedAmount;\n      latestSubRavNonce = pending.nonce;\n    }\n\n    if (authorizedAccumulated === undefined) {\n      authorizedAccumulated = lastClaimed;\n    }\n\n    const diff = authorizedAccumulated - lastClaimed;\n    const unsettled = diff > 0n ? diff : 0n;\n    const unsettledUsd = (await this.rateProvider.getPricePicoUSD(assetId)) * unsettled;\n\n    return {\n      channelId,\n      vmIdFragment,\n      authorizedAccumulated,\n      lastClaimed,\n      unsettled,\n      unsettledUsd,\n      subChannelInfo,\n      latestSubRavNonce,\n    };\n  }\n\n  // -------- Private Methods --------\n\n  /**\n   * Extract clientTxRef from headers or generate new one\n   */\n  private extractOrGenerateClientTxRef(providedHeaders?: HeadersInit): string {\n    if (providedHeaders) {\n      let clientTxRef: string | undefined;\n\n      if (providedHeaders instanceof Headers) {\n        clientTxRef = providedHeaders.get('X-Client-Tx-Ref') || undefined;\n      } else if (Array.isArray(providedHeaders)) {\n        const found = providedHeaders.find(([key]) => key.toLowerCase() === 'x-client-tx-ref');\n        clientTxRef = found?.[1];\n      } else if (typeof providedHeaders === 'object') {\n        clientTxRef =\n          (providedHeaders as Record<string, string>)['X-Client-Tx-Ref'] ||\n          (providedHeaders as Record<string, string>)['x-client-tx-ref'];\n      }\n\n      if (clientTxRef) {\n        return clientTxRef;\n      }\n    }\n\n    return crypto.randomUUID();\n  }\n\n  /**\n   * Try to recover pending SubRAV if needed\n   */\n  private async tryRecoverPendingIfNeeded(): Promise<void> {\n    // No-op: auto recovery disabled in favor of 402 auto-retry\n    return;\n  }\n\n  /**\n   * Prepare headers for the request\n   */\n  private async prepareHeaders(\n    fullUrl: string,\n    method: string,\n    clientTxRef: string,\n    providedHeaders?: HeadersInit\n  ): Promise<{ headers: Record<string, string>; sentedSubRav: SignedSubRAV | undefined }> {\n    const headers: Record<string, string> = {};\n\n    // Copy provided headers\n    if (providedHeaders) {\n      if (providedHeaders instanceof Headers) {\n        providedHeaders.forEach((value, key) => {\n          headers[key] = value;\n        });\n      } else if (Array.isArray(providedHeaders)) {\n        providedHeaders.forEach(([key, value]) => {\n          headers[key] = value;\n        });\n      } else {\n        Object.assign(headers, providedHeaders);\n      }\n    }\n\n    // Add DID authorization header\n    try {\n      const payerDid = this.options.payerDid || (await this.options.signer.getDid());\n      const authHeader = await DidAuthHelper.generateAuthHeader(\n        payerDid,\n        this.options.signer,\n        fullUrl,\n        method,\n        this.options.keyId\n      );\n      if (authHeader) {\n        headers['Authorization'] = authHeader;\n      }\n    } catch (error) {\n      this.log('Failed to generate DID auth header:', error);\n    }\n\n    // Add payment channel header\n    const sentedSubRav = await this.addPaymentChannelHeader(headers, clientTxRef);\n\n    this.log(\n      '[request.headers]',\n      method,\n      fullUrl,\n      'clientTxRef=',\n      clientTxRef,\n      'channelId=',\n      this.paymentState.getChannelId(),\n      'signedSubRav=',\n      !!sentedSubRav\n    );\n\n    return { headers, sentedSubRav };\n  }\n\n  /**\n   * Add payment channel data to headers\n   */\n  private async addPaymentChannelHeader(\n    headers: Record<string, string>,\n    clientTxRef: string\n  ): Promise<SignedSubRAV | undefined> {\n    if (!this.paymentState.getChannelId()) {\n      throw new Error('Channel not initialized');\n    }\n\n    try {\n      const signedSubRAV = await this.buildSignedSubRavIfNeeded();\n      const headerValue = this.paymentProtocol.encodeRequestHeader(\n        signedSubRAV,\n        clientTxRef,\n        this.options.maxAmount\n      );\n      headers[this.paymentProtocol.getHeaderName()] = headerValue;\n\n      if (signedSubRAV) {\n        this.log('Added payment header with SignedSubRAV');\n      } else {\n        this.log('Added payment header in FREE mode (clientTxRef only)');\n      }\n\n      return signedSubRAV;\n    } catch (error) {\n      this.log('Failed to add payment channel header:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Build and sign SubRAV if pending exists\n   */\n  private async buildSignedSubRavIfNeeded(): Promise<SignedSubRAV | undefined> {\n    const pending = this.paymentState.getPendingSubRAV();\n    if (!pending) {\n      this.log('No pending SubRAV - operating in FREE mode');\n      return undefined;\n    }\n\n    // Clear pending SubRAV\n    this.paymentState.clearPendingSubRAV();\n\n    const signed = await this.payerClient.signSubRAV(pending);\n    this.log('Signed pending SubRAV:', pending.nonce, pending.accumulatedAmount);\n\n    // Update highest observed nonce\n    this.paymentState.updateHighestNonce(pending.nonce);\n\n    return signed;\n  }\n\n  /**\n   * Execute the HTTP request\n   */\n  private async executeRequest(\n    context: PaymentRequestContext,\n    init?: RequestInit,\n    allowRetry: boolean = true\n  ): Promise<Response> {\n    try {\n      const { headers: _, ...initWithoutHeaders } = init || {};\n\n      const response = await this.fetchImpl(context.url, {\n        method: context.method,\n        headers: context.headers,\n        body: context.body,\n        ...initWithoutHeaders,\n      });\n\n      return await this.processResponse(response, context, initWithoutHeaders, allowRetry);\n    } catch (error) {\n      this.log('Request failed:', error);\n      throw error;\n    }\n  }\n\n  private async processResponse(\n    response: Response,\n    context: PaymentRequestContext,\n    initWithoutHeaders: Omit<RequestInit, 'headers'>,\n    allowRetry: boolean\n  ): Promise<Response> {\n    // Auto-retry for PAYMENT_REQUIRED (402) with unsignedSubRAV in header\n    const headerName = this.paymentProtocol.getHeaderName();\n    let paymentHeader =\n      response.headers.get(headerName) || response.headers.get(headerName.toLowerCase());\n    if (allowRetry && paymentHeader && typeof paymentHeader === 'string') {\n      try {\n        const payload = this.paymentProtocol.parseResponseHeader(paymentHeader);\n        if (payload?.error?.code === 'PAYMENT_REQUIRED' && payload.subRav && context.clientTxRef) {\n          const signed = await this.payerClient.signSubRAV(payload.subRav);\n          const newHeader = this.paymentProtocol.encodeRequestHeader(\n            signed,\n            context.clientTxRef,\n            this.options.maxAmount\n          );\n          context.headers[headerName] = newHeader;\n          // Refresh DIDAuth Authorization header to avoid nonce replay\n          try {\n            const payerDid = this.options.payerDid || (await this.options.signer.getDid());\n            const authHeader = await DidAuthHelper.generateAuthHeader(\n              payerDid,\n              this.options.signer,\n              context.url,\n              context.method,\n              this.options.keyId\n            );\n            if (authHeader) {\n              context.headers['Authorization'] = authHeader;\n            }\n          } catch {}\n\n          const retried = await this.fetchImpl(context.url, {\n            method: context.method,\n            headers: context.headers,\n            body: context.body,\n            ...initWithoutHeaders,\n          });\n          // Recurse once with allowRetry=false to avoid infinite loops\n          return await this.processResponse(retried, context, initWithoutHeaders, false);\n        }\n      } catch (error) {\n        this.log('[payment.required.retry.failed]', {\n          url: context.url,\n          method: context.method,\n          clientTxRef: context.clientTxRef,\n          error,\n        });\n      }\n    }\n\n    // Handle response\n    await this.handleResponse(response, context);\n\n    // Handle streaming responses\n    return await this.wrapStreamingIfNeeded(response, context);\n  }\n\n  private async wrapStreamingIfNeeded(\n    response: Response,\n    context: PaymentRequestContext\n  ): Promise<Response> {\n    if (\n      isStreamLikeResponse(response) &&\n      response.body &&\n      typeof (response.body as any).getReader === 'function'\n    ) {\n      const onActivity = () => {\n        if (context.clientTxRef && typeof this.options.timeoutMsStream === 'number') {\n          this.requestManager.extendTimeout(context.clientTxRef, this.options.timeoutMsStream);\n        }\n      };\n\n      const filtered = wrapAndFilterInBandFrames(\n        response,\n        async p => {\n          try {\n            const decoded = this.paymentProtocol.parseResponseHeader((p as any).headerValue);\n            this.log('[inband.decode payment response]', decoded);\n            if (decoded?.subRav && decoded.cost !== undefined) {\n              await this.handleProtocolSuccess({\n                type: 'success',\n                clientTxRef: decoded.clientTxRef,\n                subRav: decoded.subRav,\n                cost: decoded.cost as bigint,\n                costUsd: decoded.costUsd as bigint | undefined,\n                serviceTxRef: decoded.serviceTxRef,\n              });\n            } else if ((decoded as any)?.error) {\n              // Streamed protocol-level error\n              await this.handleProtocolError({\n                type: 'error',\n                clientTxRef: (decoded as any).clientTxRef,\n                err: new PaymentKitError(\n                  (decoded as any).error.code,\n                  (decoded as any).error.message || 'Payment error (stream)'\n                ),\n              });\n            }\n          } catch (e) {\n            this.log('[inband.decode.error]', e);\n          }\n        },\n        (...args: any[]) => this.log(...args),\n        onActivity,\n        ({ sawPayment }) => {\n          try {\n            if (!sawPayment && context.clientTxRef) {\n              // Only resolve THIS request as free, do not affect parallel requests\n              this.requestManager.resolveByRef(context.clientTxRef, undefined);\n              if (this.options.transactionLog?.enabled !== false && this.transactionStore) {\n                void this.transactionStore.update(context.clientTxRef, { status: 'free' });\n              }\n            }\n          } catch (e) {\n            this.log('[onFinish.error]', e);\n          }\n        }\n      );\n\n      // Mark as streaming\n      if (this.transactionStore && context.clientTxRef) {\n        await this.transactionStore.update(context.clientTxRef, { stream: true });\n      }\n\n      // Set initial timeout for streaming\n      if (context.clientTxRef && typeof this.options.timeoutMsStream === 'number') {\n        this.requestManager.extendTimeout(context.clientTxRef, this.options.timeoutMsStream);\n      }\n\n      // Don't wrap for scheduler release - let payment promise control it\n      // This allows server time to process reactive claims before next request\n      return filtered;\n    }\n\n    return response;\n  }\n\n  /**\n   * Handle the HTTP response\n   */\n  private async handleResponse(response: Response, context?: PaymentRequestContext): Promise<void> {\n    const protocol = this.paymentProtocol.parseProtocolFromResponse(response, context);\n\n    if (protocol.type !== 'none') {\n      this.log(\n        '[response.header]',\n        'type=',\n        protocol.type,\n        'clientTxRef=',\n        (protocol as any).clientTxRef,\n        'status=',\n        response.status\n      );\n    } else {\n      this.log(\n        '[response.no-header]',\n        'status=',\n        response.status,\n        'pendingKeys=',\n        this.requestManager.getPendingKeys()\n      );\n    }\n\n    if (protocol.type === 'error') {\n      this.logTraceOrigin(protocol.clientTxRef);\n      await this.handleProtocolError(protocol);\n      // Record protocol error for this response; do not throw here to avoid double-throw.\n      this.protocolErrorByResponse.set(response, protocol.err);\n      return;\n    }\n\n    if (protocol.type === 'success') {\n      await this.handleProtocolSuccess(protocol);\n      return;\n    }\n\n    // No protocol header present\n    await this.handleNoProtocolHeader(response, context);\n  }\n\n  private async handleProtocolError(proto: {\n    type: 'error';\n    clientTxRef?: string;\n    err: PaymentKitError;\n  }): Promise<void> {\n    if (proto.clientTxRef && this.requestManager.resolveByRef(proto.clientTxRef, undefined)) {\n      this.paymentState.clearPendingSubRAV();\n      await this.persistClientState();\n      return;\n    }\n\n    // Handle cases with only one pending payment\n    const pendingPayments = this.paymentState.getAllPendingPayments();\n    if (pendingPayments.size === 1) {\n      const [[onlyKey]] = pendingPayments.entries();\n      this.requestManager.resolveByRef(onlyKey, undefined);\n      this.paymentState.clearPendingSubRAV();\n      await this.persistClientState();\n      return;\n    }\n\n    // Handle multiple pending payments\n    if (pendingPayments.size > 1) {\n      for (const [key] of pendingPayments.entries()) {\n        this.requestManager.resolveByRef(key, undefined);\n      }\n      this.paymentState.clearPendingSubRAV();\n      await this.persistClientState();\n    }\n  }\n\n  private async handleProtocolSuccess(proto: {\n    type: 'success';\n    clientTxRef?: string;\n    subRav: SubRAV;\n    cost: bigint;\n    costUsd?: bigint;\n    serviceTxRef?: string;\n  }): Promise<void> {\n    // Find matching pending payment\n    let pendingKey: string | undefined;\n    let pendingRequest = this.findMatchingPendingPayment(proto);\n\n    if (!pendingRequest) {\n      // No matching pending - cache for future use\n      if (proto.clientTxRef && this.paymentState.isRecentlyRejected(proto.clientTxRef)) {\n        this.log('[payment.late-success.ignored]', proto.clientTxRef);\n        return;\n      }\n      this.paymentState.setPendingSubRAV(proto.subRav);\n      await this.persistClientState();\n      return;\n    }\n\n    pendingKey = pendingRequest.key;\n\n    // Validate SubRAV progression\n    const prev = pendingRequest.pending.sentSubRav?.subRav;\n    if (prev) {\n      try {\n        assertSubRavProgression(prev, proto.subRav, true);\n      } catch (e) {\n        this.requestManager.rejectByRef(\n          pendingKey,\n          new Error(\n            'Invalid SubRAV progression: ' +\n              (e as Error).message +\n              ', response: ' +\n              serializeJson({ subRav: proto.subRav, cost: proto.cost, costUsd: proto.costUsd }) +\n              ' prev: ' +\n              serializeJson(prev)\n          )\n        );\n        return;\n      }\n    }\n\n    // Cache next proposal for future request\n    this.paymentState.setPendingSubRAV(proto.subRav);\n    await this.persistClientState();\n\n    // Resolve payment\n    const paymentInfo: PaymentInfo = {\n      clientTxRef: proto.clientTxRef || pendingKey,\n      serviceTxRef: proto.serviceTxRef,\n      cost: proto.cost,\n      costUsd: proto.costUsd ?? BigInt(0),\n      nonce: proto.subRav.nonce,\n      channelId: pendingRequest.pending.channelId,\n      vmIdFragment: proto.subRav.vmIdFragment,\n      assetId: pendingRequest.pending.assetId,\n      timestamp: new Date().toISOString(),\n    };\n\n    this.requestManager.resolveByRef(pendingKey, paymentInfo);\n\n    // Update transaction log\n    try {\n      if (this.options.transactionLog?.enabled !== false && this.transactionStore) {\n        await this.transactionStore.update(paymentInfo.clientTxRef, {\n          payment: {\n            cost: paymentInfo.cost,\n            costUsd: paymentInfo.costUsd,\n            nonce: paymentInfo.nonce,\n            serviceTxRef: paymentInfo.serviceTxRef,\n          },\n          vmIdFragment: paymentInfo.vmIdFragment,\n          status: 'paid',\n        });\n      }\n    } catch (e) {\n      this.log('[txlog.finalize.error]', e);\n    }\n\n    this.log(\n      'Resolved payment for clientTxRef:',\n      paymentInfo.clientTxRef,\n      'cost:',\n      paymentInfo.cost.toString()\n    );\n\n    // Update highest observed nonce\n    this.paymentState.updateHighestNonce(paymentInfo.nonce);\n  }\n\n  private async handleNoProtocolHeader(\n    response: Response,\n    context?: PaymentRequestContext\n  ): Promise<void> {\n    // Streaming responses are handled in wrapper layer\n    if (isStreamLikeResponse(response)) {\n      return;\n    }\n\n    // Non-streaming: treat as free endpoint\n    this.requestManager.resolveAllAsFree();\n\n    // Update transaction store for this specific request as free\n    try {\n      if (\n        this.options.transactionLog?.enabled !== false &&\n        this.transactionStore &&\n        context?.clientTxRef\n      ) {\n        await this.transactionStore.update(context.clientTxRef, { status: 'free' });\n      }\n    } catch (e) {\n      this.log('[txlog.free.update.error]', e);\n    }\n\n    // Handle specific status codes\n    const error = this.paymentProtocol.handleStatusCode(response.status);\n    if (error) {\n      if (response.status === 402 || response.status === 409) {\n        this.paymentState.clearPendingSubRAV();\n        await this.persistClientState();\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Find matching pending payment for a protocol success response\n   */\n  private findMatchingPendingPayment(proto: {\n    clientTxRef?: string;\n    subRav: SubRAV;\n  }): { key: string; pending: any } | undefined {\n    const pendingPayments = this.paymentState.getAllPendingPayments();\n\n    // Try exact match first\n    if (proto.clientTxRef && pendingPayments.has(proto.clientTxRef)) {\n      return {\n        key: proto.clientTxRef,\n        pending: pendingPayments.get(proto.clientTxRef)!,\n      };\n    }\n\n    // Single pending payment\n    if (pendingPayments.size === 1) {\n      const [[key, pending]] = pendingPayments.entries();\n      return { key, pending };\n    }\n\n    // Try to match by SubRAV progression\n    if (pendingPayments.size > 1) {\n      for (const [k, p] of pendingPayments.entries()) {\n        const prevSent = p.sentSubRav?.subRav;\n        if (!prevSent) continue;\n\n        try {\n          assertSubRavProgression(prevSent, proto.subRav, true);\n          return { key: k, pending: p };\n        } catch {\n          // Not a match\n        }\n      }\n    }\n\n    // Fallback to most recent\n    if (pendingPayments.size >= 1) {\n      const all = Array.from(pendingPayments.entries());\n      const [key, pending] = all[all.length - 1];\n      return { key, pending };\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Log transaction details\n   */\n  private async logTransaction(\n    clientTxRef: string,\n    context: PaymentRequestContext,\n    sentedSubRav: SignedSubRAV | undefined\n  ): Promise<void> {\n    if (this.options.transactionLog?.enabled === false || !this.transactionStore) {\n      return;\n    }\n\n    const urlObj = new URL(context.url);\n    const sanitize = this.options.transactionLog?.sanitizeRequest;\n    const sanitized = sanitize ? sanitize(context.headers, context.body) : undefined;\n\n    const headersSummary = sanitized?.headersSummary ?? {\n      'content-type': context.headers['Content-Type'] || context.headers['content-type'] || '',\n    };\n\n    await this.transactionStore.create({\n      clientTxRef,\n      timestamp: Date.now(),\n      protocol: 'http',\n      method: context.method as 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n      urlOrTarget: context.url,\n      operation: `${context.method}:${urlObj.pathname}`,\n      headersSummary,\n      requestBodyHash: sanitized?.requestBodyHash,\n      stream: false,\n      channelId: this.paymentState.getChannelId(),\n      vmIdFragment: sentedSubRav?.subRav?.vmIdFragment,\n      assetId: this.options.defaultAssetId || '0x3::gas_coin::RGas',\n      status: 'pending',\n    });\n  }\n\n  /**\n   * Log trace origin for debugging\n   */\n  private logTraceOrigin(clientTxRef?: string): void {\n    try {\n      if (clientTxRef) {\n        const origin = this.requestManager.getTraceOrigin(clientTxRef);\n        if (origin) {\n          this.log('[trace.origin]', clientTxRef, '\\n', origin);\n        }\n        this.requestManager.clearTraceOrigin(clientTxRef);\n      } else {\n        const snapshots = this.requestManager.getTraceSnapshots(5);\n        if (snapshots.length > 0) {\n          this.log('[trace.origin.scan]', JSON.stringify(snapshots));\n        }\n      }\n    } catch {}\n  }\n\n  /**\n   * Persist client state\n   */\n  private async persistClientState(): Promise<void> {\n    try {\n      const mappingStore = this.options.mappingStore || createDefaultMappingStore();\n      const namespacedStore = createNamespacedMappingStore(mappingStore, {\n        getPayerDid: async () => this.options.payerDid || (await this.options.signer.getDid()),\n      });\n\n      const state = this.paymentState.getPersistedState();\n      await namespacedStore.setState(this.host, state);\n\n      this.log('Persisted client state');\n    } catch (error) {\n      this.log('Failed to persist client state:', error);\n    }\n  }\n}\n","import { DIDAuth, SignerInterface } from '@nuwa-ai/identity-kit';\n\n/**\n * Helper for generating DIDAuthV1 authorization headers\n */\nexport class DidAuthHelper {\n  /**\n   * Generate DIDAuthV1 authorization header for HTTP request\n   * @param payerDid - The payer's DID\n   * @param keyManager - Signer for creating the signature\n   * @param requestUrl - The target URL for the request\n   * @param method - HTTP method (optional, defaults to 'POST')\n   * @param keyId - Optional specific key ID to use (if not provided, uses first available)\n   * @returns Authorization header value or undefined if generation fails\n   */\n  static async generateAuthHeader(\n    payerDid: string,\n    keyManager: SignerInterface,\n    requestUrl: string,\n    method: string = 'POST',\n    keyId?: string\n  ): Promise<string | undefined> {\n    try {\n      let selectedKeyId = keyId;\n\n      if (!selectedKeyId) {\n        // Get available key IDs\n        const keyIds = await keyManager.listKeyIds();\n        if (keyIds.length === 0) {\n          throw new Error('No key IDs available for signing');\n        }\n        selectedKeyId = keyIds[0]; // Use first available key\n      }\n\n      // Create a signed object with proper payload structure\n      const signedObject = await DIDAuth.v1.createSignature(\n        {\n          operation: 'http_request',\n          params: {\n            uri: requestUrl,\n            method: method.toUpperCase(),\n          },\n        },\n        keyManager,\n        selectedKeyId\n      );\n\n      // Convert to authorization header\n      const authHeader = DIDAuth.v1.toAuthorizationHeader(signedObject);\n      return authHeader;\n    } catch (error) {\n      return undefined;\n    }\n  }\n\n  /**\n   * Generate DIDAuthV1 authorization header with specific key ID\n   * @param keyManager - Signer for creating the signature\n   * @param keyId - Specific key ID to use\n   * @param requestUrl - The target URL for the request\n   * @param method - HTTP method (optional, defaults to 'POST')\n   * @returns Authorization header value\n   */\n  static async generateAuthHeaderWithKeyId(\n    keyManager: SignerInterface,\n    keyId: string,\n    requestUrl: string,\n    method: string = 'POST'\n  ): Promise<string> {\n    // Create a signed object with proper payload structure\n    const signedObject = await DIDAuth.v1.createSignature(\n      {\n        operation: 'http_request',\n        params: {\n          uri: requestUrl,\n          method: method.toUpperCase(),\n        },\n      },\n      keyManager,\n      keyId\n    );\n\n    // Convert to authorization header\n    return DIDAuth.v1.toAuthorizationHeader(signedObject);\n  }\n}\n","import type { HostChannelMappingStore, PersistedHttpClientState } from '../types';\nimport { PersistedHttpClientStateSchema } from '../../../schema/core';\nimport { serializeJson, parseJson } from '../../../utils/json';\nimport {\n  ChannelRepository,\n  IndexedDBChannelRepository,\n  MemoryChannelRepository,\n  MemoryTransactionStore,\n  TransactionStore,\n  IndexedDBTransactionStore,\n} from '../../../storage';\n\n/**\n * Memory-based implementation of HostChannelMappingStore\n * Suitable for short-lived processes or testing\n */\nexport class MemoryHostChannelMappingStore implements HostChannelMappingStore {\n  private stateStore = new Map<string, PersistedHttpClientState>();\n\n  // New methods for full state management\n  async getState(host: string): Promise<PersistedHttpClientState | undefined> {\n    return this.stateStore.get(host);\n  }\n\n  async setState(host: string, state: PersistedHttpClientState): Promise<void> {\n    // Validate with Zod schema to ensure data integrity\n    const validatedState = PersistedHttpClientStateSchema.parse(state);\n\n    this.stateStore.set(host, validatedState);\n  }\n\n  async deleteState(host: string): Promise<void> {\n    this.stateStore.delete(host);\n  }\n\n  /**\n   * Clear all stored mappings and states\n   */\n  clear(): void {\n    this.stateStore.clear();\n  }\n}\n\n/**\n * LocalStorage-based implementation for browsers\n * Provides persistence across browser sessions\n */\nexport class LocalStorageHostChannelMappingStore implements HostChannelMappingStore {\n  private static readonly STATE_PREFIX = 'nuwa-payment-client-state:';\n\n  // New methods for full state management\n  async getState(host: string): Promise<PersistedHttpClientState | undefined> {\n    if (typeof localStorage === 'undefined') {\n      throw new Error('localStorage is not available');\n    }\n\n    const key = LocalStorageHostChannelMappingStore.STATE_PREFIX + host;\n    const value = localStorage.getItem(key);\n\n    if (!value) {\n      return undefined;\n    }\n\n    try {\n      // Parse JSON with lossless-json first\n      const parsedData = parseJson(value) as any;\n\n      // Backward compatibility: pendingSubRAV used to be stored as SubRAV (bigint/number fields)\n      // Convert legacy structure to SerializableSubRAV (string fields) before validation\n      if (parsedData && typeof parsedData === 'object' && parsedData.pendingSubRAV) {\n        const p = parsedData.pendingSubRAV as any;\n        const looksLegacy = typeof p.version === 'number' || typeof p.chainId !== 'string';\n        if (looksLegacy) {\n          parsedData.pendingSubRAV = {\n            version: String(p.version),\n            chainId: String(p.chainId),\n            channelId: String(p.channelId),\n            channelEpoch: String(p.channelEpoch),\n            vmIdFragment: String(p.vmIdFragment),\n            accumulatedAmount: String(p.accumulatedAmount),\n            nonce: String(p.nonce),\n          };\n        }\n      }\n\n      // Then validate and transform with Zod (ensures structure is correct)\n      return PersistedHttpClientStateSchema.parse(parsedData);\n    } catch (error) {\n      return undefined;\n    }\n  }\n\n  async setState(host: string, state: PersistedHttpClientState): Promise<void> {\n    if (typeof localStorage === 'undefined') {\n      throw new Error('localStorage is not available');\n    }\n\n    const stateKey = LocalStorageHostChannelMappingStore.STATE_PREFIX + host;\n    const stateWithTimestamp = {\n      ...state,\n      lastUpdated: new Date().toISOString(),\n    };\n\n    // Validate and transform with Zod (ensures proper structure)\n    const validatedState = PersistedHttpClientStateSchema.parse(stateWithTimestamp);\n\n    // Use lossless-json for proper BigInt serialization\n    const serializedState = serializeJson(validatedState);\n\n    localStorage.setItem(stateKey, serializedState);\n\n    // channelId is part of state; no separate legacy mapping kept\n  }\n\n  async deleteState(host: string): Promise<void> {\n    if (typeof localStorage === 'undefined') {\n      throw new Error('localStorage is not available');\n    }\n\n    const stateKey = LocalStorageHostChannelMappingStore.STATE_PREFIX + host;\n    localStorage.removeItem(stateKey);\n  }\n\n  /**\n   * Clear all stored mappings and states\n   */\n  async clear(): Promise<void> {\n    if (typeof localStorage === 'undefined') {\n      throw new Error('localStorage is not available');\n    }\n\n    const keysToRemove: string[] = [];\n    for (let i = 0; i < localStorage.length; i++) {\n      const key = localStorage.key(i);\n      if (key && key.startsWith(LocalStorageHostChannelMappingStore.STATE_PREFIX)) {\n        keysToRemove.push(key);\n      }\n    }\n\n    keysToRemove.forEach(key => localStorage.removeItem(key));\n  }\n}\n\n/**\n * Auto-detect environment and create appropriate mapping store\n */\nexport function createDefaultMappingStore(): HostChannelMappingStore {\n  // Check if we're in a browser environment with localStorage\n  if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n    return new LocalStorageHostChannelMappingStore();\n  }\n\n  // Fall back to memory store for Node.js or environments without localStorage\n  return new MemoryHostChannelMappingStore();\n}\n\nexport function createDefaultChannelRepo(): ChannelRepository {\n  if (typeof window !== 'undefined' && typeof indexedDB !== 'undefined') {\n    return new IndexedDBChannelRepository();\n  }\n  return new MemoryChannelRepository();\n}\n\nexport function createDefaultTransactionStore(): TransactionStore {\n  if (typeof window !== 'undefined' && typeof indexedDB !== 'undefined') {\n    return new IndexedDBTransactionStore();\n  }\n  return new MemoryTransactionStore();\n}\n\n/**\n * Extract host from URL string\n */\nexport function extractHost(url: string): string {\n  try {\n    const urlObj = new URL(url);\n    return urlObj.host; // includes port if present\n  } catch (error) {\n    throw new Error(`Invalid URL: ${url}`);\n  }\n}\n\n// ==================== Namespaced Host Mapping Store ====================\n\nexport interface NamespaceProviders {\n  /** Resolve payer DID (async) */\n  getPayerDid: () => Promise<string>;\n}\n\n/**\n * A wrapper around HostChannelMappingStore adding DID/network namespacing to keys.\n * Composite key format: `${host}::${payerDid}`\n */\nexport class NamespacedHostChannelMappingStore implements HostChannelMappingStore {\n  constructor(\n    private readonly base: HostChannelMappingStore,\n    private readonly providers: NamespaceProviders\n  ) {}\n\n  private async buildKey(host: string): Promise<string> {\n    const payerDid = await this.providers.getPayerDid();\n    const ns = [host, payerDid].join('::');\n    return ns;\n  }\n\n  async getState(host: string): Promise<PersistedHttpClientState | undefined> {\n    const key = await this.buildKey(host);\n    return this.base.getState(key);\n  }\n\n  async setState(host: string, state: PersistedHttpClientState): Promise<void> {\n    const key = await this.buildKey(host);\n    return this.base.setState(key, state);\n  }\n\n  async deleteState(host: string): Promise<void> {\n    const key = await this.buildKey(host);\n    return this.base.deleteState(key);\n  }\n}\n\nexport function createNamespacedMappingStore(\n  base: HostChannelMappingStore,\n  providers: NamespaceProviders\n): HostChannelMappingStore {\n  return new NamespacedHostChannelMappingStore(base, providers);\n}\n","// Lightweight helper to wrap a streaming Response, parse in-band payment frames,\n// and filter them out so the application only sees business data.\n// Supports SSE (text/event-stream) and NDJSON (application/x-ndjson).\n\nexport interface InBandPaymentPayload {\n  // unified payload now carries only encoded header value\n  headerValue: string;\n}\n\n// The default value of queueHWM\nconst DEFAULT_QUEUE_HWM: number = 16;\n\nexport function wrapAndFilterInBandFrames(\n  response: Response,\n  onPayment: (payload: InBandPaymentPayload) => void | Promise<void>,\n  log: (...args: any[]) => void,\n  onActivity?: () => void,\n  onFinish?: (opts: { sawPayment: boolean }) => void,\n  options?: { backgroundDrain?: boolean; queueHWM?: number }\n): Response {\n  const originalBody = response.body as ReadableStream<Uint8Array> | null;\n  if (!originalBody || typeof (originalBody as any).getReader !== 'function') {\n    return response;\n  }\n\n  const reader = (originalBody as any).getReader();\n  const textDecoder = new TextDecoder();\n  const textEncoder = new TextEncoder();\n\n  const ct = (response.headers.get('content-type') || '').toLowerCase();\n  const isSSE = ct.includes('text/event-stream');\n  const isNDJSON = ct.includes('application/x-ndjson');\n\n  let sawPayment = false;\n\n  // After payment frame is handled, mark payment as seen but let the stream continue\n  const afterPayment = (controller: ReadableStreamDefaultController<Uint8Array>) => {\n    try {\n      sawPayment = true;\n      // Don't close the controller here - let the original readable stream from the Response manage the stream lifecycle\n      // The stream should continue processing business data after payment\n      log('[afterPayment] Payment processed, continuing stream');\n    } catch (e) {\n      log('[afterPayment.error]', e);\n    }\n  };\n\n  const isBg = options?.backgroundDrain !== false; // default true\n\n  const shouldEmit = (controller: ReadableStreamDefaultController<Uint8Array>): boolean => {\n    if (isBg) {\n      const ds = (controller as any).desiredSize as number | undefined;\n      if (typeof ds === 'number' && ds <= 0) return false;\n    }\n    return true;\n  };\n\n  const parser: InBandParser = isSSE\n    ? new SseInbandParser(textEncoder, onPayment, log, afterPayment, onActivity, shouldEmit)\n    : new NdjsonInbandParser(textEncoder, onPayment, log, afterPayment, onActivity, shouldEmit);\n\n  const makeBackgroundLoop = (controller: ReadableStreamDefaultController<Uint8Array>) => {\n    (async () => {\n      try {\n        while (true) {\n          const { value, done } = await reader.read();\n          if (done) break;\n          if (!value) continue;\n          try {\n            onActivity?.();\n          } catch (e) {\n            log('[bg.onActivity.error]', e as any);\n          }\n          const chunkText = textDecoder.decode(value, { stream: true });\n          await parser.process(chunkText, controller);\n        }\n        await parser.flush(controller);\n        // Close the filtered stream when the original stream ends naturally\n        controller.close();\n        try {\n          onFinish?.({ sawPayment });\n        } catch (e) {\n          log('[finish.error]', e as any);\n        }\n      } catch (e) {\n        try {\n          reader.cancel();\n        } catch {}\n        controller.error(e as any);\n      }\n    })();\n  };\n\n  const filtered = isBg\n    ? new ReadableStream<Uint8Array>(\n        {\n          start(controller) {\n            makeBackgroundLoop(controller);\n          },\n          cancel() {\n            try {\n              reader.cancel();\n            } catch (e) {\n              log('[cancel.error]', e);\n            }\n          },\n        },\n        { highWaterMark: options?.queueHWM ?? DEFAULT_QUEUE_HWM }\n      )\n    : new ReadableStream<Uint8Array>({\n        async pull(controller) {\n          try {\n            const { value, done } = await reader.read();\n            if (done) {\n              await parser.flush(controller);\n              // Close the filtered stream when the original stream ends naturally\n              controller.close();\n              try {\n                onFinish?.({ sawPayment });\n              } catch (e) {\n                log('[finish.error]', e as any);\n              }\n              return;\n            }\n            if (!value) return;\n            try {\n              onActivity?.();\n            } catch (e) {\n              log('[pull.onActivity.error]', e);\n            }\n            const chunkText = textDecoder.decode(value, { stream: true });\n            await parser.process(chunkText, controller);\n          } catch (e) {\n            try {\n              reader.cancel();\n            } catch (e) {\n              log('[pull.error]', e);\n            }\n            controller.error(e);\n          }\n        },\n        cancel() {\n          try {\n            reader.cancel();\n          } catch (e) {\n            log('[cancel.error]', e);\n          }\n        },\n      });\n\n  const headers = new Headers(response.headers);\n  headers.delete('content-length');\n  // Normalize content-type to guide downstream parsers\n  try {\n    if (isSSE) headers.set('content-type', 'text/event-stream; charset=utf-8');\n    else if (isNDJSON) headers.set('content-type', 'application/x-ndjson');\n  } catch {}\n  const filteredResponse = new Response(filtered as any, {\n    status: response.status,\n    statusText: response.statusText,\n    headers,\n  });\n  return filteredResponse;\n}\n\n// ---------------------------------------------------------------------------\n// Parsers\n// ---------------------------------------------------------------------------\n\ninterface InBandParser {\n  process(\n    textChunk: string,\n    controller: ReadableStreamDefaultController<Uint8Array>\n  ): Promise<void>;\n  flush(controller: ReadableStreamDefaultController<Uint8Array>): Promise<void>;\n}\n\nclass SseInbandParser implements InBandParser {\n  private buffer = '';\n  private pendingEvent: string[] = [];\n  constructor(\n    private encoder: TextEncoder,\n    private onPayment: (payload: InBandPaymentPayload) => void | Promise<void>,\n    private log: (...args: any[]) => void,\n    private onAfterPayment: (controller: ReadableStreamDefaultController<Uint8Array>) => void,\n    private onTick?: () => void,\n    private shouldEmit?: (c: ReadableStreamDefaultController<Uint8Array>) => boolean\n  ) {}\n\n  private extractPaymentHeaderFromEventLines(lines: string[]): string | null {\n    for (const l of lines) {\n      const m = l.match(/^data:\\s*(.+)$/);\n      if (!m) continue;\n      try {\n        const o = JSON.parse(m[1]);\n        const header = o?.nuwa_payment_header || o?.__nuwa_payment_header__;\n        if (typeof header === 'string') {\n          this.log('[extractPaymentHeaderFromEventLines]', header);\n          return header;\n        }\n      } catch {}\n    }\n    return null;\n  }\n\n  private async handleEvent(\n    controller: ReadableStreamDefaultController<Uint8Array>\n  ): Promise<void> {\n    const headerValue = this.extractPaymentHeaderFromEventLines(this.pendingEvent);\n    if (!headerValue) {\n      for (const out of this.pendingEvent) {\n        const bytes = this.encoder.encode(out + '\\n');\n        // Never drop data lines; rely on controller backpressure\n        controller.enqueue(bytes);\n      }\n      // Ensure SSE event separation with a single blank line delimiter\n      const last = this.pendingEvent[this.pendingEvent.length - 1];\n      if (last !== '') {\n        const sep = this.encoder.encode('\\n');\n        // Never drop the protocol boundary due to backpressure\n        controller.enqueue(sep);\n        this.log('[sse.event.emit.sep]', true);\n      }\n\n      this.pendingEvent = [];\n      return;\n    }\n    try {\n      this.onTick?.();\n    } catch (e) {\n      this.log('[sse.event.onTick.error]', e);\n    }\n\n    await safeHandlePayment({ headerValue }, this.onPayment, this.log);\n    this.onAfterPayment(controller);\n    this.pendingEvent = [];\n  }\n\n  async process(\n    textChunk: string,\n    controller: ReadableStreamDefaultController<Uint8Array>\n  ): Promise<void> {\n    this.buffer += textChunk;\n    const lines = this.buffer.split(/\\r?\\n/);\n    this.buffer = lines.pop() ?? '';\n    for (const line of lines) {\n      try {\n        this.onTick?.();\n      } catch (e) {\n        this.log('[sse.event.onTick.error]', e);\n      }\n      this.pendingEvent.push(line);\n      if (line === '') {\n        try {\n          await this.handleEvent(controller);\n        } catch (e) {\n          this.log('[process.error]', e);\n        }\n      }\n    }\n  }\n\n  async flush(controller: ReadableStreamDefaultController<Uint8Array>): Promise<void> {\n    if (!this.buffer) return;\n    this.pendingEvent.push(this.buffer);\n    try {\n      await this.handleEvent(controller);\n    } catch (e) {\n      this.log('[flush.error]', e);\n    }\n    this.buffer = '';\n  }\n}\n\nclass NdjsonInbandParser implements InBandParser {\n  private buffer = '';\n  constructor(\n    private encoder: TextEncoder,\n    private onPayment: (payload: InBandPaymentPayload) => void | Promise<void>,\n    private log: (...args: any[]) => void,\n    private onAfterPayment: (controller: ReadableStreamDefaultController<Uint8Array>) => void,\n    private onTick?: () => void,\n    private shouldEmit?: (c: ReadableStreamDefaultController<Uint8Array>) => boolean\n  ) {}\n\n  private extractPaymentHeaderFromLine(t: string): string | null {\n    try {\n      const obj = JSON.parse(t);\n      const headerValue = obj?.__nuwa_payment_header__ || obj?.nuwa_payment_header;\n      this.log('[extractPaymentHeaderFromLine]', headerValue);\n      return typeof headerValue === 'string' ? headerValue : null;\n    } catch {\n      return null;\n    }\n  }\n\n  private async handleLine(\n    line: string,\n    controller: ReadableStreamDefaultController<Uint8Array>\n  ): Promise<void> {\n    const t = line.trim();\n    if (!t) return;\n    try {\n      this.log('[ndjson.emit.line]', t.slice(0, 128));\n    } catch {}\n    const headerValue = this.extractPaymentHeaderFromLine(t);\n    if (!headerValue) {\n      const bytes = this.encoder.encode(line + '\\n');\n      // Never drop data lines; rely on controller backpressure\n      controller.enqueue(bytes);\n      return;\n    }\n    this.onTick?.();\n    await safeHandlePayment({ headerValue }, this.onPayment, this.log);\n    this.onAfterPayment(controller);\n  }\n\n  async process(\n    textChunk: string,\n    controller: ReadableStreamDefaultController<Uint8Array>\n  ): Promise<void> {\n    this.buffer += textChunk;\n    const lines = this.buffer.split(/\\r?\\n/);\n    this.buffer = lines.pop() ?? '';\n    for (const line of lines) {\n      try {\n        this.onTick?.();\n      } catch {}\n      try {\n        await this.handleLine(line, controller);\n      } catch (e) {\n        this.log('[process.error]', e);\n      }\n    }\n  }\n\n  async flush(controller: ReadableStreamDefaultController<Uint8Array>): Promise<void> {\n    if (!this.buffer) return;\n    try {\n      await this.handleLine(this.buffer, controller);\n    } catch (e) {\n      this.log('[flush.error]', e);\n    }\n    this.buffer = '';\n  }\n}\n\nasync function safeHandlePayment(\n  p: any,\n  onPayment: (payload: InBandPaymentPayload) => void | Promise<void>,\n  log: (...args: any[]) => void\n): Promise<void> {\n  try {\n    if (p && typeof p.headerValue === 'string') {\n      await onPayment(p as InBandPaymentPayload);\n    }\n  } catch (e) {\n    log('[inband.handle.error]', (e as Error)?.message || String(e));\n  }\n}\n","/**\n * Detect if a fetch Response should be treated as streaming for payment in-band parsing.\n * Strictly checks Content-Type to avoid false positives (e.g., chunked JSON).\n */\nexport function isStreamLikeResponse(response: Response): boolean {\n  const ct = (response.headers.get('content-type') || '').toLowerCase();\n  return ct.includes('text/event-stream') || ct.includes('application/x-ndjson');\n}\n","import { DebugLogger } from '@nuwa-ai/identity-kit';\n\ntype StartFn<T> = (release: () => void, signal: AbortSignal) => Promise<T>;\n\nexport interface ScheduledTaskHandle<T> {\n  promise: Promise<T>;\n  cancel: (reason?: any) => void;\n}\n\nexport class RequestScheduler {\n  private queue: Array<() => Promise<void>> = [];\n  private active = 0;\n  private readonly concurrency = 1;\n  private logger = DebugLogger.get('RequestScheduler');\n  private isShutdown = false;\n\n  enqueue<T>(start: StartFn<T>): ScheduledTaskHandle<T> {\n    let cancelFn: (reason?: any) => void = () => {};\n    const promise = new Promise<T>((outerResolve, outerReject) => {\n      // Reject immediately if shutdown\n      if (this.isShutdown) {\n        outerReject(new Error('RequestScheduler is shutdown'));\n        return;\n      }\n\n      const schedulerController = new AbortController();\n      let settled = false;\n      const safeResolve = (value: T) => {\n        if (settled) return;\n        settled = true;\n        outerResolve(value);\n      };\n      const safeReject = (reason: any) => {\n        if (settled) return;\n        settled = true;\n        outerReject(reason);\n      };\n\n      const task = async () => {\n        this.active += 1;\n        let released = false;\n        const release = () => {\n          if (released) return;\n          released = true;\n          this.active -= 1;\n          this.flush();\n        };\n\n        // Create an abort promise to race against the task start\n        const abortPromise = new Promise<T>((_resolve, reject) => {\n          const onAbort = () => {\n            try {\n              reject(schedulerController.signal.reason || new Error('Task aborted'));\n            } catch {\n              reject(new Error('Task aborted'));\n            }\n          };\n          if (schedulerController.signal.aborted) {\n            onAbort();\n          } else {\n            schedulerController.signal.addEventListener('abort', onAbort, { once: true });\n          }\n        });\n\n        try {\n          const result = await Promise.race([\n            start(release, schedulerController.signal),\n            abortPromise,\n          ]);\n          safeResolve(result);\n        } catch (e) {\n          this.logger.debug('Task failed:', e);\n          safeReject(e);\n        } finally {\n          try {\n            release();\n          } catch (releaseError) {\n            this.logger.debug('Error during release:', releaseError);\n          }\n        }\n      };\n\n      cancelFn = (reason?: any) => {\n        // Try to remove from queue if not yet started\n        const idx = this.queue.indexOf(task);\n        if (idx >= 0) {\n          this.queue.splice(idx, 1);\n          // Defer rejection to ensure external handlers can attach first\n          setTimeout(() => safeReject(reason || new Error('Task cancelled')), 0);\n          try {\n            schedulerController.abort(reason);\n          } catch {}\n          return;\n        }\n        // If already started, signal abort and let the abortPromise reject the task\n        try {\n          schedulerController.abort(reason);\n        } catch {}\n      };\n\n      this.queue.push(task);\n      this.flush();\n    });\n    return { promise, cancel: cancelFn };\n  }\n\n  private flush() {\n    while (this.active < this.concurrency && this.queue.length > 0) {\n      const next = this.queue.shift()!;\n      void next();\n    }\n  }\n\n  /**\n   * Clear the queue and prevent any new tasks from being enqueued\n   */\n  clear(): void {\n    this.isShutdown = true;\n    const queueSize = this.queue.length;\n    this.queue = [];\n    this.logger.debug('RequestScheduler cleared, queue size was:', queueSize);\n  }\n}\n","import type {\n  HttpClientState,\n  PersistedHttpClientState,\n  PendingPaymentRequest,\n  HostChannelMappingStore,\n} from '../types';\nimport type { SubRAV, ChannelInfo, SubChannelInfo } from '../../../core/types';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { HttpPaymentCodec } from '../../../middlewares/http/HttpPaymentCodec';\n\n/**\n * PaymentState manages all client state in a centralized way.\n * This includes channel information, pending payments, and cached SubRAVs.\n */\nexport class PaymentState {\n  private logger: DebugLogger;\n  private state: HttpClientState;\n  private channelId?: string;\n  private channelInfo?: ChannelInfo;\n  private subChannelInfo?: SubChannelInfo;\n  private keyId?: string;\n  private vmIdFragment?: string;\n  private pendingSubRAV?: SubRAV;\n  private highestObservedNonce?: bigint;\n  private recentlyRejectedRefs = new Set<string>();\n\n  constructor() {\n    this.logger = DebugLogger.get('PaymentState');\n    this.state = {\n      pendingPayments: new Map(),\n    };\n  }\n\n  // Channel management\n  setChannelId(channelId: string | undefined): void {\n    this.channelId = channelId;\n    this.logger.debug('Channel ID set:', channelId);\n  }\n\n  getChannelId(): string | undefined {\n    return this.channelId;\n  }\n\n  setChannelInfo(info: ChannelInfo | undefined): void {\n    this.channelInfo = info;\n  }\n\n  getChannelInfo(): ChannelInfo | undefined {\n    return this.channelInfo;\n  }\n\n  setSubChannelInfo(info: SubChannelInfo | undefined): void {\n    this.subChannelInfo = info;\n  }\n\n  getSubChannelInfo(): SubChannelInfo | undefined {\n    return this.subChannelInfo;\n  }\n\n  // Key management\n  setKeyInfo(keyId: string, vmIdFragment: string): void {\n    this.keyId = keyId;\n    this.vmIdFragment = vmIdFragment;\n    this.logger.debug('Key info set:', { keyId, vmIdFragment });\n  }\n\n  getKeyId(): string | undefined {\n    return this.keyId;\n  }\n\n  getVmIdFragment(): string | undefined {\n    return this.vmIdFragment;\n  }\n\n  // Pending SubRAV management\n  setPendingSubRAV(subRav: SubRAV | undefined): void {\n    // Apply monotonic guard to prevent rollback\n    if (subRav && this.shouldAcceptSubRAV(subRav)) {\n      this.pendingSubRAV = subRav;\n      this.logger.debug('Pending SubRAV set:', subRav.nonce);\n    }\n  }\n\n  getPendingSubRAV(): SubRAV | undefined {\n    return this.pendingSubRAV;\n  }\n\n  clearPendingSubRAV(): void {\n    this.pendingSubRAV = undefined;\n    this.logger.debug('Pending SubRAV cleared');\n  }\n\n  // Monotonic nonce guard\n  updateHighestNonce(nonce: bigint): void {\n    if (!this.highestObservedNonce || nonce > this.highestObservedNonce) {\n      this.highestObservedNonce = nonce;\n    }\n  }\n\n  private shouldAcceptSubRAV(subRav: SubRAV): boolean {\n    // Fragment guard\n    if (this.vmIdFragment && subRav.vmIdFragment !== this.vmIdFragment) {\n      this.logger.debug('Rejecting SubRAV: fragment mismatch');\n      return false;\n    }\n\n    // Nonce guard\n    const currentNonce = this.pendingSubRAV?.nonce;\n    if (\n      (this.highestObservedNonce && subRav.nonce <= this.highestObservedNonce) ||\n      (currentNonce && subRav.nonce <= currentNonce)\n    ) {\n      this.logger.debug('Rejecting SubRAV: nonce not progressive', {\n        highestObservedNonce: this.highestObservedNonce,\n        currentNonce: currentNonce,\n        subRavNonce: subRav.nonce,\n      });\n      return false;\n    }\n\n    return true;\n  }\n\n  // Pending payments management\n  addPendingPayment(clientTxRef: string, request: PendingPaymentRequest): void {\n    this.state.pendingPayments?.set(clientTxRef, request);\n    this.logger.debug('Pending payment added:', clientTxRef);\n  }\n\n  getPendingPayment(clientTxRef: string): PendingPaymentRequest | undefined {\n    return this.state.pendingPayments?.get(clientTxRef);\n  }\n\n  removePendingPayment(clientTxRef: string): void {\n    this.state.pendingPayments?.delete(clientTxRef);\n    this.logger.debug('Pending payment removed:', clientTxRef);\n  }\n\n  getAllPendingPayments(): Map<string, PendingPaymentRequest> {\n    return this.state.pendingPayments || new Map();\n  }\n\n  clearAllPendingPayments(): void {\n    this.state.pendingPayments?.clear();\n    this.logger.debug('All pending payments cleared');\n  }\n\n  // Rejected refs tracking\n  markAsRejected(clientTxRef: string): void {\n    this.recentlyRejectedRefs.add(clientTxRef);\n  }\n\n  isRecentlyRejected(clientTxRef: string): boolean {\n    return this.recentlyRejectedRefs.has(clientTxRef);\n  }\n\n  // State persistence\n  getPersistedState(): PersistedHttpClientState {\n    return {\n      channelId: this.channelId,\n      pendingSubRAV: this.pendingSubRAV\n        ? HttpPaymentCodec.serializeSubRAV(this.pendingSubRAV)\n        : undefined,\n      lastUpdated: new Date().toISOString(),\n    };\n  }\n\n  loadPersistedState(state: PersistedHttpClientState): void {\n    if (state.channelId) {\n      this.channelId = state.channelId;\n    }\n    const pendingSubRAV = state.pendingSubRAV\n      ? HttpPaymentCodec.deserializeSubRAV(state.pendingSubRAV)\n      : undefined;\n    if (pendingSubRAV && this.shouldAcceptSubRAV(pendingSubRAV)) {\n      this.pendingSubRAV = pendingSubRAV;\n    }\n    this.logger.debug('Persisted state loaded');\n  }\n\n  // Reset state\n  reset(): void {\n    this.channelId = undefined;\n    this.channelInfo = undefined;\n    this.subChannelInfo = undefined;\n    this.keyId = undefined;\n    this.vmIdFragment = undefined;\n    this.pendingSubRAV = undefined;\n    this.highestObservedNonce = undefined;\n    this.recentlyRejectedRefs.clear();\n    this.state.pendingPayments?.clear();\n    this.logger.debug('State reset');\n  }\n}\n","// Re-export HttpPaymentCodec for internal use\nexport { HttpPaymentCodec } from '../../../middlewares/http/HttpPaymentCodec';\n","import type { SubRAV, SignedSubRAV } from '../../../core/types';\nimport type { PaymentRequestContext } from '../types';\nimport { HttpPaymentCodec } from '../internal/codec';\nimport { PaymentKitError } from '../../../errors';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { PaymentErrorCode } from '../../../errors/codes';\n\nexport interface PaymentHeaderData {\n  subRav?: SubRAV;\n  signedSubRav?: SignedSubRAV;\n  cost?: bigint;\n  costUsd?: bigint;\n  clientTxRef?: string;\n  serviceTxRef?: string;\n  error?: {\n    code: string;\n    message?: string;\n  };\n}\n\nexport type ProtocolResult =\n  | { type: 'none' }\n  | { type: 'error'; clientTxRef?: string; err: PaymentKitError }\n  | {\n      type: 'success';\n      clientTxRef?: string;\n      subRav: SubRAV;\n      cost: bigint;\n      costUsd?: bigint;\n      serviceTxRef?: string;\n    };\n\n/**\n * PaymentProtocol handles all protocol-specific logic including:\n * - SubRAV signing\n * - Header encoding/decoding\n * - Response parsing\n */\nexport class PaymentProtocol {\n  private logger: DebugLogger;\n  private codec: HttpPaymentCodec;\n\n  constructor() {\n    this.logger = DebugLogger.get('PaymentProtocol');\n    this.codec = new HttpPaymentCodec();\n  }\n\n  /**\n   * Encode payment header for requests\n   */\n  encodeRequestHeader(\n    signedSubRAV: SignedSubRAV | undefined,\n    clientTxRef: string,\n    maxAmount: bigint = BigInt(0)\n  ): string {\n    return this.codec.encodePayload({\n      signedSubRav: signedSubRAV,\n      maxAmount,\n      clientTxRef,\n      version: 1,\n    });\n  }\n\n  /**\n   * Parse payment header from response\n   */\n  parseResponseHeader(headerValue: string): PaymentHeaderData {\n    try {\n      return HttpPaymentCodec.parseResponseHeader(headerValue);\n    } catch (error) {\n      this.logger.debug('Failed to parse payment header:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Extract protocol information from response headers\n   */\n  parseProtocolFromResponse(response: Response, context?: PaymentRequestContext): ProtocolResult {\n    const headerName = HttpPaymentCodec.getHeaderName();\n    let paymentHeader = response.headers.get(headerName);\n\n    if (!paymentHeader) {\n      paymentHeader = response.headers.get(headerName.toLowerCase());\n    }\n\n    if (!paymentHeader) {\n      return { type: 'none' };\n    }\n\n    try {\n      const payload = this.parseResponseHeader(paymentHeader);\n\n      if (payload?.error) {\n        const code = payload.error.code;\n        const message = payload.error.message || response.statusText || 'Payment error';\n        return {\n          type: 'error',\n          clientTxRef: payload.clientTxRef || context?.clientTxRef,\n          err: new PaymentKitError(code, message, response.status),\n        };\n      }\n\n      if (payload?.subRav && payload.cost !== undefined) {\n        return {\n          type: 'success',\n          clientTxRef: payload.clientTxRef || context?.clientTxRef,\n          subRav: payload.subRav,\n          cost: payload.cost,\n          costUsd: payload.costUsd,\n          serviceTxRef: payload.serviceTxRef,\n        };\n      }\n\n      return { type: 'none' };\n    } catch (e) {\n      this.logger.debug('Failed to parse payment response header:', e);\n      return { type: 'none' };\n    }\n  }\n\n  /**\n   * Handle protocol errors based on HTTP status codes\n   */\n  handleStatusCode(status: number): PaymentKitError | null {\n    switch (status) {\n      case 402:\n        return new PaymentKitError(\n          PaymentErrorCode.PAYMENT_REQUIRED,\n          'Payment required - insufficient balance or invalid proposal',\n          402\n        );\n      case 409:\n        return new PaymentKitError(\n          PaymentErrorCode.RAV_CONFLICT,\n          'SubRAV conflict - cleared pending proposal',\n          409\n        );\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Get header name for payment protocol\n   */\n  getHeaderName(): string {\n    return HttpPaymentCodec.getHeaderName();\n  }\n}\n","import type { PendingPaymentRequest, PaymentRequestContext } from '../types';\nimport type { SignedSubRAV, PaymentInfo } from '../../../core/types';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { PaymentState } from './PaymentState';\n\nexport interface RequestTracker {\n  clientTxRef: string;\n  resolve: (info: PaymentInfo | undefined) => void;\n  reject: (error: Error) => void;\n  timeoutId: NodeJS.Timeout;\n  release?: () => void;\n}\n\n/**\n * RequestManager handles request tracking, timeouts, and payment resolution.\n */\nexport class RequestManager {\n  private logger: DebugLogger;\n  private paymentState: PaymentState;\n  private defaultTimeoutMs: number;\n  private traceOrigins = new Map<string, string>();\n\n  constructor(paymentState: PaymentState, defaultTimeoutMs: number = 30000) {\n    this.logger = DebugLogger.get('RequestManager');\n    this.paymentState = paymentState;\n    this.defaultTimeoutMs = defaultTimeoutMs;\n  }\n\n  /**\n   * Create a payment promise for tracking request payment info\n   */\n  createPaymentPromise(\n    clientTxRef: string,\n    requestContext: PaymentRequestContext,\n    sentSubRav: SignedSubRAV | undefined,\n    channelId: string,\n    assetId: string,\n    timeoutMs?: number\n  ): Promise<PaymentInfo | undefined> {\n    return new Promise((resolve, reject) => {\n      const timeout = timeoutMs || this.defaultTimeoutMs;\n\n      // Set timeout for cleanup\n      const timeoutId = setTimeout(() => {\n        const pending = this.paymentState.getPendingPayment(clientTxRef);\n        if (pending) {\n          // Release scheduler queue if applicable\n          try {\n            pending.release?.();\n          } catch (e) {\n            this.logger.debug('[release.error]', e);\n          }\n          this.paymentState.removePendingPayment(clientTxRef);\n          this.logger.debug('[payment.timeout]', 'clientTxRef=', clientTxRef);\n          reject(new Error('Payment resolution timeout'));\n        }\n      }, timeout);\n\n      const pendingRequest: PendingPaymentRequest = {\n        resolve,\n        reject,\n        timestamp: new Date(),\n        channelId,\n        assetId,\n        timeoutId,\n        sentSubRav: sentSubRav,\n        requestContext,\n      };\n\n      this.paymentState.addPendingPayment(clientTxRef, pendingRequest);\n\n      this.logger.debug(\n        '[payment.pending.create]',\n        'clientTxRef=',\n        clientTxRef,\n        'channelId=',\n        channelId,\n        'signedSubRav=',\n        !!sentSubRav\n      );\n    });\n  }\n\n  /**\n   * Extend timeout for a specific pending payment (used for streaming)\n   */\n  extendTimeout(clientTxRef: string, newTimeoutMs: number): void {\n    const pending = this.paymentState.getPendingPayment(clientTxRef);\n    if (!pending) return;\n\n    clearTimeout(pending.timeoutId);\n    pending.timeoutId = setTimeout(() => {\n      if (this.paymentState.getPendingPayment(clientTxRef)) {\n        try {\n          pending.release?.();\n        } catch (e) {\n          this.logger.debug('[release.error]', e);\n        }\n        this.paymentState.removePendingPayment(clientTxRef);\n        this.logger.debug('[payment.timeout.stream]', 'clientTxRef=', clientTxRef);\n        pending.reject(new Error('Payment resolution timeout'));\n      }\n    }, newTimeoutMs);\n\n    //this.logger.debug('[payment.timeout.extend]', 'clientTxRef=', clientTxRef, 'ms=', newTimeoutMs);\n  }\n\n  /**\n   * Resolve a pending payment by reference\n   */\n  resolveByRef(clientTxRef: string, info: PaymentInfo | undefined): boolean {\n    const pending = this.paymentState.getPendingPayment(clientTxRef);\n    if (!pending) return false;\n\n    clearTimeout(pending.timeoutId);\n\n    // Always release scheduler when payment is resolved\n    // This matches the original implementation behavior\n    try {\n      pending.release?.();\n    } catch (e) {\n      this.logger.debug('[release.error]', e);\n    }\n    pending.resolve(info);\n    this.paymentState.removePendingPayment(clientTxRef);\n    this.clearTraceOrigin(clientTxRef);\n\n    this.logger.debug('[payment.pending.resolve]', 'clientTxRef=', clientTxRef);\n    return true;\n  }\n\n  /**\n   * Reject a pending payment by reference\n   */\n  rejectByRef(clientTxRef: string, err: Error): boolean {\n    const pending = this.paymentState.getPendingPayment(clientTxRef);\n    if (!pending) return false;\n\n    clearTimeout(pending.timeoutId);\n    try {\n      pending.release?.();\n    } catch (e) {\n      this.logger.debug('[release.error]', e);\n    }\n    pending.reject(err);\n    this.paymentState.removePendingPayment(clientTxRef);\n    this.paymentState.markAsRejected(clientTxRef);\n    this.clearTraceOrigin(clientTxRef);\n\n    this.logger.debug(\n      '[payment.pending.reject]',\n      'clientTxRef=',\n      clientTxRef,\n      'error=',\n      err.message\n    );\n    return true;\n  }\n\n  /**\n   * Reject all pending payments\n   */\n  rejectAll(err: Error): void {\n    const pendingPayments = this.paymentState.getAllPendingPayments();\n\n    for (const [key, pending] of pendingPayments.entries()) {\n      clearTimeout(pending.timeoutId);\n      try {\n        pending.release?.();\n      } catch (e) {\n        this.logger.debug('[release.error]', e);\n      }\n      try {\n        pending.reject(err);\n      } catch (e) {\n        this.logger.debug('[pending.reject.error]', e);\n      }\n    }\n\n    this.paymentState.clearAllPendingPayments();\n  }\n\n  /**\n   * Resolve all pending payments as free\n   */\n  resolveAllAsFree(): void {\n    const pendingPayments = this.paymentState.getAllPendingPayments();\n    const keys: string[] = [];\n\n    for (const [key, pending] of pendingPayments.entries()) {\n      clearTimeout(pending.timeoutId);\n      try {\n        pending.release?.();\n      } catch (e) {\n        this.logger.debug('[release.error]', e);\n      }\n      pending.resolve(undefined);\n      keys.push(key);\n    }\n\n    this.paymentState.clearAllPendingPayments();\n\n    if (keys.length > 0) {\n      this.logger.debug('[payment.pending.free]', 'resolved', keys.length, 'requests as free');\n    }\n  }\n\n  /**\n   * Get all pending payment keys\n   */\n  getPendingKeys(): string[] {\n    return Array.from(this.paymentState.getAllPendingPayments().keys());\n  }\n\n  /**\n   * Record trace origin for debugging\n   */\n  recordTraceOrigin(clientTxRef: string, origin: string): void {\n    this.traceOrigins.set(clientTxRef, origin);\n  }\n\n  /**\n   * Get trace origin for a client transaction reference\n   */\n  getTraceOrigin(clientTxRef: string): string | undefined {\n    return this.traceOrigins.get(clientTxRef);\n  }\n\n  /**\n   * Clear trace origin\n   */\n  clearTraceOrigin(clientTxRef: string): void {\n    this.traceOrigins.delete(clientTxRef);\n  }\n\n  /**\n   * Get trace origin snapshots for debugging\n   */\n  getTraceSnapshots(limit: number = 5): Array<{ key: string; head: string }> {\n    const snapshots: Array<{ key: string; head: string }> = [];\n\n    for (const [key, stack] of this.traceOrigins.entries()) {\n      snapshots.push({ key, head: stack.split('\\n')[0] });\n      if (snapshots.length >= limit) break;\n    }\n\n    return snapshots;\n  }\n}\n","import type { HostChannelMappingStore } from '../types';\nimport type { RecoveryResponse, DiscoveryResponse } from '../../../schema';\nimport { RecoveryResponseSchema } from '../../../schema';\nimport type { FetchLike } from '../types';\nimport { PaymentChannelPayerClient } from '../../../client/PaymentChannelPayerClient';\nimport { PaymentState } from './PaymentState';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { DidAuthHelper } from '../internal/DidAuthHelper';\nimport { serializeJson } from '../../../utils/json';\nimport type { SignedSubRAV } from '../../../core/types';\n\nexport interface ChannelManagerOptions {\n  host: string;\n  baseUrl: string;\n  payerClient: PaymentChannelPayerClient;\n  paymentState: PaymentState;\n  mappingStore: HostChannelMappingStore;\n  fetchImpl: FetchLike;\n  signer: any;\n  keyId?: string;\n  payerDid?: string;\n  payeeDid?: string;\n  defaultAssetId?: string;\n}\n\n/**\n * ChannelManager handles channel lifecycle operations including:\n * - Channel creation and restoration\n * - Service discovery\n * - Channel recovery\n * - SubRAV commits\n */\nexport class ChannelManager {\n  private logger: DebugLogger;\n  private options: ChannelManagerOptions;\n  private discoveredBasePath?: string;\n  private cachedDiscoveryInfo?: DiscoveryResponse;\n  private ensureReadyPromise?: Promise<void>;\n\n  constructor(options: ChannelManagerOptions) {\n    this.options = options;\n    this.logger = DebugLogger.get('ChannelManager');\n  }\n\n  /**\n   * Ensure channel is ready for use\n   */\n  async ensureChannelReady(): Promise<void> {\n    if (!this.ensureReadyPromise) {\n      this.ensureReadyPromise = this.doEnsureChannelReady().finally(() => {\n        this.ensureReadyPromise = undefined;\n      });\n    }\n\n    await this.ensureReadyPromise;\n  }\n\n  private async doEnsureChannelReady(): Promise<void> {\n    // 1) Ensure key fragment present (needed for sub-channel checks)\n    await this.ensureKeyFragmentPresent();\n\n    // 2) Try to load persisted state first\n    await this.loadPersistedState();\n\n    // 3) Validate or recover/create channel\n    let channelId = this.options.paymentState.getChannelId();\n    if (channelId) {\n      // Validate channel exists and refresh channelInfo\n      try {\n        const info = await this.options.payerClient.getChannelInfo(channelId);\n        this.options.paymentState.setChannelInfo(info);\n      } catch (e) {\n        this.logger.debug('Persisted channel not found, clearing and recovering:', e);\n        this.options.paymentState.setChannelId(undefined);\n        this.options.paymentState.setChannelInfo(undefined);\n        channelId = undefined;\n      }\n    }\n\n    if (!channelId) {\n      // Create new channel directly; recovery is no longer auto-invoked\n      await this.createNewChannel();\n      channelId = this.options.paymentState.getChannelId();\n    }\n\n    // 4) Ensure sub-channel exists/authorized for current vmIdFragment\n    const vmIdFragment = this.options.paymentState.getVmIdFragment();\n    if (channelId && vmIdFragment) {\n      const existingSub = this.options.paymentState.getSubChannelInfo();\n      if (!existingSub) {\n        try {\n          const subInfo = await this.options.payerClient.getSubChannelInfo(channelId, vmIdFragment);\n          this.options.paymentState.setSubChannelInfo(subInfo);\n        } catch {\n          // Directly authorize sub-channel without auto recovery\n          try {\n            await this.options.payerClient.authorizeSubChannel({ channelId, vmIdFragment });\n            await this.waitForSubChannelAuthorization(channelId, vmIdFragment);\n            const subInfo = await this.options.payerClient.getSubChannelInfo(\n              channelId,\n              vmIdFragment\n            );\n            this.options.paymentState.setSubChannelInfo(subInfo);\n            await this.persistState();\n          } catch (e2) {\n            this.logger.debug('Direct sub-channel authorization failed:', e2);\n            throw e2;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Create a new payment channel\n   */\n  private async createNewChannel(): Promise<void> {\n    const defaultAssetId = this.options.defaultAssetId || '0x3::gas_coin::RGas';\n\n    // Get payee DID from options or discover from service\n    let payeeDid = this.options.payeeDid;\n\n    if (!payeeDid) {\n      const serviceInfo = await this.discoverService();\n      payeeDid = serviceInfo.serviceDid;\n      this.logger.debug('Discovered payeeDid from service:', payeeDid);\n    }\n\n    const openChannelResult = await this.options.payerClient.openChannelWithSubChannel({\n      payeeDid,\n      assetId: defaultAssetId,\n    });\n\n    this.options.paymentState.setChannelId(openChannelResult.channelId);\n\n    // Use returned infos directly to avoid redundant queries\n    if (openChannelResult.channelInfo) {\n      this.options.paymentState.setChannelInfo(openChannelResult.channelInfo);\n    }\n    if (openChannelResult.subChannelInfo) {\n      this.options.paymentState.setSubChannelInfo(openChannelResult.subChannelInfo);\n    }\n\n    await this.persistState();\n    this.logger.debug('Created new channel:', openChannelResult.channelId);\n  }\n\n  /**\n   * Ensure keyId and vmIdFragment are present in PaymentState\n   */\n  private async ensureKeyFragmentPresent(): Promise<void> {\n    if (this.options.paymentState.getKeyId() && this.options.paymentState.getVmIdFragment()) return;\n\n    let keyId = this.options.keyId;\n    if (!keyId) {\n      if (this.options.signer && typeof this.options.signer.listKeyIds === 'function') {\n        try {\n          const ids: string[] = await this.options.signer.listKeyIds();\n          keyId = Array.isArray(ids) && ids.length > 0 ? ids[0] : undefined;\n        } catch (e) {\n          this.logger.debug('listKeyIds failed:', e);\n        }\n      }\n    }\n\n    if (keyId) {\n      const parts = keyId.split('#');\n      const vmIdFragment = parts.length > 1 ? parts[1] : undefined;\n      if (vmIdFragment) {\n        this.options.paymentState.setKeyInfo(keyId, vmIdFragment);\n      }\n    }\n\n    if (!this.options.paymentState.getKeyId() || !this.options.paymentState.getVmIdFragment()) {\n      throw new Error('No keyId found');\n    }\n  }\n\n  /**\n   * Discover service information\n   */\n  async discoverService(): Promise<DiscoveryResponse> {\n    if (!this.cachedDiscoveryInfo) {\n      await this.performDiscovery();\n    }\n\n    if (this.cachedDiscoveryInfo) {\n      return this.cachedDiscoveryInfo;\n    }\n\n    throw new Error('Service discovery failed: No discovery information available');\n  }\n\n  private async performDiscovery(): Promise<void> {\n    const discoveryUrl = new URL('/.well-known/nuwa-payment/info', this.options.baseUrl);\n\n    try {\n      const response = await this.options.fetchImpl(discoveryUrl.toString(), {\n        method: 'GET',\n        headers: {\n          Accept: 'application/json',\n        },\n      });\n\n      if (response.ok) {\n        const serviceInfo = (await response.json()) as DiscoveryResponse;\n        this.logger.debug('Service discovery successful:', serviceInfo);\n\n        this.cachedDiscoveryInfo = serviceInfo;\n        if (serviceInfo.basePath) {\n          this.discoveredBasePath = serviceInfo.basePath;\n        }\n      }\n    } catch (error) {\n      this.logger.debug('Service discovery failed:', error);\n    }\n\n    // Set fallback basePath\n    if (!this.discoveredBasePath) {\n      this.discoveredBasePath = '/payment-channel';\n    }\n  }\n\n  /**\n   * Recover channel state from service\n   */\n  async recoverFromService(): Promise<RecoveryResponse> {\n    const recoveryUrl = this.buildPaymentUrl('/recovery');\n\n    try {\n      const payerDid = this.options.payerDid || (await this.options.signer.getDid());\n      const authHeader = await DidAuthHelper.generateAuthHeader(\n        payerDid,\n        this.options.signer,\n        recoveryUrl,\n        'GET',\n        this.options.keyId\n      );\n\n      const headers: Record<string, string> = {\n        Accept: 'application/json',\n      };\n\n      if (authHeader) {\n        headers['Authorization'] = authHeader;\n      }\n\n      const response = await this.options.fetchImpl(recoveryUrl, {\n        method: 'GET',\n        headers,\n      });\n\n      if (!response.ok) {\n        throw new Error(`Failed to recover from service: HTTP ${response.status}`);\n      }\n\n      const jsonData = await response.json();\n\n      // Log the raw response for debugging\n      this.logger.debug('Raw recovery response:', serializeJson(jsonData));\n\n      // Check if response is in ApiResponse format\n      let dataToValidate = jsonData;\n      if (jsonData && typeof jsonData === 'object' && 'success' in jsonData) {\n        if (jsonData.success && 'data' in jsonData) {\n          dataToValidate = jsonData.data;\n        } else if (!jsonData.success) {\n          const error = jsonData.error || {};\n          throw new Error(error.message || 'Recovery request failed');\n        }\n      }\n\n      try {\n        const recoveryData = RecoveryResponseSchema.parse(dataToValidate);\n        this.logger.debug('Recovery completed successfully');\n        return recoveryData;\n      } catch (parseError) {\n        // If parsing fails, log the error and return the raw data\n        // This maintains backward compatibility\n        this.logger.debug('Recovery response parsing failed:', parseError);\n        this.logger.debug('Returning raw recovery data');\n        return dataToValidate as RecoveryResponse;\n      }\n    } catch (error) {\n      const errorMessage = `Recovery failed: ${error instanceof Error ? error.message : String(error)}`;\n      this.logger.debug(errorMessage);\n      throw new Error(errorMessage);\n    }\n  }\n\n  /**\n   * Wait for sub-channel authorization to be visible on-chain\n   */\n  private async waitForSubChannelAuthorization(\n    channelId: string,\n    vmIdFragment: string,\n    attempts: number = 10,\n    delayMs: number = 500\n  ): Promise<void> {\n    for (let i = 0; i < attempts; i++) {\n      try {\n        await this.options.payerClient.getSubChannelInfo(channelId, vmIdFragment);\n        this.logger.debug('Sub-channel visible on-chain:', vmIdFragment);\n        return;\n      } catch {\n        await new Promise(resolve => setTimeout(resolve, delayMs));\n      }\n    }\n    throw new Error('Sub-channel authorization not visible on-chain within timeout');\n  }\n\n  /**\n   * Commit a signed SubRAV to the service\n   */\n  async commitSubRAV(signedSubRAV: SignedSubRAV): Promise<void> {\n    const commitUrl = this.buildPaymentUrl('/commit');\n\n    try {\n      const payerDid = this.options.payerDid || (await this.options.signer.getDid());\n      const authHeader = await DidAuthHelper.generateAuthHeader(\n        payerDid,\n        this.options.signer,\n        commitUrl,\n        'POST',\n        this.options.keyId\n      );\n\n      const headers: Record<string, string> = {\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n      };\n\n      if (authHeader) {\n        headers['Authorization'] = authHeader;\n      }\n\n      const response = await this.options.fetchImpl(commitUrl, {\n        method: 'POST',\n        headers,\n        body: serializeJson({ subRav: signedSubRAV }),\n      });\n\n      if (!response.ok) {\n        const errorBody = await response.text();\n        throw new Error(`Failed to commit SubRAV: HTTP ${response.status} - ${errorBody}`);\n      }\n\n      this.logger.debug('SubRAV committed successfully');\n    } catch (error) {\n      const errorMessage = `SubRAV commit failed: ${error instanceof Error ? error.message : String(error)}`;\n      this.logger.debug(errorMessage);\n      throw new Error(errorMessage);\n    }\n  }\n\n  /**\n   * Load persisted state from storage\n   */\n  private async loadPersistedState(): Promise<void> {\n    try {\n      const persistedState = await this.options.mappingStore.getState(this.options.host);\n      if (persistedState) {\n        this.options.paymentState.loadPersistedState(persistedState);\n        this.logger.debug('Loaded persisted state');\n      }\n    } catch (error) {\n      this.logger.debug('Failed to load persisted state:', error);\n    }\n  }\n\n  /**\n   * Persist current state to storage\n   */\n  private async persistState(): Promise<void> {\n    try {\n      const state = this.options.paymentState.getPersistedState();\n      await this.options.mappingStore.setState(this.options.host, state);\n      this.logger.debug('Persisted state');\n    } catch (error) {\n      this.logger.debug('Failed to persist state:', error);\n    }\n  }\n\n  /**\n   * Build URL for payment-related endpoints\n   */\n  buildPaymentUrl(endpoint: string): string {\n    const basePath = this.discoveredBasePath || '/payment-channel';\n    return new URL(`${basePath}${endpoint}`, this.options.baseUrl).toString();\n  }\n\n  /**\n   * Get the discovered base path\n   */\n  getBasePath(): string {\n    return this.discoveredBasePath || '/payment-channel';\n  }\n}\n","import type {\n  HealthResponse,\n  SystemStatusResponse,\n  ClaimTriggerRequest,\n  ClaimTriggerResponse,\n  SubRavRequest,\n  SubRavResponse,\n} from '../../schema';\nimport { PaymentChannelHttpClient } from './PaymentChannelHttpClient';\n\n/**\n * PaymentChannelAdminClient provides a simplified interface for calling\n * Payment Kit admin endpoints.\n *\n * This is a lightweight wrapper around PaymentChannelHttpClient that\n * provides type-safe admin API calls without the complexity of payment\n * channel management.\n *\n * Features:\n * - Type-safe admin API calls\n * - Reuses existing PaymentChannelHttpClient functionality\n * - No additional setup required\n */\nexport class PaymentChannelAdminClient {\n  private httpClient: PaymentChannelHttpClient;\n\n  constructor(httpClient: PaymentChannelHttpClient) {\n    this.httpClient = httpClient;\n  }\n\n  /**\n   * Build URL for payment-related endpoints (internal use)\n   */\n  private buildPaymentUrl(endpoint: string): string {\n    // Use the public buildPaymentUrl method\n    return this.httpClient.buildPaymentUrl(endpoint);\n  }\n\n  /**\n   * Health check endpoint (public, no auth required)\n   */\n  async healthCheck(): Promise<HealthResponse> {\n    return this.httpClient.healthCheck();\n  }\n\n  /**\n   * Get system internal status (admin only)\n   */\n  async getSystemStatus(): Promise<SystemStatusResponse> {\n    const result = await this.httpClient.get<SystemStatusResponse>(\n      this.buildPaymentUrl('/admin/status')\n    );\n    return result.data;\n  }\n\n  /**\n   * Manually trigger a claim for a specific channel (admin only)\n   */\n  async triggerClaim(request: ClaimTriggerRequest): Promise<ClaimTriggerResponse> {\n    const result = await this.httpClient.post<ClaimTriggerResponse>(\n      this.buildPaymentUrl('/admin/claim-trigger'),\n      request\n    );\n    return result.data;\n  }\n\n  /**\n   * Query SubRAV details (requires auth, users can only query their own)\n   */\n  async querySubRav(request: SubRavRequest): Promise<SubRavResponse> {\n    const queryPath = `/subrav?nonce=${encodeURIComponent(request.nonce)}`;\n    const result = await this.httpClient.get<SubRavResponse>(this.buildPaymentUrl(queryPath));\n    return result.data;\n  }\n\n  /**\n   * Discover service information\n   */\n  async discoverService(): Promise<any> {\n    return this.httpClient.discoverService();\n  }\n}\n\n/**\n * Create an admin client from an existing PaymentChannelHttpClient\n */\nexport function createAdminClient(httpClient: PaymentChannelHttpClient): PaymentChannelAdminClient {\n  return new PaymentChannelAdminClient(httpClient);\n}\n","import type { SignerInterface, IdentityEnv } from '@nuwa-ai/identity-kit';\nimport type { HttpPayerOptions } from './types';\nimport { PaymentChannelHttpClient } from './PaymentChannelHttpClient';\nimport { getChainConfigFromEnv } from '../../helpers/fromIdentityEnv';\n\n/**\n * Simple options for creating PaymentChannelHttpClient with IdentityEnv (recommended)\n */\nexport interface CreateHttpClientOptions {\n  /** Target service base URL, e.g., https://api.example.com */\n  baseUrl: string;\n\n  /** Pre-configured IdentityEnv (contains VDR registry, KeyManager, and chain config) */\n  env: IdentityEnv;\n\n  /** Optional maximum amount per request (defaults to 50 cents USD) */\n  maxAmount?: bigint;\n\n  /** Optional debug mode (inherits from IdentityEnv if not specified) */\n  debug?: boolean;\n\n  /** Optional error handler */\n  onError?: (err: unknown) => void;\n\n  /** Optional custom fetch implementation */\n  fetchImpl?: HttpPayerOptions['fetchImpl'];\n\n  /** Optional mapping store */\n  mappingStore?: HttpPayerOptions['mappingStore'];\n\n  /** Optional channel repository */\n  channelRepo?: HttpPayerOptions['channelRepo'];\n\n  /** Timeout for pending payment resolution in milliseconds (non-streaming). */\n  timeoutMs?: number;\n\n  /** Per-frame idle timeout for streaming responses; defaults to timeoutMs if unspecified. */\n  timeoutMsStream?: number;\n}\n\n/**\n * Advanced options for creating PaymentChannelHttpClient with manual configuration\n * Most users should prefer CreateHttpClientOptions with IdentityEnv\n */\nexport interface CreateHttpPayerClientOptions {\n  /** Target service base URL, e.g., https://api.example.com */\n  baseUrl: string;\n\n  /** Signer for payment channel operations and DID authentication */\n  signer: SignerInterface;\n\n  /** Optional key ID (defaults to first available) */\n  keyId?: string;\n\n  /** Optional RPC URL (defaults to localhost) */\n  rpcUrl?: string;\n\n  /** Optional network (defaults to 'local') */\n  network?: 'local' | 'dev' | 'test' | 'main';\n\n  /** Optional DID (will be derived from signer if not provided) */\n  payerDid?: string;\n\n  /** Optional maximum amount per request */\n  maxAmount?: bigint;\n\n  /** Optional debug mode */\n  debug?: boolean;\n\n  /** Optional error handler */\n  onError?: (err: unknown) => void;\n\n  /** Optional custom fetch implementation */\n  fetchImpl?: HttpPayerOptions['fetchImpl'];\n\n  /** Optional mapping store */\n  mappingStore?: HttpPayerOptions['mappingStore'];\n}\n\n/**\n * Create PaymentChannelHttpClient with IdentityEnv (recommended approach)\n * Automatically performs service discovery and uses optimal defaults\n *\n * @param options - Simple configuration options with IdentityEnv\n * @returns Promise resolving to configured PaymentChannelHttpClient instance\n *\n * @example\n * ```typescript\n * import { bootstrapIdentityEnv, createHttpClient } from '@nuwa-ai/payment-kit';\n *\n * // 1. Set up identity environment (once per app)\n * const env = await bootstrapIdentityEnv({\n *   method: 'rooch',\n *   vdrOptions: { rpcUrl: 'https://testnet.rooch.network', network: 'test' }\n * });\n *\n * // 2. Create HTTP client with automatic service discovery\n * const client = await createHttpClient({\n *   baseUrl: 'https://api.llm-gateway.com',\n *   env,\n *   maxAmount: BigInt('500000000000'), // 50 cents USD\n * });\n *\n * // 3. Use it!\n * const result = await client.get('/v1/echo?q=hello');\n * ```\n */\nexport async function createHttpClient(\n  options: CreateHttpClientOptions\n): Promise<PaymentChannelHttpClient> {\n  const chainConfig = getChainConfigFromEnv(options.env);\n  let keyId;\n  const keyIds = await options.env.keyManager.listKeyIds?.();\n  if (keyIds && keyIds.length > 0) {\n    keyId = keyIds[0];\n  } else {\n    throw new Error('No keyId available');\n  }\n  const httpPayerOptions: HttpPayerOptions = {\n    baseUrl: options.baseUrl,\n    chainConfig,\n    signer: options.env.keyManager,\n    keyId,\n    maxAmount: options.maxAmount || BigInt('500000000000'), // Default: 50 cents USD\n    debug: options.debug ?? chainConfig.debug,\n    onError: options.onError,\n    fetchImpl: options.fetchImpl,\n    mappingStore: options.mappingStore,\n    channelRepo: options.channelRepo,\n    timeoutMs: options.timeoutMs,\n    timeoutMsStream: options.timeoutMsStream,\n  };\n\n  const client = new PaymentChannelHttpClient(httpPayerOptions);\n\n  return client;\n}\n","import type { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Nuwa payment service discovery information\n * Retrieved from /.well-known/nuwa-payment/info endpoint\n */\nexport interface NuwaPaymentInfo {\n  /** Service identifier */\n  serviceId: string;\n  /** Service DID for payment channel */\n  serviceDid: string;\n  /** Default asset ID for payments */\n  defaultAssetId: string;\n  /** Optional supported features list */\n  supportedFeatures?: string[];\n  /** Optional base path for payment endpoints */\n  basePath?: string;\n  /** Optional protocol version */\n  protocolVersion?: string;\n}\n\n/**\n * MCP server type classification\n */\nexport enum McpServerType {\n  /** Server supports Nuwa payment protocol */\n  PAYMENT_ENABLED = 'payment',\n  /** Standard MCP server without payment support */\n  STANDARD = 'standard',\n  /** Server type not yet determined */\n  UNKNOWN = 'unknown',\n}\n\n/**\n * Enhanced server capabilities that extend standard MCP capabilities\n * with Nuwa payment protocol extensions\n */\nexport interface EnhancedServerCapabilities extends Omit<\n  ServerCapabilities,\n  'experimental' | 'logging' | 'prompts' | 'resources' | 'tools' | 'tasks'\n> {\n  /** Standard MCP capabilities */\n  experimental?: Record<string, unknown>;\n  logging?: Record<string, unknown>;\n  prompts?: {\n    listChanged?: boolean;\n    [key: string]: unknown;\n  };\n  resources?: {\n    subscribe?: boolean;\n    listChanged?: boolean;\n    [key: string]: unknown;\n  };\n  tools?: {\n    listChanged?: boolean;\n    [key: string]: unknown;\n  };\n\n  /** Nuwa payment protocol extensions */\n  nuwa?: {\n    /** Payment protocol support */\n    payment?: {\n      /** Whether payment protocol is supported */\n      supported: boolean;\n      /** Service identifier */\n      serviceId?: string;\n      /** Service DID for payment channel */\n      serviceDid?: string;\n      /** Default asset ID for payments */\n      defaultAssetId?: string;\n      /** Base path for payment endpoints */\n      basePath?: string;\n      /** Protocol version */\n      protocolVersion?: string;\n    };\n    /** Authentication support */\n    auth?: {\n      /** Whether DID authentication is supported */\n      supported: boolean;\n      /** Supported authentication methods */\n      methods?: string[];\n    };\n    /** Built-in tools support */\n    builtinTools?: {\n      /** Whether Nuwa built-in tools are supported */\n      supported: boolean;\n      /** List of available built-in tools */\n      tools?: string[];\n    };\n  };\n}\n\n/**\n * Detection result containing server type and capabilities\n */\nexport interface ServerDetectionResult {\n  /** Detected server type */\n  type: McpServerType;\n  /** Enhanced capabilities information */\n  capabilities: EnhancedServerCapabilities;\n  /** Payment info if available */\n  paymentInfo?: NuwaPaymentInfo;\n  /** Detection timestamp */\n  detectedAt: number;\n}\n\n/**\n * Options for server detection\n */\nexport interface DetectionOptions {\n  /** Timeout for detection requests in milliseconds */\n  timeout?: number;\n  /** Whether to cache detection results */\n  cache?: boolean;\n  /** Custom fetch implementation */\n  fetchImpl?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n}\n\n/**\n * Options for tool listing that includes filtering\n * Note: This replaces the ListToolsOptions from PaymentChannelMcpClient for consistency\n */\nexport interface UniversalListToolsOptions {\n  /** Whether to include nuwa built-in tools (default: false) */\n  includeBuiltinTools?: boolean;\n}\n","import { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport type {\n  NuwaPaymentInfo,\n  EnhancedServerCapabilities,\n  ServerDetectionResult,\n  DetectionOptions,\n} from './types';\nimport { McpServerType } from './types';\n\n/**\n * Server detector for identifying MCP server capabilities\n * and payment protocol support\n */\nexport class ServerDetector {\n  private logger: DebugLogger;\n  private cache = new Map<string, ServerDetectionResult>();\n\n  constructor(private options: DetectionOptions = {}) {\n    this.logger = DebugLogger.get('ServerDetector');\n  }\n\n  /**\n   * Detect server capabilities and type\n   * @param baseUrl - MCP server base URL\n   * @returns Detection result with server type and capabilities\n   */\n  async detectCapabilities(baseUrl: string): Promise<ServerDetectionResult> {\n    const cacheKey = baseUrl;\n\n    // Check cache if enabled\n    if (this.options.cache !== false && this.cache.has(cacheKey)) {\n      const cached = this.cache.get(cacheKey)!;\n      // Cache for 5 minutes\n      if (Date.now() - cached.detectedAt < 5 * 60 * 1000) {\n        this.logger.debug('Using cached detection result', { baseUrl });\n        return cached;\n      }\n    }\n\n    this.logger.debug('Detecting server capabilities', { baseUrl });\n\n    try {\n      // 1. Check for Nuwa payment protocol support\n      const paymentInfo = await this.checkWellKnownEndpoint(baseUrl);\n\n      // 2. Get standard MCP capabilities\n      const mcpCapabilities = await this.getMcpCapabilities(baseUrl);\n\n      // 3. Combine information to determine server type and capabilities\n      const result = this.combineCapabilities(paymentInfo, mcpCapabilities);\n\n      // Cache result if enabled\n      if (this.options.cache !== false) {\n        this.cache.set(cacheKey, result);\n      }\n\n      this.logger.debug('Detection completed', {\n        baseUrl,\n        type: result.type,\n        hasPaymentInfo: !!result.paymentInfo,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger.warn('Detection failed, falling back to standard MCP', {\n        baseUrl,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      // Fallback to standard MCP\n      const fallbackResult: ServerDetectionResult = {\n        type: McpServerType.STANDARD,\n        capabilities: {},\n        detectedAt: Date.now(),\n      };\n\n      if (this.options.cache !== false) {\n        this.cache.set(cacheKey, fallbackResult);\n      }\n\n      return fallbackResult;\n    }\n  }\n\n  /**\n   * Check for Nuwa payment protocol support via well-known endpoint\n   * @param baseUrl - MCP server base URL\n   * @returns Payment info if supported, null otherwise\n   */\n  private async checkWellKnownEndpoint(baseUrl: string): Promise<NuwaPaymentInfo | null> {\n    try {\n      const url = new URL('/.well-known/nuwa-payment/info', baseUrl);\n      const fetchImpl = this.options.fetchImpl || (globalThis as any).fetch?.bind(globalThis);\n\n      if (!fetchImpl) {\n        this.logger.debug('No fetch implementation available');\n        return null;\n      }\n\n      const controller = new AbortController();\n      const timeout = this.options.timeout || 5000;\n      const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n      try {\n        const response = await fetchImpl(url.toString(), {\n          method: 'GET',\n          headers: {\n            Accept: 'application/json',\n            'User-Agent': 'nuwa-payment-kit/1.0.0',\n          },\n          signal: controller.signal,\n        });\n\n        clearTimeout(timeoutId);\n\n        if (response.ok) {\n          const contentType = response.headers.get('content-type');\n          if (contentType && contentType.includes('application/json')) {\n            const paymentInfo = (await response.json()) as NuwaPaymentInfo;\n\n            // Validate required fields\n            if (paymentInfo.serviceId && paymentInfo.serviceDid && paymentInfo.defaultAssetId) {\n              this.logger.debug('Found Nuwa payment info', {\n                serviceId: paymentInfo.serviceId,\n                serviceDid: paymentInfo.serviceDid,\n                defaultAssetId: paymentInfo.defaultAssetId,\n              });\n              return paymentInfo;\n            } else {\n              this.logger.warn('Invalid payment info format', { paymentInfo });\n            }\n          }\n        } else {\n          this.logger.debug('Well-known endpoint returned non-OK status', {\n            status: response.status,\n            statusText: response.statusText,\n          });\n        }\n      } catch (error) {\n        clearTimeout(timeoutId);\n        if (error instanceof Error && error.name === 'AbortError') {\n          this.logger.debug('Well-known endpoint request timed out');\n        } else {\n          this.logger.debug('Well-known endpoint request failed', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n    } catch (error) {\n      this.logger.debug('Failed to check well-known endpoint', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n\n    return null;\n  }\n\n  /**\n   * Get standard MCP server capabilities\n   * @param baseUrl - MCP server base URL\n   * @returns MCP capabilities or empty object if failed\n   */\n  private async getMcpCapabilities(baseUrl: string): Promise<EnhancedServerCapabilities> {\n    let mcpClient: McpClient | undefined;\n\n    try {\n      const transport = new StreamableHTTPClientTransport(new URL(baseUrl));\n      // Set protocol version to 2025-06-18 for compatibility with FastMCP 3.5.0, if supported by SDK\n      if (typeof (transport as any).setProtocolVersion === 'function') {\n        transport.setProtocolVersion('2025-06-18');\n      }\n      mcpClient = new McpClient({\n        name: 'nuwa-detector-client',\n        version: '1.0.0',\n      });\n\n      // Set timeout for connection\n      const controller = new AbortController();\n      const timeout = this.options.timeout || 5000;\n      const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n      try {\n        await mcpClient.connect(transport);\n        clearTimeout(timeoutId);\n\n        // Get server capabilities from the initialized connection\n        const capabilities = (mcpClient as any).serverCapabilities || {};\n\n        this.logger.debug('Retrieved MCP capabilities', { capabilities });\n        return capabilities;\n      } catch (error) {\n        clearTimeout(timeoutId);\n        throw error;\n      }\n    } catch (error) {\n      this.logger.debug('Failed to get MCP capabilities', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return {};\n    } finally {\n      if (mcpClient) {\n        try {\n          await mcpClient.close();\n        } catch (error) {\n          // Ignore close errors\n        }\n      }\n    }\n  }\n\n  /**\n   * Combine payment info and MCP capabilities to determine server type\n   * @param paymentInfo - Nuwa payment info if available\n   * @param mcpCapabilities - Standard MCP capabilities\n   * @returns Combined detection result\n   */\n  private combineCapabilities(\n    paymentInfo: NuwaPaymentInfo | null,\n    mcpCapabilities: EnhancedServerCapabilities\n  ): ServerDetectionResult {\n    const hasPaymentSupport = !!paymentInfo;\n    const serverType = hasPaymentSupport ? McpServerType.PAYMENT_ENABLED : McpServerType.STANDARD;\n\n    const enhancedCapabilities: EnhancedServerCapabilities = {\n      ...mcpCapabilities,\n      nuwa: {\n        payment: hasPaymentSupport\n          ? {\n              supported: true,\n              serviceId: paymentInfo!.serviceId,\n              serviceDid: paymentInfo!.serviceDid,\n              defaultAssetId: paymentInfo!.defaultAssetId,\n              basePath: paymentInfo!.basePath,\n              protocolVersion: paymentInfo!.protocolVersion,\n            }\n          : {\n              supported: false,\n            },\n        auth: {\n          supported: hasPaymentSupport, // Auth is typically required for payment\n          methods: hasPaymentSupport ? ['did-auth'] : [],\n        },\n        builtinTools: {\n          supported: hasPaymentSupport, // Built-in tools are part of payment protocol\n          tools: hasPaymentSupport\n            ? [\n                'nuwa.health',\n                'nuwa.discovery',\n                'nuwa.recovery',\n                'nuwa.admin.status',\n                'nuwa.subrav.query',\n              ]\n            : [],\n        },\n      },\n    };\n\n    return {\n      type: serverType,\n      capabilities: enhancedCapabilities,\n      paymentInfo: paymentInfo || undefined,\n      detectedAt: Date.now(),\n    };\n  }\n\n  /**\n   * Clear detection cache\n   */\n  clearCache(): void {\n    this.cache.clear();\n    this.logger.debug('Detection cache cleared');\n  }\n\n  /**\n   * Get cache size for debugging\n   */\n  getCacheSize(): number {\n    return this.cache.size;\n  }\n}\n","import type {\n  PaymentResult,\n  SubRAV,\n  SignedSubRAV,\n  PaymentInfo,\n  SerializableResponsePayload,\n  SerializableRequestPayload,\n  PaymentRequestPayload,\n} from '../../core/types';\nimport { PaymentChannelPayerClient } from '../../client/PaymentChannelPayerClient';\nimport { PaymentChannelFactory } from '../../factory/chainFactory';\nimport { DebugLogger, DIDAuth, type SignerInterface } from '@nuwa-ai/identity-kit';\nimport { PaymentState } from '../http/core/PaymentState';\nimport { HttpPaymentCodec } from '../../middlewares/http/HttpPaymentCodec';\nimport { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport {\n  createDefaultChannelRepo,\n  createDefaultTransactionStore,\n  createDefaultMappingStore,\n  createNamespacedMappingStore,\n  extractHost,\n} from '../http/internal/LocalStore';\nimport type { HostChannelMappingStore } from '../http/types';\nimport { RequestScheduler } from '../http/internal/RequestScheduler';\nimport { deriveChannelId } from '../../rooch/ChannelUtils';\nimport { serializeJson } from '../../utils/json';\nimport { McpChannelManager } from './McpChannelManager';\nimport { PaymentKitError } from '../../errors/PaymentKitError';\nimport type { ZodTypeAny } from 'zod';\nimport type { Tool, ToolCallOptions, ToolSet } from 'ai';\nimport { McpToolConverter } from './McpToolConverter';\n\n/**\n * CallToolResult type compatible with AI SDK's MCP implementation\n * This matches the exact structure used by AI SDK's createMCPClient\n * Based on: https://github.com/vercel/ai/blob/main/packages/ai/core/tool/mcp/types.ts\n */\ntype CallToolResult =\n  | {\n      content: Array<\n        | {\n            type: 'text';\n            text: string;\n          }\n        | {\n            type: 'image';\n            data: string; // base64 encoded\n            mimeType: string;\n          }\n        | {\n            type: 'resource';\n            resource: {\n              uri: string;\n              name?: string;\n              description?: string;\n              mimeType?: string;\n            } & (\n              | {\n                  text: string;\n                }\n              | {\n                  blob: string; // base64 encoded\n                }\n            );\n          }\n      >;\n      isError?: boolean;\n      _meta?: Record<string, unknown>;\n    }\n  | {\n      toolResult: unknown;\n      _meta?: Record<string, unknown>;\n    };\nimport {\n  HealthResponseSchema,\n  RecoveryResponse,\n  RecoveryResponseSchema,\n  type HealthResponse,\n} from '../../schema';\nimport type { ChainConfig } from '../../factory/chainFactory';\nimport type { TransactionStore } from '../../storage';\n\nexport interface McpPayerOptions {\n  baseUrl: string; // MCP server endpoint (e.g., http://localhost:8080/mcp)\n  signer: SignerInterface;\n  keyId: string;\n  debug?: boolean;\n  /** Chain configuration - required for payment channel operations */\n  chainConfig: ChainConfig;\n  /** Optional storage configuration. If not provided, uses in-memory storage */\n  storageOptions?: {\n    channelRepo?: any; // ChannelRepository interface\n    /** Namespace for storage keys (useful for multi-service scenarios) */\n    namespace?: string;\n  };\n  maxAmount: bigint;\n  /** Transaction logging */\n  transactionStore?: TransactionStore;\n  transactionLog?: {\n    enabled?: boolean;\n    persist?: 'memory' | 'indexeddb' | 'custom';\n    maxRecords?: number;\n    sanitizeRequest?: (\n      headers: Record<string, string>,\n      body?: any\n    ) => { headersSummary?: Record<string, string>; requestBodyHash?: string };\n  };\n  /** Optional mapping store for state persistence. If not provided, uses default store */\n  mappingStore?: HostChannelMappingStore;\n  /** Optional custom transport (e.g., PostMessage for iframe communication) */\n  customTransport?: Transport;\n}\n\nexport interface ListToolsOptions {\n  /** Whether to include nuwa built-in tools (default: false) */\n  includeBuiltinTools?: boolean;\n}\n\nexport class PaymentChannelMcpClient {\n  private payerClient: PaymentChannelPayerClient;\n  private options: McpPayerOptions;\n  private logger: DebugLogger;\n  private paymentState: PaymentState;\n  private mcpClient: McpClient | undefined;\n  private notificationsSubscribed = false;\n  private lastContents: any[] | undefined;\n  private lastPaymentPayload: SerializableResponsePayload | undefined;\n  private scheduler: RequestScheduler = new RequestScheduler();\n  private channelManager: McpChannelManager;\n  private transactionStore: TransactionStore;\n  private host: string;\n  private mappingStore: HostChannelMappingStore;\n\n  constructor(options: McpPayerOptions) {\n    this.options = options;\n    this.logger = DebugLogger.get('PaymentChannelMcpClient');\n    this.logger.setLevel(options.debug ? 'debug' : 'info');\n    this.paymentState = new PaymentState();\n\n    // Extract host for state persistence\n    this.host = extractHost(options.baseUrl);\n\n    // Setup mapping store for state persistence\n    const baseMapping = options.mappingStore || createDefaultMappingStore();\n    this.mappingStore = createNamespacedMappingStore(baseMapping, {\n      getPayerDid: async () => await options.signer.getDid(),\n    });\n\n    // Setup storage - use provided storage or default in-memory\n    let channelRepo;\n    if (options.storageOptions?.channelRepo) {\n      channelRepo = options.storageOptions.channelRepo;\n    } else {\n      // Use in-memory channel repo by default for MCP client\n      channelRepo = createDefaultChannelRepo();\n    }\n\n    this.payerClient = PaymentChannelFactory.createClient({\n      chainConfig: options.chainConfig,\n      signer: options.signer,\n      keyId: options.keyId,\n      storageOptions: {\n        channelRepo,\n      },\n    });\n    // Initialize transaction store (shared across HTTP/MCP if provided)\n    this.transactionStore = options.transactionStore || createDefaultTransactionStore();\n    // Initialize MCP ChannelManager\n    this.channelManager = new McpChannelManager({\n      baseUrl: options.baseUrl,\n      payerClient: this.payerClient,\n      paymentState: this.paymentState,\n      signer: options.signer,\n      keyId: options.keyId,\n      fetchImpl: (globalThis as any).fetch?.bind(globalThis),\n      mcpCall: async (name: string, params?: any) => {\n        const client = await this.ensureClient();\n        const res = await client.callTool({ name, arguments: params || {} });\n        return res;\n      },\n      autoRecover: false,\n    });\n\n    // Load persisted state asynchronously (don't block constructor)\n    void this.loadPersistedState();\n  }\n\n  /**\n   * Call a tool with payment processing and optional result validation\n   * @param method - The method to call\n   * @param params - The parameters to pass to the tool\n   * @param schema - Schema for validation\n   * @returns The result of the tool call\n   */\n  async call<T = any>(method: string, params?: any, schema?: ZodTypeAny): Promise<PaymentResult<T>>;\n\n  /**\n   * Call a tool with payment processing, custom clientTxRef, and optional result validation\n   * @param method - The method to call\n   * @param params - The parameters to pass to the tool\n   * @param options - Call options including clientTxRef and schema\n   * @returns The result of the tool call\n   */\n  async call<T = any>(\n    method: string,\n    params: any,\n    options: { clientTxRef: string; schema?: ZodTypeAny }\n  ): Promise<PaymentResult<T>>;\n\n  async call<T = any>(\n    method: string,\n    params?: any,\n    schemaOrOptions?: ZodTypeAny | { clientTxRef: string; schema?: ZodTypeAny }\n  ): Promise<PaymentResult<T>> {\n    let schema: ZodTypeAny | undefined;\n    let clientTxRef: string | undefined;\n\n    // Type-safe parameter parsing with proper type guards\n    if (\n      schemaOrOptions &&\n      typeof schemaOrOptions === 'object' &&\n      // Ensure it's not a Zod schema (Zod schemas have a 'safeParse' function)\n      !(\n        typeof (schemaOrOptions as any).safeParse === 'function' ||\n        typeof (schemaOrOptions as any).parse === 'function'\n      ) &&\n      'clientTxRef' in schemaOrOptions\n    ) {\n      // Options object pattern: call(method, params, { clientTxRef: 'xxx', schema: ... })\n      clientTxRef = schemaOrOptions.clientTxRef;\n      schema = schemaOrOptions.schema;\n    } else {\n      // Simple schema pattern: call(method, params, schema)\n      schema = schemaOrOptions as ZodTypeAny | undefined;\n    }\n\n    const { content, payment } = await this.callToolWithPayment(method, params, clientTxRef);\n    const raw = this.parseFirstJsonText<any>(content);\n    let data = undefined;\n    if (schema) {\n      try {\n        data = schema.parse(raw);\n      } catch (e) {\n        this.logger.warn('Failed to parse response', {\n          cause: e,\n          raw,\n          schema,\n        });\n        throw new PaymentKitError('RESPONSE_PARSE_ERROR', 'Failed to parse response', 500, {\n          cause: e,\n          raw,\n          schema,\n        });\n      }\n    } else {\n      data = raw as T;\n    }\n    return { data, payment };\n  }\n\n  /**\n   * Call a tool and return the content of the tool call\n   * @param name - The name of the tool to call\n   * @param args - The parameters to pass to the tool\n   * @returns The content of the tool call\n   */\n  async callTool(name: string, args?: any): Promise<{ content: any[] }>;\n\n  /**\n   * Call a tool with custom clientTxRef and return the content of the tool call\n   * @param name - The name of the tool to call\n   * @param args - The parameters to pass to the tool\n   * @param options - Call options including clientTxRef\n   * @returns The content of the tool call\n   */\n  async callTool(\n    name: string,\n    args: any,\n    options: { clientTxRef: string }\n  ): Promise<{ content: any[] }>;\n\n  async callTool(\n    name: string,\n    args?: any,\n    optionsOrClientTxRef?: { clientTxRef: string } | string\n  ): Promise<{ content: any[] }> {\n    let clientTxRef: string | undefined;\n\n    // Type-safe parameter parsing\n    if (typeof optionsOrClientTxRef === 'string') {\n      // Backward compatibility: support callTool(name, args, clientTxRef) usage pattern\n      clientTxRef = optionsOrClientTxRef;\n    } else if (\n      optionsOrClientTxRef &&\n      typeof optionsOrClientTxRef === 'object' &&\n      'clientTxRef' in optionsOrClientTxRef\n    ) {\n      // New pattern: callTool(name, args, { clientTxRef: 'xxx' })\n      clientTxRef = optionsOrClientTxRef.clientTxRef;\n    }\n\n    const { content } = await this.callToolWithPayment(name, args, clientTxRef);\n    return { content };\n  }\n\n  /**\n   * List prompts exposed by the server (FREE, no payment).\n   */\n  async listPrompts(): Promise<any> {\n    const client = await this.ensureClient();\n    if (typeof client.listPrompts === 'function') {\n      return await client.listPrompts();\n    }\n    // Fallback: some clients expose prompts()\n    if (typeof client.prompts === 'function') {\n      return await client.prompts();\n    }\n    return {};\n  }\n\n  /**\n   * Load a prompt by name and return string content (FREE, no payment).\n   */\n  async loadPrompt(name: string, args?: any): Promise<string> {\n    const client = await this.ensureClient();\n    if (typeof client.getPrompt === 'function') {\n      const res = await client.getPrompt({ name, arguments: args || {} });\n      return this.extractStringFromPromptResult(res);\n    }\n    // Fallback shape (AI-SDK style): tools().prompt.execute\n    if (typeof client.prompts === 'function') {\n      const prompts = await client.prompts();\n      const p = prompts?.[name];\n      if (p && typeof p.load === 'function') {\n        const out = await p.load(args || {});\n        return typeof out === 'string' ? out : JSON.stringify(out);\n      }\n    }\n    throw new Error(`Prompt '${name}' not available`);\n  }\n\n  /**\n   * List resources (FREE, no payment).\n   */\n  async listResources(): Promise<any[]> {\n    const client = await this.ensureClient();\n    if (typeof client.listResources === 'function') {\n      return await client.listResources();\n    }\n    return [];\n  }\n\n  /**\n   * List resource templates (FREE, no payment).\n   */\n  async listResourceTemplates(): Promise<any[]> {\n    const client = await this.ensureClient();\n    if (typeof client.listResourceTemplates === 'function') {\n      return await client.listResourceTemplates();\n    }\n    return [];\n  }\n\n  /**\n   * Read a resource. Accepts either uri string or parameter object.\n   */\n  async readResource(params: string | { uri: string; [key: string]: any }): Promise<any> {\n    const client = await this.ensureClient();\n    const p = typeof params === 'string' ? { uri: params } : params;\n    if (typeof client.readResource === 'function') {\n      const res = await client.readResource(p);\n      return this.normalizeResourceResult(res);\n    }\n    throw new Error('readResource not supported by underlying MCP client');\n  }\n\n  /**\n   * Returns tools exposed by the server with internal parameters filtered out for public consumption.\n   * @param options - Options for filtering tools, or boolean for backward compatibility\n   */\n  async listTools(options?: ListToolsOptions): Promise<Record<string, any>> {\n    const raw = await this.listToolsInternal();\n    const sanitized = this.sanitizeTools(raw);\n\n    const { includeBuiltinTools = false } = options || {};\n    return includeBuiltinTools ? sanitized : this.filterBuiltinTools(sanitized);\n  }\n\n  /**\n   * Internal listTools that returns server's raw schemas (may include SDK-internal parameters like __nuwa_auth and __nuwa_payment).\n   */\n  private async listToolsInternal(): Promise<any> {\n    const client = await this.ensureClient();\n    if (typeof client.listTools === 'function') {\n      return await client.listTools();\n    }\n    return {};\n  }\n\n  /** Remove SDK-internal parameters from tool schemas (e.g., __nuwa_auth, __nuwa_payment). */\n  private sanitizeTools(tools: any): any {\n    const sanitizeSchema = (schema: any) => {\n      try {\n        if (!schema || typeof schema !== 'object') return schema;\n        const out: any = { ...schema };\n        const props = (schema as any).properties;\n        if (props && typeof props === 'object') {\n          const filtered: Record<string, any> = {};\n          for (const [k, v] of Object.entries(props)) {\n            if (typeof k === 'string' && k.startsWith('__nuwa')) continue;\n            filtered[k] = v;\n          }\n          out.properties = filtered;\n          if (Array.isArray(out.required)) {\n            out.required = out.required.filter(\n              (k: any) => typeof k !== 'string' || !k.startsWith('__nuwa')\n            );\n          }\n        }\n        return out;\n      } catch {\n        return schema;\n      }\n    };\n\n    const sanitizeTool = (t: any) => {\n      const inputSchemaKey = t?.inputSchema\n        ? 'inputSchema'\n        : t?.parameters\n          ? 'parameters'\n          : t?.input_schema\n            ? 'input_schema'\n            : undefined;\n      if (!inputSchemaKey) return t;\n      const copy = { ...t };\n      copy[inputSchemaKey] = sanitizeSchema(t[inputSchemaKey]);\n      return copy;\n    };\n\n    try {\n      if (tools && Array.isArray((tools as any).tools)) {\n        return { tools: (tools as any).tools.map(sanitizeTool) };\n      }\n      if (Array.isArray(tools)) {\n        return (tools as any).map(sanitizeTool);\n      }\n      if (tools && typeof tools === 'object') {\n        const out: Record<string, any> = {};\n        for (const [name, v] of Object.entries(tools as Record<string, any>)) {\n          out[name] = sanitizeTool({ name, ...(v as any) });\n        }\n        return out;\n      }\n    } catch {}\n    return tools;\n  }\n\n  /** Filter out nuwa built-in tools that are not useful for AI consumption */\n  private filterBuiltinTools(tools: any): any {\n    const isBuiltinTool = (toolName: string): boolean => {\n      return typeof toolName === 'string' && toolName.startsWith('nuwa.');\n    };\n\n    try {\n      if (tools && Array.isArray((tools as any).tools)) {\n        // Handle { tools: [...] } format\n        const filtered = (tools as any).tools.filter((tool: any) => {\n          return !(tool && typeof tool === 'object' && tool.name && isBuiltinTool(tool.name));\n        });\n        return { tools: filtered };\n      }\n      if (Array.isArray(tools)) {\n        // Handle [...] format\n        return (tools as any).filter((tool: any) => {\n          return !(tool && typeof tool === 'object' && tool.name && isBuiltinTool(tool.name));\n        });\n      }\n      if (tools && typeof tools === 'object') {\n        // Handle { toolName: toolDef, ... } format\n        const filtered: Record<string, any> = {};\n        for (const [name, toolDef] of Object.entries(tools as Record<string, any>)) {\n          if (!isBuiltinTool(name)) {\n            filtered[name] = toolDef;\n          }\n        }\n        return filtered;\n      }\n    } catch {}\n    return tools;\n  }\n\n  /**\n   * Call a tool with payment\n   * @param method - The name of the tool to call\n   * @param params - The parameters to pass to the tool\n   * @param clientTxRef - Optional custom client transaction reference. If not provided, a UUID will be generated\n   * @returns The content of the tool call and the payment info\n   */\n  async callToolWithPayment(\n    method: string,\n    params?: any,\n    clientTxRef?: string\n  ): Promise<{ content: any[]; payment?: PaymentInfo }> {\n    const handle = this.scheduler.enqueue(async (_release, signal) => {\n      const startTs = Date.now();\n      let createdLog = false;\n      const txEnabled = this.options.transactionLog?.enabled !== false;\n      if (signal.aborted) throw new Error('Request aborted');\n      const txRef = clientTxRef || crypto.randomUUID();\n      const client = await this.ensureClient();\n      if (signal.aborted) throw new Error('Request aborted');\n      await this.ensureNotificationSubscription();\n      // Skip ensureChannelReady for info/free tools to avoid recursive recovery loops\n      const infoTools = new Set([\n        'nuwa.health',\n        'nuwa.discovery',\n        'nuwa.recovery',\n        'nuwa.admin.status',\n        'nuwa.subrav.query',\n      ]);\n      if (!infoTools.has(method)) {\n        await this.ensureChannelReady();\n      }\n      if (signal.aborted) throw new Error('Request aborted');\n\n      const reqParams = await this.buildParams(method, params, txRef);\n\n      // Create transaction log entry\n      if (txEnabled) {\n        try {\n          await this.logTransactionCreate(txRef, method, reqParams);\n          createdLog = true;\n        } catch (e) {\n          this.logger.debug('txlog.create.failed', e);\n        }\n      }\n      let result = await client.callTool({ name: method, arguments: reqParams });\n\n      let content: any[] = [];\n      let paymentPayload: SerializableResponsePayload | undefined;\n      this.lastContents = undefined;\n      if (\n        result &&\n        typeof result === 'object' &&\n        (result as any).content &&\n        Array.isArray((result as any).content)\n      ) {\n        const parsed = this.extractPaymentFromContents((result as any).content as any[]);\n        content = parsed.clean;\n        paymentPayload = parsed.payload;\n      }\n\n      const maybePayment = paymentPayload;\n      // Unified retry: when server indicates PAYMENT_REQUIRED with unsignedSubRAV, sign and retry once\n      if (maybePayment && maybePayment.error?.code === 'PAYMENT_REQUIRED' && maybePayment.subRav) {\n        try {\n          this.logger.debug('retry call', {\n            method,\n            clientTxRef: txRef,\n          });\n          const subRav = HttpPaymentCodec.deserializeSubRAV(maybePayment.subRav);\n          const signed = await this.payerClient.signSubRAV(subRav);\n          const retryParams = await this.buildParams(method, params, txRef);\n          const newReqPayload: PaymentRequestPayload = {\n            version: 1,\n            clientTxRef: txRef,\n            maxAmount: this.options.maxAmount,\n            signedSubRav: signed,\n          };\n          retryParams.__nuwa_payment = HttpPaymentCodec.toJSONRequest(newReqPayload);\n          result = await client.callTool({ name: method, arguments: retryParams });\n          if (\n            result &&\n            typeof result === 'object' &&\n            (result as any).content &&\n            Array.isArray((result as any).content)\n          ) {\n            const parsed2 = this.extractPaymentFromContents((result as any).content as any[]);\n            content = parsed2.clean;\n            paymentPayload = parsed2.payload;\n          }\n        } catch {\n          this.logger.debug('retry call failed', {\n            method,\n            clientTxRef: txRef,\n          });\n        }\n      }\n\n      // If payment still indicates an error at this point, throw a structured error\n      if (paymentPayload && paymentPayload.error) {\n        const err = paymentPayload.error as { code?: string; message?: string };\n        const svc = paymentPayload.serviceTxRef;\n        const cRef = paymentPayload.clientTxRef ?? txRef;\n        const code = err?.code || 'PAYMENT_ERROR';\n        const message = err?.message || 'Payment negotiation failed';\n        const details = { code, message, clientTxRef: cRef, serviceTxRef: svc } as any;\n        this.logger.debug('payment error', {\n          method,\n          clientTxRef: cRef,\n          serviceTxRef: svc,\n          paymentPayload,\n        });\n        const errObj = new PaymentKitError(code, message, 402, details);\n        if (txEnabled && createdLog) {\n          try {\n            const durationMs = Date.now() - startTs;\n            await this.transactionStore.update(cRef, {\n              durationMs,\n              status: 'error',\n              errorCode: code,\n              errorMessage: message,\n            });\n          } catch (e) {\n            this.logger.debug('txlog.update.error', e);\n          }\n        }\n        throw errObj;\n      }\n\n      const paymentInfo = await this.toPaymentInfoFromPayload(paymentPayload, txRef);\n      if (txEnabled && createdLog) {\n        try {\n          const durationMs = Date.now() - startTs;\n          if (paymentInfo) {\n            await this.transactionStore.update(paymentInfo.clientTxRef, {\n              durationMs,\n              status: 'paid',\n              payment: {\n                cost: paymentInfo.cost,\n                costUsd: paymentInfo.costUsd,\n                nonce: paymentInfo.nonce,\n                serviceTxRef: paymentInfo.serviceTxRef,\n              },\n              vmIdFragment: paymentInfo.vmIdFragment,\n            });\n          } else {\n            await this.transactionStore.update(txRef, {\n              durationMs,\n              status: 'free',\n            });\n          }\n        } catch (e) {\n          this.logger.debug('txlog.update.error', e);\n        }\n      }\n      return { content, payment: paymentInfo } as { content: any[]; payment?: PaymentInfo };\n    });\n    return await handle.promise;\n  }\n\n  getLastContents(): any[] | undefined {\n    return this.lastContents;\n  }\n\n  getLastPaymentPayload(): SerializableResponsePayload | undefined {\n    return this.lastPaymentPayload;\n  }\n\n  getPendingSubRAV(): SubRAV | null {\n    return this.paymentState.getPendingSubRAV() || null;\n  }\n\n  clearPendingSubRAV(): void {\n    this.paymentState.clearPendingSubRAV();\n    // Persist state when SubRAV is cleared\n    void this.persistClientState();\n  }\n\n  private parseFirstJsonText<T>(content: any[]): T | undefined {\n    const dataItem = Array.isArray(content)\n      ? content.find((c: any) => c?.type === 'text') || content[0]\n      : undefined;\n    if (dataItem && dataItem.type === 'text' && typeof dataItem.text === 'string') {\n      try {\n        return JSON.parse(dataItem.text) as T;\n      } catch {\n        return dataItem.text as any;\n      }\n    }\n    return undefined;\n  }\n\n  // Schema should be provided by call sites for strong typing, no internal mapping\n\n  private async buildParams(method: string, userParams: any, clientTxRef: string) {\n    const payerDid = await this.options.signer.getDid();\n    const signedSubRav = await this.buildSignedSubRavIfNeeded();\n    const reqPayload: PaymentRequestPayload = {\n      version: 1,\n      clientTxRef,\n      maxAmount: this.options.maxAmount,\n      signedSubRav: signedSubRav || undefined,\n    };\n    const payment: SerializableRequestPayload = HttpPaymentCodec.toJSONRequest(reqPayload);\n    const __nuwa_auth = await this.generateAuthToken(payerDid, method, clientTxRef);\n    const params = { ...(userParams || {}), __nuwa_auth, __nuwa_payment: payment };\n    try {\n      this.logger.debug?.('mcp.buildParams', {\n        method,\n        clientTxRef,\n        hasAuth: typeof __nuwa_auth === 'string' && __nuwa_auth.length > 0,\n        hasPayment: !!payment,\n        signedSubRav,\n      } as any);\n    } catch {}\n    // Normalize BigInt and other non-JSON-native types using lossless-json, then parse back\n    return JSON.parse(serializeJson(params));\n  }\n\n  private async buildSignedSubRavIfNeeded(): Promise<SignedSubRAV | undefined> {\n    const pending = this.paymentState.getPendingSubRAV();\n    if (!pending) return undefined;\n    this.paymentState.clearPendingSubRAV();\n    // Persist state when SubRAV is cleared for signing\n    void this.persistClientState();\n    return this.payerClient.signSubRAV(pending);\n  }\n\n  private async generateAuthToken(\n    payerDid: string,\n    method: string,\n    clientTxRef: string\n  ): Promise<string> {\n    // Ensure we have a concrete keyId\n    const keyId = this.options.keyId;\n    this.logger.debug('generateAuthToken', {\n      payerDid,\n      method,\n      clientTxRef,\n      keyId,\n    });\n    const signedObject = await DIDAuth.v1.createSignature(\n      {\n        operation: 'mcp_tool_call',\n        params: { tool: method, clientTxRef },\n      },\n      this.options.signer,\n      keyId\n    );\n    return DIDAuth.v1.toAuthorizationHeader(signedObject);\n  }\n\n  private async ensureChannelReady(): Promise<void> {\n    try {\n      await this.channelManager.ensureChannelReady();\n    } catch (e) {\n      this.logger.debug('ensureChannelReady failed:', e);\n      throw e instanceof Error ? e : new Error(String(e));\n    }\n  }\n\n  private async ensureClient(): Promise<any> {\n    if (this.mcpClient) return this.mcpClient;\n    if (!this.options.baseUrl) {\n      throw new Error('MCP baseUrl is required to create client');\n    }\n\n    // Use custom transport if provided, otherwise use HTTP transport\n    let transport: Transport;\n    if (this.options.customTransport) {\n      transport = this.options.customTransport;\n    } else {\n      const httpTransport = new StreamableHTTPClientTransport(new URL(this.options.baseUrl));\n      // Set protocol version to 2025-06-18 for compatibility with FastMCP 3.5.0, if supported by SDK\n      if (typeof (httpTransport as any).setProtocolVersion === 'function') {\n        httpTransport.setProtocolVersion('2025-06-18');\n      }\n      transport = httpTransport;\n    }\n\n    this.mcpClient = new McpClient({\n      name: 'nuwa-payment-kit-client',\n      version: '1.0.0',\n    });\n    await this.mcpClient.connect(transport);\n    const tools = await this.mcpClient.listTools();\n    this.logger.debug('mcp.ensureClient', {\n      baseUrl: this.options.baseUrl,\n      tools,\n    });\n    return this.mcpClient;\n  }\n\n  private async ensureNotificationSubscription(): Promise<void> {\n    // Placeholder for future resources/subscribe implementation.\n    // Tool streaming is not supported; do not subscribe to tool notifications.\n    return;\n  }\n\n  private async toPaymentInfoFromPayload(\n    payload: SerializableResponsePayload | undefined,\n    clientTxRef: string\n  ): Promise<PaymentInfo | undefined> {\n    if (!payload) return undefined;\n    try {\n      const decoded = HttpPaymentCodec.fromJSONResponse(payload);\n      if (decoded.subRav) {\n        this.paymentState.setPendingSubRAV(decoded.subRav);\n        // Persist state when SubRAV is updated\n        void this.persistClientState();\n      }\n      if (decoded.error || decoded.cost === undefined || !decoded.subRav) return undefined;\n      const channelInfo = this.paymentState.getChannelInfo();\n      const assetId = channelInfo?.assetId ?? 'unknown';\n      return {\n        clientTxRef: decoded.clientTxRef ?? clientTxRef,\n        serviceTxRef: decoded.serviceTxRef,\n        cost: decoded.cost,\n        costUsd: decoded.costUsd ?? BigInt(0),\n        nonce: decoded.subRav.nonce,\n        channelId: decoded.subRav.channelId,\n        vmIdFragment: decoded.subRav.vmIdFragment,\n        assetId: assetId,\n        timestamp: new Date().toISOString(),\n      };\n    } catch {\n      return undefined;\n    }\n  }\n\n  /** Single-pass extractor: separates payment resource and returns clean contents */\n  private extractPaymentFromContents(contents: any[]): {\n    clean: any[];\n    payload?: SerializableResponsePayload;\n  } {\n    if (!Array.isArray(contents)) return { clean: [], payload: undefined };\n    let payload: SerializableResponsePayload | undefined;\n    const clean: any[] = [];\n    for (const c of contents) {\n      const isPayment =\n        c &&\n        c.type === 'resource' &&\n        c.resource &&\n        (c.resource.uri === HttpPaymentCodec.MCP_PAYMENT_URI ||\n          c.resource.mimeType === HttpPaymentCodec.MCP_PAYMENT_MIME);\n      if (isPayment) {\n        try {\n          const text = c?.resource?.text;\n          if (typeof text === 'string') payload = JSON.parse(text) as SerializableResponsePayload;\n        } catch {}\n        continue;\n      }\n      clean.push(c);\n    }\n    // Track last payment payload and last contents (clean) for debugging/tests\n    this.lastPaymentPayload = payload;\n    this.lastContents = clean;\n    return { clean, payload };\n  }\n\n  getPayerClient(): PaymentChannelPayerClient {\n    return this.payerClient;\n  }\n\n  getTransactionStore(): TransactionStore {\n    return this.transactionStore;\n  }\n\n  private extractStringFromPromptResult(res: any): string {\n    if (typeof res === 'string') return res;\n    if (res && typeof res === 'object') {\n      // Try common shapes\n      if (Array.isArray(res.content)) {\n        const textItem = res.content.find((c: any) => c?.type === 'text');\n        if (textItem?.text) return String(textItem.text);\n      }\n      if (typeof res.text === 'string') return res.text;\n    }\n    try {\n      return JSON.stringify(res);\n    } catch {\n      return String(res);\n    }\n  }\n\n  private normalizeResourceResult(\n    res: any\n  ): { text?: string; blob?: any; mimeType?: string } | any {\n    try {\n      if (typeof res === 'string') return { text: res };\n      if (res && typeof res === 'object') {\n        if (typeof res.text === 'string')\n          return { text: res.text, mimeType: (res as any).mimeType };\n        if (res.type === 'text' && typeof res.text === 'string') return { text: res.text };\n        const contents = (res as any).contents || (res as any).content;\n        if (Array.isArray(contents)) {\n          const textItem = contents.find(\n            (c: any) => c?.type === 'text' && typeof c.text === 'string'\n          );\n          if (textItem) return { text: String(textItem.text), mimeType: textItem.mimeType };\n          const anyItem = contents[0];\n          if (anyItem && (anyItem.blob || anyItem.data)) {\n            return { blob: anyItem.blob || anyItem.data, mimeType: anyItem.mimeType };\n          }\n        }\n      }\n    } catch {}\n    return res;\n  }\n\n  private async logTransactionCreate(\n    clientTxRef: string,\n    method: string,\n    reqParams?: any\n  ): Promise<void> {\n    if (this.options.transactionLog?.enabled === false) return;\n    const headersSummary: Record<string, string> = {\n      tool: String(method),\n    };\n    try {\n      const hasAuth = !!reqParams?.__nuwa_auth;\n      const hasPayment = !!reqParams?.__nuwa_payment;\n      const hasSignedSubRav = !!reqParams?.__nuwa_payment?.signedSubRav;\n      headersSummary['hasAuth'] = String(hasAuth);\n      headersSummary['hasPayment'] = String(hasPayment);\n      headersSummary['hasSignedSubRav'] = String(hasSignedSubRav);\n    } catch {}\n\n    let requestBodyHash: string | undefined = undefined;\n    try {\n      const sanitize = this.options.transactionLog?.sanitizeRequest;\n      if (sanitize) {\n        const sanitized = sanitize(headersSummary, reqParams);\n        if (sanitized?.headersSummary) {\n          Object.assign(headersSummary, sanitized.headersSummary);\n        }\n        requestBodyHash = sanitized?.requestBodyHash;\n      }\n    } catch {}\n\n    const channelId = this.paymentState.getChannelId();\n    const vmIdFragment = this.paymentState.getVmIdFragment();\n    const assetId = this.channelManager.getDefaultAssetId() || 'unknown';\n\n    await this.transactionStore.create({\n      clientTxRef,\n      timestamp: Date.now(),\n      protocol: 'mcp',\n      urlOrTarget: this.options.baseUrl,\n      operation: `tool:${method}`,\n      headersSummary,\n      requestBodyHash,\n      stream: false,\n      channelId: channelId,\n      vmIdFragment: vmIdFragment,\n      assetId: assetId,\n      status: 'pending',\n    });\n  }\n\n  async healthCheck(): Promise<HealthResponse> {\n    const res = await this.call<HealthResponse>('nuwa.health', undefined, HealthResponseSchema);\n    return res.data;\n  }\n\n  async recoverFromService(): Promise<RecoveryResponse> {\n    const res = await this.call<RecoveryResponse>(\n      'nuwa.recovery',\n      undefined,\n      RecoveryResponseSchema\n    );\n    return res.data;\n  }\n\n  async commitSubRAV(signedSubRAV: SignedSubRAV): Promise<{ success: true }> {\n    await this.channelManager.commitSubRAV(signedSubRAV);\n    return { success: true };\n  }\n\n  /**\n   * Get tools in AI SDK compatible format\n   * This method provides compatibility with AI SDK's streamText function\n   * @param options - Options for filtering tools, or boolean for backward compatibility\n   * @returns A record of tool definitions compatible with AI SDK\n   */\n  async tools(options?: ListToolsOptions): Promise<ToolSet> {\n    const rawTools = await this.listTools(options);\n    const aiSdkTools: ToolSet = {};\n\n    // Convert MCP tool format to AI SDK tool format\n    if (rawTools && typeof rawTools === 'object') {\n      if (Array.isArray(rawTools.tools)) {\n        // Handle { tools: [...] } format\n        for (const tool of rawTools.tools) {\n          if (tool && typeof tool === 'object' && tool.name) {\n            aiSdkTools[tool.name] = McpToolConverter.convertToAiSdkFormat(\n              tool,\n              async (args: any, options?: ToolCallOptions) => {\n                // Use AI SDK's toolCallId as clientTxRef\n                const clientTxRef = options?.toolCallId;\n                const { content, payment: _ } = await this.callToolWithPayment(\n                  tool.name,\n                  args,\n                  clientTxRef\n                );\n                // We don't return the payment here, because the AI do not need to know about it\n                return { content };\n              }\n            );\n          }\n        }\n      } else if (Array.isArray(rawTools)) {\n        // Handle [...] format\n        for (const tool of rawTools) {\n          if (tool && typeof tool === 'object' && tool.name) {\n            aiSdkTools[tool.name] = McpToolConverter.convertToAiSdkFormat(\n              tool,\n              async (args: any, options?: ToolCallOptions) => {\n                // Use AI SDK's toolCallId as clientTxRef\n                const clientTxRef = options?.toolCallId;\n                const { content, payment: _ } = await this.callToolWithPayment(\n                  tool.name,\n                  args,\n                  clientTxRef\n                );\n                // We don't return the payment here, because the AI do not need to know about it\n                return { content };\n              }\n            );\n          }\n        }\n      } else {\n        // Handle { toolName: toolDef, ... } format\n        for (const [name, toolDef] of Object.entries(rawTools)) {\n          if (toolDef && typeof toolDef === 'object') {\n            const tool = { name, ...(toolDef as any) };\n            aiSdkTools[name] = McpToolConverter.convertToAiSdkFormat(\n              tool,\n              async (args: any, options?: ToolCallOptions) => {\n                // Use AI SDK's toolCallId as clientTxRef\n                const clientTxRef = options?.toolCallId;\n                const { content, payment: _ } = await this.callToolWithPayment(\n                  tool.name,\n                  args,\n                  clientTxRef\n                );\n                // We don't return the payment here, because the AI do not need to know about it\n                return { content };\n              }\n            );\n          }\n        }\n      }\n    }\n\n    return aiSdkTools;\n  }\n\n  /**\n   * Close the MCP client connection and clean up resources\n   */\n  async close(): Promise<void> {\n    try {\n      // Persist final state before closing\n      await this.persistClientState();\n\n      // Close the underlying MCP client connection\n      if (this.mcpClient) {\n        await this.mcpClient.close();\n        this.mcpClient = undefined;\n      }\n\n      // Note: RequestScheduler doesn't have a cancelAll method\n      // Individual requests will be cancelled when the MCP client closes\n\n      // Clear cached data\n      this.lastContents = undefined;\n      this.lastPaymentPayload = undefined;\n\n      // Reset notification subscription state\n      this.notificationsSubscribed = false;\n\n      this.logger.debug('PaymentChannelMcpClient closed successfully');\n    } catch (error) {\n      this.logger.warn('Error during close:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Load persisted state from storage\n   */\n  private async loadPersistedState(): Promise<void> {\n    try {\n      const state = await this.mappingStore.getState(this.host);\n      if (state) {\n        this.paymentState.loadPersistedState(state);\n        this.logger.debug('Loaded persisted state for host:', this.host);\n      }\n    } catch (error) {\n      this.logger.debug('Failed to load persisted state:', error);\n    }\n  }\n\n  /**\n   * Persist current client state to storage\n   */\n  private async persistClientState(): Promise<void> {\n    try {\n      const state = this.paymentState.getPersistedState();\n      await this.mappingStore.setState(this.host, state);\n      this.logger.debug('Persisted client state for host:', this.host);\n    } catch (error) {\n      this.logger.debug('Failed to persist client state:', error);\n    }\n  }\n\n  /**\n   * Clear persisted state (useful for logout/cleanup)\n   */\n  async clearPersistedState(): Promise<void> {\n    try {\n      await this.mappingStore.deleteState(this.host);\n      this.paymentState.reset();\n      this.logger.debug('Cleared persisted state for host:', this.host);\n    } catch (error) {\n      this.logger.debug('Failed to clear persisted state:', error);\n    }\n  }\n}\n","import { DebugLogger, DIDAuth } from '@nuwa-ai/identity-kit';\nimport type { PaymentChannelPayerClient } from '../../client/PaymentChannelPayerClient';\nimport { PaymentState } from '../http/core/PaymentState';\nimport type { SignedSubRAV } from '../../core/types';\nimport { HttpPaymentCodec } from '../../middlewares/http/HttpPaymentCodec';\nimport type { RecoveryResponse, DiscoveryResponse } from '../../schema';\n\nexport interface McpChannelManagerOptions {\n  baseUrl: string;\n  payerClient: PaymentChannelPayerClient;\n  paymentState: PaymentState;\n  signer: any;\n  keyId?: string;\n  payerDid?: string;\n  fetchImpl?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n  /** Minimal MCP caller used for service-side operations */\n  mcpCall: (name: string, params?: any) => Promise<any>;\n  /** Whether to attempt server-side recovery inside ensureChannelReady */\n  autoRecover?: boolean;\n}\n\n/**\n * McpChannelManager replicates the lifecycle logic of the HTTP ChannelManager\n * but uses MCP tools for recovery/commit, and HTTP well-known for discovery.\n */\nexport class McpChannelManager {\n  private readonly options: McpChannelManagerOptions;\n  private readonly logger: DebugLogger;\n  private cachedDiscovery?: DiscoveryResponse;\n  private discoveredBasePath?: string;\n  private ensureReadyPromise?: Promise<void>;\n  private payeeDid?: string;\n  private defaultAssetId?: string;\n\n  constructor(options: McpChannelManagerOptions) {\n    this.options = options;\n    this.logger = DebugLogger.get('McpChannelManager');\n  }\n\n  async ensureChannelReady(): Promise<void> {\n    if (!this.ensureReadyPromise) {\n      this.ensureReadyPromise = this.doEnsureChannelReady().finally(() => {\n        this.ensureReadyPromise = undefined;\n      });\n    }\n    await this.ensureReadyPromise;\n  }\n\n  private async doEnsureChannelReady(): Promise<void> {\n    // 1) Ensure key fragment present\n    await this.ensureKeyFragmentPresent();\n\n    // 2) Validate existing channel or recover\n    let channelId = this.options.paymentState.getChannelId();\n    if (channelId) {\n      try {\n        const info = await this.options.payerClient.getChannelInfo(channelId);\n        this.options.paymentState.setChannelInfo(info);\n      } catch (e) {\n        this.logger.debug('Persisted channel not found, clearing and recovering:', e);\n        this.options.paymentState.setChannelId(undefined);\n        this.options.paymentState.setChannelInfo(undefined);\n        channelId = undefined;\n      }\n    }\n\n    if (!channelId) {\n      // Do not auto-recover here; directly create a new channel\n      await this.createNewChannel();\n      channelId = this.options.paymentState.getChannelId();\n    }\n\n    // 3) Ensure sub-channel exists/authorized\n    const vmIdFragment = this.options.paymentState.getVmIdFragment();\n    if (channelId && vmIdFragment) {\n      try {\n        const subInfo = await this.options.payerClient.getSubChannelInfo(channelId, vmIdFragment);\n        this.options.paymentState.setSubChannelInfo(subInfo);\n      } catch {\n        // Do not auto-recover here; directly attempt authorization\n        this.logger.debug('ensureChannelReady: subChannel missing, authorizing directly');\n        await this.directAuthorizeSubChannel();\n      }\n    }\n  }\n\n  private async createNewChannel(): Promise<void> {\n    if (!this.payeeDid) {\n      const service = await this.discoverService();\n      this.payeeDid = service.serviceDid;\n    }\n    if (!this.defaultAssetId) {\n      const service = await this.discoverService();\n      this.defaultAssetId = service.defaultAssetId;\n    }\n    this.logger.debug('createNewChannel: opening new channel', {\n      payeeDid: this.payeeDid,\n      defaultAssetId: this.defaultAssetId,\n    } as any);\n    if (!this.payeeDid || !this.defaultAssetId) {\n      this.logger.debug('createNewChannel: missing payeeDid, cannot create channel');\n      throw new Error('payeeDid or defaultAssetId missing for channel creation');\n    }\n    try {\n      const opened = await this.options.payerClient.openChannelWithSubChannel({\n        payeeDid: this.payeeDid,\n        assetId: this.defaultAssetId,\n      });\n      this.options.paymentState.setChannelId(opened.channelId);\n      if (opened.channelInfo) this.options.paymentState.setChannelInfo(opened.channelInfo);\n      if (opened.subChannelInfo) this.options.paymentState.setSubChannelInfo(opened.subChannelInfo);\n      this.logger.debug('createNewChannel: channel opened', { channelId: opened.channelId } as any);\n    } catch (err) {\n      this.logger.debug('createNewChannel: openChannelWithSubChannel failed', err);\n      throw err;\n    }\n  }\n\n  private async ensureKeyFragmentPresent(): Promise<void> {\n    if (this.options.paymentState.getKeyId() && this.options.paymentState.getVmIdFragment()) return;\n    let keyId = this.options.keyId;\n    if (!keyId && this.options.signer?.listKeyIds) {\n      try {\n        const ids: string[] = await this.options.signer.listKeyIds();\n        keyId = Array.isArray(ids) && ids.length > 0 ? ids[0] : undefined;\n      } catch {}\n    }\n    if (keyId) {\n      const parts = keyId.split('#');\n      const frag = parts.length > 1 ? parts[1] : undefined;\n      if (frag) this.options.paymentState.setKeyInfo(keyId, frag);\n    }\n    if (!this.options.paymentState.getKeyId() || !this.options.paymentState.getVmIdFragment()) {\n      throw new Error('No keyId found');\n    }\n  }\n\n  async discoverService(): Promise<DiscoveryResponse> {\n    if (!this.cachedDiscovery) {\n      await this.performDiscovery();\n    }\n    if (this.cachedDiscovery) return this.cachedDiscovery;\n    throw new Error('Service discovery failed');\n  }\n\n  private async performDiscovery(): Promise<void> {\n    const discoveryUrl = new URL('/.well-known/nuwa-payment/info', this.options.baseUrl);\n    const fetchImpl = this.options.fetchImpl || (globalThis as any).fetch?.bind(globalThis);\n    if (!fetchImpl) return;\n    try {\n      const res = await fetchImpl(discoveryUrl.toString(), {\n        method: 'GET',\n        headers: { Accept: 'application/json' },\n      });\n      if (res.ok) {\n        const info = (await res.json()) as DiscoveryResponse;\n        this.cachedDiscovery = info;\n        if (info.basePath) this.discoveredBasePath = info.basePath;\n      }\n    } catch (e) {\n      this.logger.debug('MCP discovery failed:', e);\n    }\n    if (!this.discoveredBasePath) this.discoveredBasePath = '/payment-channel';\n  }\n\n  async recoverFromService(): Promise<RecoveryResponse> {\n    return this.doRecoverFromService();\n  }\n\n  private async doRecoverFromService(): Promise<RecoveryResponse> {\n    // Use MCP tool `nuwa.recovery`; attach DIDAuth so server can authorize\n    const clientTxRef = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n    const auth = await this.generateAuthToken('nuwa.recovery', clientTxRef).catch(() => undefined);\n    const result = await this.options.mcpCall('nuwa.recovery', auth ? { __nuwa_auth: auth } : {});\n    let payload: any = result;\n    if (result && typeof result === 'object' && Array.isArray((result as any).content)) {\n      // Try parse payment resource for pendingSubRAV side effects, but prefer data text for recovery JSON\n      const contents = (result as any).content as any[];\n      try {\n        const payment = HttpPaymentCodec.parseMcpPaymentFromContents(contents);\n        if (payment?.subRav) {\n          const sub = HttpPaymentCodec.deserializeSubRAV(payment.subRav);\n          this.options.paymentState.setPendingSubRAV(sub);\n        }\n      } catch {}\n      const text = contents.find(c => c?.type === 'text');\n      if (text?.text) {\n        try {\n          payload = JSON.parse(text.text);\n        } catch {}\n      }\n    }\n    return payload as RecoveryResponse;\n  }\n\n  async commitSubRAV(signedSubRAV: SignedSubRAV): Promise<void> {\n    const clientTxRef = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n    const auth = await this.generateAuthToken('nuwa.commit', clientTxRef).catch(() => undefined);\n    await this.options.mcpCall('nuwa.commit', {\n      signedSubRav: HttpPaymentCodec.serializeSignedSubRAV(signedSubRAV),\n      __nuwa_auth: auth,\n    });\n    //clear pending subrav\n    this.options.paymentState.clearPendingSubRAV();\n  }\n\n  private async applyRecovery(\n    recovery: RecoveryResponse,\n    options?: { authorizeIfMissing?: boolean; requireVmFragment?: boolean }\n  ): Promise<void> {\n    if (recovery.channel) {\n      this.options.paymentState.setChannelId(recovery.channel.channelId);\n      try {\n        const info = await this.options.payerClient.getChannelInfo(recovery.channel.channelId);\n        this.options.paymentState.setChannelInfo(info);\n      } catch (e) {\n        this.logger.debug('GetChannelInfo failed during MCP recovery:', e);\n      }\n    }\n    if (recovery.pendingSubRav) {\n      try {\n        const sub = HttpPaymentCodec.deserializeSubRAV(recovery.pendingSubRav as any);\n        this.options.paymentState.setPendingSubRAV(sub);\n      } catch {}\n    }\n    if (options?.authorizeIfMissing && recovery.channel) {\n      await this.ensureSubChannelAuthorized(recovery, options.requireVmFragment);\n    }\n  }\n\n  private async ensureSubChannelAuthorized(\n    recovery: RecoveryResponse,\n    requireVmFragment?: boolean\n  ): Promise<void> {\n    const channelId = this.options.paymentState.getChannelId();\n    if (!channelId) return;\n    let vmIdFragment =\n      (recovery.subChannel as any)?.vmIdFragment || this.options.paymentState.getVmIdFragment();\n    if (!vmIdFragment && requireVmFragment) {\n      if (this.options.keyId) {\n        const parts = this.options.keyId.split('#');\n        vmIdFragment = parts.length > 1 ? parts[1] : '';\n      }\n      if (!vmIdFragment) throw new Error('Missing vmIdFragment for sub-channel authorization');\n    }\n    if (vmIdFragment && !(recovery as any).subChannel) {\n      const auth = await this.options.payerClient.authorizeSubChannel({ channelId, vmIdFragment });\n      this.options.paymentState.setSubChannelInfo(auth.subChannelInfo);\n    }\n  }\n\n  private async directAuthorizeSubChannel(): Promise<void> {\n    const channelId = this.options.paymentState.getChannelId();\n    const vmIdFragment = this.options.paymentState.getVmIdFragment();\n    if (!channelId || !vmIdFragment) return;\n    const auth = await this.options.payerClient.authorizeSubChannel({ channelId, vmIdFragment });\n    this.options.paymentState.setSubChannelInfo(auth.subChannelInfo);\n  }\n\n  private async generateAuthToken(method: string, clientTxRef: string): Promise<string> {\n    let keyId = this.options.keyId;\n    if (!keyId && this.options.signer?.listKeyIds) {\n      try {\n        const ids: string[] = await this.options.signer.listKeyIds();\n        keyId = Array.isArray(ids) && ids.length > 0 ? ids[0] : undefined;\n      } catch {}\n    }\n    if (!keyId) throw new Error('No keyId for DIDAuth');\n    const signedObject = await DIDAuth.v1.createSignature(\n      {\n        operation: 'mcp_tool_call',\n        params: { tool: method, clientTxRef },\n      },\n      this.options.signer as any,\n      keyId\n    );\n    return DIDAuth.v1.toAuthorizationHeader(signedObject);\n  }\n\n  getDefaultAssetId(): string | undefined {\n    return this.defaultAssetId;\n  }\n}\n","import type { Tool, ToolCallOptions } from 'ai';\nimport { dynamicTool, jsonSchema } from 'ai';\n\n/**\n * Common utility for converting MCP tool definitions to AI SDK compatible format\n */\nexport class McpToolConverter {\n  /**\n   * Convert MCP tool definition to AI SDK compatible format\n   * @param tool - MCP tool definition\n   * @param executeFunction - Function to execute the tool\n   * @returns AI SDK compatible tool with proper typing\n   */\n  static convertToAiSdkFormat(\n    tool: {\n      name: string;\n      description?: string;\n      inputSchema?: any;\n      parameters?: any;\n      input_schema?: any;\n    },\n    executeFunction: (args: any, options?: ToolCallOptions) => Promise<{ content: any }>\n  ): Tool<unknown, unknown> & { type: 'dynamic' } {\n    // Extract schema from various possible locations\n    // Note: tool should already be sanitized by listTools() -> sanitizeTools()\n    let rawSchema = tool.inputSchema || tool.parameters || tool.input_schema || {};\n\n    // Handle nested jsonSchema structure - this is the key fix!\n    // Many MCP servers return { inputSchema: { jsonSchema: { ... } } }\n    // But AI SDK expects the actual schema object\n    if (rawSchema && typeof rawSchema === 'object' && rawSchema.jsonSchema) {\n      rawSchema = rawSchema.jsonSchema;\n    }\n\n    // Convert JSON Schema to AI SDK schema format, following the same pattern as AI SDK's built-in MCP client\n    const processedSchema = {\n      ...rawSchema,\n      properties: rawSchema.properties ?? {},\n      additionalProperties: false,\n    };\n\n    return dynamicTool({\n      description: tool.description || `Tool: ${tool.name}`,\n      inputSchema: jsonSchema(processedSchema),\n      execute: executeFunction,\n    });\n  }\n}\n","import type { PaymentResult, PaymentInfo } from '../../core/types';\nimport { PaymentChannelMcpClient } from './PaymentChannelMcpClient';\nimport type {\n  McpPayerOptions,\n  ListToolsOptions as PaymentListToolsOptions,\n} from './PaymentChannelMcpClient';\nimport { ServerDetector } from './ServerDetector';\nimport type {\n  EnhancedServerCapabilities,\n  ServerDetectionResult,\n  UniversalListToolsOptions,\n} from './types';\nimport { McpServerType } from './types';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { ZodTypeAny } from 'zod';\nimport type { Tool, ToolCallOptions, ToolSet } from 'ai';\nimport { McpToolConverter } from './McpToolConverter';\nimport type { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * CallToolResult type compatible with AI SDK's MCP implementation\n */\ntype CallToolResult =\n  | {\n      content: Array<\n        | {\n            type: 'text';\n            text: string;\n          }\n        | {\n            type: 'image';\n            data: string; // base64 encoded\n            mimeType: string;\n          }\n        | {\n            type: 'resource';\n            resource: {\n              uri: string;\n              name?: string;\n              description?: string;\n              mimeType?: string;\n            } & (\n              | {\n                  text: string;\n                }\n              | {\n                  blob: string; // base64 encoded\n                }\n            );\n          }\n      >;\n      isError?: boolean;\n      _meta?: Record<string, unknown>;\n    }\n  | {\n      toolResult: unknown;\n      _meta?: Record<string, unknown>;\n    };\n\n/**\n * Universal MCP client that automatically detects server type and adapts calling methods\n * Fully compatible with existing PaymentChannelMcpClient API\n */\nexport class UniversalMcpClient {\n  private paymentClient?: PaymentChannelMcpClient;\n  private standardClient?: McpClient;\n  private capabilities?: EnhancedServerCapabilities;\n  private serverType: McpServerType = McpServerType.UNKNOWN;\n  private detector: ServerDetector;\n  private logger: DebugLogger;\n  private detectionResult?: ServerDetectionResult;\n\n  constructor(\n    private options: McpPayerOptions & {\n      forceMode?: 'auto' | 'payment' | 'standard';\n      detectionTimeout?: number;\n    }\n  ) {\n    this.detector = new ServerDetector({\n      timeout: options.detectionTimeout || 5000,\n      cache: true,\n      fetchImpl: (globalThis as any).fetch?.bind(globalThis),\n    });\n    this.logger = DebugLogger.get('UniversalMcpClient');\n    this.logger.setLevel(options.debug ? 'debug' : 'info');\n  }\n\n  // ===== Fully compatible with existing API =====\n\n  /**\n   * Call a tool with payment processing and optional result validation\n   * @deprecated Use callTool instead, but still supported for backward compatibility\n   */\n  async call<T = any>(method: string, params?: any, schema?: ZodTypeAny): Promise<PaymentResult<T>>;\n  async call<T = any>(\n    method: string,\n    params: any,\n    options: { clientTxRef: string; schema?: ZodTypeAny }\n  ): Promise<PaymentResult<T>>;\n  async call<T = any>(\n    method: string,\n    params?: any,\n    schemaOrOptions?: ZodTypeAny | { clientTxRef: string; schema?: ZodTypeAny }\n  ): Promise<PaymentResult<T>> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.call(method, params, schemaOrOptions as any);\n    }\n\n    // For standard MCP server, simulate PaymentResult structure\n    const { content } = await this.callTool(method, params);\n    const raw = this.parseFirstJsonText<any>(content);\n    let data: T;\n\n    // Handle schema validation if provided\n    if (schemaOrOptions) {\n      let schema: ZodTypeAny | undefined;\n\n      if (\n        typeof schemaOrOptions === 'object' &&\n        'clientTxRef' in schemaOrOptions &&\n        schemaOrOptions.schema\n      ) {\n        schema = schemaOrOptions.schema;\n      } else if (\n        typeof (schemaOrOptions as any).safeParse === 'function' ||\n        typeof (schemaOrOptions as any).parse === 'function'\n      ) {\n        schema = schemaOrOptions as ZodTypeAny;\n      }\n\n      if (schema) {\n        try {\n          data = schema.parse(raw);\n        } catch (e) {\n          this.logger.warn('Failed to parse response', { cause: e, raw, schema });\n          throw new Error('Failed to parse response');\n        }\n      } else {\n        data = raw as T;\n      }\n    } else {\n      data = raw as T;\n    }\n\n    return { data, payment: undefined };\n  }\n\n  /**\n   * Call a tool and return the content of the tool call\n   */\n  async callTool(name: string, args?: any): Promise<{ content: any[] }>;\n  async callTool(\n    name: string,\n    args: any,\n    options: { clientTxRef: string }\n  ): Promise<{ content: any[] }>;\n  async callTool(\n    name: string,\n    args?: any,\n    optionsOrClientTxRef?: { clientTxRef: string } | string\n  ): Promise<{ content: any[] }> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.callTool(name, args, optionsOrClientTxRef as any);\n    }\n\n    // Standard MCP call\n    const result = await this.standardClient!.callTool({ name, arguments: args || {} });\n    return { content: Array.isArray(result.content) ? result.content : [] };\n  }\n\n  /**\n   * Call a tool with payment processing\n   */\n  async callToolWithPayment(\n    method: string,\n    params?: any,\n    clientTxRef?: string\n  ): Promise<{ content: any[]; payment?: PaymentInfo }> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.callToolWithPayment(method, params, clientTxRef);\n    }\n\n    // For standard MCP server, no payment info\n    const { content } = await this.callTool(method, params);\n    return { content, payment: undefined };\n  }\n\n  /**\n   * List tools exposed by the server\n   */\n  async listTools(options?: UniversalListToolsOptions): Promise<Record<string, any>> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      const paymentOptions: PaymentListToolsOptions = {\n        includeBuiltinTools: options?.includeBuiltinTools,\n      };\n      return await this.paymentClient.listTools(paymentOptions);\n    }\n\n    // Standard MCP listTools\n    const result = await this.standardClient!.listTools();\n    return this.normalizeToolsFormat(result);\n  }\n\n  /**\n   * Get tools in AI SDK compatible format\n   */\n  async tools(options?: UniversalListToolsOptions): Promise<ToolSet> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      const paymentOptions: PaymentListToolsOptions = {\n        includeBuiltinTools: options?.includeBuiltinTools,\n      };\n      const result = await this.paymentClient.tools(paymentOptions);\n      this.logger.debug('Payment client tools result:', result);\n      return result;\n    }\n\n    // Create ToolSet for standard MCP\n    const result = await this.createStandardToolSet(options);\n    this.logger.debug('Standard MCP tools result:', result);\n    return result;\n  }\n\n  /**\n   * List prompts exposed by the server (FREE, no payment)\n   */\n  async listPrompts(): Promise<any> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.listPrompts();\n    }\n\n    // Standard MCP prompts\n    return await this.standardClient!.listPrompts();\n  }\n\n  /**\n   * Load a prompt by name and return string content (FREE, no payment)\n   */\n  async loadPrompt(name: string, args?: any): Promise<string> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.loadPrompt(name, args);\n    }\n\n    // Standard MCP prompt loading\n    const result = await this.standardClient!.getPrompt({ name, arguments: args || {} });\n    return this.extractStringFromPromptResult(result);\n  }\n\n  /**\n   * List resources (FREE, no payment)\n   */\n  async listResources(): Promise<any[]> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.listResources();\n    }\n\n    // Standard MCP resources\n    const result = await this.standardClient!.listResources();\n    return Array.isArray(result?.resources) ? result.resources : [];\n  }\n\n  /**\n   * List resource templates (FREE, no payment)\n   */\n  async listResourceTemplates(): Promise<any[]> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.listResourceTemplates();\n    }\n\n    // Standard MCP resource templates\n    const result = await this.standardClient!.listResourceTemplates();\n    return Array.isArray(result.resourceTemplates) ? result.resourceTemplates : [];\n  }\n\n  /**\n   * Read a resource\n   */\n  async readResource(params: string | { uri: string; [key: string]: any }): Promise<any> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await this.paymentClient.readResource(params);\n    }\n\n    // Standard MCP resource reading\n    const p = typeof params === 'string' ? { uri: params } : params;\n    const result = await this.standardClient!.readResource(p);\n    return this.normalizeResourceResult(result);\n  }\n\n  // ===== New methods =====\n\n  /**\n   * Get detected server type\n   */\n  getServerType(): McpServerType {\n    return this.serverType;\n  }\n\n  /**\n   * Get enhanced server capabilities\n   */\n  getCapabilities(): EnhancedServerCapabilities | undefined {\n    return this.capabilities;\n  }\n\n  /**\n   * Get standard MCP capabilities (without Nuwa extensions)\n   */\n  getStandardCapabilities(): ServerCapabilities {\n    if (!this.capabilities) return {};\n    const { nuwa, ...standard } = this.capabilities;\n\n    // Convert to standard ServerCapabilities format\n    return {\n      experimental: standard.experimental,\n      logging: standard.logging,\n      prompts: standard.prompts,\n      resources: standard.resources,\n      tools: standard.tools,\n      ...standard,\n    } as ServerCapabilities;\n  }\n\n  /**\n   * Check if server supports payment protocol\n   */\n  supportsPayment(): boolean {\n    return this.capabilities?.nuwa?.payment?.supported === true;\n  }\n\n  /**\n   * Check if server supports DID authentication\n   */\n  supportsAuth(): boolean {\n    return this.capabilities?.nuwa?.auth?.supported === true;\n  }\n\n  /**\n   * Check if server has Nuwa built-in tools\n   */\n  hasBuiltinTools(): boolean {\n    return this.capabilities?.nuwa?.builtinTools?.supported === true;\n  }\n\n  /**\n   * Get detection result with timestamp\n   */\n  getDetectionResult(): ServerDetectionResult | undefined {\n    return this.detectionResult;\n  }\n\n  /**\n   * Force re-detection of server capabilities\n   */\n  async redetect(): Promise<ServerDetectionResult> {\n    this.detector.clearCache();\n    this.serverType = McpServerType.UNKNOWN;\n    this.capabilities = undefined;\n    this.detectionResult = undefined;\n\n    // Close existing clients\n    if (this.paymentClient) {\n      await this.paymentClient.close();\n      this.paymentClient = undefined;\n    }\n    if (this.standardClient) {\n      await this.standardClient.close();\n      this.standardClient = undefined;\n    }\n\n    await this.ensureInitialized();\n    return this.detectionResult!;\n  }\n\n  // ===== Lifecycle Management =====\n\n  /**\n   * Close the client and clean up resources\n   */\n  async close(): Promise<void> {\n    try {\n      if (this.paymentClient) {\n        await this.paymentClient.close();\n        this.paymentClient = undefined;\n      }\n      if (this.standardClient) {\n        await this.standardClient.close();\n        this.standardClient = undefined;\n      }\n\n      this.serverType = McpServerType.UNKNOWN;\n      this.capabilities = undefined;\n      this.detectionResult = undefined;\n\n      this.logger.debug('UniversalMcpClient closed successfully');\n    } catch (error) {\n      this.logger.warn('Error during close:', error);\n      throw error;\n    }\n  }\n\n  // ===== Internal Implementation =====\n\n  /**\n   * Ensure client is initialized and server type is detected\n   */\n  private async ensureInitialized(): Promise<void> {\n    if (this.serverType !== McpServerType.UNKNOWN) return;\n\n    // Handle force mode\n    if (this.options.forceMode === 'payment') {\n      this.serverType = McpServerType.PAYMENT_ENABLED;\n      // Create clean options without Universal-specific properties\n      const { forceMode, detectionTimeout, ...cleanOptions } = this.options;\n      this.paymentClient = new PaymentChannelMcpClient(cleanOptions);\n      this.capabilities = { nuwa: { payment: { supported: true } } };\n      this.logger.debug('Forced payment mode');\n      return;\n    }\n\n    if (this.options.forceMode === 'standard') {\n      this.serverType = McpServerType.STANDARD;\n      this.standardClient = await this.createStandardMcpClient();\n      this.capabilities = {};\n      this.logger.debug('Forced standard mode');\n      return;\n    }\n\n    // Auto-detect server capabilities\n    this.detectionResult = await this.detector.detectCapabilities(this.options.baseUrl);\n    this.serverType = this.detectionResult.type;\n    this.capabilities = this.detectionResult.capabilities;\n\n    // Create appropriate client\n    if (this.serverType === McpServerType.PAYMENT_ENABLED) {\n      // Create clean options without Universal-specific properties\n      const { forceMode, detectionTimeout, ...cleanOptions } = this.options;\n      this.paymentClient = new PaymentChannelMcpClient(cleanOptions);\n      this.logger.debug('Created payment-enabled client');\n    } else {\n      this.standardClient = await this.createStandardMcpClient();\n      this.logger.debug('Created standard MCP client');\n    }\n  }\n\n  /**\n   * Create standard MCP client\n   */\n  private async createStandardMcpClient(): Promise<McpClient> {\n    // Use custom transport if provided, otherwise use HTTP transport\n    let transport: Transport;\n    if (this.options.customTransport) {\n      transport = this.options.customTransport;\n    } else {\n      const httpTransport = new StreamableHTTPClientTransport(new URL(this.options.baseUrl));\n      // Set protocol version to 2025-06-18 for compatibility with FastMCP 3.5.0, if supported by SDK\n      if (typeof (httpTransport as any).setProtocolVersion === 'function') {\n        httpTransport.setProtocolVersion('2025-06-18');\n      }\n      transport = httpTransport;\n    }\n\n    const client = new McpClient({\n      name: 'nuwa-universal-mcp-client',\n      version: '1.0.0',\n    });\n    await client.connect(transport);\n    return client;\n  }\n\n  /**\n   * Normalize tools format for consistency\n   */\n  private normalizeToolsFormat(result: any): Record<string, any> {\n    if (!result || !result.tools) return {};\n\n    const normalized: Record<string, any> = {};\n    for (const tool of result.tools) {\n      if (tool && tool.name) {\n        normalized[tool.name] = tool;\n      }\n    }\n    return normalized;\n  }\n\n  /**\n   * Create AI SDK compatible ToolSet for standard MCP\n   */\n  private async createStandardToolSet(options?: UniversalListToolsOptions): Promise<ToolSet> {\n    const rawTools = await this.listTools(options);\n    const toolSet: ToolSet = {};\n\n    for (const [name, toolDef] of Object.entries(rawTools)) {\n      if (toolDef && typeof toolDef === 'object') {\n        toolSet[name] = McpToolConverter.convertToAiSdkFormat(\n          { name, ...(toolDef as any) },\n          async (args: any, options?: ToolCallOptions) => {\n            const { content } = await this.callTool(name, args);\n            return { content };\n          }\n        );\n      }\n    }\n\n    return toolSet;\n  }\n\n  /**\n   * Parse first JSON text from content array\n   */\n  private parseFirstJsonText<T>(content: any[]): T | undefined {\n    const dataItem = Array.isArray(content)\n      ? content.find((c: any) => c?.type === 'text') || content[0]\n      : undefined;\n\n    if (dataItem && dataItem.type === 'text' && typeof dataItem.text === 'string') {\n      try {\n        return JSON.parse(dataItem.text) as T;\n      } catch {\n        return dataItem.text as any;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Extract string from prompt result\n   */\n  private extractStringFromPromptResult(res: any): string {\n    if (typeof res === 'string') return res;\n    if (res && typeof res === 'object') {\n      // Try common shapes\n      if (Array.isArray(res.content)) {\n        const textItem = res.content.find((c: any) => c?.type === 'text');\n        if (textItem?.text) return String(textItem.text);\n      }\n      if (typeof res.text === 'string') return res.text;\n    }\n    try {\n      return JSON.stringify(res);\n    } catch {\n      return String(res);\n    }\n  }\n\n  /**\n   * Normalize resource result\n   */\n  private normalizeResourceResult(\n    res: any\n  ): { text?: string; blob?: any; mimeType?: string } | any {\n    try {\n      if (typeof res === 'string') return { text: res };\n      if (res && typeof res === 'object') {\n        if (typeof res.text === 'string') {\n          return { text: res.text, mimeType: res.mimeType };\n        }\n        if (res.type === 'text' && typeof res.text === 'string') {\n          return { text: res.text };\n        }\n        const contents = res.contents || res.content;\n        if (Array.isArray(contents)) {\n          const textItem = contents.find(\n            (c: any) => c?.type === 'text' && typeof c.text === 'string'\n          );\n          if (textItem) return { text: String(textItem.text), mimeType: textItem.mimeType };\n          const anyItem = contents[0];\n          if (anyItem && (anyItem.blob || anyItem.data)) {\n            return { blob: anyItem.blob || anyItem.data, mimeType: anyItem.mimeType };\n          }\n        }\n      }\n    } catch {}\n    return res;\n  }\n\n  // ===== Compatibility method proxies =====\n\n  /**\n   * Get underlying payment client (if available)\n   */\n  getPayerClient() {\n    // Ensure initialization before checking\n    if (this.serverType === McpServerType.UNKNOWN) {\n      // Return undefined for now, will be available after first call\n      return undefined;\n    }\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return this.paymentClient.getPayerClient();\n    }\n    return undefined;\n  }\n\n  /**\n   * Get transaction store (if available)\n   */\n  getTransactionStore() {\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return this.paymentClient.getTransactionStore();\n    }\n    return undefined;\n  }\n\n  /**\n   * Get last contents (if available)\n   */\n  getLastContents() {\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return this.paymentClient.getLastContents();\n    }\n    return undefined;\n  }\n\n  /**\n   * Get last payment payload (if available)\n   */\n  getLastPaymentPayload() {\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return this.paymentClient.getLastPaymentPayload();\n    }\n    return undefined;\n  }\n\n  /**\n   * Get pending SubRAV (if available)\n   */\n  getPendingSubRAV() {\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return this.paymentClient.getPendingSubRAV();\n    }\n    return null;\n  }\n\n  /**\n   * Clear pending SubRAV (if available)\n   */\n  clearPendingSubRAV(): void {\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      this.paymentClient.clearPendingSubRAV();\n    }\n  }\n\n  /**\n   * Commit a signed SubRAV (if available)\n   */\n  async commitSubRAV(signedSubRAV: any): Promise<{ success: true }> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await (this.paymentClient as any).commitSubRAV(signedSubRAV);\n    }\n\n    throw new Error('commitSubRAV is only available for payment-enabled servers');\n  }\n\n  /**\n   * Health check (if available)\n   */\n  async healthCheck(): Promise<any> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await (this.paymentClient as any).healthCheck();\n    }\n\n    // For standard MCP, we can try a basic tool call\n    try {\n      await this.callTool('ping', {});\n      return { status: 'healthy' };\n    } catch {\n      return { status: 'unknown' };\n    }\n  }\n\n  /**\n   * Recover from service (if available)\n   */\n  async recoverFromService(): Promise<any> {\n    await this.ensureInitialized();\n\n    if (this.serverType === McpServerType.PAYMENT_ENABLED && this.paymentClient) {\n      return await (this.paymentClient as any).recoverFromService();\n    }\n\n    throw new Error('recoverFromService is only available for payment-enabled servers');\n  }\n}\n","import type { SignerInterface, IdentityEnv } from '@nuwa-ai/identity-kit';\nimport type { McpPayerOptions } from './PaymentChannelMcpClient';\nimport { PaymentChannelMcpClient } from './PaymentChannelMcpClient';\nimport { UniversalMcpClient } from './UniversalMcpClient';\nimport { getChainConfigFromEnv } from '../../helpers/fromIdentityEnv';\nimport type { TransactionStore } from '../../storage';\nimport type { HostChannelMappingStore } from '../http/types';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\n\n/**\n * Enhanced options for creating UniversalMcpClient with IdentityEnv (recommended)\n * Supports both payment-enabled and standard MCP servers with automatic detection\n */\nexport interface CreateMcpClientOptions {\n  /** MCP server endpoint, e.g., http://localhost:8080/mcp */\n  baseUrl: string;\n\n  /** Pre-configured IdentityEnv (contains VDR registry, KeyManager, and chain config) */\n  env: IdentityEnv;\n\n  /** Optional maximum amount per request (defaults to 50 cents USD) */\n  maxAmount?: bigint;\n\n  /** Optional debug mode (inherits from IdentityEnv if not specified) */\n  debug?: boolean;\n\n  /** Optional storage configuration. If not provided, uses in-memory storage */\n  storageOptions?: {\n    channelRepo?: any; // ChannelRepository interface\n    /** Namespace for storage keys (useful for multi-service scenarios) */\n    namespace?: string;\n  };\n\n  /** Optional transaction store for logging */\n  transactionStore?: TransactionStore;\n\n  /** Transaction logging configuration */\n  transactionLog?: {\n    enabled?: boolean;\n    persist?: 'memory' | 'indexeddb' | 'custom';\n    maxRecords?: number;\n    sanitizeRequest?: (\n      headers: Record<string, string>,\n      body?: any\n    ) => { headersSummary?: Record<string, string>; requestBodyHash?: string };\n  };\n\n  /** Optional mapping store for state persistence. If not provided, uses default store */\n  mappingStore?: HostChannelMappingStore;\n\n  /** Optional custom transport (e.g., PostMessage for iframe communication) */\n  customTransport?: Transport;\n\n  // ===== Universal Client Options =====\n\n  /**\n   * Force specific client mode (default: 'auto' for automatic detection)\n   * - 'auto': Automatically detect server type and use appropriate client\n   * - 'payment': Force use of payment-enabled client (PaymentChannelMcpClient)\n   * - 'standard': Force use of standard MCP client\n   */\n  forceMode?: 'auto' | 'payment' | 'standard';\n\n  /**\n   * Timeout for server detection in milliseconds (default: 5000)\n   * Only used when forceMode is 'auto'\n   */\n  detectionTimeout?: number;\n}\n\n/**\n * Create UniversalMcpClient with IdentityEnv (recommended approach)\n * Automatically detects server type and uses appropriate client implementation\n * Fully backward compatible with existing PaymentChannelMcpClient API\n *\n * @param options - Enhanced configuration options with IdentityEnv\n * @returns Promise resolving to configured UniversalMcpClient instance\n *\n * @example\n * ```typescript\n * import { bootstrapIdentityEnv, createMcpClient } from '@nuwa-ai/payment-kit';\n *\n * // 1. Set up identity environment (once per app)\n * const env = await bootstrapIdentityEnv({\n *   method: 'rooch',\n *   vdrOptions: { rpcUrl: 'https://testnet.rooch.network', network: 'test' }\n * });\n *\n * // 2. Create universal MCP client with automatic detection (recommended)\n * const client = await createMcpClient({\n *   baseUrl: 'http://localhost:8080/mcp',\n *   env,\n *   maxAmount: BigInt('500000000000'), // 50 cents USD\n * });\n *\n * // 3. Use it! (API is fully compatible with PaymentChannelMcpClient)\n * const result = await client.call('some_tool', { param: 'value' });\n *\n * // 4. Check what type of server was detected\n * console.log('Server type:', client.getServerType()); // 'payment' | 'standard'\n * console.log('Supports payment:', client.supportsPayment());\n * ```\n *\n * @example\n * ```typescript\n * // Force specific mode (skip auto-detection)\n * const paymentClient = await createMcpClient({\n *   baseUrl: 'http://payment-server:8080/mcp',\n *   env,\n *   forceMode: 'payment', // Skip detection, use payment client directly\n * });\n *\n * const standardClient = await createMcpClient({\n *   baseUrl: 'http://standard-server:8080/mcp',\n *   env,\n *   forceMode: 'standard', // Skip detection, use standard MCP client\n * });\n * ```\n */\nexport async function createMcpClient(\n  options: CreateMcpClientOptions\n): Promise<UniversalMcpClient> {\n  const chainConfig = getChainConfigFromEnv(options.env);\n  let keyId;\n  const keyIds = await options.env.keyManager.listKeyIds?.();\n  if (keyIds && keyIds.length > 0) {\n    keyId = keyIds[0];\n  } else {\n    throw new Error('No keyId available');\n  }\n\n  const mcpPayerOptions: McpPayerOptions & {\n    forceMode?: 'auto' | 'payment' | 'standard';\n    detectionTimeout?: number;\n  } = {\n    baseUrl: options.baseUrl,\n    chainConfig,\n    signer: options.env.keyManager,\n    keyId,\n    maxAmount: options.maxAmount || BigInt('500000000000'), // Default: 50 cents USD\n    debug: options.debug ?? chainConfig.debug,\n    storageOptions: options.storageOptions,\n    transactionStore: options.transactionStore,\n    transactionLog: options.transactionLog,\n    mappingStore: options.mappingStore,\n    customTransport: options.customTransport,\n\n    // Universal client options\n    forceMode: options.forceMode || 'auto',\n    detectionTimeout: options.detectionTimeout || 5000,\n  };\n\n  const client = new UniversalMcpClient(mcpPayerOptions);\n  return client;\n}\n\n// ===== Backward Compatibility =====\n\n/**\n * @deprecated Use createMcpClient instead. This function now returns UniversalMcpClient\n * for backward compatibility, but the API remains the same.\n *\n * Create PaymentChannelMcpClient with IdentityEnv (legacy function)\n * Now returns UniversalMcpClient but maintains full API compatibility\n */\nexport async function createPaymentMcpClient(\n  options: CreateMcpClientOptions\n): Promise<UniversalMcpClient> {\n  // Force payment mode for legacy function\n  return createMcpClient({\n    ...options,\n    forceMode: 'payment',\n  });\n}\n\n/**\n * Create standard MCP client (new function)\n * Forces standard MCP mode without payment protocol\n */\nexport async function createStandardMcpClient(\n  options: Omit<CreateMcpClientOptions, 'maxAmount' | 'chainConfig' | 'signer' | 'keyId'> & {\n    /** Optional timeout for requests */\n    timeout?: number;\n  }\n): Promise<UniversalMcpClient> {\n  // Create minimal options for standard client\n  // We still need env for potential future extensions\n  return createMcpClient({\n    ...options,\n    forceMode: 'standard',\n    maxAmount: BigInt(0), // Not used in standard mode\n  });\n}\n","/**\n * Utility functions for Payment Kit\n */\n\nexport * from './bigint';\nexport * from './json';\n\n// Import and re-export existing utils from other modules\nexport { DebugLogger } from '@nuwa-ai/identity-kit';\n\n/**\n * Generate a random nonce for SubRAV\n */\nexport function generateNonce(): bigint {\n  return BigInt(Date.now()) * BigInt(1000) + BigInt(Math.floor(Math.random() * 1000));\n}\n\n/**\n * Extract fragment from DID keyId\n * Example: 'did:rooch:0x123#test-key' -> 'test-key'\n */\nexport function extractFragment(keyId: string): string {\n  const hashIndex = keyId.indexOf('#');\n  if (hashIndex === -1) {\n    throw new Error(`No fragment found in keyId: ${keyId}`);\n  }\n  return keyId.substring(hashIndex + 1);\n}\n\n/**\n * Validate hex string format\n */\nexport function isValidHex(hex: string, expectedLength?: number): boolean {\n  if (!hex || typeof hex !== 'string') {\n    return false;\n  }\n\n  if (!hex.startsWith('0x')) {\n    return false;\n  }\n\n  const hexPart = hex.substring(2);\n\n  // Check if it contains only valid hex characters\n  if (!/^[0-9a-fA-F]*$/.test(hexPart)) {\n    return false;\n  }\n\n  // Check expected length if provided\n  if (expectedLength !== undefined && hexPart.length !== expectedLength) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Format amount for display with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number = 18): string {\n  const divisor = BigInt(10 ** decimals);\n  const whole = amount / divisor;\n  const remainder = amount % divisor;\n\n  if (remainder === 0n) {\n    return whole.toString();\n  }\n\n  const remainderStr = remainder.toString().padStart(decimals, '0');\n  return `${whole}.${remainderStr.replace(/0+$/, '')}`;\n}\n\n/**\n * Generate a channel ID (placeholder implementation)\n */\nexport function generateChannelId(): string {\n  return `0x${Math.random().toString(16).substring(2).padStart(64, '0')}`;\n}\n\n/**\n * Convert BigInt to string\n */\nexport function bigintToString(value: bigint): string {\n  return value.toString();\n}\n\n/**\n * Convert string to BigInt\n */\nexport function stringToBigint(value: string): bigint {\n  return BigInt(value);\n}\n\n/**\n * Format picoUSD amount to human-readable USD string\n * @param picoUsd Amount in picoUSD (1 USD = 1,000,000,000,000 picoUSD)\n * @returns Formatted USD string (e.g., \"$0.0123\")\n */\nexport function formatUsdAmount(picoUsd: bigint, maxFractionDigits: number = 12): string {\n  // 1 USD = 1,000,000,000,000 picoUSD\n  const divisor = 1_000_000_000_000n;\n  const whole = picoUsd / divisor;\n  const remainder = picoUsd % divisor;\n  // Ensure bounds for fraction digits\n  const digits = Math.max(0, Math.min(12, Math.floor(maxFractionDigits)));\n  // Format remainder as a 12-digit string, optionally truncate for max fraction digits (default 12)\n  const fullRemainderStr = remainder.toString().padStart(12, '0');\n  const usedRemainder = digits === 12 ? fullRemainderStr : fullRemainderStr.slice(0, digits);\n  // Remove trailing zeros; if all zeros, show a single zero\n  const fractional = usedRemainder.replace(/0+$/, '') || '0';\n  return `$${whole.toString()}.${fractional}`;\n}\n","import { Request, Response, NextFunction, RequestHandler } from 'express';\nimport type { Handler, ApiContext } from '../../types/api';\nimport { toApiError, createErrorResponse } from '../../errors';\nimport { sendJsonResponse } from '../../utils/json';\n\n/**\n * Prepare request data from Express Request object\n * Extracted from PaymentKitExpressAdapter for reuse\n */\nfunction prepareRequestData(req: Request): any {\n  let baseData: any = {};\n\n  // Extract from URL parameters\n  if (req.params && Object.keys(req.params).length > 0) {\n    baseData = { ...baseData, ...req.params };\n  }\n\n  // Extract from query parameters\n  if (req.query && Object.keys(req.query).length > 0) {\n    baseData = { ...baseData, ...req.query };\n  }\n\n  // Extract from request body\n  if (req.body && Object.keys(req.body).length > 0) {\n    baseData = { ...baseData, ...req.body };\n  }\n\n  // Add DID info if available (set by auth middleware)\n  if ((req as any).didInfo) {\n    baseData.didInfo = (req as any).didInfo;\n  }\n\n  return baseData;\n}\n\n/**\n * Convert PaymentKit Handler to Express RequestHandler\n * This adapter bridges the gap between PaymentKit's abstract Handler interface\n * and Express's concrete RequestHandler interface\n */\nexport function toExpressHandler<Ctx extends ApiContext, Req, Res>(\n  ctx: Ctx,\n  handler: Handler<Ctx, Req, Res>\n): RequestHandler {\n  return async (req: Request, res: Response, next: NextFunction) => {\n    try {\n      // Prepare request data from Express request\n      const requestData = prepareRequestData(req);\n\n      // Execute PaymentKit handler with proper context and data\n      const result = await handler(ctx, requestData as unknown as Req);\n\n      // Send JSON response using unified utility\n      sendJsonResponse(res, result);\n    } catch (error) {\n      // Convert to API error and pass to Express error handler\n      const apiError = toApiError(error);\n      const errorResponse = createErrorResponse(apiError);\n\n      res.status(apiError.httpStatus || 500);\n      sendJsonResponse(res, errorResponse);\n    }\n  };\n}\n\n/**\n * Options for registering handlers with BillableRouter\n */\nexport interface RegisterHandlersOptions {\n  /** Path prefix to add to all handler paths (e.g. '/payment-channel') */\n  pathPrefix?: string;\n}\n\n/**\n * Register PaymentKit handlers directly with BillableRouter\n * This eliminates the need for dummyHandler and separate routing layers\n */\nexport function registerHandlersWithBillableRouter(\n  handlerConfigs: Record<string, any>,\n  context: ApiContext,\n  billableRouter: any,\n  options?: RegisterHandlersOptions\n): void {\n  const prefix = options?.pathPrefix?.replace(/\\/$/, '') ?? '';\n\n  Object.entries(handlerConfigs).forEach(([handlerName, config]) => {\n    // Now handlerName is a semantic name (e.g., 'recovery', 'commit')\n    // and path is a property of config\n    const { method, path, options: routeOptions, handler } = config;\n\n    // Skip handlers without path (they're not REST endpoints)\n    if (!path) {\n      return;\n    }\n\n    // Build full path with prefix\n    const fullPath = prefix ? `${prefix}/${path.replace(/^\\//, '')}` : path;\n\n    // Convert PaymentKit Handler to Express RequestHandler\n    const expressHandler = toExpressHandler(context, handler);\n\n    // Get the HTTP method in lowercase for BillableRouter\n    const httpMethod = method || 'GET'; // Default to GET if not specified\n    const methodName = httpMethod.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch';\n\n    // Validate method is supported\n    if (!billableRouter[methodName]) {\n      throw new Error(`Unsupported HTTP method: ${httpMethod}`);\n    }\n\n    // Register directly with BillableRouter using the public API\n    // Use handlerName as ruleId for clearer billing rule identification\n    billableRouter[methodName](fullPath, routeOptions, expressHandler, handlerName);\n\n    // Registered successfully\n  });\n}\n","import express, { Router, RequestHandler, Request, Response, NextFunction } from 'express';\nimport onHeaders from 'on-headers';\nimport { BillableRouter, RouteOptions } from './BillableRouter';\nimport { registerHandlersWithBillableRouter } from './HandlerRestAdapter';\nimport {\n  HttpBillingMiddleware,\n  ResponseAdapter,\n} from '../../middlewares/http/HttpBillingMiddleware';\nimport { RateProvider } from '../../billing';\nimport { ContractRateProvider } from '../../billing/rate/contract';\nimport { PaymentChannelPayeeClient } from '../../client/PaymentChannelPayeeClient';\nimport { RoochPaymentChannelContract } from '../../rooch/RoochPaymentChannelContract';\nimport {\n  createStorageRepositories,\n  type ChannelRepository,\n  type PendingSubRAVRepository,\n  type RAVRepository,\n} from '../../storage';\n// Removed legacy ClaimScheduler in favor of reactive ClaimTriggerService\nimport { DIDAuth, VDRRegistry, RoochVDR } from '@nuwa-ai/identity-kit';\nimport type { SignerInterface, DIDResolver } from '@nuwa-ai/identity-kit';\nimport { DebugLogger } from '@nuwa-ai/identity-kit';\nimport type { IPaymentChannelContract } from '../../contracts/IPaymentChannelContract';\nimport { BuiltInApiHandlers } from '../../api';\nimport type { ApiContext } from '../../types/api';\nimport { HttpPaymentCodec } from '../../middlewares/http/HttpPaymentCodec';\nimport { httpStatusFor, PaymentErrorCode } from '../../errors/codes';\nimport { registerBuiltinStrategies } from '../../billing/strategies';\nimport { PaymentProcessor } from '../../core/PaymentProcessor';\nimport { HubBalanceService, type HubBalanceServiceOptions } from '../../core/HubBalanceService';\nimport { ClaimTriggerService, DEFAULT_REACTIVE_CLAIM_POLICY } from '../../core/ClaimTriggerService';\nimport { isStreamingRequest } from './utils';\n\n/**\n * Configuration for creating ExpressPaymentKit\n */\nexport interface ExpressPaymentKitOptions {\n  /** Service identifier */\n  serviceId: string;\n  /** Service private key (or KMS Signer) */\n  signer: SignerInterface;\n\n  /** Optional RPC URL (defaults to env.ROOCH_NODE_URL) */\n  rpcUrl?: string;\n  /** Optional network (defaults to 'local') */\n  network?: 'local' | 'dev' | 'test' | 'main';\n  /** Default asset ID for settlement */\n  defaultAssetId?: string;\n  /** Default price in picoUSD when no rule matches */\n  defaultPricePicoUSD?: string | bigint;\n\n  /**\n   * Prefix under which all payment-channel routes are mounted.\n   * Defaults to \"/payment-channel\".\n   * Example: \"/billing\" or \"/api/pay\"\n   */\n  basePath?: string;\n\n  /** One or more DIDs that are authorized to call admin endpoints (defaults to service signer DID) */\n  adminDid?: string | string[];\n  /** Debug logging */\n  debug?: boolean;\n\n  // Legacy polling scheduler removed; reactive claims are the default\n\n  /** PaymentHub balance caching configuration */\n  hubBalance?: {\n    /** Normal cache TTL in milliseconds */\n    ttlMs?: number;\n    /** Negative cache TTL for zero balances */\n    negativeTtlMs?: number;\n    /** Stale-while-revalidate window in milliseconds */\n    staleWhileRevalidateMs?: number;\n    /** Maximum cache entries */\n    maxEntries?: number;\n  };\n\n  /** Claim triggering configuration */\n  claim?: {\n    /** Minimum accumulated amount to trigger a claim (bigint or string) */\n    minClaimAmount?: bigint | string;\n    /** Require hub balance check before triggering claims (default: true) */\n    requireHubBalance?: boolean;\n    /** Maximum concurrent claims across all sub-channels (default: 5) */\n    maxConcurrentClaims?: number;\n    /** Maximum retry attempts for failed claims (default: 3) */\n    maxRetries?: number;\n    /** Delay between retry attempts in milliseconds (default: 60000ms = 60s) */\n    retryDelayMs?: number;\n  };\n}\n\n/**\n * Express Payment Kit interface\n */\nexport interface ExpressPaymentKit {\n  /** Express Router to mount in your app */\n  readonly router: Router;\n\n  /** HTTP verb methods for registering routes with billing */\n  get(path: string | RegExp, options: RouteOptions, handler: RequestHandler, ruleId?: string): this;\n  post(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this;\n  put(path: string | RegExp, options: RouteOptions, handler: RequestHandler, ruleId?: string): this;\n  delete(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this;\n  patch(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this;\n\n  /** Get the underlying PayeeClient for advanced operations */\n  getPayeeClient(): PaymentChannelPayeeClient;\n}\n\n/**\n * Implementation of ExpressPaymentKit\n */\nclass ExpressPaymentKitImpl implements ExpressPaymentKit {\n  public readonly router: Router;\n  private readonly billableRouter: BillableRouter;\n  private readonly middleware: HttpBillingMiddleware;\n  private readonly config: ExpressPaymentKitOptions;\n  private readonly payeeClient: PaymentChannelPayeeClient;\n  private readonly rateProvider: RateProvider;\n  private readonly serviceDid: string;\n  // claimScheduler removed\n  // Hold storage repositories explicitly for reuse across components\n  private readonly channelRepo: ChannelRepository;\n  private readonly ravRepo: RAVRepository;\n  private readonly pendingSubRAVRepo: PendingSubRAVRepository;\n  private readonly processor: PaymentProcessor;\n  private readonly logger: DebugLogger;\n  // New services for reactive claim and hub balance\n  private readonly hubBalanceService: HubBalanceService;\n  private readonly claimTriggerService?: ClaimTriggerService;\n\n  constructor(\n    config: ExpressPaymentKitOptions,\n    deps: {\n      contract: IPaymentChannelContract;\n      signer: SignerInterface;\n      didResolver: DIDResolver;\n      rateProvider: RateProvider;\n      serviceDid: string;\n    },\n    prebuiltStorage?: {\n      channelRepo: ChannelRepository;\n      ravRepo: RAVRepository;\n      pendingSubRAVRepo: PendingSubRAVRepository;\n    }\n  ) {\n    this.logger = DebugLogger.get('ExpressPaymentKit');\n    this.config = config;\n    this.rateProvider = deps.rateProvider;\n    this.serviceDid = deps.serviceDid;\n\n    // Resolve storage repositories\n    const storage = prebuiltStorage ?? this.resolveStorageFromEnv();\n    this.channelRepo = storage.channelRepo;\n    this.ravRepo = storage.ravRepo;\n    this.pendingSubRAVRepo = storage.pendingSubRAVRepo;\n\n    // Create PayeeClient inside impl to ensure shared storage\n    this.payeeClient = new PaymentChannelPayeeClient({\n      contract: deps.contract,\n      signer: deps.signer,\n      didResolver: deps.didResolver,\n      storageOptions: {\n        channelRepo: this.channelRepo,\n        ravRepo: this.ravRepo,\n        pendingSubRAVRepo: this.pendingSubRAVRepo,\n      },\n    });\n\n    // Create single billable router for all routes (business + built-in)\n    this.billableRouter = new BillableRouter({\n      serviceId: config.serviceId,\n      defaultPricePicoUSD: config.defaultPricePicoUSD,\n    });\n\n    // Initialize HubBalanceService (always enabled)\n    this.hubBalanceService = new HubBalanceService({\n      contract: deps.contract,\n      defaultAssetId: config.defaultAssetId || '0x3::gas_coin::RGas',\n      ttlMs: config.hubBalance?.ttlMs,\n      negativeTtlMs: config.hubBalance?.negativeTtlMs,\n      staleWhileRevalidateMs: config.hubBalance?.staleWhileRevalidateMs,\n      maxEntries: config.hubBalance?.maxEntries,\n      debug: config.debug,\n    });\n\n    // Initialize ClaimTriggerService with flattened config\n    this.claimTriggerService = new ClaimTriggerService({\n      policy: {\n        minClaimAmount: this.config.claim?.minClaimAmount,\n        maxConcurrentClaims: this.config.claim?.maxConcurrentClaims,\n        maxRetries: this.config.claim?.maxRetries,\n        retryDelayMs: this.config.claim?.retryDelayMs,\n        requireHubBalance: this.config.claim?.requireHubBalance,\n      },\n      contract: deps.contract,\n      signer: deps.signer, // Pass the payee signer\n      ravRepo: this.ravRepo,\n      channelRepo: this.channelRepo,\n      debug: config.debug,\n    });\n\n    const claimPolicy = this.claimTriggerService.getPolicy();\n\n    // Initialize PaymentProcessor with config\n    this.processor = new PaymentProcessor({\n      payeeClient: this.payeeClient,\n      serviceId: config.serviceId,\n      defaultAssetId: config.defaultAssetId,\n      rateProvider: this.rateProvider,\n      pendingSubRAVStore: this.pendingSubRAVRepo,\n      ravRepository: this.ravRepo,\n      didResolver: this.payeeClient.getDidResolver(),\n      hubBalanceService: this.hubBalanceService,\n      claimTriggerService: this.claimTriggerService,\n      minClaimAmount: claimPolicy.minClaimAmount,\n      debug: config.debug,\n    });\n\n    // Create HTTP billing middleware with ClaimScheduler\n    this.middleware = new HttpBillingMiddleware({\n      processor: this.processor,\n      ruleProvider: this.billableRouter,\n    });\n\n    // Create main router\n    this.router = express.Router();\n\n    // Set up discovery endpoint and routes\n    this.setupRoutes();\n\n    // Polling scheduler removed; reactive claim mode is default\n  }\n\n  /**\n   * Resolve storage repositories based on environment variables.\n   * Priority: PAYMENTKIT_CONNECTION_STRING > SUPABASE_DB_URL > DATABASE_URL.\n   * Backend selection: PAYMENTKIT_BACKEND or infer from connection string.\n   */\n  private resolveStorageFromEnv(): {\n    channelRepo: ChannelRepository;\n    ravRepo: RAVRepository;\n    pendingSubRAVRepo: PendingSubRAVRepository;\n  } {\n    const backendEnv = process.env.PAYMENTKIT_BACKEND as 'sql' | 'memory' | undefined;\n    const backend: 'sql' | 'memory' = backendEnv === 'sql' ? 'sql' : 'memory';\n    const connectionString =\n      backend === 'sql'\n        ? process.env.PAYMENTKIT_CONNECTION_STRING ||\n          process.env.SUPABASE_DB_URL ||\n          process.env.DATABASE_URL\n        : undefined;\n\n    const tablePrefix = process.env.PAYMENTKIT_TABLE_PREFIX || 'nuwa_';\n    const autoMigrate =\n      process.env.PAYMENTKIT_AUTO_MIGRATE === 'true' || process.env.NODE_ENV !== 'production';\n\n    let channelRepo: ChannelRepository;\n    let ravRepo: RAVRepository;\n    let pendingSubRAVRepo: PendingSubRAVRepository;\n    if (backend === 'sql') {\n      // Defer Pool creation to runtime via dynamic import factory\n      // eslint-disable-next-line @typescript-eslint/no-var-requires\n      const sql = require('../../storage/sql/index');\n      const repos = sql.createSqlStorageRepositories({\n        connectionString: connectionString!,\n        tablePrefix,\n        autoMigrate,\n        allowUnsafeAutoMigrateInProd:\n          process.env.PAYMENTKIT_ALLOW_UNSAFE_AUTO_MIGRATE_IN_PROD === 'true',\n      });\n      // If it returned a Promise (ESM dynamic factory), this will be a thenable\n      if (typeof repos.then === 'function') {\n        throw new Error(\n          'createSqlStorageRepositories() is async; use the async factory to build ExpressPaymentKit or pre-create repositories and inject'\n        );\n      }\n      ({ channelRepo, ravRepo, pendingSubRAVRepo } = repos);\n    } else {\n      ({ channelRepo, ravRepo, pendingSubRAVRepo } = createStorageRepositories({\n        backend: 'memory',\n        tablePrefix,\n        autoMigrate,\n      }));\n    }\n\n    return { channelRepo, ravRepo, pendingSubRAVRepo };\n  }\n\n  /**\n   * Set up all routes including discovery endpoint and payment-related routes\n   */\n  private setupRoutes(): void {\n    const basePath = this.config.basePath || '/payment-channel';\n\n    // Create API context for handlers\n    const apiContext: ApiContext = {\n      config: {\n        serviceId: this.config.serviceId,\n        serviceDid: this.serviceDid,\n        defaultAssetId: this.config.defaultAssetId || '0x3::gas_coin::RGas',\n        defaultPricePicoUSD: this.config.defaultPricePicoUSD?.toString(),\n        adminDid: this.config.adminDid,\n        debug: this.config.debug,\n      },\n      payeeClient: this.payeeClient,\n      rateProvider: this.rateProvider,\n      // Expose reactive claim trigger for admin/status handlers\n      claimTriggerService: this.claimTriggerService,\n      processor: this.processor,\n      ravRepository: this.ravRepo,\n      channelRepo: this.channelRepo,\n      pendingSubRAVStore: this.pendingSubRAVRepo,\n    };\n\n    // 1. Discovery endpoint (well-known, completely public - no middleware)\n    // This is handled directly to maintain compatibility and avoid billing\n    this.router.get('/.well-known/nuwa-payment/info', (req: Request, res: Response) => {\n      this.handleDiscoveryRequest(req, res);\n    });\n\n    // 2. Register built-in handlers with prefix using the single BillableRouter\n    registerHandlersWithBillableRouter(BuiltInApiHandlers, apiContext, this.billableRouter, {\n      pathPrefix: basePath,\n    });\n\n    // 3. Create billing middleware wrapper and mount all routes\n    const billingWrapper = this.createBillingWrapper();\n    this.router.use(billingWrapper);\n    this.router.use(this.billableRouter.router);\n  }\n\n  /**\n   * Handle discovery requests for the well-known endpoint\n   * Note: Uses direct response format (not ApiResponse) to comply with well-known URI standards\n   */\n  private handleDiscoveryRequest(req: Request, res: Response): void {\n    const discoveryInfo: any = {\n      version: 1,\n      serviceId: this.config.serviceId,\n      serviceDid: this.serviceDid,\n      network: this.config.network || 'test',\n      defaultAssetId: this.config.defaultAssetId || '0x3::gas_coin::RGas',\n      basePath: this.config.basePath || '/payment-channel',\n    };\n\n    if (this.config.defaultPricePicoUSD) {\n      discoveryInfo.defaultPricePicoUSD = this.config.defaultPricePicoUSD.toString();\n    }\n\n    // Set cache headers as recommended in the spec\n    res.set('Cache-Control', 'max-age=3600, public');\n    res.json(discoveryInfo);\n  }\n\n  /**\n   * Create billing middleware wrapper with automatic pre/post-flight detection\n   */\n  private createBillingWrapper(): RequestHandler {\n    return async (req: Request, res: Response, next: NextFunction) => {\n      try {\n        // Step 1: Find matching billing rule to determine auth and billing requirements\n        const rule = this.billableRouter.findRule(req.method, req.path);\n\n        // Step 2: Authentication (based on rule configuration)\n        const needAuth = rule?.authRequired ?? false;\n        const needAdminAuth = rule?.adminOnly ?? false;\n\n        if (needAuth || needAdminAuth) {\n          await this.performDIDAuth(req, res);\n        }\n\n        if (needAdminAuth) {\n          await this.performAdminAuth(req, res);\n        }\n\n        // Step 3: Apply billing middleware (for all registered routes)\n        if (rule) {\n          // Create response adapter for framework-agnostic billing\n          const resAdapter = this.createResponseAdapter(res);\n\n          // Use new unified billing API\n          const billingContext = await this.middleware.handleWithNewAPI(req);\n\n          if (!billingContext) {\n            // No billing rule matched - proceed without payment\n\n            return next();\n          }\n\n          // Unified handling for both pre-flight and post-flight\n          res.locals.billingContext = billingContext;\n\n          // If processor marked a protocol-level error, short-circuit and return immediately\n          // Note: This is the error short-circuit from the pre-processing stage. The header writing in onHeaders is the unified exit for the settlement stage.\n          if (billingContext.state?.error) {\n            const err = billingContext.state.error as { code: string; message?: string };\n            const status = this.mapErrorCodeToHttpStatus(err.code);\n            // Prefer structured responsePayload (may include pending subRav for auto-retry)\n            const payload = billingContext.state.responsePayload;\n            const headerValue = payload\n              ? HttpPaymentCodec.buildResponseHeader(payload)\n              : this.buildProtocolErrorHeader(req, err);\n\n            // Enhanced logging for PAYMENT_REQUIRED responses\n            if (err.code === 'PAYMENT_REQUIRED') {\n              const debugInfo = {\n                hasPayload: !!payload,\n                hasSubRav: !!(payload as any)?.subRav,\n                errorMessage: err.message,\n                clientTxRef: (payload as any)?.clientTxRef,\n                subRavNonce: (payload as any)?.subRav?.nonce?.toString(),\n                headerLength: headerValue.length,\n                usingFallbackHeader: !payload,\n              };\n              this.logger.debug('[ExpressPaymentKit] PAYMENT_REQUIRED response debug:', debugInfo);\n\n              // Critical warning if we're using fallback header for PAYMENT_REQUIRED\n              if (!payload) {\n                this.logger.warn(\n                  '[ExpressPaymentKit] CRITICAL: PAYMENT_REQUIRED without responsePayload - client cannot auto-retry!',\n                  {\n                    errorMessage: err.message,\n                    billingContextState: billingContext.state\n                      ? Object.keys(billingContext.state)\n                      : 'no state',\n                  }\n                );\n              }\n            }\n\n            this.ensureExposeHeader(res);\n            res.setHeader(HttpPaymentCodec.getHeaderName(), headerValue);\n\n            return res.status(status).json({\n              success: false,\n              error: { code: err.code, message: err.message, httpStatus: status },\n            });\n          }\n\n          let billingCompleted = false;\n          let headerWritten = false;\n          const isStreaming = isStreamingRequest(req as any, rule as any);\n\n          // Intercept headers to write payment header synchronously\n          // Note: This is the unified exit for the settlement stage, which writes the success/failure payment header; it is complementary to the pre-processing error short-circuit rather than redundant.\n          if (!isStreaming) {\n            onHeaders(res, () => {\n              if (headerWritten) return;\n              headerWritten = true;\n              try {\n                this.ensureExposeHeader(res);\n                const raw = (res.locals as any).usage;\n                const units =\n                  typeof raw === 'number' && Number.isFinite(raw) && raw >= 0 ? Math.floor(raw) : 0;\n                this.middleware.settleBillingSync(billingContext, units, resAdapter);\n              } catch (error) {}\n            });\n          }\n\n          // Inject in-band payment frame for streaming just before end (best-effort)\n          if (isStreaming) {\n            const originalEnd = (res as any).end?.bind(res) || res.end;\n            (res as any).end = (...args: any[]) => {\n              try {\n                if (!billingCompleted) {\n                  const raw = (res.locals as any).usage;\n                  const units =\n                    typeof raw === 'number' && Number.isFinite(raw) && raw >= 0\n                      ? Math.floor(raw)\n                      : 0;\n                  const settled: any = this.processor.settle(billingContext, units);\n                  if (!headerWritten) {\n                    try {\n                      this.ensureExposeHeader(res);\n                      const payload = settled?.state?.responsePayload;\n                      const header = payload\n                        ? HttpPaymentCodec.buildResponseHeader(payload as any)\n                        : undefined;\n                      if (header) res.setHeader('X-Payment-Channel-Data', header);\n                    } catch {}\n                  }\n                  try {\n                    const payload = settled?.state?.responsePayload;\n                    const headerValue: string | undefined = payload\n                      ? HttpPaymentCodec.buildResponseHeader(payload as any)\n                      : undefined;\n                    if (headerValue) {\n                      const ct = (res.getHeader('Content-Type') as string) || '';\n                      const sseObj = { nuwa_payment_header: headerValue };\n                      const ndjsonObj = { __nuwa_payment_header__: headerValue };\n                      const frameSSE = `data: ${JSON.stringify(sseObj)}\\n\\n`;\n                      const frameNDJSON = JSON.stringify(ndjsonObj) + '\\n';\n                      if (ct.includes('text/event-stream')) {\n                        try {\n                          // Ensure event boundary so we don't concatenate into previous frame\n                          (res as any).write?.('\\n\\n');\n                          (res as any).write?.(frameSSE);\n                        } catch {}\n                      } else if (ct.includes('application/x-ndjson')) {\n                        try {\n                          // Ensure record boundary for NDJSON\n                          (res as any).write?.('\\n');\n                          (res as any).write?.(frameNDJSON);\n                        } catch {}\n                      } else {\n                        // For other content types, do not force insertion to avoid breaking protocol\n                        this.logger.warn('Streaming response with unsupported content type:', ct);\n                      }\n                    }\n                  } catch {}\n                  if (settled?.state?.unsignedSubRav) {\n                    // TODO: Race condition - the in-band payment frame is sent before this async\n                    // persist completes. If client sends next request immediately, server may not\n                    // find the pending SubRAV yet. See temporary workaround in RavVerifier.ts\n                    this.middleware.persistBilling(settled).catch(() => {});\n                  }\n                  billingCompleted = true;\n                }\n              } catch {}\n              return originalEnd(...args);\n            };\n          }\n\n          // Persist after response is sent\n          res.on('finish', async () => {\n            if (billingCompleted) return;\n            billingCompleted = true;\n            try {\n              if (isStreaming) {\n                // Streaming: settle at finish and persist\n                const raw = (res.locals as any).usage;\n                const units =\n                  typeof raw === 'number' && Number.isFinite(raw) && raw >= 0 ? Math.floor(raw) : 0;\n                const settled = this.processor.settle(billingContext, units) as any;\n                if (!headerWritten) {\n                  // Trailers are not widely supported; rely on polling/in-band. Still expose header if possible.\n                  try {\n                    this.ensureExposeHeader(res);\n                    const payload = settled?.state?.responsePayload;\n                    const header = payload\n                      ? HttpPaymentCodec.buildResponseHeader(payload as any)\n                      : undefined;\n                    if (header) res.setHeader('X-Payment-Channel-Data', header);\n                  } catch {}\n                }\n                if (settled?.state?.unsignedSubRav) {\n                  await this.middleware.persistBilling(settled);\n                }\n              } else if (billingContext.state?.unsignedSubRav) {\n                await this.middleware.persistBilling(billingContext);\n              }\n            } catch (error) {}\n          });\n\n          return next();\n        } else {\n        }\n\n        next();\n      } catch (error) {\n        // Detailed trace logging for 500 errors\n        try {\n          this.logger.error('[billingWrapper.500]', {\n            method: req.method,\n            url: req.originalUrl || req.url,\n            message: error instanceof Error ? error.message : String(error),\n            stack: error instanceof Error ? error.stack : undefined,\n          } as any);\n        } catch {}\n\n        res.status(500).json({\n          error: 'Payment processing failed',\n          details: error instanceof Error ? error.message : String(error),\n        });\n      }\n    };\n  }\n\n  /**\n   * Ensure CORS exposes our payment header to browsers so client JS can read it.\n   */\n  private ensureExposeHeader(res: Response) {\n    const headerName = HttpPaymentCodec.getHeaderName();\n    const existing = res.getHeader('Access-Control-Expose-Headers');\n    const current = (\n      Array.isArray(existing) ? existing.join(',') : (existing as string | undefined) || ''\n    )\n      .split(',')\n      .map(s => s.trim())\n      .filter(Boolean);\n    if (!current.map(s => s.toLowerCase()).includes(headerName.toLowerCase())) {\n      current.push(headerName);\n      res.setHeader('Access-Control-Expose-Headers', current.join(', '));\n    }\n  }\n\n  /**\n   * Perform admin authorization check\n   */\n  private async performAdminAuth(req: express.Request, res: express.Response): Promise<void> {\n    try {\n      // Get allowed admin DIDs (default to service DID)\n      const allowedDids = Array.isArray(this.config.adminDid)\n        ? this.config.adminDid\n        : this.config.adminDid\n          ? [this.config.adminDid]\n          : [this.serviceDid];\n\n      // Get DID from request (set by performDIDAuth)\n      const didInfo = (req as any).didInfo;\n      if (!didInfo || !didInfo.did) {\n        throw new Error('DID authentication required for admin access');\n      }\n\n      // Check if signer DID is authorized for admin operations\n      const signerDid = didInfo.did;\n      if (!allowedDids.includes(signerDid)) {\n        throw new Error(`Access denied. DID ${signerDid} not authorized for admin operations`);\n      }\n\n      if (this.config.debug) {\n        this.logger.debug(`✅ Admin authorization successful for DID: ${signerDid}`);\n      }\n    } catch (error) {\n      throw new Error(\n        `Admin authorization failed: ${error instanceof Error ? error.message : String(error)}`\n      );\n    }\n  }\n\n  /**\n   * Perform DID authentication using DIDAuthV1 scheme\n   */\n  private async performDIDAuth(req: express.Request, res: express.Response): Promise<void> {\n    const AUTH_SCHEME = 'DIDAuthV1';\n    const HEADER_PREFIX = `${AUTH_SCHEME} `;\n\n    try {\n      const authHeader = req.headers.authorization;\n\n      if (this.config.debug) {\n        console.log(\n          `🔐 performDIDAuth: Authorization present=${!!authHeader}, startsWithDIDAuthV1=${\n            !!authHeader && authHeader.startsWith(HEADER_PREFIX)\n          }`\n        );\n      }\n\n      if (!authHeader || !authHeader.startsWith(HEADER_PREFIX)) {\n        throw new Error('Missing or invalid Authorization header');\n      }\n\n      // Perform cryptographic verification via Nuwa Identity Kit\n      const verifyResult = await DIDAuth.v1.verifyAuthHeader(authHeader, VDRRegistry.getInstance());\n\n      if (!verifyResult.ok) {\n        throw new Error(verifyResult.error);\n      }\n\n      // Success path: extract signer DID and set it on the request\n      (req as any).didInfo = {\n        did: verifyResult.signedObject.signature.signer_did,\n        keyId: verifyResult.signedObject.signature.key_id,\n      };\n    } catch (error) {\n      throw new Error(\n        `DID authentication failed: ${error instanceof Error ? error.message : String(error)}`\n      );\n    }\n  }\n\n  // HTTP verb methods\n  get(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this {\n    this.validateRouteOptions(options);\n    this.billableRouter.get(path, options, handler, ruleId);\n    return this;\n  }\n\n  post(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this {\n    this.validateRouteOptions(options);\n    this.billableRouter.post(path, options, handler, ruleId);\n    return this;\n  }\n\n  put(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this {\n    this.validateRouteOptions(options);\n    this.billableRouter.put(path, options, handler, ruleId);\n    return this;\n  }\n\n  delete(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this {\n    this.validateRouteOptions(options);\n    this.billableRouter.delete(path, options, handler, ruleId);\n    return this;\n  }\n\n  patch(\n    path: string | RegExp,\n    options: RouteOptions,\n    handler: RequestHandler,\n    ruleId?: string\n  ): this {\n    this.validateRouteOptions(options);\n    this.billableRouter.patch(path, options, handler, ruleId);\n    return this;\n  }\n\n  /**\n   * Validate route options according to the security rules\n   */\n  private validateRouteOptions(options: RouteOptions): void {\n    const pricing = typeof options.pricing === 'string' ? BigInt(options.pricing) : options.pricing;\n    const pricingAmount = typeof pricing === 'bigint' ? pricing : BigInt(0);\n\n    // Rule: If pricing > 0 and authRequired is explicitly false, throw error\n    if (pricingAmount > 0 && options.authRequired === false) {\n      throw new Error(\n        'Cannot create anonymous paid endpoints: pricing > 0 requires authRequired to be true or undefined'\n      );\n    }\n\n    // Rule: If adminOnly is true and authRequired is explicitly false, throw error\n    if (options.adminOnly && options.authRequired === false) {\n      throw new Error(\n        'Cannot create admin endpoints without authentication: adminOnly requires authRequired to be true or undefined'\n      );\n    }\n  }\n\n  /**\n   * Create Express ResponseAdapter for framework-agnostic billing\n   */\n  private createResponseAdapter(res: Response): ResponseAdapter {\n    return {\n      setStatus: (code: number) => {\n        res.status(code);\n        return this.createResponseAdapter(res);\n      },\n      json: (obj: any) => {\n        res.json(obj);\n      },\n      setHeader: (name: string, value: string) => {\n        if (!res.headersSent) {\n          res.setHeader(name, value);\n        } else if (this.config.debug) {\n          console.warn(`⚠️ Cannot set header '${name}' after headers sent`);\n        }\n        return this.createResponseAdapter(res);\n      },\n    };\n  }\n\n  /**\n   * Map PaymentError code to HTTP status code (shared by preProcess short-circuit)\n   */\n  private mapErrorCodeToHttpStatus(code?: string): number {\n    return httpStatusFor(code as PaymentErrorCode);\n  }\n\n  /**\n   * Build protocol error header consistently from request headers and error\n   */\n  private buildProtocolErrorHeader(req: Request, err: { code: string; message?: string }): string {\n    let clientTxRef: string | undefined;\n    try {\n      const headerValueIn = HttpPaymentCodec.extractPaymentHeader(req.headers as any);\n      if (headerValueIn) {\n        const payload = HttpPaymentCodec.parseRequestHeader(headerValueIn);\n        clientTxRef = payload.clientTxRef;\n      }\n    } catch {}\n    return HttpPaymentCodec.buildResponseHeader({\n      error: { code: err.code, message: err.message },\n      clientTxRef,\n      version: 1,\n    } as any);\n  }\n\n  /**\n   * Get the underlying PayeeClient for advanced operations\n   */\n  getPayeeClient(): PaymentChannelPayeeClient {\n    return this.payeeClient;\n  }\n}\n\n/**\n * Create an ExpressPaymentKit instance\n */\nexport async function createExpressPaymentKit(\n  config: ExpressPaymentKitOptions\n): Promise<ExpressPaymentKit> {\n  // Validate configuration\n  if (!config.signer) {\n    throw new Error('Service private key (signer) is required');\n  }\n\n  // Get service DID from signer\n  const serviceDid = await (async () => {\n    const maybe = (config.signer as any).getDid?.();\n    return typeof maybe?.then === 'function' ? await maybe : maybe;\n  })();\n\n  // Set up blockchain connection\n  const rpcUrl = config.rpcUrl;\n  const network = config.network || 'test';\n\n  // Initialize contract\n  const contract = new RoochPaymentChannelContract({\n    rpcUrl,\n    network,\n    debug: config.debug || false,\n  });\n\n  // Set up DID resolver with VDRRegistry\n  const roochVDR = new RoochVDR({\n    rpcUrl,\n    network,\n  });\n\n  const vdrRegistry = VDRRegistry.getInstance();\n  vdrRegistry.registerVDR(roochVDR);\n\n  // Create default ContractRateProvider\n  const rateProvider = new ContractRateProvider(contract, 30_000);\n\n  // Optionally prebuild SQL storage repos via dynamic import so callers don't need changes\n  let prebuiltStorage:\n    | {\n        channelRepo: ChannelRepository;\n        ravRepo: RAVRepository;\n        pendingSubRAVRepo: PendingSubRAVRepository;\n      }\n    | undefined;\n\n  try {\n    const backendEnv = process.env.PAYMENTKIT_BACKEND as 'sql' | 'memory' | undefined;\n    if (backendEnv === 'sql') {\n      const connectionString =\n        process.env.PAYMENTKIT_CONNECTION_STRING ||\n        process.env.SUPABASE_DB_URL ||\n        process.env.DATABASE_URL;\n      if (!connectionString) {\n        throw new Error(\n          'PAYMENTKIT_BACKEND=sql requires PAYMENTKIT_CONNECTION_STRING (or SUPABASE_DB_URL / DATABASE_URL)'\n        );\n      }\n      const { createSqlStorageRepositories }: any = await import('../../storage/sql/index');\n      prebuiltStorage = await createSqlStorageRepositories({\n        connectionString,\n        tablePrefix: process.env.PAYMENTKIT_TABLE_PREFIX || 'nuwa_',\n        autoMigrate:\n          process.env.PAYMENTKIT_AUTO_MIGRATE === 'true' || process.env.NODE_ENV !== 'production',\n        allowUnsafeAutoMigrateInProd:\n          process.env.PAYMENTKIT_ALLOW_UNSAFE_AUTO_MIGRATE_IN_PROD === 'true',\n      });\n    }\n  } catch (e) {\n    // If SQL setup fails, surface meaningful error; otherwise continue with memory backend\n    if ((process.env.PAYMENTKIT_BACKEND as string) === 'sql') {\n      throw e;\n    }\n  }\n\n  return new ExpressPaymentKitImpl(\n    config,\n    {\n      contract,\n      signer: config.signer,\n      didResolver: vdrRegistry,\n      rateProvider,\n      serviceDid,\n    },\n    prebuiltStorage\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Express augmentation to include `didInfo`\n// ---------------------------------------------------------------------------\n\ndeclare global {\n  namespace Express {\n    interface Request {\n      didInfo?: {\n        did: string;\n        keyId: string;\n      };\n    }\n  }\n}\n","import type { Request } from 'express';\n\n/**\n * Determine whether the current HTTP request should be treated as streaming.\n *\n * Heuristics:\n * - Explicit route option: rule.streaming === true\n * - Body flag: body.stream === true\n * - Query flag: ?stream=true\n * - Path hint: contains ':stream' suffix\n */\nexport function isStreamingRequest(req: Request, rule?: { streaming?: boolean }): boolean {\n  const routeStreaming = !!(rule as any)?.streaming;\n  const bodyStreaming = typeof req.body === 'object' && !!(req as any).body?.stream === true;\n  const queryStreaming =\n    typeof req.query === 'object' &&\n    (((req.query as any).stream as any) === 'true' || ((req.query as any).stream as any) === true);\n  const pathStreaming = typeof req.path === 'string' && req.path.includes(':stream');\n  return routeStreaming || bodyStreaming || queryStreaming || pathStreaming;\n}\n","/**\n * IdentityEnv integration for ExpressPaymentKit\n */\n\nimport type { IdentityEnv } from '@nuwa-ai/identity-kit';\nimport { getChainConfigFromEnv } from '../../helpers/fromIdentityEnv';\nimport {\n  createExpressPaymentKit,\n  type ExpressPaymentKitOptions,\n  type ExpressPaymentKit,\n} from './ExpressPaymentKit';\n\n/**\n * Create ExpressPaymentKit using IdentityEnv's KeyManager and chain config\n *\n * @param env IdentityEnv instance\n * @param opts ExpressPaymentKitOptions without signer, rpcUrl, and network (will be provided by env)\n * @returns Promise resolving to configured ExpressPaymentKit instance\n */\nexport async function createExpressPaymentKitFromEnv(\n  env: IdentityEnv,\n  opts: Omit<ExpressPaymentKitOptions, 'signer' | 'rpcUrl' | 'network'>\n): Promise<ExpressPaymentKit> {\n  const chainConfig = getChainConfigFromEnv(env);\n\n  // Type assertion to ensure we have a rooch chain config\n  if (chainConfig.chain !== 'rooch') {\n    throw new Error(\n      `Unsupported chain type: ${chainConfig.chain}. Only 'rooch' is currently supported.`\n    );\n  }\n\n  return createExpressPaymentKit({\n    ...opts,\n    signer: env.keyManager,\n    rpcUrl: chainConfig.rpcUrl,\n    network: chainConfig.network,\n  });\n}\n","// Factory that creates MCP servers using either fastmcp or official SDK engine\n// Supports seamless switching via MCP_ENGINE environment variable\n\nimport { FastMcpServerOptions, createFastMcpServer } from './FastMcpStarter';\nimport { SdkMcpServerOptions, createSdkMcpServer } from './SdkMcpStarter';\nimport type { IdentityEnv } from '@nuwa-ai/identity-kit';\n\n// Common options that work for both engines\nexport interface McpServerCommonOptions {\n  serviceId?: string;\n  signer?: any;\n  rpcUrl?: string;\n  network?: 'main' | 'test';\n  debug?: boolean;\n  port?: number;\n  endpoint?: `/${string}`;\n  wellKnown?: {\n    enabled?: boolean;\n    path?: `/${string}`;\n  };\n  customRouteHandler?: (req: any, res: any) => Promise<boolean> | boolean;\n  defaultAssetId?: string;\n  defaultPricePicoUSD?: bigint;\n}\n\nexport interface McpServerOptions extends McpServerCommonOptions {\n  engine?: 'fastmcp' | 'sdk' | 'legacy' | 'official';\n  // Allow any additional engine-specific properties\n  [key: string]: any;\n}\n\nexport interface McpServerFactory {\n  createServer(opts: McpServerOptions): Promise<{\n    addTool: (def: {\n      name: string;\n      description: string;\n      parameters?: any;\n      execute: (params: any, context?: any) => Promise<any> | any;\n      options?: any;\n    }) => void;\n    freeTool: (def: {\n      name: string;\n      description: string;\n      parameters?: any;\n      execute: (params: any, context?: any) => Promise<any> | any;\n    }) => void;\n    paidTool: (def: {\n      name: string;\n      description: string;\n      pricePicoUSD: bigint;\n      parameters?: any;\n      execute: (params: any, context?: any) => Promise<any> | any;\n    }) => void;\n    addPrompt: (def: {\n      name: string;\n      description: string;\n      arguments?: any[];\n      load: (args: any) => Promise<string> | string;\n    }) => void;\n    addResource: (def: {\n      uri: string;\n      name: string;\n      mimeType: string;\n      load: () => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n    }) => void;\n    addResourceTemplate: (def: {\n      uriTemplate: string;\n      name: string;\n      mimeType: string;\n      arguments?: any[];\n      load: (args: any) => Promise<{ text?: string; blob?: any }> | { text?: string; blob?: any };\n    }) => void;\n    start: () => Promise<any>;\n    getInner: () => any;\n  }>;\n}\n\nclass DefaultMcpServerFactory implements McpServerFactory {\n  async createServer(opts: McpServerOptions) {\n    // Check explicit engine option first\n    if (opts.engine === 'sdk' || opts.engine === 'official') {\n      return createSdkMcpServer(opts as SdkMcpServerOptions);\n    } else if (opts.engine === 'fastmcp' || opts.engine === 'legacy') {\n      return createFastMcpServer(opts as FastMcpServerOptions);\n    }\n\n    // Fall back to environment variable or default\n    const envEngine = this.getEngineFromEnv();\n    if (envEngine === 'sdk') {\n      return createSdkMcpServer(opts as SdkMcpServerOptions);\n    } else {\n      return createFastMcpServer(opts as FastMcpServerOptions);\n    }\n  }\n\n  private getEngineFromEnv(): 'fastmcp' | 'sdk' | null {\n    const envEngine = process.env.MCP_ENGINE?.toLowerCase();\n    if (envEngine === 'sdk' || envEngine === 'official') {\n      return 'sdk';\n    }\n    if (envEngine === 'fastmcp' || envEngine === 'legacy') {\n      return 'fastmcp';\n    }\n    return null;\n  }\n}\n\nconst factory = new DefaultMcpServerFactory();\n\n/**\n * Create an MCP server using the engine specified by MCP_ENGINE environment variable\n * or explicit engine option. Default: fastmcp for backwards compatibility.\n *\n * Environment variables:\n * - MCP_ENGINE=fastmcp (default) or MCP_ENGINE=legacy\n * - MCP_ENGINE=sdk or MCP_ENGINE=official\n */\nexport async function createMcpServer(opts: McpServerOptions) {\n  return factory.createServer(opts);\n}\n\n/**\n * Convenience: start MCP server using IdentityEnv (env.keyManager + VDR chain config)\n * Engine selection follows MCP_ENGINE environment variable.\n */\nexport async function createMcpServerFromEnv(\n  env: IdentityEnv,\n  opts: Omit<McpServerOptions, 'signer' | 'rpcUrl' | 'network'>\n) {\n  // Check explicit engine option first\n  if (opts.engine === 'sdk' || opts.engine === 'official') {\n    const { createSdkMcpServerFromEnv } = await import('./SdkMcpStarter');\n    return createSdkMcpServerFromEnv(env, opts as Omit<SdkMcpServerOptions, 'signer' | 'rpcUrl' | 'network'>);\n  } else if (opts.engine === 'fastmcp' || opts.engine === 'legacy') {\n    const { createFastMcpServerFromEnv } = await import('./FastMcpStarter');\n    return createFastMcpServerFromEnv(env, opts as Omit<FastMcpServerOptions, 'signer' | 'rpcUrl' | 'network'>);\n  }\n\n  // Fall back to environment variable or default\n  const envEngine = process.env.MCP_ENGINE?.toLowerCase();\n  if (envEngine === 'sdk' || envEngine === 'official') {\n    const { createSdkMcpServerFromEnv } = await import('./SdkMcpStarter');\n    return createSdkMcpServerFromEnv(env, opts as Omit<SdkMcpServerOptions, 'signer' | 'rpcUrl' | 'network'>);\n  } else {\n    const { createFastMcpServerFromEnv } = await import('./FastMcpStarter');\n    return createFastMcpServerFromEnv(env, opts as Omit<FastMcpServerOptions, 'signer' | 'rpcUrl' | 'network'>);\n  }\n}\n\n// Export factory for testing or custom configurations\nexport { DefaultMcpServerFactory };\nexport { factory as mcpServerFactory };\n\n// Re-export types for convenience\nexport type { FastMcpServerOptions, SdkMcpServerOptions };"],"mappings":"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","names":["vm","PaymentErrorCode","import_identity_kit","import_rooch_sdk","import_identity_kit","import_identity_kit","import_rooch_sdk","import_identity_kit","import_rooch_sdk","import_identity_kit","import_identity_kit","error","import_lossless_json","import_identity_kit","window","window","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","express","import_identity_kit","init_recovery","init_commit","import_identity_kit","init_admin","init_subrav","init_health","init_recovery","init_commit","init_admin","init_subrav","init_health","init_api","import_identity_kit","import_identity_kit","import_identity_kit","verify","import_identity_kit","init_api","content","result","jsonSchema","import_zod","import_identity_kit","logger","import_zod","import_identity_kit","PaymentMcpToolRegistrar","logger","McpServer","createHttpServer","parseUrl","origin","import_streamableHttp","import_types","import_identity_kit","express","import_identity_kit","import_rooch_sdk","import_identity_kit","import_identity_kit","import_identity_kit","e","import_identity_kit","import_identity_kit","import_identity_kit","import_identity_kit","import_identity_kit","McpServerType","import_identity_kit","McpClient","import_identity_kit","import_client","import_streamableHttp","import_identity_kit","McpClient","options","import_identity_kit","import_client","import_streamableHttp","result","McpClient","options","import_identity_kit","import_express","import_identity_kit","init_api","express","onHeaders","createSqlStorageRepositories","init_api","createSdkMcpServerFromEnv","createFastMcpServerFromEnv"]}