@hsuite/smart-engines-sdk 3.1.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1249 -1009
- package/dist/index.js +6243 -892
- package/dist/index.js.map +1 -1
- package/dist/nestjs/index.d.ts +1005 -871
- package/dist/nestjs/index.js +5479 -317
- package/dist/nestjs/index.js.map +1 -1
- package/dist/pqc-verify/index.d.ts +99 -0
- package/dist/pqc-verify/index.js +167 -0
- package/dist/pqc-verify/index.js.map +1 -0
- package/package.json +10 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/_vendor/circuit-breaker.ts","../src/_vendor/rate-limiter.ts","../src/_vendor/smart-engine.error.ts","../src/_vendor/capability.error.ts","../src/_vendor/chain.schema.ts","../src/_vendor/network-types.ts","../src/_vendor/capabilities.schema.ts","../src/_vendor/account.schema.ts","../src/_vendor/sovereignty.schema.ts","../src/_vendor/transaction.schema.ts","../src/_vendor/token.schema.ts","../src/_vendor/api.schema.ts","../src/discovery/index.ts","../src/discovery/mirror-node.ts","../src/discovery/validator-discovery.ts","../src/discovery/cluster-discovery.ts","../src/auth/index.ts","../src/auth/validator-auth.ts","../src/http/index.ts","../src/subscription/index.ts","../src/tss/index.ts","../src/ipfs/index.ts","../src/transactions/index.ts","../src/snapshots/index.ts","../src/historical-balance/historical-balance-client.ts","../src/settlement/index.ts","../src/governance/index.ts","../src/governance/governance-client.ts","../src/personhood/index.ts","../src/personhood/personhood-client.ts","../src/client.ts","../src/gateway/routing/index.ts","../src/gateway/domains/index.ts","../src/gateway/dns/index.ts","../src/gateway/client.ts","../src/http/resilient-http.ts","../src/chains/index.ts","../src/chains/hedera.ts","../src/chains/xrpl.ts","../src/chains/polkadot.ts","../src/chains/solana.ts","../src/chains/stellar.ts","../src/chains/bitcoin.ts","../src/baas/index.ts","../src/baas/database/index.ts","../src/baas/storage/index.ts","../src/baas/functions/index.ts","../src/baas/messaging/index.ts","../src/baas/deployment/index.ts","../src/baas/agents/types.ts","../src/baas/agents/index.ts","../src/baas/customer-session/index.ts","../src/baas/client.ts"],"names":["z","SmartEngineError","validateUrl"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Circuit Breaker Utility\n *\n * Implements the circuit breaker pattern to prevent cascading failures\n * when a downstream chain endpoint (RPC, mirror node, indexer) becomes\n * unhealthy. The breaker has three states:\n *\n * - CLOSED: Operations flow through. Failures are counted in a rolling window.\n * - OPEN: Operations short-circuit immediately with a CircuitBreakerOpenError.\n * - HALF_OPEN: A single probe operation is allowed through. Success closes the\n * breaker; failure re-opens it with the same cool-down.\n *\n * This is intentionally dependency-free so it can be embedded inside the\n * chain adapter base class without pulling in additional packages.\n */\n\nexport type CircuitState = 'closed' | 'open' | 'half_open';\n\nexport interface CircuitBreakerConfig {\n /** Number of consecutive failures within the rolling window that trips the breaker */\n failureThreshold: number;\n /** Length of the rolling window used to count failures (ms) */\n rollingWindowMs: number;\n /** How long the breaker stays OPEN before allowing a HALF_OPEN probe (ms) */\n cooldownMs: number;\n /** Optional list of error message/name substrings to count as failures.\n * When omitted, every error counts. */\n failureFilter?: string[];\n /** Optional name for log/metric output */\n name?: string;\n}\n\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n rollingWindowMs: 60_000,\n cooldownMs: 30_000,\n name: 'circuit',\n};\n\nexport interface CircuitBreakerSnapshot {\n state: CircuitState;\n failureCount: number;\n successCount: number;\n lastFailureAt?: number;\n openedAt?: number;\n nextProbeAt?: number;\n}\n\n/**\n * Error thrown when the breaker rejects a call because it is OPEN.\n * Catch this specifically to apply fallback / fail-fast behaviour.\n */\nexport class CircuitBreakerOpenError extends Error {\n readonly code = 'CIRCUIT_BREAKER_OPEN';\n constructor(name: string, public readonly nextProbeAt: number) {\n super(`Circuit breaker '${name}' is open until ${new Date(nextProbeAt).toISOString()}`);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\n/**\n * Lightweight in-process circuit breaker.\n *\n * The implementation favours predictability over raw throughput:\n * - O(1) state checks\n * - No background timers (state transitions happen lazily on the next call)\n * - Failures older than `rollingWindowMs` are pruned on each interaction\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'closed';\n private failureTimestamps: number[] = [];\n private successCount = 0;\n private openedAt?: number;\n private readonly config: CircuitBreakerConfig;\n\n constructor(config: Partial<CircuitBreakerConfig> = {}) {\n const merged = { ...DEFAULT_CIRCUIT_BREAKER_CONFIG, ...config };\n if (merged.failureThreshold < 1) {\n throw new Error('failureThreshold must be >= 1');\n }\n if (merged.rollingWindowMs <= 0) {\n throw new Error('rollingWindowMs must be > 0');\n }\n if (merged.cooldownMs <= 0) {\n throw new Error('cooldownMs must be > 0');\n }\n this.config = merged;\n }\n\n /**\n * Execute an operation through the breaker.\n * @throws CircuitBreakerOpenError if the breaker is open\n */\n async execute<T>(operation: () => Promise<T>): Promise<T> {\n this.evaluateState();\n\n if (this.state === 'open') {\n throw new CircuitBreakerOpenError(this.config.name ?? 'circuit', this.nextProbeTime());\n }\n\n try {\n const result = await operation();\n this.recordSuccess();\n return result;\n } catch (err) {\n this.recordFailure(err as Error);\n throw err;\n }\n }\n\n /** Allow probing without executing (e.g. for health endpoints) */\n canExecute(): boolean {\n this.evaluateState();\n return this.state !== 'open';\n }\n\n getState(): CircuitState {\n this.evaluateState();\n return this.state;\n }\n\n snapshot(): CircuitBreakerSnapshot {\n this.evaluateState();\n return {\n state: this.state,\n failureCount: this.failureTimestamps.length,\n successCount: this.successCount,\n lastFailureAt: this.failureTimestamps[this.failureTimestamps.length - 1],\n openedAt: this.openedAt,\n nextProbeAt: this.state === 'open' ? this.nextProbeTime() : undefined,\n };\n }\n\n /** Force the breaker back to CLOSED. Use sparingly (e.g. on operator override). */\n reset(): void {\n this.state = 'closed';\n this.failureTimestamps = [];\n this.successCount = 0;\n this.openedAt = undefined;\n }\n\n private evaluateState(): void {\n if (this.state === 'open' && this.openedAt !== undefined) {\n if (Date.now() - this.openedAt >= this.config.cooldownMs) {\n this.state = 'half_open';\n }\n }\n this.pruneOldFailures();\n }\n\n private nextProbeTime(): number {\n return (this.openedAt ?? Date.now()) + this.config.cooldownMs;\n }\n\n private pruneOldFailures(): void {\n const cutoff = Date.now() - this.config.rollingWindowMs;\n if (this.failureTimestamps.length === 0 || this.failureTimestamps[0] >= cutoff) {\n return;\n }\n this.failureTimestamps = this.failureTimestamps.filter((ts) => ts >= cutoff);\n }\n\n private recordSuccess(): void {\n this.successCount += 1;\n if (this.state === 'half_open') {\n // Probe succeeded - close the breaker\n this.state = 'closed';\n this.failureTimestamps = [];\n this.openedAt = undefined;\n } else if (this.state === 'closed') {\n // Successful calls slowly drain accumulated failures\n this.failureTimestamps.shift();\n }\n }\n\n private recordFailure(err: Error): void {\n if (!this.shouldCountFailure(err)) {\n return;\n }\n const now = Date.now();\n this.failureTimestamps.push(now);\n this.pruneOldFailures();\n\n if (this.state === 'half_open') {\n // Probe failed - re-open immediately\n this.openedAt = now;\n this.state = 'open';\n return;\n }\n\n if (\n this.state === 'closed' &&\n this.failureTimestamps.length >= this.config.failureThreshold\n ) {\n this.openedAt = now;\n this.state = 'open';\n }\n }\n\n private shouldCountFailure(err: Error): boolean {\n const filter = this.config.failureFilter;\n if (!filter || filter.length === 0) return true;\n\n const message = (err.message || '').toLowerCase();\n const name = (err.name || '').toLowerCase();\n return filter.some((pattern) => {\n const p = pattern.toLowerCase();\n return message.includes(p) || name.includes(p);\n });\n }\n}\n\n/**\n * Combine retry, rate-limit, and circuit-breaker semantics in a single call.\n * Order is: rate-limit token → circuit breaker → retry → operation.\n *\n * The circuit-breaker wraps the operation INSIDE the retry loop so that the\n * very first call after the breaker re-closes acts as the HALF_OPEN probe.\n */\nexport async function executeWithBreaker<T>(\n breaker: CircuitBreaker,\n operation: () => Promise<T>\n): Promise<T> {\n return breaker.execute(operation);\n}\n","/**\n * Rate Limiter Service\n *\n * Provides sliding window rate limiting for TSS operations.\n * Extracted for single responsibility and testability.\n *\n * @module tss/utils/rate-limiter\n */\n\n// Inlined from libs/multi-chain-core/src/tss/interfaces/tss.interfaces.ts\nexport interface IRateLimiterConfig {\n /** Maximum requests per window */\n readonly maxRequests: number;\n /** Window size in milliseconds */\n readonly windowMs: number;\n}\n\nexport interface IRateLimiter {\n isAllowed(key: string): boolean;\n reset(key: string): void;\n clear(): void;\n cleanup(): void;\n}\n\n\n// ============================================================================\n// DEFAULT CONFIGURATION\n// ============================================================================\n\nconst DEFAULT_CONFIG: IRateLimiterConfig = {\n maxRequests: 60,\n windowMs: 60000, // 1 minute\n};\n\n// ============================================================================\n// IMPLEMENTATION\n// ============================================================================\n\n/**\n * Rate limit entry for a key\n */\ninterface RateLimitEntry {\n count: number;\n windowStart: number;\n}\n\n/**\n * Rate Limiter Service\n *\n * Implements sliding window rate limiting.\n */\nexport class RateLimiter implements IRateLimiter {\n // Lightweight logger stub (no @nestjs/common dependency). Replace via constructor injection if needed.\n private readonly logger = { debug: (..._args: unknown[]) => {}, warn: (..._args: unknown[]) => {} };\n private readonly limits = new Map<string, RateLimitEntry>();\n private readonly config: IRateLimiterConfig;\n\n constructor(config?: Partial<IRateLimiterConfig>) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n }\n\n /**\n * Check if request is allowed under rate limit\n *\n * @param key - Unique identifier for rate limit bucket\n * @returns True if request is allowed\n */\n isAllowed(key: string): boolean {\n const now = Date.now();\n const entry = this.limits.get(key);\n\n // New window or window expired\n if (!entry || now - entry.windowStart >= this.config.windowMs) {\n this.limits.set(key, { count: 1, windowStart: now });\n return true;\n }\n\n // Check limit\n if (entry.count >= this.config.maxRequests) {\n this.logger.debug(`Rate limit exceeded for key: ${key.substring(0, 20)}...`);\n return false;\n }\n\n // Increment count\n entry.count++;\n return true;\n }\n\n /**\n * Reset rate limit for a specific key\n *\n * @param key - Key to reset\n */\n reset(key: string): void {\n this.limits.delete(key);\n }\n\n /**\n * Clear all rate limits\n */\n clear(): void {\n this.limits.clear();\n }\n\n /**\n * Clean up expired entries\n */\n cleanup(): void {\n const now = Date.now();\n const expiredThreshold = this.config.windowMs * 2;\n\n for (const [key, entry] of this.limits.entries()) {\n if (now - entry.windowStart > expiredThreshold) {\n this.limits.delete(key);\n }\n }\n }\n\n /**\n * Get current count for a key\n *\n * @param key - Key to check\n * @returns Current request count or 0\n */\n getCount(key: string): number {\n const entry = this.limits.get(key);\n if (!entry) return 0;\n\n // Check if window expired\n if (Date.now() - entry.windowStart >= this.config.windowMs) {\n return 0;\n }\n\n return entry.count;\n }\n\n /**\n * Get remaining requests for a key\n *\n * @param key - Key to check\n * @returns Remaining requests in current window\n */\n getRemaining(key: string): number {\n return Math.max(0, this.config.maxRequests - this.getCount(key));\n }\n\n /**\n * Get configuration\n */\n getConfig(): Readonly<IRateLimiterConfig> {\n return Object.freeze({ ...this.config });\n }\n}\n\n// ============================================================================\n// FACTORY\n// ============================================================================\n\n/**\n * Create rate limiter with custom config\n */\nexport function createRateLimiter(config?: Partial<IRateLimiterConfig>): RateLimiter {\n return new RateLimiter(config);\n}\n","/**\n * Custom error classes for Smart Engines\n */\n\nexport const ErrorCode = {\n // General errors\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n NOT_FOUND: 'NOT_FOUND',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED',\n PAYLOAD_TOO_LARGE: 'PAYLOAD_TOO_LARGE',\n\n // Chain-specific errors\n CHAIN_NOT_SUPPORTED: 'CHAIN_NOT_SUPPORTED',\n CHAIN_CONNECTION_ERROR: 'CHAIN_CONNECTION_ERROR',\n CHAIN_TIMEOUT: 'CHAIN_TIMEOUT',\n\n // Transaction errors\n TRANSACTION_FAILED: 'TRANSACTION_FAILED',\n TRANSACTION_TIMEOUT: 'TRANSACTION_TIMEOUT',\n INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',\n INVALID_TRANSACTION: 'INVALID_TRANSACTION',\n\n // Account errors\n ACCOUNT_NOT_FOUND: 'ACCOUNT_NOT_FOUND',\n ACCOUNT_CREATION_FAILED: 'ACCOUNT_CREATION_FAILED',\n INVALID_ACCOUNT_ID: 'INVALID_ACCOUNT_ID',\n\n // Wallet errors\n WALLET_NOT_FOUND: 'WALLET_NOT_FOUND',\n WALLET_ENCRYPTION_ERROR: 'WALLET_ENCRYPTION_ERROR',\n WALLET_DECRYPTION_ERROR: 'WALLET_DECRYPTION_ERROR',\n INVALID_PRIVATE_KEY: 'INVALID_PRIVATE_KEY',\n\n // Token errors\n TOKEN_NOT_FOUND: 'TOKEN_NOT_FOUND',\n TOKEN_CREATION_FAILED: 'TOKEN_CREATION_FAILED',\n INSUFFICIENT_TOKEN_BALANCE: 'INSUFFICIENT_TOKEN_BALANCE',\n TRUST_LINE_REQUIRED: 'TRUST_LINE_REQUIRED',\n TOKEN_NOT_ASSOCIATED: 'TOKEN_NOT_ASSOCIATED',\n TOKEN_PAUSED: 'TOKEN_PAUSED',\n ACCOUNT_FROZEN: 'ACCOUNT_FROZEN',\n KYC_NOT_GRANTED: 'KYC_NOT_GRANTED',\n\n // Signature/Auth errors\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n NONCE_MISMATCH: 'NONCE_MISMATCH',\n\n // Contract errors\n CONTRACT_REVERT: 'CONTRACT_REVERT',\n CONTRACT_NOT_FOUND: 'CONTRACT_NOT_FOUND',\n GAS_ERROR: 'GAS_ERROR',\n\n // Infrastructure errors\n DATABASE_ERROR: 'DATABASE_ERROR',\n CACHE_ERROR: 'CACHE_ERROR',\n EVENT_BUS_ERROR: 'EVENT_BUS_ERROR',\n EXTERNAL_SERVICE_ERROR: 'EXTERNAL_SERVICE_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport interface ErrorContext {\n [key: string]: any;\n}\n\n/**\n * Base Smart Engine Error\n */\nexport class SmartEngineError extends Error {\n constructor(\n message: string,\n public readonly code: ErrorCode,\n public readonly statusCode: number = 500,\n public readonly context?: ErrorContext,\n public readonly isRetryable: boolean = false\n ) {\n super(message);\n this.name = 'SmartEngineError';\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON() {\n return {\n error: {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n context: this.context,\n isRetryable: this.isRetryable,\n },\n };\n }\n}\n\n/**\n * Validation Error\n */\nexport class ValidationError extends SmartEngineError {\n constructor(message: string, context?: ErrorContext) {\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Chain Error\n */\nexport class ChainError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.CHAIN_CONNECTION_ERROR,\n context?: ErrorContext,\n isRetryable: boolean = true\n ) {\n super(message, code, 503, context, isRetryable);\n this.name = 'ChainError';\n }\n}\n\n/**\n * Transaction Error\n */\nexport class TransactionError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TRANSACTION_FAILED,\n context?: ErrorContext,\n isRetryable: boolean = false\n ) {\n super(message, code, 400, context, isRetryable);\n this.name = 'TransactionError';\n }\n}\n\n/**\n * Wallet Error\n */\nexport class WalletError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.WALLET_NOT_FOUND,\n context?: ErrorContext\n ) {\n super(message, code, 404, context, false);\n this.name = 'WalletError';\n }\n}\n\n/**\n * Account Error\n */\nexport class AccountError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.ACCOUNT_NOT_FOUND,\n context?: ErrorContext\n ) {\n super(message, code, 404, context, false);\n this.name = 'AccountError';\n }\n}\n\n/**\n * Token Error\n */\nexport class TokenError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TOKEN_NOT_FOUND,\n context?: ErrorContext\n ) {\n super(message, code, 404, context, false);\n this.name = 'TokenError';\n }\n}\n\n/**\n * Infrastructure Error\n */\nexport class InfrastructureError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.EXTERNAL_SERVICE_ERROR,\n context?: ErrorContext,\n isRetryable: boolean = true\n ) {\n super(message, code, 503, context, isRetryable);\n this.name = 'InfrastructureError';\n }\n}\n","/**\n * Capability-related errors for Smart Engines\n */\nimport { SmartEngineError, ErrorCode, ErrorContext } from './smart-engine.error';\n\n/**\n * Error thrown when a requested capability is not supported on a chain\n */\nexport class UnsupportedCapabilityError extends SmartEngineError {\n constructor(\n public readonly chain: string,\n public readonly capability: string,\n public readonly alternatives?: string[]\n ) {\n const message = `Capability '${capability}' is not supported on chain '${chain}'`;\n const context: ErrorContext = {\n chain,\n capability,\n alternatives,\n };\n\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'UnsupportedCapabilityError';\n }\n}\n\n/**\n * Error thrown when trying to use a capability that was not enabled on token creation\n */\nexport class CapabilityNotEnabledError extends SmartEngineError {\n constructor(\n public readonly tokenId: string,\n public readonly capability: string\n ) {\n const message = `Capability '${capability}' was not enabled for token '${tokenId}'`;\n const context: ErrorContext = {\n tokenId,\n capability,\n };\n\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'CapabilityNotEnabledError';\n }\n}\n\n/**\n * Error thrown when capability validation fails\n */\nexport class CapabilityValidationError extends SmartEngineError {\n constructor(\n message: string,\n public readonly capabilities: string[],\n public readonly chain: string\n ) {\n const context: ErrorContext = {\n capabilities,\n chain,\n };\n\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'CapabilityValidationError';\n }\n}\n","import { z } from 'zod';\n\n/**\n * Supported blockchain types\n */\nexport const ChainTypeSchema = z.enum([\n 'hedera',\n 'xrpl',\n 'polkadot',\n 'solana',\n 'stellar',\n 'ethereum',\n 'polygon',\n 'bitcoin',\n 'cardano',\n]);\n\nexport type ChainType = z.infer<typeof ChainTypeSchema>;\n\n/**\n * Network environment types\n */\nexport const NetworkTypeSchema = z.enum(['mainnet', 'testnet', 'devnet', 'local']);\n\nexport type NetworkType = z.infer<typeof NetworkTypeSchema>;\n\n/**\n * Chain metadata schema\n */\nexport const ChainMetadataSchema = z.object({\n chain: ChainTypeSchema,\n network: NetworkTypeSchema,\n nativeCurrency: z.object({\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().int().min(0),\n }),\n blockTime: z.number().optional(),\n rpcEndpoint: z.string().url().optional(),\n});\n\nexport type ChainMetadata = z.infer<typeof ChainMetadataSchema>;\n","/**\n * Network Membership Types\n *\n * Defines types for multi-network membership in the Smart Engines ecosystem.\n * Supports three network types: validators, hosts, and gateways.\n *\n * @packageDocumentation\n */\nimport { z } from 'zod';\nimport type { ChainType } from './chain.schema';\n\n/**\n * Alias for backward compatibility with multi-chain-core\n */\nexport type SupportedChain = ChainType;\n\n// =============================================================================\n// Network Type Definition\n// =============================================================================\n\n/**\n * Network membership type - determines the role of a node in the network\n *\n * - validator: Full validator nodes that participate in TSS signing and consensus\n * - host: Infrastructure hosts that run smart engines for decentralized applications\n * - gateway: API gateway nodes that provide external access to the network\n */\nexport type NetworkMembershipType = 'validator' | 'host' | 'gateway';\n\n/**\n * Zod schema for NetworkMembershipType validation\n */\nexport const NetworkMembershipTypeSchema = z.enum(['validator', 'host', 'gateway']);\n\n// =============================================================================\n// Membership NFT Metadata\n// =============================================================================\n\n/**\n * Membership status for NFT metadata\n */\nexport type MembershipStatus = 'pending' | 'active' | 'exiting' | 'exited' | 'banned';\n\n/**\n * Zod schema for MembershipStatus validation\n */\nexport const MembershipStatusSchema = z.enum(['pending', 'active', 'exiting', 'exited', 'banned']);\n\n/**\n * Membership NFT Metadata\n *\n * Metadata structure for membership NFTs that represent network participation.\n * This metadata is stored on-chain and used to verify membership.\n */\nexport interface MembershipNftMetadata {\n /** Unique identifier for the node */\n nodeId: string;\n /** Type of network membership */\n networkType: NetworkMembershipType;\n /** Blockchain chain where membership was established */\n chain: SupportedChain;\n /** Node's endpoint URL for network communication */\n endpoint: string;\n /** Node's public key for cryptographic verification */\n publicKey: string;\n /** ISO 8601 timestamp when the node joined the network */\n joinedAt: string;\n /** Transaction ID of the deposit that activated membership */\n depositTxId: string;\n /** Current membership status */\n status: MembershipStatus;\n /** Network-specific configuration (optional) */\n networkConfig?: NetworkSpecificConfig;\n}\n\n/**\n * Zod schema for MembershipNftMetadata validation\n */\nexport const MembershipNftMetadataSchema = z.object({\n nodeId: z.string().min(1),\n networkType: NetworkMembershipTypeSchema,\n chain: z.enum(['hedera', 'xrpl', 'polkadot', 'solana']),\n endpoint: z.string().url(),\n publicKey: z.string().min(1),\n joinedAt: z.string().datetime(),\n depositTxId: z.string().min(1),\n status: MembershipStatusSchema,\n networkConfig: z.record(z.unknown()).optional(),\n});\n\n// =============================================================================\n// Network-Specific Configuration\n// =============================================================================\n\n/**\n * Network-specific configuration that can be attached to membership metadata\n */\nexport type NetworkSpecificConfig = Record<string, unknown>;\n\n/**\n * Validator-specific configuration\n */\nexport interface ValidatorNetworkConfig {\n /** TSS participation threshold */\n tssThreshold?: number;\n /** Supported chains for validation */\n supportedChains?: SupportedChain[];\n /** Validator capabilities */\n capabilities?: string[];\n}\n\n/**\n * Host-specific configuration\n */\nexport interface HostNetworkConfig {\n /** Maximum number of smart engines this host can run */\n maxEngines?: number;\n /** Supported engine types */\n supportedEngineTypes?: string[];\n /** Host region for geographic distribution */\n region?: string;\n}\n\n/**\n * Gateway-specific configuration\n */\nexport interface GatewayNetworkConfig {\n /** Rate limiting configuration */\n rateLimits?: {\n requestsPerSecond: number;\n burstLimit: number;\n };\n /** Supported API versions */\n supportedApiVersions?: string[];\n /** Geographic region */\n region?: string;\n}\n\n// =============================================================================\n// Network Deposit Configuration\n// =============================================================================\n\n/**\n * Deposit configuration for a specific network type\n */\nexport interface NetworkDepositRequirements {\n /** Required deposit amount in smallest unit (e.g., tinybars for HBAR) */\n depositAmount: string;\n /** Lock duration in days */\n lockDurationDays: number;\n /** Minimum renewal window in days before expiry */\n renewalWindowDays?: number;\n}\n\n/**\n * Complete deposit configuration for all network types\n */\nexport interface NetworkDepositConfig {\n validator: NetworkDepositRequirements;\n host: NetworkDepositRequirements;\n gateway: NetworkDepositRequirements;\n}\n\n/**\n * Zod schema for NetworkDepositRequirements validation\n */\nexport const NetworkDepositRequirementsSchema = z.object({\n depositAmount: z.string().min(1),\n lockDurationDays: z.number().int().positive(),\n renewalWindowDays: z.number().int().positive().optional(),\n});\n\n/**\n * Zod schema for NetworkDepositConfig validation\n */\nexport const NetworkDepositConfigSchema = z.object({\n validator: NetworkDepositRequirementsSchema,\n host: NetworkDepositRequirementsSchema,\n gateway: NetworkDepositRequirementsSchema,\n});\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard to check if a value is a valid NetworkMembershipType\n */\nexport function isNetworkMembershipType(value: unknown): value is NetworkMembershipType {\n return value === 'validator' || value === 'host' || value === 'gateway';\n}\n\n/**\n * Type guard to check if a value is a valid MembershipStatus\n */\nexport function isMembershipStatus(value: unknown): value is MembershipStatus {\n return (\n value === 'pending' ||\n value === 'active' ||\n value === 'exiting' ||\n value === 'exited' ||\n value === 'banned'\n );\n}\n\n/**\n * Type guard to check if metadata matches MembershipNftMetadata structure\n */\nexport function isMembershipNftMetadata(value: unknown): value is MembershipNftMetadata {\n const result = MembershipNftMetadataSchema.safeParse(value);\n return result.success;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get human-readable label for network membership type\n */\nexport function getNetworkTypeLabel(type: NetworkMembershipType): string {\n const labels: Record<NetworkMembershipType, string> = {\n validator: 'Validator Node',\n host: 'Host Node',\n gateway: 'Gateway Node',\n };\n return labels[type];\n}\n\n/**\n * Get human-readable description for network membership type\n */\nexport function getNetworkTypeDescription(type: NetworkMembershipType): string {\n const descriptions: Record<NetworkMembershipType, string> = {\n validator:\n 'Full validator nodes that participate in TSS signing and consensus operations across multiple chains.',\n host: 'Infrastructure hosts that run smart engines for decentralized applications and services.',\n gateway:\n 'API gateway nodes that provide external access to the network and handle rate limiting.',\n };\n return descriptions[type];\n}\n\n/**\n * Check if a network type requires TSS participation\n */\nexport function requiresTssParticipation(type: NetworkMembershipType): boolean {\n return type === 'validator';\n}\n\n/**\n * Get the default deposit configuration for a network type\n */\nexport function getDefaultDepositConfig(): NetworkDepositConfig {\n return {\n validator: {\n depositAmount: '10000000',\n lockDurationDays: 365,\n renewalWindowDays: 30,\n },\n host: {\n depositAmount: '5000000',\n lockDurationDays: 365,\n renewalWindowDays: 30,\n },\n gateway: {\n depositAmount: '2000000',\n lockDurationDays: 365,\n renewalWindowDays: 30,\n },\n };\n}\n","/**\n * Token Capabilities Schema\n *\n * Defines universal token capabilities that are chain-agnostic.\n * Each capability maps to chain-specific implementations.\n */\nimport { z } from 'zod';\n\n/**\n * Token Capabilities Schema\n *\n * These capabilities define what operations a token supports.\n * The validator layer translates these to chain-specific implementations.\n */\nexport const TokenCapabilitiesSchema = z.object({\n /**\n * Pause all token operations globally\n * - Hedera: Adds pauseKey to token\n * - XRPL: Enables GlobalFreeze flag on issuer account\n */\n pausable: z.boolean().default(false),\n\n /**\n * Freeze/restrict specific accounts from transacting\n * - Hedera: Adds freezeKey to token\n * - XRPL: Enables trust line freeze capability\n */\n restrictable: z.boolean().default(false),\n\n /**\n * KYC/compliance controls for accounts\n * - Hedera: Adds kycKey to token\n * - XRPL: Requires authorized trust lines (RequireAuth)\n */\n compliant: z.boolean().default(false),\n\n /**\n * Force remove tokens from accounts (compliance wipe)\n * - Hedera: Adds wipeKey to token\n * - XRPL: Enables clawback (lsfAllowTrustLineClawback)\n */\n wipeable: z.boolean().default(false),\n\n /**\n * Mint additional supply after creation\n * - Hedera: Adds supplyKey to token\n * - XRPL: Issuer can always issue more via Payment\n */\n mintable: z.boolean().default(true),\n\n /**\n * Burn tokens (reduce supply)\n * - Hedera: Requires supplyKey\n * - XRPL: Send back to issuer (reduces supply)\n */\n burnable: z.boolean().default(true),\n\n /**\n * Allow transfers between accounts\n * - All chains: Generally always supported\n */\n transferable: z.boolean().default(true),\n});\n\nexport type TokenCapabilities = z.infer<typeof TokenCapabilitiesSchema>;\n\n/**\n * Capability names as a type\n */\nexport type CapabilityName = keyof TokenCapabilities;\n\n/**\n * List of all capability names\n */\nexport const CAPABILITY_NAMES: CapabilityName[] = [\n 'pausable',\n 'restrictable',\n 'compliant',\n 'wipeable',\n 'mintable',\n 'burnable',\n 'transferable',\n];\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\n\n/**\n * Account identifier schema - generic string that works across chains\n */\nexport const AccountIdSchema = z.string().min(1);\n\n// Note: Export as AccountIdString to avoid collision with AccountId value object\nexport type AccountIdString = z.infer<typeof AccountIdSchema>;\n\n/**\n * Account information schema\n */\nexport const AccountInfoSchema = z.object({\n accountId: AccountIdSchema,\n balance: z.string(), // String to handle large numbers and decimals\n chain: ChainTypeSchema,\n publicKey: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n createdAt: z.date().optional(),\n updatedAt: z.date().optional(),\n});\n\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>;\n\n/**\n * Account balance schema with token details\n */\nexport const AccountBalanceSchema = z.object({\n accountId: AccountIdSchema,\n chain: ChainTypeSchema,\n nativeBalance: z.string(),\n tokens: z\n .array(\n z.object({\n tokenId: z.string(),\n balance: z.string(),\n decimals: z.number().int().min(0),\n symbol: z.string().optional(),\n })\n )\n .optional(),\n timestamp: z.date(),\n});\n\nexport type AccountBalance = z.infer<typeof AccountBalanceSchema>;\n","import { z } from 'zod';\n\n/**\n * Sovereignty mode for entity creation.\n * - 'none': user/smart-app only signs; on-chain = single user key\n * - 'partial': user + validator both sign; on-chain = nested KeyList/SignerList\n * - 'full': validator-only signs; on-chain = validator multisig alone\n *\n * \"partial\" is product-facing \"mixed\".\n */\nexport const SecurityModeSchema = z.enum(['none', 'partial', 'full']);\nexport type SecurityMode = z.infer<typeof SecurityModeSchema>;\n\n/**\n * Single source of truth for the sovereignty field invariant.\n *\n * - partial: requires BOTH entityId and appOwnerPublicKey\n * - full: requires entityId (appOwnerPublicKey is ignored, not an error)\n * - none: both fields are ignored\n *\n * Exported so merged schemas in api.schema.ts can delegate here\n * instead of duplicating the predicate logic.\n */\nexport const sovereigntyRefinePredicate = (v: {\n securityMode: SecurityMode;\n entityId?: string;\n appOwnerPublicKey?: string;\n}): boolean => {\n if (v.securityMode === 'partial') {\n return !!v.entityId && !!v.appOwnerPublicKey;\n }\n if (v.securityMode === 'full') {\n return !!v.entityId;\n }\n return true;\n};\n\nexport const SOVEREIGNTY_REFINE_MESSAGE =\n \"securityMode='partial' requires entityId+appOwnerPublicKey; 'full' requires entityId\";\n\n/**\n * Shared fragment for every entity-creation prepare schema.\n *\n * Invariants enforced via refine:\n * - partial mode requires BOTH entityId and appOwnerPublicKey\n * - full mode requires entityId (appOwnerPublicKey ignored)\n * - none mode ignores both\n */\n// Internal: the raw object so callers can `.merge()` it without needing\n// Zod-version-specific `.innerType()` unwrapping (v3 vs v4 API drift).\nexport const SovereigntyFieldsRawSchema = z.object({\n securityMode: SecurityModeSchema.default('none'),\n entityId: z.string().optional(),\n appOwnerPublicKey: z.string().optional(),\n});\n\nexport const SovereigntyFieldsSchema = SovereigntyFieldsRawSchema\n .refine(sovereigntyRefinePredicate, { message: SOVEREIGNTY_REFINE_MESSAGE });\n\nexport type SovereigntyFields = z.infer<typeof SovereigntyFieldsSchema>;\n\n/**\n * ---------------------------------------------------------------------------\n * Response-side metadata: the `sovereignty` block on PreparedTransaction\n * ---------------------------------------------------------------------------\n *\n * Every `PreparedTransactionResponse` carries a `sovereignty` block so smart-\n * apps and tests can inspect the on-chain authorization topology the\n * validator is building, without decoding raw chain-native bytes.\n *\n * - `mode: 'none'` carries nothing else; the tx is a user-only flow.\n * - `mode: 'partial'|'full'` carries the entity id, the raw BLS hex pubkeys\n * from the entity's DKG binding, and a chain-native authorization-set\n * descriptor (KeyList for Hedera, SignerList for XRPL, weighted signer set\n * for Stellar).\n */\n\n/**\n * Recursive JSON shape for a Hedera authorization key.\n *\n * A Hedera `adminKey` / `supplyKey` / capability-key value is either a single\n * ed25519 public key or a threshold KeyList whose members are themselves\n * keys. Kept JSON-serializable (ed25519 keys as hex strings) so callers can\n * walk the structure without a `@hashgraph/sdk` dep.\n */\nexport type HederaKeyShape =\n | { type: 'ed25519'; key: string }\n | { type: 'keyList'; threshold: number; keys: HederaKeyShape[] };\n\nexport const HederaKeyShapeSchema: z.ZodType<HederaKeyShape> = z.lazy(() =>\n z.union([\n z.object({ type: z.literal('ed25519'), key: z.string() }),\n z.object({\n type: z.literal('keyList'),\n threshold: z.number().int().nonnegative(),\n keys: z.array(HederaKeyShapeSchema),\n }),\n ]),\n);\n\nexport const HederaAuthorizationSetShapeSchema = z.object({\n chain: z.literal('hedera'),\n adminKey: HederaKeyShapeSchema,\n supplyKey: HederaKeyShapeSchema.optional(),\n freezeKey: HederaKeyShapeSchema.optional(),\n wipeKey: HederaKeyShapeSchema.optional(),\n pauseKey: HederaKeyShapeSchema.optional(),\n kycKey: HederaKeyShapeSchema.optional(),\n});\n\nexport const XrplAuthorizationSetShapeSchema = z.object({\n chain: z.literal('xrpl'),\n signerEntries: z.array(\n z.object({\n account: z.string(),\n weight: z.number().int().nonnegative(),\n }),\n ),\n signerQuorum: z.number().int().nonnegative(),\n masterDisabled: z.boolean(),\n});\n\nexport const StellarAuthorizationSetShapeSchema = z.object({\n chain: z.literal('stellar'),\n signers: z.array(\n z.object({\n key: z.string(),\n weight: z.number().int().nonnegative(),\n }),\n ),\n thresholds: z.object({\n low: z.number().int().nonnegative(),\n med: z.number().int().nonnegative(),\n high: z.number().int().nonnegative(),\n }),\n masterWeight: z.number().int().nonnegative(),\n});\n\n/**\n * Recursive JSON shape for a Polkadot authorization signatory.\n *\n * A Polkadot sovereignty set resolves to a single on-chain controlling\n * `address`. That address is either a lone sr25519 account (`'none'`) or a\n * native `pallet_multisig` address whose signatories may themselves be\n * multisig accounts (`'full'` = flat validator multisig; `'partial'` = nested\n * outer multisig `[userAddress, innerValidatorMultisig]`).\n *\n * Kept JSON-serializable (SS58 addresses as strings) so callers can walk the\n * structure without a `@polkadot/*` dep.\n */\nexport type PolkadotSignatoryShape =\n | { type: 'account'; address: string }\n | {\n type: 'multisig';\n address: string;\n threshold: number;\n signatories: PolkadotSignatoryShape[];\n };\n\nexport const PolkadotSignatoryShapeSchema: z.ZodType<PolkadotSignatoryShape> = z.lazy(() =>\n z.union([\n z.object({ type: z.literal('account'), address: z.string() }),\n z.object({\n type: z.literal('multisig'),\n address: z.string(),\n threshold: z.number().int().positive(),\n signatories: z.array(PolkadotSignatoryShapeSchema),\n }),\n ]),\n);\n\nexport const PolkadotAuthorizationSetShapeSchema = z.object({\n chain: z.literal('polkadot'),\n address: z.string(),\n signatory: PolkadotSignatoryShapeSchema,\n ss58Format: z.number().int().nonnegative(),\n});\n\nexport const PreparedTransactionAuthorizationSetSchema = z.discriminatedUnion('chain', [\n HederaAuthorizationSetShapeSchema,\n XrplAuthorizationSetShapeSchema,\n StellarAuthorizationSetShapeSchema,\n PolkadotAuthorizationSetShapeSchema,\n]);\n\nexport type HederaAuthorizationSetShape = z.infer<typeof HederaAuthorizationSetShapeSchema>;\nexport type XrplAuthorizationSetShape = z.infer<typeof XrplAuthorizationSetShapeSchema>;\nexport type StellarAuthorizationSetShape = z.infer<typeof StellarAuthorizationSetShapeSchema>;\nexport type PolkadotAuthorizationSetShape = z.infer<typeof PolkadotAuthorizationSetShapeSchema>;\nexport type PreparedTransactionAuthorizationSet = z.infer<\n typeof PreparedTransactionAuthorizationSetSchema\n>;\n\n/**\n * `authorizationSet` is REQUIRED for prepare endpoints that build the on-chain\n * authorization at create time (token create, account create, account setup)\n * and OPTIONAL for prepare endpoints that invoke an already-configured\n * authorization (mint, burn, transfer, payment). In the latter case the\n * authorization set lives on-chain from a prior create and smart-apps already\n * have its shape from the original create response.\n */\nexport const PreparedTransactionSovereigntySchema = z.discriminatedUnion('mode', [\n z.object({ mode: z.literal('none') }),\n z.object({\n mode: z.literal('partial'),\n entityId: z.string(),\n validatorPublicKeys: z.array(z.string()),\n authorizationSet: PreparedTransactionAuthorizationSetSchema.optional(),\n }),\n z.object({\n mode: z.literal('full'),\n entityId: z.string(),\n validatorPublicKeys: z.array(z.string()),\n authorizationSet: PreparedTransactionAuthorizationSetSchema.optional(),\n }),\n]);\n\nexport type PreparedTransactionSovereignty = z.infer<typeof PreparedTransactionSovereigntySchema>;\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\nimport { AccountIdSchema } from './account.schema';\n\n/**\n * Transaction status\n */\nexport const TransactionStatusSchema = z.enum(['pending', 'success', 'failed', 'expired']);\n\nexport type TransactionStatus = z.infer<typeof TransactionStatusSchema>;\n\n/**\n * Transaction type\n */\nexport const TransactionTypeSchema = z.enum([\n 'transfer',\n 'token_transfer',\n 'account_create',\n 'token_create',\n 'token_mint',\n 'token_burn',\n 'contract_call',\n 'contract_create',\n 'topic_message',\n 'other',\n]);\n\nexport type TransactionType = z.infer<typeof TransactionTypeSchema>;\n\n/**\n * Base transaction schema\n */\nexport const TransactionSchema = z.object({\n id: z.string(),\n chain: ChainTypeSchema,\n type: TransactionTypeSchema,\n status: TransactionStatusSchema,\n timestamp: z.date(),\n from: AccountIdSchema,\n to: AccountIdSchema.optional(),\n amount: z.string().optional(),\n fee: z.string(),\n memo: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type Transaction = z.infer<typeof TransactionSchema>;\n\n/**\n * Transaction receipt schema\n */\nexport const TransactionReceiptSchema = z.object({\n transactionId: z.string(),\n chain: ChainTypeSchema,\n status: TransactionStatusSchema,\n blockNumber: z.number().optional(),\n blockHash: z.string().optional(),\n timestamp: z.date(),\n gasUsed: z.string().optional(),\n effectiveFee: z.string(),\n logs: z.array(z.any()).optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type TransactionReceipt = z.infer<typeof TransactionReceiptSchema>;\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\nimport { AccountIdSchema } from './account.schema';\n\n/**\n * Token type\n */\nexport const TokenTypeSchema = z.enum(['fungible', 'nft', 'semi_fungible']);\n\nexport type TokenType = z.infer<typeof TokenTypeSchema>;\n\n/**\n * Token schema\n */\nexport const TokenSchema = z.object({\n tokenId: z.string(),\n chain: ChainTypeSchema,\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().int().min(0),\n totalSupply: z.string(),\n type: TokenTypeSchema,\n creator: AccountIdSchema.optional(),\n metadata: z.record(z.any()).optional(),\n createdAt: z.date().optional(),\n});\n\nexport type Token = z.infer<typeof TokenSchema>;\n\n/**\n * NFT metadata schema\n */\nexport const NFTMetadataSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n image: z.string().url().optional(),\n attributes: z\n .array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number(), z.boolean()]),\n })\n )\n .optional(),\n external_url: z.string().url().optional(),\n});\n\nexport type NFTMetadata = z.infer<typeof NFTMetadataSchema>;\n\n/**\n * Token info with holder details\n */\nexport const TokenInfoSchema = TokenSchema.extend({\n holders: z.number().optional(),\n transferCount: z.number().optional(),\n circulatingSupply: z.string().optional(),\n});\n\nexport type TokenInfo = z.infer<typeof TokenInfoSchema>;\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\nimport { AccountIdSchema } from './account.schema';\nimport { TokenCapabilitiesSchema } from './capabilities.schema';\nimport {\n SovereigntyFieldsRawSchema,\n sovereigntyRefinePredicate,\n SOVEREIGNTY_REFINE_MESSAGE,\n PreparedTransactionSovereigntySchema,\n} from './sovereignty.schema';\n\n/**\n * Create account request schema\n *\n * @important validatorTimestamp is REQUIRED - all entities must be bound to a validator.\n * The validator rules are stored on HCS and referenced by consensus timestamp.\n */\nexport const CreateAccountRequestSchema = z.object({\n chain: ChainTypeSchema,\n initialBalance: z.string(),\n publicKey: z.string().optional(),\n memo: z.string().optional(),\n /**\n * Who pays the chain fee for this transaction. Resolution happens in the\n * controller layer (`resolvePayerAccountId`): explicit `payerAccountId`\n * wins, else the JWT-authenticated smart-app's wallet address, else the\n * request is rejected with 400. The validator **never** silently falls\n * back to its own operator account.\n */\n payerAccountId: z.string().optional(),\n /**\n * HCS consensus timestamp of the validator rules (REQUIRED).\n * Format: \"1766490325.123456789\"\n */\n validatorTimestamp: z.string().min(1, 'validatorTimestamp is required'),\n /**\n * HCS topic ID where validator rules are stored (REQUIRED).\n */\n validatorTopicId: z.string().min(1, 'validatorTopicId is required'),\n /**\n * Whether to remove admin key after creation (makes entity immutable).\n * Default: true for production-grade immutability.\n */\n immutable: z.boolean().default(true),\n /**\n * Smart node security mode for the account key structure.\n * - 'none': Owner-only key (no validator involvement)\n * - 'partial': threshold(2, [appOwnerKey, tssKeyList]) — co-control\n * - 'full': TSS KeyList only — full validator network control\n * Default: 'none' for basic account creation via SDK.\n */\n securityMode: z.enum(['none', 'partial', 'full']).default('none'),\n /**\n * App owner's public key (required for 'partial' security mode).\n * The owner key + TSS network key form a threshold-2 multi-sig.\n */\n appOwnerPublicKey: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type CreateAccountRequest = z.infer<typeof CreateAccountRequestSchema>;\n\n/**\n * Create account response schema\n */\nexport const CreateAccountResponseSchema = z.object({\n accountId: AccountIdSchema,\n publicKey: z.string().optional(),\n privateKey: z.string().optional(), // Only returned on creation, store securely!\n transactionId: z.string(),\n chain: ChainTypeSchema,\n timestamp: z.date().optional(),\n});\n\nexport type CreateAccountResponse = z.infer<typeof CreateAccountResponseSchema>;\n\n/**\n * Transfer request schema\n */\nexport const TransferRequestSchema = z.object({\n chain: ChainTypeSchema,\n from: AccountIdSchema,\n to: AccountIdSchema,\n amount: z.string(),\n tokenId: z.string().optional(), // undefined = native token\n memo: z.string().optional(),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type TransferRequest = z.infer<typeof TransferRequestSchema>;\n\n/**\n * Transfer response schema\n */\nexport const TransferResponseSchema = z.object({\n transactionId: z.string(),\n status: z.enum(['pending', 'success', 'failed']),\n chain: ChainTypeSchema,\n fee: z.string().optional(),\n timestamp: z.date().optional(),\n});\n\nexport type TransferResponse = z.infer<typeof TransferResponseSchema>;\n\n/**\n * Query balance request schema\n */\nexport const QueryBalanceRequestSchema = z.object({\n chain: ChainTypeSchema,\n accountId: AccountIdSchema,\n});\n\nexport type QueryBalanceRequest = z.infer<typeof QueryBalanceRequestSchema>;\n\n/**\n * Query transaction request schema\n */\nexport const QueryTransactionRequestSchema = z.object({\n chain: ChainTypeSchema,\n transactionId: z.string(),\n});\n\nexport type QueryTransactionRequest = z.infer<typeof QueryTransactionRequestSchema>;\n\n/**\n * Create token request schema (v2 with capabilities)\n *\n * Supports universal token capabilities that are validated against chain support.\n * If a capability is requested but not supported on the target chain, an error is thrown.\n */\nexport const CreateTokenRequestSchema = z.object({\n chain: ChainTypeSchema,\n name: z.string().min(1).max(100),\n symbol: z.string().min(1).max(10),\n decimals: z.number().int().min(0).max(18),\n initialSupply: z.string(),\n type: z.enum(['fungible', 'nft']),\n treasury: AccountIdSchema.optional(),\n /**\n * Token capabilities define what operations the token supports.\n * These are validated against chain support and translated to native implementations.\n *\n * @example\n * ```typescript\n * capabilities: {\n * pausable: true, // Hedera: pauseKey, XRPL: GlobalFreeze\n * restrictable: true, // Hedera: freezeKey, XRPL: TrustLineFreeze\n * compliant: true, // Hedera: kycKey, XRPL: RequireAuth\n * wipeable: true, // Hedera: wipeKey, XRPL: Clawback\n * mintable: true, // Allow additional minting\n * burnable: true, // Allow burning\n * }\n * ```\n */\n capabilities: TokenCapabilitiesSchema.optional().default({\n pausable: false,\n restrictable: false,\n compliant: false,\n wipeable: false,\n mintable: true,\n burnable: true,\n transferable: true,\n }),\n /**\n * HCS consensus timestamp of the validator rules (REQUIRED).\n * Format: \"1766490325.123456789\"\n */\n validatorTimestamp: z.string().min(1, 'validatorTimestamp is required'),\n /**\n * HCS topic ID where validator rules are stored (REQUIRED).\n */\n validatorTopicId: z.string().min(1, 'validatorTopicId is required'),\n /**\n * Whether to remove admin key after creation (makes entity immutable).\n * Default: true for production-grade immutability.\n */\n immutable: z.boolean().default(true),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type CreateTokenRequest = z.infer<typeof CreateTokenRequestSchema>;\n\n/**\n * Create token response schema\n */\nexport const CreateTokenResponseSchema = z.object({\n tokenId: z.string(),\n transactionId: z.string(),\n chain: ChainTypeSchema,\n timestamp: z.date().optional(),\n});\n\nexport type CreateTokenResponse = z.infer<typeof CreateTokenResponseSchema>;\n\n/**\n * Mint token request schema\n */\n/**\n * Mint token request schema\n *\n * Supports both fungible and non-fungible token minting:\n * - Fungible: requires `amount` (e.g. \"1000\")\n * - NFT: requires `nftMetadata` (array of byte-encodable entries, one per NFT to mint)\n *\n * The chain adapter determines the appropriate native operation based on the token type.\n */\nexport const MintTokenRequestSchema = z.object({\n chain: ChainTypeSchema,\n tokenId: z.string(),\n\n /** Amount to mint (fungible tokens). Ignored for NFTs. */\n amount: z.string().optional(),\n\n /** Recipient account (fungible: transfer after mint; NFT: Hedera mints to treasury). */\n recipient: AccountIdSchema.optional(),\n\n /**\n * NFT metadata entries — one per NFT to mint.\n * Each entry becomes on-chain metadata (e.g. IPFS CID, encoded memo).\n * On Hedera: passed to TokenMintTransaction.setMetadata().\n * On XRPL: used as URI in NFTokenMint.\n */\n nftMetadata: z.array(z.string()).optional(),\n\n /** Additional chain-specific options. */\n metadata: z.record(z.any()).optional(),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n});\n\nexport type MintTokenRequest = z.infer<typeof MintTokenRequestSchema>;\n\n/**\n * Burn token request schema\n */\nexport const BurnTokenRequestSchema = z.object({\n chain: ChainTypeSchema,\n tokenId: z.string(),\n amount: z.string(),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type BurnTokenRequest = z.infer<typeof BurnTokenRequestSchema>;\n\n/**\n * Token action request schema (for pause, restrict, etc.)\n */\nexport const TokenActionRequestSchema = z.object({\n chain: ChainTypeSchema,\n tokenId: z.string(),\n accountId: AccountIdSchema.optional(), // Required for account-specific actions\n amount: z.string().optional(), // Required for wipe action\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type TokenActionRequest = z.infer<typeof TokenActionRequestSchema>;\n\n/**\n * Action result schema - unified response for all token actions\n */\nexport const ActionResultSchema = z.object({\n success: z.boolean(),\n transactionId: z.string(),\n chain: ChainTypeSchema,\n /** The native chain operation that was executed */\n chainOperation: z.string(),\n /** Additional context or notes about the operation */\n notes: z.array(z.string()).optional(),\n /** Timestamp of the operation */\n timestamp: z.date().optional(),\n});\n\nexport type ActionResult = z.infer<typeof ActionResultSchema>;\n\n/**\n * Create token result schema - extends ActionResult with token info\n */\nexport const CreateTokenResultSchema = ActionResultSchema.extend({\n tokenId: z.string(),\n /** The capabilities that were enabled for this token */\n enabledCapabilities: z.array(z.string()),\n});\n\nexport type CreateTokenResult = z.infer<typeof CreateTokenResultSchema>;\n\n// =============================================================================\n// PREPARED TRANSACTION RESPONSE TYPES (v3 API - Transaction Sovereignty)\n// =============================================================================\n\n/**\n * Validator signature for a prepared transaction\n */\nexport const ValidatorSignatureSchema = z.object({\n /** Validator's node ID */\n validatorId: z.string(),\n /** Validator's public key (hex-encoded) */\n publicKey: z.string(),\n /** Signature over the transaction bytes (hex-encoded) */\n signature: z.string(),\n /** When this signature was created */\n signedAt: z.date(),\n /** Signature algorithm used */\n algorithm: z.enum(['ed25519', 'ecdsa-secp256k1', 'bls12-381']).optional(),\n});\n\nexport type ValidatorSignature = z.infer<typeof ValidatorSignatureSchema>;\n\n/**\n * Hedera-specific metadata for prepared transactions\n */\nexport const HederaPreparedMetadataSchema = z.object({\n /** Hedera node account IDs that will process this transaction */\n nodeAccountIds: z.array(z.string()).optional(),\n /** Maximum transaction fee in tinybars */\n maxTransactionFee: z.string().optional(),\n /** Transaction memo */\n memo: z.string().optional(),\n /** Schedule info if this is a scheduled transaction */\n scheduleInfo: z\n .object({\n scheduleId: z.string(),\n adminKey: z.string().optional(),\n })\n .optional(),\n});\n\nexport type HederaPreparedMetadata = z.infer<typeof HederaPreparedMetadataSchema>;\n\n/**\n * XRPL-specific metadata for prepared transactions\n */\nexport const XRPLPreparedMetadataSchema = z.object({\n /** Sequence number for this transaction */\n sequence: z.number().optional(),\n /** Last ledger sequence for expiration */\n lastLedgerSequence: z.number().optional(),\n /** Signer list info for multi-sig */\n signerList: z\n .array(\n z.object({\n account: z.string(),\n signerWeight: z.number(),\n })\n )\n .optional(),\n /** Quorum weight required */\n signerQuorum: z.number().optional(),\n});\n\nexport type XRPLPreparedMetadata = z.infer<typeof XRPLPreparedMetadataSchema>;\n\n/**\n * Solana-specific metadata for prepared transactions\n */\nexport const SolanaPreparedMetadataSchema = z.object({\n /** Recent blockhash for transaction validity */\n recentBlockhash: z.string().optional(),\n /** Fee payer account */\n feePayer: z.string().optional(),\n /** Program IDs involved */\n programIds: z.array(z.string()).optional(),\n /** Squads v4 multisig PDA address (partial/full modes) */\n squadsMultisigPda: z.string().optional(),\n /** Squads v4 vault PDA address (partial/full modes) */\n squadsVaultPda: z.string().optional(),\n /** Index of the vault transaction proposal */\n squadsTransactionIndex: z.number().optional(),\n /** Proposal PDA address */\n squadsProposalAddress: z.string().optional(),\n /** Whether the multisig was created in this call (vs already existed) */\n multisigCreated: z.boolean().optional(),\n /** Security mode used to prepare this transaction */\n securityMode: z.enum(['none', 'partial', 'full']).optional(),\n /** SPL Token mint address (token-create and all SPL operations) */\n splMint: z.string().optional(),\n});\n\nexport type SolanaPreparedMetadata = z.infer<typeof SolanaPreparedMetadataSchema>;\n\n/**\n * Polkadot-specific metadata for prepared transactions\n */\nexport const PolkadotPreparedMetadataSchema = z.object({\n /** Era for transaction mortality */\n era: z.string().optional(),\n /** Nonce for the sender */\n nonce: z.number().optional(),\n /** Tip for priority */\n tip: z.string().optional(),\n /** Spec version for runtime */\n specVersion: z.number().optional(),\n});\n\nexport type PolkadotPreparedMetadata = z.infer<typeof PolkadotPreparedMetadataSchema>;\n\n/**\n * Union of all chain-specific metadata types\n */\nexport const ChainPreparedMetadataSchema = z.union([\n HederaPreparedMetadataSchema,\n XRPLPreparedMetadataSchema,\n SolanaPreparedMetadataSchema,\n PolkadotPreparedMetadataSchema,\n z.record(z.any()), // Allow extension for future chains\n]);\n\nexport type ChainPreparedMetadata = z.infer<typeof ChainPreparedMetadataSchema>;\n\n/**\n * Prepared transaction response - the core type for v3 API\n *\n * IMPORTANT: This is the unified response type for all transaction operations.\n * The transaction is frozen/prepared but NOT submitted. The caller is responsible\n * for submitting the transaction to the network.\n *\n * SECURITY PRINCIPLES:\n * 1. Validators NEVER pay fees - caller provides payerAccountId\n * 2. Validators NEVER submit transactions - they return signed bytes\n * 3. All operations use multi-sig - no single-key fallbacks\n * 4. Transaction ID is pre-assigned for deterministic tracking\n */\nexport const PreparedTransactionResponseSchema = z.object({\n /** The blockchain this transaction is for */\n chain: ChainTypeSchema,\n /** Type of transaction (e.g., 'TokenCreate', 'Payment', 'NFTMint') */\n transactionType: z.string(),\n /** Pre-assigned transaction ID for tracking */\n transactionId: z.string(),\n /** Base64-encoded frozen transaction bytes ready for submission */\n transactionBytes: z.string(),\n /** When this prepared transaction expires */\n expiresAt: z.date(),\n /** Validator signatures collected for this transaction */\n validatorSignatures: z.array(ValidatorSignatureSchema),\n /** Required payer account ID (caller must fund this account) */\n payerAccountId: z.string().optional(),\n /** Estimated network fee */\n estimatedFee: z.string().optional(),\n /** Number of signatures required for submission */\n requiredSignatures: z.number().optional(),\n /** Whether the transaction has enough signatures to submit */\n readyToSubmit: z.boolean().default(false),\n /** Chain-specific metadata */\n metadata: ChainPreparedMetadataSchema.optional(),\n /**\n * Sovereignty metadata: the mode and (for partial/full) the on-chain\n * authorization set the validator is binding to. Lets smart-apps and tests\n * inspect the authorization topology without decoding chain-native bytes.\n */\n sovereignty: PreparedTransactionSovereigntySchema.optional(),\n});\n\nexport type PreparedTransactionResponse = z.infer<typeof PreparedTransactionResponseSchema>;\n\n/**\n * Generic prepared transaction response with typed metadata\n */\nexport type PreparedTransactionResponseWithMetadata<T extends ChainPreparedMetadata> = Omit<\n PreparedTransactionResponse,\n 'metadata'\n> & {\n metadata?: T;\n};\n\n/**\n * Type-safe prepared transaction responses for each chain\n */\nexport type HederaPreparedTransaction =\n PreparedTransactionResponseWithMetadata<HederaPreparedMetadata>;\n/**\n * XRPL prepared transaction response.\n *\n * Includes `transactionJson` alongside `transactionBytes` so xrpl.js-native\n * clients can sign the autofilled transaction object directly without having\n * to decode the binary blob. See Transaction Sovereignty Parity Part A.4.\n *\n * `transactionJson` is typed as the structural minimum — the fields every\n * autofilled XRPL tx carries — so `@hsuite/smart-engines-shared` stays\n * decoupled from the xrpl.js package. Callers that need the full\n * `SubmittableTransaction` union (see xrpl.js) should consume the stronger\n * local type exported from `@hsuite/smart-engines-chain-xrpl`, which is\n * typed against xrpl.js directly.\n */\nexport type XRPLPreparedTransactionJson = {\n TransactionType: string;\n Account: string;\n Fee?: string;\n Sequence?: number;\n LastLedgerSequence?: number;\n [extra: string]: unknown;\n};\n\nexport type XRPLPreparedTransaction = PreparedTransactionResponseWithMetadata<XRPLPreparedMetadata> & {\n /** Autofilled XRPL transaction object (post-autofill, pre-sign) for xrpl.js-native callers */\n transactionJson: XRPLPreparedTransactionJson;\n};\nexport type SolanaPreparedTransaction =\n PreparedTransactionResponseWithMetadata<SolanaPreparedMetadata>;\nexport type PolkadotPreparedTransaction =\n PreparedTransactionResponseWithMetadata<PolkadotPreparedMetadata>;\n\n/**\n * Submission result after caller submits the prepared transaction\n */\nexport const TransactionSubmissionResultSchema = z.object({\n /** The original transaction ID */\n transactionId: z.string(),\n /** The blockchain */\n chain: ChainTypeSchema,\n /** Whether submission was successful */\n success: z.boolean(),\n /** Consensus timestamp (Hedera) or ledger/block info */\n consensusTimestamp: z.string().optional(),\n /** Block or ledger number */\n blockNumber: z.number().optional(),\n /** Actual fee paid */\n actualFee: z.string().optional(),\n /** Receipt or confirmation data */\n receipt: z.record(z.any()).optional(),\n /** Error message if submission failed */\n error: z.string().optional(),\n});\n\nexport type TransactionSubmissionResult = z.infer<typeof TransactionSubmissionResultSchema>;\n\n// =============================================================================\n// PREPARE REQUEST SCHEMAS (v3 API - Transaction Sovereignty Mixed Layer)\n// =============================================================================\n\n/**\n * Prepare token-create request schema (Hedera HTS).\n *\n * Merges SovereigntyFieldsSchema so securityMode, entityId, and\n * appOwnerPublicKey carry the same cross-chain invariants.\n */\nexport const PrepareTokenCreateRequestSchema = z\n .object({\n chain: z.literal('hedera'),\n payerAccountId: z.string().optional(),\n name: z.string().min(1).max(100),\n symbol: z.string().min(1).max(10),\n decimals: z.number().int().min(0).max(18),\n initialSupply: z.string(),\n treasuryAccountId: z.string().min(1, 'treasuryAccountId is required'),\n memo: z.string().optional(),\n tokenType: z.enum(['FUNGIBLE_COMMON', 'NON_FUNGIBLE_UNIQUE']).default('FUNGIBLE_COMMON'),\n supplyKey: z.string().optional(),\n adminKey: z.string().optional(),\n pauseKey: z.string().optional(),\n freezeKey: z.string().optional(),\n kycKey: z.string().optional(),\n wipeKey: z.string().optional(),\n validatorTimestamp: z.string().min(1),\n validatorTopicId: z.string().min(1),\n })\n // SovereigntyFieldsRawSchema is the unrefined object (no .refine wrapping)\n // the sovereignty invariant is re-applied by the .refine() below.\n .merge(SovereigntyFieldsRawSchema)\n .refine(sovereigntyRefinePredicate, { message: SOVEREIGNTY_REFINE_MESSAGE });\n\nexport type PrepareTokenCreateRequest = z.infer<typeof PrepareTokenCreateRequestSchema>;\n\n/**\n * Prepare XRPL account-setup request schema.\n *\n * Used to configure the authorization (signer list / AccountSet flags) on an\n * existing XRPL account as part of the sovereignty key setup.\n */\nexport const PrepareXrplAccountSetupRequestSchema = z\n .object({\n chain: z.literal('xrpl'),\n payerAccountId: z.string().optional(),\n // User's XRPL account whose authorization we're configuring.\n accountAddress: z.string().min(25).max(34),\n validatorTimestamp: z.string().min(1),\n validatorTopicId: z.string().min(1),\n })\n .merge(SovereigntyFieldsRawSchema)\n .refine(sovereigntyRefinePredicate, { message: SOVEREIGNTY_REFINE_MESSAGE });\n\nexport type PrepareXrplAccountSetupRequest = z.infer<typeof PrepareXrplAccountSetupRequestSchema>;\n\n/**\n * Prepare Stellar account-create request schema.\n *\n * Creates a new Stellar account and optionally configures sovereignty signers.\n */\nexport const PrepareStellarAccountCreateRequestSchema = z\n .object({\n chain: z.literal('stellar'),\n payerAccountId: z.string().optional(),\n // The master public key of the new Stellar account.\n publicKey: z.string().min(56).max(56),\n startingBalance: z.string().regex(/^\\d+(\\.\\d+)?$/),\n validatorTimestamp: z.string().min(1),\n validatorTopicId: z.string().min(1),\n })\n .merge(SovereigntyFieldsRawSchema)\n // Stellar's partial mode uses the new account's OWN master key as the\n // \"user\" signer (via SetOptions(masterWeight=2)) — there is NO separate\n // appOwnerPublicKey because Stellar allows the master key to satisfy\n // authorization directly. Only entityId is required for partial/full.\n .refine(\n (v) => {\n if (v.securityMode === 'partial' || v.securityMode === 'full') {\n return !!v.entityId;\n }\n return true;\n },\n { message: \"securityMode='partial'/'full' requires entityId\" },\n );\n\nexport type PrepareStellarAccountCreateRequest = z.infer<\n typeof PrepareStellarAccountCreateRequestSchema\n>;\n","/**\n * Discovery Module\n *\n * Validator discovery via HCS registry topic.\n */\n\nexport {\n ValidatorDiscoveryClient,\n ValidatorDiscoveryConfig,\n ValidatorInfo,\n ValidatorNetworkEndpoints,\n ValidatorMetadata,\n} from './validator-discovery';\n\nexport {\n MirrorNodeClient,\n MirrorNodeConfig,\n MirrorNodeError,\n TopicMessage,\n TopicMessagesResponse,\n MIRROR_NODE_URLS,\n} from './mirror-node';\n\nexport {\n ClusterDiscoveryClient,\n ClusterDiscoveryConfig,\n ClusterEndpointsView,\n ClusterInfo,\n} from './cluster-discovery';\n","/**\n * Hedera Mirror Node Client\n *\n * Lightweight client for querying Hedera mirror node REST API.\n * Used for validator discovery by reading HCS topic messages.\n */\n\n/**\n * Mirror node configuration\n */\nexport interface MirrorNodeConfig {\n /** Mirror node base URL (e.g., https://testnet.mirrornode.hedera.com) */\n baseUrl: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Allow HTTP (insecure) connections - default false */\n allowInsecure?: boolean;\n}\n\n/**\n * Validate and sanitize a URL\n * Prevents SSRF and ensures HTTPS for security\n */\nfunction validateUrl(url: string, allowInsecure = false): URL {\n try {\n const parsed = new URL(url);\n\n // Only allow http/https protocols\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new Error(`Invalid protocol: ${parsed.protocol}`);\n }\n\n // Enforce HTTPS unless explicitly allowed\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new Error(\n 'HTTPS is required for secure connections. Set allowInsecure=true to override.'\n );\n }\n\n // Block private/internal IP ranges to prevent SSRF\n const hostname = parsed.hostname.toLowerCase();\n const blockedPatterns = [\n /^localhost$/i,\n /^127\\./,\n /^10\\./,\n /^172\\.(1[6-9]|2[0-9]|3[01])\\./,\n /^192\\.168\\./,\n /^169\\.254\\./,\n /^::1$/,\n /^fe80:/i,\n /^fc00:/i,\n /^fd00:/i,\n ];\n\n // Allow localhost only in development with explicit flag\n const isPrivate = blockedPatterns.some((pattern) => pattern.test(hostname));\n if (isPrivate && !allowInsecure) {\n throw new Error(\n 'Private/internal URLs are blocked. Set allowInsecure=true for local development.'\n );\n }\n\n return parsed;\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid URL')) {\n throw new MirrorNodeError(`Invalid URL format: ${url}`, 400);\n }\n throw error;\n }\n}\n\n/**\n * Validate Hedera topic ID format\n */\nfunction validateTopicId(topicId: string): void {\n // Format: shard.realm.num (e.g., 0.0.123456)\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(topicId)) {\n throw new MirrorNodeError(\n `Invalid topic ID format: ${topicId}. Expected format: 0.0.123456`,\n 400\n );\n }\n}\n\n/**\n * HCS topic message from mirror node API\n */\nexport interface TopicMessage {\n /** Consensus timestamp */\n consensus_timestamp: string;\n /** Message content (base64 encoded) */\n message: string;\n /** Payer account ID */\n payer_account_id: string;\n /** Running hash */\n running_hash: string;\n /** Running hash version */\n running_hash_version: number;\n /** Sequence number */\n sequence_number: number;\n /** Topic ID */\n topic_id: string;\n}\n\n/**\n * Mirror node API response for topic messages\n */\nexport interface TopicMessagesResponse {\n messages: TopicMessage[];\n links: {\n next?: string;\n };\n}\n\n/**\n * Default mirror node URLs by network\n */\nexport const MIRROR_NODE_URLS: Record<string, string> = {\n mainnet: 'https://mainnet-public.mirrornode.hedera.com',\n testnet: 'https://testnet.mirrornode.hedera.com',\n previewnet: 'https://previewnet.mirrornode.hedera.com',\n};\n\n/**\n * Hedera Mirror Node Client\n *\n * Query HCS topic messages via REST API for validator discovery.\n */\nexport class MirrorNodeClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly allowInsecure: boolean;\n\n constructor(config: MirrorNodeConfig) {\n this.allowInsecure = config.allowInsecure ?? false;\n\n // Validate the base URL\n const validatedUrl = validateUrl(config.baseUrl, this.allowInsecure);\n this.baseUrl = validatedUrl.origin;\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Create client for a specific network\n */\n static forNetwork(network: 'mainnet' | 'testnet' | 'previewnet'): MirrorNodeClient {\n const baseUrl = MIRROR_NODE_URLS[network];\n if (!baseUrl) {\n throw new Error(`Unknown network: ${network}`);\n }\n return new MirrorNodeClient({ baseUrl });\n }\n\n /**\n * Get topic messages from mirror node\n *\n * @param topicId - HCS topic ID (e.g., '0.0.123456')\n * @param options - Query options\n * @returns Topic messages\n */\n async getTopicMessages(\n topicId: string,\n options?: {\n /** Limit number of messages */\n limit?: number;\n /** Order (asc or desc) */\n order?: 'asc' | 'desc';\n /** Timestamp to start from */\n timestampStart?: string;\n /** Timestamp to end at */\n timestampEnd?: string;\n /** Sequence number to start from */\n sequenceNumberStart?: number;\n }\n ): Promise<TopicMessage[]> {\n // Validate topic ID format to prevent injection\n validateTopicId(topicId);\n\n const params = new URLSearchParams();\n\n if (options?.limit) {\n params.set('limit', options.limit.toString());\n }\n if (options?.order) {\n params.set('order', options.order);\n }\n if (options?.timestampStart) {\n params.set('timestamp', `gte:${options.timestampStart}`);\n }\n if (options?.timestampEnd) {\n params.set('timestamp', `lte:${options.timestampEnd}`);\n }\n if (options?.sequenceNumberStart) {\n params.set('sequencenumber', `gte:${options.sequenceNumberStart}`);\n }\n\n const url = `${this.baseUrl}/api/v1/topics/${topicId}/messages?${params.toString()}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new MirrorNodeError(\n `Mirror node error: ${response.status} ${response.statusText}`,\n response.status\n );\n }\n\n const data = (await response.json()) as TopicMessagesResponse;\n return data.messages;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof MirrorNodeError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new MirrorNodeError('Mirror node request timeout', 408);\n }\n throw new MirrorNodeError(`Mirror node network error: ${err.message}`, 0);\n }\n }\n\n /**\n * Get all topic messages with pagination\n *\n * @param topicId - HCS topic ID\n * @param maxMessages - Maximum messages to fetch (default: 1000)\n * @returns All topic messages\n */\n async getAllTopicMessages(topicId: string, maxMessages: number = 1000): Promise<TopicMessage[]> {\n // Validate topic ID format\n validateTopicId(topicId);\n\n // Enforce reasonable limits to prevent DoS\n const safeMaxMessages = Math.min(maxMessages, 10000);\n\n const allMessages: TopicMessage[] = [];\n let nextPath: string | undefined = `/api/v1/topics/${topicId}/messages?limit=100&order=desc`;\n\n while (nextPath && allMessages.length < safeMaxMessages) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Construct full URL safely - only use path from pagination\n const fullUrl = `${this.baseUrl}${nextPath}`;\n\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new MirrorNodeError(\n `Mirror node error: ${response.status} ${response.statusText}`,\n response.status\n );\n }\n\n const data = (await response.json()) as TopicMessagesResponse;\n allMessages.push(...data.messages);\n\n // Validate and sanitize pagination link\n // Only accept relative paths starting with /api/v1/\n if (data.links.next) {\n const nextLink = data.links.next;\n if (nextLink.startsWith('/api/v1/topics/')) {\n nextPath = nextLink;\n } else {\n // Invalid pagination link - stop pagination\n nextPath = undefined;\n }\n } else {\n nextPath = undefined;\n }\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof MirrorNodeError) {\n throw error;\n }\n const err = error as Error;\n throw new MirrorNodeError(`Mirror node error: ${err.message}`, 0);\n }\n }\n\n return allMessages.slice(0, safeMaxMessages);\n }\n\n /**\n * Decode base64 message content\n */\n static decodeMessage(base64Message: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(base64Message, 'base64').toString('utf-8');\n }\n // Browser environment\n return atob(base64Message);\n }\n}\n\n/**\n * Mirror node error\n */\nexport class MirrorNodeError extends Error {\n constructor(\n message: string,\n public statusCode: number\n ) {\n super(message);\n this.name = 'MirrorNodeError';\n }\n}\n","/**\n * Validator Discovery Client\n *\n * Discover smart-engine validators by reading the HCS validator registry topic.\n * Provides methods to list validators and select random validators for connection.\n */\n\nimport { MirrorNodeClient, MIRROR_NODE_URLS } from './mirror-node';\n\n/**\n * Network endpoints for validator connectivity\n */\nexport interface ValidatorNetworkEndpoints {\n /** HTTP API endpoint (e.g., https://validator.example.com:3000) */\n apiEndpoint: string;\n /** NATS endpoint for peer-to-peer messaging */\n natsEndpoint?: string;\n /** Public IP for NAT traversal */\n publicIp?: string;\n /** NATS port if different from default */\n natsPort?: number;\n}\n\n/**\n * Validator metadata\n */\nexport interface ValidatorMetadata {\n /** Human-readable description */\n description?: string;\n /** Version string */\n version?: string;\n /** Tags for categorization */\n tags?: string[];\n /** Author/operator name */\n author?: string;\n}\n\n/**\n * Validator registry entry parsed from HCS\n */\nexport interface ValidatorInfo {\n /** Validator consensus timestamp (unique ID) */\n validatorTimestamp: string;\n /** Node ID (e.g., validator-1) */\n nodeId: string;\n /** Validator type */\n type: 'consensus' | 'tokens' | 'accounts' | 'network';\n /** Network endpoints for connectivity */\n networkEndpoints?: ValidatorNetworkEndpoints;\n /** Public key for peer authentication (Ed25519 hex) */\n publicKey?: string;\n /** Membership NFT serial number */\n membershipNftSerial?: number;\n /** Supported blockchain capabilities */\n capabilities?: string[];\n /** Validator metadata */\n metadata: ValidatorMetadata;\n /** When registered */\n registeredAt: string;\n /** Message type */\n messageType?: 'validator.join' | 'validator.leave' | 'validator.update';\n}\n\n/**\n * Validator discovery configuration\n */\nexport interface ValidatorDiscoveryConfig {\n /** Hedera network (mainnet, testnet, previewnet) */\n network: 'mainnet' | 'testnet' | 'previewnet';\n /** HCS topic ID for validator registry */\n registryTopicId: string;\n /** Cache TTL in milliseconds (default: 60000 = 1 minute) */\n cacheTtlMs?: number;\n /** Custom mirror node URL (optional) */\n mirrorNodeUrl?: string;\n /** Allow HTTP (insecure) connections - only for local development */\n allowInsecure?: boolean;\n}\n\n/**\n * Cached validators data\n */\ninterface ValidatorCache {\n validators: ValidatorInfo[];\n lastUpdated: number;\n}\n\n/**\n * Validator Discovery Client\n *\n * Discovers validators by reading the HCS validator registry topic\n * via Hedera mirror node API.\n *\n * @example\n * ```typescript\n * const discovery = new ValidatorDiscoveryClient({\n * network: 'testnet',\n * registryTopicId: '0.0.123456',\n * });\n *\n * const validators = await discovery.getValidators();\n * const randomValidator = await discovery.getRandomValidator();\n * ```\n */\nexport class ValidatorDiscoveryClient {\n private readonly mirrorNode: MirrorNodeClient;\n private readonly registryTopicId: string;\n private readonly cacheTtlMs: number;\n private cache: ValidatorCache | null = null;\n\n constructor(config: ValidatorDiscoveryConfig) {\n const mirrorNodeUrl = config.mirrorNodeUrl || MIRROR_NODE_URLS[config.network];\n if (!mirrorNodeUrl) {\n throw new Error(`Unknown network: ${config.network}`);\n }\n\n this.mirrorNode = new MirrorNodeClient({\n baseUrl: mirrorNodeUrl,\n allowInsecure: config.allowInsecure,\n });\n this.registryTopicId = config.registryTopicId;\n this.cacheTtlMs = config.cacheTtlMs ?? 60000; // 1 minute default\n }\n\n /**\n * Get all active validators from the registry\n *\n * Results are cached for efficiency. Use `forceRefresh` to bypass cache.\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns List of active validators\n */\n async getValidators(forceRefresh = false): Promise<ValidatorInfo[]> {\n // Return cached data if valid\n if (!forceRefresh && this.cache && this.isCacheValid()) {\n return this.cache.validators;\n }\n\n // Fetch from mirror node\n const messages = await this.mirrorNode.getAllTopicMessages(\n this.registryTopicId,\n 500 // Max messages to fetch\n );\n\n // Parse and deduplicate validators\n const validatorMap = new Map<string, ValidatorInfo>();\n const leftValidators = new Set<string>();\n\n // Process messages (newest first since we fetch desc order)\n for (const msg of messages) {\n try {\n const content = MirrorNodeClient.decodeMessage(msg.message);\n const raw = JSON.parse(content) as Record<string, unknown>;\n const entry = normalizeRegistryEntry(raw);\n if (!entry) continue;\n\n // Track leave events\n if (entry.messageType === 'validator.leave') {\n leftValidators.add(entry.nodeId);\n continue;\n }\n\n // Skip if validator has left\n if (leftValidators.has(entry.nodeId)) {\n continue;\n }\n\n // Keep only the latest entry per nodeId\n if (!validatorMap.has(entry.nodeId)) {\n validatorMap.set(entry.nodeId, entry);\n }\n } catch {\n // Skip unparseable messages\n continue;\n }\n }\n\n const validators = Array.from(validatorMap.values());\n\n // Update cache\n this.cache = {\n validators,\n lastUpdated: Date.now(),\n };\n\n return validators;\n }\n\n /**\n * Get validators with API endpoints available\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns Validators with apiEndpoint configured\n */\n async getValidatorsWithEndpoints(forceRefresh = false): Promise<ValidatorInfo[]> {\n const validators = await this.getValidators(forceRefresh);\n return validators.filter((v) => v.networkEndpoints?.apiEndpoint);\n }\n\n /**\n * Get a random validator from the registry\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns Random validator info or null if none available\n */\n async getRandomValidator(forceRefresh = false): Promise<ValidatorInfo | null> {\n const validators = await this.getValidatorsWithEndpoints(forceRefresh);\n\n if (validators.length === 0) {\n return null;\n }\n\n // Use crypto.getRandomValues for cryptographically secure random selection\n const randomBytes = new Uint32Array(1);\n crypto.getRandomValues(randomBytes);\n const randomIndex = randomBytes[0] % validators.length;\n return validators[randomIndex];\n }\n\n /**\n * Get a random validator API endpoint URL\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns Random validator API URL or null if none available\n */\n async getRandomValidatorUrl(forceRefresh = false): Promise<string | null> {\n const validator = await this.getRandomValidator(forceRefresh);\n return validator?.networkEndpoints?.apiEndpoint ?? null;\n }\n\n /**\n * Get validator by node ID\n *\n * @param nodeId - Validator node ID (e.g., 'validator-1')\n * @param forceRefresh - Force refresh from mirror node\n * @returns Validator info or null if not found\n */\n async getValidatorByNodeId(nodeId: string, forceRefresh = false): Promise<ValidatorInfo | null> {\n const validators = await this.getValidators(forceRefresh);\n return validators.find((v) => v.nodeId === nodeId) ?? null;\n }\n\n /**\n * Get validators by capability\n *\n * @param capability - Required capability (e.g., 'hedera', 'xrpl', 'dkg')\n * @param forceRefresh - Force refresh from mirror node\n * @returns Validators with the specified capability\n */\n async getValidatorsByCapability(\n capability: string,\n forceRefresh = false\n ): Promise<ValidatorInfo[]> {\n const validators = await this.getValidatorsWithEndpoints(forceRefresh);\n return validators.filter((v) => v.capabilities?.includes(capability));\n }\n\n /**\n * Clear the validator cache\n */\n clearCache(): void {\n this.cache = null;\n }\n\n /**\n * Check if cache is still valid\n */\n private isCacheValid(): boolean {\n if (!this.cache) return false;\n return Date.now() - this.cache.lastUpdated < this.cacheTtlMs;\n }\n}\n\n/**\n * Normalize a raw registry message into a ValidatorInfo.\n *\n * Accepts two shapes observed on real HCS registry topics:\n *\n * 1. Canonical (emitted by chain-hedera ValidatorRegistryService):\n * { messageType: 'validator.join'|'validator.leave'|'validator.update',\n * nodeId, networkEndpoints: { apiEndpoint, ... }, ... }\n *\n * 2. Legacy / multisig-consensus (emitted by ops / genesis scripts):\n * { type: 'validator.register', validatorId, endpoint, capabilities,\n * publicKey, accountId, network, ... }\n *\n * Token-scoped validator registrations (validatorType === 'token') are ignored\n * — those are DAO token validators, not node validators. Returns null when the\n * entry doesn't represent a node validator.\n */\nfunction normalizeRegistryEntry(raw: Record<string, unknown>): ValidatorInfo | null {\n // Canonical shape: already a ValidatorInfo\n if (raw.messageType && typeof raw.nodeId === 'string') {\n return raw as unknown as ValidatorInfo;\n }\n\n // Legacy shape: { type: 'validator.register', validatorId, endpoint, ... }\n if (raw.type === 'validator.register') {\n // Skip token validator registrations - they aren't nodes\n if (raw.validatorType && raw.validatorType !== undefined && raw.validatorType !== null) {\n if (typeof raw.validatorType === 'string' && raw.validatorType !== 'node') {\n return null;\n }\n }\n\n const nodeId =\n (typeof raw.validatorId === 'string' && raw.validatorId) ||\n (typeof raw.nodeId === 'string' && raw.nodeId) ||\n null;\n if (!nodeId) return null;\n\n const endpoint = typeof raw.endpoint === 'string' ? raw.endpoint : undefined;\n if (!endpoint) return null;\n\n const capabilities = Array.isArray(raw.capabilities)\n ? (raw.capabilities as unknown[]).filter((c): c is string => typeof c === 'string')\n : undefined;\n\n return {\n validatorTimestamp: typeof raw.timestamp === 'string' ? raw.timestamp : '',\n nodeId,\n type: 'consensus',\n networkEndpoints: { apiEndpoint: endpoint },\n publicKey: typeof raw.publicKey === 'string' ? raw.publicKey : undefined,\n capabilities,\n metadata: {},\n registeredAt: typeof raw.timestamp === 'string' ? raw.timestamp : '',\n messageType: 'validator.join',\n };\n }\n\n // Unknown / unrelated message type (e.g., token validator registrations)\n return null;\n}\n","/**\n * Cluster Discovery Client\n *\n * SDK-side consumer of the service-registry distribution layer landed in\n * PR-1 of the cluster-discovery arc (smart-validator\n * `GET /api/v3/discovery/clusters`). Replaces the legacy \"caller pins one\n * baseUrl\" pattern with a bootstrap-seed list that random-picks an active\n * cluster per request, so SDK consumers automatically follow permissionless\n * cluster join/leave without code edits.\n *\n * Resolution chain (per `docs/ops/HANDOFF-service-registry-distribution-layer.md` §6):\n * 1. HTTP fetch of `/api/v3/discovery/clusters` from each bootstrap seed\n * in order; take the first successful response.\n * 2. (Optional) HCS trust-anchor membership cross-check — verify that\n * every returned nodeId appears in the HCS validator registry and\n * that the publicKey matches. A bootstrap seed cannot inject a rogue\n * cluster whose nodeIds aren't on-chain.\n * 3. Random-pick over the verified set.\n *\n * The legacy {@link ValidatorDiscoveryClient} (HCS mirror-node read,\n * per-validator granularity) stays available as a fallback / trust anchor\n * — it is the only path that doesn't require any HTTP-reachable cluster.\n *\n * @see docs/ops/HANDOFF-service-registry-distribution-layer.md\n */\n\nimport { ValidatorDiscoveryClient, type ValidatorDiscoveryConfig } from './validator-discovery';\n\n/**\n * Cluster-level endpoint metadata as exposed by the validator's\n * `/api/v3/discovery/clusters` HTTP endpoint. Mirrors the on-wire shape\n * defined server-side by `ClusterEndpointsPayloadSchema` in\n * `apps/smart-validator/src/service-registry/events/service-registry.events.ts`.\n */\nexport interface ClusterEndpointsView {\n clusterId: string;\n gatewayUrl: string;\n harborUrl?: string;\n natsUrl?: string;\n publicIp?: string;\n region?: string;\n}\n\n/**\n * Cluster info as returned by `getClusters()`. `nodeIds` are the validator\n * nodeIds whose announcements contributed to this cluster's record —\n * useful for HCS trust-anchor cross-checking.\n */\nexport interface ClusterInfo {\n clusterId: string;\n endpoints: ClusterEndpointsView;\n nodeIds: string[];\n}\n\nexport interface ClusterDiscoveryConfig {\n /**\n * Bootstrap seeds — fully-qualified URLs that respond to\n * `GET /api/v3/discovery/clusters`. The SDK tries them in order on each\n * refresh; the first success wins. **Order is the operator's\n * preference signal** (e.g., list a Cloudflare-fronted hostname first,\n * then individual cluster ingress IPs as backstops).\n */\n bootstrap: string[];\n\n /** Cache TTL in milliseconds (default: 60_000 — same as HCS path). */\n cacheTtlMs?: number;\n\n /**\n * Per-bootstrap fetch timeout in milliseconds (default: 5_000). Keep\n * tight: when the first seed is unreachable, we want to fall through\n * to the next without blocking the SDK call for long.\n */\n fetchTimeoutMs?: number;\n\n /**\n * Optional HCS trust anchor. When supplied, the SDK lazily loads the\n * on-chain validator-registry set and verifies that:\n *\n * - every cluster's `nodeIds` appears in the HCS registry, and\n * - the on-chain `publicKey` for each nodeId matches the HTTP\n * response (when the discovery endpoint exposes it).\n *\n * Clusters that fail the cross-check are dropped silently. A logged\n * warning would normally accompany this, but the SDK is environment-\n * agnostic (browser, Node, edge) — surfacing via the returned set is\n * the conservative contract.\n *\n * The anchor is purely advisory in PR-3; cryptographic per-record\n * signature verification is a follow-up once the DKG-signed payload\n * shape stabilizes.\n */\n trustAnchor?: ValidatorDiscoveryConfig;\n\n /** Allow HTTP (insecure) connections — only for local development. */\n allowInsecure?: boolean;\n}\n\ninterface ClusterCache {\n clusters: ClusterInfo[];\n lastUpdated: number;\n}\n\n/**\n * Cluster Discovery Client — HTTP-driven, random-pick across an active\n * cluster set with optional on-chain trust anchor.\n */\nexport class ClusterDiscoveryClient {\n private readonly bootstrap: string[];\n private readonly cacheTtlMs: number;\n private readonly fetchTimeoutMs: number;\n private readonly allowInsecure: boolean;\n private readonly trustAnchorClient: ValidatorDiscoveryClient | null;\n private cache: ClusterCache | null = null;\n\n constructor(config: ClusterDiscoveryConfig) {\n if (!config.bootstrap || config.bootstrap.length === 0) {\n throw new Error('ClusterDiscoveryClient: bootstrap must list at least one seed URL');\n }\n if (!config.allowInsecure) {\n for (const seed of config.bootstrap) {\n if (!seed.startsWith('https://')) {\n throw new Error(\n `ClusterDiscoveryClient: bootstrap seed \"${seed}\" is not HTTPS. ` +\n `Set allowInsecure=true for local development only.`,\n );\n }\n }\n }\n this.bootstrap = config.bootstrap;\n this.cacheTtlMs = config.cacheTtlMs ?? 60_000;\n this.fetchTimeoutMs = config.fetchTimeoutMs ?? 5_000;\n this.allowInsecure = config.allowInsecure ?? false;\n this.trustAnchorClient = config.trustAnchor\n ? new ValidatorDiscoveryClient(config.trustAnchor)\n : null;\n }\n\n /**\n * Fetch the active-cluster set, with caching.\n *\n * Tries each bootstrap seed in order until one returns HTTP 200 with a\n * parseable cluster list. If all seeds fail, throws — callers can\n * handle by falling back to a previously-cached value if they want,\n * or by initializing with multiple seeds.\n */\n async getClusters(forceRefresh = false): Promise<ClusterInfo[]> {\n if (!forceRefresh && this.cache && this.isCacheValid()) {\n return this.cache.clusters;\n }\n\n const fetched = await this.fetchFromFirstAvailableSeed();\n const verified = this.trustAnchorClient ? await this.verifyAgainstTrustAnchor(fetched) : fetched;\n\n this.cache = { clusters: verified, lastUpdated: Date.now() };\n return verified;\n }\n\n /**\n * Random pick over the active-cluster set. Returns `null` when no\n * cluster passes verification (empty registry / all-rejected anchor).\n *\n * Uses `crypto.getRandomValues` when available (browsers, Deno, modern\n * Node) for cryptographic-strength randomness; `Math.random` is a\n * fallback for older runtimes where `globalThis.crypto` is undefined.\n * Discovery isn't cryptographically sensitive — load distribution is\n * the goal here.\n */\n async getRandomCluster(forceRefresh = false): Promise<ClusterInfo | null> {\n const clusters = await this.getClusters(forceRefresh);\n if (clusters.length === 0) return null;\n return clusters[this.pickRandomIndex(clusters.length)];\n }\n\n /**\n * Convenience wrapper returning just the gateway URL of a random\n * active cluster. The single most-used SDK entry point — most\n * downstream callers want `new SmartEngineClient({ baseUrl: ... })`\n * and don't care about the rest of the metadata.\n */\n async getRandomGatewayUrl(forceRefresh = false): Promise<string | null> {\n const cluster = await this.getRandomCluster(forceRefresh);\n return cluster?.endpoints.gatewayUrl ?? null;\n }\n\n /** Per-clusterId lookup, useful for \"stick the SDK to cluster X\" flows. */\n async getClusterById(clusterId: string, forceRefresh = false): Promise<ClusterInfo | null> {\n const clusters = await this.getClusters(forceRefresh);\n return clusters.find((c) => c.clusterId === clusterId) ?? null;\n }\n\n clearCache(): void {\n this.cache = null;\n }\n\n private isCacheValid(): boolean {\n if (!this.cache) return false;\n return Date.now() - this.cache.lastUpdated < this.cacheTtlMs;\n }\n\n private async fetchFromFirstAvailableSeed(): Promise<ClusterInfo[]> {\n const errors: string[] = [];\n for (const seed of this.bootstrap) {\n try {\n return await this.fetchClustersFromSeed(seed);\n } catch (err) {\n errors.push(`${seed}: ${(err as Error).message}`);\n }\n }\n throw new Error(\n `ClusterDiscoveryClient: no bootstrap seed reachable. Attempts:\\n ${errors.join('\\n ')}`,\n );\n }\n\n private async fetchClustersFromSeed(seed: string): Promise<ClusterInfo[]> {\n const url = `${seed.replace(/\\/$/, '')}/api/v3/discovery/clusters`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.fetchTimeoutMs);\n try {\n const res = await fetch(url, { signal: ctrl.signal });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n const body = (await res.json()) as {\n clusters?: Array<{\n clusterId?: unknown;\n endpoints?: Record<string, unknown>;\n nodeIds?: unknown;\n }>;\n };\n if (!Array.isArray(body.clusters)) {\n throw new Error('response missing clusters[]');\n }\n return body.clusters\n .map((c) => this.normalizeClusterEntry(c))\n .filter((c): c is ClusterInfo => c !== null);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private normalizeClusterEntry(raw: {\n clusterId?: unknown;\n endpoints?: Record<string, unknown>;\n nodeIds?: unknown;\n }): ClusterInfo | null {\n if (typeof raw.clusterId !== 'string' || !raw.clusterId) return null;\n if (!raw.endpoints || typeof raw.endpoints !== 'object') return null;\n const ep = raw.endpoints as Record<string, unknown>;\n if (typeof ep.gatewayUrl !== 'string' || !ep.gatewayUrl) return null;\n if (!this.allowInsecure && !ep.gatewayUrl.startsWith('https://')) {\n // Drop non-HTTPS gateways in secure mode — never silently accept\n // a downgrade attack via a poisoned bootstrap response.\n return null;\n }\n const nodeIds = Array.isArray(raw.nodeIds)\n ? raw.nodeIds.filter((n): n is string => typeof n === 'string')\n : [];\n return {\n clusterId: raw.clusterId,\n endpoints: {\n clusterId: raw.clusterId,\n gatewayUrl: ep.gatewayUrl,\n harborUrl: typeof ep.harborUrl === 'string' ? ep.harborUrl : undefined,\n natsUrl: typeof ep.natsUrl === 'string' ? ep.natsUrl : undefined,\n publicIp: typeof ep.publicIp === 'string' ? ep.publicIp : undefined,\n region: typeof ep.region === 'string' ? ep.region : undefined,\n },\n nodeIds,\n };\n }\n\n /**\n * Cross-check the HTTP-fetched cluster set against the HCS validator\n * registry. Clusters whose nodeIds are not on-chain are dropped.\n *\n * Two failure modes are deliberately silent here:\n * - the HCS read itself throws → original list is returned\n * un-verified. Trust-anchor is advisory; a network partition\n * between SDK and Hedera mirror shouldn't strand the SDK.\n * - the HCS read returns empty (mirror node lag, wrong topicId)\n * → original list is returned. Better to keep working off\n * possibly-stale-but-real data than reject every cluster.\n *\n * Both behaviors are why this is called \"trust *anchor*\", not\n * \"trust gate\". Crypto-strong gating is a follow-up.\n */\n private async verifyAgainstTrustAnchor(clusters: ClusterInfo[]): Promise<ClusterInfo[]> {\n if (!this.trustAnchorClient || clusters.length === 0) return clusters;\n let onChainNodeIds: Set<string>;\n try {\n const validators = await this.trustAnchorClient.getValidators();\n if (validators.length === 0) return clusters;\n onChainNodeIds = new Set(validators.map((v) => v.nodeId));\n } catch {\n return clusters;\n }\n return clusters.filter((c) => {\n if (c.nodeIds.length === 0) {\n // The discovery endpoint surfaces nodeIds for verifiability.\n // An entry with none was either (a) emitted by an older\n // validator, or (b) crafted to evade the check. Either way,\n // drop it to keep the contract sharp.\n return false;\n }\n return c.nodeIds.some((id) => onChainNodeIds.has(id));\n });\n }\n\n private pickRandomIndex(n: number): number {\n if (n <= 1) return 0;\n const g = (globalThis as { crypto?: { getRandomValues?: (a: Uint32Array) => Uint32Array } }).crypto;\n if (g?.getRandomValues) {\n const buf = new Uint32Array(1);\n g.getRandomValues(buf);\n return buf[0] % n;\n }\n return Math.floor(Math.random() * n);\n }\n}\n","/**\n * Authentication Module\n *\n * Web3-style validator authentication.\n */\n\nexport {\n ValidatorAuthClient,\n ValidatorAuthConfig,\n ValidatorAuthError,\n SecurityConfig,\n AuthChain,\n ChallengeResponse,\n AuthenticateRequest,\n AuthenticateResponse,\n SessionInfo,\n} from './validator-auth';\n","/**\n * Validator Authentication Client\n *\n * Web3-style authentication for connecting to smart-engine validators.\n * Supports challenge-response authentication with Hedera, XRPL, Polkadot,\n * Stellar, or Solana wallets.\n */\n\n/**\n * Supported blockchain types for authentication.\n *\n * All five are verified end-to-end server-side by {@link Web3AuthService}\n * (Hedera ed25519, XRPL secp256k1/ed25519, Polkadot sr25519/ed25519,\n * Stellar ed25519, Solana ed25519). The partial-mode prepare guards\n * enforce `session.chain === request.chain`, so a caller who wants to\n * prepare sovereignty on chain X must authenticate with chain X's wallet.\n */\nexport type AuthChain = 'hedera' | 'xrpl' | 'polkadot' | 'stellar' | 'solana';\n\nconst SUPPORTED_AUTH_CHAINS: readonly AuthChain[] = [\n 'hedera',\n 'xrpl',\n 'polkadot',\n 'stellar',\n 'solana',\n];\n\n/**\n * Security configuration for auth client\n */\nexport interface SecurityConfig {\n /** Allow HTTP (insecure) connections - default false, use only for local development */\n allowInsecure?: boolean;\n}\n\n/**\n * Validate and sanitize a validator URL\n */\nfunction validateValidatorUrl(url: string, allowInsecure = false): string {\n try {\n const parsed = new URL(url);\n\n // Only allow http/https protocols\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new ValidatorAuthError(`Invalid protocol: ${parsed.protocol}`, 400);\n }\n\n // Enforce HTTPS unless explicitly allowed for development\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new ValidatorAuthError(\n 'HTTPS is required for validator connections. Set allowInsecure=true for local development.',\n 400\n );\n }\n\n // Block private IP ranges in production to prevent SSRF\n const hostname = parsed.hostname.toLowerCase();\n const isLocalhost = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1';\n\n if (isLocalhost && !allowInsecure) {\n throw new ValidatorAuthError(\n 'Localhost connections blocked in secure mode. Set allowInsecure=true for local development.',\n 400\n );\n }\n\n return parsed.origin;\n } catch (error) {\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n throw new ValidatorAuthError(`Invalid validator URL: ${url}`, 400);\n }\n}\n\n/**\n * Sanitize input to prevent injection attacks\n */\nfunction sanitizeInput(input: string, fieldName: string, maxLength = 256): string {\n if (typeof input !== 'string') {\n throw new ValidatorAuthError(`${fieldName} must be a string`, 400);\n }\n\n if (input.length > maxLength) {\n throw new ValidatorAuthError(`${fieldName} exceeds maximum length of ${maxLength}`, 400);\n }\n\n // Remove any control characters\n return input.replace(/[\\x00-\\x1F\\x7F]/g, '');\n}\n\n/**\n * Challenge response from validator\n */\nexport interface ChallengeResponse {\n /** Whether the request was successful */\n success: boolean;\n /** Challenge string to sign */\n challenge: string;\n /** Informational message */\n message: string;\n /** Challenge expiration time */\n expiresIn: string;\n}\n\n/**\n * Authentication request payload\n */\nexport interface AuthenticateRequest {\n /** Blockchain type */\n chain: AuthChain;\n /** Wallet address (account ID for Hedera, address for XRPL) */\n address: string;\n /** Public key (hex encoded) */\n publicKey: string;\n /** Signed challenge (hex encoded signature) */\n signature: string;\n /** Original challenge string */\n challenge: string;\n /** Optional metadata */\n metadata?: {\n nodeId?: string;\n endpoint?: string;\n capabilities?: string[];\n appId?: string;\n appName?: string;\n };\n}\n\n/**\n * Authentication response with session token\n */\nexport interface AuthenticateResponse {\n /** JWT session token */\n token: string;\n /** Session ID */\n sessionId: string;\n /** Assigned validator ID */\n validatorId: string;\n /** Token expiration timestamp */\n expiresAt: string;\n /** Informational message */\n message: string;\n}\n\n/**\n * Session information\n */\nexport interface SessionInfo {\n /** Session ID */\n sessionId: string;\n /** Validator ID */\n validatorId: string;\n /** Wallet address */\n address: string;\n /** Blockchain type */\n chain: AuthChain;\n /** Session creation time */\n createdAt: string;\n /** Session expiration time */\n expiresAt: string;\n /** Whether session is valid */\n isValid: boolean;\n}\n\n/**\n * Validator auth configuration\n */\nexport interface ValidatorAuthConfig {\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Security configuration */\n security?: SecurityConfig;\n}\n\n/**\n * Validator Authentication Client\n *\n * Implements Web3-style challenge-response authentication:\n * 1. Request challenge from validator\n * 2. Sign challenge with wallet private key\n * 3. Authenticate with signed challenge to get session token\n *\n * @example\n * ```typescript\n * const auth = new ValidatorAuthClient();\n *\n * // Request challenge\n * const challenge = await auth.requestChallenge(\n * 'https://validator.example.com',\n * 'hedera',\n * '0.0.123456'\n * );\n *\n * // Sign challenge (using @hashgraph/sdk)\n * const signature = auth.signChallengeHedera(challenge.challenge, privateKey);\n *\n * // Authenticate\n * const session = await auth.authenticate('https://validator.example.com', {\n * chain: 'hedera',\n * address: '0.0.123456',\n * publicKey: publicKeyHex,\n * signature,\n * challenge: challenge.challenge,\n * });\n *\n * console.log('Token:', session.token);\n * ```\n */\nexport class ValidatorAuthClient {\n private readonly timeout: number;\n private readonly allowInsecure: boolean;\n\n constructor(config?: ValidatorAuthConfig) {\n this.timeout = config?.timeout ?? 30000;\n this.allowInsecure = config?.security?.allowInsecure ?? false;\n }\n\n /**\n * Request authentication challenge from validator\n *\n * @param validatorUrl - Validator API base URL\n * @param chain - Blockchain type\n * @param address - Wallet address\n * @returns Challenge to sign\n */\n async requestChallenge(\n validatorUrl: string,\n chain: AuthChain,\n address: string\n ): Promise<ChallengeResponse> {\n // Validate and sanitize inputs\n const safeUrl = validateValidatorUrl(validatorUrl, this.allowInsecure);\n const safeAddress = sanitizeInput(address, 'address', 128);\n\n if (!SUPPORTED_AUTH_CHAINS.includes(chain)) {\n throw new ValidatorAuthError(`Invalid chain type: ${chain}`, 400);\n }\n\n const url = `${safeUrl}/auth/validator/challenge`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ chain, address: safeAddress }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ValidatorAuthError(\n `Challenge request failed: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return (await response.json()) as ChallengeResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new ValidatorAuthError('Challenge request timeout', 408);\n }\n throw new ValidatorAuthError(`Challenge request failed: ${err.message}`, 0);\n }\n }\n\n /**\n * Authenticate with signed challenge\n *\n * @param validatorUrl - Validator API base URL\n * @param request - Authentication request with signature\n * @returns Session token and info\n */\n async authenticate(\n validatorUrl: string,\n request: AuthenticateRequest\n ): Promise<AuthenticateResponse> {\n // Validate URL\n const safeUrl = validateValidatorUrl(validatorUrl, this.allowInsecure);\n\n // Validate and sanitize request fields\n const sanitizedRequest: AuthenticateRequest = {\n chain: request.chain,\n address: sanitizeInput(request.address, 'address', 128),\n publicKey: sanitizeInput(request.publicKey, 'publicKey', 512),\n signature: sanitizeInput(request.signature, 'signature', 1024),\n challenge: sanitizeInput(request.challenge, 'challenge', 512),\n metadata: request.metadata\n ? {\n nodeId: request.metadata.nodeId\n ? sanitizeInput(request.metadata.nodeId, 'nodeId', 64)\n : undefined,\n endpoint: request.metadata.endpoint\n ? sanitizeInput(request.metadata.endpoint, 'endpoint', 256)\n : undefined,\n capabilities: request.metadata.capabilities,\n appId: request.metadata.appId\n ? sanitizeInput(request.metadata.appId, 'appId', 64)\n : undefined,\n appName: request.metadata.appName\n ? sanitizeInput(request.metadata.appName, 'appName', 128)\n : undefined,\n }\n : undefined,\n };\n\n if (!SUPPORTED_AUTH_CHAINS.includes(sanitizedRequest.chain)) {\n throw new ValidatorAuthError(`Invalid chain type: ${sanitizedRequest.chain}`, 400);\n }\n\n // Validate signature is hex\n if (!/^[0-9a-fA-F]+$/.test(sanitizedRequest.signature.replace(/_.*$/, ''))) {\n throw new ValidatorAuthError('Invalid signature format: must be hex encoded', 400);\n }\n\n const url = `${safeUrl}/auth/validator/authenticate`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(sanitizedRequest),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ValidatorAuthError(\n `Authentication failed: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return (await response.json()) as AuthenticateResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new ValidatorAuthError('Authentication request timeout', 408);\n }\n throw new ValidatorAuthError(`Authentication failed: ${err.message}`, 0);\n }\n }\n\n /**\n * Get current session info\n *\n * @param validatorUrl - Validator API base URL\n * @param token - Session token\n * @returns Session information\n */\n async getSession(validatorUrl: string, token: string): Promise<SessionInfo> {\n // Validate URL and token\n const safeUrl = validateValidatorUrl(validatorUrl, this.allowInsecure);\n const safeToken = sanitizeInput(token, 'token', 2048);\n\n const url = `${safeUrl}/auth/validator/session`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${safeToken}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ValidatorAuthError(\n `Session request failed: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return (await response.json()) as SessionInfo;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new ValidatorAuthError('Session request timeout', 408);\n }\n throw new ValidatorAuthError(`Session request failed: ${err.message}`, 0);\n }\n }\n\n /**\n * Sign challenge with Hedera private key\n *\n * @param challenge - Challenge string from validator\n * @param privateKey - Hedera PrivateKey instance from @hashgraph/sdk\n * @returns Hex-encoded signature\n */\n signChallengeHedera(challenge: string, privateKey: any): string {\n // privateKey should be a PrivateKey from @hashgraph/sdk\n const messageBytes = Buffer.from(challenge, 'utf-8');\n const signature = privateKey.sign(messageBytes);\n return Buffer.from(signature).toString('hex');\n }\n\n /**\n * Sign challenge with XRPL wallet\n *\n * @param challenge - Challenge string from validator\n * @param wallet - XRPL Wallet instance from xrpl library\n * @returns Hex-encoded signature\n */\n signChallengeXRPL(challenge: string, wallet: any): string {\n // wallet should be a Wallet from xrpl library\n // XRPL uses sign() method which returns base58 or hex\n const signature = wallet.sign(challenge);\n // If it's already hex, return as-is, otherwise convert\n if (typeof signature === 'string' && /^[0-9A-Fa-f]+$/.test(signature)) {\n return signature;\n }\n return Buffer.from(signature).toString('hex');\n }\n\n /**\n * Complete authentication flow in one call\n *\n * @param validatorUrl - Validator API base URL\n * @param chain - Blockchain type\n * @param address - Wallet address\n * @param publicKey - Public key (hex)\n * @param signFn - Function to sign the challenge\n * @param metadata - Optional metadata\n * @returns Session token and info\n */\n async authenticateWithSigner(\n validatorUrl: string,\n chain: AuthChain,\n address: string,\n publicKey: string,\n signFn: (challenge: string) => string | Promise<string>,\n metadata?: AuthenticateRequest['metadata']\n ): Promise<AuthenticateResponse> {\n // Step 1: Request challenge\n const challengeResponse = await this.requestChallenge(validatorUrl, chain, address);\n\n // Step 2: Sign challenge\n const signature = await signFn(challengeResponse.challenge);\n\n // Step 3: Authenticate\n return this.authenticate(validatorUrl, {\n chain,\n address,\n publicKey,\n signature,\n challenge: challengeResponse.challenge,\n metadata,\n });\n }\n}\n\n/**\n * Authentication error\n */\nexport class ValidatorAuthError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public details?: any\n ) {\n super(message);\n this.name = 'ValidatorAuthError';\n }\n}\n","/**\n * Shared HTTP Client\n *\n * Unified HTTP layer used by all SDK clients (SmartEngineClient, SmartGatewayClient, BaasClient).\n * Handles authentication headers, timeouts, error handling, and multipart uploads.\n */\n\n/**\n * HTTP client interface consumed by all sub-clients.\n * Sub-clients only depend on this interface, never on fetch directly.\n */\nexport type HttpClient = {\n post<T = any>(path: string, body: unknown): Promise<T>;\n get<T = any>(path: string): Promise<T>;\n put<T = any>(path: string, body: unknown): Promise<T>;\n delete<T = any>(path: string): Promise<T>;\n /**\n * Upload a file with `multipart/form-data`.\n *\n * `fieldName` defaults to `'file'` for back-compat; callers whose\n * server-side handler uses a different multer field name (e.g.\n * `'bundle'` for SPA tarball uploads) MUST override.\n */\n upload<T = any>(\n path: string,\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>,\n fieldName?: string,\n ): Promise<T>;\n};\n\n/**\n * Configuration for creating an HttpClient instance\n */\nexport type HttpClientConfig = {\n /** Base URL for all requests (e.g. https://validator.example.com/api/v3) */\n baseUrl: string;\n /** Bearer token for Authorization header */\n authToken?: string;\n /** API key for X-API-Key header */\n apiKey?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n};\n\n/**\n * SDK-level error class used across all clients\n */\nexport class SdkHttpError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly details?: any\n ) {\n super(message);\n this.name = 'SdkHttpError';\n }\n}\n\n/**\n * Create a concrete HttpClient from config.\n * This is the single place where `fetch` is called in the entire SDK.\n */\nexport function createHttpClient(config: HttpClientConfig): HttpClient {\n const timeout = config.timeout ?? 30000;\n\n function getHeaders(contentType?: string): Record<string, string> {\n const headers: Record<string, string> = {};\n if (contentType) {\n headers['Content-Type'] = contentType;\n }\n if (config.authToken) {\n headers['Authorization'] = `Bearer ${config.authToken}`;\n }\n if (config.apiKey) {\n headers['X-API-Key'] = config.apiKey;\n }\n return headers;\n }\n\n /** Update auth token (e.g. after authentication flow) */\n function setAuthToken(token: string): void {\n config.authToken = token;\n }\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${config.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const init: RequestInit = {\n method,\n headers: getHeaders('application/json'),\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as Record<string, unknown>;\n throw new SdkHttpError(\n (errorData.message as string) || `API error: ${response.status} ${response.statusText}`,\n response.status,\n errorData\n );\n }\n\n // Handle empty responses (204 No Content)\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof SdkHttpError) throw error;\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new SdkHttpError('Request timeout', 408);\n }\n throw new SdkHttpError(`Network error: ${err.message}`, 0, error);\n }\n }\n\n async function upload<T>(\n path: string,\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>,\n fieldName: string = 'file',\n ): Promise<T> {\n const url = `${config.baseUrl}${path}`;\n const controller = new AbortController();\n // Uploads get 2x timeout\n const timeoutId = setTimeout(() => controller.abort(), timeout * 2);\n\n try {\n const formData = new FormData();\n const blob = file instanceof Blob ? file : new Blob([new Uint8Array(file as Buffer)]);\n formData.append(fieldName, blob, filename);\n\n if (metadata) {\n for (const [key, value] of Object.entries(metadata)) {\n formData.append(key, value);\n }\n }\n\n // Don't set Content-Type — browser/node will set multipart boundary\n const headers: Record<string, string> = {};\n if (config.authToken) {\n headers['Authorization'] = `Bearer ${config.authToken}`;\n }\n if (config.apiKey) {\n headers['X-API-Key'] = config.apiKey;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as Record<string, unknown>;\n throw new SdkHttpError(\n (errorData.message as string) || `Upload error: ${response.status} ${response.statusText}`,\n response.status,\n errorData\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof SdkHttpError) throw error;\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new SdkHttpError('Upload timeout', 408);\n }\n throw new SdkHttpError(`Upload error: ${err.message}`, 0, error);\n }\n }\n\n const client: HttpClient & { setAuthToken: typeof setAuthToken } = {\n post: <T>(path: string, body: unknown) => request<T>('POST', path, body),\n get: <T>(path: string) => request<T>('GET', path),\n put: <T>(path: string, body: unknown) => request<T>('PUT', path, body),\n delete: <T>(path: string) => request<T>('DELETE', path),\n upload: ((path: string, file: Blob | Buffer, filename: string, metadata?: Record<string, string>, fieldName?: string) =>\n upload(path, file, filename, metadata, fieldName)) as HttpClient['upload'],\n setAuthToken,\n };\n\n return client;\n}\n\n/**\n * Encode a path parameter to prevent injection attacks.\n * Removes path traversal attempts and encodes special characters.\n */\nexport function encodePathParam(param: string): string {\n return encodeURIComponent(param).replace(/%2F/gi, '');\n}\n\n/**\n * Body shape of an HTTP 403 `rule_rejected` envelope raised by the\n * validator's NFT-transfer hook (PR #552) — and by future hooks that adopt\n * the same envelope. Matches `apps/smart-validator/src/transactions/transaction.controller.ts:1210-1217`:\n *\n * ```json\n * { \"error\": \"rule_rejected\", \"reason\": \"<atom-reason>\", \"ruleAtoms\": [\"SoulboundNftAtom\"] }\n * ```\n */\nexport interface RuleRejectedDetails {\n /** Literal discriminator — always 'rule_rejected'. */\n error: 'rule_rejected';\n /** Atom-supplied reason string, e.g. 'soulbound_transfer_rejected'. */\n reason: string;\n /** Names of the rule atoms that fired the rejection. */\n ruleAtoms: string[];\n}\n\n/**\n * Type predicate: narrows an unknown error to a 403 `rule_rejected` envelope.\n *\n * Use in smart-app code to branch on rules-engine rejections without\n * inspecting raw HTTP details:\n *\n * ```typescript\n * try {\n * await sdk.transactions.prepareNftTransfer({ chain: 'hedera', ... });\n * } catch (err) {\n * if (isRuleRejected(err)) {\n * console.log(`Blocked by ${err.details.ruleAtoms.join(', ')}: ${err.details.reason}`);\n * return;\n * }\n * throw err;\n * }\n * ```\n *\n * Status-code AND shape are both checked — non-403 errors and 403s without\n * the rule_rejected envelope (e.g. plain auth failures) return false.\n *\n * @public SDK-SOULBOUND-1\n */\nexport function isRuleRejected(\n err: unknown,\n): err is SdkHttpError & { details: RuleRejectedDetails } {\n if (!(err instanceof SdkHttpError)) return false;\n if (err.statusCode !== 403) return false;\n const d = err.details as unknown;\n if (d === null || typeof d !== 'object') return false;\n const obj = d as Record<string, unknown>;\n if (obj.error !== 'rule_rejected') return false;\n if (typeof obj.reason !== 'string') return false;\n if (!Array.isArray(obj.ruleAtoms)) return false;\n return obj.ruleAtoms.every((a) => typeof a === 'string');\n}\n","/**\n * Subscription Sub-Client\n *\n * Manages application subscriptions for using the validator network.\n */\n\n/**\n * Subscription tier names\n *\n * - free_testnet: Free tier limited to testnet/previewnet\n * - starter: Entry-level paid tier\n * - professional: Mid-tier with advanced features\n * - enterprise: Full-featured enterprise tier\n */\nexport type SubscriptionTierName = 'free_testnet' | 'starter' | 'professional' | 'enterprise';\n\n/**\n * Subscription statuses\n */\nexport type SubscriptionStatus =\n | 'pending_deposit'\n | 'deposit_confirmed'\n | 'active'\n | 'expired'\n | 'cancelled';\n\n/**\n * Deposit wallet statuses\n */\nexport type DepositWalletStatus = 'pending' | 'locked' | 'expired' | 'slashed' | 'released';\n\n/**\n * Subscription tier information for API responses\n */\nexport type SubscriptionTierInfo = {\n /** Tier name identifier */\n name: SubscriptionTierName;\n /** Display name for UI */\n displayName: string;\n /** Tier description */\n description: string;\n /** Monthly price in USD */\n priceUsd: number;\n /** Deposit amount in HSUITE tokens */\n depositAmount: string;\n /** API calls per day limit */\n apiCallsPerDay: number;\n /** Supported networks for this tier */\n supportedNetworks: ('hedera' | 'xrpl')[];\n /** Additional features included in this tier */\n features: string[];\n};\n\n/**\n * Subscription request\n */\nexport type SubscriptionRequest = {\n /** Application ID */\n appId: string;\n /** Application name */\n appName: string;\n /** Developer's account ID on the chosen chain */\n developerAccountId: string;\n /** Chain for deposit */\n chain: 'hedera' | 'xrpl';\n /** Selected subscription tier */\n selectedTier: SubscriptionTierName;\n /** Selected networks to support */\n selectedNetworks: ('hedera' | 'xrpl')[];\n /** App logo URL (optional) */\n logoUrl?: string;\n /** App description (optional) */\n appDescription?: string;\n /** Additional metadata (optional) */\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Subscription response\n */\nexport type SubscriptionResponse = {\n success: boolean;\n subscriptionId?: string;\n status?: SubscriptionStatus;\n depositInstructions?: {\n walletAddress: string;\n tokenId: string;\n amount: string;\n chain: string;\n };\n message: string;\n};\n\n/**\n * Subscription status response\n */\nexport type SubscriptionStatusResponse = {\n appId: string;\n hasSubscription: boolean;\n subscriptionId?: string;\n appName?: string;\n status: SubscriptionStatus | 'not_found';\n depositWallet?: {\n walletAddress: string;\n chain: string;\n depositAmount: string;\n actualDepositAmount?: string;\n status: DepositWalletStatus;\n lockedUntil?: string;\n };\n subscriptionNftSerial?: number;\n expiresAt?: string;\n remainingBalance?: string;\n createdAt?: string;\n /** Current subscription tier */\n tier?: SubscriptionTierName;\n /** Networks selected for this subscription */\n selectedNetworks?: string[];\n /** API calls made today */\n apiCallsToday?: number;\n /** Daily API call limit based on tier */\n apiCallsLimit?: number;\n};\n\n/**\n * Mint NFT response\n */\nexport type MintNftResponse = {\n success: boolean;\n subscriptionId?: string;\n appId?: string;\n expiresAt?: string;\n message: string;\n};\n\n/**\n * Subscription renewal request\n */\nexport type SubscriptionRenewalRequest = {\n appId: string;\n additionalDays?: number;\n};\n\n/**\n * Subscription renewal response\n */\nexport type SubscriptionRenewalResponse = {\n success: boolean;\n appId: string;\n status?: string;\n newExpiresAt?: string;\n message: string;\n};\n\n/**\n * Subscription configuration\n */\nexport type SubscriptionConfig = {\n subscriptionDepositAmount: string;\n lockDurationDays: number;\n renewalWindowDays: number;\n hsuiteTokenIds: Record<string, string>;\n /** Available subscription tiers */\n availableTiers: SubscriptionTierInfo[];\n};\n\n/**\n * Subscription list response\n */\nexport type SubscriptionListResponse = {\n count: number;\n subscriptions: Array<{\n subscriptionId: string;\n appId: string;\n appName: string;\n status: SubscriptionStatus;\n expiresAt?: string;\n createdAt: string;\n }>;\n};\n\n/**\n * Balance response\n */\nexport type BalanceResponse = {\n appId: string;\n subscriptionId: string;\n status: SubscriptionStatus;\n remainingBalance: string;\n expiresAt?: string;\n};\n\nimport type { HttpClient } from '../http';\n\n/**\n * Subscription Sub-Client\n *\n * Manages application subscriptions including:\n * - Subscription requests with deposit wallets\n * - Deposit verification and NFT minting\n * - Subscription renewal\n * - Balance checking\n */\nexport class SubscriptionClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Request a new subscription.\n * Creates a deposit wallet and returns deposit instructions.\n */\n async request(request: SubscriptionRequest): Promise<SubscriptionResponse> {\n return this.http.post('/subscription/request', request);\n }\n\n /**\n * Get subscription status by app ID\n */\n async getStatus(appId: string): Promise<SubscriptionStatusResponse> {\n return this.http.get(`/subscription/status/${encodeURIComponent(appId)}`);\n }\n\n /**\n * Mint subscription NFT after deposit is confirmed\n */\n async mintNft(appId: string): Promise<MintNftResponse> {\n return this.http.post(`/subscription/mint/${encodeURIComponent(appId)}`, {});\n }\n\n /**\n * Renew subscription by extending period\n */\n async renew(request: SubscriptionRenewalRequest): Promise<SubscriptionRenewalResponse> {\n return this.http.post('/subscription/renew', request);\n }\n\n /**\n * Fetch available subscription tiers from the network.\n *\n * Use this instead of hard-coding tier names -- the validator returns the\n * canonical list of tiers together with pricing, limits, and features.\n *\n * @returns Array of {@link SubscriptionTierInfo} objects.\n *\n * @example\n * ```typescript\n * const tiers = await subscription.getTiers();\n * console.log(tiers.map(t => `${t.name}: $${t.priceUsd}/mo`));\n * ```\n */\n async getTiers(): Promise<SubscriptionTierInfo[]> {\n try {\n return await this.http.get<SubscriptionTierInfo[]>('/subscription/tiers');\n } catch (err) {\n // Backwards compatibility: older validator builds don't have the\n // dedicated /tiers endpoint yet. Fall back to /config, which\n // returns the same tiers under `availableTiers` (though in the\n // raw pricing-core shape rather than SubscriptionTierInfo).\n const isNotFound =\n err != null &&\n typeof err === 'object' &&\n 'statusCode' in err &&\n (err as { statusCode?: number }).statusCode === 404;\n if (!isNotFound) throw err;\n const cfg = await this.http.get<{\n availableTiers: Array<Record<string, unknown>>;\n }>('/subscription/config');\n // Normalize: pricing-core's SubscriptionTierConfig uses\n // { tier, name, monthlyPriceHsuite, allowedNetworks, ... } — map\n // to the SDK contract so callers see a stable shape across\n // server versions.\n return (cfg.availableTiers || []).map((raw) => {\n const tier = (raw.tier ?? raw.name) as SubscriptionTierName;\n const displayName = (raw.name ?? raw.displayName ?? String(tier)) as string;\n const monthlyPriceHsuite = Number(\n raw.monthlyPriceHsuite ?? raw.depositAmount ?? 0\n );\n const apiCallsPerDay = Number(raw.apiCallsPerDay ?? 0);\n const rawNetworks = (raw.allowedNetworks ?? raw.supportedNetworks ?? []) as string[];\n const supportedNetworks: ('hedera' | 'xrpl')[] = rawNetworks.some(\n (n) => n === 'mainnet'\n )\n ? ['hedera', 'xrpl']\n : ['hedera'];\n return {\n name: tier,\n displayName,\n description:\n (raw.description as string | undefined) ??\n `${displayName} tier`,\n priceUsd: Number(raw.priceUsd ?? 0),\n depositAmount: String(monthlyPriceHsuite),\n apiCallsPerDay: Number.isFinite(apiCallsPerDay)\n ? apiCallsPerDay\n : Number.MAX_SAFE_INTEGER,\n supportedNetworks,\n features: (raw.features as string[]) ?? [],\n };\n });\n }\n }\n\n /**\n * Get subscription configuration\n */\n async getConfig(): Promise<SubscriptionConfig> {\n return this.http.get('/subscription/config');\n }\n\n /**\n * List all subscriptions\n */\n async list(): Promise<SubscriptionListResponse> {\n return this.http.get('/subscription/list');\n }\n\n /**\n * List subscriptions by status\n */\n async listByStatus(status: SubscriptionStatus): Promise<SubscriptionListResponse> {\n return this.http.get(`/subscription/list/status/${encodeURIComponent(status)}`);\n }\n\n /**\n * Get subscription balance\n */\n async getBalance(appId: string): Promise<BalanceResponse> {\n return this.http.get(`/subscription/balance/${encodeURIComponent(appId)}`);\n }\n}\n","/**\n * TSS (Threshold Signature Scheme) Sub-Client\n *\n * Provides access to TSS/MPC operations for multi-sig entity management.\n * All operations are chain-agnostic — pass `chain` as a parameter.\n */\nimport type {\n EntityCreationOptions,\n EntityCreationResponse,\n ReshareRequest,\n ReshareResponse,\n EntityDetails,\n MPCSigningRequest,\n MPCSigningResponse,\n ValidatorListResponse,\n TSSStats,\n EntityListResponse,\n TSSHealthResponse,\n CeremonyListResponse,\n MultiSigStatusResponse,\n} from './types';\nimport type { HttpClient } from '../http';\n\nexport * from './types';\n\n/**\n * TSS Sub-Client\n *\n * Manages Threshold Signature Scheme operations including:\n * - Multi-sig entity creation (chain-agnostic)\n * - Key resharing for membership changes\n * - MPC transaction signing for any supported chain\n * - DKG ceremony monitoring\n *\n * @example\n * ```typescript\n * // Sign a transaction on any chain\n * const result = await client.tss.signMPC({\n * chain: 'hedera',\n * entityId: 'entity-123',\n * transactionBytes: '0x...',\n * });\n * ```\n */\nexport class TSSClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a multi-sig entity with TSS\n */\n async createEntity(options: EntityCreationOptions): Promise<EntityCreationResponse> {\n return this.http.post('/tss/entity/create', options);\n }\n\n /**\n * Reshare keys when cluster membership changes.\n * Redistributes secret shares WITHOUT changing public keys.\n */\n async reshareCluster(request: ReshareRequest): Promise<ReshareResponse> {\n return this.http.post('/tss/cluster/reshare', request);\n }\n\n /**\n * Get entity details by ID\n */\n async getEntity(entityId: string): Promise<EntityDetails> {\n return this.http.get(`/tss/entity/${encodeURIComponent(entityId)}`);\n }\n\n /**\n * Sign a transaction using MPC — chain-agnostic.\n * Routes to the correct chain backend based on the `chain` parameter.\n *\n * @param request - MPC signing request with chain, entityId, and transaction bytes\n */\n async signMPC(request: MPCSigningRequest): Promise<MPCSigningResponse> {\n const chain = request.chain || 'hedera';\n return this.http.post(`/tss/${encodeURIComponent(chain)}/sign-mpc`, request);\n }\n\n /**\n * Get known validators and their public keys\n */\n async getValidators(): Promise<ValidatorListResponse> {\n return this.http.get('/tss/validators');\n }\n\n /**\n * Force announcement of this node's public key\n */\n async announceKey(): Promise<{ success: boolean; message: string }> {\n return this.http.post('/tss/announce', {});\n }\n\n /**\n * Get TSS statistics\n */\n async getStats(): Promise<TSSStats> {\n return this.http.get('/tss/stats');\n }\n\n /**\n * List all TSS entities\n */\n async listEntities(): Promise<EntityListResponse> {\n return this.http.get('/tss/entities');\n }\n\n /**\n * TSS health check\n */\n async getHealth(): Promise<TSSHealthResponse> {\n return this.http.get('/tss/health');\n }\n\n /**\n * List DKG ceremonies and their statistics\n */\n async listCeremonies(): Promise<CeremonyListResponse> {\n return this.http.get('/tss/multisig/ceremonies');\n }\n\n /**\n * Get multi-sig transaction status by transaction ID\n */\n async getMultiSigStatus(txId: string): Promise<MultiSigStatusResponse> {\n return this.http.get(`/tss/multisig/transactions/${encodeURIComponent(txId)}`);\n }\n}\n","/**\n * IPFS Sub-Client\n *\n * Provides access to IPFS operations for decentralized file storage.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const result = await client.ipfs.upload(fileBuffer, 'document.pdf');\n *\n * // Pin content\n * await client.ipfs.pin(result.cid);\n *\n * // Get file\n * const file = await client.ipfs.getFile(result.cid);\n * ```\n */\nimport type { HttpClient } from '../http';\nimport type {\n IpfsUploadResult,\n IpfsPinResult,\n IpfsFileMetadata,\n IpfsPinListResponse,\n IpfsStatusResponse,\n IpfsStorageUsageResponse,\n} from './types';\n\nexport * from './types';\n\n/**\n * IPFS Sub-Client\n *\n * Manages IPFS operations including:\n * - File upload and retrieval\n * - Content pinning and unpinning\n * - Metadata queries\n * - Storage usage monitoring\n */\nexport class IPFSClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload a file to IPFS\n *\n * @param file - File data as Blob or Buffer\n * @param filename - Name of the file\n * @param metadata - Optional metadata key-value pairs\n * @returns Upload result with CID\n */\n async upload(\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>\n ): Promise<IpfsUploadResult> {\n return this.http.upload('/ipfs/upload', file, filename, metadata);\n }\n\n /**\n * Pin content by CID to ensure it persists\n */\n async pin(cid: string): Promise<IpfsPinResult> {\n return this.http.post(`/ipfs/pin/${encodeURIComponent(cid)}`, {});\n }\n\n /**\n * Unpin content by CID\n */\n async unpin(cid: string): Promise<IpfsPinResult> {\n return this.http.delete(`/ipfs/unpin/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get a file by CID\n */\n async getFile(cid: string): Promise<any> {\n return this.http.get(`/ipfs/file/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get raw content by CID\n */\n async getContent(cid: string): Promise<any> {\n return this.http.get(`/ipfs/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get file metadata by CID\n */\n async getMetadata(cid: string): Promise<IpfsFileMetadata> {\n return this.http.get(`/ipfs/metadata/${encodeURIComponent(cid)}`);\n }\n\n /**\n * List all pinned content\n */\n async listPins(): Promise<IpfsPinListResponse> {\n return this.http.get('/ipfs/pins');\n }\n\n /**\n * Get IPFS node status\n */\n async getStatus(): Promise<IpfsStatusResponse> {\n return this.http.get('/ipfs/status');\n }\n\n /**\n * Get storage usage information\n */\n async getStorageUsage(): Promise<IpfsStorageUsageResponse> {\n return this.http.get('/ipfs/storage');\n }\n}\n","/**\n * Transactions Sub-Client\n *\n * Provides transaction preparation for the sovereignty model:\n * transactions are prepared on the validator but signed locally by the user.\n *\n * @example\n * ```typescript\n * // Prepare a transfer\n * const prepared = await client.transactions.prepareTransfer({\n * chain: 'hedera',\n * from: '0.0.123',\n * to: '0.0.456',\n * amount: '100',\n * });\n *\n * // Sign locally with your private key\n * const signed = privateKey.sign(Buffer.from(prepared.transactionBytes, 'hex'));\n *\n * // Submit the signed transaction\n * ```\n */\nimport type { HttpClient } from '../http';\nimport type {\n PreparedTransaction,\n PrepareTransferRequest,\n PrepareNftMintRequest,\n PrepareNftBurnRequest,\n PrepareNftTransferRequest,\n PrepareTokenCreateRequest,\n PrepareTokenMintRequest,\n PrepareTokenBurnRequest,\n PrepareTokenAssociationRequest,\n PrepareTokenPauseRequest,\n PrepareTokenUnpauseRequest,\n PrepareTokenRestrictRequest,\n PrepareTokenUnrestrictRequest,\n PrepareTokenComplianceEnableRequest,\n PrepareTokenComplianceDisableRequest,\n PrepareTokenWipeRequest,\n PrepareTopicCreateRequest,\n PrepareTopicMessageRequest,\n PrepareTrustLineRequest,\n TransactionInfoResponse,\n} from './types';\n\nexport * from './types';\n\n/**\n * Transactions Sub-Client\n *\n * Transaction sovereignty: prepare on validator, sign locally.\n * Covers all transaction types across all supported chains.\n *\n * NOTE: This client uses /api/transactions (not /api/v3).\n * The HttpClient must be configured with the correct base URL.\n */\nexport class TransactionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get transaction preparation service info\n */\n async getInfo(): Promise<TransactionInfoResponse> {\n return this.http.get('/info');\n }\n\n /**\n * Prepare a transfer transaction for local signing\n */\n async prepareTransfer(request: PrepareTransferRequest): Promise<PreparedTransaction> {\n return this.http.post('/transfer/prepare', request);\n }\n\n /**\n * Prepare an NFT mint transaction\n */\n async prepareNftMint(request: PrepareNftMintRequest): Promise<PreparedTransaction> {\n return this.http.post('/nft/mint/prepare', request);\n }\n\n /**\n * Prepare an NFT burn transaction\n */\n async prepareNftBurn(request: PrepareNftBurnRequest): Promise<PreparedTransaction> {\n return this.http.post('/nft/burn/prepare', request);\n }\n\n /**\n * Prepare an NFT transfer transaction\n */\n async prepareNftTransfer(request: PrepareNftTransferRequest): Promise<PreparedTransaction> {\n return this.http.post('/nft/transfer/prepare', request);\n }\n\n /**\n * Prepare a token creation transaction\n */\n async prepareTokenCreate(request: PrepareTokenCreateRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/create/prepare', request);\n }\n\n /**\n * Prepare a token mint transaction\n */\n async prepareTokenMint(request: PrepareTokenMintRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/mint/prepare', request);\n }\n\n /**\n * Prepare a fungible token burn transaction (Hedera).\n *\n * For NFT burn use `prepareNftBurn` with a serialNumber.\n */\n async prepareTokenBurn(request: PrepareTokenBurnRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/burn/prepare', request);\n }\n\n /**\n * Prepare a token association transaction\n */\n async prepareTokenAssociation(\n request: PrepareTokenAssociationRequest\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/associate/prepare', request);\n }\n\n // ── Capability actions (Hedera) ──────────────────────────────────────\n\n /** Prepare a token pause transaction (capability: pausable). */\n async prepareTokenPause(request: PrepareTokenPauseRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/pause/prepare', request);\n }\n\n /** Prepare a token unpause transaction (capability: pausable). */\n async prepareTokenUnpause(request: PrepareTokenUnpauseRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/unpause/prepare', request);\n }\n\n /**\n * Prepare a token restrict (freeze account) transaction (capability:\n * restrictable). Freezes `accountId` from transacting `tokenId`.\n */\n async prepareTokenRestrict(request: PrepareTokenRestrictRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/restrict/prepare', request);\n }\n\n /** Prepare a token unrestrict (unfreeze account) transaction. */\n async prepareTokenUnrestrict(\n request: PrepareTokenUnrestrictRequest\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/unrestrict/prepare', request);\n }\n\n /**\n * Prepare a token compliance-enable (grant KYC) transaction (capability:\n * compliant).\n */\n async prepareTokenComplianceEnable(\n request: PrepareTokenComplianceEnableRequest\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/compliance/enable/prepare', request);\n }\n\n /** Prepare a token compliance-disable (revoke KYC) transaction. */\n async prepareTokenComplianceDisable(\n request: PrepareTokenComplianceDisableRequest\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/compliance/disable/prepare', request);\n }\n\n /**\n * Prepare a token wipe transaction (capability: wipeable). Force-removes\n * `amount` of `tokenId` from `accountId`.\n */\n async prepareTokenWipe(request: PrepareTokenWipeRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/wipe/prepare', request);\n }\n\n /**\n * Prepare a topic creation transaction\n */\n async prepareTopicCreate(request: PrepareTopicCreateRequest): Promise<PreparedTransaction> {\n return this.http.post('/topic/create/prepare', request);\n }\n\n /**\n * Prepare a topic message submission transaction\n */\n async prepareTopicMessage(request: PrepareTopicMessageRequest): Promise<PreparedTransaction> {\n return this.http.post('/topic/message/prepare', request);\n }\n\n /**\n * Prepare a trust line transaction (e.g. XRPL trust lines)\n */\n async prepareTrustLine(request: PrepareTrustLineRequest): Promise<PreparedTransaction> {\n return this.http.post('/trustline/prepare', request);\n }\n}\n","/**\n * Snapshots Sub-Client\n *\n * Provides token holder snapshot generation and retrieval.\n *\n * @example\n * ```typescript\n * // Generate a snapshot\n * const { snapshotId } = await client.snapshots.generate('0.0.12345');\n *\n * // Check status\n * const info = await client.snapshots.get(snapshotId);\n *\n * // Download when ready\n * const data = await client.snapshots.download(snapshotId, 'csv');\n * ```\n */\nimport type { HttpClient } from '../http';\nimport type {\n SnapshotInfo,\n SnapshotGenerateOptions,\n SnapshotGenerateResponse,\n SnapshotListResponse,\n SnapshotFormat,\n PaginationOptions,\n} from './types';\n\nexport * from './types';\n\n/**\n * Snapshots Sub-Client\n *\n * Manages token holder snapshots:\n * - Generate point-in-time snapshots of token holders\n * - Query snapshot status and metadata\n * - Download snapshot data in JSON or CSV\n */\nexport class SnapshotsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Generate a new snapshot for a token\n *\n * @param tokenId - Token identifier\n * @param options - Generation options (format, filters)\n */\n async generate(\n tokenId: string,\n options?: SnapshotGenerateOptions\n ): Promise<SnapshotGenerateResponse> {\n return this.http.post(\n `/snapshots/generate/${encodeURIComponent(tokenId)}`,\n options || {}\n );\n }\n\n /**\n * Get snapshot details by ID\n */\n async get(snapshotId: string): Promise<SnapshotInfo> {\n return this.http.get(`/snapshots/${encodeURIComponent(snapshotId)}`);\n }\n\n /**\n * List snapshots for a token\n */\n async listByToken(\n tokenId: string,\n pagination?: PaginationOptions\n ): Promise<SnapshotListResponse> {\n const params = new URLSearchParams();\n if (pagination?.page !== undefined) params.set('page', String(pagination.page));\n if (pagination?.limit !== undefined) params.set('limit', String(pagination.limit));\n const qs = params.toString();\n return this.http.get(\n `/snapshots/token/${encodeURIComponent(tokenId)}${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Download snapshot data\n *\n * @param snapshotId - Snapshot ID\n * @param format - Output format (json or csv)\n */\n async download(snapshotId: string, format?: SnapshotFormat): Promise<any> {\n const params = format ? `?format=${encodeURIComponent(format)}` : '';\n return this.http.get(\n `/snapshots/${encodeURIComponent(snapshotId)}/download${params}`\n );\n }\n}\n","/**\n * HistoricalBalanceClient — thin HTTP wrapper around\n * `POST /api/v3/historical-balance/query`.\n *\n * Two construction modes:\n * 1. **Standalone (CLI):** `new HistoricalBalanceClient({ baseUrl, ... })`.\n * The client builds its own `fetch` URL + headers + timeout.\n * 2. **As a sub-client of `SmartEngineClient`:** the parent passes its\n * shared `HttpClient` via the static `HistoricalBalanceClient.fromHttp`\n * factory so that auth, timeouts, and base-URL resolution stay in one\n * place. See `client.ts`.\n *\n * Zero internal `@hsuite/*` imports — wire types are locally declared in\n * `./historical-balance-types`. See PR-CLEANUP (#576) for rationale.\n */\n\nimport type { HttpClient } from '../http';\nimport type {\n HistoricalBalanceClientConfig,\n HistoricalBalanceQueryParams,\n HistoricalBalanceResult,\n} from './historical-balance-types';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst ENDPOINT_PATH = '/api/v3/historical-balance/query';\n\n/**\n * Error thrown by `HistoricalBalanceClient` on non-2xx responses or transport\n * failures. Surfaces `statusCode` so callers can map specific codes (400 →\n * input error / unsupported chain, 502 → upstream archive issue) without\n * string-matching messages.\n */\nexport class HistoricalBalanceClientError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'HistoricalBalanceClientError';\n }\n}\n\nexport class HistoricalBalanceClient {\n // Standalone-mode fields (set when the client builds its own fetch).\n private readonly baseUrl?: string;\n private readonly authToken?: string;\n private readonly apiKey?: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl?: typeof fetch;\n\n // Sub-client-mode field (set when wired via SmartEngineClient).\n private readonly http?: HttpClient;\n\n constructor(config: HistoricalBalanceClientConfig | { http: HttpClient }) {\n if ('http' in config) {\n this.http = config.http;\n this.timeoutMs = DEFAULT_TIMEOUT_MS;\n return;\n }\n if (!config.baseUrl) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient: baseUrl is required for standalone construction',\n 400\n );\n }\n this.baseUrl = config.baseUrl.replace(/\\/+$/, '');\n this.authToken = config.authToken;\n this.apiKey = config.apiKey;\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.fetchImpl = config.fetchImpl;\n }\n\n /**\n * Factory used by `SmartEngineClient` to wire this sub-client onto the\n * parent's shared `HttpClient` (which already carries auth + baseUrl + a\n * `/api/v3` prefix). Routes through `/historical-balance/query` since the\n * parent's HttpClient is rooted at `/api/v3`.\n */\n static fromHttp(http: HttpClient): HistoricalBalanceClient {\n return new HistoricalBalanceClient({ http });\n }\n\n /**\n * Query a point-in-time balance.\n *\n * The validator returns the on-chain bigint as a base-10 decimal string.\n * Callers needing arithmetic precision should wrap the result:\n *\n * ```ts\n * const { balance } = await client.historicalBalance.getBalance({ ... });\n * const value = BigInt(balance);\n * ```\n */\n async getBalance(params: HistoricalBalanceQueryParams): Promise<HistoricalBalanceResult> {\n this.validateParams(params);\n\n if (this.http) {\n // Sub-client mode: delegate to the shared HttpClient. The path is\n // relative because the parent client roots at `/api/v3`.\n return this.http.post<HistoricalBalanceResult>('/historical-balance/query', params);\n }\n return this.standaloneFetch(params);\n }\n\n private validateParams(params: HistoricalBalanceQueryParams): void {\n if (!params || typeof params !== 'object') {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: params object is required',\n 400\n );\n }\n const { chain, entityId, account, atTimestamp } = params;\n if (chain !== 'hedera' && chain !== 'xrpl' && chain !== 'polkadot') {\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient.getBalance: unsupported chain \"${String(chain)}\" (expected hedera | xrpl | polkadot)`,\n 400\n );\n }\n if (typeof entityId !== 'string' || entityId.length === 0) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: entityId must be a non-empty string',\n 400\n );\n }\n if (typeof account !== 'string' || account.length === 0) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: account must be a non-empty string',\n 400\n );\n }\n if (\n typeof atTimestamp !== 'number' ||\n !Number.isInteger(atTimestamp) ||\n atTimestamp <= 0\n ) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: atTimestamp must be a positive integer (unix seconds)',\n 400\n );\n }\n }\n\n private async standaloneFetch(\n params: HistoricalBalanceQueryParams\n ): Promise<HistoricalBalanceResult> {\n const url = `${this.baseUrl}${ENDPOINT_PATH}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n if (this.authToken) headers.Authorization = `Bearer ${this.authToken}`;\n if (this.apiKey) headers['X-API-Key'] = this.apiKey;\n\n const fetchFn = this.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined);\n if (!fetchFn) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient: no fetch implementation available (provide fetchImpl)',\n 500\n );\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await fetchFn(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const message = err instanceof Error ? err.message : String(err);\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient: transport error: ${message}`,\n 0,\n err\n );\n }\n clearTimeout(timer);\n\n let body: unknown;\n const text = await response.text();\n if (text.length > 0) {\n try {\n body = JSON.parse(text);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient: non-JSON response (status=${response.status}): ${message}`,\n response.status,\n { raw: text }\n );\n }\n }\n\n if (!response.ok) {\n const detail =\n body && typeof body === 'object' && 'message' in (body as any)\n ? String((body as any).message)\n : `HTTP ${response.status}`;\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient: ${detail}`,\n response.status,\n body\n );\n }\n\n return body as HistoricalBalanceResult;\n }\n}\n","/**\n * Settlement Sub-Client\n *\n * Manages cross-chain settlement operations including initiation,\n * status tracking, XRP landing confirmation, and history retrieval.\n */\n\nimport type { HttpClient } from '../http';\n\nexport type {\n SettlementPurpose,\n SettlementAsset,\n SettlementInitiateRequest,\n SettlementStatusResponse,\n SettlementHistoryEntry,\n} from './types';\n\nimport type {\n SettlementInitiateRequest,\n SettlementStatusResponse,\n SettlementHistoryEntry,\n} from './types';\n\nexport class SettlementClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Initiate a new settlement operation.\n * Submits source-chain payment details and begins the conversion pipeline.\n */\n async initiate(request: SettlementInitiateRequest): Promise<SettlementStatusResponse> {\n return this.http.post('/settlement/initiate', request);\n }\n\n /**\n * Get the current status of a settlement by ID.\n */\n async getStatus(settlementId: string): Promise<SettlementStatusResponse> {\n return this.http.get(`/settlement/${encodeURIComponent(settlementId)}/status`);\n }\n\n /**\n * Confirm that XRP has landed on the destination address.\n * Advances the settlement to the next processing step.\n */\n async confirmXrpLanded(settlementId: string): Promise<SettlementStatusResponse> {\n return this.http.post(`/settlement/${encodeURIComponent(settlementId)}/confirm-xrp`, {});\n }\n\n /**\n * Get settlement history for a given entity.\n */\n async getHistory(entityId: string): Promise<SettlementHistoryEntry[]> {\n return this.http.get(`/settlement/history/${encodeURIComponent(entityId)}`);\n }\n}\n","/**\n * Governance sub-client barrel.\n *\n * Pure HTTP. No internal `@hsuite/*` imports.\n */\nexport { GovernanceClient } from './governance-client';\nexport type {\n GovernanceConfig,\n GovernanceValidationContext,\n GovernanceValidationResult,\n GovernanceSimulateRequest,\n GovernanceProposalData,\n GovernanceProposalStatus,\n GovernanceVoteType,\n GovernanceVotingPowerMethod,\n} from './governance-types';\n","/**\n * Governance Sub-Client (PR-GOVERNANCE)\n *\n * Thin HTTP wrapper around `POST /api/v3/governance/simulate`. Lets\n * smart-app authors dry-run `GovernanceMolecule.validate(...)` against\n * fixture data without depending on the rules-engine package.\n *\n * Zero internal-lib coupling: types are declared locally in\n * `./governance-types`; the only runtime dependency is the SDK's own\n * `HttpClient` abstraction.\n */\nimport type { HttpClient } from '../http';\nimport type {\n GovernanceSimulateRequest,\n GovernanceValidationResult,\n} from './governance-types';\n\n/**\n * Governance Sub-Client.\n *\n * Exposed as `client.governance` on `SmartEngineClient`.\n *\n * @example\n * ```typescript\n * const result = await client.governance.simulate({\n * config: { governanceTokenId: '0.0.123', proposalThreshold: '100', votingPeriodMs: 604800000 },\n * context: { callerAccountId: '0.0.111', action: 'create_proposal', tokenBalance: '500' },\n * });\n * if (!result.isValid) {\n * console.error('proposal rejected:', result.reason);\n * }\n * ```\n */\nexport class GovernanceClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Dry-run a governance proposal/vote/etc. against `GovernanceMolecule.validate(...)`.\n *\n * Returns whatever `ValidationResult` the molecule produced. A `false`\n * `isValid` is **not** an error — it is a successful \"this proposal is\n * invalid\" outcome and is surfaced via the normal return value.\n *\n * HTTP errors (400 malformed body, 500 unexpected) bubble up as\n * `SdkHttpError` via the shared `HttpClient` layer.\n */\n async simulate(params: GovernanceSimulateRequest): Promise<GovernanceValidationResult> {\n return this.http.post<GovernanceValidationResult>('/governance/simulate', params);\n }\n}\n","/**\n * Personhood sub-client barrel.\n */\nexport * from './personhood-types';\nexport {\n PersonhoodClient,\n isPersonhoodVerifierNotConfigured,\n PERSONHOOD_VERIFIER_NOT_CONFIGURED,\n} from './personhood-client';\n","/**\n * Personhood Sub-Client\n *\n * Thin HTTP wrapper around `POST /api/v3/personhood/verify`. Pure HTTP —\n * never imports a server-side personhood module or the baas-core types.\n * The locally-declared types in `./personhood-types` mirror the server's\n * wire shape; see that file for the source-of-truth annotation.\n *\n * @example\n * ```typescript\n * const cert = await client.personhood.verify({\n * candidate: '0.0.12345',\n * proof: {\n * attestationMethod: 'web-of-trust',\n * payload: { vouchers: ['0.0.111', '0.0.222'] },\n * },\n * });\n * if (!cert) {\n * console.log('verification rejected');\n * return;\n * }\n * console.log('cert expires at', cert.expiresAt);\n * ```\n */\nimport type { HttpClient } from '../http';\nimport { SdkHttpError } from '../http';\nimport type {\n PersonhoodCert,\n PersonhoodVerifyParams,\n} from './personhood-types';\n\n/**\n * Error envelope emitted by the validator when the hub has no\n * `IPersonhoodVerifier` wired. Exposed as a constant so callers can\n * branch on the `error` discriminator without re-typing the string.\n */\nexport const PERSONHOOD_VERIFIER_NOT_CONFIGURED = 'personhood_verifier_not_configured' as const;\n\n/**\n * Thin HTTP client for the personhood endpoint.\n *\n * Method outcomes:\n * - HTTP 200 with a cert object → resolves to `PersonhoodCert`.\n * - HTTP 200 with `null` body → resolves to `null` (clean rejection).\n * - HTTP 400 → throws `SdkHttpError(400)`.\n * - HTTP 503 → throws `SdkHttpError(503)` whose\n * `.details.error === 'personhood_verifier_not_configured'`.\n * - HTTP 5xx → throws `SdkHttpError` with the upstream status.\n * - Network / timeout → throws `SdkHttpError(0|408)`.\n */\nexport class PersonhoodClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Verify a personhood proof for `candidate`.\n *\n * Returns the issued cert on accept, `null` on clean rejection. All\n * other failure modes (validation, transport, 5xx) propagate as\n * `SdkHttpError`.\n */\n async verify(params: PersonhoodVerifyParams): Promise<PersonhoodCert | null> {\n const result = await this.http.post<PersonhoodCert | null>(\n '/personhood/verify',\n {\n candidate: params.candidate,\n proof: params.proof,\n },\n );\n // The validator returns `null` literally on clean rejection, and the\n // HTTP layer surfaces empty `204 No Content` bodies as `undefined`.\n // Treat both as the same \"no cert\" outcome so callers only branch on\n // `=== null`.\n if (result === undefined) return null;\n return result;\n }\n}\n\nexport type { PersonhoodCert, PersonhoodVerifyParams } from './personhood-types';\n\n/**\n * Predicate: narrows an unknown error to a 503\n * `personhood_verifier_not_configured` envelope. Use in smart-app code to\n * treat unconfigured hubs as a graceful downgrade.\n */\nexport function isPersonhoodVerifierNotConfigured(\n err: unknown,\n): err is SdkHttpError & { details: { error: typeof PERSONHOOD_VERIFIER_NOT_CONFIGURED } } {\n if (!(err instanceof SdkHttpError)) return false;\n if (err.statusCode !== 503) return false;\n const d = err.details as unknown;\n if (d === null || typeof d !== 'object') return false;\n return (d as Record<string, unknown>).error === PERSONHOOD_VERIFIER_NOT_CONFIGURED;\n}\n","import {\n CreateAccountRequestSchema,\n CreateAccountRequest,\n CreateAccountResponse,\n TransferRequestSchema,\n TransferRequest,\n TransferResponse,\n CreateTokenRequestSchema,\n CreateTokenRequest,\n CreateTokenResponse,\n MintTokenRequestSchema,\n MintTokenRequest,\n BurnTokenRequestSchema,\n BurnTokenRequest,\n TokenActionRequestSchema,\n TokenActionRequest,\n ActionResult,\n AccountBalance,\n AccountInfo,\n Transaction,\n TokenInfo,\n ChainType,\n} from './_vendor';\nimport { type CircuitBreakerSnapshot } from './_vendor';\nimport {\n ValidatorDiscoveryClient,\n ValidatorInfo,\n ClusterDiscoveryClient,\n type ClusterInfo,\n} from './discovery';\nimport { ValidatorAuthClient, AuthChain, AuthenticateResponse } from './auth';\nimport { createHttpClient, encodePathParam, type HttpClient } from './http';\nimport { type ResilientHttpConfig } from './http/resilient-http';\n\n// Sub-client imports — public API only (for third-party smart-app developers)\nimport { SubscriptionClient } from './subscription';\nimport { TSSClient } from './tss';\nimport { IPFSClient } from './ipfs';\nimport { TransactionsClient } from './transactions';\nimport { SnapshotsClient } from './snapshots';\nimport { HistoricalBalanceClient } from './historical-balance';\nimport { SettlementClient } from './settlement';\nimport { GovernanceClient } from './governance';\nimport { PersonhoodClient } from './personhood';\n\n/**\n * Smart Engine Client Configuration\n */\nexport interface SmartEngineClientConfig {\n /** Validator API base URL */\n baseUrl: string;\n /** API key for authenticated requests */\n apiKey?: string;\n /** Session token from validator auth */\n authToken?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Allow HTTP (insecure) connections - only for local development */\n allowInsecure?: boolean;\n /** HTTP resilience configuration (retry, timeout, circuit breaker) */\n http?: ResilientHttpConfig;\n}\n\n/**\n * Network connection configuration for auto-discovery\n */\nexport interface NetworkConnectionConfig {\n /** Hedera network (mainnet, testnet, previewnet) */\n network: 'mainnet' | 'testnet' | 'previewnet';\n /** HCS topic ID for validator registry */\n registryTopicId: string;\n /** Blockchain type for authentication */\n chain: AuthChain;\n /** Wallet address for authentication */\n address: string;\n /** Public key (hex encoded) */\n publicKey: string;\n /** Function to sign the challenge */\n signFn: (challenge: string) => string | Promise<string>;\n /** Optional metadata for authentication */\n metadata?: {\n appId?: string;\n appName?: string;\n };\n /** Custom mirror node URL */\n mirrorNodeUrl?: string;\n /** Allow HTTP (insecure) connections - only for local development */\n allowInsecure?: boolean;\n}\n\n/**\n * Cluster connection config used by {@link SmartEngineClient.connectToCluster}.\n *\n * The \"bootstrap\" list is operator-ordered preference (e.g. Cloudflare-\n * fronted hostname first, raw cluster ingress IPs as backstops). Only\n * the *first reachable* seed is consulted per refresh.\n */\nexport interface ClusterConnectionConfig {\n /** Bootstrap seeds: URLs that serve `GET /api/v3/discovery/clusters`. */\n bootstrap: string[];\n /** Blockchain type for authentication. */\n chain: AuthChain;\n /** Wallet address for authentication. */\n address: string;\n /** Public key (hex encoded). */\n publicKey: string;\n /** Function to sign the challenge. */\n signFn: (challenge: string) => string | Promise<string>;\n /** Optional metadata for authentication. */\n metadata?: { appId?: string; appName?: string };\n /**\n * Optional HCS trust anchor — when supplied, the bootstrap response is\n * cross-checked against the on-chain validator-registry topic so a\n * compromised bootstrap seed can't inject rogue clusters. See\n * {@link ClusterDiscoveryClient} for the exact semantics.\n */\n trustAnchor?: {\n network: 'mainnet' | 'testnet' | 'previewnet';\n registryTopicId: string;\n mirrorNodeUrl?: string;\n };\n /** Allow HTTP (insecure) connections — only for local development. */\n allowInsecure?: boolean;\n}\n\n/**\n * Connection result from {@link SmartEngineClient.connectToCluster}.\n */\nexport interface ClusterConnectionResult {\n /** Configured client ready to use. */\n client: SmartEngineClient;\n /** Cluster the SDK is currently connected to. */\n cluster: ClusterInfo;\n /** Auth session for the connected cluster. */\n session: AuthenticateResponse;\n}\n\n/**\n * Connection result from connectToNetwork\n */\nexport interface NetworkConnectionResult {\n /** Configured client ready to use */\n client: SmartEngineClient;\n /** Validator that was connected to */\n validator: ValidatorInfo;\n /** Authentication session */\n session: AuthenticateResponse;\n}\n\n/**\n * Smart Engine Client\n *\n * Unified, type-safe client for interacting with Smart Engines validators.\n * Supports direct connection or auto-discovery via HCS registry.\n *\n * Sub-clients for third-party app developers:\n * - `client.subscription` — Application subscription management\n * - `client.tss` — Threshold Signature Scheme (chain-agnostic MPC)\n * - `client.ipfs` — Decentralized file storage\n * - `client.transactions` — Transaction sovereignty (prepare-sign-submit)\n *\n * @example Direct connection\n * ```typescript\n * const client = new SmartEngineClient({\n * baseUrl: 'https://validator.example.com',\n * apiKey: 'your-api-key',\n * });\n * ```\n *\n * @example Auto-discovery with authentication\n * ```typescript\n * const { client, validator, session } = await SmartEngineClient.connectToNetwork({\n * network: 'testnet',\n * registryTopicId: '0.0.123456',\n * chain: 'hedera',\n * address: '0.0.789',\n * publicKey: 'your-public-key-hex',\n * signFn: (challenge) => privateKey.sign(Buffer.from(challenge)).toString('hex'),\n * });\n *\n * // Use sub-clients\n * const result = await client.tss.signMPC({\n * chain: 'hedera',\n * entityId: 'entity-123',\n * transactionBytes: '0x...',\n * });\n * ```\n */\nexport class SmartEngineClient {\n private baseUrl: string;\n private allowInsecure: boolean;\n private readonly http: HttpClient;\n /** Separate HTTP client for /api/transactions (non-v3 base path) */\n private readonly txHttp: HttpClient;\n /** Last HTTP error (for getHttpHealth) */\n private lastHttpError?: Error;\n\n // ========== Sub-Clients ==========\n\n /** Application subscription management */\n public readonly subscription: SubscriptionClient;\n /** Threshold Signature Scheme — chain-agnostic MPC operations */\n public readonly tss: TSSClient;\n /** IPFS decentralized file storage */\n public readonly ipfs: IPFSClient;\n /** Transaction preparation for local signing (sovereignty model) */\n public readonly transactions: TransactionsClient;\n /** Token holder snapshot generation and retrieval */\n public readonly snapshots: SnapshotsClient;\n /** Historical balance archive reads (chain-native bigint, returned as decimal string) */\n public readonly historicalBalance: HistoricalBalanceClient;\n /** Cross-chain settlement operations */\n public readonly settlement: SettlementClient;\n /** Governance proposal dry-run (simulate-only) */\n public readonly governance: GovernanceClient;\n /** Personhood verification (HPP one-human-one-member) */\n public readonly personhood: PersonhoodClient;\n\n constructor(config: SmartEngineClientConfig) {\n this.allowInsecure = config.allowInsecure ?? false;\n this.baseUrl = validateClientUrl(config.baseUrl, this.allowInsecure);\n // Note: config.http is accepted for backward compatibility and future resilience layer integration\n\n // Create shared HTTP client for /api/v3 endpoints\n this.http = createHttpClient({\n baseUrl: `${this.baseUrl}/api/v3`,\n apiKey: config.apiKey,\n authToken: config.authToken,\n timeout: config.timeout,\n });\n\n // Create separate HTTP client for /api/transactions (non-v3 base path)\n this.txHttp = createHttpClient({\n baseUrl: `${this.baseUrl}/api/transactions`,\n apiKey: config.apiKey,\n authToken: config.authToken,\n timeout: config.timeout,\n });\n\n // Initialize sub-clients\n this.subscription = new SubscriptionClient(this.http);\n this.tss = new TSSClient(this.http);\n this.ipfs = new IPFSClient(this.http);\n this.transactions = new TransactionsClient(this.txHttp);\n this.snapshots = new SnapshotsClient(this.http);\n this.historicalBalance = HistoricalBalanceClient.fromHttp(this.http);\n this.settlement = new SettlementClient(this.http);\n this.governance = new GovernanceClient(this.http);\n this.personhood = new PersonhoodClient(this.http);\n }\n\n /**\n * Connect to the smart-engines network with auto-discovery and authentication\n *\n * This method:\n * 1. Discovers validators via HCS registry topic\n * 2. Selects a random validator with API endpoint\n * 3. Authenticates with Web3-style challenge-response\n * 4. Returns a configured client ready to use\n */\n static async connectToNetwork(config: NetworkConnectionConfig): Promise<NetworkConnectionResult> {\n const allowInsecure = config.allowInsecure ?? false;\n\n // Step 1: Discover validators\n const discovery = new ValidatorDiscoveryClient({\n network: config.network,\n registryTopicId: config.registryTopicId,\n mirrorNodeUrl: config.mirrorNodeUrl,\n });\n\n const validator = await discovery.getRandomValidator();\n\n if (!validator || !validator.networkEndpoints?.apiEndpoint) {\n throw new SmartEngineError(\n 'No validators available. Check registry topic and network configuration.',\n 503\n );\n }\n\n const validatorUrl = validator.networkEndpoints.apiEndpoint;\n validateClientUrl(validatorUrl, allowInsecure);\n\n // Step 2: Authenticate\n const auth = new ValidatorAuthClient({\n security: { allowInsecure },\n });\n const session = await auth.authenticateWithSigner(\n validatorUrl,\n config.chain,\n config.address,\n config.publicKey,\n config.signFn,\n config.metadata\n );\n\n // Step 3: Create client with auth token\n const client = new SmartEngineClient({\n baseUrl: validatorUrl,\n authToken: session.token,\n allowInsecure,\n });\n\n return { client, validator, session };\n }\n\n /**\n * Connect to the smart-engines network via the **service-registry**\n * (PR-1 of the cluster-discovery arc). Preferred over\n * {@link connectToNetwork} once the validator pods in the target network\n * have published their cluster endpoints — the SDK auto-balances across\n * the active cluster set and rides permissionless cluster join/leave\n * without code edits.\n *\n * Fallback ladder (per `docs/ops/HANDOFF-service-registry-distribution-layer.md` §6):\n * 1. HTTP fetch `/api/v3/discovery/clusters` from each bootstrap seed.\n * 2. (Optional) HCS trust-anchor membership cross-check.\n * 3. Random-pick over the verified set.\n *\n * @example\n * ```ts\n * const { client, cluster, session } = await SmartEngineClient.connectToCluster({\n * bootstrap: ['https://sn1.testnet.hsuite.network', 'https://sn2.testnet.hsuite.network'],\n * chain: 'xrpl',\n * address: '...',\n * publicKey: '...',\n * signFn: async (challenge) => sign(challenge),\n * });\n * ```\n */\n static async connectToCluster(config: ClusterConnectionConfig): Promise<ClusterConnectionResult> {\n const allowInsecure = config.allowInsecure ?? false;\n\n const discovery = new ClusterDiscoveryClient({\n bootstrap: config.bootstrap,\n allowInsecure,\n trustAnchor: config.trustAnchor\n ? {\n network: config.trustAnchor.network,\n registryTopicId: config.trustAnchor.registryTopicId,\n mirrorNodeUrl: config.trustAnchor.mirrorNodeUrl,\n allowInsecure,\n }\n : undefined,\n });\n\n const cluster = await discovery.getRandomCluster();\n if (!cluster) {\n throw new SmartEngineError(\n 'No active clusters available via bootstrap seeds. Check bootstrap URLs and network reachability.',\n 503,\n );\n }\n\n const gatewayUrl = cluster.endpoints.gatewayUrl;\n validateClientUrl(gatewayUrl, allowInsecure);\n\n const auth = new ValidatorAuthClient({ security: { allowInsecure } });\n const session = await auth.authenticateWithSigner(\n gatewayUrl,\n config.chain,\n config.address,\n config.publicKey,\n config.signFn,\n config.metadata,\n );\n\n const client = new SmartEngineClient({\n baseUrl: gatewayUrl,\n authToken: session.token,\n allowInsecure,\n });\n\n return { client, cluster, session };\n }\n\n /** Get the current validator URL */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /** Check if client has an auth token */\n isAuthenticated(): boolean {\n return !!(this.http as any).authToken;\n }\n\n /**\n * Get HTTP resilience health information\n * @returns Object with circuit breaker state and last error (if any)\n */\n getHttpHealth(): { breaker: CircuitBreakerSnapshot | null; lastError?: Error } {\n // Note: In a real implementation, we would get the circuit breaker state\n // from the resilient HTTP layer. For now, return null since the base\n // HTTP client doesn't expose it yet.\n return {\n breaker: null,\n lastError: this.lastHttpError,\n };\n }\n\n // ========== Health & Info ==========\n\n /** Get health status of the validator */\n async getHealth(): Promise<{ status: string; timestamp: string; chains: any[] }> {\n return this.http.get('/health');\n }\n\n /** Get list of supported chains */\n async getSupportedChains(): Promise<{ chains: string[] }> {\n return this.http.get('/chains');\n }\n\n // ========== Account Operations ==========\n\n /** Create a new account on the specified chain */\n async createAccount(request: CreateAccountRequest): Promise<CreateAccountResponse> {\n const validated = CreateAccountRequestSchema.parse(request);\n return this.http.post('/accounts', validated);\n }\n\n /** Get account information */\n async getAccountInfo(chain: string, accountId: string): Promise<AccountInfo> {\n return this.http.get(`/accounts/${encodePathParam(chain)}/${encodePathParam(accountId)}`);\n }\n\n /** Get account balance */\n async getBalance(chain: string, accountId: string): Promise<AccountBalance> {\n return this.http.get(`/accounts/${encodePathParam(chain)}/${encodePathParam(accountId)}/balance`);\n }\n\n // ========== Transaction Operations ==========\n\n /** Execute a transfer transaction */\n async transfer(request: TransferRequest): Promise<TransferResponse> {\n const validated = TransferRequestSchema.parse(request);\n return this.http.post('/transfer', validated);\n }\n\n /** Get transaction details */\n async getTransaction(chain: string, txId: string): Promise<Transaction> {\n return this.http.get(`/transactions/${encodePathParam(chain)}/${encodePathParam(txId)}`);\n }\n\n /** Get transaction receipt */\n async getTransactionReceipt(chain: string, txId: string): Promise<any> {\n return this.http.get(`/transactions/${encodePathParam(chain)}/${encodePathParam(txId)}/receipt`);\n }\n\n // ========== Token Operations ==========\n\n /** Create a new token */\n async createToken(request: CreateTokenRequest): Promise<CreateTokenResponse> {\n const validated = CreateTokenRequestSchema.parse(request);\n return this.http.post('/tokens', validated);\n }\n\n /** Mint tokens */\n async mintToken(request: MintTokenRequest): Promise<any> {\n const validated = MintTokenRequestSchema.parse(request);\n return this.http.post('/tokens/mint', validated);\n }\n\n /** Get token information */\n async getTokenInfo(chain: string, tokenId: string): Promise<TokenInfo> {\n return this.http.get(`/tokens/${encodePathParam(chain)}/${encodePathParam(tokenId)}`);\n }\n\n /** Burn tokens to reduce supply */\n async burnToken(request: BurnTokenRequest): Promise<ActionResult> {\n const validated = BurnTokenRequestSchema.parse(request);\n return this.http.post('/tokens/burn', validated);\n }\n\n /** Pause all token operations globally */\n async pauseToken(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n return this.http.post('/tokens/pause', validated);\n }\n\n /** Unpause token operations */\n async unpauseToken(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n return this.http.post('/tokens/unpause', validated);\n }\n\n /** Freeze/restrict an account from transacting the token */\n async restrictAccount(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for restrictAccount', 400);\n }\n return this.http.post('/tokens/restrict', validated);\n }\n\n /** Unfreeze an account */\n async unrestrictAccount(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for unrestrictAccount', 400);\n }\n return this.http.post('/tokens/unrestrict', validated);\n }\n\n /** Grant KYC/compliance approval to an account */\n async enableCompliance(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for enableCompliance', 400);\n }\n return this.http.post('/tokens/compliance/enable', validated);\n }\n\n /** Revoke KYC/compliance approval from an account */\n async disableCompliance(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for disableCompliance', 400);\n }\n return this.http.post('/tokens/compliance/disable', validated);\n }\n\n /** Force remove tokens from an account (compliance action) */\n async wipeFromAccount(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for wipeFromAccount', 400);\n }\n if (!validated.amount) {\n throw new SmartEngineError('amount is required for wipeFromAccount', 400);\n }\n return this.http.post('/tokens/wipe', validated);\n }\n\n // ========== Capabilities Discovery ==========\n\n /** Get capability support matrix for all chains */\n async getAllCapabilities(): Promise<any> {\n return this.http.get('/capabilities');\n }\n\n /** Get capability support for a specific chain */\n async getChainCapabilities(chain: ChainType): Promise<any> {\n return this.http.get(`/capabilities/${encodePathParam(chain)}`);\n }\n\n /** Get comprehensive system status */\n async getSystemStatus(): Promise<any> {\n return this.http.get('/status');\n }\n\n // ========== Messaging Operations ==========\n\n /** Submit a message to consensus */\n async submitMessage(chain: string, topicId: string, message: string): Promise<any> {\n if (message.length > 1024 * 1024) {\n throw new SmartEngineError('Message too large (max 1MB)', 400);\n }\n return this.http.post(`/messages/${encodePathParam(chain)}/${encodePathParam(topicId)}`, {\n message,\n });\n }\n\n // ========== Cluster Operations ==========\n\n /** Get cluster health status */\n async getClusterHealth(): Promise<{\n status: string;\n nodes: number;\n healthy: number;\n unhealthy: number;\n }> {\n return this.http.get('/cluster/health');\n }\n\n /** Get cluster status including node details */\n async getClusterStatus(): Promise<{\n status: string;\n nodeId: string;\n nodes: Array<{\n nodeId: string;\n endpoint: string;\n status: string;\n lastSeen?: string;\n }>;\n quorum: {\n required: number;\n current: number;\n reached: boolean;\n };\n }> {\n return this.http.get('/cluster/status');\n }\n\n // ========== Metrics & Monitoring ==========\n\n /** Get Prometheus-format metrics */\n async getMetrics(): Promise<string> {\n return this.http.get('/metrics');\n }\n\n /** Get queue statistics for monitoring */\n async getQueueStats(): Promise<{\n queues: Record<\n string,\n { pending: number; processing: number; completed: number; failed: number }\n >;\n timestamp: string;\n }> {\n return this.http.get('/monitoring/queue');\n }\n\n /** Get circuit breaker status for all services */\n async getCircuitBreakerStatus(): Promise<{\n breakers: Record<\n string,\n {\n state: 'closed' | 'open' | 'half-open';\n failures: number;\n successes: number;\n lastFailure?: string;\n nextRetry?: string;\n }\n >;\n timestamp: string;\n }> {\n return this.http.get('/monitoring/circuit-breakers');\n }\n\n // ========== Signature Verification ==========\n\n /** Verify an arbitrary signature */\n async verifySignature(request: {\n chain: ChainType;\n message: string;\n signature: string;\n publicKey: string;\n }): Promise<{ valid: boolean; chain: ChainType }> {\n return this.http.post('/auth/verify-signature', request);\n }\n}\n\n/**\n * Custom error class for Smart Engine client\n */\nexport class SmartEngineError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public details?: any\n ) {\n super(message);\n this.name = 'SmartEngineError';\n }\n}\n\n/**\n * Validate URL and enforce security requirements\n */\nfunction validateClientUrl(url: string, allowInsecure = false): string {\n try {\n const parsed = new URL(url);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new SmartEngineError(`Invalid protocol: ${parsed.protocol}`, 400);\n }\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new SmartEngineError(\n 'HTTPS is required for secure connections. Set allowInsecure=true for local development.',\n 400\n );\n }\n return parsed.origin;\n } catch (error) {\n if (error instanceof SmartEngineError) throw error;\n throw new SmartEngineError(`Invalid URL: ${url}`, 400);\n }\n}\n","/**\n * Routing Sub-Client\n *\n * Manages host registration, routing configuration, and request proxying.\n */\nimport type { HttpClient } from '../../http';\nimport type {\n RegisterHostRequest,\n HostInfo,\n HostListResponse,\n RoutingConfig,\n ProxyRequest,\n ProxyResponse,\n RoutingStatsResponse,\n} from '../types';\n\n/**\n * Routing Sub-Client\n *\n * @example\n * ```typescript\n * // Register a host\n * await gateway.routing.registerHost({ name: 'Host 1', endpoint: 'https://host1.example.com' });\n *\n * // Get routing stats\n * const stats = await gateway.routing.getStats();\n * ```\n */\nexport class RoutingClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Register a new host */\n async registerHost(request: RegisterHostRequest): Promise<HostInfo> {\n return this.http.post('/routing/hosts', request);\n }\n\n /** Unregister a host */\n async unregisterHost(hostId: string): Promise<{ success: boolean }> {\n return this.http.delete(`/routing/hosts/${encodeURIComponent(hostId)}`);\n }\n\n /** Get all registered hosts */\n async getAllHosts(): Promise<HostListResponse> {\n return this.http.get('/routing/hosts');\n }\n\n /** Get only verified hosts */\n async getVerifiedHosts(): Promise<HostListResponse> {\n return this.http.get('/routing/hosts/verified');\n }\n\n /** Get a specific host by ID */\n async getHost(hostId: string): Promise<HostInfo> {\n return this.http.get(`/routing/hosts/${encodeURIComponent(hostId)}`);\n }\n\n /** Verify a host */\n async verifyHost(hostId: string): Promise<{ verified: boolean; message: string }> {\n return this.http.post(`/routing/hosts/${encodeURIComponent(hostId)}/verify`, {});\n }\n\n /** Set routing configuration for an app */\n async setRoutingConfig(appId: string, config: RoutingConfig): Promise<RoutingConfig> {\n return this.http.put(`/routing/config/${encodeURIComponent(appId)}`, config);\n }\n\n /** Get routing configuration for an app */\n async getRoutingConfig(appId: string): Promise<RoutingConfig> {\n return this.http.get(`/routing/config/${encodeURIComponent(appId)}`);\n }\n\n /** Proxy a request through the gateway */\n async proxyRequest(request: ProxyRequest): Promise<ProxyResponse> {\n return this.http.post('/routing/proxy', request);\n }\n\n /** Get routing statistics */\n async getStats(): Promise<RoutingStatsResponse> {\n return this.http.get('/routing/stats');\n }\n\n /** Map a domain to an application */\n async mapDomainToApp(\n domain: string,\n appId: string\n ): Promise<{ success: boolean; domain: string; appId: string }> {\n return this.http.post(`/routing/domains/${encodeURIComponent(domain)}/map`, { appId });\n }\n}\n","/**\n * Domains Sub-Client\n *\n * Manages domain registration, verification, DNS configuration, and transfers.\n */\nimport type { HttpClient } from '../../http';\nimport type {\n DomainRegistrationRequest,\n DomainInfo,\n DomainListResponse,\n DomainAvailabilityResponse,\n VerificationTokenResponse,\n VerificationResult,\n DnsRecord,\n DomainTransferRequest,\n} from '../types';\n\n/**\n * Domains Sub-Client\n *\n * @example\n * ```typescript\n * // Register a domain\n * const domain = await gateway.domains.register({ domain: 'myapp.example.com', owner: '0.0.123' });\n *\n * // Verify ownership\n * const token = await gateway.domains.generateVerificationToken('myapp.example.com', 'dns');\n * const result = await gateway.domains.verifyOwnership('myapp.example.com', token.token);\n * ```\n */\nexport class DomainsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Register a new domain */\n async register(request: DomainRegistrationRequest): Promise<DomainInfo> {\n return this.http.post('/domains', request);\n }\n\n /** Check domain availability */\n async checkAvailability(domain: string): Promise<DomainAvailabilityResponse> {\n return this.http.get(`/domains/check/${encodeURIComponent(domain)}`);\n }\n\n /** Get domain information */\n async getInfo(domain: string): Promise<DomainInfo> {\n return this.http.get(`/domains/${encodeURIComponent(domain)}`);\n }\n\n /** List domains, optionally filtered by owner */\n async list(owner?: string): Promise<DomainListResponse> {\n const params = owner ? `?owner=${encodeURIComponent(owner)}` : '';\n return this.http.get(`/domains${params}`);\n }\n\n /** Generate a verification token */\n async generateVerificationToken(\n domain: string,\n method: 'dns' | 'http' | 'email'\n ): Promise<VerificationTokenResponse> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/verification`, { method });\n }\n\n /** Verify domain ownership */\n async verifyOwnership(domain: string, token: string): Promise<VerificationResult> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/verify`, { token });\n }\n\n /** Configure DNS records for a domain */\n async configureDns(domain: string, records: DnsRecord[]): Promise<{ success: boolean; records: DnsRecord[] }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/dns`, { records });\n }\n\n /** Enable DNSSEC for a domain */\n async enableDnssec(domain: string): Promise<{ success: boolean; message: string }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/dnssec/enable`, {});\n }\n\n /** Disable DNSSEC for a domain */\n async disableDnssec(domain: string): Promise<{ success: boolean; message: string }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/dnssec/disable`, {});\n }\n\n /** Renew a domain */\n async renew(domain: string, years?: number): Promise<DomainInfo> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/renew`, { years: years ?? 1 });\n }\n\n /** Initiate a domain transfer */\n async transfer(domain: string, request: DomainTransferRequest): Promise<{ success: boolean; message: string }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/transfer`, request);\n }\n\n /** Approve a pending domain transfer */\n async approveTransfer(domain: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/transfer/approve`, {});\n }\n\n /** Reject a pending domain transfer */\n async rejectTransfer(domain: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/transfer/reject`, {});\n }\n\n /** Suspend a domain */\n async suspend(domain: string, reason: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/suspend`, { reason });\n }\n\n /** Unsuspend a domain */\n async unsuspend(domain: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/unsuspend`, {});\n }\n}\n","/**\n * DNS Sub-Client\n *\n * Manages DNS resolution, zone management, and DNSSEC.\n */\nimport type { HttpClient } from '../../http';\nimport type {\n DnsResolveResponse,\n DnsBatchQuery,\n DnsBatchResolveResponse,\n DnsZone,\n DnsZoneListResponse,\n DnsRecord,\n DnsRecordInfo,\n DnssecKey,\n DnssecDsRecord,\n} from '../types';\n\n/**\n * DNS Sub-Client\n *\n * @example\n * ```typescript\n * // Resolve a name\n * const result = await gateway.dns.resolve('myapp.example.com', 'A');\n *\n * // Manage zones\n * const zones = await gateway.dns.listZones();\n * ```\n */\nexport class DnsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Resolve a DNS name */\n async resolve(name: string, type?: string, dnssec?: boolean): Promise<DnsResolveResponse> {\n const params = new URLSearchParams({ name });\n if (type) params.set('type', type);\n if (dnssec !== undefined) params.set('dnssec', String(dnssec));\n return this.http.get(`/dns/resolve?${params.toString()}`);\n }\n\n /** Batch resolve multiple DNS queries */\n async resolveBatch(queries: DnsBatchQuery[]): Promise<DnsBatchResolveResponse> {\n return this.http.post('/dns/resolve/batch', { queries });\n }\n\n /** List all DNS zones */\n async listZones(): Promise<DnsZoneListResponse> {\n return this.http.get('/dns/zones');\n }\n\n /** Get a specific zone */\n async getZone(zoneName: string): Promise<DnsZone & { records: DnsRecordInfo[] }> {\n return this.http.get(`/dns/zones/${encodeURIComponent(zoneName)}`);\n }\n\n /** Create a new DNS zone */\n async createZone(request: { zoneName: string; description?: string }): Promise<DnsZone> {\n return this.http.post('/dns/zones', request);\n }\n\n /** Delete a DNS zone */\n async deleteZone(zoneName: string): Promise<{ success: boolean }> {\n return this.http.delete(`/dns/zones/${encodeURIComponent(zoneName)}`);\n }\n\n /** Add a record to a zone */\n async addRecord(zoneName: string, record: DnsRecord): Promise<DnsRecordInfo> {\n return this.http.post(`/dns/zones/${encodeURIComponent(zoneName)}/records`, record);\n }\n\n /** Update a record in a zone */\n async updateRecord(\n zoneName: string,\n recordId: string,\n updates: Partial<DnsRecord>\n ): Promise<DnsRecordInfo> {\n return this.http.put(\n `/dns/zones/${encodeURIComponent(zoneName)}/records/${encodeURIComponent(recordId)}`,\n updates\n );\n }\n\n /** Delete a record from a zone */\n async deleteRecord(zoneName: string, recordId: string): Promise<{ success: boolean }> {\n return this.http.delete(\n `/dns/zones/${encodeURIComponent(zoneName)}/records/${encodeURIComponent(recordId)}`\n );\n }\n\n /** Generate DNSSEC keys for a zone */\n async generateDnssecKeys(\n zoneName: string,\n algorithm?: string\n ): Promise<{ keys: DnssecKey[] }> {\n return this.http.post(`/dns/zones/${encodeURIComponent(zoneName)}/dnssec/keys`, {\n algorithm,\n });\n }\n\n /** Get DNSSEC keys for a zone */\n async getDnssecKeys(zoneName: string): Promise<{ keys: DnssecKey[] }> {\n return this.http.get(`/dns/zones/${encodeURIComponent(zoneName)}/dnssec/keys`);\n }\n\n /** Get DS record for a zone (for registrar configuration) */\n async getDsRecord(zoneName: string): Promise<DnssecDsRecord> {\n return this.http.get(`/dns/zones/${encodeURIComponent(zoneName)}/dnssec/ds`);\n }\n\n /** Clear DNS cache */\n async clearCache(): Promise<{ success: boolean; entriesCleared: number }> {\n return this.http.post('/dns/cache/clear', {});\n }\n}\n","/**\n * Smart Gateway Client\n *\n * Top-level client for interacting with Smart Engines Gateway.\n * Manages host routing, domain registration, and DNS resolution.\n *\n * @example\n * ```typescript\n * import { SmartGatewayClient } from '@hsuite/smart-engines-sdk';\n *\n * const gateway = new SmartGatewayClient({\n * baseUrl: 'https://gateway.smartengines.io',\n * apiKey: 'your-api-key',\n * });\n *\n * // Routing\n * const hosts = await gateway.routing.getAllHosts();\n *\n * // Domains\n * const available = await gateway.domains.checkAvailability('myapp.example.com');\n *\n * // DNS\n * const resolved = await gateway.dns.resolve('myapp.example.com', 'A');\n *\n * // Health\n * const health = await gateway.getHealth();\n * ```\n */\nimport { createHttpClient, type HttpClient } from '../http';\nimport { RoutingClient } from './routing';\nimport { DomainsClient } from './domains';\nimport { DnsClient } from './dns';\nimport type {\n GatewayHealthResponse,\n GatewayStatusResponse,\n GatewayReadinessResponse,\n GatewayLivenessResponse,\n GatewayMetricsResponse,\n GatewayMetricsSummaryResponse,\n} from './types';\n\n/**\n * Configuration for SmartGatewayClient\n */\nexport type SmartGatewayClientConfig = {\n /** Gateway API base URL */\n baseUrl: string;\n /** API key for authenticated requests */\n apiKey?: string;\n /** Bearer token from authentication */\n authToken?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Allow HTTP connections (only for local development) */\n allowInsecure?: boolean;\n};\n\n/**\n * Smart Gateway Client\n *\n * Primary client for gateway operations: routing, domains, and DNS.\n */\nexport class SmartGatewayClient {\n private readonly http: HttpClient;\n\n /** Host routing and proxy management */\n public readonly routing: RoutingClient;\n /** Domain registration and management */\n public readonly domains: DomainsClient;\n /** DNS resolution and zone management */\n public readonly dns: DnsClient;\n\n constructor(config: SmartGatewayClientConfig) {\n const baseUrl = config.baseUrl.replace(/\\/+$/, '');\n\n this.http = createHttpClient({\n baseUrl: `${baseUrl}/api/v3`,\n apiKey: config.apiKey,\n authToken: config.authToken,\n timeout: config.timeout,\n });\n\n this.routing = new RoutingClient(this.http);\n this.domains = new DomainsClient(this.http);\n this.dns = new DnsClient(this.http);\n }\n\n // ========== Health & Metrics ==========\n\n /** Get gateway health status */\n async getHealth(): Promise<GatewayHealthResponse> {\n return this.http.get('/health');\n }\n\n /** Get gateway status with host and domain counts */\n async getStatus(): Promise<GatewayStatusResponse> {\n return this.http.get('/status');\n }\n\n /** Check gateway readiness */\n async getReadiness(): Promise<GatewayReadinessResponse> {\n return this.http.get('/ready');\n }\n\n /** Check gateway liveness */\n async getLiveness(): Promise<GatewayLivenessResponse> {\n return this.http.get('/live');\n }\n\n /** Get detailed gateway metrics */\n async getMetrics(refresh?: boolean): Promise<GatewayMetricsResponse> {\n const params = refresh ? '?refresh=true' : '';\n return this.http.get(`/metrics${params}`);\n }\n\n /** Get metrics summary */\n async getMetricsSummary(): Promise<GatewayMetricsSummaryResponse> {\n return this.http.get('/metrics/summary');\n }\n}\n","/**\n * Resilient HTTP Transport\n *\n * Wraps fetch with production-grade resilience features:\n * - Configurable timeout with AbortController\n * - Exponential backoff retry on idempotent methods (GET/HEAD)\n * - Automatic retry on 429/503 status codes with Retry-After header support\n * - Optional circuit breaker to fail fast on cascading failures\n * - Request/response logging hooks\n *\n * This layer sits between the HTTP client and raw fetch, providing\n * a simple `resilientFetch(url, init, config?)` signature that returns Response.\n */\n\nimport { CircuitBreaker, type CircuitBreakerConfig, type CircuitBreakerSnapshot } from '../_vendor';\n\n/**\n * Retry configuration for resilient fetch\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries: number;\n /** Initial delay in milliseconds (default: 1000) */\n initialDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Backoff multiplier (default: 2 for exponential) */\n backoffMultiplier: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitterFactor?: number;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n jitterFactor: 0.1,\n};\n\n/**\n * HTTP resilience configuration\n */\nexport interface ResilientHttpConfig {\n /** Request timeout in milliseconds (default: 30000) */\n timeoutMs?: number;\n /** Retry configuration (default: DEFAULT_RETRY_CONFIG) */\n retry?: Partial<RetryConfig>;\n /** Circuit breaker configuration (default: enabled with sensible defaults) */\n circuitBreaker?: Partial<CircuitBreakerConfig> | false;\n /** Optional callback when a retry is triggered */\n onRetry?: (attempt: number, delay: number, status?: number) => void;\n /** Optional callback on circuit breaker state changes */\n onCircuitBreakerStateChange?: (state: 'closed' | 'open' | 'half_open') => void;\n}\n\n/**\n * Helper to calculate backoff delay with jitter\n */\nfunction calculateBackoffDelay(attempt: number, config: RetryConfig): number {\n const exponentialDelay = config.initialDelayMs * Math.pow(config.backoffMultiplier, attempt);\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);\n\n if (config.jitterFactor && config.jitterFactor > 0) {\n const jitter = cappedDelay * config.jitterFactor * Math.random();\n return Math.floor(cappedDelay + jitter);\n }\n\n return Math.floor(cappedDelay);\n}\n\n/**\n * Helper to parse Retry-After header (seconds or HTTP-date)\n */\nfunction parseRetryAfter(retryAfter: string | null): number {\n if (!retryAfter) return 0;\n\n // Try parsing as seconds\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n return seconds * 1000;\n }\n\n // Try parsing as HTTP-date\n const date = new Date(retryAfter);\n if (!isNaN(date.getTime())) {\n return Math.max(0, date.getTime() - Date.now());\n }\n\n return 0;\n}\n\n/**\n * Helper to sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Check if a request method is idempotent (safe to retry)\n */\nfunction isIdempotent(method?: string): boolean {\n const m = (method || 'GET').toUpperCase();\n return m === 'GET' || m === 'HEAD' || m === 'OPTIONS';\n}\n\n/**\n * Resilient fetch wrapper with retry, timeout, and circuit breaker\n *\n * @param url - Target URL\n * @param init - Fetch options (method, headers, body, etc.)\n * @param config - Resilience configuration\n * @returns Response object (same as native fetch)\n * @throws Error if request fails after all retries or circuit breaker is open\n */\nexport async function resilientFetch(\n url: string,\n init?: RequestInit,\n config?: ResilientHttpConfig\n): Promise<Response> {\n const timeoutMs = config?.timeoutMs ?? 30000;\n const retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config?.retry };\n const method = (init?.method || 'GET').toUpperCase();\n\n // Initialize circuit breaker if not explicitly disabled\n const shouldUseCircuitBreaker = config?.circuitBreaker !== false;\n const breaker = shouldUseCircuitBreaker\n ? new CircuitBreaker({\n failureThreshold: 5,\n rollingWindowMs: 60000,\n cooldownMs: 30000,\n name: `http-${method}`,\n ...((config?.circuitBreaker as Partial<CircuitBreakerConfig>) || {}),\n })\n : null;\n\n // Retry loop\n let lastError: Error | undefined;\n let lastStatus: number | undefined;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n // Check circuit breaker before executing\n if (breaker) {\n if (!breaker.canExecute()) {\n const state = breaker.getState();\n if (config?.onCircuitBreakerStateChange) {\n config.onCircuitBreakerStateChange(state);\n }\n const snapshot = breaker.snapshot();\n throw new Error(\n `Circuit breaker is ${state}. Next probe at ${new Date(snapshot.nextProbeAt || 0).toISOString()}`\n );\n }\n }\n\n // Execute fetch with timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n\n // Check for retryable status codes\n if ((response.status === 429 || response.status === 503) && isIdempotent(method)) {\n // Only retry if we haven't exhausted retries\n if (attempt < retryConfig.maxRetries) {\n // Parse Retry-After header\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\n const delay = retryAfterMs > 0 ? retryAfterMs : calculateBackoffDelay(attempt, retryConfig);\n\n lastStatus = response.status;\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, response.status);\n }\n\n // Create an error for circuit breaker tracking\n const statusError = new Error(`HTTP ${response.status}`);\n if (breaker) {\n try {\n await breaker.execute(async () => {\n await sleep(delay);\n throw statusError;\n });\n } catch {\n // Expected to fail — this just records the failure\n }\n } else {\n await sleep(delay);\n }\n continue;\n }\n }\n\n // Success — circuit breaker will record this as success via execute()\n // Return the response as-is (even if it's a 429/503 on final attempt)\n return response;\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n if (attempt >= retryConfig.maxRetries) {\n break;\n }\n\n // Only retry idempotent methods (GET, HEAD, OPTIONS)\n if (!isIdempotent(method)) {\n break;\n }\n\n // Calculate delay and retry\n const delay = calculateBackoffDelay(attempt, retryConfig);\n\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, lastStatus);\n }\n\n await sleep(delay);\n }\n }\n\n // Exhausted retries\n if (lastError) {\n throw lastError;\n }\n\n // Should not reach here, but throw a generic error if we do\n throw new Error(`Failed to fetch ${url} after ${retryConfig.maxRetries} retries`);\n}\n\n/**\n * Create a resilient fetch instance with its own circuit breaker\n * Useful when you need to track breaker state across multiple requests\n */\nexport function createResilientFetchWithBreaker(config?: ResilientHttpConfig): {\n fetch: (url: string, init?: RequestInit) => Promise<Response>;\n getCircuitBreakerSnapshot: () => CircuitBreakerSnapshot | null;\n} {\n const shouldUseCircuitBreaker = config?.circuitBreaker !== false;\n const breaker = shouldUseCircuitBreaker\n ? new CircuitBreaker({\n failureThreshold: 5,\n rollingWindowMs: 60000,\n cooldownMs: 30000,\n name: 'http-breaker',\n ...((config?.circuitBreaker as Partial<CircuitBreakerConfig>) || {}),\n })\n : null;\n\n // Create a bound fetch that uses the shared breaker\n const boundFetch = async (url: string, init?: RequestInit): Promise<Response> => {\n const timeoutMs = config?.timeoutMs ?? 30000;\n const retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config?.retry };\n const method = (init?.method || 'GET').toUpperCase();\n\n let lastError: Error | undefined;\n let lastStatus: number | undefined;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n // Use circuit breaker's execute() to automatically track success/failure\n if (breaker) {\n const response = await breaker.execute(async () => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const resp = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n return resp;\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n });\n\n // Check for retryable status codes\n if ((response.status === 429 || response.status === 503) && isIdempotent(method)) {\n if (attempt < retryConfig.maxRetries) {\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\n const delay = retryAfterMs > 0 ? retryAfterMs : calculateBackoffDelay(attempt, retryConfig);\n\n lastStatus = response.status;\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, response.status);\n }\n\n await sleep(delay);\n continue;\n }\n }\n\n return response;\n } else {\n // No breaker — just do a direct fetch with timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n\n // Check for retryable status codes\n if ((response.status === 429 || response.status === 503) && isIdempotent(method)) {\n if (attempt < retryConfig.maxRetries) {\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\n const delay = retryAfterMs > 0 ? retryAfterMs : calculateBackoffDelay(attempt, retryConfig);\n\n lastStatus = response.status;\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, response.status);\n }\n\n await sleep(delay);\n continue;\n }\n }\n\n return response;\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n }\n } catch (error) {\n lastError = error as Error;\n\n if (attempt >= retryConfig.maxRetries) {\n break;\n }\n\n if (!isIdempotent(method)) {\n break;\n }\n\n const delay = calculateBackoffDelay(attempt, retryConfig);\n\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, lastStatus);\n }\n\n await sleep(delay);\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n throw new Error(`Failed to fetch ${url} after ${retryConfig.maxRetries} retries`);\n };\n\n return {\n fetch: boundFetch,\n getCircuitBreakerSnapshot: () => (breaker ? breaker.snapshot() : null),\n };\n}\n","/**\n * Chain-specific helper functions\n */\n\nexport * as hedera from './hedera';\nexport * as xrpl from './xrpl';\nexport * as polkadot from './polkadot';\nexport * as solana from './solana';\nexport * as stellar from './stellar';\nexport * as bitcoin from './bitcoin';\n","/**\n * Hedera-specific helper functions\n */\n\n/**\n * Format Hedera account ID (0.0.xxxxx)\n */\nexport function formatHederaAccountId(id: string): string {\n // Validate format\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(id)) {\n throw new Error(`Invalid Hedera account ID format: ${id}`);\n }\n return id;\n}\n\n/**\n * Parse HBAR amount from string\n */\nexport function parseHbar(amount: string): number {\n const num = parseFloat(amount);\n if (isNaN(num) || num < 0) {\n throw new Error(`Invalid HBAR amount: ${amount}`);\n }\n return num;\n}\n\n/**\n * Convert HBAR to tinybars (1 HBAR = 100,000,000 tinybars)\n */\nexport function hbarToTinybars(hbar: string | number): string {\n const amount = typeof hbar === 'string' ? parseFloat(hbar) : hbar;\n return (amount * 100_000_000).toFixed(0);\n}\n\n/**\n * Convert tinybars to HBAR\n */\nexport function tinybarsToHbar(tinybars: string | number): string {\n const amount = typeof tinybars === 'string' ? parseInt(tinybars, 10) : tinybars;\n return (amount / 100_000_000).toString();\n}\n\n/**\n * Format Hedera token ID (0.0.xxxxx)\n */\nexport function formatHederaTokenId(id: string): string {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(id)) {\n throw new Error(`Invalid Hedera token ID format: ${id}`);\n }\n return id;\n}\n\n/**\n * Format Hedera topic ID (0.0.xxxxx)\n */\nexport function formatHederaTopicId(id: string): string {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(id)) {\n throw new Error(`Invalid Hedera topic ID format: ${id}`);\n }\n return id;\n}\n","/**\n * XRPL-specific helper functions\n */\n\n/**\n * Validate XRPL address format\n */\nexport function validateXRPLAddress(address: string): boolean {\n return /^r[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address);\n}\n\n/**\n * Format XRPL address\n */\nexport function formatXRPLAddress(address: string): string {\n if (!validateXRPLAddress(address)) {\n throw new Error(`Invalid XRPL address format: ${address}`);\n }\n return address;\n}\n\n/**\n * Convert XRP to drops (1 XRP = 1,000,000 drops)\n */\nexport function xrpToDrops(xrp: string | number): string {\n const amount = typeof xrp === 'string' ? parseFloat(xrp) : xrp;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid XRP amount: ${xrp}`);\n }\n return (amount * 1_000_000).toFixed(0);\n}\n\n/**\n * Convert drops to XRP\n */\nexport function dropsToXrp(drops: string | number): string {\n const amount = typeof drops === 'string' ? parseInt(drops, 10) : drops;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid drops amount: ${drops}`);\n }\n return (amount / 1_000_000).toString();\n}\n\n/**\n * Parse XRP amount from string\n */\nexport function parseXRP(amount: string): number {\n const num = parseFloat(amount);\n if (isNaN(num) || num < 0) {\n throw new Error(`Invalid XRP amount: ${amount}`);\n }\n return num;\n}\n\n/**\n * Validate XRPL currency code\n */\nexport function validateCurrencyCode(code: string): boolean {\n // Standard 3-character currency code or 40-character hex\n return /^[A-Z]{3}$/.test(code) || /^[0-9A-F]{40}$/i.test(code);\n}\n","/**\n * Polkadot Chain Helpers\n *\n * Utility functions for working with Polkadot/Substrate chains.\n */\n\n/**\n * Planck per DOT (10^10)\n */\nconst PLANCK_PER_DOT = 10_000_000_000n;\n\n/**\n * Validate a Polkadot SS58 address format.\n *\n * @param address - The address to validate\n * @returns True if the address appears to be a valid SS58 format\n *\n * @example\n * ```typescript\n * validatePolkadotAddress('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg');\n * // true\n * ```\n */\nexport function validatePolkadotAddress(address: string): boolean {\n if (!address || typeof address !== 'string') {\n return false;\n }\n\n // Basic SS58 format check\n // - Starts with 1-9 or a-z (case insensitive)\n // - Contains only alphanumeric characters (base58)\n // - Length is typically 47-48 characters for Polkadot\n const ss58Regex = /^[1-9A-HJ-NP-Za-km-z]{47,48}$/;\n\n return ss58Regex.test(address);\n}\n\n/**\n * Format a Polkadot address (truncate for display).\n *\n * @param address - Full SS58 address\n * @param prefixLength - Number of characters to show at start (default 6)\n * @param suffixLength - Number of characters to show at end (default 6)\n * @returns Truncated address like \"1FRMM8...V24fg\"\n *\n * @example\n * ```typescript\n * formatPolkadotAddress('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg');\n * // '1FRMM8...V24fg'\n * ```\n */\nexport function formatPolkadotAddress(address: string, prefixLength = 6, suffixLength = 5): string {\n if (!address || address.length <= prefixLength + suffixLength) {\n return address;\n }\n\n return `${address.slice(0, prefixLength)}...${address.slice(-suffixLength)}`;\n}\n\n/**\n * Convert DOT to Planck (smallest unit).\n *\n * @param dot - Amount in DOT\n * @returns Amount in Planck (bigint)\n *\n * @example\n * ```typescript\n * dotToPlanck(1.5);\n * // 15000000000n (15 billion planck)\n * ```\n */\nexport function dotToPlanck(dot: number): bigint {\n if (dot < 0) {\n throw new Error('DOT amount cannot be negative');\n }\n\n // Handle decimal precision\n const [whole, decimal = ''] = dot.toString().split('.');\n const paddedDecimal = decimal.padEnd(10, '0').slice(0, 10);\n\n return BigInt(whole) * PLANCK_PER_DOT + BigInt(paddedDecimal);\n}\n\n/**\n * Convert Planck to DOT.\n *\n * @param planck - Amount in Planck\n * @returns Amount in DOT as a number\n *\n * @example\n * ```typescript\n * planckToDot(15000000000n);\n * // 1.5\n * ```\n */\nexport function planckToDot(planck: bigint): number {\n if (planck < 0n) {\n throw new Error('Planck amount cannot be negative');\n }\n\n const whole = planck / PLANCK_PER_DOT;\n const remainder = planck % PLANCK_PER_DOT;\n\n // Convert to number with decimal\n return Number(whole) + Number(remainder) / Number(PLANCK_PER_DOT);\n}\n\n/**\n * Format Planck amount as DOT string with specified decimals.\n *\n * @param planck - Amount in Planck\n * @param decimals - Number of decimal places to show (default 4)\n * @returns Formatted DOT string\n *\n * @example\n * ```typescript\n * formatDot(15000000000n, 2);\n * // '1.50 DOT'\n * ```\n */\nexport function formatDot(planck: bigint, decimals = 4): string {\n const dot = planckToDot(planck);\n return `${dot.toFixed(decimals)} DOT`;\n}\n\n/**\n * Parse a DOT amount string to Planck.\n *\n * @param dotString - Amount as string (e.g., \"1.5\" or \"1.5 DOT\")\n * @returns Amount in Planck\n *\n * @example\n * ```typescript\n * parseDotString('1.5 DOT');\n * // 15000000000n\n * ```\n */\nexport function parseDotString(dotString: string): bigint {\n // Remove 'DOT' suffix and whitespace\n const cleaned = dotString.replace(/\\s*DOT\\s*$/i, '').trim();\n const dot = parseFloat(cleaned);\n\n if (isNaN(dot)) {\n throw new Error(`Invalid DOT amount: ${dotString}`);\n }\n\n return dotToPlanck(dot);\n}\n","/**\n * Solana Chain Helpers\n *\n * Utility functions for working with Solana.\n */\n\n/**\n * Lamports per SOL (10^9)\n */\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\n\n/**\n * Base58 characters used in Solana addresses\n */\nconst BASE58_CHARS = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Validate a Solana public key / address.\n *\n * Solana addresses are base58-encoded 32-byte public keys,\n * resulting in 32-44 character strings.\n *\n * @param publicKey - The public key to validate\n * @returns True if the public key appears to be valid\n *\n * @example\n * ```typescript\n * validateSolanaPublicKey('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');\n * // true\n * ```\n */\nexport function validateSolanaPublicKey(publicKey: string): boolean {\n if (!publicKey || typeof publicKey !== 'string') {\n return false;\n }\n\n // Solana public keys are 32-44 characters in base58\n if (publicKey.length < 32 || publicKey.length > 44) {\n return false;\n }\n\n // Check that all characters are valid base58\n for (const char of publicKey) {\n if (!BASE58_CHARS.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Format a Solana address (truncate for display).\n *\n * @param address - Full Solana address\n * @param prefixLength - Number of characters to show at start (default 4)\n * @param suffixLength - Number of characters to show at end (default 4)\n * @returns Truncated address like \"9WzD...AWWM\"\n *\n * @example\n * ```typescript\n * formatSolanaAddress('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');\n * // '9WzD...AWWM'\n * ```\n */\nexport function formatSolanaAddress(address: string, prefixLength = 4, suffixLength = 4): string {\n if (!address || address.length <= prefixLength + suffixLength) {\n return address;\n }\n\n return `${address.slice(0, prefixLength)}...${address.slice(-suffixLength)}`;\n}\n\n/**\n * Convert SOL to Lamports (smallest unit).\n *\n * @param sol - Amount in SOL\n * @returns Amount in Lamports (bigint)\n *\n * @example\n * ```typescript\n * solToLamports(1.5);\n * // 1500000000n (1.5 billion lamports)\n * ```\n */\nexport function solToLamports(sol: number): bigint {\n if (sol < 0) {\n throw new Error('SOL amount cannot be negative');\n }\n\n // Handle decimal precision (9 decimals for SOL)\n const [whole, decimal = ''] = sol.toString().split('.');\n const paddedDecimal = decimal.padEnd(9, '0').slice(0, 9);\n\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedDecimal);\n}\n\n/**\n * Convert Lamports to SOL.\n *\n * @param lamports - Amount in Lamports\n * @returns Amount in SOL as a number\n *\n * @example\n * ```typescript\n * lamportsToSol(1500000000n);\n * // 1.5\n * ```\n */\nexport function lamportsToSol(lamports: bigint): number {\n if (lamports < 0n) {\n throw new Error('Lamports amount cannot be negative');\n }\n\n const whole = lamports / LAMPORTS_PER_SOL;\n const remainder = lamports % LAMPORTS_PER_SOL;\n\n // Convert to number with decimal\n return Number(whole) + Number(remainder) / Number(LAMPORTS_PER_SOL);\n}\n\n/**\n * Format Lamports amount as SOL string with specified decimals.\n *\n * @param lamports - Amount in Lamports\n * @param decimals - Number of decimal places to show (default 4)\n * @returns Formatted SOL string\n *\n * @example\n * ```typescript\n * formatSol(1500000000n, 2);\n * // '1.50 SOL'\n * ```\n */\nexport function formatSol(lamports: bigint, decimals = 4): string {\n const sol = lamportsToSol(lamports);\n return `${sol.toFixed(decimals)} SOL`;\n}\n\n/**\n * Parse a SOL amount string to Lamports.\n *\n * @param solString - Amount as string (e.g., \"1.5\" or \"1.5 SOL\")\n * @returns Amount in Lamports\n *\n * @example\n * ```typescript\n * parseSolString('1.5 SOL');\n * // 1500000000n\n * ```\n */\nexport function parseSolString(solString: string): bigint {\n // Remove 'SOL' suffix and whitespace\n const cleaned = solString.replace(/\\s*SOL\\s*$/i, '').trim();\n const sol = parseFloat(cleaned);\n\n if (isNaN(sol)) {\n throw new Error(`Invalid SOL amount: ${solString}`);\n }\n\n return solToLamports(sol);\n}\n\n/**\n * Check if a string looks like a Solana transaction signature.\n *\n * Solana transaction signatures are 88 characters in base58.\n *\n * @param signature - The signature to validate\n * @returns True if it appears to be a valid transaction signature\n *\n * @example\n * ```typescript\n * isTransactionSignature('5UfDuX7yXY...');\n * // true\n * ```\n */\nexport function isTransactionSignature(signature: string): boolean {\n if (!signature || typeof signature !== 'string') {\n return false;\n }\n\n // Transaction signatures are typically 87-88 characters\n if (signature.length < 87 || signature.length > 88) {\n return false;\n }\n\n // Check that all characters are valid base58\n for (const char of signature) {\n if (!BASE58_CHARS.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Stellar-specific helper functions\n */\n\n/**\n * Validate Stellar address format (G... public key, 56 characters, base32)\n */\nexport function validateStellarAddress(address: string): boolean {\n if (!address || address.length !== 56 || !address.startsWith('G')) {\n return false;\n }\n // Stellar public keys are base32 encoded (uppercase A-Z, 2-7)\n return /^G[A-Z2-7]{55}$/.test(address);\n}\n\n/**\n * Convert stroops to XLM (1 XLM = 10,000,000 stroops)\n */\nexport function stroopsToXlm(stroops: string | number): string {\n const amount = typeof stroops === 'string' ? parseInt(stroops, 10) : stroops;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid stroops amount: ${stroops}`);\n }\n return (amount / 10_000_000).toString();\n}\n\n/**\n * Convert XLM to stroops (1 XLM = 10,000,000 stroops)\n */\nexport function xlmToStroops(xlm: string | number): string {\n const amount = typeof xlm === 'string' ? parseFloat(xlm) : xlm;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid XLM amount: ${xlm}`);\n }\n return (amount * 10_000_000).toFixed(0);\n}\n","/**\n * Bitcoin-specific helper functions\n */\n\n/**\n * Validate Bitcoin address format.\n * Supports P2PKH (1...), P2SH (3...), and Bech32 (bc1...) addresses.\n */\nexport function validateBitcoinAddress(address: string): boolean {\n if (!address) return false;\n\n // P2PKH addresses: start with '1', 25-34 characters, base58\n const p2pkh = /^1[1-9A-HJ-NP-Za-km-z]{24,33}$/;\n\n // P2SH addresses: start with '3', 25-34 characters, base58\n const p2sh = /^3[1-9A-HJ-NP-Za-km-z]{24,33}$/;\n\n // Bech32 addresses: start with 'bc1', 42 or 62 characters, lowercase alphanumeric\n const bech32 = /^bc1[a-z0-9]{38,58}$/;\n\n return p2pkh.test(address) || p2sh.test(address) || bech32.test(address);\n}\n\n/**\n * Convert satoshis to BTC (1 BTC = 100,000,000 satoshis)\n */\nexport function satoshisToBtc(satoshis: string | number): string {\n const amount = typeof satoshis === 'string' ? parseInt(satoshis, 10) : satoshis;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid satoshis amount: ${satoshis}`);\n }\n return (amount / 100_000_000).toString();\n}\n\n/**\n * Convert BTC to satoshis (1 BTC = 100,000,000 satoshis)\n */\nexport function btcToSatoshis(btc: string | number): string {\n const amount = typeof btc === 'string' ? parseFloat(btc) : btc;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid BTC amount: ${btc}`);\n }\n return (amount * 100_000_000).toFixed(0);\n}\n","/**\n * BaaS Client Module\n *\n * Backend-as-a-Service client for Smart Engines SDK.\n * Provides authentication, database, storage, functions, messaging,\n * deployment, and agent management services.\n *\n * @example\n * ```typescript\n * import { BaasClient } from '@hsuite/smart-engines-sdk';\n *\n * const baas = new BaasClient({\n * hostUrl: 'https://host.smartengines.io',\n * appId: 'my-app',\n * });\n *\n * await baas.authenticate({ chain: 'hedera', walletAddress: '0.0.12345', publicKey: '...', signFn: (msg) => wallet.sign(msg) });\n *\n * // Sub-clients\n * await baas.db.insert('users', { name: 'Alice' });\n * await baas.storage.upload(file, 'doc.pdf');\n * await baas.messaging.publish('events', { type: 'created' });\n * await baas.functions.invoke('process-order', { orderId: '123' });\n * // Deployment uses the four-step init → push → optional uploadFrontend → deploy flow:\n * const init = await baas.deployment.init({ name: 'my-app', port: 3000, services: ['database'] });\n * // ... docker push <init.registry.server>/<init.registry.repository>:v1 ...\n * await baas.deployment.deploy(init.appId, { tag: 'v1', replicas: 1 });\n * await baas.agents.register({ name: 'Bot', capabilities: ['trade'], rules: {} });\n * ```\n */\n\n// Client\nexport { BaasClient, BaasError, type AuthenticateOptions } from './client';\n\n// Sub-clients\nexport { DatabaseClient } from './database';\nexport type { StateRootResponse, DocumentProofResponse, StateTransitionsResponse, DatabaseStatsResponse } from './database';\nexport { StorageClient } from './storage';\nexport { FunctionsClient } from './functions';\nexport { MessagingClient } from './messaging';\nexport { DeploymentClient } from './deployment';\nexport { AgentsClient, validateAgentRules } from './agents';\nexport type {\n AgentStatus,\n AgentRegisterRequest,\n AgentRules,\n AgentRulesValidationResult,\n AgentInfo,\n AgentEvent,\n AgentBalance,\n AgentOperation,\n AgentFundRequest,\n AgentTradeRequest,\n AgentWithdrawRequest,\n} from './agents';\n\n// Types - export all\nexport * from './types';\n","/**\n * Database Sub-Client\n *\n * Trustless database with state proofs and Merkle verification.\n *\n * @example\n * ```typescript\n * // CRUD operations\n * const result = await baas.db.insert('users', { name: 'Alice' });\n * const users = await baas.db.find('users', { name: 'Alice' });\n *\n * // State proofs\n * const root = await baas.db.getStateRoot();\n * const proof = await baas.db.getDocumentProof('doc-123');\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasInsertResult,\n BaasUpdateResult,\n BaasDeleteResult,\n BaasFindResult,\n BaasQueryOptions,\n BaasMerkleProof,\n BaasStateTransition,\n} from '../types';\n\n/** State root response */\nexport type StateRootResponse = {\n appId: string;\n stateRoot: string;\n blockHeight: number;\n timestamp: string;\n};\n\n/** Document proof response */\nexport type DocumentProofResponse = {\n documentId: string;\n exists: boolean;\n proof: BaasMerkleProof;\n stateRoot: string;\n};\n\n/** State transitions response */\nexport type StateTransitionsResponse = {\n transitions: BaasStateTransition[];\n total: number;\n fromBlock: number;\n toBlock: number;\n};\n\n/** Database stats response */\nexport type DatabaseStatsResponse = {\n collections: number;\n documents: number;\n storageSize: number;\n stateRoot: string;\n blockHeight: number;\n};\n\nexport class DatabaseClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Insert a document into a collection\n */\n async insert(collection: string, document: Record<string, unknown>): Promise<BaasInsertResult> {\n const appId = this.getAppId();\n return this.http.post(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}`,\n document\n );\n }\n\n /**\n * Find documents in a collection\n */\n async find(\n collection: string,\n query?: Record<string, unknown>,\n options?: BaasQueryOptions\n ): Promise<BaasFindResult> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (query && Object.keys(query).length > 0) {\n params.set('query', JSON.stringify(query));\n }\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.skip !== undefined) params.set('skip', String(options.skip));\n if (options?.sort) params.set('sort', options.sort);\n const qs = params.toString();\n return this.http.get(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Update a document in a collection\n */\n async update(\n collection: string,\n documentId: string,\n updates: Record<string, unknown>\n ): Promise<BaasUpdateResult> {\n const appId = this.getAppId();\n return this.http.put(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}/${encodeURIComponent(documentId)}`,\n updates\n );\n }\n\n /**\n * Delete a document from a collection\n */\n async delete(collection: string, documentId: string): Promise<BaasDeleteResult> {\n const appId = this.getAppId();\n return this.http.delete(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}/${encodeURIComponent(documentId)}`\n );\n }\n\n /**\n * List collections for the app\n */\n async listCollections(): Promise<{ collections: string[] }> {\n const appId = this.getAppId();\n return this.http.get(`/api/db/${encodeURIComponent(appId)}`);\n }\n\n // ========== State Proofs ==========\n\n /**\n * Get the current state root for the app\n */\n async getStateRoot(): Promise<StateRootResponse> {\n const appId = this.getAppId();\n return this.http.get(`/api/db/${encodeURIComponent(appId)}/state/root`);\n }\n\n /**\n * Get a Merkle proof for a specific document\n */\n async getDocumentProof(documentId: string): Promise<DocumentProofResponse> {\n const appId = this.getAppId();\n return this.http.get(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(documentId)}/proof`\n );\n }\n\n /**\n * Get state transitions (audit log)\n */\n async getStateTransitions(options?: {\n fromBlock?: number;\n toBlock?: number;\n limit?: number;\n }): Promise<StateTransitionsResponse> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (options?.fromBlock !== undefined) params.set('fromBlock', String(options.fromBlock));\n if (options?.toBlock !== undefined) params.set('toBlock', String(options.toBlock));\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n const qs = params.toString();\n return this.http.get(\n `/api/db/${encodeURIComponent(appId)}/state/transitions${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Get database statistics\n */\n async getDbStats(): Promise<DatabaseStatsResponse> {\n const appId = this.getAppId();\n return this.http.get(`/api/db/${encodeURIComponent(appId)}/stats`);\n }\n}\n","/**\n * Storage Sub-Client\n *\n * Manages decentralized file storage on the host.\n *\n * @example\n * ```typescript\n * const result = await baas.storage.upload(fileBuffer, 'report.pdf');\n * const exists = await baas.storage.exists(result.cid);\n * const file = await baas.storage.download(result.cid);\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasUploadResult,\n BaasFileInfo,\n BaasFileMetadata,\n BaasStorageUsage,\n} from '../types';\n\nexport class StorageClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Upload a file to storage\n */\n async upload(\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>\n ): Promise<BaasUploadResult> {\n const appId = this.getAppId();\n return this.http.upload(`/api/storage/${encodeURIComponent(appId)}/upload`, file, filename, metadata);\n }\n\n /**\n * Download a file by CID\n */\n async download(cid: string): Promise<any> {\n return this.http.get(`/api/storage/download/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get file metadata\n */\n async getMetadata(cid: string): Promise<BaasFileMetadata> {\n return this.http.get(`/api/storage/metadata/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Delete a file\n */\n async delete(cid: string): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.delete(`/api/storage/${encodeURIComponent(appId)}/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get file info\n */\n async getFile(cid: string): Promise<BaasFileInfo> {\n const appId = this.getAppId();\n return this.http.get(`/api/storage/${encodeURIComponent(appId)}/${encodeURIComponent(cid)}`);\n }\n\n /**\n * List all files for the app\n */\n async listFiles(pagination?: { limit?: number; skip?: number }): Promise<{ files: BaasFileInfo[]; total: number }> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (pagination?.limit !== undefined) params.set('limit', String(pagination.limit));\n if (pagination?.skip !== undefined) params.set('skip', String(pagination.skip));\n const qs = params.toString();\n return this.http.get(`/api/storage/${encodeURIComponent(appId)}/files${qs ? `?${qs}` : ''}`);\n }\n\n /**\n * Get storage usage for the current app\n */\n async getUsage(): Promise<BaasStorageUsage> {\n return this.http.get('/api/storage/usage');\n }\n\n /**\n * Check if a file exists\n */\n async exists(cid: string): Promise<{ exists: boolean; cid: string }> {\n return this.http.get(`/api/storage/exists/${encodeURIComponent(cid)}`);\n }\n}\n","/**\n * Functions Sub-Client\n *\n * Manages serverless function deployment, invocation, and monitoring.\n *\n * @example\n * ```typescript\n * // Deploy a function\n * const fn = await baas.functions.deploy({\n * name: 'process-order',\n * runtime: 'nodejs18',\n * handler: 'index.handler',\n * code: functionCode,\n * });\n *\n * // Invoke it\n * const result = await baas.functions.invoke(fn.functionId, { orderId: '123' });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasFunctionDeployRequest,\n BaasFunctionDeployResult,\n BaasFunctionResult,\n BaasFunctionInfo,\n BaasFunctionLog,\n BaasFunctionLogOptions,\n} from '../types';\n\nexport class FunctionsClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Deploy a new function\n */\n async deploy(request: BaasFunctionDeployRequest): Promise<BaasFunctionDeployResult> {\n const appId = this.getAppId();\n return this.http.post(`/api/functions/${encodeURIComponent(appId)}`, request);\n }\n\n /**\n * Invoke a function\n */\n async invoke(functionId: string, payload?: unknown): Promise<BaasFunctionResult> {\n return this.http.post(`/api/functions/${encodeURIComponent(functionId)}/invoke`, payload ?? {});\n }\n\n /**\n * List all functions\n */\n async list(): Promise<{ functions: BaasFunctionInfo[]; total: number }> {\n return this.http.get('/api/functions');\n }\n\n /**\n * Get function details\n */\n async get(functionId: string): Promise<BaasFunctionInfo> {\n return this.http.get(`/api/functions/${encodeURIComponent(functionId)}`);\n }\n\n /**\n * Update a function\n */\n async update(functionId: string, updates: Partial<BaasFunctionDeployRequest>): Promise<BaasFunctionInfo> {\n return this.http.put(`/api/functions/${encodeURIComponent(functionId)}`, updates);\n }\n\n /**\n * Delete a function\n */\n async delete(functionId: string): Promise<{ success: boolean }> {\n return this.http.delete(`/api/functions/${encodeURIComponent(functionId)}`);\n }\n\n /**\n * Get function execution logs\n */\n async getLogs(functionId: string, options?: BaasFunctionLogOptions): Promise<{ logs: BaasFunctionLog[]; total: number }> {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.startTime) params.set('startTime', options.startTime);\n if (options?.level) params.set('level', options.level);\n const qs = params.toString();\n return this.http.get(`/api/functions/${encodeURIComponent(functionId)}/logs${qs ? `?${qs}` : ''}`);\n }\n\n /**\n * Get function statistics for an app\n */\n async getStats(): Promise<any> {\n const appId = this.getAppId();\n return this.http.get(`/api/functions/${encodeURIComponent(appId)}/stats`);\n }\n}\n","/**\n * Messaging Sub-Client\n *\n * Full pub/sub messaging with channels, history, and presence.\n *\n * @example\n * ```typescript\n * // Create a channel\n * await baas.messaging.createChannel({ name: 'events', persistent: true });\n *\n * // Publish a message\n * await baas.messaging.publish('events', { type: 'order.created', orderId: '123' });\n *\n * // Get history\n * const history = await baas.messaging.getHistory('events', { limit: 50 });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasChannelConfig,\n BaasPublishResult,\n BaasPresenceMember,\n BaasPresenceInfo,\n BaasHistoryOptions,\n BaasMessage,\n} from '../types';\n\nexport class MessagingClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Create a new channel\n */\n async createChannel(config: BaasChannelConfig): Promise<BaasChannelConfig & { channelId: string }> {\n const appId = this.getAppId();\n return this.http.post(`/api/messaging/${encodeURIComponent(appId)}/channels`, config);\n }\n\n /**\n * Delete a channel\n */\n async deleteChannel(channelId: string): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.delete(`/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channelId)}`);\n }\n\n /**\n * Get a channel by ID\n */\n async getChannel(channelId: string): Promise<BaasChannelConfig & { channelId: string; messageCount: number }> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channelId)}`);\n }\n\n /**\n * List all channels for the app\n */\n async listChannels(): Promise<{ channels: Array<BaasChannelConfig & { channelId: string }>; total: number }> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/channels`);\n }\n\n /**\n * Publish a message to a channel\n */\n async publish(\n channel: string,\n message: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): Promise<BaasPublishResult> {\n const appId = this.getAppId();\n return this.http.post(\n `/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channel)}/publish`,\n { data: message, metadata }\n );\n }\n\n /**\n * Get message history for a channel\n */\n async getHistory(\n channel: string,\n options?: BaasHistoryOptions\n ): Promise<{ messages: BaasMessage[]; total: number; hasMore: boolean }> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.before) params.set('before', options.before);\n if (options?.after) params.set('after', options.after);\n const qs = params.toString();\n return this.http.get(\n `/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channel)}/history${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Set presence for a member\n */\n async setPresence(member: BaasPresenceMember): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.post(`/api/messaging/${encodeURIComponent(appId)}/presence`, member);\n }\n\n /**\n * Remove presence for a member\n */\n async removePresence(memberId: string): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.delete(`/api/messaging/${encodeURIComponent(appId)}/presence/${encodeURIComponent(memberId)}`);\n }\n\n /**\n * Get presence info for a channel\n */\n async getPresence(channel: string): Promise<BaasPresenceInfo> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/presence/${encodeURIComponent(channel)}`);\n }\n\n /**\n * Get messaging statistics\n */\n async getStats(): Promise<any> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/stats`);\n }\n}\n","/**\n * Deployment Sub-Client — runtime orchestration (spec §6.1).\n *\n * The four-step deploy flow:\n *\n * 1. `init` — server allocates appId + per-app Harbor project + ephemeral push robot creds.\n * 2. (out-of-band) — customer `docker login <registry.server>` then `docker push <registry.server>/<registry.repository>:<tag>`.\n * 3. `uploadFrontend` — (optional) tarball with the SPA bundle.\n * 4. `deploy` — server reconciles to k8s.\n *\n * @example\n * ```typescript\n * const init = await baas.deployment.init({ name: 'my-app', port: 3200, services: ['database'] });\n *\n * // Use the credentials returned in init.registry to push the backend image.\n * // init.registry.server → e.g. 'harbor-sn1.testnet.hsuite.network'\n * // init.registry.repository → e.g. 'hsuite-customers-<appId>'\n * // init.registry.username → ephemeral robot account\n * // init.registry.password → single-use secret (NOT persisted server-side)\n * //\n * // docker login <init.registry.server> -u <init.registry.username> -p <init.registry.password>\n * // docker push <init.registry.server>/<init.registry.repository>:v1\n *\n * await baas.deployment.deploy(init.appId, { tag: 'v1', replicas: 2 });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasInitRequest,\n BaasInitResponse,\n BaasDeployRequest,\n BaasDeployResponse,\n BaasUploadFrontendResponse,\n BaasRollbackRequest,\n BaasRuntimeStatus,\n BaasAppListResponse,\n DeployedAppInfo,\n} from '../types';\n\nexport class DeploymentClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Step 1 — allocate appId + receive ephemeral push credentials for\n * the cluster's per-tenant Harbor project.\n *\n * Each app gets its own Harbor project (`hsuite-customers-<appId>`)\n * isolated by Harbor's RBAC. The push robot returned in\n * `registry.{username, password}` is scoped to that project only —\n * it cannot read or write any other tenant's images.\n *\n * **Single-use secret discipline:** `registry.password` is returned\n * exactly once and is NOT persisted server-side. Store it locally\n * for the `docker push` and discard. To rotate, call `init` again\n * (issues a new robot under the same project).\n *\n * Use the credentials to `docker login` + `docker push`, then call\n * {@link deploy} with the pushed image tag.\n */\n async init(request: BaasInitRequest): Promise<BaasInitResponse> {\n return this.http.post('/api/deployment/apps/init', request);\n }\n\n /**\n * Step 3 (optional) — upload the SPA tarball.\n *\n * The tarball is content-addressed (SHA-256) and mounted read-only\n * into the customer's pod alongside the backend container. Returns\n * the hash + size so the caller can verify the upload.\n */\n async uploadFrontend(\n appId: string,\n bundle: Blob | Buffer,\n filename = 'bundle.tar.gz'\n ): Promise<BaasUploadFrontendResponse> {\n // PR-C: smart-host's `DeploymentController.uploadFrontend` uses\n // `FileInterceptor('bundle', ...)` — the multipart field name MUST\n // be `bundle`, not the SDK's default `'file'`. Override explicitly.\n return this.http.upload(\n `/api/deployment/apps/${encodeURIComponent(appId)}/frontend`,\n bundle,\n filename,\n undefined,\n 'bundle',\n );\n }\n\n /**\n * Step 4 — reconcile the runtime to k8s.\n *\n * Returns immediately with `status: 'deploying'`. Poll {@link status}\n * until `runtime.runtimeState === 'RUNNING'` for the URL to be live.\n */\n async deploy(appId: string, request: BaasDeployRequest): Promise<BaasDeployResponse> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/deploy`, request);\n }\n\n /**\n * Roll back to a previously-deployed image tag (must exist in\n * `runtime.deploymentHistory[]`).\n */\n async rollback(appId: string, request: BaasRollbackRequest): Promise<BaasDeployResponse> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/rollback`, request);\n }\n\n /**\n * Live combined lifecycle + runtime status of an app.\n */\n async status(appId: string): Promise<BaasRuntimeStatus> {\n return this.http.get(`/api/deployment/apps/${encodeURIComponent(appId)}/status`);\n }\n\n /**\n * List all deployed apps for the authenticated developer.\n */\n async list(): Promise<BaasAppListResponse> {\n return this.http.get('/api/deployment/apps');\n }\n\n /**\n * Get app details.\n */\n async get(appId: string): Promise<DeployedAppInfo> {\n return this.http.get(`/api/deployment/apps/${encodeURIComponent(appId)}`);\n }\n\n /**\n * Update app configuration. Runtime effect lands in PR-H.\n */\n async update(appId: string, updates: Partial<BaasDeployRequest>): Promise<DeployedAppInfo> {\n return this.http.put(`/api/deployment/apps/${encodeURIComponent(appId)}`, updates);\n }\n\n /**\n * Delete an app. Runtime effect (namespace teardown) lands in PR-H.\n */\n async delete(appId: string): Promise<{ success: boolean }> {\n return this.http.delete(`/api/deployment/apps/${encodeURIComponent(appId)}`);\n }\n\n /**\n * Suspend an app. Runtime effect (scale to zero) lands in PR-H.\n */\n async suspend(appId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/suspend`, {});\n }\n\n /**\n * Resume a suspended app. Runtime effect (scale back up) lands in PR-H.\n */\n async resume(appId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/resume`, {});\n }\n\n /**\n * Get deployment statistics.\n */\n async getStats(): Promise<{\n totalApps: number;\n activeApps: number;\n totalOwners: number;\n }> {\n return this.http.get('/api/deployment/stats');\n }\n}\n","/**\n * Agents Types\n *\n * Types for smart agent management on the host.\n */\n\n/** Agent status */\nexport type AgentStatus = 'active' | 'paused' | 'revoked' | 'pending';\n\n/** Agent registration request */\nexport type AgentRegisterRequest = {\n name: string;\n description?: string;\n capabilities: string[];\n rules: AgentRules;\n fundingConfig?: {\n chain: string;\n maxAmount: string;\n autoFund: boolean;\n };\n};\n\n/**\n * Agent rules configuration.\n *\n * Rules govern what an autonomous agent is permitted to do.\n * All monetary values are decimal strings (e.g. `\"1000.50\"`) to avoid\n * floating-point precision issues across chains.\n *\n * @example\n * ```typescript\n * const rules: AgentRules = {\n * maxTradeAmount: '500',\n * allowedPairs: ['HBAR/USDC', 'XRP/USDC'],\n * allowedChains: ['hedera', 'xrpl'],\n * dailyLimit: '5000',\n * requireApprovalAbove: '1000',\n * };\n * ```\n */\nexport type AgentRules = {\n /** Maximum amount for a single trade (positive decimal string). */\n maxTradeAmount?: string;\n /** Trading pairs the agent may operate on (e.g. `['HBAR/USDC']`). */\n allowedPairs?: string[];\n /**\n * Chains the agent may operate on.\n * Valid values: `'hedera'`, `'xrpl'`, `'polkadot'`, `'solana'`, `'stellar'`,\n * `'ethereum'`, `'polygon'`, `'bitcoin'`.\n */\n allowedChains?: string[];\n /** Maximum total trade volume per 24-hour rolling window (positive decimal string). */\n dailyLimit?: string;\n /** Trades above this amount require manual owner approval (positive decimal string). */\n requireApprovalAbove?: string;\n /** Application-specific custom rules. */\n customRules?: Record<string, unknown>;\n};\n\n/**\n * Chains recognised by the platform for agent rule validation.\n */\nconst VALID_CHAIN_NAMES: ReadonlySet<string> = new Set([\n 'hedera',\n 'xrpl',\n 'polkadot',\n 'solana',\n 'stellar',\n 'ethereum',\n 'polygon',\n 'bitcoin',\n]);\n\n/**\n * Result of {@link validateAgentRules}.\n */\nexport type AgentRulesValidationResult = {\n /** `true` when no errors were found. */\n valid: boolean;\n /** Human-readable error messages (empty when valid). */\n errors: string[];\n};\n\n/**\n * Validate an {@link AgentRules} object before sending it to the API.\n *\n * Checks:\n * - `maxTradeAmount` — must be a positive decimal string when present.\n * - `allowedPairs` — must be an array of non-empty strings when present.\n * - `allowedChains` — must be an array of recognised chain names when present.\n * - `dailyLimit` — must be a positive decimal string when present.\n * - `requireApprovalAbove` — must be a positive decimal string when present.\n *\n * @example\n * ```typescript\n * import { validateAgentRules } from '@hsuite/smart-engines-sdk';\n *\n * const { valid, errors } = validateAgentRules({\n * maxTradeAmount: '-10',\n * allowedChains: ['hedera', 'foochain'],\n * });\n * // valid === false\n * // errors === [\n * // 'maxTradeAmount must be a positive decimal string',\n * // 'allowedChains contains invalid chain name: foochain',\n * // ]\n * ```\n */\nexport function validateAgentRules(rules: AgentRules): AgentRulesValidationResult {\n const errors: string[] = [];\n\n if (rules.maxTradeAmount !== undefined) {\n if (!isPositiveDecimalString(rules.maxTradeAmount)) {\n errors.push('maxTradeAmount must be a positive decimal string');\n }\n }\n\n if (rules.allowedPairs !== undefined) {\n if (!Array.isArray(rules.allowedPairs)) {\n errors.push('allowedPairs must be an array of strings');\n } else {\n for (const pair of rules.allowedPairs) {\n if (typeof pair !== 'string' || pair.trim().length === 0) {\n errors.push('allowedPairs contains an empty or non-string entry');\n break;\n }\n }\n }\n }\n\n if (rules.allowedChains !== undefined) {\n if (!Array.isArray(rules.allowedChains)) {\n errors.push('allowedChains must be an array of strings');\n } else {\n for (const chain of rules.allowedChains) {\n if (!VALID_CHAIN_NAMES.has(chain)) {\n errors.push(`allowedChains contains invalid chain name: ${chain}`);\n }\n }\n }\n }\n\n if (rules.dailyLimit !== undefined) {\n if (!isPositiveDecimalString(rules.dailyLimit)) {\n errors.push('dailyLimit must be a positive decimal string');\n }\n }\n\n if (rules.requireApprovalAbove !== undefined) {\n if (!isPositiveDecimalString(rules.requireApprovalAbove)) {\n errors.push('requireApprovalAbove must be a positive decimal string');\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/** @internal */\nfunction isPositiveDecimalString(value: unknown): boolean {\n if (typeof value !== 'string') return false;\n const num = Number(value);\n return !Number.isNaN(num) && num > 0;\n}\n\n/** Agent info */\nexport type AgentInfo = {\n agentId: string;\n name: string;\n description?: string;\n status: AgentStatus;\n capabilities: string[];\n rules: AgentRules;\n owner: string;\n createdAt: string;\n lastActiveAt?: string;\n};\n\n/** Agent event */\nexport type AgentEvent = {\n eventId: string;\n agentId: string;\n type: string;\n data: Record<string, unknown>;\n timestamp: string;\n};\n\n/** Agent balance info */\nexport type AgentBalance = {\n chain: string;\n accountId: string;\n balance: string;\n symbol: string;\n};\n\n/** Agent operation for approval/rejection */\nexport type AgentOperation = {\n operationId: string;\n agentId: string;\n type: string;\n amount: string;\n chain: string;\n status: 'pending' | 'approved' | 'rejected';\n createdAt: string;\n};\n\n/** Fund request */\nexport type AgentFundRequest = {\n chain: string;\n amount: string;\n source?: string;\n};\n\n/** Trade request */\nexport type AgentTradeRequest = {\n chain: string;\n pair: string;\n side: 'buy' | 'sell';\n amount: string;\n price?: string;\n};\n\n/** Withdraw request */\nexport type AgentWithdrawRequest = {\n chain: string;\n amount: string;\n destination: string;\n};\n","/**\n * Agents Sub-Client\n *\n * Manages autonomous smart agents on the host platform.\n *\n * @example\n * ```typescript\n * // Register an agent\n * const agent = await baas.agents.register({\n * name: 'Trading Bot',\n * capabilities: ['trade', 'withdraw'],\n * rules: { maxTradeAmount: '1000', allowedPairs: ['HBAR/USDC'] },\n * });\n *\n * // Fund and trade\n * await baas.agents.fund(agent.agentId, { chain: 'hedera', amount: '500' });\n * await baas.agents.trade(agent.agentId, { chain: 'hedera', pair: 'HBAR/USDC', side: 'buy', amount: '100' });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n AgentRegisterRequest,\n AgentInfo,\n AgentRules,\n AgentEvent,\n AgentBalance,\n AgentFundRequest,\n AgentTradeRequest,\n AgentWithdrawRequest,\n} from './types';\n\nexport * from './types';\nexport { validateAgentRules } from './types';\n\nexport class AgentsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Register a new agent */\n async register(request: AgentRegisterRequest): Promise<AgentInfo> {\n return this.http.post('/api/agents/register', request);\n }\n\n /** Get agent details */\n async get(agentId: string): Promise<AgentInfo> {\n return this.http.get(`/api/agents/${encodeURIComponent(agentId)}`);\n }\n\n /** List all agents */\n async list(): Promise<{ agents: AgentInfo[]; total: number }> {\n return this.http.get('/api/agents');\n }\n\n /** Fund an agent */\n async fund(agentId: string, request: AgentFundRequest): Promise<{ success: boolean; txId?: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/fund`, request);\n }\n\n /** Execute a trade */\n async trade(agentId: string, request: AgentTradeRequest): Promise<{ success: boolean; txId?: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/trade`, request);\n }\n\n /** Withdraw funds from agent */\n async withdraw(agentId: string, request: AgentWithdrawRequest): Promise<{ success: boolean; txId?: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/withdraw`, request);\n }\n\n /** Pause an agent */\n async pause(agentId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/pause`, {});\n }\n\n /** Resume a paused agent */\n async resume(agentId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/resume`, {});\n }\n\n /** Revoke an agent (permanent) */\n async revoke(agentId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/revoke`, {});\n }\n\n /** Update agent rules */\n async updateRules(agentId: string, rules: Partial<AgentRules>): Promise<AgentInfo> {\n return this.http.put(`/api/agents/${encodeURIComponent(agentId)}/rules`, rules);\n }\n\n /** Get agent events */\n async getEvents(agentId: string): Promise<{ events: AgentEvent[]; total: number }> {\n return this.http.get(`/api/agents/${encodeURIComponent(agentId)}/events`);\n }\n\n /** Get agent balances across chains */\n async getBalances(agentId: string): Promise<{ balances: AgentBalance[] }> {\n return this.http.get(`/api/agents/${encodeURIComponent(agentId)}/balances`);\n }\n\n /** Approve a pending agent operation */\n async approve(agentId: string, operationId: string): Promise<{ success: boolean }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/approve/${encodeURIComponent(operationId)}`, {});\n }\n\n /** Reject a pending agent operation */\n async reject(agentId: string, operationId: string): Promise<{ success: boolean }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/reject/${encodeURIComponent(operationId)}`, {});\n }\n}\n","/**\n * Customer-Session Sub-Client (TokenGate Face B).\n *\n * Wraps the smart-host's customer→smart-app session bridge:\n * POST /api/customer-session/challenge (public)\n * POST /api/customer-session/verify (public)\n * GET /api/customer-session/validate (Bearer)\n * POST /api/customer-session/end (Bearer)\n *\n * Spec: docs/superpowers/specs/2026-05-06-cross-chain-session-bridging-design.md §D1.\n *\n * Used by smart-apps to authenticate their customers without API keys: the\n * customer signs a chain-X challenge with their wallet, the host verifies the\n * signature against the chosen chain (and optionally a TokenGate NFT for\n * paid tiers), and returns a short-lived JWT (≤15 min by default).\n *\n * Free_testnet smart-apps gracefully skip the NFT step — customers only need\n * to prove wallet ownership via signature.\n */\n\nexport type CustomerSessionChallenge = {\n challenge: string;\n};\n\nexport type CustomerSessionVerifyRequest = {\n appId: string;\n chain: string;\n address: string;\n /** Public key (chain-dependent, e.g. ED25519 for Hedera, secp256k1 for XRPL). */\n publicKey?: string;\n signature: string;\n challenge: string;\n};\n\nexport type CustomerSessionToken = {\n /** Short-lived JWT to attach as `Authorization: Bearer ...` on subsequent calls. */\n token: string;\n sessionId: string;\n validatorId: string;\n expiresAt: string;\n sessionSecret: string;\n};\n\nexport type CustomerSessionInfo = {\n sessionId: string;\n appId: string;\n customerChain: string;\n customerAddress: string;\n /** Optional — present only when the customer holds a TokenGate-recognised NFT. */\n subscriptionContext?: {\n nftSerial: number;\n tier: 'free_testnet' | 'starter' | 'professional' | 'enterprise';\n expiresAt: string;\n allowedAutomations?: string[];\n };\n createdAt: string;\n expiresAt: string;\n lastActivityAt: string;\n};\n\nexport class CustomerSessionClient {\n constructor(\n private readonly baseUrl: string,\n private readonly timeoutMs: number = 30_000,\n ) {}\n\n /**\n * Step 1: ask the host to issue a fresh challenge for the customer to sign.\n */\n async challenge(input: { chain: string; address: string }): Promise<CustomerSessionChallenge> {\n return this.fetch<CustomerSessionChallenge>('POST', '/api/customer-session/challenge', input);\n }\n\n /**\n * Step 2: submit the customer's signed challenge. On success returns a\n * short-lived bearer JWT scoped to {appId, chain, address}.\n */\n async verify(req: CustomerSessionVerifyRequest): Promise<CustomerSessionToken> {\n return this.fetch<CustomerSessionToken>('POST', '/api/customer-session/verify', req);\n }\n\n /**\n * Validate a customer bearer + return the decoded session info. Used by\n * smart-app backends to authorise incoming customer requests.\n */\n async validate(bearer: string): Promise<CustomerSessionInfo> {\n return this.fetch<CustomerSessionInfo>('GET', '/api/customer-session/validate', undefined, bearer);\n }\n\n /**\n * Revoke a customer session. Idempotent.\n */\n async end(bearer: string): Promise<{ revoked: boolean; sessionId: string }> {\n return this.fetch<{ revoked: boolean; sessionId: string }>(\n 'POST',\n '/api/customer-session/end',\n undefined,\n bearer,\n );\n }\n\n private async fetch<T>(\n method: 'GET' | 'POST',\n path: string,\n body?: unknown,\n bearer?: string,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (bearer) headers['Authorization'] = `Bearer ${bearer}`;\n const init: RequestInit = { method, headers, signal: controller.signal };\n if (body !== undefined) init.body = JSON.stringify(body);\n const response = await fetch(url, init);\n clearTimeout(timeoutId);\n if (!response.ok) {\n const errBody = (await response.json().catch(() => ({}))) as { message?: string };\n const err = new Error(\n errBody.message ?? `customer-session ${path} failed: ${response.status} ${response.statusText}`,\n ) as Error & { status: number };\n err.status = response.status;\n throw err;\n }\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n const e = error as Error;\n if (e.name === 'AbortError') {\n throw new Error(`customer-session ${path} timeout`);\n }\n throw error;\n }\n }\n}\n","/**\n * BaaS Client\n *\n * SDK client for interacting with Smart Engines Backend-as-a-Service.\n *\n * Provides:\n * - Wallet-based authentication (challenge-response)\n * - App registration and management\n * - Trustless database operations with state transitions and Merkle proofs\n * - Decentralized file storage\n * - Serverless function deployment and invocation\n * - Real-time pub/sub messaging with channels, history, and presence\n * - App deployment lifecycle management\n * - Autonomous smart agent management\n *\n * @example\n * ```typescript\n * import { BaasClient } from '@hsuite/smart-engines-sdk';\n *\n * const baas = new BaasClient({\n * hostUrl: 'https://host.smartengines.io',\n * appId: 'my-app',\n * });\n *\n * await baas.authenticate({\n * chain: 'hedera',\n * walletAddress: '0.0.12345',\n * publicKey: 'your-public-key',\n * signFn: async (message) => wallet.sign(message),\n * });\n *\n * // Database with state proofs\n * const result = await baas.db.insert('users', { name: 'Alice' });\n * const proof = await baas.db.getDocumentProof(result.document._id);\n *\n * // File storage\n * const upload = await baas.storage.upload(fileBuffer, 'document.pdf');\n *\n * // Messaging\n * await baas.messaging.publish('events', { type: 'user.created' });\n *\n * // Functions\n * const fn = await baas.functions.deploy({ name: 'handler', runtime: 'nodejs20', code: '...', codeType: 'inline' });\n *\n * // Agents\n * const agent = await baas.agents.register({ name: 'Bot', capabilities: ['trade'], rules: {} });\n * ```\n */\n\nimport type {\n BaasClientConfig,\n BaasSupportedChain,\n BaasChallengeResponse,\n BaasAuthResult,\n BaasSessionInfo,\n BaasErrorDetails,\n} from './types';\nimport { type CircuitBreakerSnapshot } from '../_vendor';\nimport { createHttpClient, type HttpClient } from '../http';\nimport { DatabaseClient } from './database';\nimport { StorageClient } from './storage';\nimport { FunctionsClient } from './functions';\nimport { MessagingClient } from './messaging';\nimport { DeploymentClient } from './deployment';\nimport { AgentsClient } from './agents';\nimport { CustomerSessionClient } from './customer-session';\n\n/**\n * Authentication options for wallet-based auth\n */\nexport type AuthenticateOptions = {\n /** Blockchain chain */\n chain: BaasSupportedChain;\n /** Wallet address on the chain */\n walletAddress: string;\n /** Public key (hex encoded) */\n publicKey: string;\n /** Function to sign the challenge message */\n signFn: (message: string) => string | Promise<string>;\n};\n\n/**\n * BaaS Client\n *\n * Full-featured client for Smart Engines Backend-as-a-Service platform.\n * All BaaS services are accessible via typed sub-clients.\n */\nexport class BaasClient {\n private readonly hostUrl: string;\n private readonly pathPrefix: string;\n private appId: string | undefined;\n private readonly timeout: number;\n private readonly allowInsecure: boolean;\n private authToken: string | null = null;\n private readonly http: HttpClient;\n /** Last HTTP error (for getHttpHealth) */\n private lastHttpError?: Error;\n\n // ========== Sub-Clients ==========\n\n /** Trustless database with state proofs and Merkle verification */\n public readonly db: DatabaseClient;\n /** Decentralized file storage */\n public readonly storage: StorageClient;\n /** Serverless function deployment and invocation */\n public readonly functions: FunctionsClient;\n /** Real-time pub/sub messaging with channels, history, and presence */\n public readonly messaging: MessagingClient;\n /** App deployment lifecycle management */\n public readonly deployment: DeploymentClient;\n /** Autonomous smart agent management */\n public readonly agents: AgentsClient;\n /** Customer→smart-app session bridge (TokenGate Face B). */\n public readonly customerSession: CustomerSessionClient;\n\n constructor(config: BaasClientConfig) {\n this.allowInsecure = config.allowInsecure ?? false;\n this.hostUrl = validateUrl(config.hostUrl, this.allowInsecure);\n this.appId = config.appId;\n this.timeout = config.timeout ?? 30000;\n // Note: config.http is accepted for backward compatibility and future resilience layer integration\n\n // Strip trailing slash from pathPrefix and ensure leading slash; empty if none.\n const prefix = (config.pathPrefix ?? '').replace(/\\/$/, '');\n this.pathPrefix = prefix ? (prefix.startsWith('/') ? prefix : `/${prefix}`) : '';\n const baseUrlWithPrefix = this.pathPrefix\n ? this.hostUrl.replace(/\\/$/, '') + this.pathPrefix\n : this.hostUrl;\n\n // Create shared HTTP client. baseUrl includes optional pathPrefix so all\n // /api/* paths get routed to the host even when consumed via a gateway.\n this.http = createHttpClient({\n baseUrl: baseUrlWithPrefix,\n timeout: this.timeout,\n });\n\n // Helper to get appId with validation\n const getAppId = () => this.requireAppId();\n\n // Initialize sub-clients\n this.db = new DatabaseClient(this.http, getAppId);\n this.storage = new StorageClient(this.http, getAppId);\n this.functions = new FunctionsClient(this.http, getAppId);\n this.messaging = new MessagingClient(this.http, getAppId);\n this.deployment = new DeploymentClient(this.http);\n this.agents = new AgentsClient(this.http);\n this.customerSession = new CustomerSessionClient(baseUrlWithPrefix, this.timeout);\n }\n\n /** Set the app ID (for newly registered apps) */\n setAppId(appId: string): void {\n this.appId = appId;\n }\n\n /** Check if the client is authenticated */\n isAuthenticated(): boolean {\n return this.authToken !== null;\n }\n\n /** Get the current app ID */\n getAppId(): string | undefined {\n return this.appId;\n }\n\n /**\n * Get HTTP resilience health information\n * @returns Object with circuit breaker state and last error (if any)\n */\n getHttpHealth(): { breaker: CircuitBreakerSnapshot | null; lastError?: Error } {\n // Note: In a real implementation, we would get the circuit breaker state\n // from the resilient HTTP layer. For now, return null since the base\n // HTTP client doesn't expose it yet.\n return {\n breaker: null,\n lastError: this.lastHttpError,\n };\n }\n\n private requireAppId(): string {\n if (!this.appId) {\n throw new BaasError(\n 'App ID required. Provide appId in config (e.g. from a prior deployment.init() call).',\n 400\n );\n }\n return this.appId;\n }\n\n // ========== Authentication ==========\n\n /**\n * Authenticate with the BaaS host using wallet challenge-response\n *\n * 1. Requests a challenge message from the host\n * 2. Signs the challenge with the provided signing function\n * 3. Submits the signature for verification\n * 4. Stores the JWT token for subsequent requests\n */\n async authenticate(options: AuthenticateOptions): Promise<BaasAuthResult> {\n const { chain, walletAddress, publicKey, signFn } = options;\n\n // Step 1: Request challenge\n const challenge = await this.post<BaasChallengeResponse>('/api/auth/challenge', {\n chain,\n walletAddress,\n appId: this.appId,\n });\n\n // Step 2: Sign the challenge\n const signature = await signFn(challenge.message);\n\n // Step 3: Verify and get token\n const result = await this.post<BaasAuthResult>('/api/auth/verify', {\n challengeId: challenge.challengeId,\n signature,\n publicKey,\n });\n\n // Store token for subsequent requests\n this.authToken = result.token;\n // Update the shared HTTP client's auth token\n (this.http as any).setAuthToken?.(result.token);\n\n return result;\n }\n\n /** Validate the current session */\n async validateSession(): Promise<BaasSessionInfo> {\n this.requireAuth();\n return this.get<BaasSessionInfo>('/api/auth/session');\n }\n\n /** Destroy the current session on server and clear local token */\n async logout(): Promise<void> {\n if (this.authToken) {\n try {\n await this.post('/api/auth/logout', {});\n } catch {\n // Best effort — clear locally even if server request fails\n }\n }\n this.authToken = null;\n }\n\n // ========== HTTP Helpers ==========\n\n private requireAuth(): void {\n if (!this.authToken) {\n throw new BaasError('Authentication required. Call authenticate() first.', 401);\n }\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.authToken) {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n return headers;\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>('POST', path, body);\n }\n\n private async get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path);\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.hostUrl}${this.pathPrefix}${path}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const options: RequestInit = {\n method,\n headers: this.getHeaders(),\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as BaasErrorDetails & {\n message?: string;\n };\n throw new BaasError(\n errorData.message || `API error: ${response.status} ${response.statusText}`,\n response.status,\n errorData\n );\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof BaasError) throw error;\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new BaasError('Request timeout', 408);\n }\n throw new BaasError(`Network error: ${err.message}`, 0, { originalError: err.message });\n }\n }\n}\n\n/**\n * BaaS Error\n */\nexport class BaasError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly details?: BaasErrorDetails\n ) {\n super(message);\n this.name = 'BaasError';\n }\n}\n\nfunction validateUrl(url: string, allowInsecure = false): string {\n try {\n const parsed = new URL(url);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new BaasError(`Invalid protocol: ${parsed.protocol}`, 400);\n }\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new BaasError(\n 'HTTPS is required for secure connections. Set allowInsecure=true for local development.',\n 400\n );\n }\n return parsed.origin;\n } catch (error) {\n if (error instanceof BaasError) throw error;\n throw new BaasError(`Invalid URL: ${url}`, 400);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/@xrplf/isomorphic/src/utils/shared.ts","../../../node_modules/@xrplf/isomorphic/src/utils/index.ts","../../../node_modules/@scure/base/index.ts","../../../node_modules/@xrplf/isomorphic/src/internal/normalizeInput.ts","../../../node_modules/@xrplf/isomorphic/src/internal/wrapCryptoCreateHash.ts","../../../node_modules/@xrplf/isomorphic/src/sha256/index.ts","../../../node_modules/ripple-address-codec/src/utils.ts","../../../node_modules/ripple-address-codec/src/xrp-codec.ts","../../../node_modules/ripple-address-codec/src/index.ts","../../../node_modules/@xrplf/isomorphic/src/ripemd160/index.ts","../../../node_modules/@noble/curves/src/utils.ts","../../../node_modules/@noble/curves/src/abstract/modular.ts","../../../node_modules/@noble/curves/src/abstract/curve.ts","../../../node_modules/@noble/curves/src/abstract/weierstrass.ts","../../../node_modules/@noble/curves/src/_shortw_utils.ts","../../../node_modules/@noble/curves/src/abstract/hash-to-curve.ts","../../../node_modules/@noble/curves/src/secp256k1.ts","../../../node_modules/@xrplf/isomorphic/src/sha512/index.ts","../../../node_modules/@noble/curves/src/abstract/utils.ts","../../../node_modules/ripple-keypairs/src/utils/Sha512.ts","../../../node_modules/ripple-keypairs/src/signing-schemes/secp256k1/utils.ts","../../../node_modules/ripple-keypairs/src/utils/assert.ts","../../../node_modules/ripple-keypairs/src/utils/getAlgorithmFromKey.ts","../../../node_modules/ripple-keypairs/src/signing-schemes/secp256k1/index.ts","../../../node_modules/@noble/curves/src/abstract/edwards.ts","../../../node_modules/@noble/curves/src/abstract/montgomery.ts","../../../node_modules/@noble/curves/src/ed25519.ts","../../../node_modules/ripple-keypairs/src/signing-schemes/ed25519/index.ts","../../../node_modules/ripple-keypairs/src/index.ts","../src/_vendor/circuit-breaker.ts","../src/_vendor/rate-limiter.ts","../src/_vendor/smart-engine.error.ts","../src/_vendor/capability.error.ts","../src/_vendor/chain.schema.ts","../src/_vendor/network-types.ts","../src/_vendor/capabilities.schema.ts","../src/_vendor/account.schema.ts","../src/_vendor/sovereignty.schema.ts","../src/_vendor/transaction.schema.ts","../src/_vendor/token.schema.ts","../src/_vendor/api.schema.ts","../src/discovery/index.ts","../src/discovery/mirror-node.ts","../src/discovery/validator-discovery.ts","../src/discovery/cluster-discovery.ts","../src/auth/index.ts","../src/auth/validator-auth.ts","../src/auth/xrpl-signer.ts","../src/http/index.ts","../src/subscription/index.ts","../src/tss/index.ts","../src/ipfs/index.ts","../src/transactions/chains/hedera.ts","../src/transactions/chains/xrpl.ts","../src/transactions/chains/solana.ts","../src/transactions/chains/polkadot.ts","../src/transactions/index.ts","../src/snapshots/index.ts","../src/historical-balance/historical-balance-client.ts","../src/settlement/index.ts","../src/governance/index.ts","../src/governance/governance-client.ts","../src/personhood/index.ts","../src/personhood/personhood-client.ts","../src/baas/agents/types.ts","../src/baas/agents/index.ts","../src/baas/deployment/index.ts","../src/client.ts","../src/gateway/routing/index.ts","../src/gateway/domains/index.ts","../src/gateway/dns/index.ts","../src/gateway/client.ts","../src/http/resilient-http.ts","../src/chains/index.ts","../src/chains/hedera.ts","../src/chains/xrpl.ts","../src/chains/polkadot.ts","../src/chains/solana.ts","../src/chains/stellar.ts","../src/chains/bitcoin.ts","../src/baas/index.ts","../src/baas/database/index.ts","../src/baas/storage/index.ts","../src/baas/functions/index.ts","../src/baas/messaging/index.ts","../src/baas/customer-session/index.ts","../src/baas/client.ts","../src/pqc-verify/index.ts","../src/pqc-verify/cert-schema.ts","../src/pqc-verify/registry-fetch.ts","../src/pqc-verify/verify-pqc-attestation.ts"],"names":["bytesToHex","hexToBytes","padding","alphabet","sha256","wbits","endo","tv5","c1","c2","r","s","Prefix","p","eddsa","z2","z","Wallet","SmartEngineError","validateUrl","ml_dsa87"],"mappings":"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","file":"index.js","sourcesContent":["import { concatBytes } from '@noble/hashes/utils'\n\nexport const HEX_REGEX = /^[A-F0-9]*$/iu\n\nexport function concat(views: Uint8Array[]): Uint8Array {\n return concatBytes(...views)\n}\n\nexport function equal(buf1: Uint8Array, buf2: Uint8Array): boolean {\n if (buf1.byteLength !== buf2.byteLength) {\n return false\n }\n const dv1 = new Int8Array(buf1)\n const dv2 = new Int8Array(buf2)\n for (let i = 0; i !== buf1.byteLength; i++) {\n if (dv1[i] !== dv2[i]) {\n return false\n }\n }\n return true\n}\n","import { randomBytes as cryptoRandomBytes } from 'crypto'\nimport type { BytesToHexFn, HexToBytesFn, RandomBytesFn } from './types'\nimport { HexToStringFn, StringToHexFn } from './types'\nimport { HEX_REGEX } from './shared'\n\nconst OriginalBuffer = Symbol('OriginalBuffer')\n\n/**\n * An extended Uint8Array that incorporates a reference to the original Node.js Buffer.\n *\n * When converting a Node.js Buffer to a Uint8Array, there's an optimization that shares\n * the memory of the original Buffer with the resulting Uint8Array instead of copying data.\n * The Uint8ArrayWithReference interface is used to attach a reference to the original Buffer, ensuring\n * its persistence in memory (preventing garbage collection) as long as the Uint8Array exists.\n * This strategy upholds the ownership semantics of the slice of the ArrayBuffer.\n */\ninterface Uint8ArrayWithReference extends Uint8Array {\n [OriginalBuffer]: Buffer\n}\n\n/**\n * Converts a Node.js Buffer to a Uint8Array for uniform behavior with browser implementations.\n *\n * Choices:\n * 1. Directly returning the Buffer:\n * - Operation: Return Buffer as is (a Buffer *IS* an instanceof Uint8Array).\n * - Pros: Most memory and performance efficient.\n * - Cons: Violates strict Uint8Array typing and may lead to issues where Buffer-specific features are [ab]used.\n *\n * 2. Using `new Uint8Array(buffer)` or `Uint8Array.from(buffer)`:\n * - Operation: Copies the buffer's data into a new Uint8Array.\n * - Pros: Ensures data isolation; memory-safe.\n * - Cons: Less performant due to data duplication.\n *\n * 3. Using buf.buffer slice:\n * - Operation: Shares memory between Buffer and Uint8Array.\n * - Pros: Performant.\n * - Cons: Risks with shared memory and potential for invalid references.\n *\n * 4. Using buf.buffer slice and keeping a Buffer reference for ownership semantics:\n * - Operation: Shares memory and associates the original Buffer with the resulting Uint8Array.\n * - Pros: Performant while ensuring the original Buffer isn't garbage collected.\n * - Cons: Risks with shared memory but mitigates potential for invalid references.\n *\n * The chosen method (4) prioritizes performance by sharing memory while ensuring buffer ownership.\n *\n * @param {Buffer} buffer - The Node.js Buffer to convert.\n * @returns {Uint8Array} Resulting Uint8Array sharing the same memory as the Buffer and maintaining a reference to it.\n */\nfunction toUint8Array(buffer: Buffer): Uint8Array {\n const u8Array = new Uint8Array(\n buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n ),\n ) as Uint8ArrayWithReference\n u8Array[OriginalBuffer] = buffer\n return u8Array\n}\n\n/* eslint-disable func-style -- Typed to ensure uniformity between node and browser implementations and docs */\nexport const bytesToHex: typeof BytesToHexFn = (bytes) => {\n const buf = Buffer.from(bytes)\n return buf.toString('hex').toUpperCase()\n}\n\nexport const hexToBytes: typeof HexToBytesFn = (hex) => {\n if (!HEX_REGEX.test(hex)) {\n throw new Error('Invalid hex string')\n }\n return toUint8Array(Buffer.from(hex, 'hex'))\n}\n\nexport const randomBytes: typeof RandomBytesFn = (size) => {\n return toUint8Array(cryptoRandomBytes(size))\n}\n\nexport const hexToString: typeof HexToStringFn = (\n hex: string,\n encoding = 'utf8',\n): string => {\n if (!HEX_REGEX.test(hex)) {\n throw new Error('Invalid hex string')\n }\n return new TextDecoder(encoding).decode(hexToBytes(hex))\n}\n\nexport const stringToHex: typeof StringToHexFn = (string: string): string => {\n return bytesToHex(new TextEncoder().encode(string))\n}\n/* eslint-enable func-style */\n\nexport * from './shared'\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\n// no abytes: seems to have 10% slowdown. Why?!\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","import { Input } from './types'\n\n/**\n * Normalize a string, number array, or Uint8Array to a string or Uint8Array.\n * Both node and noble lib functions accept these types.\n *\n * @param input - value to normalize\n */\nexport default function normalizeInput(input: Input): string | Uint8Array {\n return Array.isArray(input) ? new Uint8Array(input) : input\n}\n","import { createHash } from 'crypto'\nimport { Hash, HashFn, Input } from './types'\nimport normalizeInput from './normalizeInput'\n\n/**\n * Wrap createHash from node to provide an interface that is isomorphic\n *\n * @param type - the hash name\n * @param fn - {createHash} the hash factory\n */\nexport default function wrapCryptoCreateHash(\n type: string,\n fn: typeof createHash,\n): HashFn {\n function hashFn(input: Input): Uint8Array {\n return fn(type).update(normalizeInput(input)).digest()\n }\n\n hashFn.create = (): Hash => {\n const hash = fn(type)\n return {\n update(input: Input): Hash {\n hash.update(normalizeInput(input))\n return this\n },\n digest(): Uint8Array {\n return hash.digest()\n },\n }\n }\n return hashFn\n}\n","import { createHash } from 'crypto'\nimport wrapCryptoCreateHash from '../internal/wrapCryptoCreateHash'\n\n/**\n * Wrap node's native sha256 implementation in HashFn\n */\nexport const sha256 = wrapCryptoCreateHash('sha256', createHash)\n","export type ByteArray = number[] | Uint8Array\n\n/**\n * Check whether two sequences (e.g. Arrays of numbers) are equal.\n *\n * @param arr1 - One of the arrays to compare.\n * @param arr2 - The other array to compare.\n */\nexport function arrayEqual(arr1: ByteArray, arr2: ByteArray): boolean {\n if (arr1.length !== arr2.length) {\n return false\n }\n return arr1.every((value, index) => value === arr2[index])\n}\n\n/**\n * Check whether a value is a scalar\n *\n * @param val - The value to check.\n */\nfunction isScalar(val: ByteArray | number): val is number {\n return typeof val === 'number'\n}\n\n/**\n * Concatenate all `arguments` into a single array. Each argument can be either\n * a single element or a sequence, which has a `length` property and supports\n * element retrieval via sequence[ix].\n *\n * > concatArgs(1, [2, 3], Uint8Array.from([4,5]), new Uint8Array([6, 7]));\n * [1,2,3,4,5,6,7]\n *\n * @param args - Concatenate of these args into a single array.\n * @returns Array of concatenated arguments\n */\n\nexport function concatArgs(...args: Array<number | ByteArray>): number[] {\n return args.flatMap((arg) => {\n return isScalar(arg) ? [arg] : Array.from(arg)\n })\n}\n","/**\n * Codec class\n */\n\nimport { base58xrp, BytesCoder } from '@scure/base'\nimport { sha256 } from '@xrplf/isomorphic/sha256'\n\nimport { arrayEqual, concatArgs, ByteArray } from './utils'\n\nclass Codec {\n private readonly _sha256: (bytes: ByteArray) => Uint8Array\n private readonly _codec: BytesCoder\n\n public constructor(options: { sha256: (bytes: ByteArray) => Uint8Array }) {\n this._sha256 = options.sha256\n this._codec = base58xrp\n }\n\n /**\n * Encoder.\n *\n * @param bytes - Uint8Array of data to encode.\n * @param opts - Options object including the version bytes and the expected length of the data to encode.\n */\n public encode(\n bytes: ByteArray,\n opts: {\n versions: number[]\n expectedLength: number\n },\n ): string {\n const versions = opts.versions\n return this._encodeVersioned(bytes, versions, opts.expectedLength)\n }\n\n /**\n * Decoder.\n *\n * @param base58string - Base58Check-encoded string to decode.\n * @param opts - Options object including the version byte(s) and the expected length of the data after decoding.\n */\n /* eslint-disable max-lines-per-function --\n * TODO refactor */\n public decode(\n base58string: string,\n opts: {\n versions: Array<number | number[]>\n expectedLength?: number\n versionTypes?: ['ed25519', 'secp256k1']\n },\n ): {\n version: number[]\n bytes: Uint8Array\n type: 'ed25519' | 'secp256k1' | null\n } {\n const versions = opts.versions\n const types = opts.versionTypes\n\n const withoutSum = this.decodeChecked(base58string)\n\n if (versions.length > 1 && !opts.expectedLength) {\n throw new Error(\n 'expectedLength is required because there are >= 2 possible versions',\n )\n }\n const versionLengthGuess =\n typeof versions[0] === 'number' ? 1 : versions[0].length\n const payloadLength =\n opts.expectedLength ?? withoutSum.length - versionLengthGuess\n const versionBytes = withoutSum.slice(0, -payloadLength)\n const payload = withoutSum.slice(-payloadLength)\n\n for (let i = 0; i < versions.length; i++) {\n /* eslint-disable @typescript-eslint/consistent-type-assertions --\n * TODO refactor */\n const version: number[] = Array.isArray(versions[i])\n ? (versions[i] as number[])\n : [versions[i] as number]\n if (arrayEqual(versionBytes, version)) {\n return {\n version,\n bytes: payload,\n type: types ? types[i] : null,\n }\n }\n /* eslint-enable @typescript-eslint/consistent-type-assertions */\n }\n\n throw new Error(\n 'version_invalid: version bytes do not match any of the provided version(s)',\n )\n }\n\n public encodeChecked(bytes: ByteArray): string {\n const check = this._sha256(this._sha256(bytes)).slice(0, 4)\n return this._encodeRaw(Uint8Array.from(concatArgs(bytes, check)))\n }\n\n public decodeChecked(base58string: string): Uint8Array {\n const intArray = this._decodeRaw(base58string)\n if (intArray.byteLength < 5) {\n throw new Error('invalid_input_size: decoded data must have length >= 5')\n }\n if (!this._verifyCheckSum(intArray)) {\n throw new Error('checksum_invalid')\n }\n return intArray.slice(0, -4)\n }\n\n private _encodeVersioned(\n bytes: ByteArray,\n versions: number[],\n expectedLength: number,\n ): string {\n if (!checkByteLength(bytes, expectedLength)) {\n throw new Error(\n 'unexpected_payload_length: bytes.length does not match expectedLength.' +\n ' Ensure that the bytes are a Uint8Array.',\n )\n }\n return this.encodeChecked(concatArgs(versions, bytes))\n }\n\n private _encodeRaw(bytes: ByteArray): string {\n return this._codec.encode(Uint8Array.from(bytes))\n }\n /* eslint-enable max-lines-per-function */\n\n private _decodeRaw(base58string: string): Uint8Array {\n return this._codec.decode(base58string)\n }\n\n private _verifyCheckSum(bytes: ByteArray): boolean {\n const computed = this._sha256(this._sha256(bytes.slice(0, -4))).slice(0, 4)\n const checksum = bytes.slice(-4)\n return arrayEqual(computed, checksum)\n }\n}\n\n/**\n * XRP codec\n */\n\n// base58 encodings: https://xrpl.org/base58-encodings.html\n// Account address (20 bytes)\nconst ACCOUNT_ID = 0\n// Account public key (33 bytes)\nconst ACCOUNT_PUBLIC_KEY = 0x23\n// 33; Seed value (for secret keys) (16 bytes)\nconst FAMILY_SEED = 0x21\n// 28; Validation public key (33 bytes)\nconst NODE_PUBLIC = 0x1c\n\n// [1, 225, 75]\nconst ED25519_SEED = [0x01, 0xe1, 0x4b]\n\nconst codecOptions = {\n sha256,\n}\n\nconst codecWithXrpAlphabet = new Codec(codecOptions)\n\nexport const codec = codecWithXrpAlphabet\n\n// entropy is a Uint8Array of size 16\n// type is 'ed25519' or 'secp256k1'\nexport function encodeSeed(\n entropy: ByteArray,\n type: 'ed25519' | 'secp256k1',\n): string {\n if (!checkByteLength(entropy, 16)) {\n throw new Error('entropy must have length 16')\n }\n const opts = {\n expectedLength: 16,\n\n // for secp256k1, use `FAMILY_SEED`\n versions: type === 'ed25519' ? ED25519_SEED : [FAMILY_SEED],\n }\n\n // prefixes entropy with version bytes\n return codecWithXrpAlphabet.encode(entropy, opts)\n}\n\nexport function decodeSeed(\n seed: string,\n opts: {\n versionTypes: ['ed25519', 'secp256k1']\n versions: Array<number | number[]>\n expectedLength: number\n } = {\n versionTypes: ['ed25519', 'secp256k1'],\n versions: [ED25519_SEED, FAMILY_SEED],\n expectedLength: 16,\n },\n): {\n version: number[]\n bytes: Uint8Array\n type: 'ed25519' | 'secp256k1' | null\n} {\n return codecWithXrpAlphabet.decode(seed, opts)\n}\n\nexport function encodeAccountID(bytes: ByteArray): string {\n const opts = { versions: [ACCOUNT_ID], expectedLength: 20 }\n return codecWithXrpAlphabet.encode(bytes, opts)\n}\n\n/* eslint-disable import/no-unused-modules ---\n * unclear why this is aliased but we should keep it in case someone else is\n * importing it with the aliased name */\nexport const encodeAddress = encodeAccountID\n/* eslint-enable import/no-unused-modules */\n\nexport function decodeAccountID(accountId: string): Uint8Array {\n const opts = { versions: [ACCOUNT_ID], expectedLength: 20 }\n return codecWithXrpAlphabet.decode(accountId, opts).bytes\n}\n\n/* eslint-disable import/no-unused-modules ---\n * unclear why this is aliased but we should keep it in case someone else is\n * importing it with the aliased name */\nexport const decodeAddress = decodeAccountID\n/* eslint-enable import/no-unused-modules */\n\nexport function decodeNodePublic(base58string: string): Uint8Array {\n const opts = { versions: [NODE_PUBLIC], expectedLength: 33 }\n return codecWithXrpAlphabet.decode(base58string, opts).bytes\n}\n\nexport function encodeNodePublic(bytes: ByteArray): string {\n const opts = { versions: [NODE_PUBLIC], expectedLength: 33 }\n return codecWithXrpAlphabet.encode(bytes, opts)\n}\n\nexport function encodeAccountPublic(bytes: ByteArray): string {\n const opts = { versions: [ACCOUNT_PUBLIC_KEY], expectedLength: 33 }\n return codecWithXrpAlphabet.encode(bytes, opts)\n}\n\nexport function decodeAccountPublic(base58string: string): Uint8Array {\n const opts = { versions: [ACCOUNT_PUBLIC_KEY], expectedLength: 33 }\n return codecWithXrpAlphabet.decode(base58string, opts).bytes\n}\n\nexport function isValidClassicAddress(address: string): boolean {\n try {\n decodeAccountID(address)\n } catch (_error) {\n return false\n }\n return true\n}\n\nfunction checkByteLength(bytes: ByteArray, expectedLength: number): boolean {\n return 'byteLength' in bytes\n ? bytes.byteLength === expectedLength\n : bytes.length === expectedLength\n}\n","import { concat, equal, hexToBytes } from '@xrplf/isomorphic/utils'\n\nimport {\n codec,\n encodeSeed,\n decodeSeed,\n encodeAccountID,\n decodeAccountID,\n encodeNodePublic,\n decodeNodePublic,\n encodeAccountPublic,\n decodeAccountPublic,\n isValidClassicAddress,\n} from './xrp-codec'\n\nconst PREFIX_BYTES = {\n // 5, 68\n main: Uint8Array.from([0x05, 0x44]),\n // 4, 147\n test: Uint8Array.from([0x04, 0x93]),\n}\n\nconst MAX_32_BIT_UNSIGNED_INT = 4294967295\n\nfunction classicAddressToXAddress(\n classicAddress: string,\n tag: number | false,\n test: boolean,\n): string {\n const accountId = decodeAccountID(classicAddress)\n return encodeXAddress(accountId, tag, test)\n}\n\nfunction encodeXAddress(\n accountId: Uint8Array,\n tag: number | false,\n test: boolean,\n): string {\n if (accountId.length !== 20) {\n // RIPEMD160 is 160 bits = 20 bytes\n throw new Error('Account ID must be 20 bytes')\n }\n if (tag !== false && tag > MAX_32_BIT_UNSIGNED_INT) {\n throw new Error('Invalid tag')\n }\n const theTag = tag || 0\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Passing null is a common js mistake\n const flag = tag === false || tag == null ? 0 : 1\n /* eslint-disable no-bitwise ---\n * need to use bitwise operations here */\n const bytes = concat([\n test ? PREFIX_BYTES.test : PREFIX_BYTES.main,\n accountId,\n Uint8Array.from([\n // 0x00 if no tag, 0x01 if 32-bit tag\n flag,\n // first byte\n theTag & 0xff,\n // second byte\n (theTag >> 8) & 0xff,\n // third byte\n (theTag >> 16) & 0xff,\n // fourth byte\n (theTag >> 24) & 0xff,\n 0,\n 0,\n 0,\n // four zero bytes (reserved for 64-bit tags)\n 0,\n ]),\n ])\n /* eslint-enable no-bitwise */\n return codec.encodeChecked(bytes)\n}\n\nfunction xAddressToClassicAddress(xAddress: string): {\n classicAddress: string\n tag: number | false\n test: boolean\n} {\n /* eslint-disable @typescript-eslint/naming-convention --\n * TODO 'test' should be something like 'isTest', do this later\n */\n const { accountId, tag, test } = decodeXAddress(xAddress)\n /* eslint-enable @typescript-eslint/naming-convention */\n const classicAddress = encodeAccountID(accountId)\n return {\n classicAddress,\n tag,\n test,\n }\n}\n\nfunction decodeXAddress(xAddress: string): {\n accountId: Uint8Array\n tag: number | false\n test: boolean\n} {\n const decoded = codec.decodeChecked(xAddress)\n /* eslint-disable @typescript-eslint/naming-convention --\n * TODO 'test' should be something like 'isTest', do this later\n */\n const test = isUint8ArrayForTestAddress(decoded)\n /* eslint-enable @typescript-eslint/naming-convention */\n const accountId = decoded.slice(2, 22)\n const tag = tagFromUint8Array(decoded)\n return {\n accountId,\n tag,\n test,\n }\n}\n\nfunction isUint8ArrayForTestAddress(buf: Uint8Array): boolean {\n const decodedPrefix = buf.slice(0, 2)\n if (equal(PREFIX_BYTES.main, decodedPrefix)) {\n return false\n }\n if (equal(PREFIX_BYTES.test, decodedPrefix)) {\n return true\n }\n\n throw new Error('Invalid X-address: bad prefix')\n}\n\nfunction tagFromUint8Array(buf: Uint8Array): number | false {\n const flag = buf[22]\n if (flag >= 2) {\n // No support for 64-bit tags at this time\n throw new Error('Unsupported X-address')\n }\n if (flag === 1) {\n // Little-endian to big-endian\n return buf[23] + buf[24] * 0x100 + buf[25] * 0x10000 + buf[26] * 0x1000000\n }\n if (flag !== 0) {\n throw new Error('flag must be zero to indicate no tag')\n }\n if (!equal(hexToBytes('0000000000000000'), buf.slice(23, 23 + 8))) {\n throw new Error('remaining bytes must be zero')\n }\n return false\n}\n\nfunction isValidXAddress(xAddress: string): boolean {\n try {\n decodeXAddress(xAddress)\n } catch (_error) {\n return false\n }\n return true\n}\n\nexport {\n // Codec with XRP alphabet\n codec,\n // Encode entropy as a \"seed\"\n encodeSeed,\n // Decode a seed into an object with its version, type, and bytes\n decodeSeed,\n // Encode bytes as a classic address (r...)\n encodeAccountID,\n // Decode a classic address to its raw bytes\n decodeAccountID,\n // Encode bytes to XRP Ledger node public key format\n encodeNodePublic,\n // Decode an XRP Ledger node public key into its raw bytes\n decodeNodePublic,\n // Encode a public key, as for payment channels\n encodeAccountPublic,\n // Decode a public key, as for payment channels\n decodeAccountPublic,\n // Check whether a classic address (r...) is valid\n isValidClassicAddress,\n // Derive X-address from classic address, tag, and network ID\n classicAddressToXAddress,\n // Encode account ID, tag, and network ID to X-address\n encodeXAddress,\n // Decode X-address to account ID, tag, and network ID\n xAddressToClassicAddress,\n // Convert X-address to classic address, tag, and network ID\n decodeXAddress,\n // Check whether an X-address (X...) is valid\n isValidXAddress,\n}\n","import { createHash } from 'crypto'\nimport wrapCryptoCreateHash from '../internal/wrapCryptoCreateHash'\n\n/**\n * Wrap node's native ripemd160 implementation in HashFn\n */\nexport const ripemd160 = wrapCryptoCreateHash('ripemd160', createHash)\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n isBytes as isBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n bytesToUtf8,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n utf8ToBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n (message: Uint8Array | string): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function abool(title: string, value: boolean): void {\n if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// tmp name until v2\nexport function _abool2(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\"`;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// tmp name until v2\n/** Asserts something is Uint8Array. */\nexport function _abytes2(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes_(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n abytes_(bytes);\n return hexToNumber(bytesToHex_(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'secret key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n let res: Uint8Array;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes_(hex);\n } catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n } else if (isBytes_(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n } else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as utf8ToBytes for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\n// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_;\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\n// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_;\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n const u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\n const u8of = (byte: number) => Uint8Array.of(byte); // another shortcut\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8of(0x00), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(u8of(0x01), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n bigint: (val: any): boolean => typeof val === 'bigint',\n function: (val: any): boolean => typeof val === 'function',\n boolean: (val: any): boolean => typeof val === 'boolean',\n string: (val: any): boolean => typeof val === 'string',\n stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes_(val),\n isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n array: (val: any): boolean => Array.isArray(val),\n field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap<T extends Record<string, any>> = { [K in keyof T]?: Validator };\n// type Record<K extends string | number | symbol, T> = { [P in K]: T; }\n\nexport function validateObject<T extends Record<string, any>>(\n object: T,\n validators: ValMap<T>,\n optValidators: ValMap<T> = {}\n): T {\n const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n const val = object[fieldName as keyof typeof object];\n if (isOptional && val === undefined) return;\n if (!checkVal(val, object)) {\n throw new Error(\n 'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n );\n }\n };\n for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\nexport function isHash(val: CHash): boolean {\n return typeof val === 'function' && Number.isSafeInteger(val.outputLen);\n}\nexport function _validateObject(\n object: Record<string, any>,\n fields: Record<string, string>,\n optFields: Record<string, string> = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n Object.entries(fields).forEach(([k, v]) => checkField(k, v, false));\n Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true));\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap<T, R>();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n _validateObject,\n anumber,\n bitMask,\n bytesToNumberBE,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesBE,\n numberToBytesLE,\n} from '../utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7);\n// prettier-ignore\nconst _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return <T>(Fp: IField<T>, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n ORDER: bigint;\n isLE: boolean;\n BYTES: number;\n BITS: number;\n MASK: bigint;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n allowedLengths?: number[];\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record<string, string>;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n _validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n sqrt: SqrtFn;\n isLE: boolean;\n BITS: number;\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n}>;\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n ORDER: bigint,\n bitLenOrOpts?: number | FieldOpts, // TODO: use opts only in v2?\n isLE = false,\n opts: { sqrt?: SqrtFn } = {}\n): Readonly<FpField> {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n let _sqrt: SqrtFn | undefined = undefined;\n let modFromBytes: boolean = false;\n let allowedLengths: undefined | readonly number[] = undefined;\n if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {\n if (opts.sqrt || isLE) throw new Error('cannot specify opts in two arguments');\n const _opts = bitLenOrOpts;\n if (_opts.BITS) _nbitLength = _opts.BITS;\n if (_opts.sqrt) _sqrt = _opts.sqrt;\n if (typeof _opts.isLE === 'boolean') isLE = _opts.isLE;\n if (typeof _opts.modFromBytes === 'boolean') modFromBytes = _opts.modFromBytes;\n allowedLengths = _opts.allowedLengths;\n } else {\n if (typeof bitLenOrOpts === 'number') _nbitLength = bitLenOrOpts;\n if (opts.sqrt) _sqrt = opts.sqrt;\n }\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);\n if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP: ReturnType<typeof FpSqrt>; // cached sqrtP\n const f: Readonly<FpField> = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n allowedLengths: allowedLengths,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n // is valid and invertible\n isValidNot0: (num: bigint) => !f.is0(num) && f.isValid(num),\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n\n inv: (num) => invert(num, ORDER),\n sqrt:\n _sqrt ||\n ((n) => {\n if (!sqrtP) sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes, skipValidation = true) => {\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!f.isValid(scalar)) throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n } as FpField);\n return Object.freeze(f);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n hash: string | Uint8Array,\n groupOrder: bigint,\n isLE = false\n): bigint {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(\n 'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n );\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, validateObject } from '../utils.ts';\nimport { Field, FpInvertBatch, nLength, validateField, type IField } from './modular.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint<T> = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// This was initialy do this way to re-use montgomery ladder in field (add->mul,double->sqr), but\n// that didn't happen and there is probably not much reason to have separate Group like this?\nexport interface Group<T extends Group<T>> {\n double(): T;\n negate(): T;\n add(other: T): T;\n subtract(other: T): T;\n equals(other: T): boolean;\n multiply(scalar: bigint): T;\n toAffine?(invertedZ?: any): AffinePoint<any>;\n}\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> extends Group<P> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint<F>;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField<P_F<P>>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField<bigint>;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint<P_F<P>>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: Uint8Array | string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n// this means we need to do stuff like\n// `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n// if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any, any>\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\nexport type GroupConstructor<T> = {\n BASE: T;\n ZERO: T;\n};\n/** @deprecated */\nexport type ExtendedGroupConstructor<T> = GroupConstructor<T> & {\n Fp: IField<any>;\n Fn: IField<bigint>;\n fromAffine(ap: AffinePoint<any>): T;\n};\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n private readonly BASE: PC_P<PC>;\n private readonly ZERO: PC_P<PC>;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n let d: PC_P<PC> = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P<PC>[] = [];\n let p: PC_P<PC> = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P<PC>[],\n n: bigint,\n acc: PC_P<PC> = this.ZERO\n ): PC_P<PC> {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P<PC>,\n scalar: bigint,\n transform?: Mapper<PC_P<PC>>\n ): { p: PC_P<PC>; f: PC_P<PC> } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P<PC>, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P<PC>): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n fieldN: IField<bigint>,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n fieldN: IField<bigint>,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\n// TODO: remove\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve<T> = {\n Fp: IField<T>; // Field over which we'll do calculations (Fp)\n n: bigint; // Curve order, total count of valid points in the field\n nBitLength?: number; // bit length of curve order\n nByteLength?: number; // byte length of curve order\n h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n hEff?: bigint; // Number to multiply to clear cofactor\n Gx: T; // base point X coordinate\n Gy: T; // base point Y coordinate\n allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\n// TODO: remove\n/** @deprecated */\nexport function validateBasic<FP, T>(\n curve: BasicCurve<FP> & T\n): Readonly<\n {\n readonly nBitLength: number;\n readonly nByteLength: number;\n } & BasicCurve<FP> &\n T & {\n p: bigint;\n }\n> {\n validateField(curve.Fp);\n validateObject(\n curve,\n {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n },\n {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n }\n );\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n } as const);\n}\n\nexport type ValidCurveParams<T> = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField<T>;\n }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function _createCurveFields<T>(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams<T>,\n curveOpts: Partial<FpFn<T>> = {},\n FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils';\nimport {\n _validateObject,\n _abool2 as abool,\n _abytes2 as abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n ensureBytes,\n hexToBytes,\n inRange,\n isBytes,\n memoized,\n numberToHexUnpadded,\n randomBytes as randomBytesWeb,\n type CHash,\n type Hex,\n type PrivKey,\n} from '../utils.ts';\nimport {\n _createCurveFields,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n pippenger,\n wNAF,\n type AffinePoint,\n type BasicCurve,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n Field,\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n nLength,\n validateField,\n type IField,\n type NLength,\n} from './modular.ts';\n\nexport type { AffinePoint };\nexport type HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\nexport type ECDSASigFormat = 'compact' | 'recovered' | 'der';\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASigFormat;\n};\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASigFormat;\n extraEntropy?: Uint8Array | boolean;\n};\n\nfunction validateSigFormat(format: string): ECDSASigFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASigFormat;\n}\n\nfunction validateSigOpts<T extends ECDSASignOpts, D extends Required<ECDSASignOpts>>(\n opts: T,\n def: D\n): Required<ECDSASignOpts> {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required<ECDSASignOpts>;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint<T> extends CurvePoint<T, WeierstrassPoint<T>> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n\n /** @deprecated use `.X` */\n readonly px: T;\n /** @deprecated use `.Y` */\n readonly py: T;\n /** @deprecated use `.Z` */\n readonly pz: T;\n /** @deprecated use `toBytes` */\n toRawBytes(isCompressed?: boolean): Uint8Array;\n /** @deprecated use `multiplyUnsafe` */\n multiplyAndAddUnsafe(\n Q: WeierstrassPoint<T>,\n a: bigint,\n b: bigint\n ): WeierstrassPoint<T> | undefined;\n /** @deprecated use `p.y % 2n === 0n` */\n hasEvenY(): boolean;\n /** @deprecated use `p.precompute(windowSize)` */\n _setWindowSize(windowSize: number): void;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons<T> extends CurvePointCons<WeierstrassPoint<T>> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint<T>;\n CURVE(): WeierstrassOpts<T>;\n /** @deprecated use `Point.BASE.multiply(Point.Fn.fromBytes(privateKey))` */\n fromPrivateKey(privateKey: PrivKey): WeierstrassPoint<T>;\n /** @deprecated use `import { normalizeZ } from '@noble/curves/abstract/curve.js';` */\n normalizeZ(points: WeierstrassPoint<T>[]): WeierstrassPoint<T>[];\n /** @deprecated use `import { pippenger } from '@noble/curves/abstract/curve.js';` */\n msm(points: WeierstrassPoint<T>[], scalars: bigint[]): WeierstrassPoint<T>;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts<T> = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\n// wrapPrivateKey: bls12-381 requires mod(n) instead of rejecting keys >= n\nexport type WeierstrassExtraOpts<T> = Partial<{\n Fp: IField<T>;\n Fn: IField<bigint>;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n clearCofactor: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n fromBytes: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: HmacFnSync;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (secretKeyA: PrivKey, publicKeyB: Hex, isCompressed?: boolean) => Uint8Array;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n isValidSecretKey: (secretKey: PrivKey) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `isValidSecretKey` */\n isValidPrivateKey: (secretKey: PrivKey) => boolean;\n /** @deprecated use `Point.Fn.fromBytes()` */\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n /** @deprecated use `point.precompute()` */\n precompute: (windowSize?: number, point?: WeierstrassPoint<bigint>) => WeierstrassPoint<bigint>;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Hex, secretKey: PrivKey, opts?: ECDSASignOpts) => ECDSASigRecovered;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function _normFnElement(Fn: IField<bigint>, key: PrivKey): bigint {\n const { BYTES: expected } = Fn;\n let num: bigint;\n if (typeof key === 'bigint') {\n num = key;\n } else {\n let bytes = ensureBytes('private key', key);\n try {\n num = Fn.fromBytes(bytes);\n } catch (error) {\n throw new Error(`invalid private key: expected ui8a of size ${expected}, got ${typeof key}`);\n }\n }\n if (!Fn.isValidNot0(num)) throw new Error('invalid private key: out of range [1..N-1]');\n return num;\n}\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * @example\n```js\nconst opts = {\n p: BigInt('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),\n n: BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),\n h: BigInt(1),\n a: BigInt('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),\n b: BigInt('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),\n Gx: BigInt('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296'),\n Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),\n};\nconst p256_Point = weierstrass(opts);\n```\n */\nexport function weierstrassN<T>(\n params: WeierstrassOpts<T>,\n extraOpts: WeierstrassExtraOpts<T> = {}\n): WeierstrassPointCons<T> {\n const validated = _createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts<T>;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n _validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n wrapPrivateKey: 'boolean',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const isYOdd = Fp.isOdd!(y); // (y & _1n) === _1n;\n const isHeadOdd = (head & 1) === 1; // ECDSA-specific\n if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint<T> => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint<T> {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts<T> {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint<T>): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n static fromHex(hex: Hex): Point {\n return Point.fromBytes(ensureBytes('pointHex', hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO;\n if (sc === _1n) return p; // fast-path\n if (wnaf.hasCache(this)) return this.multiply(sc);\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n const sum = this.multiplyUnsafe(a).add(Q.multiplyUnsafe(b));\n return sum.is0() ? undefined : sum;\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint<T> {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n\n // TODO: remove\n get px(): T {\n return this.X;\n }\n get py(): T {\n return this.X;\n }\n get pz(): T {\n return this.Z;\n }\n toRawBytes(isCompressed = true): Uint8Array {\n return this.toBytes(isCompressed);\n }\n _setWindowSize(windowSize: number) {\n this.precompute(windowSize);\n }\n static normalizeZ(points: Point[]): Point[] {\n return normalizeZ(Point, points);\n }\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n static fromPrivateKey(privateKey: PrivKey) {\n return Point.BASE.multiply(_normFnElement(Fn, privateKey));\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASigRecovered;\n hasHighS(): boolean;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n\n /** @deprecated */\n assertValidity(): void;\n /** @deprecated */\n normalizeS(): ECDSASignature;\n /** @deprecated use standalone method `curve.recoverPublicKey(sig.toBytes('recovered'), msg)` */\n recoverPublicKey(msgHash: Hex): WeierstrassPoint<bigint>;\n /** @deprecated use `.toBytes('compact')` */\n toCompactRawBytes(): Uint8Array;\n /** @deprecated use `.toBytes('compact')` */\n toCompactHex(): string;\n /** @deprecated use `.toBytes('der')` */\n toDERRawBytes(): Uint8Array;\n /** @deprecated use `.toBytes('der')` */\n toDERHex(): string;\n}\nexport type ECDSASigRecovered = ECDSASignature & {\n readonly recovery: number;\n};\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASigFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASigFormat): ECDSASignature;\n\n /** @deprecated use `.fromBytes(bytes, 'compact')` */\n fromCompact(hex: Hex): ECDSASignature;\n /** @deprecated use `.fromBytes(bytes, 'der')` */\n fromDER(hex: Hex): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio<T>(\n Fp: IField<T>,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU<T>(\n Fp: IField<T>,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths<T>(Fp: IField<T>, Fn: IField<bigint>) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons<bigint>,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || randomBytesWeb;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: PrivKey) {\n try {\n return !!_normFnElement(Fn, secretKey);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: PrivKey, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);\n }\n\n function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n if (typeof item === 'bigint') return false;\n if (item instanceof Point) return true;\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (Fn.allowedLengths || secretKey === publicKey) return undefined;\n const l = ensureBytes('key', item).length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(secretKeyA: PrivKey, publicKeyB: Hex, isCompressed = true): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = _normFnElement(Fn, secretKeyA);\n const b = Point.fromHex(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n\n // TODO: remove\n isValidPrivateKey: isValidSecretKey,\n randomPrivateKey: randomSecretKey,\n normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n precompute(windowSize = 8, point = Point.BASE): WeierstrassPoint<bigint> {\n return point.precompute(windowSize, false);\n },\n };\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n * We need `hash` for 2 features:\n * 1. Message prehash-ing. NOT used if `sign` / `verify` are called with `prehash: false`\n * 2. k generation in `sign`, using HMAC-drbg(hash)\n *\n * ECDSAOpts are only rarely needed.\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons<bigint>,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n _validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n\n const randomBytes = ecdsaOpts.randomBytes || randomBytesWeb;\n const hmac: HmacFnSync =\n ecdsaOpts.hmac ||\n (((key, ...msgs) => nobleHmac(hash, key, concatBytes(...msgs))) satisfies HmacFnSync);\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required<ECDSASignOpts> = {\n prehash: false,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : false,\n format: undefined as any, //'compact' as ECDSASigFormat,\n extraEntropy: false,\n };\n const defaultSigOpts_format = 'compact';\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASigFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer, `${format} signature`);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) this.recovery = recovery;\n Object.freeze(this);\n }\n\n static fromBytes(bytes: Uint8Array, format: ECDSASigFormat = defaultSigOpts_format): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = Fn.BYTES;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASigFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Hex): WeierstrassPoint<bigint> {\n const FIELD_ORDER = Fp.ORDER;\n const { r, s, recovery: rec } = this;\n if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n const hasCofactor = CURVE_ORDER * _2n < FIELD_ORDER;\n if (hasCofactor && rec > 1) throw new Error('recovery id is ambiguous for h>1 curve');\n\n const radj = rec === 2 || rec === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('recovery id 2 or 3 invalid');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((rec & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(ensureBytes('msgHash', messageHash)); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASigFormat = defaultSigOpts_format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const r = Fn.toBytes(this.r);\n const s = Fn.toBytes(this.s);\n if (format === 'recovered') {\n if (this.recovery == null) throw new Error('recovery bit must be present');\n return concatBytes(Uint8Array.of(this.recovery), r, s);\n }\n return concatBytes(r, s);\n }\n\n toHex(format?: ECDSASigFormat) {\n return bytesToHex(this.toBytes(format));\n }\n\n // TODO: remove\n assertValidity(): void {}\n static fromCompact(hex: Hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'compact');\n }\n static fromDER(hex: Hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'der');\n }\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, Fn.neg(this.s), this.recovery) : this;\n }\n toDERRawBytes() {\n return this.toBytes('der');\n }\n toDERHex() {\n return bytesToHex(this.toBytes('der'));\n }\n toCompactRawBytes() {\n return this.toBytes('compact');\n }\n toCompactHex() {\n return bytesToHex(this.toBytes('compact'));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, privateKey: PrivKey, opts: ECDSASignOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = _normFnElement(Fn, privateKey); // validate secret key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // mod n, not mod p\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // Not using blinding here, see comment above\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Hex, secretKey: PrivKey, opts: ECDSASignOpts = {}): RecoveredSignature {\n message = ensureBytes('message', message);\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg<RecoveredSignature>(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig;\n }\n\n function tryParsingSig(sg: Hex | SignatureLike) {\n // Try to deduce format\n let sig: Signature | undefined = undefined;\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj =\n !isHex &&\n sg !== null &&\n typeof sg === 'object' &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n if (isObj) {\n sig = new Signature(sg.r, sg.s);\n } else if (isHex) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'der');\n } catch (derError) {\n if (!(derError instanceof DER.Err)) throw derError;\n }\n if (!sig) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'compact');\n } catch (error) {\n return false;\n }\n }\n }\n if (!sig) return false;\n return sig;\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Hex | SignatureLike,\n message: Hex,\n publicKey: Hex,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = ensureBytes('publicKey', publicKey);\n message = validateMsgAndHash(ensureBytes('message', message), prehash);\n if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n const sig =\n format === undefined\n ? tryParsingSig(signature)\n : Signature.fromBytes(ensureBytes('sig', signature as Hex), format);\n if (sig === false) return false;\n try {\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n });\n}\n\n// TODO: remove everything below\n/** @deprecated use ECDSASignature */\nexport type SignatureType = ECDSASignature;\n/** @deprecated use ECDSASigRecovered */\nexport type RecoveredSignatureType = ECDSASigRecovered;\n/** @deprecated switch to Uint8Array signatures in format 'compact' */\nexport type SignatureLike = { r: bigint; s: bigint };\nexport type ECDSAExtraEntropy = Hex | boolean;\n/** @deprecated use `ECDSAExtraEntropy` */\nexport type Entropy = Hex | boolean;\nexport type BasicWCurve<T> = BasicCurve<T> & {\n // Params: a, b\n a: T;\n b: T;\n\n // Optional params\n allowedPrivateKeyLengths?: readonly number[]; // for P521\n wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n endo?: EndomorphismOpts;\n // When a cofactor != 1, there can be an effective methods to:\n // 1. Determine whether a point is torsion-free\n isTorsionFree?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n // 2. Clear torsion component\n clearCofactor?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n};\n/** @deprecated use ECDSASignOpts */\nexport type SignOpts = ECDSASignOpts;\n/** @deprecated use ECDSASignOpts */\nexport type VerOpts = ECDSAVerifyOpts;\n\n/** @deprecated use WeierstrassPoint */\nexport type ProjPointType<T> = WeierstrassPoint<T>;\n/** @deprecated use WeierstrassPointCons */\nexport type ProjConstructor<T> = WeierstrassPointCons<T>;\n/** @deprecated use ECDSASignatureCons */\nexport type SignatureConstructor = ECDSASignatureCons;\n\n// TODO: remove\nexport type CurvePointsType<T> = BasicWCurve<T> & {\n fromBytes?: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes?: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n};\n\n// LegacyWeierstrassOpts\nexport type CurvePointsTypeWithLength<T> = Readonly<CurvePointsType<T> & Partial<NLength>>;\n\n// LegacyWeierstrass\nexport type CurvePointsRes<T> = {\n Point: WeierstrassPointCons<T>;\n\n /** @deprecated use `Point.CURVE()` */\n CURVE: CurvePointsType<T>;\n /** @deprecated use `Point` */\n ProjectivePoint: WeierstrassPointCons<T>;\n /** @deprecated use `Point.Fn.fromBytes(privateKey)` */\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n /** @deprecated */\n weierstrassEquation: (x: T) => T;\n /** @deprecated use `Point.Fn.isValidNot0(num)` */\n isWithinCurveOrder: (num: bigint) => boolean;\n};\n\n// Aliases to legacy types\n// export type CurveType = LegacyECDSAOpts;\n// export type CurveFn = LegacyECDSA;\n// export type CurvePointsRes<T> = LegacyWeierstrass<T>;\n// export type CurvePointsType<T> = LegacyWeierstrassOpts<T>;\n// export type CurvePointsTypeWithLength<T> = LegacyWeierstrassOpts<T>;\n// export type BasicWCurve<T> = LegacyWeierstrassOpts<T>;\n\n/** @deprecated use `Uint8Array` */\nexport type PubKey = Hex | WeierstrassPoint<bigint>;\nexport type CurveType = BasicWCurve<bigint> & {\n hash: CHash; // CHash not FHash because we need outputLen for DRBG\n hmac?: HmacFnSync;\n randomBytes?: (bytesLength?: number) => Uint8Array;\n lowS?: boolean;\n bits2int?: (bytes: Uint8Array) => bigint;\n bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\nexport type CurveFn = {\n /** @deprecated use `Point.CURVE()` */\n CURVE: CurvePointsType<bigint>;\n keygen: ECDSA['keygen'];\n getPublicKey: ECDSA['getPublicKey'];\n getSharedSecret: ECDSA['getSharedSecret'];\n sign: ECDSA['sign'];\n verify: ECDSA['verify'];\n Point: WeierstrassPointCons<bigint>;\n /** @deprecated use `Point` */\n ProjectivePoint: WeierstrassPointCons<bigint>;\n Signature: ECDSASignatureCons;\n utils: ECDSA['utils'];\n lengths: ECDSA['lengths'];\n};\n/** @deprecated use `weierstrass` in newer releases */\nexport function weierstrassPoints<T>(c: CurvePointsTypeWithLength<T>): CurvePointsRes<T> {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n return _weierstrass_new_output_to_legacy(c, Point);\n}\nexport type WsPointComposed<T> = {\n CURVE: WeierstrassOpts<T>;\n curveOpts: WeierstrassExtraOpts<T>;\n};\nexport type WsComposed = {\n /** @deprecated use `Point.CURVE()` */\n CURVE: WeierstrassOpts<bigint>;\n hash: CHash;\n curveOpts: WeierstrassExtraOpts<bigint>;\n ecdsaOpts: ECDSAOpts;\n};\nfunction _weierstrass_legacy_opts_to_new<T>(c: CurvePointsType<T>): WsPointComposed<T> {\n const CURVE: WeierstrassOpts<T> = {\n a: c.a,\n b: c.b,\n p: c.Fp.ORDER,\n n: c.n,\n h: c.h,\n Gx: c.Gx,\n Gy: c.Gy,\n };\n const Fp = c.Fp;\n let allowedLengths = c.allowedPrivateKeyLengths\n ? Array.from(new Set(c.allowedPrivateKeyLengths.map((l) => Math.ceil(l / 2))))\n : undefined;\n const Fn = Field(CURVE.n, {\n BITS: c.nBitLength,\n allowedLengths: allowedLengths,\n modFromBytes: c.wrapPrivateKey,\n });\n const curveOpts: WeierstrassExtraOpts<T> = {\n Fp,\n Fn,\n allowInfinityPoint: c.allowInfinityPoint,\n endo: c.endo,\n isTorsionFree: c.isTorsionFree,\n clearCofactor: c.clearCofactor,\n fromBytes: c.fromBytes,\n toBytes: c.toBytes,\n };\n return { CURVE, curveOpts };\n}\nfunction _ecdsa_legacy_opts_to_new(c: CurveType): WsComposed {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const ecdsaOpts: ECDSAOpts = {\n hmac: c.hmac,\n randomBytes: c.randomBytes,\n lowS: c.lowS,\n bits2int: c.bits2int,\n bits2int_modN: c.bits2int_modN,\n };\n return { CURVE, curveOpts, hash: c.hash, ecdsaOpts };\n}\nexport function _legacyHelperEquat<T>(Fp: IField<T>, a: T, b: T): (x: T) => T {\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n return weierstrassEquation;\n}\nfunction _weierstrass_new_output_to_legacy<T>(\n c: CurvePointsType<T>,\n Point: WeierstrassPointCons<T>\n): CurvePointsRes<T> {\n const { Fp, Fn } = Point;\n function isWithinCurveOrder(num: bigint): boolean {\n return inRange(num, _1n, Fn.ORDER);\n }\n const weierstrassEquation = _legacyHelperEquat(Fp, c.a, c.b);\n return Object.assign(\n {},\n {\n CURVE: c,\n Point: Point,\n ProjectivePoint: Point,\n normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n weierstrassEquation,\n isWithinCurveOrder,\n }\n );\n}\nfunction _ecdsa_new_output_to_legacy(c: CurveType, _ecdsa: ECDSA): CurveFn {\n const Point = _ecdsa.Point;\n return Object.assign({}, _ecdsa, {\n ProjectivePoint: Point,\n CURVE: Object.assign({}, c, nLength(Point.Fn.ORDER, Point.Fn.BITS)),\n });\n}\n\n// _ecdsa_legacy\nexport function weierstrass(c: CurveType): CurveFn {\n const { CURVE, curveOpts, hash, ecdsaOpts } = _ecdsa_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n const signs = ecdsa(Point, hash, ecdsaOpts);\n return _ecdsa_new_output_to_legacy(c, signs);\n}\n","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\nimport type { CHash } from './utils.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): { hash: CHash } {\n return { hash };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly<Omit<CurveType, 'hash'>>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\n/** @deprecated use new `weierstrass()` and `ecdsa()` methods */\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, hash: hash });\n return { ...create(defHash), create };\n}\n","/**\n * hash-to-curve from RFC 9380.\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * https://www.rfc-editor.org/rfc/rfc9380\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport type { CHash } from '../utils.ts';\nimport {\n _validateObject,\n abytes,\n bytesToNumberBE,\n concatBytes,\n isBytes,\n isHash,\n utf8ToBytes,\n} from '../utils.ts';\nimport type { AffinePoint, Group, GroupConstructor } from './curve.ts';\nimport { FpInvertBatch, mod, type IField } from './modular.ts';\n\nexport type UnicodeOrBytes = string | Uint8Array;\n\n/**\n * * `DST` is a domain separation tag, defined in section 2.2.5\n * * `p` characteristic of F, where F is a finite field of characteristic p and order q = p^m\n * * `m` is extension degree (1 for prime fields)\n * * `k` is the target security target in bits (e.g. 128), from section 5.1\n * * `expand` is `xmd` (SHA2, SHA3, BLAKE) or `xof` (SHAKE, BLAKE-XOF)\n * * `hash` conforming to `utils.CHash` interface, with `outputLen` / `blockLen` props\n */\nexport type H2COpts = {\n DST: UnicodeOrBytes;\n expand: 'xmd' | 'xof';\n hash: CHash;\n p: bigint;\n m: number;\n k: number;\n};\nexport type H2CHashOpts = {\n expand: 'xmd' | 'xof';\n hash: CHash;\n};\n// todo: remove\nexport type Opts = H2COpts;\n\n// Octet Stream to Integer. \"spec\" implementation of os2ip is 2.5x slower vs bytesToNumberBE.\nconst os2ip = bytesToNumberBE;\n\n// Integer to Octet Stream (numberToBytesBE)\nfunction i2osp(value: number, length: number): Uint8Array {\n anum(value);\n anum(length);\n if (value < 0 || value >= 1 << (8 * length)) throw new Error('invalid I2OSP input: ' + value);\n const res = Array.from({ length }).fill(0) as number[];\n for (let i = length - 1; i >= 0; i--) {\n res[i] = value & 0xff;\n value >>>= 8;\n }\n return new Uint8Array(res);\n}\n\nfunction strxor(a: Uint8Array, b: Uint8Array): Uint8Array {\n const arr = new Uint8Array(a.length);\n for (let i = 0; i < a.length; i++) {\n arr[i] = a[i] ^ b[i];\n }\n return arr;\n}\n\nfunction anum(item: unknown): void {\n if (!Number.isSafeInteger(item)) throw new Error('number expected');\n}\n\nfunction normDST(DST: UnicodeOrBytes): Uint8Array {\n if (!isBytes(DST) && typeof DST !== 'string') throw new Error('DST must be Uint8Array or string');\n return typeof DST === 'string' ? utf8ToBytes(DST) : DST;\n}\n\n/**\n * Produces a uniformly random byte string using a cryptographic hash function H that outputs b bits.\n * [RFC 9380 5.3.1](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.1).\n */\nexport function expand_message_xmd(\n msg: Uint8Array,\n DST: UnicodeOrBytes,\n lenInBytes: number,\n H: CHash\n): Uint8Array {\n abytes(msg);\n anum(lenInBytes);\n DST = normDST(DST);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n if (DST.length > 255) DST = H(concatBytes(utf8ToBytes('H2C-OVERSIZE-DST-'), DST));\n const { outputLen: b_in_bytes, blockLen: r_in_bytes } = H;\n const ell = Math.ceil(lenInBytes / b_in_bytes);\n if (lenInBytes > 65535 || ell > 255) throw new Error('expand_message_xmd: invalid lenInBytes');\n const DST_prime = concatBytes(DST, i2osp(DST.length, 1));\n const Z_pad = i2osp(0, r_in_bytes);\n const l_i_b_str = i2osp(lenInBytes, 2); // len_in_bytes_str\n const b = new Array<Uint8Array>(ell);\n const b_0 = H(concatBytes(Z_pad, msg, l_i_b_str, i2osp(0, 1), DST_prime));\n b[0] = H(concatBytes(b_0, i2osp(1, 1), DST_prime));\n for (let i = 1; i <= ell; i++) {\n const args = [strxor(b_0, b[i - 1]), i2osp(i + 1, 1), DST_prime];\n b[i] = H(concatBytes(...args));\n }\n const pseudo_random_bytes = concatBytes(...b);\n return pseudo_random_bytes.slice(0, lenInBytes);\n}\n\n/**\n * Produces a uniformly random byte string using an extendable-output function (XOF) H.\n * 1. The collision resistance of H MUST be at least k bits.\n * 2. H MUST be an XOF that has been proved indifferentiable from\n * a random oracle under a reasonable cryptographic assumption.\n * [RFC 9380 5.3.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.2).\n */\nexport function expand_message_xof(\n msg: Uint8Array,\n DST: UnicodeOrBytes,\n lenInBytes: number,\n k: number,\n H: CHash\n): Uint8Array {\n abytes(msg);\n anum(lenInBytes);\n DST = normDST(DST);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n // DST = H('H2C-OVERSIZE-DST-' || a_very_long_DST, Math.ceil((lenInBytes * k) / 8));\n if (DST.length > 255) {\n const dkLen = Math.ceil((2 * k) / 8);\n DST = H.create({ dkLen }).update(utf8ToBytes('H2C-OVERSIZE-DST-')).update(DST).digest();\n }\n if (lenInBytes > 65535 || DST.length > 255)\n throw new Error('expand_message_xof: invalid lenInBytes');\n return (\n H.create({ dkLen: lenInBytes })\n .update(msg)\n .update(i2osp(lenInBytes, 2))\n // 2. DST_prime = DST || I2OSP(len(DST), 1)\n .update(DST)\n .update(i2osp(DST.length, 1))\n .digest()\n );\n}\n\n/**\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * [RFC 9380 5.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.2).\n * @param msg a byte string containing the message to hash\n * @param count the number of elements of F to output\n * @param options `{DST: string, p: bigint, m: number, k: number, expand: 'xmd' | 'xof', hash: H}`, see above\n * @returns [u_0, ..., u_(count - 1)], a list of field elements.\n */\nexport function hash_to_field(msg: Uint8Array, count: number, options: H2COpts): bigint[][] {\n _validateObject(options, {\n p: 'bigint',\n m: 'number',\n k: 'number',\n hash: 'function',\n });\n const { p, k, m, hash, expand, DST } = options;\n if (!isHash(options.hash)) throw new Error('expected valid hash');\n abytes(msg);\n anum(count);\n const log2p = p.toString(2).length;\n const L = Math.ceil((log2p + k) / 8); // section 5.1 of ietf draft link above\n const len_in_bytes = count * m * L;\n let prb; // pseudo_random_bytes\n if (expand === 'xmd') {\n prb = expand_message_xmd(msg, DST, len_in_bytes, hash);\n } else if (expand === 'xof') {\n prb = expand_message_xof(msg, DST, len_in_bytes, k, hash);\n } else if (expand === '_internal_pass') {\n // for internal tests only\n prb = msg;\n } else {\n throw new Error('expand must be \"xmd\" or \"xof\"');\n }\n const u = new Array(count);\n for (let i = 0; i < count; i++) {\n const e = new Array(m);\n for (let j = 0; j < m; j++) {\n const elm_offset = L * (j + i * m);\n const tv = prb.subarray(elm_offset, elm_offset + L);\n e[j] = mod(os2ip(tv), p);\n }\n u[i] = e;\n }\n return u;\n}\n\nexport type XY<T> = (x: T, y: T) => { x: T; y: T };\nexport type XYRatio<T> = [T[], T[], T[], T[]]; // xn/xd, yn/yd\nexport function isogenyMap<T, F extends IField<T>>(field: F, map: XYRatio<T>): XY<T> {\n // Make same order as in spec\n const coeff = map.map((i) => Array.from(i).reverse());\n return (x: T, y: T) => {\n const [xn, xd, yn, yd] = coeff.map((val) =>\n val.reduce((acc, i) => field.add(field.mul(acc, x), i))\n );\n // 6.6.3\n // Exceptional cases of iso_map are inputs that cause the denominator of\n // either rational function to evaluate to zero; such cases MUST return\n // the identity point on E.\n const [xd_inv, yd_inv] = FpInvertBatch(field, [xd, yd], true);\n x = field.mul(xn, xd_inv); // xNum / xDen\n y = field.mul(y, field.mul(yn, yd_inv)); // y * (yNum / yDev)\n return { x, y };\n };\n}\n\n/** Point interface, which curves must implement to work correctly with the module. */\nexport interface H2CPoint<T> extends Group<H2CPoint<T>> {\n add(rhs: H2CPoint<T>): H2CPoint<T>;\n toAffine(iz?: bigint): AffinePoint<T>;\n clearCofactor(): H2CPoint<T>;\n assertValidity(): void;\n}\n\nexport interface H2CPointConstructor<T> extends GroupConstructor<H2CPoint<T>> {\n fromAffine(ap: AffinePoint<T>): H2CPoint<T>;\n}\n\nexport type MapToCurve<T> = (scalar: bigint[]) => AffinePoint<T>;\n\n// Separated from initialization opts, so users won't accidentally change per-curve parameters\n// (changing DST is ok!)\nexport type htfBasicOpts = { DST: UnicodeOrBytes };\nexport type H2CMethod<T> = (msg: Uint8Array, options?: htfBasicOpts) => H2CPoint<T>;\n// TODO: remove\nexport type HTFMethod<T> = H2CMethod<T>;\nexport type MapMethod<T> = (scalars: bigint[]) => H2CPoint<T>;\nexport type H2CHasherBase<T> = {\n hashToCurve: H2CMethod<T>;\n hashToScalar: (msg: Uint8Array, options: htfBasicOpts) => bigint;\n};\n/**\n * RFC 9380 methods, with cofactor clearing. See https://www.rfc-editor.org/rfc/rfc9380#section-3.\n *\n * * hashToCurve: `map(hash(input))`, encodes RANDOM bytes to curve (WITH hashing)\n * * encodeToCurve: `map(hash(input))`, encodes NON-UNIFORM bytes to curve (WITH hashing)\n * * mapToCurve: `map(scalars)`, encodes NON-UNIFORM scalars to curve (NO hashing)\n */\nexport type H2CHasher<T> = H2CHasherBase<T> & {\n encodeToCurve: H2CMethod<T>;\n mapToCurve: MapMethod<T>;\n defaults: H2COpts & { encodeDST?: UnicodeOrBytes };\n};\n// TODO: remove\nexport type Hasher<T> = H2CHasher<T>;\n\nexport const _DST_scalar: Uint8Array = utf8ToBytes('HashToScalar-');\n\n/** Creates hash-to-curve methods from EC Point and mapToCurve function. See {@link H2CHasher}. */\nexport function createHasher<T>(\n Point: H2CPointConstructor<T>,\n mapToCurve: MapToCurve<T>,\n defaults: H2COpts & { encodeDST?: UnicodeOrBytes }\n): H2CHasher<T> {\n if (typeof mapToCurve !== 'function') throw new Error('mapToCurve() must be defined');\n function map(num: bigint[]) {\n return Point.fromAffine(mapToCurve(num));\n }\n function clear(initial: H2CPoint<T>) {\n const P = initial.clearCofactor();\n if (P.equals(Point.ZERO)) return Point.ZERO; // zero will throw in assert\n P.assertValidity();\n return P;\n }\n\n return {\n defaults,\n\n hashToCurve(msg: Uint8Array, options?: htfBasicOpts): H2CPoint<T> {\n const opts = Object.assign({}, defaults, options);\n const u = hash_to_field(msg, 2, opts);\n const u0 = map(u[0]);\n const u1 = map(u[1]);\n return clear(u0.add(u1));\n },\n encodeToCurve(msg: Uint8Array, options?: htfBasicOpts): H2CPoint<T> {\n const optsDst = defaults.encodeDST ? { DST: defaults.encodeDST } : {};\n const opts = Object.assign({}, defaults, optsDst, options);\n const u = hash_to_field(msg, 1, opts);\n const u0 = map(u[0]);\n return clear(u0);\n },\n /** See {@link H2CHasher} */\n mapToCurve(scalars: bigint[]): H2CPoint<T> {\n if (!Array.isArray(scalars)) throw new Error('expected array of bigints');\n for (const i of scalars)\n if (typeof i !== 'bigint') throw new Error('expected array of bigints');\n return clear(map(scalars));\n },\n\n // hash_to_scalar can produce 0: https://www.rfc-editor.org/errata/eid8393\n // RFC 9380, draft-irtf-cfrg-bbs-signatures-08\n hashToScalar(msg: Uint8Array, options?: htfBasicOpts): bigint {\n // @ts-ignore\n const N = Point.Fn.ORDER;\n const opts = Object.assign({}, defaults, { p: N, m: 1, DST: _DST_scalar }, options);\n return hash_to_field(msg, 1, opts)[0][0];\n },\n };\n}\n","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport type { CurveLengths } from './abstract/curve.ts';\nimport {\n createHasher,\n type H2CHasher,\n type H2CMethod,\n isogenyMap,\n} from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, mod, pow2 } from './abstract/modular.ts';\nimport {\n _normFnElement,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport type { Hex, PrivKey } from './utils.ts';\nimport {\n bytesToNumberBE,\n concatBytes,\n ensureBytes,\n inRange,\n numberToBytesBE,\n utf8ToBytes,\n} from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Point.BASE.multiply(Point.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts<bigint> = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n { ...secp256k1_CURVE, Fp: Fpk1, lowS: true, endo: secp256k1_ENDO },\n sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(utf8ToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType<bigint>) => point.toBytes(true).slice(1);\nconst Pointk1 = /* @__PURE__ */ (() => secp256k1.Point)();\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n const { Fn, BASE } = Pointk1;\n const d_ = _normFnElement(Fn, priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType<bigint> {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Hex): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message: Hex, secretKey: PrivKey, auxRand: Hex = randomBytes(32)): Uint8Array {\n const { Fn } = Pointk1;\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n const { Fn, BASE } = Pointk1;\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!inRange(r, _1n, secp256k1_CURVE.p)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!inRange(s, _1n, secp256k1_CURVE.n)) return false;\n // int(challenge(bytes(r)||bytes(P)||m))%n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m);\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType<bigint>) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `utils` */\n numberToBytesBE: typeof numberToBytesBE;\n /** @deprecated use `utils` */\n bytesToNumberBE: typeof bytesToNumberBE;\n /** @deprecated use `modular` */\n mod: typeof mod;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n // TODO: remove\n secp256k1.utils.randomSecretKey;\n function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: schnorrGetPublicKey(secretKey) };\n }\n return {\n keygen,\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey: randomSecretKey,\n randomPrivateKey: randomSecretKey,\n taggedHash,\n\n // TODO: remove\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n mod,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher<bigint> = /* @__PURE__ */ (() =>\n createHasher(\n secp256k1.Point,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n }\n ))();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const hashToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n secp256k1_hasher.hashToCurve)();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const encodeToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n secp256k1_hasher.encodeToCurve)();\n","import { createHash } from 'crypto'\nimport wrapCryptoCreateHash from '../internal/wrapCryptoCreateHash'\n\n/**\n * Wrap node's native sha512 implementation in HashFn\n */\nexport const sha512 = wrapCryptoCreateHash('sha512', createHash)\n","/**\n * Deprecated module: moved from curves/abstract/utils.js to curves/utils.js\n * @module\n */\nimport * as u from '../utils.ts';\n\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type Hex = u.Hex;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type PrivKey = u.PrivKey;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type CHash = u.CHash;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type FHash = u.FHash;\n\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const abytes: typeof u.abytes = u.abytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const anumber: typeof u.anumber = u.anumber;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToHex: typeof u.bytesToHex = u.bytesToHex;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToUtf8: typeof u.bytesToUtf8 = u.bytesToUtf8;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const concatBytes: typeof u.concatBytes = u.concatBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const hexToBytes: typeof u.hexToBytes = u.hexToBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const isBytes: typeof u.isBytes = u.isBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const randomBytes: typeof u.randomBytes = u.randomBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const utf8ToBytes: typeof u.utf8ToBytes = u.utf8ToBytes;\n\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const abool: typeof u.abool = u.abool;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToHexUnpadded: typeof u.numberToHexUnpadded = u.numberToHexUnpadded;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const hexToNumber: typeof u.hexToNumber = u.hexToNumber;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToNumberBE: typeof u.bytesToNumberBE = u.bytesToNumberBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToNumberLE: typeof u.bytesToNumberLE = u.bytesToNumberLE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToBytesBE: typeof u.numberToBytesBE = u.numberToBytesBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToBytesLE: typeof u.numberToBytesLE = u.numberToBytesLE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToVarBytesBE: typeof u.numberToVarBytesBE = u.numberToVarBytesBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const ensureBytes: typeof u.ensureBytes = u.ensureBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const equalBytes: typeof u.equalBytes = u.equalBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const copyBytes: typeof u.copyBytes = u.copyBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const asciiToBytes: typeof u.asciiToBytes = u.asciiToBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const inRange: typeof u.inRange = u.inRange;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const aInRange: typeof u.aInRange = u.aInRange;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitLen: typeof u.bitLen = u.bitLen;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitGet: typeof u.bitGet = u.bitGet;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitSet: typeof u.bitSet = u.bitSet;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitMask: typeof u.bitMask = u.bitMask;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const createHmacDrbg: typeof u.createHmacDrbg = u.createHmacDrbg;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const notImplemented: typeof u.notImplemented = u.notImplemented;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const memoized: typeof u.memoized = u.memoized;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const validateObject: typeof u.validateObject = u.validateObject;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const isHash: typeof u.isHash = u.isHash;\n","import { sha512 } from '@xrplf/isomorphic/sha512'\nimport { bytesToNumberBE } from '@noble/curves/abstract/utils'\n\ntype Input = Uint8Array | number[] | string\n\nexport default class Sha512 {\n // instantiate empty sha512 hash\n hash = sha512.create()\n\n static half(input: Input): Uint8Array {\n return new Sha512().add(input).first256()\n }\n\n add(bytes: Input): this {\n this.hash.update(bytes)\n return this\n }\n\n addU32(i: number): this {\n const buffer = new Uint8Array(4)\n new DataView(buffer.buffer).setUint32(0, i)\n return this.add(buffer)\n }\n\n finish(): Uint8Array {\n return this.hash.digest()\n }\n\n first256(): Uint8Array {\n return this.finish().slice(0, 32)\n }\n\n first256BigInt(): bigint {\n return bytesToNumberBE(this.first256())\n }\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\n\nimport Sha512 from '../../utils/Sha512'\n\nconst ZERO = BigInt(0)\n\nfunction deriveScalar(bytes: Uint8Array, discrim?: number): bigint {\n const order = secp256k1.CURVE.n\n for (let i = 0; i <= 0xffff_ffff; i++) {\n // We hash the bytes to find a 256-bit number, looping until we are sure it\n // is less than the order of the curve.\n const hasher = new Sha512().add(bytes)\n // If the optional discriminator index was passed in, update the hash.\n if (discrim !== undefined) {\n hasher.addU32(discrim)\n }\n hasher.addU32(i)\n const key = hasher.first256BigInt()\n /* istanbul ignore else */\n if (key > ZERO && key < order) {\n return key\n }\n }\n // This error is practically impossible to reach.\n // The order of the curve describes the (finite) amount of points on the curve\n // https://github.com/indutny/elliptic/blob/master/lib/elliptic/curves.js#L182\n // How often will an (essentially) random number generated by Sha512 be larger than that?\n // There's 2^32 chances (the for loop) to get a number smaller than the order,\n // and it's rare that you'll even get past the first loop iteration.\n // Note that in TypeScript we actually need the throw, otherwise the function signature would be bigint | undefined\n //\n /* istanbul ignore next */\n throw new Error('impossible unicorn ;)')\n}\n\n/**\n * @param seed - Bytes.\n * @param [opts] - Object.\n * @param [opts.accountIndex=0] - The account number to generate.\n * @param [opts.validator=false] - Generate root key-pair,\n * as used by validators.\n * @returns {bigint} 256 bit scalar value.\n *\n */\nexport function derivePrivateKey(\n seed: Uint8Array,\n opts: {\n validator?: boolean\n accountIndex?: number\n } = {},\n): bigint {\n const root = opts.validator\n const order = secp256k1.CURVE.n\n\n // This private generator represents the `root` private key, and is what's\n // used by validators for signing when a keypair is generated from a seed.\n const privateGen = deriveScalar(seed)\n if (root) {\n // As returned by validation_create for a given seed\n return privateGen\n }\n const publicGen =\n secp256k1.ProjectivePoint.BASE.multiply(privateGen).toRawBytes(true)\n // A seed can generate many keypairs as a function of the seed and a uint32.\n // Almost everyone just uses the first account, `0`.\n const accountIndex = opts.accountIndex || 0\n return (deriveScalar(publicGen, accountIndex) + privateGen) % order\n}\n\nexport function accountPublicFromPublicGenerator(publicGenBytes: Uint8Array) {\n const rootPubPoint = secp256k1.ProjectivePoint.fromHex(publicGenBytes)\n const scalar = deriveScalar(publicGenBytes, 0)\n const point = secp256k1.ProjectivePoint.BASE.multiply(scalar)\n const offset = rootPubPoint.add(point)\n return offset.toRawBytes(true)\n}\n","const assertHelper: {\n ok: (cond: boolean, message?: string) => asserts cond is true\n} = {\n ok(cond, message): asserts cond is true {\n if (!cond) {\n throw new Error(message)\n }\n },\n}\n\nexport default assertHelper\n","import type { Algorithm, HexString, KeyType } from '../types'\n\nenum Prefix {\n NONE = -1,\n ED25519 = 0xed,\n SECP256K1_PUB_X = 0x02,\n SECP256K1_PUB_X_ODD_Y = 0x03,\n SECP256K1_PUB_XY = 0x04,\n SECP256K1_PRIVATE = 0x00,\n}\n\ntype CompositeKey = `${KeyType}_${Prefix}_${number}`\n\n/**\n * | Curve | Type | Prefix | Length | Description | Algorithm |\n * |-----------|-------------|:------:|:------:|-------------------------------------------------------|----------------:|\n * | ed25519 | Private | 0xED | 33 | prefix + Uint256LE (0 < n < order ) | ed25519 |\n * | ed25519 | Public | 0xED | 33 | prefix + 32 y-bytes | ed25519 |\n * | secp256k1 | Public (1) | 0x02 | 33 | prefix + 32 x-bytes | ecdsa-secp256k1 |\n * | secp256k1 | Public (2) | 0x03 | 33 | prefix + 32 x-bytes (y is odd) | ecdsa-secp256k1 |\n * | secp256k1 | Public (3) | 0x04 | 65 | prefix + 32 x-bytes + 32 y-bytes | ecdsa-secp256k1 |\n * | secp256k1 | Private (1) | None | 32 | Uint256BE (0 < n < order) | ecdsa-secp256k1 |\n * | secp256k1 | Private (2) | 0x00 | 33 | prefix + Uint256BE (0 < n < order) | ecdsa-secp256k1 |\n *\n * Note: The 0x00 prefix for secpk256k1 Private (2) essentially 0 pads the number\n * and the interpreted number is the same as 32 bytes.\n */\nconst KEY_TYPES: Record<CompositeKey, Algorithm> = {\n [`private_${Prefix.NONE}_32`]: 'ecdsa-secp256k1',\n [`private_${Prefix.SECP256K1_PRIVATE}_33`]: 'ecdsa-secp256k1',\n [`private_${Prefix.ED25519}_33`]: 'ed25519',\n [`public_${Prefix.ED25519}_33`]: 'ed25519',\n [`public_${Prefix.SECP256K1_PUB_X}_33`]: 'ecdsa-secp256k1',\n [`public_${Prefix.SECP256K1_PUB_X_ODD_Y}_33`]: 'ecdsa-secp256k1',\n [`public_${Prefix.SECP256K1_PUB_XY}_65`]: 'ecdsa-secp256k1',\n}\n\nfunction getKeyInfo(key: HexString) {\n return {\n prefix: key.length < 2 ? Prefix.NONE : parseInt(key.slice(0, 2), 16),\n len: key.length / 2,\n }\n}\n\nfunction prefixRepr(prefix: Prefix): string {\n return prefix === Prefix.NONE\n ? 'None'\n : `0x${prefix.toString(16).padStart(2, '0')}`\n}\n\nfunction getValidFormatsTable(type: KeyType) {\n // No need overkill with renderTable method\n const padding = 2\n const colWidth = {\n algorithm: 'ecdsa-secp256k1'.length + padding,\n prefix: '0x00'.length + padding,\n }\n\n return Object.entries(KEY_TYPES)\n .filter(([key]) => key.startsWith(type))\n .map(([key, algorithm]) => {\n const [, prefix, length] = key.split('_')\n const paddedAlgo = algorithm.padEnd(colWidth.algorithm)\n const paddedPrefix = prefixRepr(Number(prefix)).padEnd(colWidth.prefix)\n return `${paddedAlgo} - Prefix: ${paddedPrefix} Length: ${length} bytes`\n })\n .join('\\n')\n}\n\nfunction keyError({\n key,\n type,\n prefix,\n len,\n}: {\n key: string\n type: KeyType\n prefix: number\n len: number\n}) {\n const validFormats = getValidFormatsTable(type)\n\n return `invalid_key:\n\nType: ${type}\nKey: ${key}\nPrefix: ${prefixRepr(prefix)} \nLength: ${len} bytes\n\nAcceptable ${type} formats are:\n${validFormats}\n`\n}\n\n/**\n * Determines the algorithm associated with a given key (public/private).\n *\n * @param key - hexadecimal string representation of the key.\n * @param type - whether expected key is public or private\n * @returns Algorithm algorithm for signing/verifying\n * @throws Error when key is invalid\n */\nexport function getAlgorithmFromKey(key: HexString, type: KeyType): Algorithm {\n const { prefix, len } = getKeyInfo(key)\n // Special case back compat support for no prefix\n const usedPrefix = type === 'private' && len === 32 ? Prefix.NONE : prefix\n const algorithm = KEY_TYPES[`${type}_${usedPrefix}_${len}`]\n\n if (!algorithm) {\n throw new Error(keyError({ key, type, len, prefix: usedPrefix }))\n }\n return algorithm\n}\n\nexport function getAlgorithmFromPublicKey(key: HexString): Algorithm {\n return getAlgorithmFromKey(key, 'public')\n}\n\nexport function getAlgorithmFromPrivateKey(key: HexString): Algorithm {\n return getAlgorithmFromKey(key, 'private')\n}\n","import { numberToBytesBE } from '@noble/curves/abstract/utils'\nimport { secp256k1 as nobleSecp256k1 } from '@noble/curves/secp256k1'\nimport { bytesToHex } from '@xrplf/isomorphic/utils'\n\nimport type {\n DeriveKeyPairOptions,\n HexString,\n SigningScheme,\n} from '../../types'\n\nimport { derivePrivateKey } from './utils'\nimport assert from '../../utils/assert'\nimport Sha512 from '../../utils/Sha512'\n\nconst SECP256K1_PREFIX = '00'\n\nconst secp256k1: SigningScheme = {\n deriveKeypair(\n entropy: Uint8Array,\n options?: DeriveKeyPairOptions,\n ): {\n privateKey: string\n publicKey: string\n } {\n const derived = derivePrivateKey(entropy, options)\n const privateKey =\n SECP256K1_PREFIX + bytesToHex(numberToBytesBE(derived, 32))\n\n const publicKey = bytesToHex(nobleSecp256k1.getPublicKey(derived, true))\n return { privateKey, publicKey }\n },\n\n sign(message: Uint8Array, privateKey: HexString): string {\n // Some callers pass the privateKey with the prefix, others without.\n // @noble/curves will throw if the key is not exactly 32 bytes, so we\n // normalize it before passing to the sign method.\n assert.ok(\n (privateKey.length === 66 && privateKey.startsWith(SECP256K1_PREFIX)) ||\n privateKey.length === 64,\n )\n const normedPrivateKey =\n privateKey.length === 66 ? privateKey.slice(2) : privateKey\n return nobleSecp256k1\n .sign(Sha512.half(message), normedPrivateKey, {\n // \"Canonical\" signatures\n lowS: true,\n // Would fail tests if signatures aren't deterministic\n extraEntropy: undefined,\n })\n .toDERHex(true)\n .toUpperCase()\n },\n\n verify(\n message: Uint8Array,\n signature: HexString,\n publicKey: HexString,\n ): boolean {\n const decoded = nobleSecp256k1.Signature.fromDER(signature)\n return nobleSecp256k1.verify(decoded, Sha512.half(message), publicKey)\n },\n}\n\nexport default secp256k1\n","/**\n * Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y².\n * For design rationale of types / exports, see weierstrass module documentation.\n * Untwisted Edwards curves exist, but they aren't used in real-world protocols.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n _validateObject,\n _abool2 as abool,\n _abytes2 as abytes,\n aInRange,\n bytesToHex,\n bytesToNumberLE,\n concatBytes,\n copyBytes,\n ensureBytes,\n isBytes,\n memoized,\n notImplemented,\n randomBytes as randomBytesWeb,\n type FHash,\n type Hex,\n} from '../utils.ts';\nimport {\n _createCurveFields,\n normalizeZ,\n pippenger,\n wNAF,\n type AffinePoint,\n type BasicCurve,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport { Field, type IField, type NLength } from './modular.ts';\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _8n = BigInt(8);\n\nexport type UVRatio = (u: bigint, v: bigint) => { isValid: boolean; value: bigint };\n\n/** Instance of Extended Point with coordinates in X, Y, Z, T. */\nexport interface EdwardsPoint extends CurvePoint<bigint, EdwardsPoint> {\n /** extended X coordinate. Different from affine x. */\n readonly X: bigint;\n /** extended Y coordinate. Different from affine y. */\n readonly Y: bigint;\n /** extended Z coordinate */\n readonly Z: bigint;\n /** extended T coordinate */\n readonly T: bigint;\n\n /** @deprecated use `toBytes` */\n toRawBytes(): Uint8Array;\n /** @deprecated use `p.precompute(windowSize)` */\n _setWindowSize(windowSize: number): void;\n /** @deprecated use .X */\n readonly ex: bigint;\n /** @deprecated use .Y */\n readonly ey: bigint;\n /** @deprecated use .Z */\n readonly ez: bigint;\n /** @deprecated use .T */\n readonly et: bigint;\n}\n/** Static methods of Extended Point with coordinates in X, Y, Z, T. */\nexport interface EdwardsPointCons extends CurvePointCons<EdwardsPoint> {\n new (X: bigint, Y: bigint, Z: bigint, T: bigint): EdwardsPoint;\n CURVE(): EdwardsOpts;\n fromBytes(bytes: Uint8Array, zip215?: boolean): EdwardsPoint;\n fromHex(hex: Hex, zip215?: boolean): EdwardsPoint;\n /** @deprecated use `import { pippenger } from '@noble/curves/abstract/curve.js';` */\n msm(points: EdwardsPoint[], scalars: bigint[]): EdwardsPoint;\n}\n/** @deprecated use EdwardsPoint */\nexport type ExtPointType = EdwardsPoint;\n/** @deprecated use EdwardsPointCons */\nexport type ExtPointConstructor = EdwardsPointCons;\n\n/**\n * Twisted Edwards curve options.\n *\n * * a: formula param\n * * d: formula param\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor. h*n is group order; n is subgroup order\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type EdwardsOpts = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: bigint;\n d: bigint;\n Gx: bigint;\n Gy: bigint;\n}>;\n\n/**\n * Extra curve options for Twisted Edwards.\n *\n * * Fp: redefined Field over curve.p\n * * Fn: redefined Field over curve.n\n * * uvRatio: helper function for decompression, calculating √(u/v)\n */\nexport type EdwardsExtraOpts = Partial<{\n Fp: IField<bigint>;\n Fn: IField<bigint>;\n FpFnLE: boolean;\n uvRatio: (u: bigint, v: bigint) => { isValid: boolean; value: bigint };\n}>;\n\n/**\n * EdDSA (Edwards Digital Signature algorithm) options.\n *\n * * hash: hash function used to hash secret keys and messages\n * * adjustScalarBytes: clears bits to get valid field element\n * * domain: Used for hashing\n * * mapToCurve: for hash-to-curve standard\n * * prehash: RFC 8032 pre-hashing of messages to sign() / verify()\n * * randomBytes: function generating random bytes, used for randomSecretKey\n */\nexport type EdDSAOpts = Partial<{\n adjustScalarBytes: (bytes: Uint8Array) => Uint8Array;\n domain: (data: Uint8Array, ctx: Uint8Array, phflag: boolean) => Uint8Array;\n mapToCurve: (scalar: bigint[]) => AffinePoint<bigint>;\n prehash: FHash;\n randomBytes: (bytesLength?: number) => Uint8Array;\n}>;\n\n/**\n * EdDSA (Edwards Digital Signature algorithm) interface.\n *\n * Allows to create and verify signatures, create public and secret keys.\n */\nexport interface EdDSA {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Hex) => Uint8Array;\n sign: (message: Hex, secretKey: Hex, options?: { context?: Hex }) => Uint8Array;\n verify: (\n sig: Hex,\n message: Hex,\n publicKey: Hex,\n options?: { context?: Hex; zip215: boolean }\n ) => boolean;\n Point: EdwardsPointCons;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, zip215?: boolean) => boolean;\n\n /**\n * Converts ed public key to x public key.\n *\n * There is NO `fromMontgomery`:\n * - There are 2 valid ed25519 points for every x25519, with flipped coordinate\n * - Sometimes there are 0 valid ed25519 points, because x25519 *additionally*\n * accepts inputs on the quadratic twist, which can't be moved to ed25519\n *\n * @example\n * ```js\n * const someonesPub = ed25519.getPublicKey(ed25519.utils.randomSecretKey());\n * const aPriv = x25519.utils.randomSecretKey();\n * x25519.getSharedSecret(aPriv, ed25519.utils.toMontgomery(someonesPub))\n * ```\n */\n toMontgomery: (publicKey: Uint8Array) => Uint8Array;\n /**\n * Converts ed secret key to x secret key.\n * @example\n * ```js\n * const someonesPub = x25519.getPublicKey(x25519.utils.randomSecretKey());\n * const aPriv = ed25519.utils.randomSecretKey();\n * x25519.getSharedSecret(ed25519.utils.toMontgomerySecret(aPriv), someonesPub)\n * ```\n */\n toMontgomerySecret: (privateKey: Uint8Array) => Uint8Array;\n getExtendedPublicKey: (key: Hex) => {\n head: Uint8Array;\n prefix: Uint8Array;\n scalar: bigint;\n point: EdwardsPoint;\n pointBytes: Uint8Array;\n };\n\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `point.precompute()` */\n precompute: (windowSize?: number, point?: EdwardsPoint) => EdwardsPoint;\n };\n lengths: CurveLengths;\n}\n\nfunction isEdValidXY(Fp: IField<bigint>, CURVE: EdwardsOpts, x: bigint, y: bigint): boolean {\n const x2 = Fp.sqr(x);\n const y2 = Fp.sqr(y);\n const left = Fp.add(Fp.mul(CURVE.a, x2), y2);\n const right = Fp.add(Fp.ONE, Fp.mul(CURVE.d, Fp.mul(x2, y2)));\n return Fp.eql(left, right);\n}\n\nexport function edwards(params: EdwardsOpts, extraOpts: EdwardsExtraOpts = {}): EdwardsPointCons {\n const validated = _createCurveFields('edwards', params, extraOpts, extraOpts.FpFnLE);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as EdwardsOpts;\n const { h: cofactor } = CURVE;\n _validateObject(extraOpts, {}, { uvRatio: 'function' });\n\n // Important:\n // There are some places where Fp.BYTES is used instead of nByteLength.\n // So far, everything has been tested with curves of Fp.BYTES == nByteLength.\n // TODO: test and find curves which behave otherwise.\n const MASK = _2n << (BigInt(Fn.BYTES * 8) - _1n);\n const modP = (n: bigint) => Fp.create(n); // Function overrides\n\n // sqrt(u/v)\n const uvRatio =\n extraOpts.uvRatio ||\n ((u: bigint, v: bigint) => {\n try {\n return { isValid: true, value: Fp.sqrt(Fp.div(u, v)) };\n } catch (e) {\n return { isValid: false, value: _0n };\n }\n });\n\n // Validate whether the passed curve params are valid.\n // equation ax² + y² = 1 + dx²y² should work for generator point.\n if (!isEdValidXY(Fp, CURVE, CURVE.Gx, CURVE.Gy))\n throw new Error('bad curve params: generator point');\n\n /**\n * Asserts coordinate is valid: 0 <= n < MASK.\n * Coordinates >= Fp.ORDER are allowed for zip215.\n */\n function acoord(title: string, n: bigint, banZero = false) {\n const min = banZero ? _1n : _0n;\n aInRange('coordinate ' + title, n, min, MASK);\n return n;\n }\n\n function aextpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ExtendedPoint expected');\n }\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n const toAffineMemo = memoized((p: Point, iz?: bigint): AffinePoint<bigint> => {\n const { X, Y, Z } = p;\n const is0 = p.is0();\n if (iz == null) iz = is0 ? _8n : (Fp.inv(Z) as bigint); // 8 was chosen arbitrarily\n const x = modP(X * iz);\n const y = modP(Y * iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: _0n, y: _1n };\n if (zz !== _1n) throw new Error('invZ was invalid');\n return { x, y };\n });\n const assertValidMemo = memoized((p: Point) => {\n const { a, d } = CURVE;\n if (p.is0()) throw new Error('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = modP(X * X); // X²\n const Y2 = modP(Y * Y); // Y²\n const Z2 = modP(Z * Z); // Z²\n const Z4 = modP(Z2 * Z2); // Z⁴\n const aX2 = modP(X2 * a); // aX²\n const left = modP(Z2 * modP(aX2 + Y2)); // (aX² + Y²)Z²\n const right = modP(Z4 + modP(d * modP(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right) throw new Error('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = modP(X * Y);\n const ZT = modP(Z * T);\n if (XY !== ZT) throw new Error('bad point: equation left != right (2)');\n return true;\n });\n\n // Extended Point works in extended coordinates: (X, Y, Z, T) ∋ (x=X/Z, y=Y/Z, T=xy).\n // https://en.wikipedia.org/wiki/Twisted_Edwards_curve#Extended_coordinates\n class Point implements EdwardsPoint {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, _1n, modP(CURVE.Gx * CURVE.Gy));\n // zero / infinity / identity point\n static readonly ZERO = new Point(_0n, _1n, _1n, _0n); // 0, 1, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: bigint;\n readonly Y: bigint;\n readonly Z: bigint;\n readonly T: bigint;\n\n constructor(X: bigint, Y: bigint, Z: bigint, T: bigint) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y);\n this.Z = acoord('z', Z, true);\n this.T = acoord('t', T);\n Object.freeze(this);\n }\n\n static CURVE(): EdwardsOpts {\n return CURVE;\n }\n\n static fromAffine(p: AffinePoint<bigint>): Point {\n if (p instanceof Point) throw new Error('extended point not allowed');\n const { x, y } = p || {};\n acoord('x', x);\n acoord('y', y);\n return new Point(x, y, _1n, modP(x * y));\n }\n\n // Uses algo from RFC8032 5.1.3.\n static fromBytes(bytes: Uint8Array, zip215 = false): Point {\n const len = Fp.BYTES;\n const { a, d } = CURVE;\n bytes = copyBytes(abytes(bytes, len, 'point'));\n abool(zip215, 'zip215');\n const normed = copyBytes(bytes); // copy again, we'll manipulate it\n const lastByte = bytes[len - 1]; // select last byte\n normed[len - 1] = lastByte & ~0x80; // clear last bit\n const y = bytesToNumberLE(normed);\n\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // RFC8032 prohibits >= p, but ZIP215 doesn't\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n const max = zip215 ? MASK : Fp.ORDER;\n aInRange('point.y', y, _0n, max);\n\n // Ed25519: x² = (y²-1)/(dy²+1) mod p. Ed448: x² = (y²-1)/(dy²-1) mod p. Generic case:\n // ax²+y²=1+dx²y² => y²-1=dx²y²-ax² => y²-1=x²(dy²-a) => x²=(y²-1)/(dy²-a)\n const y2 = modP(y * y); // denominator is always non-0 mod p.\n const u = modP(y2 - _1n); // u = y² - 1\n const v = modP(d * y2 - a); // v = d y² + 1.\n let { isValid, value: x } = uvRatio(u, v); // √(u/v)\n if (!isValid) throw new Error('bad point: invalid y coordinate');\n const isXOdd = (x & _1n) === _1n; // There are 2 square roots. Use x_0 bit to select proper\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === _0n && isLastByteOdd)\n // if x=0 and x_0 = 1, fail\n throw new Error('bad point: x=0 and x_0=1');\n if (isLastByteOdd !== isXOdd) x = modP(-x); // if x_0 != x mod 2, set x = p-x\n return Point.fromAffine({ x, y });\n }\n static fromHex(bytes: Uint8Array, zip215 = false): Point {\n return Point.fromBytes(ensureBytes('point', bytes), zip215);\n }\n\n get x(): bigint {\n return this.toAffine().x;\n }\n get y(): bigint {\n return this.toAffine().y;\n }\n\n precompute(windowSize: number = 8, isLazy = true) {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_2n); // random number\n return this;\n }\n\n // Useful in fromAffine() - not for fromBytes(), which always created valid points.\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n // Compare one point to another.\n equals(other: Point): boolean {\n aextpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const X1Z2 = modP(X1 * Z2);\n const X2Z1 = modP(X2 * Z1);\n const Y1Z2 = modP(Y1 * Z2);\n const Y2Z1 = modP(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n negate(): Point {\n // Flips point sign to a negative one (-x, y in affine coords)\n return new Point(modP(-this.X), this.Y, this.Z, modP(-this.T));\n }\n\n // Fast algo for doubling Extended Point.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n // Cost: 4M + 4S + 1*a + 6add + 1*2.\n double(): Point {\n const { a } = CURVE;\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const A = modP(X1 * X1); // A = X12\n const B = modP(Y1 * Y1); // B = Y12\n const C = modP(_2n * modP(Z1 * Z1)); // C = 2*Z12\n const D = modP(a * A); // D = a*A\n const x1y1 = X1 + Y1;\n const E = modP(modP(x1y1 * x1y1) - A - B); // E = (X1+Y1)2-A-B\n const G = D + B; // G = D+B\n const F = G - C; // F = G-C\n const H = D - B; // H = D-B\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n\n // Fast algo for adding 2 Extended Points.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd\n // Cost: 9M + 1*a + 1*d + 7add.\n add(other: Point) {\n aextpoint(other);\n const { a, d } = CURVE;\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = other;\n const A = modP(X1 * X2); // A = X1*X2\n const B = modP(Y1 * Y2); // B = Y1*Y2\n const C = modP(T1 * d * T2); // C = T1*d*T2\n const D = modP(Z1 * Z2); // D = Z1*Z2\n const E = modP((X1 + Y1) * (X2 + Y2) - A - B); // E = (X1+Y1)*(X2+Y2)-A-B\n const F = D - C; // F = D-C\n const G = D + C; // G = D+C\n const H = modP(B - a * A); // H = B-a*A\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n\n subtract(other: Point): Point {\n return this.add(other.negate());\n }\n\n // Constant-time multiplication.\n multiply(scalar: bigint): Point {\n // 1 <= scalar < L\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: expected 1 <= sc < curve.n');\n const { p, f } = wnaf.cached(this, scalar, (p) => normalizeZ(Point, p));\n return normalizeZ(Point, [p, f])[0];\n }\n\n // Non-constant-time multiplication. Uses double-and-add algorithm.\n // It's faster, but should only be used when you don't care about\n // an exposed private key e.g. sig verification.\n // Does NOT allow scalars higher than CURVE.n.\n // Accepts optional accumulator to merge with multiply (important for sparse scalars)\n multiplyUnsafe(scalar: bigint, acc = Point.ZERO): Point {\n // 0 <= scalar < L\n if (!Fn.isValid(scalar)) throw new Error('invalid scalar: expected 0 <= sc < curve.n');\n if (scalar === _0n) return Point.ZERO;\n if (this.is0() || scalar === _1n) return this;\n return wnaf.unsafe(this, scalar, (p) => normalizeZ(Point, p), acc);\n }\n\n // Checks if point is of small order.\n // If you add something to small order point, you will have \"dirty\"\n // point with torsion component.\n // Multiplies point by cofactor and checks if the result is 0.\n isSmallOrder(): boolean {\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n // Multiplies point by curve order and checks if the result is 0.\n // Returns `false` is the point is dirty.\n isTorsionFree(): boolean {\n return wnaf.unsafe(this, CURVE.n).is0();\n }\n\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n toAffine(invertedZ?: bigint): AffinePoint<bigint> {\n return toAffineMemo(this, invertedZ);\n }\n\n clearCofactor(): Point {\n if (cofactor === _1n) return this;\n return this.multiplyUnsafe(cofactor);\n }\n\n toBytes(): Uint8Array {\n const { x, y } = this.toAffine();\n // Fp.toBytes() allows non-canonical encoding of y (>= p).\n const bytes = Fp.toBytes(y);\n // Each y has 2 valid points: (x, y), (x,-y).\n // When compressing, it's enough to store y and use the last byte to encode sign of x\n bytes[bytes.length - 1] |= x & _1n ? 0x80 : 0;\n return bytes;\n }\n toHex(): string {\n return bytesToHex(this.toBytes());\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n\n // TODO: remove\n get ex(): bigint {\n return this.X;\n }\n get ey(): bigint {\n return this.Y;\n }\n get ez(): bigint {\n return this.Z;\n }\n get et(): bigint {\n return this.T;\n }\n static normalizeZ(points: Point[]): Point[] {\n return normalizeZ(Point, points);\n }\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n _setWindowSize(windowSize: number) {\n this.precompute(windowSize);\n }\n toRawBytes(): Uint8Array {\n return this.toBytes();\n }\n }\n const wnaf = new wNAF(Point, Fn.BITS);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/**\n * Base class for prime-order points like Ristretto255 and Decaf448.\n * These points eliminate cofactor issues by representing equivalence classes\n * of Edwards curve points.\n */\nexport abstract class PrimeEdwardsPoint<T extends PrimeEdwardsPoint<T>>\n implements CurvePoint<bigint, T>\n{\n static BASE: PrimeEdwardsPoint<any>;\n static ZERO: PrimeEdwardsPoint<any>;\n static Fp: IField<bigint>;\n static Fn: IField<bigint>;\n\n protected readonly ep: EdwardsPoint;\n\n constructor(ep: EdwardsPoint) {\n this.ep = ep;\n }\n\n // Abstract methods that must be implemented by subclasses\n abstract toBytes(): Uint8Array;\n abstract equals(other: T): boolean;\n\n // Static methods that must be implemented by subclasses\n static fromBytes(_bytes: Uint8Array): any {\n notImplemented();\n }\n\n static fromHex(_hex: Hex): any {\n notImplemented();\n }\n\n get x(): bigint {\n return this.toAffine().x;\n }\n get y(): bigint {\n return this.toAffine().y;\n }\n\n // Common implementations\n clearCofactor(): T {\n // no-op for prime-order groups\n return this as any;\n }\n\n assertValidity(): void {\n this.ep.assertValidity();\n }\n\n toAffine(invertedZ?: bigint): AffinePoint<bigint> {\n return this.ep.toAffine(invertedZ);\n }\n\n toHex(): string {\n return bytesToHex(this.toBytes());\n }\n\n toString(): string {\n return this.toHex();\n }\n\n isTorsionFree(): boolean {\n return true;\n }\n\n isSmallOrder(): boolean {\n return false;\n }\n\n add(other: T): T {\n this.assertSame(other);\n return this.init(this.ep.add(other.ep));\n }\n\n subtract(other: T): T {\n this.assertSame(other);\n return this.init(this.ep.subtract(other.ep));\n }\n\n multiply(scalar: bigint): T {\n return this.init(this.ep.multiply(scalar));\n }\n\n multiplyUnsafe(scalar: bigint): T {\n return this.init(this.ep.multiplyUnsafe(scalar));\n }\n\n double(): T {\n return this.init(this.ep.double());\n }\n\n negate(): T {\n return this.init(this.ep.negate());\n }\n\n precompute(windowSize?: number, isLazy?: boolean): T {\n return this.init(this.ep.precompute(windowSize, isLazy));\n }\n\n // Helper methods\n abstract is0(): boolean;\n protected abstract assertSame(other: T): void;\n protected abstract init(ep: EdwardsPoint): T;\n\n /** @deprecated use `toBytes` */\n toRawBytes(): Uint8Array {\n return this.toBytes();\n }\n}\n\n/**\n * Initializes EdDSA signatures over given Edwards curve.\n */\nexport function eddsa(Point: EdwardsPointCons, cHash: FHash, eddsaOpts: EdDSAOpts = {}): EdDSA {\n if (typeof cHash !== 'function') throw new Error('\"hash\" function param is required');\n _validateObject(\n eddsaOpts,\n {},\n {\n adjustScalarBytes: 'function',\n randomBytes: 'function',\n domain: 'function',\n prehash: 'function',\n mapToCurve: 'function',\n }\n );\n\n const { prehash } = eddsaOpts;\n const { BASE, Fp, Fn } = Point;\n\n const randomBytes = eddsaOpts.randomBytes || randomBytesWeb;\n const adjustScalarBytes = eddsaOpts.adjustScalarBytes || ((bytes: Uint8Array) => bytes);\n const domain =\n eddsaOpts.domain ||\n ((data: Uint8Array, ctx: Uint8Array, phflag: boolean) => {\n abool(phflag, 'phflag');\n if (ctx.length || phflag) throw new Error('Contexts/pre-hash are not supported');\n return data;\n }); // NOOP\n\n // Little-endian SHA512 with modulo n\n function modN_LE(hash: Uint8Array): bigint {\n return Fn.create(bytesToNumberLE(hash)); // Not Fn.fromBytes: it has length limit\n }\n\n // Get the hashed private scalar per RFC8032 5.1.5\n function getPrivateScalar(key: Hex) {\n const len = lengths.secretKey;\n key = ensureBytes('private key', key, len);\n // Hash private key with curve's hash function to produce uniformingly random input\n // Check byte lengths: ensure(64, h(ensure(32, key)))\n const hashed = ensureBytes('hashed private key', cHash(key), 2 * len);\n const head = adjustScalarBytes(hashed.slice(0, len)); // clear first half bits, produce FE\n const prefix = hashed.slice(len, 2 * len); // second half is called key prefix (5.1.6)\n const scalar = modN_LE(head); // The actual private scalar\n return { head, prefix, scalar };\n }\n\n /** Convenience method that creates public key from scalar. RFC8032 5.1.5 */\n function getExtendedPublicKey(secretKey: Hex) {\n const { head, prefix, scalar } = getPrivateScalar(secretKey);\n const point = BASE.multiply(scalar); // Point on Edwards curve aka public key\n const pointBytes = point.toBytes();\n return { head, prefix, scalar, point, pointBytes };\n }\n\n /** Calculates EdDSA pub key. RFC8032 5.1.5. */\n function getPublicKey(secretKey: Hex): Uint8Array {\n return getExtendedPublicKey(secretKey).pointBytes;\n }\n\n // int('LE', SHA512(dom2(F, C) || msgs)) mod N\n function hashDomainToScalar(context: Hex = Uint8Array.of(), ...msgs: Uint8Array[]) {\n const msg = concatBytes(...msgs);\n return modN_LE(cHash(domain(msg, ensureBytes('context', context), !!prehash)));\n }\n\n /** Signs message with privateKey. RFC8032 5.1.6 */\n function sign(msg: Hex, secretKey: Hex, options: { context?: Hex } = {}): Uint8Array {\n msg = ensureBytes('message', msg);\n if (prehash) msg = prehash(msg); // for ed25519ph etc.\n const { prefix, scalar, pointBytes } = getExtendedPublicKey(secretKey);\n const r = hashDomainToScalar(options.context, prefix, msg); // r = dom2(F, C) || prefix || PH(M)\n const R = BASE.multiply(r).toBytes(); // R = rG\n const k = hashDomainToScalar(options.context, R, pointBytes, msg); // R || A || PH(M)\n const s = Fn.create(r + k * scalar); // S = (r + k * s) mod L\n if (!Fn.isValid(s)) throw new Error('sign failed: invalid s'); // 0 <= s < L\n const rs = concatBytes(R, Fn.toBytes(s));\n return abytes(rs, lengths.signature, 'result');\n }\n\n // verification rule is either zip215 or rfc8032 / nist186-5. Consult fromHex:\n const verifyOpts: { context?: Hex; zip215?: boolean } = { zip215: true };\n\n /**\n * Verifies EdDSA signature against message and public key. RFC8032 5.1.7.\n * An extended group equation is checked.\n */\n function verify(sig: Hex, msg: Hex, publicKey: Hex, options = verifyOpts): boolean {\n const { context, zip215 } = options;\n const len = lengths.signature;\n sig = ensureBytes('signature', sig, len);\n msg = ensureBytes('message', msg);\n publicKey = ensureBytes('publicKey', publicKey, lengths.publicKey);\n if (zip215 !== undefined) abool(zip215, 'zip215');\n if (prehash) msg = prehash(msg); // for ed25519ph, etc\n\n const mid = len / 2;\n const r = sig.subarray(0, mid);\n const s = bytesToNumberLE(sig.subarray(mid, len));\n let A, R, SB;\n try {\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n A = Point.fromBytes(publicKey, zip215);\n R = Point.fromBytes(r, zip215);\n SB = BASE.multiplyUnsafe(s); // 0 <= s < l is done inside\n } catch (error) {\n return false;\n }\n if (!zip215 && A.isSmallOrder()) return false; // zip215 allows public keys of small order\n\n const k = hashDomainToScalar(context, R.toBytes(), A.toBytes(), msg);\n const RkA = R.add(A.multiplyUnsafe(k));\n // Extended group equation\n // [8][S]B = [8]R + [8][k]A'\n return RkA.subtract(SB).clearCofactor().is0();\n }\n\n const _size = Fp.BYTES; // 32 for ed25519, 57 for ed448\n const lengths = {\n secretKey: _size,\n publicKey: _size,\n signature: 2 * _size,\n seed: _size,\n };\n function randomSecretKey(seed = randomBytes(lengths.seed)): Uint8Array {\n return abytes(seed, lengths.seed, 'seed');\n }\n function keygen(seed?: Uint8Array) {\n const secretKey = utils.randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n }\n function isValidSecretKey(key: Uint8Array): boolean {\n return isBytes(key) && key.length === Fn.BYTES;\n }\n function isValidPublicKey(key: Uint8Array, zip215?: boolean): boolean {\n try {\n return !!Point.fromBytes(key, zip215);\n } catch (error) {\n return false;\n }\n }\n\n const utils = {\n getExtendedPublicKey,\n randomSecretKey,\n isValidSecretKey,\n isValidPublicKey,\n /**\n * Converts ed public key to x public key. Uses formula:\n * - ed25519:\n * - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)`\n * - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))`\n * - ed448:\n * - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)`\n * - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))`\n */\n toMontgomery(publicKey: Uint8Array): Uint8Array {\n const { y } = Point.fromBytes(publicKey);\n const size = lengths.publicKey;\n const is25519 = size === 32;\n if (!is25519 && size !== 57) throw new Error('only defined for 25519 and 448');\n const u = is25519 ? Fp.div(_1n + y, _1n - y) : Fp.div(y - _1n, y + _1n);\n return Fp.toBytes(u);\n },\n\n toMontgomerySecret(secretKey: Uint8Array): Uint8Array {\n const size = lengths.secretKey;\n abytes(secretKey, size);\n const hashed = cHash(secretKey.subarray(0, size));\n return adjustScalarBytes(hashed).subarray(0, size);\n },\n\n /** @deprecated */\n randomPrivateKey: randomSecretKey,\n /** @deprecated */\n precompute(windowSize = 8, point: EdwardsPoint = Point.BASE): EdwardsPoint {\n return point.precompute(windowSize, false);\n },\n };\n\n return Object.freeze({\n keygen,\n getPublicKey,\n sign,\n verify,\n utils,\n Point,\n lengths,\n });\n}\n\n// TODO: remove everything below\nexport type CurveType = BasicCurve<bigint> & {\n a: bigint; // curve param a\n d: bigint; // curve param d\n /** @deprecated the property will be removed in next release */\n hash: FHash; // Hashing\n randomBytes?: (bytesLength?: number) => Uint8Array; // CSPRNG\n adjustScalarBytes?: (bytes: Uint8Array) => Uint8Array; // clears bits to get valid field elemtn\n domain?: (data: Uint8Array, ctx: Uint8Array, phflag: boolean) => Uint8Array; // Used for hashing\n uvRatio?: UVRatio; // Ratio √(u/v)\n prehash?: FHash; // RFC 8032 pre-hashing of messages to sign() / verify()\n mapToCurve?: (scalar: bigint[]) => AffinePoint<bigint>; // for hash-to-curve standard\n};\nexport type CurveTypeWithLength = Readonly<CurveType & Partial<NLength>>;\nexport type CurveFn = {\n /** @deprecated the property will be removed in next release */\n CURVE: CurveType;\n keygen: EdDSA['keygen'];\n getPublicKey: EdDSA['getPublicKey'];\n sign: EdDSA['sign'];\n verify: EdDSA['verify'];\n Point: EdwardsPointCons;\n /** @deprecated use `Point` */\n ExtendedPoint: EdwardsPointCons;\n utils: EdDSA['utils'];\n lengths: CurveLengths;\n};\nexport type EdComposed = {\n CURVE: EdwardsOpts;\n curveOpts: EdwardsExtraOpts;\n hash: FHash;\n eddsaOpts: EdDSAOpts;\n};\nfunction _eddsa_legacy_opts_to_new(c: CurveTypeWithLength): EdComposed {\n const CURVE: EdwardsOpts = {\n a: c.a,\n d: c.d,\n p: c.Fp.ORDER,\n n: c.n,\n h: c.h,\n Gx: c.Gx,\n Gy: c.Gy,\n };\n const Fp = c.Fp;\n const Fn = Field(CURVE.n, c.nBitLength, true);\n const curveOpts: EdwardsExtraOpts = { Fp, Fn, uvRatio: c.uvRatio };\n const eddsaOpts: EdDSAOpts = {\n randomBytes: c.randomBytes,\n adjustScalarBytes: c.adjustScalarBytes,\n domain: c.domain,\n prehash: c.prehash,\n mapToCurve: c.mapToCurve,\n };\n return { CURVE, curveOpts, hash: c.hash, eddsaOpts };\n}\nfunction _eddsa_new_output_to_legacy(c: CurveTypeWithLength, eddsa: EdDSA): CurveFn {\n const Point = eddsa.Point;\n const legacy = Object.assign({}, eddsa, {\n ExtendedPoint: Point,\n CURVE: c,\n nBitLength: Point.Fn.BITS,\n nByteLength: Point.Fn.BYTES,\n });\n return legacy;\n}\n// TODO: remove. Use eddsa\nexport function twistedEdwards(c: CurveTypeWithLength): CurveFn {\n const { CURVE, curveOpts, hash, eddsaOpts } = _eddsa_legacy_opts_to_new(c);\n const Point = edwards(CURVE, curveOpts);\n const EDDSA = eddsa(Point, hash, eddsaOpts);\n return _eddsa_new_output_to_legacy(c, EDDSA);\n}\n","/**\n * Montgomery curve methods. It's not really whole montgomery curve,\n * just bunch of very specific methods for X25519 / X448 from\n * [RFC 7748](https://www.rfc-editor.org/rfc/rfc7748)\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n _validateObject,\n abytes,\n aInRange,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesLE,\n randomBytes,\n} from '../utils.ts';\nimport type { CurveLengths } from './curve.ts';\nimport { mod } from './modular.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\ntype Hex = string | Uint8Array;\n\nexport type CurveType = {\n P: bigint; // finite field prime\n type: 'x25519' | 'x448';\n adjustScalarBytes: (bytes: Uint8Array) => Uint8Array;\n powPminus2: (x: bigint) => bigint;\n randomBytes?: (bytesLength?: number) => Uint8Array;\n};\n\nexport type MontgomeryECDH = {\n scalarMult: (scalar: Hex, u: Hex) => Uint8Array;\n scalarMultBase: (scalar: Hex) => Uint8Array;\n getSharedSecret: (secretKeyA: Hex, publicKeyB: Hex) => Uint8Array;\n getPublicKey: (secretKey: Hex) => Uint8Array;\n utils: {\n randomSecretKey: () => Uint8Array;\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: () => Uint8Array;\n };\n GuBytes: Uint8Array;\n lengths: CurveLengths;\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n};\nexport type CurveFn = MontgomeryECDH;\n\nfunction validateOpts(curve: CurveType) {\n _validateObject(curve, {\n adjustScalarBytes: 'function',\n powPminus2: 'function',\n });\n return Object.freeze({ ...curve } as const);\n}\n\nexport function montgomery(curveDef: CurveType): MontgomeryECDH {\n const CURVE = validateOpts(curveDef);\n const { P, type, adjustScalarBytes, powPminus2, randomBytes: rand } = CURVE;\n const is25519 = type === 'x25519';\n if (!is25519 && type !== 'x448') throw new Error('invalid type');\n const randomBytes_ = rand || randomBytes;\n\n const montgomeryBits = is25519 ? 255 : 448;\n const fieldLen = is25519 ? 32 : 56;\n const Gu = is25519 ? BigInt(9) : BigInt(5);\n // RFC 7748 #5:\n // The constant a24 is (486662 - 2) / 4 = 121665 for curve25519/X25519 and\n // (156326 - 2) / 4 = 39081 for curve448/X448\n // const a = is25519 ? 156326n : 486662n;\n const a24 = is25519 ? BigInt(121665) : BigInt(39081);\n // RFC: x25519 \"the resulting integer is of the form 2^254 plus\n // eight times a value between 0 and 2^251 - 1 (inclusive)\"\n // x448: \"2^447 plus four times a value between 0 and 2^445 - 1 (inclusive)\"\n const minScalar = is25519 ? _2n ** BigInt(254) : _2n ** BigInt(447);\n const maxAdded = is25519\n ? BigInt(8) * _2n ** BigInt(251) - _1n\n : BigInt(4) * _2n ** BigInt(445) - _1n;\n const maxScalar = minScalar + maxAdded + _1n; // (inclusive)\n const modP = (n: bigint) => mod(n, P);\n const GuBytes = encodeU(Gu);\n function encodeU(u: bigint): Uint8Array {\n return numberToBytesLE(modP(u), fieldLen);\n }\n function decodeU(u: Hex): bigint {\n const _u = ensureBytes('u coordinate', u, fieldLen);\n // RFC: When receiving such an array, implementations of X25519\n // (but not X448) MUST mask the most significant bit in the final byte.\n if (is25519) _u[31] &= 127; // 0b0111_1111\n // RFC: Implementations MUST accept non-canonical values and process them as\n // if they had been reduced modulo the field prime. The non-canonical\n // values are 2^255 - 19 through 2^255 - 1 for X25519 and 2^448 - 2^224\n // - 1 through 2^448 - 1 for X448.\n return modP(bytesToNumberLE(_u));\n }\n function decodeScalar(scalar: Hex): bigint {\n return bytesToNumberLE(adjustScalarBytes(ensureBytes('scalar', scalar, fieldLen)));\n }\n function scalarMult(scalar: Hex, u: Hex): Uint8Array {\n const pu = montgomeryLadder(decodeU(u), decodeScalar(scalar));\n // Some public keys are useless, of low-order. Curve author doesn't think\n // it needs to be validated, but we do it nonetheless.\n // https://cr.yp.to/ecdh.html#validate\n if (pu === _0n) throw new Error('invalid private or public key received');\n return encodeU(pu);\n }\n // Computes public key from private. By doing scalar multiplication of base point.\n function scalarMultBase(scalar: Hex): Uint8Array {\n return scalarMult(scalar, GuBytes);\n }\n\n // cswap from RFC7748 \"example code\"\n function cswap(swap: bigint, x_2: bigint, x_3: bigint): { x_2: bigint; x_3: bigint } {\n // dummy = mask(swap) AND (x_2 XOR x_3)\n // Where mask(swap) is the all-1 or all-0 word of the same length as x_2\n // and x_3, computed, e.g., as mask(swap) = 0 - swap.\n const dummy = modP(swap * (x_2 - x_3));\n x_2 = modP(x_2 - dummy); // x_2 = x_2 XOR dummy\n x_3 = modP(x_3 + dummy); // x_3 = x_3 XOR dummy\n return { x_2, x_3 };\n }\n\n /**\n * Montgomery x-only multiplication ladder.\n * @param pointU u coordinate (x) on Montgomery Curve 25519\n * @param scalar by which the point would be multiplied\n * @returns new Point on Montgomery curve\n */\n function montgomeryLadder(u: bigint, scalar: bigint): bigint {\n aInRange('u', u, _0n, P);\n aInRange('scalar', scalar, minScalar, maxScalar);\n const k = scalar;\n const x_1 = u;\n let x_2 = _1n;\n let z_2 = _0n;\n let x_3 = u;\n let z_3 = _1n;\n let swap = _0n;\n for (let t = BigInt(montgomeryBits - 1); t >= _0n; t--) {\n const k_t = (k >> t) & _1n;\n swap ^= k_t;\n ({ x_2, x_3 } = cswap(swap, x_2, x_3));\n ({ x_2: z_2, x_3: z_3 } = cswap(swap, z_2, z_3));\n swap = k_t;\n\n const A = x_2 + z_2;\n const AA = modP(A * A);\n const B = x_2 - z_2;\n const BB = modP(B * B);\n const E = AA - BB;\n const C = x_3 + z_3;\n const D = x_3 - z_3;\n const DA = modP(D * A);\n const CB = modP(C * B);\n const dacb = DA + CB;\n const da_cb = DA - CB;\n x_3 = modP(dacb * dacb);\n z_3 = modP(x_1 * modP(da_cb * da_cb));\n x_2 = modP(AA * BB);\n z_2 = modP(E * (AA + modP(a24 * E)));\n }\n ({ x_2, x_3 } = cswap(swap, x_2, x_3));\n ({ x_2: z_2, x_3: z_3 } = cswap(swap, z_2, z_3));\n const z2 = powPminus2(z_2); // `Fp.pow(x, P - _2n)` is much slower equivalent\n return modP(x_2 * z2); // Return x_2 * (z_2^(p - 2))\n }\n const lengths = {\n secretKey: fieldLen,\n publicKey: fieldLen,\n seed: fieldLen,\n };\n const randomSecretKey = (seed = randomBytes_(fieldLen)) => {\n abytes(seed, lengths.seed);\n return seed;\n };\n function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: scalarMultBase(secretKey) };\n }\n const utils = {\n randomSecretKey,\n randomPrivateKey: randomSecretKey,\n };\n return {\n keygen,\n getSharedSecret: (secretKey: Hex, publicKey: Hex) => scalarMult(secretKey, publicKey),\n getPublicKey: (secretKey: Hex): Uint8Array => scalarMultBase(secretKey),\n scalarMult,\n scalarMultBase,\n utils,\n GuBytes: GuBytes.slice(),\n lengths,\n };\n}\n","/**\n * ed25519 Twisted Edwards curve with following addons:\n * - X25519 ECDH\n * - Ristretto cofactor elimination\n * - Elligator hash-to-group / point indistinguishability\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, concatBytes, utf8ToBytes } from '@noble/hashes/utils.js';\nimport { pippenger, type AffinePoint } from './abstract/curve.ts';\nimport {\n PrimeEdwardsPoint,\n twistedEdwards,\n type CurveFn,\n type EdwardsOpts,\n type EdwardsPoint,\n} from './abstract/edwards.ts';\nimport {\n _DST_scalar,\n createHasher,\n expand_message_xmd,\n type H2CHasher,\n type H2CHasherBase,\n type H2CMethod,\n type htfBasicOpts,\n} from './abstract/hash-to-curve.ts';\nimport {\n Field,\n FpInvertBatch,\n FpSqrtEven,\n isNegativeLE,\n mod,\n pow2,\n type IField,\n} from './abstract/modular.ts';\nimport { montgomery, type MontgomeryECDH as XCurveFn } from './abstract/montgomery.ts';\nimport { bytesToNumberLE, ensureBytes, equalBytes, type Hex } from './utils.ts';\n\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3);\n// prettier-ignore\nconst _5n = BigInt(5), _8n = BigInt(8);\n\n// P = 2n**255n-19n\nconst ed25519_CURVE_p = BigInt(\n '0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed'\n);\n\n// N = 2n**252n + 27742317777372353535851937790883648493n\n// a = Fp.create(BigInt(-1))\n// d = -121665/121666 a.k.a. Fp.neg(121665 * Fp.inv(121666))\nconst ed25519_CURVE: EdwardsOpts = /* @__PURE__ */ (() => ({\n p: ed25519_CURVE_p,\n n: BigInt('0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed'),\n h: _8n,\n a: BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec'),\n d: BigInt('0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3'),\n Gx: BigInt('0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a'),\n Gy: BigInt('0x6666666666666666666666666666666666666666666666666666666666666658'),\n}))();\n\nfunction ed25519_pow_2_252_3(x: bigint) {\n // prettier-ignore\n const _10n = BigInt(10), _20n = BigInt(20), _40n = BigInt(40), _80n = BigInt(80);\n const P = ed25519_CURVE_p;\n const x2 = (x * x) % P;\n const b2 = (x2 * x) % P; // x^3, 11\n const b4 = (pow2(b2, _2n, P) * b2) % P; // x^15, 1111\n const b5 = (pow2(b4, _1n, P) * x) % P; // x^31\n const b10 = (pow2(b5, _5n, P) * b5) % P;\n const b20 = (pow2(b10, _10n, P) * b10) % P;\n const b40 = (pow2(b20, _20n, P) * b20) % P;\n const b80 = (pow2(b40, _40n, P) * b40) % P;\n const b160 = (pow2(b80, _80n, P) * b80) % P;\n const b240 = (pow2(b160, _80n, P) * b80) % P;\n const b250 = (pow2(b240, _10n, P) * b10) % P;\n const pow_p_5_8 = (pow2(b250, _2n, P) * x) % P;\n // ^ To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n}\n\nfunction adjustScalarBytes(bytes: Uint8Array): Uint8Array {\n // Section 5: For X25519, in order to decode 32 random bytes as an integer scalar,\n // set the three least significant bits of the first byte\n bytes[0] &= 248; // 0b1111_1000\n // and the most significant bit of the last to zero,\n bytes[31] &= 127; // 0b0111_1111\n // set the second most significant bit of the last byte to 1\n bytes[31] |= 64; // 0b0100_0000\n return bytes;\n}\n\n// √(-1) aka √(a) aka 2^((p-1)/4)\n// Fp.sqrt(Fp.neg(1))\nconst ED25519_SQRT_M1 = /* @__PURE__ */ BigInt(\n '19681161376707505956807079304988542015446066515923890162744021073123829784752'\n);\n// sqrt(u/v)\nfunction uvRatio(u: bigint, v: bigint): { isValid: boolean; value: bigint } {\n const P = ed25519_CURVE_p;\n const v3 = mod(v * v * v, P); // v³\n const v7 = mod(v3 * v3 * v, P); // v⁷\n // (p+3)/8 and (p-5)/8\n const pow = ed25519_pow_2_252_3(u * v7).pow_p_5_8;\n let x = mod(u * v3 * pow, P); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x, P); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * ED25519_SQRT_M1, P); // Second root candidate\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u, P); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * ED25519_SQRT_M1, P); // There is no valid root, vx² = -u√(-1)\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if (isNegativeLE(x, P)) x = mod(-x, P);\n return { isValid: useRoot1 || useRoot2, value: x };\n}\n\nconst Fp = /* @__PURE__ */ (() => Field(ed25519_CURVE.p, { isLE: true }))();\nconst Fn = /* @__PURE__ */ (() => Field(ed25519_CURVE.n, { isLE: true }))();\n\nconst ed25519Defaults = /* @__PURE__ */ (() => ({\n ...ed25519_CURVE,\n Fp,\n hash: sha512,\n adjustScalarBytes,\n // dom2\n // Ratio of u to v. Allows us to combine inversion and square root. Uses algo from RFC8032 5.1.3.\n // Constant-time, u/√v\n uvRatio,\n}))();\n\n/**\n * ed25519 curve with EdDSA signatures.\n * @example\n * import { ed25519 } from '@noble/curves/ed25519';\n * const { secretKey, publicKey } = ed25519.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = ed25519.sign(msg, priv);\n * ed25519.verify(sig, msg, pub); // Default mode: follows ZIP215\n * ed25519.verify(sig, msg, pub, { zip215: false }); // RFC8032 / FIPS 186-5\n */\nexport const ed25519: CurveFn = /* @__PURE__ */ (() => twistedEdwards(ed25519Defaults))();\n\nfunction ed25519_domain(data: Uint8Array, ctx: Uint8Array, phflag: boolean) {\n if (ctx.length > 255) throw new Error('Context is too big');\n return concatBytes(\n utf8ToBytes('SigEd25519 no Ed25519 collisions'),\n new Uint8Array([phflag ? 1 : 0, ctx.length]),\n ctx,\n data\n );\n}\n\n/** Context of ed25519. Uses context for domain separation. */\nexport const ed25519ctx: CurveFn = /* @__PURE__ */ (() =>\n twistedEdwards({\n ...ed25519Defaults,\n domain: ed25519_domain,\n }))();\n\n/** Prehashed version of ed25519. Accepts already-hashed messages in sign() and verify(). */\nexport const ed25519ph: CurveFn = /* @__PURE__ */ (() =>\n twistedEdwards(\n Object.assign({}, ed25519Defaults, {\n domain: ed25519_domain,\n prehash: sha512,\n })\n ))();\n\n/**\n * ECDH using curve25519 aka x25519.\n * @example\n * import { x25519 } from '@noble/curves/ed25519';\n * const priv = 'a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4';\n * const pub = 'e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c';\n * x25519.getSharedSecret(priv, pub) === x25519.scalarMult(priv, pub); // aliases\n * x25519.getPublicKey(priv) === x25519.scalarMultBase(priv);\n * x25519.getPublicKey(x25519.utils.randomSecretKey());\n */\nexport const x25519: XCurveFn = /* @__PURE__ */ (() => {\n const P = Fp.ORDER;\n return montgomery({\n P,\n type: 'x25519',\n powPminus2: (x: bigint): bigint => {\n // x^(p-2) aka x^(2^255-21)\n const { pow_p_5_8, b2 } = ed25519_pow_2_252_3(x);\n return mod(pow2(pow_p_5_8, _3n, P) * b2, P);\n },\n adjustScalarBytes,\n });\n})();\n\n// Hash To Curve Elligator2 Map (NOTE: different from ristretto255 elligator)\n// NOTE: very important part is usage of FpSqrtEven for ELL2_C1_EDWARDS, since\n// SageMath returns different root first and everything falls apart\nconst ELL2_C1 = /* @__PURE__ */ (() => (ed25519_CURVE_p + _3n) / _8n)(); // 1. c1 = (q + 3) / 8 # Integer arithmetic\nconst ELL2_C2 = /* @__PURE__ */ (() => Fp.pow(_2n, ELL2_C1))(); // 2. c2 = 2^c1\nconst ELL2_C3 = /* @__PURE__ */ (() => Fp.sqrt(Fp.neg(Fp.ONE)))(); // 3. c3 = sqrt(-1)\n\n// prettier-ignore\nfunction map_to_curve_elligator2_curve25519(u: bigint) {\n const ELL2_C4 = (ed25519_CURVE_p - _5n) / _8n; // 4. c4 = (q - 5) / 8 # Integer arithmetic\n const ELL2_J = BigInt(486662);\n\n let tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, _2n); // 2. tv1 = 2 * tv1\n let xd = Fp.add(tv1, Fp.ONE); // 3. xd = tv1 + 1 # Nonzero: -1 is square (mod p), tv1 is not\n let x1n = Fp.neg(ELL2_J); // 4. x1n = -J # x1 = x1n / xd = -J / (1 + 2 * u^2)\n let tv2 = Fp.sqr(xd); // 5. tv2 = xd^2\n let gxd = Fp.mul(tv2, xd); // 6. gxd = tv2 * xd # gxd = xd^3\n let gx1 = Fp.mul(tv1, ELL2_J);// 7. gx1 = J * tv1 # x1n + J * xd\n gx1 = Fp.mul(gx1, x1n); // 8. gx1 = gx1 * x1n # x1n^2 + J * x1n * xd\n gx1 = Fp.add(gx1, tv2); // 9. gx1 = gx1 + tv2 # x1n^2 + J * x1n * xd + xd^2\n gx1 = Fp.mul(gx1, x1n); // 10. gx1 = gx1 * x1n # x1n^3 + J * x1n^2 * xd + x1n * xd^2\n let tv3 = Fp.sqr(gxd); // 11. tv3 = gxd^2\n tv2 = Fp.sqr(tv3); // 12. tv2 = tv3^2 # gxd^4\n tv3 = Fp.mul(tv3, gxd); // 13. tv3 = tv3 * gxd # gxd^3\n tv3 = Fp.mul(tv3, gx1); // 14. tv3 = tv3 * gx1 # gx1 * gxd^3\n tv2 = Fp.mul(tv2, tv3); // 15. tv2 = tv2 * tv3 # gx1 * gxd^7\n let y11 = Fp.pow(tv2, ELL2_C4); // 16. y11 = tv2^c4 # (gx1 * gxd^7)^((p - 5) / 8)\n y11 = Fp.mul(y11, tv3); // 17. y11 = y11 * tv3 # gx1*gxd^3*(gx1*gxd^7)^((p-5)/8)\n let y12 = Fp.mul(y11, ELL2_C3); // 18. y12 = y11 * c3\n tv2 = Fp.sqr(y11); // 19. tv2 = y11^2\n tv2 = Fp.mul(tv2, gxd); // 20. tv2 = tv2 * gxd\n let e1 = Fp.eql(tv2, gx1); // 21. e1 = tv2 == gx1\n let y1 = Fp.cmov(y12, y11, e1); // 22. y1 = CMOV(y12, y11, e1) # If g(x1) is square, this is its sqrt\n let x2n = Fp.mul(x1n, tv1); // 23. x2n = x1n * tv1 # x2 = x2n / xd = 2 * u^2 * x1n / xd\n let y21 = Fp.mul(y11, u); // 24. y21 = y11 * u\n y21 = Fp.mul(y21, ELL2_C2); // 25. y21 = y21 * c2\n let y22 = Fp.mul(y21, ELL2_C3); // 26. y22 = y21 * c3\n let gx2 = Fp.mul(gx1, tv1); // 27. gx2 = gx1 * tv1 # g(x2) = gx2 / gxd = 2 * u^2 * g(x1)\n tv2 = Fp.sqr(y21); // 28. tv2 = y21^2\n tv2 = Fp.mul(tv2, gxd); // 29. tv2 = tv2 * gxd\n let e2 = Fp.eql(tv2, gx2); // 30. e2 = tv2 == gx2\n let y2 = Fp.cmov(y22, y21, e2); // 31. y2 = CMOV(y22, y21, e2) # If g(x2) is square, this is its sqrt\n tv2 = Fp.sqr(y1); // 32. tv2 = y1^2\n tv2 = Fp.mul(tv2, gxd); // 33. tv2 = tv2 * gxd\n let e3 = Fp.eql(tv2, gx1); // 34. e3 = tv2 == gx1\n let xn = Fp.cmov(x2n, x1n, e3); // 35. xn = CMOV(x2n, x1n, e3) # If e3, x = x1, else x = x2\n let y = Fp.cmov(y2, y1, e3); // 36. y = CMOV(y2, y1, e3) # If e3, y = y1, else y = y2\n let e4 = Fp.isOdd!(y); // 37. e4 = sgn0(y) == 1 # Fix sign of y\n y = Fp.cmov(y, Fp.neg(y), e3 !== e4); // 38. y = CMOV(y, -y, e3 XOR e4)\n return { xMn: xn, xMd: xd, yMn: y, yMd: _1n }; // 39. return (xn, xd, y, 1)\n}\n\nconst ELL2_C1_EDWARDS = /* @__PURE__ */ (() => FpSqrtEven(Fp, Fp.neg(BigInt(486664))))(); // sgn0(c1) MUST equal 0\nfunction map_to_curve_elligator2_edwards25519(u: bigint) {\n const { xMn, xMd, yMn, yMd } = map_to_curve_elligator2_curve25519(u); // 1. (xMn, xMd, yMn, yMd) =\n // map_to_curve_elligator2_curve25519(u)\n let xn = Fp.mul(xMn, yMd); // 2. xn = xMn * yMd\n xn = Fp.mul(xn, ELL2_C1_EDWARDS); // 3. xn = xn * c1\n let xd = Fp.mul(xMd, yMn); // 4. xd = xMd * yMn # xn / xd = c1 * xM / yM\n let yn = Fp.sub(xMn, xMd); // 5. yn = xMn - xMd\n let yd = Fp.add(xMn, xMd); // 6. yd = xMn + xMd # (n / d - 1) / (n / d + 1) = (n - d) / (n + d)\n let tv1 = Fp.mul(xd, yd); // 7. tv1 = xd * yd\n let e = Fp.eql(tv1, Fp.ZERO); // 8. e = tv1 == 0\n xn = Fp.cmov(xn, Fp.ZERO, e); // 9. xn = CMOV(xn, 0, e)\n xd = Fp.cmov(xd, Fp.ONE, e); // 10. xd = CMOV(xd, 1, e)\n yn = Fp.cmov(yn, Fp.ONE, e); // 11. yn = CMOV(yn, 1, e)\n yd = Fp.cmov(yd, Fp.ONE, e); // 12. yd = CMOV(yd, 1, e)\n const [xd_inv, yd_inv] = FpInvertBatch(Fp, [xd, yd], true); // batch division\n return { x: Fp.mul(xn, xd_inv), y: Fp.mul(yn, yd_inv) }; // 13. return (xn, xd, yn, yd)\n}\n\n/** Hashing to ed25519 points / field. RFC 9380 methods. */\nexport const ed25519_hasher: H2CHasher<bigint> = /* @__PURE__ */ (() =>\n createHasher(\n ed25519.Point,\n (scalars: bigint[]) => map_to_curve_elligator2_edwards25519(scalars[0]),\n {\n DST: 'edwards25519_XMD:SHA-512_ELL2_RO_',\n encodeDST: 'edwards25519_XMD:SHA-512_ELL2_NU_',\n p: ed25519_CURVE_p,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha512,\n }\n ))();\n\n// √(-1) aka √(a) aka 2^((p-1)/4)\nconst SQRT_M1 = ED25519_SQRT_M1;\n// √(ad - 1)\nconst SQRT_AD_MINUS_ONE = /* @__PURE__ */ BigInt(\n '25063068953384623474111414158702152701244531502492656460079210482610430750235'\n);\n// 1 / √(a-d)\nconst INVSQRT_A_MINUS_D = /* @__PURE__ */ BigInt(\n '54469307008909316920995813868745141605393597292927456921205312896311721017578'\n);\n// 1-d²\nconst ONE_MINUS_D_SQ = /* @__PURE__ */ BigInt(\n '1159843021668779879193775521855586647937357759715417654439879720876111806838'\n);\n// (d-1)²\nconst D_MINUS_ONE_SQ = /* @__PURE__ */ BigInt(\n '40440834346308536858101042469323190826248399146238708352240133220865137265952'\n);\n// Calculates 1/√(number)\nconst invertSqrt = (number: bigint) => uvRatio(_1n, number);\n\nconst MAX_255B = /* @__PURE__ */ BigInt(\n '0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n);\nconst bytes255ToNumberLE = (bytes: Uint8Array) =>\n ed25519.Point.Fp.create(bytesToNumberLE(bytes) & MAX_255B);\n\ntype ExtendedPoint = EdwardsPoint;\n\n/**\n * Computes Elligator map for Ristretto255.\n * Described in [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#appendix-B) and on\n * the [website](https://ristretto.group/formulas/elligator.html).\n */\nfunction calcElligatorRistrettoMap(r0: bigint): ExtendedPoint {\n const { d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const r = mod(SQRT_M1 * r0 * r0); // 1\n const Ns = mod((r + _1n) * ONE_MINUS_D_SQ); // 2\n let c = BigInt(-1); // 3\n const D = mod((c - d * r) * mod(r + d)); // 4\n let { isValid: Ns_D_is_sq, value: s } = uvRatio(Ns, D); // 5\n let s_ = mod(s * r0); // 6\n if (!isNegativeLE(s_, P)) s_ = mod(-s_);\n if (!Ns_D_is_sq) s = s_; // 7\n if (!Ns_D_is_sq) c = r; // 8\n const Nt = mod(c * (r - _1n) * D_MINUS_ONE_SQ - D); // 9\n const s2 = s * s;\n const W0 = mod((s + s) * D); // 10\n const W1 = mod(Nt * SQRT_AD_MINUS_ONE); // 11\n const W2 = mod(_1n - s2); // 12\n const W3 = mod(_1n + s2); // 13\n return new ed25519.Point(mod(W0 * W3), mod(W2 * W1), mod(W1 * W3), mod(W0 * W2));\n}\n\nfunction ristretto255_map(bytes: Uint8Array): _RistrettoPoint {\n abytes(bytes, 64);\n const r1 = bytes255ToNumberLE(bytes.subarray(0, 32));\n const R1 = calcElligatorRistrettoMap(r1);\n const r2 = bytes255ToNumberLE(bytes.subarray(32, 64));\n const R2 = calcElligatorRistrettoMap(r2);\n return new _RistrettoPoint(R1.add(R2));\n}\n\n/**\n * Wrapper over Edwards Point for ristretto255.\n *\n * Each ed25519/ExtendedPoint has 8 different equivalent points. This can be\n * a source of bugs for protocols like ring signatures. Ristretto was created to solve this.\n * Ristretto point operates in X:Y:Z:T extended coordinates like ExtendedPoint,\n * but it should work in its own namespace: do not combine those two.\n * See [RFC9496](https://www.rfc-editor.org/rfc/rfc9496).\n */\nclass _RistrettoPoint extends PrimeEdwardsPoint<_RistrettoPoint> {\n // Do NOT change syntax: the following gymnastics is done,\n // because typescript strips comments, which makes bundlers disable tree-shaking.\n // prettier-ignore\n static BASE: _RistrettoPoint =\n /* @__PURE__ */ (() => new _RistrettoPoint(ed25519.Point.BASE))();\n // prettier-ignore\n static ZERO: _RistrettoPoint =\n /* @__PURE__ */ (() => new _RistrettoPoint(ed25519.Point.ZERO))();\n // prettier-ignore\n static Fp: IField<bigint> =\n /* @__PURE__ */ (() => Fp)();\n // prettier-ignore\n static Fn: IField<bigint> =\n /* @__PURE__ */ (() => Fn)();\n\n constructor(ep: ExtendedPoint) {\n super(ep);\n }\n\n static fromAffine(ap: AffinePoint<bigint>): _RistrettoPoint {\n return new _RistrettoPoint(ed25519.Point.fromAffine(ap));\n }\n\n protected assertSame(other: _RistrettoPoint): void {\n if (!(other instanceof _RistrettoPoint)) throw new Error('RistrettoPoint expected');\n }\n\n protected init(ep: EdwardsPoint): _RistrettoPoint {\n return new _RistrettoPoint(ep);\n }\n\n /** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\n static hashToCurve(hex: Hex): _RistrettoPoint {\n return ristretto255_map(ensureBytes('ristrettoHash', hex, 64));\n }\n\n static fromBytes(bytes: Uint8Array): _RistrettoPoint {\n abytes(bytes, 32);\n const { a, d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const s = bytes255ToNumberLE(bytes);\n // 1. Check that s_bytes is the canonical encoding of a field element, or else abort.\n // 3. Check that s is non-negative, or else abort\n if (!equalBytes(Fp.toBytes(s), bytes) || isNegativeLE(s, P))\n throw new Error('invalid ristretto255 encoding 1');\n const s2 = mod(s * s);\n const u1 = mod(_1n + a * s2); // 4 (a is -1)\n const u2 = mod(_1n - a * s2); // 5\n const u1_2 = mod(u1 * u1);\n const u2_2 = mod(u2 * u2);\n const v = mod(a * d * u1_2 - u2_2); // 6\n const { isValid, value: I } = invertSqrt(mod(v * u2_2)); // 7\n const Dx = mod(I * u2); // 8\n const Dy = mod(I * Dx * v); // 9\n let x = mod((s + s) * Dx); // 10\n if (isNegativeLE(x, P)) x = mod(-x); // 10\n const y = mod(u1 * Dy); // 11\n const t = mod(x * y); // 12\n if (!isValid || isNegativeLE(t, P) || y === _0n)\n throw new Error('invalid ristretto255 encoding 2');\n return new _RistrettoPoint(new ed25519.Point(x, y, _1n, t));\n }\n\n /**\n * Converts ristretto-encoded string to ristretto point.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-decode).\n * @param hex Ristretto-encoded 32 bytes. Not every 32-byte string is valid ristretto encoding\n */\n static fromHex(hex: Hex): _RistrettoPoint {\n return _RistrettoPoint.fromBytes(ensureBytes('ristrettoHex', hex, 32));\n }\n\n static msm(points: _RistrettoPoint[], scalars: bigint[]): _RistrettoPoint {\n return pippenger(_RistrettoPoint, ed25519.Point.Fn, points, scalars);\n }\n\n /**\n * Encodes ristretto point to Uint8Array.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-encode).\n */\n toBytes(): Uint8Array {\n let { X, Y, Z, T } = this.ep;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const u1 = mod(mod(Z + Y) * mod(Z - Y)); // 1\n const u2 = mod(X * Y); // 2\n // Square root always exists\n const u2sq = mod(u2 * u2);\n const { value: invsqrt } = invertSqrt(mod(u1 * u2sq)); // 3\n const D1 = mod(invsqrt * u1); // 4\n const D2 = mod(invsqrt * u2); // 5\n const zInv = mod(D1 * D2 * T); // 6\n let D: bigint; // 7\n if (isNegativeLE(T * zInv, P)) {\n let _x = mod(Y * SQRT_M1);\n let _y = mod(X * SQRT_M1);\n X = _x;\n Y = _y;\n D = mod(D1 * INVSQRT_A_MINUS_D);\n } else {\n D = D2; // 8\n }\n if (isNegativeLE(X * zInv, P)) Y = mod(-Y); // 9\n let s = mod((Z - Y) * D); // 10 (check footer's note, no sqrt(-a))\n if (isNegativeLE(s, P)) s = mod(-s);\n return Fp.toBytes(s); // 11\n }\n\n /**\n * Compares two Ristretto points.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-equals).\n */\n equals(other: _RistrettoPoint): boolean {\n this.assertSame(other);\n const { X: X1, Y: Y1 } = this.ep;\n const { X: X2, Y: Y2 } = other.ep;\n const mod = (n: bigint) => Fp.create(n);\n // (x1 * y2 == y1 * x2) | (y1 * y2 == x1 * x2)\n const one = mod(X1 * Y2) === mod(Y1 * X2);\n const two = mod(Y1 * Y2) === mod(X1 * X2);\n return one || two;\n }\n\n is0(): boolean {\n return this.equals(_RistrettoPoint.ZERO);\n }\n}\n\nexport const ristretto255: {\n Point: typeof _RistrettoPoint;\n} = { Point: _RistrettoPoint };\n\n/** Hashing to ristretto255 points / field. RFC 9380 methods. */\nexport const ristretto255_hasher: H2CHasherBase<bigint> = {\n hashToCurve(msg: Uint8Array, options?: htfBasicOpts): _RistrettoPoint {\n const DST = options?.DST || 'ristretto255_XMD:SHA-512_R255MAP_RO_';\n const xmd = expand_message_xmd(msg, DST, 64, sha512);\n return ristretto255_map(xmd);\n },\n hashToScalar(msg: Uint8Array, options: htfBasicOpts = { DST: _DST_scalar }) {\n const xmd = expand_message_xmd(msg, options.DST, 64, sha512);\n return Fn.create(bytesToNumberLE(xmd));\n },\n};\n\n// export const ristretto255_oprf: OPRF = createORPF({\n// name: 'ristretto255-SHA512',\n// Point: RistrettoPoint,\n// hash: sha512,\n// hashToGroup: ristretto255_hasher.hashToCurve,\n// hashToScalar: ristretto255_hasher.hashToScalar,\n// });\n\n/**\n * Weird / bogus points, useful for debugging.\n * All 8 ed25519 points of 8-torsion subgroup can be generated from the point\n * T = `26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05`.\n * ⟨T⟩ = { O, T, 2T, 3T, 4T, 5T, 6T, 7T }\n */\nexport const ED25519_TORSION_SUBGROUP: string[] = [\n '0100000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a',\n '0000000000000000000000000000000000000000000000000000000000000080',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05',\n 'ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85',\n '0000000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa',\n];\n\n/** @deprecated use `ed25519.utils.toMontgomery` */\nexport function edwardsToMontgomeryPub(edwardsPub: Hex): Uint8Array {\n return ed25519.utils.toMontgomery(ensureBytes('pub', edwardsPub));\n}\n/** @deprecated use `ed25519.utils.toMontgomery` */\nexport const edwardsToMontgomery: typeof edwardsToMontgomeryPub = edwardsToMontgomeryPub;\n\n/** @deprecated use `ed25519.utils.toMontgomerySecret` */\nexport function edwardsToMontgomeryPriv(edwardsPriv: Uint8Array): Uint8Array {\n return ed25519.utils.toMontgomerySecret(ensureBytes('pub', edwardsPriv));\n}\n\n/** @deprecated use `ristretto255.Point` */\nexport const RistrettoPoint: typeof _RistrettoPoint = _RistrettoPoint;\n/** @deprecated use `import { ed25519_hasher } from '@noble/curves/ed25519.js';` */\nexport const hashToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() => ed25519_hasher.hashToCurve)();\n/** @deprecated use `import { ed25519_hasher } from '@noble/curves/ed25519.js';` */\nexport const encodeToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n ed25519_hasher.encodeToCurve)();\ntype RistHasher = (msg: Uint8Array, options: htfBasicOpts) => _RistrettoPoint;\n/** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\nexport const hashToRistretto255: RistHasher = /* @__PURE__ */ (() =>\n ristretto255_hasher.hashToCurve as RistHasher)();\n/** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\nexport const hash_to_ristretto255: RistHasher = /* @__PURE__ */ (() =>\n ristretto255_hasher.hashToCurve as RistHasher)();\n","import { ed25519 as nobleEd25519 } from '@noble/curves/ed25519'\nimport { bytesToHex } from '@xrplf/isomorphic/utils'\n\nimport type { HexString, SigningScheme } from '../../types'\nimport assert from '../../utils/assert'\nimport Sha512 from '../../utils/Sha512'\n\nconst ED_PREFIX = 'ED'\n\nconst ed25519: SigningScheme = {\n deriveKeypair(entropy: Uint8Array): {\n privateKey: string\n publicKey: string\n } {\n const rawPrivateKey = Sha512.half(entropy)\n const privateKey = ED_PREFIX + bytesToHex(rawPrivateKey)\n const publicKey =\n ED_PREFIX + bytesToHex(nobleEd25519.getPublicKey(rawPrivateKey))\n return { privateKey, publicKey }\n },\n\n sign(message: Uint8Array, privateKey: HexString): string {\n assert.ok(message instanceof Uint8Array, 'message must be array of octets')\n assert.ok(\n privateKey.length === 66,\n 'private key must be 33 bytes including prefix',\n )\n return bytesToHex(nobleEd25519.sign(message, privateKey.slice(2)))\n },\n\n verify(\n message: Uint8Array,\n signature: HexString,\n publicKey: string,\n ): boolean {\n // Unlikely to be triggered as these are internal and guarded by getAlgorithmFromKey\n assert.ok(\n publicKey.length === 66,\n 'public key must be 33 bytes including prefix',\n )\n return nobleEd25519.verify(\n signature,\n message,\n // Remove the 0xED prefix\n publicKey.slice(2),\n // By default, set zip215 to false for compatibility reasons.\n // ZIP 215 is a stricter Ed25519 signature verification scheme.\n // However, setting it to false adheres to the more commonly used\n // RFC8032 / NIST186-5 standards, making it compatible with systems\n // like the XRP Ledger.\n { zip215: false },\n )\n },\n}\n\nexport default ed25519\n","import {\n decodeNodePublic,\n decodeSeed,\n encodeAccountID,\n encodeSeed,\n} from 'ripple-address-codec'\nimport { ripemd160 } from '@xrplf/isomorphic/ripemd160'\nimport { sha256 } from '@xrplf/isomorphic/sha256'\nimport { hexToBytes, randomBytes } from '@xrplf/isomorphic/utils'\n\nimport { accountPublicFromPublicGenerator } from './signing-schemes/secp256k1/utils'\nimport Sha512 from './utils/Sha512'\nimport assert from './utils/assert'\nimport type { Algorithm, HexString, KeyPair, SigningScheme } from './types'\nimport {\n getAlgorithmFromPrivateKey,\n getAlgorithmFromPublicKey,\n} from './utils/getAlgorithmFromKey'\n\nimport secp256k1 from './signing-schemes/secp256k1'\nimport ed25519 from './signing-schemes/ed25519'\n\nfunction getSigningScheme(algorithm: Algorithm): SigningScheme {\n const schemes = { 'ecdsa-secp256k1': secp256k1, ed25519 }\n return schemes[algorithm]\n}\n\nfunction generateSeed(\n options: {\n entropy?: Uint8Array\n algorithm?: Algorithm\n } = {},\n): string {\n assert.ok(\n !options.entropy || options.entropy.length >= 16,\n 'entropy too short',\n )\n const entropy = options.entropy\n ? options.entropy.slice(0, 16)\n : randomBytes(16)\n const type = options.algorithm === 'ed25519' ? 'ed25519' : 'secp256k1'\n return encodeSeed(entropy, type)\n}\n\nfunction deriveKeypair(\n seed: string,\n options?: {\n algorithm?: Algorithm\n validator?: boolean\n accountIndex?: number\n },\n): KeyPair {\n const decoded = decodeSeed(seed)\n const proposedAlgorithm = options?.algorithm ?? decoded.type\n const algorithm =\n proposedAlgorithm === 'ed25519' ? 'ed25519' : 'ecdsa-secp256k1'\n const scheme = getSigningScheme(algorithm)\n const keypair = scheme.deriveKeypair(decoded.bytes, options)\n const messageToVerify = Sha512.half('This test message should verify.')\n const signature = scheme.sign(messageToVerify, keypair.privateKey)\n /* istanbul ignore if */\n if (!scheme.verify(messageToVerify, signature, keypair.publicKey)) {\n throw new Error('derived keypair did not generate verifiable signature')\n }\n return keypair\n}\n\nfunction sign(messageHex: HexString, privateKey: HexString): HexString {\n const algorithm = getAlgorithmFromPrivateKey(privateKey)\n return getSigningScheme(algorithm).sign(hexToBytes(messageHex), privateKey)\n}\n\nfunction verify(\n messageHex: HexString,\n signature: HexString,\n publicKey: HexString,\n): boolean {\n const algorithm = getAlgorithmFromPublicKey(publicKey)\n return getSigningScheme(algorithm).verify(\n hexToBytes(messageHex),\n signature,\n publicKey,\n )\n}\n\nfunction computePublicKeyHash(publicKeyBytes: Uint8Array): Uint8Array {\n return ripemd160(sha256(publicKeyBytes))\n}\n\nfunction deriveAddressFromBytes(publicKeyBytes: Uint8Array): string {\n return encodeAccountID(computePublicKeyHash(publicKeyBytes))\n}\n\nfunction deriveAddress(publicKey: string): string {\n return deriveAddressFromBytes(hexToBytes(publicKey))\n}\n\nfunction deriveNodeAddress(publicKey: string): string {\n const generatorBytes = decodeNodePublic(publicKey)\n const accountPublicBytes = accountPublicFromPublicGenerator(generatorBytes)\n return deriveAddressFromBytes(accountPublicBytes)\n}\n\nexport {\n generateSeed,\n deriveKeypair,\n sign,\n verify,\n deriveAddress,\n deriveNodeAddress,\n decodeSeed,\n}\n","/**\n * Circuit Breaker Utility\n *\n * Implements the circuit breaker pattern to prevent cascading failures\n * when a downstream chain endpoint (RPC, mirror node, indexer) becomes\n * unhealthy. The breaker has three states:\n *\n * - CLOSED: Operations flow through. Failures are counted in a rolling window.\n * - OPEN: Operations short-circuit immediately with a CircuitBreakerOpenError.\n * - HALF_OPEN: A single probe operation is allowed through. Success closes the\n * breaker; failure re-opens it with the same cool-down.\n *\n * This is intentionally dependency-free so it can be embedded inside the\n * chain adapter base class without pulling in additional packages.\n */\n\nexport type CircuitState = 'closed' | 'open' | 'half_open';\n\nexport interface CircuitBreakerConfig {\n /** Number of consecutive failures within the rolling window that trips the breaker */\n failureThreshold: number;\n /** Length of the rolling window used to count failures (ms) */\n rollingWindowMs: number;\n /** How long the breaker stays OPEN before allowing a HALF_OPEN probe (ms) */\n cooldownMs: number;\n /** Optional list of error message/name substrings to count as failures.\n * When omitted, every error counts. */\n failureFilter?: string[];\n /** Optional name for log/metric output */\n name?: string;\n}\n\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n rollingWindowMs: 60_000,\n cooldownMs: 30_000,\n name: 'circuit',\n};\n\nexport interface CircuitBreakerSnapshot {\n state: CircuitState;\n failureCount: number;\n successCount: number;\n lastFailureAt?: number;\n openedAt?: number;\n nextProbeAt?: number;\n}\n\n/**\n * Error thrown when the breaker rejects a call because it is OPEN.\n * Catch this specifically to apply fallback / fail-fast behaviour.\n */\nexport class CircuitBreakerOpenError extends Error {\n readonly code = 'CIRCUIT_BREAKER_OPEN';\n constructor(name: string, public readonly nextProbeAt: number) {\n super(`Circuit breaker '${name}' is open until ${new Date(nextProbeAt).toISOString()}`);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\n/**\n * Lightweight in-process circuit breaker.\n *\n * The implementation favours predictability over raw throughput:\n * - O(1) state checks\n * - No background timers (state transitions happen lazily on the next call)\n * - Failures older than `rollingWindowMs` are pruned on each interaction\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'closed';\n private failureTimestamps: number[] = [];\n private successCount = 0;\n private openedAt?: number;\n private readonly config: CircuitBreakerConfig;\n\n constructor(config: Partial<CircuitBreakerConfig> = {}) {\n const merged = { ...DEFAULT_CIRCUIT_BREAKER_CONFIG, ...config };\n if (merged.failureThreshold < 1) {\n throw new Error('failureThreshold must be >= 1');\n }\n if (merged.rollingWindowMs <= 0) {\n throw new Error('rollingWindowMs must be > 0');\n }\n if (merged.cooldownMs <= 0) {\n throw new Error('cooldownMs must be > 0');\n }\n this.config = merged;\n }\n\n /**\n * Execute an operation through the breaker.\n * @throws CircuitBreakerOpenError if the breaker is open\n */\n async execute<T>(operation: () => Promise<T>): Promise<T> {\n this.evaluateState();\n\n if (this.state === 'open') {\n throw new CircuitBreakerOpenError(this.config.name ?? 'circuit', this.nextProbeTime());\n }\n\n try {\n const result = await operation();\n this.recordSuccess();\n return result;\n } catch (err) {\n this.recordFailure(err as Error);\n throw err;\n }\n }\n\n /** Allow probing without executing (e.g. for health endpoints) */\n canExecute(): boolean {\n this.evaluateState();\n return this.state !== 'open';\n }\n\n getState(): CircuitState {\n this.evaluateState();\n return this.state;\n }\n\n snapshot(): CircuitBreakerSnapshot {\n this.evaluateState();\n return {\n state: this.state,\n failureCount: this.failureTimestamps.length,\n successCount: this.successCount,\n lastFailureAt: this.failureTimestamps[this.failureTimestamps.length - 1],\n openedAt: this.openedAt,\n nextProbeAt: this.state === 'open' ? this.nextProbeTime() : undefined,\n };\n }\n\n /** Force the breaker back to CLOSED. Use sparingly (e.g. on operator override). */\n reset(): void {\n this.state = 'closed';\n this.failureTimestamps = [];\n this.successCount = 0;\n this.openedAt = undefined;\n }\n\n private evaluateState(): void {\n if (this.state === 'open' && this.openedAt !== undefined) {\n if (Date.now() - this.openedAt >= this.config.cooldownMs) {\n this.state = 'half_open';\n }\n }\n this.pruneOldFailures();\n }\n\n private nextProbeTime(): number {\n return (this.openedAt ?? Date.now()) + this.config.cooldownMs;\n }\n\n private pruneOldFailures(): void {\n const cutoff = Date.now() - this.config.rollingWindowMs;\n if (this.failureTimestamps.length === 0 || this.failureTimestamps[0] >= cutoff) {\n return;\n }\n this.failureTimestamps = this.failureTimestamps.filter((ts) => ts >= cutoff);\n }\n\n private recordSuccess(): void {\n this.successCount += 1;\n if (this.state === 'half_open') {\n // Probe succeeded - close the breaker\n this.state = 'closed';\n this.failureTimestamps = [];\n this.openedAt = undefined;\n } else if (this.state === 'closed') {\n // Successful calls slowly drain accumulated failures\n this.failureTimestamps.shift();\n }\n }\n\n private recordFailure(err: Error): void {\n if (!this.shouldCountFailure(err)) {\n return;\n }\n const now = Date.now();\n this.failureTimestamps.push(now);\n this.pruneOldFailures();\n\n if (this.state === 'half_open') {\n // Probe failed - re-open immediately\n this.openedAt = now;\n this.state = 'open';\n return;\n }\n\n if (\n this.state === 'closed' &&\n this.failureTimestamps.length >= this.config.failureThreshold\n ) {\n this.openedAt = now;\n this.state = 'open';\n }\n }\n\n private shouldCountFailure(err: Error): boolean {\n const filter = this.config.failureFilter;\n if (!filter || filter.length === 0) return true;\n\n const message = (err.message || '').toLowerCase();\n const name = (err.name || '').toLowerCase();\n return filter.some((pattern) => {\n const p = pattern.toLowerCase();\n return message.includes(p) || name.includes(p);\n });\n }\n}\n\n/**\n * Combine retry, rate-limit, and circuit-breaker semantics in a single call.\n * Order is: rate-limit token → circuit breaker → retry → operation.\n *\n * The circuit-breaker wraps the operation INSIDE the retry loop so that the\n * very first call after the breaker re-closes acts as the HALF_OPEN probe.\n */\nexport async function executeWithBreaker<T>(\n breaker: CircuitBreaker,\n operation: () => Promise<T>\n): Promise<T> {\n return breaker.execute(operation);\n}\n","/**\n * Rate Limiter Service\n *\n * Provides sliding window rate limiting for TSS operations.\n * Extracted for single responsibility and testability.\n *\n * @module tss/utils/rate-limiter\n */\n\n// Inlined from libs/multi-chain-core/src/tss/interfaces/tss.interfaces.ts\nexport interface IRateLimiterConfig {\n /** Maximum requests per window */\n readonly maxRequests: number;\n /** Window size in milliseconds */\n readonly windowMs: number;\n}\n\nexport interface IRateLimiter {\n isAllowed(key: string): boolean;\n reset(key: string): void;\n clear(): void;\n cleanup(): void;\n}\n\n\n// ============================================================================\n// DEFAULT CONFIGURATION\n// ============================================================================\n\nconst DEFAULT_CONFIG: IRateLimiterConfig = {\n maxRequests: 60,\n windowMs: 60000, // 1 minute\n};\n\n// ============================================================================\n// IMPLEMENTATION\n// ============================================================================\n\n/**\n * Rate limit entry for a key\n */\ninterface RateLimitEntry {\n count: number;\n windowStart: number;\n}\n\n/**\n * Rate Limiter Service\n *\n * Implements sliding window rate limiting.\n */\nexport class RateLimiter implements IRateLimiter {\n // Lightweight logger stub (no @nestjs/common dependency). Replace via constructor injection if needed.\n private readonly logger = { debug: (..._args: unknown[]) => {}, warn: (..._args: unknown[]) => {} };\n private readonly limits = new Map<string, RateLimitEntry>();\n private readonly config: IRateLimiterConfig;\n\n constructor(config?: Partial<IRateLimiterConfig>) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n }\n\n /**\n * Check if request is allowed under rate limit\n *\n * @param key - Unique identifier for rate limit bucket\n * @returns True if request is allowed\n */\n isAllowed(key: string): boolean {\n const now = Date.now();\n const entry = this.limits.get(key);\n\n // New window or window expired\n if (!entry || now - entry.windowStart >= this.config.windowMs) {\n this.limits.set(key, { count: 1, windowStart: now });\n return true;\n }\n\n // Check limit\n if (entry.count >= this.config.maxRequests) {\n this.logger.debug(`Rate limit exceeded for key: ${key.substring(0, 20)}...`);\n return false;\n }\n\n // Increment count\n entry.count++;\n return true;\n }\n\n /**\n * Reset rate limit for a specific key\n *\n * @param key - Key to reset\n */\n reset(key: string): void {\n this.limits.delete(key);\n }\n\n /**\n * Clear all rate limits\n */\n clear(): void {\n this.limits.clear();\n }\n\n /**\n * Clean up expired entries\n */\n cleanup(): void {\n const now = Date.now();\n const expiredThreshold = this.config.windowMs * 2;\n\n for (const [key, entry] of this.limits.entries()) {\n if (now - entry.windowStart > expiredThreshold) {\n this.limits.delete(key);\n }\n }\n }\n\n /**\n * Get current count for a key\n *\n * @param key - Key to check\n * @returns Current request count or 0\n */\n getCount(key: string): number {\n const entry = this.limits.get(key);\n if (!entry) return 0;\n\n // Check if window expired\n if (Date.now() - entry.windowStart >= this.config.windowMs) {\n return 0;\n }\n\n return entry.count;\n }\n\n /**\n * Get remaining requests for a key\n *\n * @param key - Key to check\n * @returns Remaining requests in current window\n */\n getRemaining(key: string): number {\n return Math.max(0, this.config.maxRequests - this.getCount(key));\n }\n\n /**\n * Get configuration\n */\n getConfig(): Readonly<IRateLimiterConfig> {\n return Object.freeze({ ...this.config });\n }\n}\n\n// ============================================================================\n// FACTORY\n// ============================================================================\n\n/**\n * Create rate limiter with custom config\n */\nexport function createRateLimiter(config?: Partial<IRateLimiterConfig>): RateLimiter {\n return new RateLimiter(config);\n}\n","/**\n * Custom error classes for Smart Engines\n */\n\nexport const ErrorCode = {\n // General errors\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n NOT_FOUND: 'NOT_FOUND',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED',\n PAYLOAD_TOO_LARGE: 'PAYLOAD_TOO_LARGE',\n\n // Chain-specific errors\n CHAIN_NOT_SUPPORTED: 'CHAIN_NOT_SUPPORTED',\n CHAIN_CONNECTION_ERROR: 'CHAIN_CONNECTION_ERROR',\n CHAIN_TIMEOUT: 'CHAIN_TIMEOUT',\n\n // Transaction errors\n TRANSACTION_FAILED: 'TRANSACTION_FAILED',\n TRANSACTION_TIMEOUT: 'TRANSACTION_TIMEOUT',\n INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',\n INVALID_TRANSACTION: 'INVALID_TRANSACTION',\n\n // Account errors\n ACCOUNT_NOT_FOUND: 'ACCOUNT_NOT_FOUND',\n ACCOUNT_CREATION_FAILED: 'ACCOUNT_CREATION_FAILED',\n INVALID_ACCOUNT_ID: 'INVALID_ACCOUNT_ID',\n\n // Wallet errors\n WALLET_NOT_FOUND: 'WALLET_NOT_FOUND',\n WALLET_ENCRYPTION_ERROR: 'WALLET_ENCRYPTION_ERROR',\n WALLET_DECRYPTION_ERROR: 'WALLET_DECRYPTION_ERROR',\n INVALID_PRIVATE_KEY: 'INVALID_PRIVATE_KEY',\n\n // Token errors\n TOKEN_NOT_FOUND: 'TOKEN_NOT_FOUND',\n TOKEN_CREATION_FAILED: 'TOKEN_CREATION_FAILED',\n INSUFFICIENT_TOKEN_BALANCE: 'INSUFFICIENT_TOKEN_BALANCE',\n TRUST_LINE_REQUIRED: 'TRUST_LINE_REQUIRED',\n TOKEN_NOT_ASSOCIATED: 'TOKEN_NOT_ASSOCIATED',\n TOKEN_PAUSED: 'TOKEN_PAUSED',\n ACCOUNT_FROZEN: 'ACCOUNT_FROZEN',\n KYC_NOT_GRANTED: 'KYC_NOT_GRANTED',\n\n // Signature/Auth errors\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n NONCE_MISMATCH: 'NONCE_MISMATCH',\n\n // Contract errors\n CONTRACT_REVERT: 'CONTRACT_REVERT',\n CONTRACT_NOT_FOUND: 'CONTRACT_NOT_FOUND',\n GAS_ERROR: 'GAS_ERROR',\n\n // Infrastructure errors\n DATABASE_ERROR: 'DATABASE_ERROR',\n CACHE_ERROR: 'CACHE_ERROR',\n EVENT_BUS_ERROR: 'EVENT_BUS_ERROR',\n EXTERNAL_SERVICE_ERROR: 'EXTERNAL_SERVICE_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport interface ErrorContext {\n [key: string]: any;\n}\n\n/**\n * Base Smart Engine Error\n */\nexport class SmartEngineError extends Error {\n constructor(\n message: string,\n public readonly code: ErrorCode,\n public readonly statusCode: number = 500,\n public readonly context?: ErrorContext,\n public readonly isRetryable: boolean = false\n ) {\n super(message);\n this.name = 'SmartEngineError';\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON() {\n return {\n error: {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n context: this.context,\n isRetryable: this.isRetryable,\n },\n };\n }\n}\n\n/**\n * Validation Error\n */\nexport class ValidationError extends SmartEngineError {\n constructor(message: string, context?: ErrorContext) {\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Chain Error\n */\nexport class ChainError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.CHAIN_CONNECTION_ERROR,\n context?: ErrorContext,\n isRetryable: boolean = true\n ) {\n super(message, code, 503, context, isRetryable);\n this.name = 'ChainError';\n }\n}\n\n/**\n * Transaction Error\n */\nexport class TransactionError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TRANSACTION_FAILED,\n context?: ErrorContext,\n isRetryable: boolean = false\n ) {\n super(message, code, 400, context, isRetryable);\n this.name = 'TransactionError';\n }\n}\n\n/**\n * Wallet Error\n */\nexport class WalletError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.WALLET_NOT_FOUND,\n context?: ErrorContext\n ) {\n super(message, code, 404, context, false);\n this.name = 'WalletError';\n }\n}\n\n/**\n * Account Error\n */\nexport class AccountError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.ACCOUNT_NOT_FOUND,\n context?: ErrorContext\n ) {\n super(message, code, 404, context, false);\n this.name = 'AccountError';\n }\n}\n\n/**\n * Token Error\n */\nexport class TokenError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TOKEN_NOT_FOUND,\n context?: ErrorContext\n ) {\n super(message, code, 404, context, false);\n this.name = 'TokenError';\n }\n}\n\n/**\n * Infrastructure Error\n */\nexport class InfrastructureError extends SmartEngineError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.EXTERNAL_SERVICE_ERROR,\n context?: ErrorContext,\n isRetryable: boolean = true\n ) {\n super(message, code, 503, context, isRetryable);\n this.name = 'InfrastructureError';\n }\n}\n","/**\n * Capability-related errors for Smart Engines\n */\nimport { SmartEngineError, ErrorCode, ErrorContext } from './smart-engine.error';\n\n/**\n * Error thrown when a requested capability is not supported on a chain\n */\nexport class UnsupportedCapabilityError extends SmartEngineError {\n constructor(\n public readonly chain: string,\n public readonly capability: string,\n public readonly alternatives?: string[]\n ) {\n const message = `Capability '${capability}' is not supported on chain '${chain}'`;\n const context: ErrorContext = {\n chain,\n capability,\n alternatives,\n };\n\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'UnsupportedCapabilityError';\n }\n}\n\n/**\n * Error thrown when trying to use a capability that was not enabled on token creation\n */\nexport class CapabilityNotEnabledError extends SmartEngineError {\n constructor(\n public readonly tokenId: string,\n public readonly capability: string\n ) {\n const message = `Capability '${capability}' was not enabled for token '${tokenId}'`;\n const context: ErrorContext = {\n tokenId,\n capability,\n };\n\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'CapabilityNotEnabledError';\n }\n}\n\n/**\n * Error thrown when capability validation fails\n */\nexport class CapabilityValidationError extends SmartEngineError {\n constructor(\n message: string,\n public readonly capabilities: string[],\n public readonly chain: string\n ) {\n const context: ErrorContext = {\n capabilities,\n chain,\n };\n\n super(message, ErrorCode.VALIDATION_ERROR, 400, context, false);\n this.name = 'CapabilityValidationError';\n }\n}\n","import { z } from 'zod';\n\n/**\n * Supported blockchain types\n */\nexport const ChainTypeSchema = z.enum([\n 'hedera',\n 'xrpl',\n 'polkadot',\n 'solana',\n 'stellar',\n 'ethereum',\n 'polygon',\n 'bitcoin',\n 'cardano',\n]);\n\nexport type ChainType = z.infer<typeof ChainTypeSchema>;\n\n/**\n * Network environment types\n */\nexport const NetworkTypeSchema = z.enum(['mainnet', 'testnet', 'devnet', 'local']);\n\nexport type NetworkType = z.infer<typeof NetworkTypeSchema>;\n\n/**\n * Chain metadata schema\n */\nexport const ChainMetadataSchema = z.object({\n chain: ChainTypeSchema,\n network: NetworkTypeSchema,\n nativeCurrency: z.object({\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().int().min(0),\n }),\n blockTime: z.number().optional(),\n rpcEndpoint: z.string().url().optional(),\n});\n\nexport type ChainMetadata = z.infer<typeof ChainMetadataSchema>;\n","/**\n * Network Membership Types\n *\n * Defines types for multi-network membership in the Smart Engines ecosystem.\n * Supports three network types: validators, hosts, and gateways.\n *\n * @packageDocumentation\n */\nimport { z } from 'zod';\nimport type { ChainType } from './chain.schema';\n\n/**\n * Alias for backward compatibility with multi-chain-core\n */\nexport type SupportedChain = ChainType;\n\n// =============================================================================\n// Network Type Definition\n// =============================================================================\n\n/**\n * Network membership type - determines the role of a node in the network\n *\n * - validator: Full validator nodes that participate in TSS signing and consensus\n * - host: Infrastructure hosts that run smart engines for decentralized applications\n * - gateway: API gateway nodes that provide external access to the network\n */\nexport type NetworkMembershipType = 'validator' | 'host' | 'gateway';\n\n/**\n * Zod schema for NetworkMembershipType validation\n */\nexport const NetworkMembershipTypeSchema = z.enum(['validator', 'host', 'gateway']);\n\n// =============================================================================\n// Membership NFT Metadata\n// =============================================================================\n\n/**\n * Membership status for NFT metadata\n */\nexport type MembershipStatus = 'pending' | 'active' | 'exiting' | 'exited' | 'banned';\n\n/**\n * Zod schema for MembershipStatus validation\n */\nexport const MembershipStatusSchema = z.enum(['pending', 'active', 'exiting', 'exited', 'banned']);\n\n/**\n * Membership NFT Metadata\n *\n * Metadata structure for membership NFTs that represent network participation.\n * This metadata is stored on-chain and used to verify membership.\n */\nexport interface MembershipNftMetadata {\n /** Unique identifier for the node */\n nodeId: string;\n /** Type of network membership */\n networkType: NetworkMembershipType;\n /** Blockchain chain where membership was established */\n chain: SupportedChain;\n /** Node's endpoint URL for network communication */\n endpoint: string;\n /** Node's public key for cryptographic verification */\n publicKey: string;\n /** ISO 8601 timestamp when the node joined the network */\n joinedAt: string;\n /** Transaction ID of the deposit that activated membership */\n depositTxId: string;\n /** Current membership status */\n status: MembershipStatus;\n /** Network-specific configuration (optional) */\n networkConfig?: NetworkSpecificConfig;\n}\n\n/**\n * Zod schema for MembershipNftMetadata validation\n */\nexport const MembershipNftMetadataSchema = z.object({\n nodeId: z.string().min(1),\n networkType: NetworkMembershipTypeSchema,\n chain: z.enum(['hedera', 'xrpl', 'polkadot', 'solana']),\n endpoint: z.string().url(),\n publicKey: z.string().min(1),\n joinedAt: z.string().datetime(),\n depositTxId: z.string().min(1),\n status: MembershipStatusSchema,\n networkConfig: z.record(z.unknown()).optional(),\n});\n\n// =============================================================================\n// Network-Specific Configuration\n// =============================================================================\n\n/**\n * Network-specific configuration that can be attached to membership metadata\n */\nexport type NetworkSpecificConfig = Record<string, unknown>;\n\n/**\n * Validator-specific configuration\n */\nexport interface ValidatorNetworkConfig {\n /** TSS participation threshold */\n tssThreshold?: number;\n /** Supported chains for validation */\n supportedChains?: SupportedChain[];\n /** Validator capabilities */\n capabilities?: string[];\n}\n\n/**\n * Host-specific configuration\n */\nexport interface HostNetworkConfig {\n /** Maximum number of smart engines this host can run */\n maxEngines?: number;\n /** Supported engine types */\n supportedEngineTypes?: string[];\n /** Host region for geographic distribution */\n region?: string;\n}\n\n/**\n * Gateway-specific configuration\n */\nexport interface GatewayNetworkConfig {\n /** Rate limiting configuration */\n rateLimits?: {\n requestsPerSecond: number;\n burstLimit: number;\n };\n /** Supported API versions */\n supportedApiVersions?: string[];\n /** Geographic region */\n region?: string;\n}\n\n// =============================================================================\n// Network Deposit Configuration\n// =============================================================================\n\n/**\n * Deposit configuration for a specific network type\n */\nexport interface NetworkDepositRequirements {\n /** Required deposit amount in smallest unit (e.g., tinybars for HBAR) */\n depositAmount: string;\n /** Lock duration in days */\n lockDurationDays: number;\n /** Minimum renewal window in days before expiry */\n renewalWindowDays?: number;\n}\n\n/**\n * Complete deposit configuration for all network types\n */\nexport interface NetworkDepositConfig {\n validator: NetworkDepositRequirements;\n host: NetworkDepositRequirements;\n gateway: NetworkDepositRequirements;\n}\n\n/**\n * Zod schema for NetworkDepositRequirements validation\n */\nexport const NetworkDepositRequirementsSchema = z.object({\n depositAmount: z.string().min(1),\n lockDurationDays: z.number().int().positive(),\n renewalWindowDays: z.number().int().positive().optional(),\n});\n\n/**\n * Zod schema for NetworkDepositConfig validation\n */\nexport const NetworkDepositConfigSchema = z.object({\n validator: NetworkDepositRequirementsSchema,\n host: NetworkDepositRequirementsSchema,\n gateway: NetworkDepositRequirementsSchema,\n});\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard to check if a value is a valid NetworkMembershipType\n */\nexport function isNetworkMembershipType(value: unknown): value is NetworkMembershipType {\n return value === 'validator' || value === 'host' || value === 'gateway';\n}\n\n/**\n * Type guard to check if a value is a valid MembershipStatus\n */\nexport function isMembershipStatus(value: unknown): value is MembershipStatus {\n return (\n value === 'pending' ||\n value === 'active' ||\n value === 'exiting' ||\n value === 'exited' ||\n value === 'banned'\n );\n}\n\n/**\n * Type guard to check if metadata matches MembershipNftMetadata structure\n */\nexport function isMembershipNftMetadata(value: unknown): value is MembershipNftMetadata {\n const result = MembershipNftMetadataSchema.safeParse(value);\n return result.success;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get human-readable label for network membership type\n */\nexport function getNetworkTypeLabel(type: NetworkMembershipType): string {\n const labels: Record<NetworkMembershipType, string> = {\n validator: 'Validator Node',\n host: 'Host Node',\n gateway: 'Gateway Node',\n };\n return labels[type];\n}\n\n/**\n * Get human-readable description for network membership type\n */\nexport function getNetworkTypeDescription(type: NetworkMembershipType): string {\n const descriptions: Record<NetworkMembershipType, string> = {\n validator:\n 'Full validator nodes that participate in TSS signing and consensus operations across multiple chains.',\n host: 'Infrastructure hosts that run smart engines for decentralized applications and services.',\n gateway:\n 'API gateway nodes that provide external access to the network and handle rate limiting.',\n };\n return descriptions[type];\n}\n\n/**\n * Check if a network type requires TSS participation\n */\nexport function requiresTssParticipation(type: NetworkMembershipType): boolean {\n return type === 'validator';\n}\n\n/**\n * Get the default deposit configuration for a network type\n */\nexport function getDefaultDepositConfig(): NetworkDepositConfig {\n return {\n validator: {\n depositAmount: '10000000',\n lockDurationDays: 365,\n renewalWindowDays: 30,\n },\n host: {\n depositAmount: '5000000',\n lockDurationDays: 365,\n renewalWindowDays: 30,\n },\n gateway: {\n depositAmount: '2000000',\n lockDurationDays: 365,\n renewalWindowDays: 30,\n },\n };\n}\n","/**\n * Token Capabilities Schema\n *\n * Defines universal token capabilities that are chain-agnostic.\n * Each capability maps to chain-specific implementations.\n */\nimport { z } from 'zod';\n\n/**\n * Token Capabilities Schema\n *\n * These capabilities define what operations a token supports.\n * The validator layer translates these to chain-specific implementations.\n */\nexport const TokenCapabilitiesSchema = z.object({\n /**\n * Pause all token operations globally\n * - Hedera: Adds pauseKey to token\n * - XRPL: Enables GlobalFreeze flag on issuer account\n */\n pausable: z.boolean().default(false),\n\n /**\n * Freeze/restrict specific accounts from transacting\n * - Hedera: Adds freezeKey to token\n * - XRPL: Enables trust line freeze capability\n */\n restrictable: z.boolean().default(false),\n\n /**\n * KYC/compliance controls for accounts\n * - Hedera: Adds kycKey to token\n * - XRPL: Requires authorized trust lines (RequireAuth)\n */\n compliant: z.boolean().default(false),\n\n /**\n * Force remove tokens from accounts (compliance wipe)\n * - Hedera: Adds wipeKey to token\n * - XRPL: Enables clawback (lsfAllowTrustLineClawback)\n */\n wipeable: z.boolean().default(false),\n\n /**\n * Mint additional supply after creation\n * - Hedera: Adds supplyKey to token\n * - XRPL: Issuer can always issue more via Payment\n */\n mintable: z.boolean().default(true),\n\n /**\n * Burn tokens (reduce supply)\n * - Hedera: Requires supplyKey\n * - XRPL: Send back to issuer (reduces supply)\n */\n burnable: z.boolean().default(true),\n\n /**\n * Allow transfers between accounts\n * - All chains: Generally always supported\n */\n transferable: z.boolean().default(true),\n});\n\nexport type TokenCapabilities = z.infer<typeof TokenCapabilitiesSchema>;\n\n/**\n * Capability names as a type\n */\nexport type CapabilityName = keyof TokenCapabilities;\n\n/**\n * List of all capability names\n */\nexport const CAPABILITY_NAMES: CapabilityName[] = [\n 'pausable',\n 'restrictable',\n 'compliant',\n 'wipeable',\n 'mintable',\n 'burnable',\n 'transferable',\n];\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\n\n/**\n * Account identifier schema - generic string that works across chains\n */\nexport const AccountIdSchema = z.string().min(1);\n\n// Note: Export as AccountIdString to avoid collision with AccountId value object\nexport type AccountIdString = z.infer<typeof AccountIdSchema>;\n\n/**\n * Account information schema\n */\nexport const AccountInfoSchema = z.object({\n accountId: AccountIdSchema,\n balance: z.string(), // String to handle large numbers and decimals\n chain: ChainTypeSchema,\n publicKey: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n createdAt: z.date().optional(),\n updatedAt: z.date().optional(),\n});\n\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>;\n\n/**\n * Account balance schema with token details\n */\nexport const AccountBalanceSchema = z.object({\n accountId: AccountIdSchema,\n chain: ChainTypeSchema,\n nativeBalance: z.string(),\n tokens: z\n .array(\n z.object({\n tokenId: z.string(),\n balance: z.string(),\n decimals: z.number().int().min(0),\n symbol: z.string().optional(),\n })\n )\n .optional(),\n timestamp: z.date(),\n});\n\nexport type AccountBalance = z.infer<typeof AccountBalanceSchema>;\n","import { z } from 'zod';\n\n/**\n * Sovereignty mode for entity creation.\n * - 'partial': user + validator both sign; on-chain = nested KeyList/SignerList\n * - 'full': validator-only signs; on-chain = validator multisig alone\n *\n * \"partial\" is product-facing \"mixed\".\n *\n * NOTE: 'none' (owner-only key, no validator in signing path) has been removed\n * (Arc 5 §7.5.2 + §8). Any payload carrying securityMode:'none' now fails\n * safeParse at the schema boundary.\n */\nexport const SecurityModeSchema = z.enum(['partial', 'full']);\nexport type SecurityMode = z.infer<typeof SecurityModeSchema>;\n\n/**\n * Single source of truth for the sovereignty field invariant.\n *\n * - partial: requires BOTH entityId and appOwnerPublicKey\n * - full: requires entityId (appOwnerPublicKey is ignored, not an error)\n *\n * Exported so merged schemas in api.schema.ts can delegate here\n * instead of duplicating the predicate logic.\n */\nexport const sovereigntyRefinePredicate = (v: {\n securityMode: SecurityMode;\n entityId?: string;\n appOwnerPublicKey?: string;\n}): boolean => {\n if (v.securityMode === 'partial') {\n return !!v.entityId && !!v.appOwnerPublicKey;\n }\n // 'full': requires entityId\n return !!v.entityId;\n};\n\nexport const SOVEREIGNTY_REFINE_MESSAGE =\n \"securityMode='partial' requires entityId+appOwnerPublicKey; 'full' requires entityId\";\n\n/**\n * Shared fragment for every entity-creation prepare schema.\n *\n * Invariants enforced via refine:\n * - partial mode requires BOTH entityId and appOwnerPublicKey\n * - full mode requires entityId (appOwnerPublicKey ignored)\n */\n// Internal: the raw object so callers can `.merge()` it without needing\n// Zod-version-specific `.innerType()` unwrapping (v3 vs v4 API drift).\nexport const SovereigntyFieldsRawSchema = z.object({\n securityMode: SecurityModeSchema.default('full'),\n entityId: z.string().optional(),\n appOwnerPublicKey: z.string().optional(),\n});\n\nexport const SovereigntyFieldsSchema = SovereigntyFieldsRawSchema\n .refine(sovereigntyRefinePredicate, { message: SOVEREIGNTY_REFINE_MESSAGE });\n\nexport type SovereigntyFields = z.infer<typeof SovereigntyFieldsSchema>;\n\n/**\n * ---------------------------------------------------------------------------\n * Response-side metadata: the `sovereignty` block on PreparedTransaction\n * ---------------------------------------------------------------------------\n *\n * Every `PreparedTransactionResponse` carries a `sovereignty` block so smart-\n * apps and tests can inspect the on-chain authorization topology the\n * validator is building, without decoding raw chain-native bytes.\n *\n * - `mode: 'partial'|'full'` carries the entity id, the raw BLS hex pubkeys\n * from the entity's DKG binding, and a chain-native authorization-set\n * descriptor (KeyList for Hedera, SignerList for XRPL, weighted signer set\n * for Stellar).\n */\n\n/**\n * Recursive JSON shape for a Hedera authorization key.\n *\n * A Hedera `adminKey` / `supplyKey` / capability-key value is either a single\n * ed25519 public key or a threshold KeyList whose members are themselves\n * keys. Kept JSON-serializable (ed25519 keys as hex strings) so callers can\n * walk the structure without a `@hashgraph/sdk` dep.\n */\nexport type HederaKeyShape =\n | { type: 'ed25519'; key: string }\n | { type: 'keyList'; threshold: number; keys: HederaKeyShape[] };\n\nexport const HederaKeyShapeSchema: z.ZodType<HederaKeyShape> = z.lazy(() =>\n z.union([\n z.object({ type: z.literal('ed25519'), key: z.string() }),\n z.object({\n type: z.literal('keyList'),\n threshold: z.number().int().nonnegative(),\n keys: z.array(HederaKeyShapeSchema),\n }),\n ]),\n);\n\nexport const HederaAuthorizationSetShapeSchema = z.object({\n chain: z.literal('hedera'),\n adminKey: HederaKeyShapeSchema,\n supplyKey: HederaKeyShapeSchema.optional(),\n freezeKey: HederaKeyShapeSchema.optional(),\n wipeKey: HederaKeyShapeSchema.optional(),\n pauseKey: HederaKeyShapeSchema.optional(),\n kycKey: HederaKeyShapeSchema.optional(),\n});\n\nexport const XrplAuthorizationSetShapeSchema = z.object({\n chain: z.literal('xrpl'),\n signerEntries: z.array(\n z.object({\n account: z.string(),\n weight: z.number().int().nonnegative(),\n }),\n ),\n signerQuorum: z.number().int().nonnegative(),\n masterDisabled: z.boolean(),\n});\n\nexport const StellarAuthorizationSetShapeSchema = z.object({\n chain: z.literal('stellar'),\n signers: z.array(\n z.object({\n key: z.string(),\n weight: z.number().int().nonnegative(),\n }),\n ),\n thresholds: z.object({\n low: z.number().int().nonnegative(),\n med: z.number().int().nonnegative(),\n high: z.number().int().nonnegative(),\n }),\n masterWeight: z.number().int().nonnegative(),\n});\n\n/**\n * Recursive JSON shape for a Polkadot authorization signatory.\n *\n * A Polkadot sovereignty set resolves to a single on-chain controlling\n * `address`. That address is either a native `pallet_multisig` address\n * whose signatories may themselves be multisig accounts (`'full'` = flat\n * validator multisig; `'partial'` = nested outer multisig\n * `[userAddress, innerValidatorMultisig]`).\n *\n * Kept JSON-serializable (SS58 addresses as strings) so callers can walk the\n * structure without a `@polkadot/*` dep.\n */\nexport type PolkadotSignatoryShape =\n | { type: 'account'; address: string }\n | {\n type: 'multisig';\n address: string;\n threshold: number;\n signatories: PolkadotSignatoryShape[];\n };\n\nexport const PolkadotSignatoryShapeSchema: z.ZodType<PolkadotSignatoryShape> = z.lazy(() =>\n z.union([\n z.object({ type: z.literal('account'), address: z.string() }),\n z.object({\n type: z.literal('multisig'),\n address: z.string(),\n threshold: z.number().int().positive(),\n signatories: z.array(PolkadotSignatoryShapeSchema),\n }),\n ]),\n);\n\nexport const PolkadotAuthorizationSetShapeSchema = z.object({\n chain: z.literal('polkadot'),\n address: z.string(),\n signatory: PolkadotSignatoryShapeSchema,\n ss58Format: z.number().int().nonnegative(),\n});\n\nexport const PreparedTransactionAuthorizationSetSchema = z.discriminatedUnion('chain', [\n HederaAuthorizationSetShapeSchema,\n XrplAuthorizationSetShapeSchema,\n StellarAuthorizationSetShapeSchema,\n PolkadotAuthorizationSetShapeSchema,\n]);\n\nexport type HederaAuthorizationSetShape = z.infer<typeof HederaAuthorizationSetShapeSchema>;\nexport type XrplAuthorizationSetShape = z.infer<typeof XrplAuthorizationSetShapeSchema>;\nexport type StellarAuthorizationSetShape = z.infer<typeof StellarAuthorizationSetShapeSchema>;\nexport type PolkadotAuthorizationSetShape = z.infer<typeof PolkadotAuthorizationSetShapeSchema>;\nexport type PreparedTransactionAuthorizationSet = z.infer<\n typeof PreparedTransactionAuthorizationSetSchema\n>;\n\n/**\n * `authorizationSet` is REQUIRED for prepare endpoints that build the on-chain\n * authorization at create time (token create, account create, account setup)\n * and OPTIONAL for prepare endpoints that invoke an already-configured\n * authorization (mint, burn, transfer, payment). In the latter case the\n * authorization set lives on-chain from a prior create and smart-apps already\n * have its shape from the original create response.\n *\n * The `'none'` arm has been removed (Arc 5 §7.5.2 + §8) — no producer emits\n * `{ mode: 'none' }` anymore.\n */\nexport const PreparedTransactionSovereigntySchema = z.discriminatedUnion('mode', [\n z.object({\n mode: z.literal('partial'),\n entityId: z.string(),\n validatorPublicKeys: z.array(z.string()),\n authorizationSet: PreparedTransactionAuthorizationSetSchema.optional(),\n }),\n z.object({\n mode: z.literal('full'),\n entityId: z.string(),\n validatorPublicKeys: z.array(z.string()),\n authorizationSet: PreparedTransactionAuthorizationSetSchema.optional(),\n }),\n]);\n\nexport type PreparedTransactionSovereignty = z.infer<typeof PreparedTransactionSovereigntySchema>;\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\nimport { AccountIdSchema } from './account.schema';\n\n/**\n * Transaction status\n */\nexport const TransactionStatusSchema = z.enum(['pending', 'success', 'failed', 'expired']);\n\nexport type TransactionStatus = z.infer<typeof TransactionStatusSchema>;\n\n/**\n * Transaction type\n */\nexport const TransactionTypeSchema = z.enum([\n 'transfer',\n 'token_transfer',\n 'account_create',\n 'token_create',\n 'token_mint',\n 'token_burn',\n 'contract_call',\n 'contract_create',\n 'topic_message',\n 'other',\n]);\n\nexport type TransactionType = z.infer<typeof TransactionTypeSchema>;\n\n/**\n * Base transaction schema\n */\nexport const TransactionSchema = z.object({\n id: z.string(),\n chain: ChainTypeSchema,\n type: TransactionTypeSchema,\n status: TransactionStatusSchema,\n timestamp: z.date(),\n from: AccountIdSchema,\n to: AccountIdSchema.optional(),\n amount: z.string().optional(),\n fee: z.string(),\n memo: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type Transaction = z.infer<typeof TransactionSchema>;\n\n/**\n * Transaction receipt schema\n */\nexport const TransactionReceiptSchema = z.object({\n transactionId: z.string(),\n chain: ChainTypeSchema,\n status: TransactionStatusSchema,\n blockNumber: z.number().optional(),\n blockHash: z.string().optional(),\n timestamp: z.date(),\n gasUsed: z.string().optional(),\n effectiveFee: z.string(),\n logs: z.array(z.any()).optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type TransactionReceipt = z.infer<typeof TransactionReceiptSchema>;\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\nimport { AccountIdSchema } from './account.schema';\n\n/**\n * Token type\n */\nexport const TokenTypeSchema = z.enum(['fungible', 'nft', 'semi_fungible']);\n\nexport type TokenType = z.infer<typeof TokenTypeSchema>;\n\n/**\n * Token schema\n */\nexport const TokenSchema = z.object({\n tokenId: z.string(),\n chain: ChainTypeSchema,\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().int().min(0),\n totalSupply: z.string(),\n type: TokenTypeSchema,\n creator: AccountIdSchema.optional(),\n metadata: z.record(z.any()).optional(),\n createdAt: z.date().optional(),\n});\n\nexport type Token = z.infer<typeof TokenSchema>;\n\n/**\n * NFT metadata schema\n */\nexport const NFTMetadataSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n image: z.string().url().optional(),\n attributes: z\n .array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number(), z.boolean()]),\n })\n )\n .optional(),\n external_url: z.string().url().optional(),\n});\n\nexport type NFTMetadata = z.infer<typeof NFTMetadataSchema>;\n\n/**\n * Token info with holder details\n */\nexport const TokenInfoSchema = TokenSchema.extend({\n holders: z.number().optional(),\n transferCount: z.number().optional(),\n circulatingSupply: z.string().optional(),\n});\n\nexport type TokenInfo = z.infer<typeof TokenInfoSchema>;\n","import { z } from 'zod';\nimport { ChainTypeSchema } from './chain.schema';\nimport { AccountIdSchema } from './account.schema';\nimport { TokenCapabilitiesSchema } from './capabilities.schema';\nimport {\n SovereigntyFieldsRawSchema,\n sovereigntyRefinePredicate,\n SOVEREIGNTY_REFINE_MESSAGE,\n PreparedTransactionSovereigntySchema,\n} from './sovereignty.schema';\n\n/**\n * Create account request schema\n *\n * @important validatorTimestamp is REQUIRED - all entities must be bound to a validator.\n * The validator rules are stored on HCS and referenced by consensus timestamp.\n */\nexport const CreateAccountRequestSchema = z.object({\n chain: ChainTypeSchema,\n initialBalance: z.string(),\n publicKey: z.string().optional(),\n memo: z.string().optional(),\n /**\n * Who pays the chain fee for this transaction. Resolution happens in the\n * controller layer (`resolvePayerAccountId`): explicit `payerAccountId`\n * wins, else the JWT-authenticated smart-app's wallet address, else the\n * request is rejected with 400. The validator **never** silently falls\n * back to its own operator account.\n */\n payerAccountId: z.string().optional(),\n /**\n * HCS consensus timestamp of the validator rules (REQUIRED).\n * Format: \"1766490325.123456789\"\n */\n validatorTimestamp: z.string().min(1, 'validatorTimestamp is required'),\n /**\n * HCS topic ID where validator rules are stored (REQUIRED).\n */\n validatorTopicId: z.string().min(1, 'validatorTopicId is required'),\n /**\n * Whether to remove admin key after creation (makes entity immutable).\n * Default: true for production-grade immutability.\n */\n immutable: z.boolean().default(true),\n /**\n * Smart node security mode for the account key structure.\n * - 'partial': threshold(2, [appOwnerKey, tssKeyList]) — co-control\n * - 'full': TSS KeyList only — full validator network control\n * Default: 'full' (Arc 5 §7.5.2: 'none' removed).\n */\n securityMode: z.enum(['partial', 'full']).default('full'),\n /**\n * App owner's public key (required for 'partial' security mode).\n * The owner key + TSS network key form a threshold-2 multi-sig.\n */\n appOwnerPublicKey: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type CreateAccountRequest = z.infer<typeof CreateAccountRequestSchema>;\n\n/**\n * Create account response schema\n */\nexport const CreateAccountResponseSchema = z.object({\n accountId: AccountIdSchema,\n publicKey: z.string().optional(),\n privateKey: z.string().optional(), // Only returned on creation, store securely!\n transactionId: z.string(),\n chain: ChainTypeSchema,\n timestamp: z.date().optional(),\n});\n\nexport type CreateAccountResponse = z.infer<typeof CreateAccountResponseSchema>;\n\n/**\n * Transfer request schema\n */\nexport const TransferRequestSchema = z.object({\n chain: ChainTypeSchema,\n from: AccountIdSchema,\n to: AccountIdSchema,\n amount: z.string(),\n tokenId: z.string().optional(), // undefined = native token\n memo: z.string().optional(),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type TransferRequest = z.infer<typeof TransferRequestSchema>;\n\n/**\n * Transfer response schema\n */\nexport const TransferResponseSchema = z.object({\n transactionId: z.string(),\n status: z.enum(['pending', 'success', 'failed']),\n chain: ChainTypeSchema,\n fee: z.string().optional(),\n timestamp: z.date().optional(),\n});\n\nexport type TransferResponse = z.infer<typeof TransferResponseSchema>;\n\n/**\n * Query balance request schema\n */\nexport const QueryBalanceRequestSchema = z.object({\n chain: ChainTypeSchema,\n accountId: AccountIdSchema,\n});\n\nexport type QueryBalanceRequest = z.infer<typeof QueryBalanceRequestSchema>;\n\n/**\n * Query transaction request schema\n */\nexport const QueryTransactionRequestSchema = z.object({\n chain: ChainTypeSchema,\n transactionId: z.string(),\n});\n\nexport type QueryTransactionRequest = z.infer<typeof QueryTransactionRequestSchema>;\n\n/**\n * Create token request schema (v2 with capabilities)\n *\n * Supports universal token capabilities that are validated against chain support.\n * If a capability is requested but not supported on the target chain, an error is thrown.\n */\nexport const CreateTokenRequestSchema = z.object({\n chain: ChainTypeSchema,\n name: z.string().min(1).max(100),\n symbol: z.string().min(1).max(10),\n decimals: z.number().int().min(0).max(18),\n initialSupply: z.string(),\n type: z.enum(['fungible', 'nft']),\n treasury: AccountIdSchema.optional(),\n /**\n * Token capabilities define what operations the token supports.\n * These are validated against chain support and translated to native implementations.\n *\n * @example\n * ```typescript\n * capabilities: {\n * pausable: true, // Hedera: pauseKey, XRPL: GlobalFreeze\n * restrictable: true, // Hedera: freezeKey, XRPL: TrustLineFreeze\n * compliant: true, // Hedera: kycKey, XRPL: RequireAuth\n * wipeable: true, // Hedera: wipeKey, XRPL: Clawback\n * mintable: true, // Allow additional minting\n * burnable: true, // Allow burning\n * }\n * ```\n */\n capabilities: TokenCapabilitiesSchema.optional().default({\n pausable: false,\n restrictable: false,\n compliant: false,\n wipeable: false,\n mintable: true,\n burnable: true,\n transferable: true,\n }),\n /**\n * HCS consensus timestamp of the validator rules (REQUIRED).\n * Format: \"1766490325.123456789\"\n */\n validatorTimestamp: z.string().min(1, 'validatorTimestamp is required'),\n /**\n * HCS topic ID where validator rules are stored (REQUIRED).\n */\n validatorTopicId: z.string().min(1, 'validatorTopicId is required'),\n /**\n * Whether to remove admin key after creation (makes entity immutable).\n * Default: true for production-grade immutability.\n */\n immutable: z.boolean().default(true),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type CreateTokenRequest = z.infer<typeof CreateTokenRequestSchema>;\n\n/**\n * Create token response schema\n */\nexport const CreateTokenResponseSchema = z.object({\n tokenId: z.string(),\n transactionId: z.string(),\n chain: ChainTypeSchema,\n timestamp: z.date().optional(),\n});\n\nexport type CreateTokenResponse = z.infer<typeof CreateTokenResponseSchema>;\n\n/**\n * Mint token request schema\n */\n/**\n * Mint token request schema\n *\n * Supports both fungible and non-fungible token minting:\n * - Fungible: requires `amount` (e.g. \"1000\")\n * - NFT: requires `nftMetadata` (array of byte-encodable entries, one per NFT to mint)\n *\n * The chain adapter determines the appropriate native operation based on the token type.\n */\nexport const MintTokenRequestSchema = z.object({\n chain: ChainTypeSchema,\n tokenId: z.string(),\n\n /** Amount to mint (fungible tokens). Ignored for NFTs. */\n amount: z.string().optional(),\n\n /** Recipient account (fungible: transfer after mint; NFT: Hedera mints to treasury). */\n recipient: AccountIdSchema.optional(),\n\n /**\n * NFT metadata entries — one per NFT to mint.\n * Each entry becomes on-chain metadata (e.g. IPFS CID, encoded memo).\n * On Hedera: passed to TokenMintTransaction.setMetadata().\n * On XRPL: used as URI in NFTokenMint.\n */\n nftMetadata: z.array(z.string()).optional(),\n\n /** Additional chain-specific options. */\n metadata: z.record(z.any()).optional(),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n});\n\nexport type MintTokenRequest = z.infer<typeof MintTokenRequestSchema>;\n\n/**\n * Burn token request schema\n */\nexport const BurnTokenRequestSchema = z.object({\n chain: ChainTypeSchema,\n tokenId: z.string(),\n amount: z.string(),\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type BurnTokenRequest = z.infer<typeof BurnTokenRequestSchema>;\n\n/**\n * Token action request schema (for pause, restrict, etc.)\n */\nexport const TokenActionRequestSchema = z.object({\n chain: ChainTypeSchema,\n tokenId: z.string(),\n accountId: AccountIdSchema.optional(), // Required for account-specific actions\n amount: z.string().optional(), // Required for wipe action\n /** See CreateAccountRequestSchema.payerAccountId — same resolution rules. */\n payerAccountId: z.string().optional(),\n metadata: z.record(z.any()).optional(),\n});\n\nexport type TokenActionRequest = z.infer<typeof TokenActionRequestSchema>;\n\n/**\n * Action result schema - unified response for all token actions\n */\nexport const ActionResultSchema = z.object({\n success: z.boolean(),\n transactionId: z.string(),\n chain: ChainTypeSchema,\n /** The native chain operation that was executed */\n chainOperation: z.string(),\n /** Additional context or notes about the operation */\n notes: z.array(z.string()).optional(),\n /** Timestamp of the operation */\n timestamp: z.date().optional(),\n});\n\nexport type ActionResult = z.infer<typeof ActionResultSchema>;\n\n/**\n * Create token result schema - extends ActionResult with token info\n */\nexport const CreateTokenResultSchema = ActionResultSchema.extend({\n tokenId: z.string(),\n /** The capabilities that were enabled for this token */\n enabledCapabilities: z.array(z.string()),\n});\n\nexport type CreateTokenResult = z.infer<typeof CreateTokenResultSchema>;\n\n// =============================================================================\n// PREPARED TRANSACTION RESPONSE TYPES (v3 API - Transaction Sovereignty)\n// =============================================================================\n\n/**\n * Validator signature for a prepared transaction\n */\nexport const ValidatorSignatureSchema = z.object({\n /** Validator's node ID */\n validatorId: z.string(),\n /** Validator's public key (hex-encoded) */\n publicKey: z.string(),\n /** Signature over the transaction bytes (hex-encoded) */\n signature: z.string(),\n /** When this signature was created */\n signedAt: z.date(),\n /** Signature algorithm used */\n algorithm: z.enum(['ed25519', 'ecdsa-secp256k1', 'bls12-381']).optional(),\n});\n\nexport type ValidatorSignature = z.infer<typeof ValidatorSignatureSchema>;\n\n/**\n * Hedera-specific metadata for prepared transactions\n */\nexport const HederaPreparedMetadataSchema = z.object({\n /** Hedera node account IDs that will process this transaction */\n nodeAccountIds: z.array(z.string()).optional(),\n /** Maximum transaction fee in tinybars */\n maxTransactionFee: z.string().optional(),\n /** Transaction memo */\n memo: z.string().optional(),\n /** Schedule info if this is a scheduled transaction */\n scheduleInfo: z\n .object({\n scheduleId: z.string(),\n adminKey: z.string().optional(),\n })\n .optional(),\n});\n\nexport type HederaPreparedMetadata = z.infer<typeof HederaPreparedMetadataSchema>;\n\n/**\n * XRPL-specific metadata for prepared transactions\n */\nexport const XRPLPreparedMetadataSchema = z.object({\n /** Sequence number for this transaction */\n sequence: z.number().optional(),\n /** Last ledger sequence for expiration */\n lastLedgerSequence: z.number().optional(),\n /** Signer list info for multi-sig */\n signerList: z\n .array(\n z.object({\n account: z.string(),\n signerWeight: z.number(),\n })\n )\n .optional(),\n /** Quorum weight required */\n signerQuorum: z.number().optional(),\n});\n\nexport type XRPLPreparedMetadata = z.infer<typeof XRPLPreparedMetadataSchema>;\n\n/**\n * Solana-specific metadata for prepared transactions\n */\nexport const SolanaPreparedMetadataSchema = z.object({\n /** Recent blockhash for transaction validity */\n recentBlockhash: z.string().optional(),\n /** Fee payer account */\n feePayer: z.string().optional(),\n /** Program IDs involved */\n programIds: z.array(z.string()).optional(),\n /** Squads v4 multisig PDA address (partial/full modes) */\n squadsMultisigPda: z.string().optional(),\n /** Squads v4 vault PDA address (partial/full modes) */\n squadsVaultPda: z.string().optional(),\n /** Index of the vault transaction proposal */\n squadsTransactionIndex: z.number().optional(),\n /** Proposal PDA address */\n squadsProposalAddress: z.string().optional(),\n /** Whether the multisig was created in this call (vs already existed) */\n multisigCreated: z.boolean().optional(),\n /** Security mode used to prepare this transaction */\n securityMode: z.enum(['partial', 'full']).optional(),\n /** SPL Token mint address (token-create and all SPL operations) */\n splMint: z.string().optional(),\n});\n\nexport type SolanaPreparedMetadata = z.infer<typeof SolanaPreparedMetadataSchema>;\n\n/**\n * Polkadot-specific metadata for prepared transactions\n */\nexport const PolkadotPreparedMetadataSchema = z.object({\n /** Era for transaction mortality */\n era: z.string().optional(),\n /** Nonce for the sender */\n nonce: z.number().optional(),\n /** Tip for priority */\n tip: z.string().optional(),\n /** Spec version for runtime */\n specVersion: z.number().optional(),\n});\n\nexport type PolkadotPreparedMetadata = z.infer<typeof PolkadotPreparedMetadataSchema>;\n\n/**\n * Union of all chain-specific metadata types\n */\nexport const ChainPreparedMetadataSchema = z.union([\n HederaPreparedMetadataSchema,\n XRPLPreparedMetadataSchema,\n SolanaPreparedMetadataSchema,\n PolkadotPreparedMetadataSchema,\n z.record(z.any()), // Allow extension for future chains\n]);\n\nexport type ChainPreparedMetadata = z.infer<typeof ChainPreparedMetadataSchema>;\n\n/**\n * Prepared transaction response - the core type for v3 API\n *\n * IMPORTANT: This is the unified response type for all transaction operations.\n * The transaction is frozen/prepared but NOT submitted. The caller is responsible\n * for submitting the transaction to the network.\n *\n * SECURITY PRINCIPLES:\n * 1. Validators NEVER pay fees - caller provides payerAccountId\n * 2. Validators NEVER submit transactions - they return signed bytes\n * 3. All operations use multi-sig - no single-key fallbacks\n * 4. Transaction ID is pre-assigned for deterministic tracking\n */\nexport const PreparedTransactionResponseSchema = z.object({\n /** The blockchain this transaction is for */\n chain: ChainTypeSchema,\n /** Type of transaction (e.g., 'TokenCreate', 'Payment', 'NFTMint') */\n transactionType: z.string(),\n /** Pre-assigned transaction ID for tracking */\n transactionId: z.string(),\n /** Base64-encoded frozen transaction bytes ready for submission */\n transactionBytes: z.string(),\n /** When this prepared transaction expires */\n expiresAt: z.date(),\n /** Validator signatures collected for this transaction */\n validatorSignatures: z.array(ValidatorSignatureSchema),\n /** Required payer account ID (caller must fund this account) */\n payerAccountId: z.string().optional(),\n /** Estimated network fee */\n estimatedFee: z.string().optional(),\n /** Number of signatures required for submission */\n requiredSignatures: z.number().optional(),\n /** Whether the transaction has enough signatures to submit */\n readyToSubmit: z.boolean().default(false),\n /** Chain-specific metadata */\n metadata: ChainPreparedMetadataSchema.optional(),\n /**\n * Sovereignty metadata: the mode and (for partial/full) the on-chain\n * authorization set the validator is binding to. Lets smart-apps and tests\n * inspect the authorization topology without decoding chain-native bytes.\n */\n sovereignty: PreparedTransactionSovereigntySchema.optional(),\n});\n\nexport type PreparedTransactionResponse = z.infer<typeof PreparedTransactionResponseSchema>;\n\n/**\n * Generic prepared transaction response with typed metadata\n */\nexport type PreparedTransactionResponseWithMetadata<T extends ChainPreparedMetadata> = Omit<\n PreparedTransactionResponse,\n 'metadata'\n> & {\n metadata?: T;\n};\n\n/**\n * Type-safe prepared transaction responses for each chain\n */\nexport type HederaPreparedTransaction =\n PreparedTransactionResponseWithMetadata<HederaPreparedMetadata>;\n/**\n * XRPL prepared transaction response.\n *\n * Includes `transactionJson` alongside `transactionBytes` so xrpl.js-native\n * clients can sign the autofilled transaction object directly without having\n * to decode the binary blob. See Transaction Sovereignty Parity Part A.4.\n *\n * `transactionJson` is typed as the structural minimum — the fields every\n * autofilled XRPL tx carries — so `@hsuite/smart-engines-shared` stays\n * decoupled from the xrpl.js package. Callers that need the full\n * `SubmittableTransaction` union (see xrpl.js) should consume the stronger\n * local type exported from `@hsuite/smart-engines-chain-xrpl`, which is\n * typed against xrpl.js directly.\n */\nexport type XRPLPreparedTransactionJson = {\n TransactionType: string;\n Account: string;\n Fee?: string;\n Sequence?: number;\n LastLedgerSequence?: number;\n [extra: string]: unknown;\n};\n\nexport type XRPLPreparedTransaction = PreparedTransactionResponseWithMetadata<XRPLPreparedMetadata> & {\n /** Autofilled XRPL transaction object (post-autofill, pre-sign) for xrpl.js-native callers */\n transactionJson: XRPLPreparedTransactionJson;\n};\nexport type SolanaPreparedTransaction =\n PreparedTransactionResponseWithMetadata<SolanaPreparedMetadata>;\nexport type PolkadotPreparedTransaction =\n PreparedTransactionResponseWithMetadata<PolkadotPreparedMetadata>;\n\n/**\n * Submission result after caller submits the prepared transaction\n */\nexport const TransactionSubmissionResultSchema = z.object({\n /** The original transaction ID */\n transactionId: z.string(),\n /** The blockchain */\n chain: ChainTypeSchema,\n /** Whether submission was successful */\n success: z.boolean(),\n /** Consensus timestamp (Hedera) or ledger/block info */\n consensusTimestamp: z.string().optional(),\n /** Block or ledger number */\n blockNumber: z.number().optional(),\n /** Actual fee paid */\n actualFee: z.string().optional(),\n /** Receipt or confirmation data */\n receipt: z.record(z.any()).optional(),\n /** Error message if submission failed */\n error: z.string().optional(),\n});\n\nexport type TransactionSubmissionResult = z.infer<typeof TransactionSubmissionResultSchema>;\n\n// =============================================================================\n// PREPARE REQUEST SCHEMAS (v3 API - Transaction Sovereignty Mixed Layer)\n// =============================================================================\n\n/**\n * Prepare token-create request schema (Hedera HTS).\n *\n * Merges SovereigntyFieldsSchema so securityMode, entityId, and\n * appOwnerPublicKey carry the same cross-chain invariants.\n */\nexport const PrepareTokenCreateRequestSchema = z\n .object({\n chain: z.literal('hedera'),\n payerAccountId: z.string().optional(),\n name: z.string().min(1).max(100),\n symbol: z.string().min(1).max(10),\n decimals: z.number().int().min(0).max(18),\n initialSupply: z.string(),\n treasuryAccountId: z.string().min(1, 'treasuryAccountId is required'),\n memo: z.string().optional(),\n tokenType: z.enum(['FUNGIBLE_COMMON', 'NON_FUNGIBLE_UNIQUE']).default('FUNGIBLE_COMMON'),\n supplyKey: z.string().optional(),\n adminKey: z.string().optional(),\n pauseKey: z.string().optional(),\n freezeKey: z.string().optional(),\n kycKey: z.string().optional(),\n wipeKey: z.string().optional(),\n validatorTimestamp: z.string().min(1),\n validatorTopicId: z.string().min(1),\n })\n // SovereigntyFieldsRawSchema is the unrefined object (no .refine wrapping)\n // the sovereignty invariant is re-applied by the .refine() below.\n .merge(SovereigntyFieldsRawSchema)\n .refine(sovereigntyRefinePredicate, { message: SOVEREIGNTY_REFINE_MESSAGE });\n\nexport type PrepareTokenCreateRequest = z.infer<typeof PrepareTokenCreateRequestSchema>;\n\n/**\n * Prepare XRPL account-setup request schema.\n *\n * Used to configure the authorization (signer list / AccountSet flags) on an\n * existing XRPL account as part of the sovereignty key setup.\n */\nexport const PrepareXrplAccountSetupRequestSchema = z\n .object({\n chain: z.literal('xrpl'),\n payerAccountId: z.string().optional(),\n // User's XRPL account whose authorization we're configuring.\n accountAddress: z.string().min(25).max(34),\n validatorTimestamp: z.string().min(1),\n validatorTopicId: z.string().min(1),\n })\n .merge(SovereigntyFieldsRawSchema)\n .refine(sovereigntyRefinePredicate, { message: SOVEREIGNTY_REFINE_MESSAGE });\n\nexport type PrepareXrplAccountSetupRequest = z.infer<typeof PrepareXrplAccountSetupRequestSchema>;\n\n/**\n * Prepare Stellar account-create request schema.\n *\n * Creates a new Stellar account and optionally configures sovereignty signers.\n */\nexport const PrepareStellarAccountCreateRequestSchema = z\n .object({\n chain: z.literal('stellar'),\n payerAccountId: z.string().optional(),\n // The master public key of the new Stellar account.\n publicKey: z.string().min(56).max(56),\n startingBalance: z.string().regex(/^\\d+(\\.\\d+)?$/),\n validatorTimestamp: z.string().min(1),\n validatorTopicId: z.string().min(1),\n })\n .merge(SovereigntyFieldsRawSchema)\n // Stellar's partial mode uses the new account's OWN master key as the\n // \"user\" signer (via SetOptions(masterWeight=2)) — there is NO separate\n // appOwnerPublicKey because Stellar allows the master key to satisfy\n // authorization directly. Only entityId is required for partial/full.\n .refine(\n (v) => !!v.entityId,\n { message: \"securityMode='partial'/'full' requires entityId\" },\n );\n\nexport type PrepareStellarAccountCreateRequest = z.infer<\n typeof PrepareStellarAccountCreateRequestSchema\n>;\n","/**\n * Discovery Module\n *\n * Validator discovery via HCS registry topic.\n */\n\nexport {\n ValidatorDiscoveryClient,\n ValidatorDiscoveryConfig,\n ValidatorInfo,\n ValidatorNetworkEndpoints,\n ValidatorMetadata,\n} from './validator-discovery';\n\nexport {\n MirrorNodeClient,\n MirrorNodeConfig,\n MirrorNodeError,\n TopicMessage,\n TopicMessagesResponse,\n MIRROR_NODE_URLS,\n} from './mirror-node';\n\nexport {\n ClusterDiscoveryClient,\n ClusterDiscoveryConfig,\n ClusterEndpointsView,\n ClusterInfo,\n} from './cluster-discovery';\n","/**\n * Hedera Mirror Node Client\n *\n * Lightweight client for querying Hedera mirror node REST API.\n * Used for validator discovery by reading HCS topic messages.\n */\n\n/**\n * Mirror node configuration\n */\nexport interface MirrorNodeConfig {\n /** Mirror node base URL (e.g., https://testnet.mirrornode.hedera.com) */\n baseUrl: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Allow HTTP (insecure) connections - default false */\n allowInsecure?: boolean;\n}\n\n/**\n * Validate and sanitize a URL\n * Prevents SSRF and ensures HTTPS for security\n */\nfunction validateUrl(url: string, allowInsecure = false): URL {\n try {\n const parsed = new URL(url);\n\n // Only allow http/https protocols\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new Error(`Invalid protocol: ${parsed.protocol}`);\n }\n\n // Enforce HTTPS unless explicitly allowed\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new Error(\n 'HTTPS is required for secure connections. Set allowInsecure=true to override.'\n );\n }\n\n // Block private/internal IP ranges to prevent SSRF\n const hostname = parsed.hostname.toLowerCase();\n const blockedPatterns = [\n /^localhost$/i,\n /^127\\./,\n /^10\\./,\n /^172\\.(1[6-9]|2[0-9]|3[01])\\./,\n /^192\\.168\\./,\n /^169\\.254\\./,\n /^::1$/,\n /^fe80:/i,\n /^fc00:/i,\n /^fd00:/i,\n ];\n\n // Allow localhost only in development with explicit flag\n const isPrivate = blockedPatterns.some((pattern) => pattern.test(hostname));\n if (isPrivate && !allowInsecure) {\n throw new Error(\n 'Private/internal URLs are blocked. Set allowInsecure=true for local development.'\n );\n }\n\n return parsed;\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid URL')) {\n throw new MirrorNodeError(`Invalid URL format: ${url}`, 400);\n }\n throw error;\n }\n}\n\n/**\n * Validate Hedera topic ID format\n */\nfunction validateTopicId(topicId: string): void {\n // Format: shard.realm.num (e.g., 0.0.123456)\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(topicId)) {\n throw new MirrorNodeError(\n `Invalid topic ID format: ${topicId}. Expected format: 0.0.123456`,\n 400\n );\n }\n}\n\n/**\n * HCS topic message from mirror node API\n */\nexport interface TopicMessage {\n /** Consensus timestamp */\n consensus_timestamp: string;\n /** Message content (base64 encoded) */\n message: string;\n /** Payer account ID */\n payer_account_id: string;\n /** Running hash */\n running_hash: string;\n /** Running hash version */\n running_hash_version: number;\n /** Sequence number */\n sequence_number: number;\n /** Topic ID */\n topic_id: string;\n}\n\n/**\n * Mirror node API response for topic messages\n */\nexport interface TopicMessagesResponse {\n messages: TopicMessage[];\n links: {\n next?: string;\n };\n}\n\n/**\n * Default mirror node URLs by network\n */\nexport const MIRROR_NODE_URLS: Record<string, string> = {\n mainnet: 'https://mainnet-public.mirrornode.hedera.com',\n testnet: 'https://testnet.mirrornode.hedera.com',\n previewnet: 'https://previewnet.mirrornode.hedera.com',\n};\n\n/**\n * Hedera Mirror Node Client\n *\n * Query HCS topic messages via REST API for validator discovery.\n */\nexport class MirrorNodeClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly allowInsecure: boolean;\n\n constructor(config: MirrorNodeConfig) {\n this.allowInsecure = config.allowInsecure ?? false;\n\n // Validate the base URL\n const validatedUrl = validateUrl(config.baseUrl, this.allowInsecure);\n this.baseUrl = validatedUrl.origin;\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Create client for a specific network\n */\n static forNetwork(network: 'mainnet' | 'testnet' | 'previewnet'): MirrorNodeClient {\n const baseUrl = MIRROR_NODE_URLS[network];\n if (!baseUrl) {\n throw new Error(`Unknown network: ${network}`);\n }\n return new MirrorNodeClient({ baseUrl });\n }\n\n /**\n * Get topic messages from mirror node\n *\n * @param topicId - HCS topic ID (e.g., '0.0.123456')\n * @param options - Query options\n * @returns Topic messages\n */\n async getTopicMessages(\n topicId: string,\n options?: {\n /** Limit number of messages */\n limit?: number;\n /** Order (asc or desc) */\n order?: 'asc' | 'desc';\n /** Timestamp to start from */\n timestampStart?: string;\n /** Timestamp to end at */\n timestampEnd?: string;\n /** Sequence number to start from */\n sequenceNumberStart?: number;\n }\n ): Promise<TopicMessage[]> {\n // Validate topic ID format to prevent injection\n validateTopicId(topicId);\n\n const params = new URLSearchParams();\n\n if (options?.limit) {\n params.set('limit', options.limit.toString());\n }\n if (options?.order) {\n params.set('order', options.order);\n }\n if (options?.timestampStart) {\n params.set('timestamp', `gte:${options.timestampStart}`);\n }\n if (options?.timestampEnd) {\n params.set('timestamp', `lte:${options.timestampEnd}`);\n }\n if (options?.sequenceNumberStart) {\n params.set('sequencenumber', `gte:${options.sequenceNumberStart}`);\n }\n\n const url = `${this.baseUrl}/api/v1/topics/${topicId}/messages?${params.toString()}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new MirrorNodeError(\n `Mirror node error: ${response.status} ${response.statusText}`,\n response.status\n );\n }\n\n const data = (await response.json()) as TopicMessagesResponse;\n return data.messages;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof MirrorNodeError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new MirrorNodeError('Mirror node request timeout', 408);\n }\n throw new MirrorNodeError(`Mirror node network error: ${err.message}`, 0);\n }\n }\n\n /**\n * Get all topic messages with pagination\n *\n * @param topicId - HCS topic ID\n * @param maxMessages - Maximum messages to fetch (default: 1000)\n * @returns All topic messages\n */\n async getAllTopicMessages(topicId: string, maxMessages: number = 1000): Promise<TopicMessage[]> {\n // Validate topic ID format\n validateTopicId(topicId);\n\n // Enforce reasonable limits to prevent DoS\n const safeMaxMessages = Math.min(maxMessages, 10000);\n\n const allMessages: TopicMessage[] = [];\n let nextPath: string | undefined = `/api/v1/topics/${topicId}/messages?limit=100&order=desc`;\n\n while (nextPath && allMessages.length < safeMaxMessages) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Construct full URL safely - only use path from pagination\n const fullUrl = `${this.baseUrl}${nextPath}`;\n\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new MirrorNodeError(\n `Mirror node error: ${response.status} ${response.statusText}`,\n response.status\n );\n }\n\n const data = (await response.json()) as TopicMessagesResponse;\n allMessages.push(...data.messages);\n\n // Validate and sanitize pagination link\n // Only accept relative paths starting with /api/v1/\n if (data.links.next) {\n const nextLink = data.links.next;\n if (nextLink.startsWith('/api/v1/topics/')) {\n nextPath = nextLink;\n } else {\n // Invalid pagination link - stop pagination\n nextPath = undefined;\n }\n } else {\n nextPath = undefined;\n }\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof MirrorNodeError) {\n throw error;\n }\n const err = error as Error;\n throw new MirrorNodeError(`Mirror node error: ${err.message}`, 0);\n }\n }\n\n return allMessages.slice(0, safeMaxMessages);\n }\n\n /**\n * Decode base64 message content\n */\n static decodeMessage(base64Message: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(base64Message, 'base64').toString('utf-8');\n }\n // Browser environment\n return atob(base64Message);\n }\n}\n\n/**\n * Mirror node error\n */\nexport class MirrorNodeError extends Error {\n constructor(\n message: string,\n public statusCode: number\n ) {\n super(message);\n this.name = 'MirrorNodeError';\n }\n}\n","/**\n * Validator Discovery Client\n *\n * Discover smart-engine validators by reading the HCS validator registry topic.\n * Provides methods to list validators and select random validators for connection.\n */\n\nimport { MirrorNodeClient, MIRROR_NODE_URLS } from './mirror-node';\n\n/**\n * Network endpoints for validator connectivity\n */\nexport interface ValidatorNetworkEndpoints {\n /** HTTP API endpoint (e.g., https://validator.example.com:3000) */\n apiEndpoint: string;\n /** NATS endpoint for peer-to-peer messaging */\n natsEndpoint?: string;\n /** Public IP for NAT traversal */\n publicIp?: string;\n /** NATS port if different from default */\n natsPort?: number;\n}\n\n/**\n * Validator metadata\n */\nexport interface ValidatorMetadata {\n /** Human-readable description */\n description?: string;\n /** Version string */\n version?: string;\n /** Tags for categorization */\n tags?: string[];\n /** Author/operator name */\n author?: string;\n}\n\n/**\n * Validator registry entry parsed from HCS\n */\nexport interface ValidatorInfo {\n /** Validator consensus timestamp (unique ID) */\n validatorTimestamp: string;\n /** Node ID (e.g., validator-1) */\n nodeId: string;\n /** Validator type */\n type: 'consensus' | 'tokens' | 'accounts' | 'network';\n /** Network endpoints for connectivity */\n networkEndpoints?: ValidatorNetworkEndpoints;\n /** Public key for peer authentication (Ed25519 hex) */\n publicKey?: string;\n /** Membership NFT serial number */\n membershipNftSerial?: number;\n /** Supported blockchain capabilities */\n capabilities?: string[];\n /** Validator metadata */\n metadata: ValidatorMetadata;\n /** When registered */\n registeredAt: string;\n /** Message type */\n messageType?: 'validator.join' | 'validator.leave' | 'validator.update';\n}\n\n/**\n * Validator discovery configuration\n */\nexport interface ValidatorDiscoveryConfig {\n /** Hedera network (mainnet, testnet, previewnet) */\n network: 'mainnet' | 'testnet' | 'previewnet';\n /** HCS topic ID for validator registry */\n registryTopicId: string;\n /** Cache TTL in milliseconds (default: 60000 = 1 minute) */\n cacheTtlMs?: number;\n /** Custom mirror node URL (optional) */\n mirrorNodeUrl?: string;\n /** Allow HTTP (insecure) connections - only for local development */\n allowInsecure?: boolean;\n}\n\n/**\n * Cached validators data\n */\ninterface ValidatorCache {\n validators: ValidatorInfo[];\n lastUpdated: number;\n}\n\n/**\n * Validator Discovery Client\n *\n * Discovers validators by reading the HCS validator registry topic\n * via Hedera mirror node API.\n *\n * @example\n * ```typescript\n * const discovery = new ValidatorDiscoveryClient({\n * network: 'testnet',\n * registryTopicId: '0.0.123456',\n * });\n *\n * const validators = await discovery.getValidators();\n * const randomValidator = await discovery.getRandomValidator();\n * ```\n */\nexport class ValidatorDiscoveryClient {\n private readonly mirrorNode: MirrorNodeClient;\n private readonly registryTopicId: string;\n private readonly cacheTtlMs: number;\n private cache: ValidatorCache | null = null;\n\n constructor(config: ValidatorDiscoveryConfig) {\n const mirrorNodeUrl = config.mirrorNodeUrl || MIRROR_NODE_URLS[config.network];\n if (!mirrorNodeUrl) {\n throw new Error(`Unknown network: ${config.network}`);\n }\n\n this.mirrorNode = new MirrorNodeClient({\n baseUrl: mirrorNodeUrl,\n allowInsecure: config.allowInsecure,\n });\n this.registryTopicId = config.registryTopicId;\n this.cacheTtlMs = config.cacheTtlMs ?? 60000; // 1 minute default\n }\n\n /**\n * Get all active validators from the registry\n *\n * Results are cached for efficiency. Use `forceRefresh` to bypass cache.\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns List of active validators\n */\n async getValidators(forceRefresh = false): Promise<ValidatorInfo[]> {\n // Return cached data if valid\n if (!forceRefresh && this.cache && this.isCacheValid()) {\n return this.cache.validators;\n }\n\n // Fetch from mirror node\n const messages = await this.mirrorNode.getAllTopicMessages(\n this.registryTopicId,\n 500 // Max messages to fetch\n );\n\n // Parse and deduplicate validators\n const validatorMap = new Map<string, ValidatorInfo>();\n const leftValidators = new Set<string>();\n\n // Process messages (newest first since we fetch desc order)\n for (const msg of messages) {\n try {\n const content = MirrorNodeClient.decodeMessage(msg.message);\n const raw = JSON.parse(content) as Record<string, unknown>;\n const entry = normalizeRegistryEntry(raw);\n if (!entry) continue;\n\n // Track leave events\n if (entry.messageType === 'validator.leave') {\n leftValidators.add(entry.nodeId);\n continue;\n }\n\n // Skip if validator has left\n if (leftValidators.has(entry.nodeId)) {\n continue;\n }\n\n // Keep only the latest entry per nodeId\n if (!validatorMap.has(entry.nodeId)) {\n validatorMap.set(entry.nodeId, entry);\n }\n } catch {\n // Skip unparseable messages\n continue;\n }\n }\n\n const validators = Array.from(validatorMap.values());\n\n // Update cache\n this.cache = {\n validators,\n lastUpdated: Date.now(),\n };\n\n return validators;\n }\n\n /**\n * Get validators with API endpoints available\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns Validators with apiEndpoint configured\n */\n async getValidatorsWithEndpoints(forceRefresh = false): Promise<ValidatorInfo[]> {\n const validators = await this.getValidators(forceRefresh);\n return validators.filter((v) => v.networkEndpoints?.apiEndpoint);\n }\n\n /**\n * Get a random validator from the registry\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns Random validator info or null if none available\n */\n async getRandomValidator(forceRefresh = false): Promise<ValidatorInfo | null> {\n const validators = await this.getValidatorsWithEndpoints(forceRefresh);\n\n if (validators.length === 0) {\n return null;\n }\n\n // Use crypto.getRandomValues for cryptographically secure random selection\n const randomBytes = new Uint32Array(1);\n crypto.getRandomValues(randomBytes);\n const randomIndex = randomBytes[0] % validators.length;\n return validators[randomIndex];\n }\n\n /**\n * Get a random validator API endpoint URL\n *\n * @param forceRefresh - Force refresh from mirror node\n * @returns Random validator API URL or null if none available\n */\n async getRandomValidatorUrl(forceRefresh = false): Promise<string | null> {\n const validator = await this.getRandomValidator(forceRefresh);\n return validator?.networkEndpoints?.apiEndpoint ?? null;\n }\n\n /**\n * Get validator by node ID\n *\n * @param nodeId - Validator node ID (e.g., 'validator-1')\n * @param forceRefresh - Force refresh from mirror node\n * @returns Validator info or null if not found\n */\n async getValidatorByNodeId(nodeId: string, forceRefresh = false): Promise<ValidatorInfo | null> {\n const validators = await this.getValidators(forceRefresh);\n return validators.find((v) => v.nodeId === nodeId) ?? null;\n }\n\n /**\n * Get validators by capability\n *\n * @param capability - Required capability (e.g., 'hedera', 'xrpl', 'dkg')\n * @param forceRefresh - Force refresh from mirror node\n * @returns Validators with the specified capability\n */\n async getValidatorsByCapability(\n capability: string,\n forceRefresh = false\n ): Promise<ValidatorInfo[]> {\n const validators = await this.getValidatorsWithEndpoints(forceRefresh);\n return validators.filter((v) => v.capabilities?.includes(capability));\n }\n\n /**\n * Clear the validator cache\n */\n clearCache(): void {\n this.cache = null;\n }\n\n /**\n * Check if cache is still valid\n */\n private isCacheValid(): boolean {\n if (!this.cache) return false;\n return Date.now() - this.cache.lastUpdated < this.cacheTtlMs;\n }\n}\n\n/**\n * Normalize a raw registry message into a ValidatorInfo.\n *\n * Accepts two shapes observed on real HCS registry topics:\n *\n * 1. Canonical (emitted by chain-hedera ValidatorRegistryService):\n * { messageType: 'validator.join'|'validator.leave'|'validator.update',\n * nodeId, networkEndpoints: { apiEndpoint, ... }, ... }\n *\n * 2. Legacy / multisig-consensus (emitted by ops / genesis scripts):\n * { type: 'validator.register', validatorId, endpoint, capabilities,\n * publicKey, accountId, network, ... }\n *\n * Token-scoped validator registrations (validatorType === 'token') are ignored\n * — those are DAO token validators, not node validators. Returns null when the\n * entry doesn't represent a node validator.\n */\nfunction normalizeRegistryEntry(raw: Record<string, unknown>): ValidatorInfo | null {\n // Canonical shape: already a ValidatorInfo\n if (raw.messageType && typeof raw.nodeId === 'string') {\n return raw as unknown as ValidatorInfo;\n }\n\n // Legacy shape: { type: 'validator.register', validatorId, endpoint, ... }\n if (raw.type === 'validator.register') {\n // Skip token validator registrations - they aren't nodes\n if (raw.validatorType && raw.validatorType !== undefined && raw.validatorType !== null) {\n if (typeof raw.validatorType === 'string' && raw.validatorType !== 'node') {\n return null;\n }\n }\n\n const nodeId =\n (typeof raw.validatorId === 'string' && raw.validatorId) ||\n (typeof raw.nodeId === 'string' && raw.nodeId) ||\n null;\n if (!nodeId) return null;\n\n const endpoint = typeof raw.endpoint === 'string' ? raw.endpoint : undefined;\n if (!endpoint) return null;\n\n const capabilities = Array.isArray(raw.capabilities)\n ? (raw.capabilities as unknown[]).filter((c): c is string => typeof c === 'string')\n : undefined;\n\n return {\n validatorTimestamp: typeof raw.timestamp === 'string' ? raw.timestamp : '',\n nodeId,\n type: 'consensus',\n networkEndpoints: { apiEndpoint: endpoint },\n publicKey: typeof raw.publicKey === 'string' ? raw.publicKey : undefined,\n capabilities,\n metadata: {},\n registeredAt: typeof raw.timestamp === 'string' ? raw.timestamp : '',\n messageType: 'validator.join',\n };\n }\n\n // Unknown / unrelated message type (e.g., token validator registrations)\n return null;\n}\n","/**\n * Cluster Discovery Client\n *\n * SDK-side consumer of the service-registry distribution layer landed in\n * PR-1 of the cluster-discovery arc (smart-validator\n * `GET /api/v3/discovery/clusters`). Replaces the legacy \"caller pins one\n * baseUrl\" pattern with a bootstrap-seed list that random-picks an active\n * cluster per request, so SDK consumers automatically follow permissionless\n * cluster join/leave without code edits.\n *\n * Resolution chain (per `docs/ops/HANDOFF-service-registry-distribution-layer.md` §6):\n * 1. HTTP fetch of `/api/v3/discovery/clusters` from each bootstrap seed\n * in order; take the first successful response.\n * 2. (Optional) HCS trust-anchor membership cross-check — verify that\n * every returned nodeId appears in the HCS validator registry and\n * that the publicKey matches. A bootstrap seed cannot inject a rogue\n * cluster whose nodeIds aren't on-chain.\n * 3. Random-pick over the verified set.\n *\n * The legacy {@link ValidatorDiscoveryClient} (HCS mirror-node read,\n * per-validator granularity) stays available as a fallback / trust anchor\n * — it is the only path that doesn't require any HTTP-reachable cluster.\n *\n * @see docs/ops/HANDOFF-service-registry-distribution-layer.md\n */\n\nimport { ValidatorDiscoveryClient, type ValidatorDiscoveryConfig } from './validator-discovery';\n\n/**\n * Cluster-level endpoint metadata as exposed by the validator's\n * `/api/v3/discovery/clusters` HTTP endpoint. Mirrors the on-wire shape\n * defined server-side by `ClusterEndpointsPayloadSchema` in\n * `apps/smart-validator/src/service-registry/events/service-registry.events.ts`.\n */\nexport interface ClusterEndpointsView {\n clusterId: string;\n gatewayUrl: string;\n harborUrl?: string;\n natsUrl?: string;\n publicIp?: string;\n region?: string;\n}\n\n/**\n * Cluster info as returned by `getClusters()`. `nodeIds` are the validator\n * nodeIds whose announcements contributed to this cluster's record —\n * useful for HCS trust-anchor cross-checking.\n */\nexport interface ClusterInfo {\n clusterId: string;\n endpoints: ClusterEndpointsView;\n nodeIds: string[];\n}\n\nexport interface ClusterDiscoveryConfig {\n /**\n * Bootstrap seeds — fully-qualified URLs that respond to\n * `GET /api/v3/discovery/clusters`. The SDK tries them in order on each\n * refresh; the first success wins. **Order is the operator's\n * preference signal** (e.g., list a Cloudflare-fronted hostname first,\n * then individual cluster ingress IPs as backstops).\n */\n bootstrap: string[];\n\n /** Cache TTL in milliseconds (default: 60_000 — same as HCS path). */\n cacheTtlMs?: number;\n\n /**\n * Per-bootstrap fetch timeout in milliseconds (default: 5_000). Keep\n * tight: when the first seed is unreachable, we want to fall through\n * to the next without blocking the SDK call for long.\n */\n fetchTimeoutMs?: number;\n\n /**\n * Optional HCS trust anchor. When supplied, the SDK lazily loads the\n * on-chain validator-registry set and verifies that:\n *\n * - every cluster's `nodeIds` appears in the HCS registry, and\n * - the on-chain `publicKey` for each nodeId matches the HTTP\n * response (when the discovery endpoint exposes it).\n *\n * Clusters that fail the cross-check are dropped silently. A logged\n * warning would normally accompany this, but the SDK is environment-\n * agnostic (browser, Node, edge) — surfacing via the returned set is\n * the conservative contract.\n *\n * The anchor is purely advisory in PR-3; cryptographic per-record\n * signature verification is a follow-up once the DKG-signed payload\n * shape stabilizes.\n */\n trustAnchor?: ValidatorDiscoveryConfig;\n\n /** Allow HTTP (insecure) connections — only for local development. */\n allowInsecure?: boolean;\n}\n\ninterface ClusterCache {\n clusters: ClusterInfo[];\n lastUpdated: number;\n}\n\n/**\n * Cluster Discovery Client — HTTP-driven, random-pick across an active\n * cluster set with optional on-chain trust anchor.\n */\nexport class ClusterDiscoveryClient {\n private readonly bootstrap: string[];\n private readonly cacheTtlMs: number;\n private readonly fetchTimeoutMs: number;\n private readonly allowInsecure: boolean;\n private readonly trustAnchorClient: ValidatorDiscoveryClient | null;\n private cache: ClusterCache | null = null;\n\n constructor(config: ClusterDiscoveryConfig) {\n if (!config.bootstrap || config.bootstrap.length === 0) {\n throw new Error('ClusterDiscoveryClient: bootstrap must list at least one seed URL');\n }\n if (!config.allowInsecure) {\n for (const seed of config.bootstrap) {\n if (!seed.startsWith('https://')) {\n throw new Error(\n `ClusterDiscoveryClient: bootstrap seed \"${seed}\" is not HTTPS. ` +\n `Set allowInsecure=true for local development only.`,\n );\n }\n }\n }\n this.bootstrap = config.bootstrap;\n this.cacheTtlMs = config.cacheTtlMs ?? 60_000;\n this.fetchTimeoutMs = config.fetchTimeoutMs ?? 5_000;\n this.allowInsecure = config.allowInsecure ?? false;\n this.trustAnchorClient = config.trustAnchor\n ? new ValidatorDiscoveryClient(config.trustAnchor)\n : null;\n }\n\n /**\n * Fetch the active-cluster set, with caching.\n *\n * Tries each bootstrap seed in order until one returns HTTP 200 with a\n * parseable cluster list. If all seeds fail, throws — callers can\n * handle by falling back to a previously-cached value if they want,\n * or by initializing with multiple seeds.\n */\n async getClusters(forceRefresh = false): Promise<ClusterInfo[]> {\n if (!forceRefresh && this.cache && this.isCacheValid()) {\n return this.cache.clusters;\n }\n\n const fetched = await this.fetchFromFirstAvailableSeed();\n const verified = this.trustAnchorClient ? await this.verifyAgainstTrustAnchor(fetched) : fetched;\n\n this.cache = { clusters: verified, lastUpdated: Date.now() };\n return verified;\n }\n\n /**\n * Random pick over the active-cluster set. Returns `null` when no\n * cluster passes verification (empty registry / all-rejected anchor).\n *\n * Uses `crypto.getRandomValues` when available (browsers, Deno, modern\n * Node) for cryptographic-strength randomness; `Math.random` is a\n * fallback for older runtimes where `globalThis.crypto` is undefined.\n * Discovery isn't cryptographically sensitive — load distribution is\n * the goal here.\n */\n async getRandomCluster(forceRefresh = false): Promise<ClusterInfo | null> {\n const clusters = await this.getClusters(forceRefresh);\n if (clusters.length === 0) return null;\n return clusters[this.pickRandomIndex(clusters.length)];\n }\n\n /**\n * Convenience wrapper returning just the gateway URL of a random\n * active cluster. The single most-used SDK entry point — most\n * downstream callers want `new SmartEngineClient({ baseUrl: ... })`\n * and don't care about the rest of the metadata.\n */\n async getRandomGatewayUrl(forceRefresh = false): Promise<string | null> {\n const cluster = await this.getRandomCluster(forceRefresh);\n return cluster?.endpoints.gatewayUrl ?? null;\n }\n\n /** Per-clusterId lookup, useful for \"stick the SDK to cluster X\" flows. */\n async getClusterById(clusterId: string, forceRefresh = false): Promise<ClusterInfo | null> {\n const clusters = await this.getClusters(forceRefresh);\n return clusters.find((c) => c.clusterId === clusterId) ?? null;\n }\n\n clearCache(): void {\n this.cache = null;\n }\n\n private isCacheValid(): boolean {\n if (!this.cache) return false;\n return Date.now() - this.cache.lastUpdated < this.cacheTtlMs;\n }\n\n private async fetchFromFirstAvailableSeed(): Promise<ClusterInfo[]> {\n const errors: string[] = [];\n for (const seed of this.bootstrap) {\n try {\n return await this.fetchClustersFromSeed(seed);\n } catch (err) {\n errors.push(`${seed}: ${(err as Error).message}`);\n }\n }\n throw new Error(\n `ClusterDiscoveryClient: no bootstrap seed reachable. Attempts:\\n ${errors.join('\\n ')}`,\n );\n }\n\n private async fetchClustersFromSeed(seed: string): Promise<ClusterInfo[]> {\n const url = `${seed.replace(/\\/$/, '')}/api/v3/discovery/clusters`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.fetchTimeoutMs);\n try {\n const res = await fetch(url, { signal: ctrl.signal });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n const body = (await res.json()) as {\n clusters?: Array<{\n clusterId?: unknown;\n endpoints?: Record<string, unknown>;\n nodeIds?: unknown;\n }>;\n };\n if (!Array.isArray(body.clusters)) {\n throw new Error('response missing clusters[]');\n }\n return body.clusters\n .map((c) => this.normalizeClusterEntry(c))\n .filter((c): c is ClusterInfo => c !== null);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private normalizeClusterEntry(raw: {\n clusterId?: unknown;\n endpoints?: Record<string, unknown>;\n nodeIds?: unknown;\n }): ClusterInfo | null {\n if (typeof raw.clusterId !== 'string' || !raw.clusterId) return null;\n if (!raw.endpoints || typeof raw.endpoints !== 'object') return null;\n const ep = raw.endpoints as Record<string, unknown>;\n if (typeof ep.gatewayUrl !== 'string' || !ep.gatewayUrl) return null;\n if (!this.allowInsecure && !ep.gatewayUrl.startsWith('https://')) {\n // Drop non-HTTPS gateways in secure mode — never silently accept\n // a downgrade attack via a poisoned bootstrap response.\n return null;\n }\n const nodeIds = Array.isArray(raw.nodeIds)\n ? raw.nodeIds.filter((n): n is string => typeof n === 'string')\n : [];\n return {\n clusterId: raw.clusterId,\n endpoints: {\n clusterId: raw.clusterId,\n gatewayUrl: ep.gatewayUrl,\n harborUrl: typeof ep.harborUrl === 'string' ? ep.harborUrl : undefined,\n natsUrl: typeof ep.natsUrl === 'string' ? ep.natsUrl : undefined,\n publicIp: typeof ep.publicIp === 'string' ? ep.publicIp : undefined,\n region: typeof ep.region === 'string' ? ep.region : undefined,\n },\n nodeIds,\n };\n }\n\n /**\n * Cross-check the HTTP-fetched cluster set against the HCS validator\n * registry. Clusters whose nodeIds are not on-chain are dropped.\n *\n * Two failure modes are deliberately silent here:\n * - the HCS read itself throws → original list is returned\n * un-verified. Trust-anchor is advisory; a network partition\n * between SDK and Hedera mirror shouldn't strand the SDK.\n * - the HCS read returns empty (mirror node lag, wrong topicId)\n * → original list is returned. Better to keep working off\n * possibly-stale-but-real data than reject every cluster.\n *\n * Both behaviors are why this is called \"trust *anchor*\", not\n * \"trust gate\". Crypto-strong gating is a follow-up.\n */\n private async verifyAgainstTrustAnchor(clusters: ClusterInfo[]): Promise<ClusterInfo[]> {\n if (!this.trustAnchorClient || clusters.length === 0) return clusters;\n let onChainNodeIds: Set<string>;\n try {\n const validators = await this.trustAnchorClient.getValidators();\n if (validators.length === 0) return clusters;\n onChainNodeIds = new Set(validators.map((v) => v.nodeId));\n } catch {\n return clusters;\n }\n return clusters.filter((c) => {\n if (c.nodeIds.length === 0) {\n // The discovery endpoint surfaces nodeIds for verifiability.\n // An entry with none was either (a) emitted by an older\n // validator, or (b) crafted to evade the check. Either way,\n // drop it to keep the contract sharp.\n return false;\n }\n return c.nodeIds.some((id) => onChainNodeIds.has(id));\n });\n }\n\n private pickRandomIndex(n: number): number {\n if (n <= 1) return 0;\n const g = (globalThis as { crypto?: { getRandomValues?: (a: Uint32Array) => Uint32Array } }).crypto;\n if (g?.getRandomValues) {\n const buf = new Uint32Array(1);\n g.getRandomValues(buf);\n return buf[0] % n;\n }\n return Math.floor(Math.random() * n);\n }\n}\n","/**\n * Authentication Module\n *\n * Web3-style validator authentication.\n */\n\nexport {\n ValidatorAuthClient,\n ValidatorAuthConfig,\n ValidatorAuthError,\n SecurityConfig,\n AuthChain,\n ChallengeResponse,\n AuthenticateRequest,\n AuthenticateResponse,\n SessionInfo,\n} from './validator-auth';\n\nexport { createXrplWeb3Signer, type Web3Signer } from './xrpl-signer';\n","/**\n * Validator Authentication Client\n *\n * Web3-style authentication for connecting to smart-engine validators.\n * Supports challenge-response authentication with Hedera, XRPL, Polkadot,\n * Stellar, or Solana wallets.\n */\n\n/**\n * Supported blockchain types for authentication.\n *\n * All five are verified end-to-end server-side by {@link Web3AuthService}\n * (Hedera ed25519, XRPL secp256k1/ed25519, Polkadot sr25519/ed25519,\n * Stellar ed25519, Solana ed25519). The partial-mode prepare guards\n * enforce `session.chain === request.chain`, so a caller who wants to\n * prepare sovereignty on chain X must authenticate with chain X's wallet.\n */\nexport type AuthChain = 'hedera' | 'xrpl' | 'polkadot' | 'stellar' | 'solana';\n\nconst SUPPORTED_AUTH_CHAINS: readonly AuthChain[] = [\n 'hedera',\n 'xrpl',\n 'polkadot',\n 'stellar',\n 'solana',\n];\n\n/**\n * Security configuration for auth client\n */\nexport interface SecurityConfig {\n /** Allow HTTP (insecure) connections - default false, use only for local development */\n allowInsecure?: boolean;\n}\n\n/**\n * Validate and sanitize a validator URL\n */\nfunction validateValidatorUrl(url: string, allowInsecure = false): string {\n try {\n const parsed = new URL(url);\n\n // Only allow http/https protocols\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new ValidatorAuthError(`Invalid protocol: ${parsed.protocol}`, 400);\n }\n\n // Enforce HTTPS unless explicitly allowed for development\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new ValidatorAuthError(\n 'HTTPS is required for validator connections. Set allowInsecure=true for local development.',\n 400\n );\n }\n\n // Block private IP ranges in production to prevent SSRF\n const hostname = parsed.hostname.toLowerCase();\n const isLocalhost = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1';\n\n if (isLocalhost && !allowInsecure) {\n throw new ValidatorAuthError(\n 'Localhost connections blocked in secure mode. Set allowInsecure=true for local development.',\n 400\n );\n }\n\n return parsed.origin;\n } catch (error) {\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n throw new ValidatorAuthError(`Invalid validator URL: ${url}`, 400);\n }\n}\n\n/**\n * Sanitize input to prevent injection attacks\n */\nfunction sanitizeInput(input: string, fieldName: string, maxLength = 256): string {\n if (typeof input !== 'string') {\n throw new ValidatorAuthError(`${fieldName} must be a string`, 400);\n }\n\n if (input.length > maxLength) {\n throw new ValidatorAuthError(`${fieldName} exceeds maximum length of ${maxLength}`, 400);\n }\n\n // Remove any control characters\n return input.replace(/[\\x00-\\x1F\\x7F]/g, '');\n}\n\n/**\n * Challenge response from validator\n */\nexport interface ChallengeResponse {\n /** Whether the request was successful */\n success: boolean;\n /** Challenge string to sign */\n challenge: string;\n /** Informational message */\n message: string;\n /** Challenge expiration time */\n expiresIn: string;\n}\n\n/**\n * Authentication request payload\n */\nexport interface AuthenticateRequest {\n /** Blockchain type */\n chain: AuthChain;\n /** Wallet address (account ID for Hedera, address for XRPL) */\n address: string;\n /** Public key (hex encoded) */\n publicKey: string;\n /** Signed challenge (hex encoded signature) */\n signature: string;\n /** Original challenge string */\n challenge: string;\n /** Optional metadata */\n metadata?: {\n nodeId?: string;\n endpoint?: string;\n capabilities?: string[];\n appId?: string;\n appName?: string;\n };\n}\n\n/**\n * Authentication response with session token\n */\nexport interface AuthenticateResponse {\n /** JWT session token */\n token: string;\n /** Session ID */\n sessionId: string;\n /** Assigned validator ID */\n validatorId: string;\n /** Token expiration timestamp */\n expiresAt: string;\n /** Informational message */\n message: string;\n}\n\n/**\n * Session information\n */\nexport interface SessionInfo {\n /** Session ID */\n sessionId: string;\n /** Validator ID */\n validatorId: string;\n /** Wallet address */\n address: string;\n /** Blockchain type */\n chain: AuthChain;\n /** Session creation time */\n createdAt: string;\n /** Session expiration time */\n expiresAt: string;\n /** Whether session is valid */\n isValid: boolean;\n}\n\n/**\n * Validator auth configuration\n */\nexport interface ValidatorAuthConfig {\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Security configuration */\n security?: SecurityConfig;\n}\n\n/**\n * Validator Authentication Client\n *\n * Implements Web3-style challenge-response authentication:\n * 1. Request challenge from validator\n * 2. Sign challenge with wallet private key\n * 3. Authenticate with signed challenge to get session token\n *\n * @example\n * ```typescript\n * const auth = new ValidatorAuthClient();\n *\n * // Request challenge\n * const challenge = await auth.requestChallenge(\n * 'https://validator.example.com',\n * 'hedera',\n * '0.0.123456'\n * );\n *\n * // Sign challenge (using @hashgraph/sdk)\n * const signature = auth.signChallengeHedera(challenge.challenge, privateKey);\n *\n * // Authenticate\n * const session = await auth.authenticate('https://validator.example.com', {\n * chain: 'hedera',\n * address: '0.0.123456',\n * publicKey: publicKeyHex,\n * signature,\n * challenge: challenge.challenge,\n * });\n *\n * console.log('Token:', session.token);\n * ```\n */\nexport class ValidatorAuthClient {\n private readonly timeout: number;\n private readonly allowInsecure: boolean;\n\n constructor(config?: ValidatorAuthConfig) {\n this.timeout = config?.timeout ?? 30000;\n this.allowInsecure = config?.security?.allowInsecure ?? false;\n }\n\n /**\n * Request authentication challenge from validator\n *\n * @param validatorUrl - Validator API base URL\n * @param chain - Blockchain type\n * @param address - Wallet address\n * @returns Challenge to sign\n */\n async requestChallenge(\n validatorUrl: string,\n chain: AuthChain,\n address: string\n ): Promise<ChallengeResponse> {\n // Validate and sanitize inputs\n const safeUrl = validateValidatorUrl(validatorUrl, this.allowInsecure);\n const safeAddress = sanitizeInput(address, 'address', 128);\n\n if (!SUPPORTED_AUTH_CHAINS.includes(chain)) {\n throw new ValidatorAuthError(`Invalid chain type: ${chain}`, 400);\n }\n\n const url = `${safeUrl}/auth/validator/challenge`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ chain, address: safeAddress }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ValidatorAuthError(\n `Challenge request failed: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return (await response.json()) as ChallengeResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new ValidatorAuthError('Challenge request timeout', 408);\n }\n throw new ValidatorAuthError(`Challenge request failed: ${err.message}`, 0);\n }\n }\n\n /**\n * Authenticate with signed challenge\n *\n * @param validatorUrl - Validator API base URL\n * @param request - Authentication request with signature\n * @returns Session token and info\n */\n async authenticate(\n validatorUrl: string,\n request: AuthenticateRequest\n ): Promise<AuthenticateResponse> {\n // Validate URL\n const safeUrl = validateValidatorUrl(validatorUrl, this.allowInsecure);\n\n // Validate and sanitize request fields\n const sanitizedRequest: AuthenticateRequest = {\n chain: request.chain,\n address: sanitizeInput(request.address, 'address', 128),\n publicKey: sanitizeInput(request.publicKey, 'publicKey', 512),\n signature: sanitizeInput(request.signature, 'signature', 1024),\n challenge: sanitizeInput(request.challenge, 'challenge', 512),\n metadata: request.metadata\n ? {\n nodeId: request.metadata.nodeId\n ? sanitizeInput(request.metadata.nodeId, 'nodeId', 64)\n : undefined,\n endpoint: request.metadata.endpoint\n ? sanitizeInput(request.metadata.endpoint, 'endpoint', 256)\n : undefined,\n capabilities: request.metadata.capabilities,\n appId: request.metadata.appId\n ? sanitizeInput(request.metadata.appId, 'appId', 64)\n : undefined,\n appName: request.metadata.appName\n ? sanitizeInput(request.metadata.appName, 'appName', 128)\n : undefined,\n }\n : undefined,\n };\n\n if (!SUPPORTED_AUTH_CHAINS.includes(sanitizedRequest.chain)) {\n throw new ValidatorAuthError(`Invalid chain type: ${sanitizedRequest.chain}`, 400);\n }\n\n // Validate signature is hex\n if (!/^[0-9a-fA-F]+$/.test(sanitizedRequest.signature.replace(/_.*$/, ''))) {\n throw new ValidatorAuthError('Invalid signature format: must be hex encoded', 400);\n }\n\n const url = `${safeUrl}/auth/validator/authenticate`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(sanitizedRequest),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ValidatorAuthError(\n `Authentication failed: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return (await response.json()) as AuthenticateResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new ValidatorAuthError('Authentication request timeout', 408);\n }\n throw new ValidatorAuthError(`Authentication failed: ${err.message}`, 0);\n }\n }\n\n /**\n * Get current session info\n *\n * @param validatorUrl - Validator API base URL\n * @param token - Session token\n * @returns Session information\n */\n async getSession(validatorUrl: string, token: string): Promise<SessionInfo> {\n // Validate URL and token\n const safeUrl = validateValidatorUrl(validatorUrl, this.allowInsecure);\n const safeToken = sanitizeInput(token, 'token', 2048);\n\n const url = `${safeUrl}/auth/validator/session`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${safeToken}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ValidatorAuthError(\n `Session request failed: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return (await response.json()) as SessionInfo;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof ValidatorAuthError) {\n throw error;\n }\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new ValidatorAuthError('Session request timeout', 408);\n }\n throw new ValidatorAuthError(`Session request failed: ${err.message}`, 0);\n }\n }\n\n /**\n * Sign challenge with Hedera private key\n *\n * @param challenge - Challenge string from validator\n * @param privateKey - Hedera PrivateKey instance from @hashgraph/sdk\n * @returns Hex-encoded signature\n */\n signChallengeHedera(challenge: string, privateKey: any): string {\n // privateKey should be a PrivateKey from @hashgraph/sdk\n const messageBytes = Buffer.from(challenge, 'utf-8');\n const signature = privateKey.sign(messageBytes);\n return Buffer.from(signature).toString('hex');\n }\n\n /**\n * Sign challenge with XRPL wallet\n *\n * @param challenge - Challenge string from validator\n * @param wallet - XRPL Wallet instance from xrpl library\n * @returns Hex-encoded signature\n */\n signChallengeXRPL(challenge: string, wallet: any): string {\n // wallet should be a Wallet from xrpl library\n // XRPL uses sign() method which returns base58 or hex\n const signature = wallet.sign(challenge);\n // If it's already hex, return as-is, otherwise convert\n if (typeof signature === 'string' && /^[0-9A-Fa-f]+$/.test(signature)) {\n return signature;\n }\n return Buffer.from(signature).toString('hex');\n }\n\n /**\n * Complete authentication flow in one call\n *\n * @param validatorUrl - Validator API base URL\n * @param chain - Blockchain type\n * @param address - Wallet address\n * @param publicKey - Public key (hex)\n * @param signFn - Function to sign the challenge\n * @param metadata - Optional metadata\n * @returns Session token and info\n */\n async authenticateWithSigner(\n validatorUrl: string,\n chain: AuthChain,\n address: string,\n publicKey: string,\n signFn: (challenge: string) => string | Promise<string>,\n metadata?: AuthenticateRequest['metadata']\n ): Promise<AuthenticateResponse> {\n // Step 1: Request challenge\n const challengeResponse = await this.requestChallenge(validatorUrl, chain, address);\n\n // Step 2: Sign challenge\n const signature = await signFn(challengeResponse.challenge);\n\n // Step 3: Authenticate\n return this.authenticate(validatorUrl, {\n chain,\n address,\n publicKey,\n signature,\n challenge: challengeResponse.challenge,\n metadata,\n });\n }\n}\n\n/**\n * Authentication error\n */\nexport class ValidatorAuthError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public details?: any\n ) {\n super(message);\n this.name = 'ValidatorAuthError';\n }\n}\n","/**\n * XRPL Web3 Signer Helper\n *\n * Bridges an XRPL seed to the `{ chain, address, publicKey, signFn }` shape\n * consumed by:\n * - `BaasClient.authenticate(...)` (BaaS host's `/api/auth/challenge` flow)\n * - `SmartEngineClient.connectToCluster(...)` (validator's challenge flow)\n * - `ValidatorAuthClient.authenticateWithSigner(...)` (explicit step-by-step)\n *\n * Without this helper every smart-app re-implements the same wiring:\n *\n * ```ts\n * // Before — every smart-app hand-rolls this:\n * import { Wallet } from 'xrpl';\n * const { sign } = require('ripple-keypairs');\n * const wallet = Wallet.fromSeed(seed);\n * const signer = {\n * chain: 'xrpl' as const,\n * address: wallet.classicAddress,\n * publicKey: wallet.publicKey,\n * signFn: (msg: string) => {\n * const hex = Buffer.from(msg, 'utf-8').toString('hex').toUpperCase();\n * return sign(hex, wallet.privateKey);\n * },\n * };\n * ```\n *\n * After this helper:\n *\n * ```ts\n * import { createXrplWeb3Signer } from '@hsuite/smart-engines-sdk';\n * const signer = createXrplWeb3Signer(seed); // done\n * ```\n *\n * The signing path matches the validator's `web3-auth` verifier — the\n * challenge is UTF-8 bytes → upper-hex → secp256k1/ed25519 sign with the\n * wallet's private key. Don't change this without re-verifying against\n * `libs/multi-chain-core/src/auth/xrpl-web3-verifier.service.ts`.\n */\n\nimport { Wallet } from 'xrpl';\n// `ripple-keypairs` is a transitive dep of `xrpl`. We import it directly\n// for `sign(messageHex, privateKey)` because `xrpl.Wallet.sign(...)` is\n// transaction-shaped — it expects a `Transaction` object, not a raw\n// challenge string. Calling `wallet.sign(challenge)` would either throw\n// or silently produce a transaction signature, which the validator's\n// web3-auth verifier would reject.\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst { sign: rippleSign } = require('ripple-keypairs') as {\n sign: (messageHex: string, privateKey: string) => string;\n};\n\n/**\n * Web3 signer tuple — the shape every chain-agnostic auth flow in the SDK\n * accepts. `signFn` is async-friendly so the same shape works for hardware\n * wallets / remote signers.\n */\nexport type Web3Signer = {\n /** Chain literal — `'xrpl'` here; other chains follow the same shape. */\n chain: 'xrpl';\n /** Classic XRPL address (`r...`). */\n address: string;\n /** Hex-encoded public key. */\n publicKey: string;\n /** Sign an arbitrary challenge string and return a hex-encoded signature. */\n signFn: (challenge: string) => string;\n /** The underlying `xrpl.Wallet` — exposed for callers that need it\n * (e.g. submitting transactions, deriving accounts). */\n wallet: Wallet;\n};\n\n/**\n * Build a Web3 signer from an XRPL family seed (`s...`).\n *\n * @example\n * ```ts\n * import { BaasClient, createXrplWeb3Signer } from '@hsuite/smart-engines-sdk';\n *\n * const signer = createXrplWeb3Signer(process.env.XRPL_SEED!);\n * const baas = new BaasClient({ hostUrl, appId: 'pending', pathPrefix: '/host' });\n * await baas.authenticate({\n * chain: signer.chain,\n * walletAddress: signer.address,\n * publicKey: signer.publicKey,\n * signFn: signer.signFn,\n * });\n * ```\n *\n * @throws if `seed` is not a valid XRPL seed (delegates to `Wallet.fromSeed`).\n */\nexport function createXrplWeb3Signer(seed: string): Web3Signer {\n const wallet = Wallet.fromSeed(seed);\n return {\n chain: 'xrpl',\n address: wallet.classicAddress,\n publicKey: wallet.publicKey,\n signFn: (challenge: string) => {\n // The validator's verifier expects upper-hex UTF-8 bytes. Match exactly.\n const messageHex = Buffer.from(challenge, 'utf-8').toString('hex').toUpperCase();\n return rippleSign(messageHex, wallet.privateKey);\n },\n wallet,\n };\n}\n","/**\n * Shared HTTP Client\n *\n * Unified HTTP layer used by all SDK clients (SmartEngineClient, SmartGatewayClient, BaasClient).\n * Handles authentication headers, timeouts, error handling, and multipart uploads.\n */\n\n/**\n * HTTP client interface consumed by all sub-clients.\n * Sub-clients only depend on this interface, never on fetch directly.\n */\nexport type HttpClient = {\n post<T = any>(path: string, body: unknown): Promise<T>;\n get<T = any>(path: string): Promise<T>;\n put<T = any>(path: string, body: unknown): Promise<T>;\n delete<T = any>(path: string): Promise<T>;\n /**\n * Upload a file with `multipart/form-data`.\n *\n * `fieldName` defaults to `'file'` for back-compat; callers whose\n * server-side handler uses a different multer field name (e.g.\n * `'bundle'` for SPA tarball uploads) MUST override.\n */\n upload<T = any>(\n path: string,\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>,\n fieldName?: string,\n ): Promise<T>;\n};\n\n/**\n * Configuration for creating an HttpClient instance\n */\nexport type HttpClientConfig = {\n /** Base URL for all requests (e.g. https://validator.example.com/api/v3) */\n baseUrl: string;\n /** Bearer token for Authorization header */\n authToken?: string;\n /** API key for X-API-Key header */\n apiKey?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n};\n\n/**\n * SDK-level error class used across all clients\n */\nexport class SdkHttpError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly details?: any\n ) {\n super(message);\n this.name = 'SdkHttpError';\n }\n}\n\n/**\n * Create a concrete HttpClient from config.\n * This is the single place where `fetch` is called in the entire SDK.\n */\nexport function createHttpClient(config: HttpClientConfig): HttpClient {\n const timeout = config.timeout ?? 30000;\n\n function getHeaders(contentType?: string): Record<string, string> {\n const headers: Record<string, string> = {};\n if (contentType) {\n headers['Content-Type'] = contentType;\n }\n if (config.authToken) {\n headers['Authorization'] = `Bearer ${config.authToken}`;\n }\n if (config.apiKey) {\n headers['X-API-Key'] = config.apiKey;\n }\n return headers;\n }\n\n /** Update auth token (e.g. after authentication flow) */\n function setAuthToken(token: string): void {\n config.authToken = token;\n }\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${config.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const init: RequestInit = {\n method,\n headers: getHeaders('application/json'),\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as Record<string, unknown>;\n throw new SdkHttpError(\n (errorData.message as string) || `API error: ${response.status} ${response.statusText}`,\n response.status,\n errorData\n );\n }\n\n // Handle empty responses (204 No Content)\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof SdkHttpError) throw error;\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new SdkHttpError('Request timeout', 408);\n }\n throw new SdkHttpError(`Network error: ${err.message}`, 0, error);\n }\n }\n\n async function upload<T>(\n path: string,\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>,\n fieldName: string = 'file',\n ): Promise<T> {\n const url = `${config.baseUrl}${path}`;\n const controller = new AbortController();\n // Uploads get 2x timeout\n const timeoutId = setTimeout(() => controller.abort(), timeout * 2);\n\n try {\n const formData = new FormData();\n const blob = file instanceof Blob ? file : new Blob([new Uint8Array(file as Buffer)]);\n formData.append(fieldName, blob, filename);\n\n if (metadata) {\n for (const [key, value] of Object.entries(metadata)) {\n formData.append(key, value);\n }\n }\n\n // Don't set Content-Type — browser/node will set multipart boundary\n const headers: Record<string, string> = {};\n if (config.authToken) {\n headers['Authorization'] = `Bearer ${config.authToken}`;\n }\n if (config.apiKey) {\n headers['X-API-Key'] = config.apiKey;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as Record<string, unknown>;\n throw new SdkHttpError(\n (errorData.message as string) || `Upload error: ${response.status} ${response.statusText}`,\n response.status,\n errorData\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof SdkHttpError) throw error;\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new SdkHttpError('Upload timeout', 408);\n }\n throw new SdkHttpError(`Upload error: ${err.message}`, 0, error);\n }\n }\n\n const client: HttpClient & { setAuthToken: typeof setAuthToken } = {\n post: <T>(path: string, body: unknown) => request<T>('POST', path, body),\n get: <T>(path: string) => request<T>('GET', path),\n put: <T>(path: string, body: unknown) => request<T>('PUT', path, body),\n delete: <T>(path: string) => request<T>('DELETE', path),\n upload: ((path: string, file: Blob | Buffer, filename: string, metadata?: Record<string, string>, fieldName?: string) =>\n upload(path, file, filename, metadata, fieldName)) as HttpClient['upload'],\n setAuthToken,\n };\n\n return client;\n}\n\n/**\n * Encode a path parameter to prevent injection attacks.\n * Removes path traversal attempts and encodes special characters.\n */\nexport function encodePathParam(param: string): string {\n return encodeURIComponent(param).replace(/%2F/gi, '');\n}\n\n/**\n * Body shape of an HTTP 403 `rule_rejected` envelope raised by the\n * validator's NFT-transfer hook (PR #552) — and by future hooks that adopt\n * the same envelope. Matches `apps/smart-validator/src/transactions/transaction.controller.ts:1210-1217`:\n *\n * ```json\n * { \"error\": \"rule_rejected\", \"reason\": \"<atom-reason>\", \"ruleAtoms\": [\"SoulboundNftAtom\"] }\n * ```\n */\nexport interface RuleRejectedDetails {\n /** Literal discriminator — always 'rule_rejected'. */\n error: 'rule_rejected';\n /** Atom-supplied reason string, e.g. 'soulbound_transfer_rejected'. */\n reason: string;\n /** Names of the rule atoms that fired the rejection. */\n ruleAtoms: string[];\n}\n\n/**\n * Type predicate: narrows an unknown error to a 403 `rule_rejected` envelope.\n *\n * Use in smart-app code to branch on rules-engine rejections without\n * inspecting raw HTTP details:\n *\n * ```typescript\n * try {\n * await sdk.transactions.prepareNftTransfer({ chain: 'hedera', ... });\n * } catch (err) {\n * if (isRuleRejected(err)) {\n * console.log(`Blocked by ${err.details.ruleAtoms.join(', ')}: ${err.details.reason}`);\n * return;\n * }\n * throw err;\n * }\n * ```\n *\n * Status-code AND shape are both checked — non-403 errors and 403s without\n * the rule_rejected envelope (e.g. plain auth failures) return false.\n *\n * @public SDK-SOULBOUND-1\n */\nexport function isRuleRejected(\n err: unknown,\n): err is SdkHttpError & { details: RuleRejectedDetails } {\n if (!(err instanceof SdkHttpError)) return false;\n if (err.statusCode !== 403) return false;\n const d = err.details as unknown;\n if (d === null || typeof d !== 'object') return false;\n const obj = d as Record<string, unknown>;\n if (obj.error !== 'rule_rejected') return false;\n if (typeof obj.reason !== 'string') return false;\n if (!Array.isArray(obj.ruleAtoms)) return false;\n return obj.ruleAtoms.every((a) => typeof a === 'string');\n}\n","/**\n * Subscription Sub-Client\n *\n * Manages application subscriptions for using the validator network.\n */\n\n/**\n * Subscription tier names\n *\n * - free_testnet: Free tier limited to testnet/previewnet\n * - starter: Entry-level paid tier\n * - professional: Mid-tier with advanced features\n * - enterprise: Full-featured enterprise tier\n */\nexport type SubscriptionTierName = 'free_testnet' | 'starter' | 'professional' | 'enterprise';\n\n/**\n * Subscription statuses\n */\nexport type SubscriptionStatus =\n | 'pending_deposit'\n | 'deposit_confirmed'\n | 'active'\n | 'expired'\n | 'cancelled';\n\n/**\n * Deposit wallet statuses\n */\nexport type DepositWalletStatus = 'pending' | 'locked' | 'expired' | 'slashed' | 'released';\n\n/**\n * Subscription tier information for API responses\n */\nexport type SubscriptionTierInfo = {\n /** Tier name identifier */\n name: SubscriptionTierName;\n /** Display name for UI */\n displayName: string;\n /** Tier description */\n description: string;\n /** Monthly price in USD */\n priceUsd: number;\n /** Deposit amount in HSUITE tokens */\n depositAmount: string;\n /** API calls per day limit */\n apiCallsPerDay: number;\n /** Supported networks for this tier */\n supportedNetworks: ('hedera' | 'xrpl')[];\n /** Additional features included in this tier */\n features: string[];\n};\n\n/**\n * Subscription request\n */\nexport type SubscriptionRequest = {\n /** Application ID */\n appId: string;\n /** Application name */\n appName: string;\n /** Developer's account ID on the chosen chain */\n developerAccountId: string;\n /** Chain for deposit */\n chain: 'hedera' | 'xrpl';\n /** Selected subscription tier */\n selectedTier: SubscriptionTierName;\n /** Selected networks to support */\n selectedNetworks: ('hedera' | 'xrpl')[];\n /** App logo URL (optional) */\n logoUrl?: string;\n /** App description (optional) */\n appDescription?: string;\n /** Additional metadata (optional) */\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Subscription response\n */\nexport type SubscriptionResponse = {\n success: boolean;\n subscriptionId?: string;\n status?: SubscriptionStatus;\n depositInstructions?: {\n walletAddress: string;\n tokenId: string;\n amount: string;\n chain: string;\n };\n message: string;\n};\n\n/**\n * Subscription status response\n */\nexport type SubscriptionStatusResponse = {\n appId: string;\n hasSubscription: boolean;\n subscriptionId?: string;\n appName?: string;\n status: SubscriptionStatus | 'not_found';\n depositWallet?: {\n walletAddress: string;\n chain: string;\n depositAmount: string;\n actualDepositAmount?: string;\n status: DepositWalletStatus;\n lockedUntil?: string;\n };\n subscriptionNftSerial?: number;\n expiresAt?: string;\n remainingBalance?: string;\n createdAt?: string;\n /** Current subscription tier */\n tier?: SubscriptionTierName;\n /** Networks selected for this subscription */\n selectedNetworks?: string[];\n /** API calls made today */\n apiCallsToday?: number;\n /** Daily API call limit based on tier */\n apiCallsLimit?: number;\n};\n\n/**\n * Mint NFT response\n */\nexport type MintNftResponse = {\n success: boolean;\n subscriptionId?: string;\n appId?: string;\n expiresAt?: string;\n message: string;\n};\n\n/**\n * Subscription renewal request\n */\nexport type SubscriptionRenewalRequest = {\n appId: string;\n additionalDays?: number;\n};\n\n/**\n * Subscription renewal response\n */\nexport type SubscriptionRenewalResponse = {\n success: boolean;\n appId: string;\n status?: string;\n newExpiresAt?: string;\n message: string;\n};\n\n/**\n * Subscription configuration\n */\nexport type SubscriptionConfig = {\n subscriptionDepositAmount: string;\n lockDurationDays: number;\n renewalWindowDays: number;\n hsuiteTokenIds: Record<string, string>;\n /** Available subscription tiers */\n availableTiers: SubscriptionTierInfo[];\n};\n\n/**\n * Subscription list response\n */\nexport type SubscriptionListResponse = {\n count: number;\n subscriptions: Array<{\n subscriptionId: string;\n appId: string;\n appName: string;\n status: SubscriptionStatus;\n expiresAt?: string;\n createdAt: string;\n }>;\n};\n\n/**\n * Balance response\n */\nexport type BalanceResponse = {\n appId: string;\n subscriptionId: string;\n status: SubscriptionStatus;\n remainingBalance: string;\n expiresAt?: string;\n};\n\nimport type { HttpClient } from '../http';\n\n/**\n * Subscription Sub-Client\n *\n * Manages application subscriptions including:\n * - Subscription requests with deposit wallets\n * - Deposit verification and NFT minting\n * - Subscription renewal\n * - Balance checking\n */\nexport class SubscriptionClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Request a new subscription.\n * Creates a deposit wallet and returns deposit instructions.\n */\n async request(request: SubscriptionRequest): Promise<SubscriptionResponse> {\n return this.http.post('/subscription/request', request);\n }\n\n /**\n * Get subscription status by app ID\n */\n async getStatus(appId: string): Promise<SubscriptionStatusResponse> {\n return this.http.get(`/subscription/status/${encodeURIComponent(appId)}`);\n }\n\n /**\n * Mint subscription NFT after deposit is confirmed\n */\n async mintNft(appId: string): Promise<MintNftResponse> {\n return this.http.post(`/subscription/mint/${encodeURIComponent(appId)}`, {});\n }\n\n /**\n * Renew subscription by extending period\n */\n async renew(request: SubscriptionRenewalRequest): Promise<SubscriptionRenewalResponse> {\n return this.http.post('/subscription/renew', request);\n }\n\n /**\n * Fetch available subscription tiers from the network.\n *\n * Use this instead of hard-coding tier names -- the validator returns the\n * canonical list of tiers together with pricing, limits, and features.\n *\n * @returns Array of {@link SubscriptionTierInfo} objects.\n *\n * @example\n * ```typescript\n * const tiers = await subscription.getTiers();\n * console.log(tiers.map(t => `${t.name}: $${t.priceUsd}/mo`));\n * ```\n */\n async getTiers(): Promise<SubscriptionTierInfo[]> {\n try {\n return await this.http.get<SubscriptionTierInfo[]>('/subscription/tiers');\n } catch (err) {\n // Backwards compatibility: older validator builds don't have the\n // dedicated /tiers endpoint yet. Fall back to /config, which\n // returns the same tiers under `availableTiers` (though in the\n // raw pricing-core shape rather than SubscriptionTierInfo).\n const isNotFound =\n err != null &&\n typeof err === 'object' &&\n 'statusCode' in err &&\n (err as { statusCode?: number }).statusCode === 404;\n if (!isNotFound) throw err;\n const cfg = await this.http.get<{\n availableTiers: Array<Record<string, unknown>>;\n }>('/subscription/config');\n // Normalize: pricing-core's SubscriptionTierConfig uses\n // { tier, name, monthlyPriceHsuite, allowedNetworks, ... } — map\n // to the SDK contract so callers see a stable shape across\n // server versions.\n return (cfg.availableTiers || []).map((raw) => {\n const tier = (raw.tier ?? raw.name) as SubscriptionTierName;\n const displayName = (raw.name ?? raw.displayName ?? String(tier)) as string;\n const monthlyPriceHsuite = Number(\n raw.monthlyPriceHsuite ?? raw.depositAmount ?? 0\n );\n const apiCallsPerDay = Number(raw.apiCallsPerDay ?? 0);\n const rawNetworks = (raw.allowedNetworks ?? raw.supportedNetworks ?? []) as string[];\n const supportedNetworks: ('hedera' | 'xrpl')[] = rawNetworks.some(\n (n) => n === 'mainnet'\n )\n ? ['hedera', 'xrpl']\n : ['hedera'];\n return {\n name: tier,\n displayName,\n description:\n (raw.description as string | undefined) ??\n `${displayName} tier`,\n priceUsd: Number(raw.priceUsd ?? 0),\n depositAmount: String(monthlyPriceHsuite),\n apiCallsPerDay: Number.isFinite(apiCallsPerDay)\n ? apiCallsPerDay\n : Number.MAX_SAFE_INTEGER,\n supportedNetworks,\n features: (raw.features as string[]) ?? [],\n };\n });\n }\n }\n\n /**\n * Get subscription configuration\n */\n async getConfig(): Promise<SubscriptionConfig> {\n return this.http.get('/subscription/config');\n }\n\n /**\n * List all subscriptions\n */\n async list(): Promise<SubscriptionListResponse> {\n return this.http.get('/subscription/list');\n }\n\n /**\n * List subscriptions by status\n */\n async listByStatus(status: SubscriptionStatus): Promise<SubscriptionListResponse> {\n return this.http.get(`/subscription/list/status/${encodeURIComponent(status)}`);\n }\n\n /**\n * Get subscription balance\n */\n async getBalance(appId: string): Promise<BalanceResponse> {\n return this.http.get(`/subscription/balance/${encodeURIComponent(appId)}`);\n }\n}\n","/**\n * TSS (Threshold Signature Scheme) Sub-Client\n *\n * Provides access to TSS/MPC operations for multi-sig entity management.\n * All operations are chain-agnostic — pass `chain` as a parameter.\n */\nimport type {\n EntityCreationOptions,\n EntityCreationResponse,\n ReshareRequest,\n ReshareResponse,\n EntityDetails,\n MPCSigningRequest,\n MPCSigningResponse,\n ValidatorListResponse,\n TSSStats,\n EntityListResponse,\n TSSHealthResponse,\n CeremonyListResponse,\n MultiSigStatusResponse,\n} from './types';\nimport type { HttpClient } from '../http';\n\nexport * from './types';\n\n/**\n * TSS Sub-Client\n *\n * Manages Threshold Signature Scheme operations including:\n * - Multi-sig entity creation (chain-agnostic)\n * - Key resharing for membership changes\n * - MPC transaction signing for any supported chain\n * - DKG ceremony monitoring\n *\n * @example\n * ```typescript\n * // Sign a transaction on any chain\n * const result = await client.tss.signMPC({\n * chain: 'hedera',\n * entityId: 'entity-123',\n * transactionBytes: '0x...',\n * });\n * ```\n */\nexport class TSSClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a multi-sig entity with TSS\n */\n async createEntity(options: EntityCreationOptions): Promise<EntityCreationResponse> {\n return this.http.post('/tss/entity/create', options);\n }\n\n /**\n * Reshare keys when cluster membership changes.\n * Redistributes secret shares WITHOUT changing public keys.\n */\n async reshareCluster(request: ReshareRequest): Promise<ReshareResponse> {\n return this.http.post('/tss/cluster/reshare', request);\n }\n\n /**\n * Get entity details by ID\n */\n async getEntity(entityId: string): Promise<EntityDetails> {\n return this.http.get(`/tss/entity/${encodeURIComponent(entityId)}`);\n }\n\n /**\n * Sign a transaction using MPC — chain-agnostic.\n * Routes to the correct chain backend based on the `chain` parameter.\n *\n * @param request - MPC signing request with chain, entityId, and transaction bytes\n */\n async signMPC(request: MPCSigningRequest): Promise<MPCSigningResponse> {\n const chain = request.chain || 'hedera';\n return this.http.post(`/tss/${encodeURIComponent(chain)}/sign-mpc`, request);\n }\n\n /**\n * Get known validators and their public keys\n */\n async getValidators(): Promise<ValidatorListResponse> {\n return this.http.get('/tss/validators');\n }\n\n /**\n * Force announcement of this node's public key\n */\n async announceKey(): Promise<{ success: boolean; message: string }> {\n return this.http.post('/tss/announce', {});\n }\n\n /**\n * Get TSS statistics\n */\n async getStats(): Promise<TSSStats> {\n return this.http.get('/tss/stats');\n }\n\n /**\n * List all TSS entities\n */\n async listEntities(): Promise<EntityListResponse> {\n return this.http.get('/tss/entities');\n }\n\n /**\n * TSS health check\n */\n async getHealth(): Promise<TSSHealthResponse> {\n return this.http.get('/tss/health');\n }\n\n /**\n * List DKG ceremonies and their statistics\n */\n async listCeremonies(): Promise<CeremonyListResponse> {\n return this.http.get('/tss/multisig/ceremonies');\n }\n\n /**\n * Get multi-sig transaction status by transaction ID\n */\n async getMultiSigStatus(txId: string): Promise<MultiSigStatusResponse> {\n return this.http.get(`/tss/multisig/transactions/${encodeURIComponent(txId)}`);\n }\n}\n","/**\n * IPFS Sub-Client\n *\n * Provides access to IPFS operations for decentralized file storage.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const result = await client.ipfs.upload(fileBuffer, 'document.pdf');\n *\n * // Pin content\n * await client.ipfs.pin(result.cid);\n *\n * // Get file\n * const file = await client.ipfs.getFile(result.cid);\n * ```\n */\nimport type { HttpClient } from '../http';\nimport type {\n IpfsUploadResult,\n IpfsPinResult,\n IpfsFileMetadata,\n IpfsPinListResponse,\n IpfsStatusResponse,\n IpfsStorageUsageResponse,\n} from './types';\n\nexport * from './types';\n\n/**\n * IPFS Sub-Client\n *\n * Manages IPFS operations including:\n * - File upload and retrieval\n * - Content pinning and unpinning\n * - Metadata queries\n * - Storage usage monitoring\n */\nexport class IPFSClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload a file to IPFS\n *\n * @param file - File data as Blob or Buffer\n * @param filename - Name of the file\n * @param metadata - Optional metadata key-value pairs\n * @returns Upload result with CID\n */\n async upload(\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>\n ): Promise<IpfsUploadResult> {\n return this.http.upload('/ipfs/upload', file, filename, metadata);\n }\n\n /**\n * Pin content by CID to ensure it persists\n */\n async pin(cid: string): Promise<IpfsPinResult> {\n return this.http.post(`/ipfs/pin/${encodeURIComponent(cid)}`, {});\n }\n\n /**\n * Unpin content by CID\n */\n async unpin(cid: string): Promise<IpfsPinResult> {\n return this.http.delete(`/ipfs/unpin/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get a file by CID\n */\n async getFile(cid: string): Promise<any> {\n return this.http.get(`/ipfs/file/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get raw content by CID\n */\n async getContent(cid: string): Promise<any> {\n return this.http.get(`/ipfs/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get file metadata by CID\n */\n async getMetadata(cid: string): Promise<IpfsFileMetadata> {\n return this.http.get(`/ipfs/metadata/${encodeURIComponent(cid)}`);\n }\n\n /**\n * List all pinned content\n */\n async listPins(): Promise<IpfsPinListResponse> {\n return this.http.get('/ipfs/pins');\n }\n\n /**\n * Get IPFS node status\n */\n async getStatus(): Promise<IpfsStatusResponse> {\n return this.http.get('/ipfs/status');\n }\n\n /**\n * Get storage usage information\n */\n async getStorageUsage(): Promise<IpfsStorageUsageResponse> {\n return this.http.get('/ipfs/storage');\n }\n}\n","/**\n * Hedera-Specific Transaction Preparation Sub-Client\n *\n * Hedera-only escape hatches that have no multi-chain analog.\n *\n * Available via: `client.hedera.*`\n *\n * Operations exposed here:\n * - HCS topic create + topic message (Hedera Consensus Service — no analog on\n * other chains. Most app developers will not need these.)\n * - HTS compliance enable/disable (KYC grant/revoke — server hard-dispatches\n * to the Hedera capability; even though the request schema accepts other\n * chains, the handler always treats it as Hedera).\n * - HTS wipe (force-remove tokens from an account — Hedera-only by schema).\n *\n * For multi-chain operations (createToken, transfer, mint, burn, pause,\n * restrict, etc.), use the chain-agnostic top-level `client.transactions.*`\n * or top-level `client.*` methods.\n */\n\nimport type { HttpClient } from '../../http';\nimport type { PreparedTransaction, SecurityMode } from '../types';\n\n/** Topic creation preparation request (Hedera HCS only). */\nexport type PrepareTopicCreateRequest = {\n payerAccountId?: string;\n memo?: string;\n adminKeyRequired?: boolean;\n submitKeyRequired?: boolean;\n entityId: string;\n};\n\n/** Topic message preparation request (Hedera HCS only). */\nexport type PrepareTopicMessageRequest = {\n payerAccountId?: string;\n topicId: string;\n message: string | Record<string, unknown>;\n entityId: string;\n};\n\n/** Token compliance-enable (grant KYC) — Hedera-only by handler dispatch. */\nexport type PrepareTokenComplianceEnableRequest = {\n payerAccountId?: string;\n tokenId: string;\n accountId: string;\n entityId: string;\n securityMode?: SecurityMode;\n appOwnerPublicKey?: string;\n memo?: string;\n};\n\n/** Token compliance-disable (revoke KYC) — Hedera-only by handler dispatch. */\nexport type PrepareTokenComplianceDisableRequest = PrepareTokenComplianceEnableRequest;\n\n/** Token wipe — Hedera-only (literal schema). Force-removes tokens from an account. */\nexport type PrepareTokenWipeRequest = {\n payerAccountId?: string;\n tokenId: string;\n accountId: string;\n amount: string;\n entityId: string;\n memo?: string;\n};\n\n/**\n * Hedera-specific transaction preparation sub-client.\n *\n * Wire format: every request body is augmented with `chain: 'hedera'` before\n * POSTing — callers never write the chain literal themselves.\n */\nexport class HederaTransactionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Prepare an HCS topic creation transaction. */\n async prepareTopicCreate(request: PrepareTopicCreateRequest): Promise<PreparedTransaction> {\n return this.http.post('/topic/create/prepare', { ...request, chain: 'hedera' });\n }\n\n /** Prepare an HCS topic message submission. */\n async prepareTopicMessage(request: PrepareTopicMessageRequest): Promise<PreparedTransaction> {\n return this.http.post('/topic/message/prepare', { ...request, chain: 'hedera' });\n }\n\n /** Prepare a token compliance-enable (KYC grant) transaction. */\n async prepareTokenComplianceEnable(\n request: PrepareTokenComplianceEnableRequest,\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/compliance/enable/prepare', { ...request, chain: 'hedera' });\n }\n\n /** Prepare a token compliance-disable (KYC revoke) transaction. */\n async prepareTokenComplianceDisable(\n request: PrepareTokenComplianceDisableRequest,\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/compliance/disable/prepare', { ...request, chain: 'hedera' });\n }\n\n /** Prepare a token wipe transaction (force-remove tokens from an account). */\n async prepareTokenWipe(request: PrepareTokenWipeRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/wipe/prepare', { ...request, chain: 'hedera' });\n }\n}\n","/**\n * XRPL-Specific Transaction Preparation Sub-Client\n *\n * XRPL-only escape hatches that have no multi-chain analog.\n *\n * Available via: `client.xrpl.*`\n *\n * Operations exposed here:\n * - Trust line setup (XRPL TrustSet — XRPL's account-to-issuer authorization\n * for an issued currency. The chain-agnostic analog `associateToken` does\n * not yet exist on the validator; once added, callers should prefer that.)\n *\n * For multi-chain operations (transfer, mint, burn, NFT ops), use the\n * chain-agnostic top-level `client.transactions.*` or top-level `client.*`\n * methods with `chain: 'xrpl'`.\n */\n\nimport type { HttpClient } from '../../http';\nimport type { PreparedTransaction } from '../types';\n\n/** Trust line preparation request (XRPL TrustSet). */\nexport type PrepareTrustLineRequest = {\n /**\n * XRPL account authorising the trust line. Falls back to `payerAccountId`\n * and ultimately the authenticated session wallet.\n */\n accountAddress?: string;\n payerAccountId?: string;\n /** ISO-4217-like currency code (e.g. \"USD\") or 40-char hex. */\n currency: string;\n /** Classic-address of the issuer. */\n issuerAddress: string;\n /** Decimal-string trust-line limit. Defaults to validator policy when omitted. */\n limit?: string;\n entityId: string;\n};\n\n/**\n * XRPL-specific transaction preparation sub-client.\n *\n * Wire format: every request body is augmented with `chain: 'xrpl'` before\n * POSTing — callers never write the chain literal themselves.\n */\nexport class XrplTransactionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Prepare an XRPL TrustSet (trust line) transaction. */\n async prepareTrustLine(request: PrepareTrustLineRequest): Promise<PreparedTransaction> {\n return this.http.post('/trustline/prepare', { ...request, chain: 'xrpl' });\n }\n}\n","/**\n * Solana-Specific Transaction Preparation Sub-Client\n *\n * Solana-only escape hatches that have no multi-chain analog.\n *\n * Available via: `client.solana.*`\n *\n * Operations exposed here:\n * - Token close-account (SPL Token CloseAccount — closes an empty ATA and\n * recovers the SOL rent. No analog on Hedera/XRPL/Polkadot/Cardano.)\n *\n * For multi-chain operations (createToken, transfer, mint, burn, pause,\n * restrict, NFT ops), use the chain-agnostic top-level `client.transactions.*`\n * or top-level `client.*` methods with `chain: 'solana'`.\n */\n\nimport type { HttpClient } from '../../http';\nimport type { PreparedTransaction, SecurityMode } from '../types';\n\n/** Token close-account preparation request (Solana SPL Token). */\nexport type PrepareTokenCloseAccountRequest = {\n payerAccountId?: string;\n /** ATA address to close. Must have zero token balance. */\n account: string;\n /** Recipient of recovered SOL rent lamports. */\n destination: string;\n /** ATA owner — required when not using TSS multisig; vault PDA used for partial/full. */\n owner?: string;\n entityId?: string;\n securityMode?: SecurityMode;\n appOwnerPublicKey?: string;\n memo?: string;\n};\n\n/**\n * Solana-specific transaction preparation sub-client.\n *\n * Wire format: every request body is augmented with `chain: 'solana'` before\n * POSTing — callers never write the chain literal themselves.\n */\nexport class SolanaTransactionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Prepare an SPL Token close-account transaction. */\n async prepareTokenCloseAccount(\n request: PrepareTokenCloseAccountRequest,\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/close-account/prepare', { ...request, chain: 'solana' });\n }\n}\n","/**\n * Polkadot-Specific Transaction Preparation Sub-Client\n *\n * Polkadot Asset Hub-only escape hatches that have no multi-chain analog.\n *\n * Available via: `client.polkadot.*`\n *\n * Operations exposed here:\n * - assets.setTeam — transfer issuer/admin/freezer roles of a pallet-assets\n * asset to new SS58 addresses. No analog on Hedera/XRPL.\n * - assets.setMetadata — update on-chain name/symbol/decimals of a pallet-\n * assets asset post-creation.\n *\n * For multi-chain operations (createToken, transfer, mint, burn, pause,\n * restrict, NFT ops), use the chain-agnostic top-level `client.transactions.*`\n * or top-level `client.*` methods with `chain: 'polkadot'`.\n */\n\nimport type { HttpClient } from '../../http';\nimport type { PreparedTransaction, SecurityMode } from '../types';\n\n/** Asset setTeam preparation request (Polkadot Asset Hub). */\nexport type PrepareAssetSetTeamRequest = {\n payerAccountId?: string;\n /** pallet-assets asset id (u32). */\n assetId: number;\n /** SS58 address — new issuer. */\n issuer: string;\n /** SS58 address — new admin. */\n admin: string;\n /** SS58 address — new freezer. */\n freezer: string;\n entityId?: string;\n securityMode?: SecurityMode;\n appOwnerPublicKey?: string;\n ss58Format?: number;\n};\n\n/** Asset setMetadata preparation request (Polkadot Asset Hub). */\nexport type PrepareAssetSetMetadataRequest = {\n payerAccountId?: string;\n /** pallet-assets asset id (u32). */\n assetId: number;\n /** Human-readable asset name (max 64 chars). */\n name: string;\n /** Asset symbol (max 16 chars). */\n symbol: string;\n /** Decimal precision (0..18). */\n decimals: number;\n entityId?: string;\n securityMode?: SecurityMode;\n appOwnerPublicKey?: string;\n ss58Format?: number;\n};\n\n/**\n * Polkadot-specific transaction preparation sub-client.\n *\n * Wire format: every request body is augmented with `chain: 'polkadot'`\n * before POSTing — callers never write the chain literal themselves.\n */\nexport class PolkadotTransactionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Prepare a pallet-assets.setTeam transaction. */\n async prepareAssetSetTeam(request: PrepareAssetSetTeamRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/set-team/prepare', { ...request, chain: 'polkadot' });\n }\n\n /** Prepare a pallet-assets.setMetadata transaction. */\n async prepareAssetSetMetadata(\n request: PrepareAssetSetMetadataRequest,\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/set-metadata/prepare', { ...request, chain: 'polkadot' });\n }\n}\n","/**\n * Transactions Sub-Client — Chain-Agnostic\n *\n * Provides transaction preparation for the sovereignty model:\n * transactions are prepared on the validator but signed locally by the user.\n *\n * **Every method here accepts the `ChainType` union — never a chain literal.**\n * Chain-specific escape hatches (Hedera HCS topics, XRPL trust lines, Solana\n * close-account, Polkadot setTeam/setMetadata) are exposed via namespaced\n * sub-clients on the main client: `client.hedera`, `client.xrpl`,\n * `client.solana`, `client.polkadot`.\n *\n * @example\n * ```typescript\n * // Multi-chain transfer\n * const prepared = await client.transactions.prepareTransfer({\n * chain: 'xrpl',\n * from: 'rXXX',\n * to: 'rYYY',\n * amount: '100',\n * });\n *\n * // Multi-chain token mint\n * const prepared = await client.transactions.prepareTokenMint({\n * chain: 'solana',\n * tokenId: '<mint-pubkey>',\n * amount: '1000',\n * });\n * ```\n */\n\nimport type { HttpClient } from '../http';\nimport type {\n PreparedTransaction,\n PrepareTransferRequest,\n PrepareNftMintRequest,\n PrepareNftBurnRequest,\n PrepareNftTransferRequest,\n PrepareTokenCreateRequest,\n PrepareTokenMintRequest,\n PrepareTokenBurnRequest,\n PrepareTokenAssociateRequest,\n PrepareTokenPauseRequest,\n PrepareTokenUnpauseRequest,\n PrepareTokenRestrictRequest,\n PrepareTokenUnrestrictRequest,\n TransactionInfoResponse,\n} from './types';\n\nexport * from './types';\nexport * from './chains';\n\n/**\n * Chain-agnostic transactions sub-client.\n *\n * NOTE: This client targets `/api/transactions` (not `/api/v3`).\n * The injected `HttpClient` must be configured with that base URL.\n */\nexport class TransactionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get transaction preparation service info. */\n async getInfo(): Promise<TransactionInfoResponse> {\n return this.http.get('/info');\n }\n\n /** Prepare a transfer transaction (any supported chain). */\n async prepareTransfer(request: PrepareTransferRequest): Promise<PreparedTransaction> {\n return this.http.post('/transfer/prepare', request);\n }\n\n /** Prepare an NFT mint transaction (any supported chain). */\n async prepareNftMint(request: PrepareNftMintRequest): Promise<PreparedTransaction> {\n return this.http.post('/nft/mint/prepare', request);\n }\n\n /** Prepare an NFT burn transaction (any supported chain). */\n async prepareNftBurn(request: PrepareNftBurnRequest): Promise<PreparedTransaction> {\n return this.http.post('/nft/burn/prepare', request);\n }\n\n /** Prepare an NFT transfer transaction (any supported chain). */\n async prepareNftTransfer(request: PrepareNftTransferRequest): Promise<PreparedTransaction> {\n return this.http.post('/nft/transfer/prepare', request);\n }\n\n /** Prepare a token creation transaction (Hedera, Solana, Polkadot, Cardano). */\n async prepareTokenCreate(request: PrepareTokenCreateRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/create/prepare', request);\n }\n\n /** Prepare a token mint transaction (any supported chain). */\n async prepareTokenMint(request: PrepareTokenMintRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/mint/prepare', request);\n }\n\n /**\n * Prepare a fungible token burn transaction (Hedera, Solana, Polkadot,\n * Cardano). For NFT burn use `prepareNftBurn` with a `serialNumber`.\n */\n async prepareTokenBurn(request: PrepareTokenBurnRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/burn/prepare', request);\n }\n\n /**\n * Prepare a token association transaction (Hedera HTS associate / Solana\n * ATA create). On chains that don't need explicit association (XRPL uses\n * trustlines — see `client.xrpl.prepareTrustLine`), the server returns 400.\n */\n async prepareTokenAssociate(\n request: PrepareTokenAssociateRequest,\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/associate/prepare', request);\n }\n\n /** Prepare a token pause transaction (Hedera, Polkadot, Solana). */\n async prepareTokenPause(request: PrepareTokenPauseRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/pause/prepare', request);\n }\n\n /** Prepare a token unpause transaction (Hedera, Polkadot, Solana). */\n async prepareTokenUnpause(request: PrepareTokenUnpauseRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/unpause/prepare', request);\n }\n\n /**\n * Prepare a token restrict (freeze account) transaction (Hedera, Polkadot,\n * Solana). Freezes `accountId`/`who`/`account` from transacting the token.\n */\n async prepareTokenRestrict(request: PrepareTokenRestrictRequest): Promise<PreparedTransaction> {\n return this.http.post('/token/restrict/prepare', request);\n }\n\n /** Prepare a token unrestrict (unfreeze account) transaction. */\n async prepareTokenUnrestrict(\n request: PrepareTokenUnrestrictRequest,\n ): Promise<PreparedTransaction> {\n return this.http.post('/token/unrestrict/prepare', request);\n }\n}\n","/**\n * Snapshots Sub-Client\n *\n * Provides token holder snapshot generation and retrieval.\n *\n * @example\n * ```typescript\n * // Generate a snapshot\n * const { snapshotId } = await client.snapshots.generate('0.0.12345');\n *\n * // Check status\n * const info = await client.snapshots.get(snapshotId);\n *\n * // Download when ready\n * const data = await client.snapshots.download(snapshotId, 'csv');\n * ```\n */\nimport type { HttpClient } from '../http';\nimport type {\n SnapshotInfo,\n SnapshotGenerateOptions,\n SnapshotGenerateResponse,\n SnapshotListResponse,\n SnapshotFormat,\n PaginationOptions,\n} from './types';\n\nexport * from './types';\n\n/**\n * Snapshots Sub-Client\n *\n * Manages token holder snapshots:\n * - Generate point-in-time snapshots of token holders\n * - Query snapshot status and metadata\n * - Download snapshot data in JSON or CSV\n */\nexport class SnapshotsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Generate a new snapshot for a token\n *\n * @param tokenId - Token identifier\n * @param options - Generation options (format, filters)\n */\n async generate(\n tokenId: string,\n options?: SnapshotGenerateOptions\n ): Promise<SnapshotGenerateResponse> {\n return this.http.post(\n `/snapshots/generate/${encodeURIComponent(tokenId)}`,\n options || {}\n );\n }\n\n /**\n * Get snapshot details by ID\n */\n async get(snapshotId: string): Promise<SnapshotInfo> {\n return this.http.get(`/snapshots/${encodeURIComponent(snapshotId)}`);\n }\n\n /**\n * List snapshots for a token\n */\n async listByToken(\n tokenId: string,\n pagination?: PaginationOptions\n ): Promise<SnapshotListResponse> {\n const params = new URLSearchParams();\n if (pagination?.page !== undefined) params.set('page', String(pagination.page));\n if (pagination?.limit !== undefined) params.set('limit', String(pagination.limit));\n const qs = params.toString();\n return this.http.get(\n `/snapshots/token/${encodeURIComponent(tokenId)}${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Download snapshot data\n *\n * @param snapshotId - Snapshot ID\n * @param format - Output format (json or csv)\n */\n async download(snapshotId: string, format?: SnapshotFormat): Promise<any> {\n const params = format ? `?format=${encodeURIComponent(format)}` : '';\n return this.http.get(\n `/snapshots/${encodeURIComponent(snapshotId)}/download${params}`\n );\n }\n}\n","/**\n * HistoricalBalanceClient — thin HTTP wrapper around\n * `POST /api/v3/historical-balance/query`.\n *\n * Two construction modes:\n * 1. **Standalone (CLI):** `new HistoricalBalanceClient({ baseUrl, ... })`.\n * The client builds its own `fetch` URL + headers + timeout.\n * 2. **As a sub-client of `SmartEngineClient`:** the parent passes its\n * shared `HttpClient` via the static `HistoricalBalanceClient.fromHttp`\n * factory so that auth, timeouts, and base-URL resolution stay in one\n * place. See `client.ts`.\n *\n * Zero internal `@hsuite/*` imports — wire types are locally declared in\n * `./historical-balance-types`. See PR-CLEANUP (#576) for rationale.\n */\n\nimport type { HttpClient } from '../http';\nimport type {\n HistoricalBalanceClientConfig,\n HistoricalBalanceQueryParams,\n HistoricalBalanceResult,\n} from './historical-balance-types';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst ENDPOINT_PATH = '/api/v3/historical-balance/query';\n\n/**\n * Error thrown by `HistoricalBalanceClient` on non-2xx responses or transport\n * failures. Surfaces `statusCode` so callers can map specific codes (400 →\n * input error / unsupported chain, 502 → upstream archive issue) without\n * string-matching messages.\n */\nexport class HistoricalBalanceClientError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'HistoricalBalanceClientError';\n }\n}\n\nexport class HistoricalBalanceClient {\n // Standalone-mode fields (set when the client builds its own fetch).\n private readonly baseUrl?: string;\n private readonly authToken?: string;\n private readonly apiKey?: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl?: typeof fetch;\n\n // Sub-client-mode field (set when wired via SmartEngineClient).\n private readonly http?: HttpClient;\n\n constructor(config: HistoricalBalanceClientConfig | { http: HttpClient }) {\n if ('http' in config) {\n this.http = config.http;\n this.timeoutMs = DEFAULT_TIMEOUT_MS;\n return;\n }\n if (!config.baseUrl) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient: baseUrl is required for standalone construction',\n 400\n );\n }\n this.baseUrl = config.baseUrl.replace(/\\/+$/, '');\n this.authToken = config.authToken;\n this.apiKey = config.apiKey;\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.fetchImpl = config.fetchImpl;\n }\n\n /**\n * Factory used by `SmartEngineClient` to wire this sub-client onto the\n * parent's shared `HttpClient` (which already carries auth + baseUrl + a\n * `/api/v3` prefix). Routes through `/historical-balance/query` since the\n * parent's HttpClient is rooted at `/api/v3`.\n */\n static fromHttp(http: HttpClient): HistoricalBalanceClient {\n return new HistoricalBalanceClient({ http });\n }\n\n /**\n * Query a point-in-time balance.\n *\n * The validator returns the on-chain bigint as a base-10 decimal string.\n * Callers needing arithmetic precision should wrap the result:\n *\n * ```ts\n * const { balance } = await client.historicalBalance.getBalance({ ... });\n * const value = BigInt(balance);\n * ```\n */\n async getBalance(params: HistoricalBalanceQueryParams): Promise<HistoricalBalanceResult> {\n this.validateParams(params);\n\n if (this.http) {\n // Sub-client mode: delegate to the shared HttpClient. The path is\n // relative because the parent client roots at `/api/v3`.\n return this.http.post<HistoricalBalanceResult>('/historical-balance/query', params);\n }\n return this.standaloneFetch(params);\n }\n\n private validateParams(params: HistoricalBalanceQueryParams): void {\n if (!params || typeof params !== 'object') {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: params object is required',\n 400\n );\n }\n const { chain, entityId, account, atTimestamp } = params;\n if (chain !== 'hedera' && chain !== 'xrpl' && chain !== 'polkadot') {\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient.getBalance: unsupported chain \"${String(chain)}\" (expected hedera | xrpl | polkadot)`,\n 400\n );\n }\n if (typeof entityId !== 'string' || entityId.length === 0) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: entityId must be a non-empty string',\n 400\n );\n }\n if (typeof account !== 'string' || account.length === 0) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: account must be a non-empty string',\n 400\n );\n }\n if (\n typeof atTimestamp !== 'number' ||\n !Number.isInteger(atTimestamp) ||\n atTimestamp <= 0\n ) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient.getBalance: atTimestamp must be a positive integer (unix seconds)',\n 400\n );\n }\n }\n\n private async standaloneFetch(\n params: HistoricalBalanceQueryParams\n ): Promise<HistoricalBalanceResult> {\n const url = `${this.baseUrl}${ENDPOINT_PATH}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n if (this.authToken) headers.Authorization = `Bearer ${this.authToken}`;\n if (this.apiKey) headers['X-API-Key'] = this.apiKey;\n\n const fetchFn = this.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined);\n if (!fetchFn) {\n throw new HistoricalBalanceClientError(\n 'HistoricalBalanceClient: no fetch implementation available (provide fetchImpl)',\n 500\n );\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await fetchFn(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const message = err instanceof Error ? err.message : String(err);\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient: transport error: ${message}`,\n 0,\n err\n );\n }\n clearTimeout(timer);\n\n let body: unknown;\n const text = await response.text();\n if (text.length > 0) {\n try {\n body = JSON.parse(text);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient: non-JSON response (status=${response.status}): ${message}`,\n response.status,\n { raw: text }\n );\n }\n }\n\n if (!response.ok) {\n const detail =\n body && typeof body === 'object' && 'message' in (body as any)\n ? String((body as any).message)\n : `HTTP ${response.status}`;\n throw new HistoricalBalanceClientError(\n `HistoricalBalanceClient: ${detail}`,\n response.status,\n body\n );\n }\n\n return body as HistoricalBalanceResult;\n }\n}\n","/**\n * Settlement Sub-Client\n *\n * Manages cross-chain settlement operations including initiation,\n * status tracking, XRP landing confirmation, and history retrieval.\n */\n\nimport type { HttpClient } from '../http';\n\nexport type {\n SettlementPurpose,\n SettlementAsset,\n SettlementInitiateRequest,\n SettlementStatusResponse,\n SettlementHistoryEntry,\n} from './types';\n\nimport type {\n SettlementInitiateRequest,\n SettlementStatusResponse,\n SettlementHistoryEntry,\n} from './types';\n\nexport class SettlementClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Initiate a new settlement operation.\n * Submits source-chain payment details and begins the conversion pipeline.\n */\n async initiate(request: SettlementInitiateRequest): Promise<SettlementStatusResponse> {\n return this.http.post('/settlement/initiate', request);\n }\n\n /**\n * Get the current status of a settlement by ID.\n */\n async getStatus(settlementId: string): Promise<SettlementStatusResponse> {\n return this.http.get(`/settlement/${encodeURIComponent(settlementId)}/status`);\n }\n\n /**\n * Confirm that XRP has landed on the destination address.\n * Advances the settlement to the next processing step.\n */\n async confirmXrpLanded(settlementId: string): Promise<SettlementStatusResponse> {\n return this.http.post(`/settlement/${encodeURIComponent(settlementId)}/confirm-xrp`, {});\n }\n\n /**\n * Get settlement history for a given entity.\n */\n async getHistory(entityId: string): Promise<SettlementHistoryEntry[]> {\n return this.http.get(`/settlement/history/${encodeURIComponent(entityId)}`);\n }\n}\n","/**\n * Governance sub-client barrel.\n *\n * Pure HTTP. No internal `@hsuite/*` imports.\n */\nexport { GovernanceClient } from './governance-client';\nexport type {\n GovernanceConfig,\n GovernanceValidationContext,\n GovernanceValidationResult,\n GovernanceSimulateRequest,\n GovernanceProposalData,\n GovernanceProposalStatus,\n GovernanceVoteType,\n GovernanceVotingPowerMethod,\n} from './governance-types';\n","/**\n * Governance Sub-Client (PR-GOVERNANCE)\n *\n * Thin HTTP wrapper around `POST /api/v3/governance/simulate`. Lets\n * smart-app authors dry-run `GovernanceMolecule.validate(...)` against\n * fixture data without depending on the rules-engine package.\n *\n * Zero internal-lib coupling: types are declared locally in\n * `./governance-types`; the only runtime dependency is the SDK's own\n * `HttpClient` abstraction.\n */\nimport type { HttpClient } from '../http';\nimport type {\n GovernanceSimulateRequest,\n GovernanceValidationResult,\n} from './governance-types';\n\n/**\n * Governance Sub-Client.\n *\n * Exposed as `client.governance` on `SmartEngineClient`.\n *\n * @example\n * ```typescript\n * const result = await client.governance.simulate({\n * config: { governanceTokenId: '0.0.123', proposalThreshold: '100', votingPeriodMs: 604800000 },\n * context: { callerAccountId: '0.0.111', action: 'create_proposal', tokenBalance: '500' },\n * });\n * if (!result.isValid) {\n * console.error('proposal rejected:', result.reason);\n * }\n * ```\n */\nexport class GovernanceClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Dry-run a governance proposal/vote/etc. against `GovernanceMolecule.validate(...)`.\n *\n * Returns whatever `ValidationResult` the molecule produced. A `false`\n * `isValid` is **not** an error — it is a successful \"this proposal is\n * invalid\" outcome and is surfaced via the normal return value.\n *\n * HTTP errors (400 malformed body, 500 unexpected) bubble up as\n * `SdkHttpError` via the shared `HttpClient` layer.\n */\n async simulate(params: GovernanceSimulateRequest): Promise<GovernanceValidationResult> {\n return this.http.post<GovernanceValidationResult>('/governance/simulate', params);\n }\n}\n","/**\n * Personhood sub-client barrel.\n */\nexport * from './personhood-types';\nexport {\n PersonhoodClient,\n isPersonhoodVerifierNotConfigured,\n PERSONHOOD_VERIFIER_NOT_CONFIGURED,\n} from './personhood-client';\n","/**\n * Personhood Sub-Client\n *\n * Thin HTTP wrapper around `POST /api/v3/personhood/verify`. Pure HTTP —\n * never imports a server-side personhood module or the baas-core types.\n * The locally-declared types in `./personhood-types` mirror the server's\n * wire shape; see that file for the source-of-truth annotation.\n *\n * @example\n * ```typescript\n * const cert = await client.personhood.verify({\n * candidate: '0.0.12345',\n * proof: {\n * attestationMethod: 'web-of-trust',\n * payload: { vouchers: ['0.0.111', '0.0.222'] },\n * },\n * });\n * if (!cert) {\n * console.log('verification rejected');\n * return;\n * }\n * console.log('cert expires at', cert.expiresAt);\n * ```\n */\nimport type { HttpClient } from '../http';\nimport { SdkHttpError } from '../http';\nimport type {\n PersonhoodCert,\n PersonhoodVerifyParams,\n} from './personhood-types';\n\n/**\n * Error envelope emitted by the validator when the hub has no\n * `IPersonhoodVerifier` wired. Exposed as a constant so callers can\n * branch on the `error` discriminator without re-typing the string.\n */\nexport const PERSONHOOD_VERIFIER_NOT_CONFIGURED = 'personhood_verifier_not_configured' as const;\n\n/**\n * Thin HTTP client for the personhood endpoint.\n *\n * Method outcomes:\n * - HTTP 200 with a cert object → resolves to `PersonhoodCert`.\n * - HTTP 200 with `null` body → resolves to `null` (clean rejection).\n * - HTTP 400 → throws `SdkHttpError(400)`.\n * - HTTP 503 → throws `SdkHttpError(503)` whose\n * `.details.error === 'personhood_verifier_not_configured'`.\n * - HTTP 5xx → throws `SdkHttpError` with the upstream status.\n * - Network / timeout → throws `SdkHttpError(0|408)`.\n */\nexport class PersonhoodClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Verify a personhood proof for `candidate`.\n *\n * Returns the issued cert on accept, `null` on clean rejection. All\n * other failure modes (validation, transport, 5xx) propagate as\n * `SdkHttpError`.\n */\n async verify(params: PersonhoodVerifyParams): Promise<PersonhoodCert | null> {\n const result = await this.http.post<PersonhoodCert | null>(\n '/personhood/verify',\n {\n candidate: params.candidate,\n proof: params.proof,\n },\n );\n // The validator returns `null` literally on clean rejection, and the\n // HTTP layer surfaces empty `204 No Content` bodies as `undefined`.\n // Treat both as the same \"no cert\" outcome so callers only branch on\n // `=== null`.\n if (result === undefined) return null;\n return result;\n }\n}\n\nexport type { PersonhoodCert, PersonhoodVerifyParams } from './personhood-types';\n\n/**\n * Predicate: narrows an unknown error to a 503\n * `personhood_verifier_not_configured` envelope. Use in smart-app code to\n * treat unconfigured hubs as a graceful downgrade.\n */\nexport function isPersonhoodVerifierNotConfigured(\n err: unknown,\n): err is SdkHttpError & { details: { error: typeof PERSONHOOD_VERIFIER_NOT_CONFIGURED } } {\n if (!(err instanceof SdkHttpError)) return false;\n if (err.statusCode !== 503) return false;\n const d = err.details as unknown;\n if (d === null || typeof d !== 'object') return false;\n return (d as Record<string, unknown>).error === PERSONHOOD_VERIFIER_NOT_CONFIGURED;\n}\n","/**\n * Agents Types\n *\n * Types for smart agent management on the host.\n */\n\n/** Agent status */\nexport type AgentStatus = 'active' | 'paused' | 'revoked' | 'pending';\n\n/** Agent registration request */\nexport type AgentRegisterRequest = {\n name: string;\n description?: string;\n capabilities: string[];\n rules: AgentRules;\n fundingConfig?: {\n chain: string;\n maxAmount: string;\n autoFund: boolean;\n };\n};\n\n/**\n * Agent rules configuration.\n *\n * Rules govern what an autonomous agent is permitted to do.\n * All monetary values are decimal strings (e.g. `\"1000.50\"`) to avoid\n * floating-point precision issues across chains.\n *\n * @example\n * ```typescript\n * const rules: AgentRules = {\n * maxTradeAmount: '500',\n * allowedPairs: ['HBAR/USDC', 'XRP/USDC'],\n * allowedChains: ['hedera', 'xrpl'],\n * dailyLimit: '5000',\n * requireApprovalAbove: '1000',\n * };\n * ```\n */\nexport type AgentRules = {\n /** Maximum amount for a single trade (positive decimal string). */\n maxTradeAmount?: string;\n /** Trading pairs the agent may operate on (e.g. `['HBAR/USDC']`). */\n allowedPairs?: string[];\n /**\n * Chains the agent may operate on.\n * Valid values: `'hedera'`, `'xrpl'`, `'polkadot'`, `'solana'`, `'stellar'`,\n * `'ethereum'`, `'polygon'`, `'bitcoin'`.\n */\n allowedChains?: string[];\n /** Maximum total trade volume per 24-hour rolling window (positive decimal string). */\n dailyLimit?: string;\n /** Trades above this amount require manual owner approval (positive decimal string). */\n requireApprovalAbove?: string;\n /** Application-specific custom rules. */\n customRules?: Record<string, unknown>;\n};\n\n/**\n * Chains recognised by the platform for agent rule validation.\n */\nconst VALID_CHAIN_NAMES: ReadonlySet<string> = new Set([\n 'hedera',\n 'xrpl',\n 'polkadot',\n 'solana',\n 'stellar',\n 'ethereum',\n 'polygon',\n 'bitcoin',\n]);\n\n/**\n * Result of {@link validateAgentRules}.\n */\nexport type AgentRulesValidationResult = {\n /** `true` when no errors were found. */\n valid: boolean;\n /** Human-readable error messages (empty when valid). */\n errors: string[];\n};\n\n/**\n * Validate an {@link AgentRules} object before sending it to the API.\n *\n * Checks:\n * - `maxTradeAmount` — must be a positive decimal string when present.\n * - `allowedPairs` — must be an array of non-empty strings when present.\n * - `allowedChains` — must be an array of recognised chain names when present.\n * - `dailyLimit` — must be a positive decimal string when present.\n * - `requireApprovalAbove` — must be a positive decimal string when present.\n *\n * @example\n * ```typescript\n * import { validateAgentRules } from '@hsuite/smart-engines-sdk';\n *\n * const { valid, errors } = validateAgentRules({\n * maxTradeAmount: '-10',\n * allowedChains: ['hedera', 'foochain'],\n * });\n * // valid === false\n * // errors === [\n * // 'maxTradeAmount must be a positive decimal string',\n * // 'allowedChains contains invalid chain name: foochain',\n * // ]\n * ```\n */\nexport function validateAgentRules(rules: AgentRules): AgentRulesValidationResult {\n const errors: string[] = [];\n\n if (rules.maxTradeAmount !== undefined) {\n if (!isPositiveDecimalString(rules.maxTradeAmount)) {\n errors.push('maxTradeAmount must be a positive decimal string');\n }\n }\n\n if (rules.allowedPairs !== undefined) {\n if (!Array.isArray(rules.allowedPairs)) {\n errors.push('allowedPairs must be an array of strings');\n } else {\n for (const pair of rules.allowedPairs) {\n if (typeof pair !== 'string' || pair.trim().length === 0) {\n errors.push('allowedPairs contains an empty or non-string entry');\n break;\n }\n }\n }\n }\n\n if (rules.allowedChains !== undefined) {\n if (!Array.isArray(rules.allowedChains)) {\n errors.push('allowedChains must be an array of strings');\n } else {\n for (const chain of rules.allowedChains) {\n if (!VALID_CHAIN_NAMES.has(chain)) {\n errors.push(`allowedChains contains invalid chain name: ${chain}`);\n }\n }\n }\n }\n\n if (rules.dailyLimit !== undefined) {\n if (!isPositiveDecimalString(rules.dailyLimit)) {\n errors.push('dailyLimit must be a positive decimal string');\n }\n }\n\n if (rules.requireApprovalAbove !== undefined) {\n if (!isPositiveDecimalString(rules.requireApprovalAbove)) {\n errors.push('requireApprovalAbove must be a positive decimal string');\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/** @internal */\nfunction isPositiveDecimalString(value: unknown): boolean {\n if (typeof value !== 'string') return false;\n const num = Number(value);\n return !Number.isNaN(num) && num > 0;\n}\n\n/** Agent info */\nexport type AgentInfo = {\n agentId: string;\n name: string;\n description?: string;\n status: AgentStatus;\n capabilities: string[];\n rules: AgentRules;\n owner: string;\n createdAt: string;\n lastActiveAt?: string;\n};\n\n/** Agent event */\nexport type AgentEvent = {\n eventId: string;\n agentId: string;\n type: string;\n data: Record<string, unknown>;\n timestamp: string;\n};\n\n/** Agent balance info */\nexport type AgentBalance = {\n chain: string;\n accountId: string;\n balance: string;\n symbol: string;\n};\n\n/** Agent operation for approval/rejection */\nexport type AgentOperation = {\n operationId: string;\n agentId: string;\n type: string;\n amount: string;\n chain: string;\n status: 'pending' | 'approved' | 'rejected';\n createdAt: string;\n};\n\n/** Fund request */\nexport type AgentFundRequest = {\n chain: string;\n amount: string;\n source?: string;\n};\n\n/** Trade request */\nexport type AgentTradeRequest = {\n chain: string;\n pair: string;\n side: 'buy' | 'sell';\n amount: string;\n price?: string;\n};\n\n/** Withdraw request */\nexport type AgentWithdrawRequest = {\n chain: string;\n amount: string;\n destination: string;\n};\n","/**\n * Agents Sub-Client\n *\n * Manages autonomous smart agents on the host platform.\n *\n * @example\n * ```typescript\n * // Register an agent\n * const agent = await baas.agents.register({\n * name: 'Trading Bot',\n * capabilities: ['trade', 'withdraw'],\n * rules: { maxTradeAmount: '1000', allowedPairs: ['HBAR/USDC'] },\n * });\n *\n * // Fund and trade\n * await baas.agents.fund(agent.agentId, { chain: 'hedera', amount: '500' });\n * await baas.agents.trade(agent.agentId, { chain: 'hedera', pair: 'HBAR/USDC', side: 'buy', amount: '100' });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n AgentRegisterRequest,\n AgentInfo,\n AgentRules,\n AgentEvent,\n AgentBalance,\n AgentFundRequest,\n AgentTradeRequest,\n AgentWithdrawRequest,\n} from './types';\n\nexport * from './types';\nexport { validateAgentRules } from './types';\n\nexport class AgentsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Register a new agent */\n async register(request: AgentRegisterRequest): Promise<AgentInfo> {\n return this.http.post('/api/agents/register', request);\n }\n\n /** Get agent details */\n async get(agentId: string): Promise<AgentInfo> {\n return this.http.get(`/api/agents/${encodeURIComponent(agentId)}`);\n }\n\n /** List all agents */\n async list(): Promise<{ agents: AgentInfo[]; total: number }> {\n return this.http.get('/api/agents');\n }\n\n /** Fund an agent */\n async fund(agentId: string, request: AgentFundRequest): Promise<{ success: boolean; txId?: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/fund`, request);\n }\n\n /** Execute a trade */\n async trade(agentId: string, request: AgentTradeRequest): Promise<{ success: boolean; txId?: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/trade`, request);\n }\n\n /** Withdraw funds from agent */\n async withdraw(agentId: string, request: AgentWithdrawRequest): Promise<{ success: boolean; txId?: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/withdraw`, request);\n }\n\n /** Pause an agent */\n async pause(agentId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/pause`, {});\n }\n\n /** Resume a paused agent */\n async resume(agentId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/resume`, {});\n }\n\n /** Revoke an agent (permanent) */\n async revoke(agentId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/revoke`, {});\n }\n\n /** Update agent rules */\n async updateRules(agentId: string, rules: Partial<AgentRules>): Promise<AgentInfo> {\n return this.http.put(`/api/agents/${encodeURIComponent(agentId)}/rules`, rules);\n }\n\n /** Get agent events */\n async getEvents(agentId: string): Promise<{ events: AgentEvent[]; total: number }> {\n return this.http.get(`/api/agents/${encodeURIComponent(agentId)}/events`);\n }\n\n /** Get agent balances across chains */\n async getBalances(agentId: string): Promise<{ balances: AgentBalance[] }> {\n return this.http.get(`/api/agents/${encodeURIComponent(agentId)}/balances`);\n }\n\n /** Approve a pending agent operation */\n async approve(agentId: string, operationId: string): Promise<{ success: boolean }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/approve/${encodeURIComponent(operationId)}`, {});\n }\n\n /** Reject a pending agent operation */\n async reject(agentId: string, operationId: string): Promise<{ success: boolean }> {\n return this.http.post(`/api/agents/${encodeURIComponent(agentId)}/reject/${encodeURIComponent(operationId)}`, {});\n }\n}\n","/**\n * Deployment Sub-Client — runtime orchestration (spec §6.1).\n *\n * The four-step deploy flow:\n *\n * 1. `init` — server allocates appId + per-app Harbor project + ephemeral push robot creds.\n * 2. (out-of-band) — customer `docker login <registry.server>` then `docker push <registry.server>/<registry.repository>:<tag>`.\n * 3. `uploadFrontend` — (optional) tarball with the SPA bundle.\n * 4. `deploy` — server reconciles to k8s.\n *\n * @example\n * ```typescript\n * const init = await baas.deployment.init({ name: 'my-app', port: 3200, services: ['database'] });\n *\n * // Use the credentials returned in init.registry to push the backend image.\n * // init.registry.server → e.g. 'harbor-sn1.testnet.hsuite.network'\n * // init.registry.repository → e.g. 'hsuite-customers-<appId>'\n * // init.registry.username → ephemeral robot account\n * // init.registry.password → single-use secret (NOT persisted server-side)\n * //\n * // docker login <init.registry.server> -u <init.registry.username> -p <init.registry.password>\n * // docker push <init.registry.server>/<init.registry.repository>:v1\n *\n * await baas.deployment.deploy(init.appId, { tag: 'v1', replicas: 2 });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasInitRequest,\n BaasInitResponse,\n BaasDeployRequest,\n BaasDeployResponse,\n BaasUploadFrontendResponse,\n BaasRollbackRequest,\n BaasRuntimeStatus,\n BaasAppListResponse,\n DeployedAppInfo,\n} from '../types';\n\nexport class DeploymentClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Step 1 — allocate appId + receive ephemeral push credentials for\n * the cluster's per-tenant Harbor project.\n *\n * Each app gets its own Harbor project (`hsuite-customers-<appId>`)\n * isolated by Harbor's RBAC. The push robot returned in\n * `registry.{username, password}` is scoped to that project only —\n * it cannot read or write any other tenant's images.\n *\n * **Single-use secret discipline:** `registry.password` is returned\n * exactly once and is NOT persisted server-side. Store it locally\n * for the `docker push` and discard. To rotate, call `init` again\n * (issues a new robot under the same project).\n *\n * Use the credentials to `docker login` + `docker push`, then call\n * {@link deploy} with the pushed image tag.\n */\n async init(request: BaasInitRequest): Promise<BaasInitResponse> {\n return this.http.post('/api/deployment/apps/init', request);\n }\n\n /**\n * Step 3 (optional) — upload the SPA tarball.\n *\n * The tarball is content-addressed (SHA-256) and mounted read-only\n * into the customer's pod alongside the backend container. Returns\n * the hash + size so the caller can verify the upload.\n */\n async uploadFrontend(\n appId: string,\n bundle: Blob | Buffer,\n filename = 'bundle.tar.gz'\n ): Promise<BaasUploadFrontendResponse> {\n // PR-C: smart-host's `DeploymentController.uploadFrontend` uses\n // `FileInterceptor('bundle', ...)` — the multipart field name MUST\n // be `bundle`, not the SDK's default `'file'`. Override explicitly.\n return this.http.upload(\n `/api/deployment/apps/${encodeURIComponent(appId)}/frontend`,\n bundle,\n filename,\n undefined,\n 'bundle',\n );\n }\n\n /**\n * Step 4 — reconcile the runtime to k8s.\n *\n * Returns immediately with `status: 'deploying'`. Poll {@link status}\n * until `runtime.runtimeState === 'RUNNING'` for the URL to be live.\n */\n async deploy(appId: string, request: BaasDeployRequest): Promise<BaasDeployResponse> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/deploy`, request);\n }\n\n /**\n * Roll back to a previously-deployed image tag (must exist in\n * `runtime.deploymentHistory[]`).\n */\n async rollback(appId: string, request: BaasRollbackRequest): Promise<BaasDeployResponse> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/rollback`, request);\n }\n\n /**\n * Live combined lifecycle + runtime status of an app.\n */\n async status(appId: string): Promise<BaasRuntimeStatus> {\n return this.http.get(`/api/deployment/apps/${encodeURIComponent(appId)}/status`);\n }\n\n /**\n * List all deployed apps for the authenticated developer.\n */\n async list(): Promise<BaasAppListResponse> {\n return this.http.get('/api/deployment/apps');\n }\n\n /**\n * Get app details.\n */\n async get(appId: string): Promise<DeployedAppInfo> {\n return this.http.get(`/api/deployment/apps/${encodeURIComponent(appId)}`);\n }\n\n /**\n * Update app configuration. Runtime effect lands in PR-H.\n */\n async update(appId: string, updates: Partial<BaasDeployRequest>): Promise<DeployedAppInfo> {\n return this.http.put(`/api/deployment/apps/${encodeURIComponent(appId)}`, updates);\n }\n\n /**\n * Delete an app. Runtime effect (namespace teardown) lands in PR-H.\n */\n async delete(appId: string): Promise<{ success: boolean }> {\n return this.http.delete(`/api/deployment/apps/${encodeURIComponent(appId)}`);\n }\n\n /**\n * Suspend an app. Runtime effect (scale to zero) lands in PR-H.\n */\n async suspend(appId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/suspend`, {});\n }\n\n /**\n * Resume a suspended app. Runtime effect (scale back up) lands in PR-H.\n */\n async resume(appId: string): Promise<{ success: boolean; status: string }> {\n return this.http.post(`/api/deployment/apps/${encodeURIComponent(appId)}/resume`, {});\n }\n\n /**\n * Get deployment statistics.\n */\n async getStats(): Promise<{\n totalApps: number;\n activeApps: number;\n totalOwners: number;\n }> {\n return this.http.get('/api/deployment/stats');\n }\n}\n","import {\n CreateAccountRequestSchema,\n CreateAccountRequest,\n CreateAccountResponse,\n TransferRequestSchema,\n TransferRequest,\n TransferResponse,\n CreateTokenRequestSchema,\n CreateTokenRequest,\n CreateTokenResponse,\n MintTokenRequestSchema,\n MintTokenRequest,\n BurnTokenRequestSchema,\n BurnTokenRequest,\n TokenActionRequestSchema,\n TokenActionRequest,\n ActionResult,\n AccountBalance,\n AccountInfo,\n Transaction,\n TokenInfo,\n ChainType,\n} from './_vendor';\nimport { type CircuitBreakerSnapshot } from './_vendor';\nimport {\n ValidatorDiscoveryClient,\n ValidatorInfo,\n ClusterDiscoveryClient,\n type ClusterInfo,\n} from './discovery';\nimport { ValidatorAuthClient, AuthChain, AuthenticateResponse } from './auth';\nimport { createHttpClient, encodePathParam, type HttpClient } from './http';\nimport { type ResilientHttpConfig } from './http/resilient-http';\n\n// Sub-client imports — public API only (for third-party smart-app developers)\nimport { SubscriptionClient } from './subscription';\nimport { TSSClient } from './tss';\nimport { IPFSClient } from './ipfs';\nimport {\n TransactionsClient,\n HederaTransactionsClient,\n XrplTransactionsClient,\n SolanaTransactionsClient,\n PolkadotTransactionsClient,\n} from './transactions';\nimport { SnapshotsClient } from './snapshots';\nimport { HistoricalBalanceClient } from './historical-balance';\nimport { SettlementClient } from './settlement';\nimport { GovernanceClient } from './governance';\nimport { PersonhoodClient } from './personhood';\nimport { AgentsClient } from './baas/agents';\nimport { DeploymentClient } from './baas/deployment';\n\n/**\n * Smart Engine Client Configuration\n */\nexport interface SmartEngineClientConfig {\n /** Validator API base URL */\n baseUrl: string;\n /** API key for authenticated requests */\n apiKey?: string;\n /** Session token from validator auth */\n authToken?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Allow HTTP (insecure) connections - only for local development */\n allowInsecure?: boolean;\n /** HTTP resilience configuration (retry, timeout, circuit breaker) */\n http?: ResilientHttpConfig;\n}\n\n/**\n * Network connection configuration for auto-discovery\n */\nexport interface NetworkConnectionConfig {\n /** Hedera network (mainnet, testnet, previewnet) */\n network: 'mainnet' | 'testnet' | 'previewnet';\n /** HCS topic ID for validator registry */\n registryTopicId: string;\n /** Blockchain type for authentication */\n chain: AuthChain;\n /** Wallet address for authentication */\n address: string;\n /** Public key (hex encoded) */\n publicKey: string;\n /** Function to sign the challenge */\n signFn: (challenge: string) => string | Promise<string>;\n /** Optional metadata for authentication */\n metadata?: {\n appId?: string;\n appName?: string;\n };\n /** Custom mirror node URL */\n mirrorNodeUrl?: string;\n /** Allow HTTP (insecure) connections - only for local development */\n allowInsecure?: boolean;\n}\n\n/**\n * Cluster connection config used by {@link SmartEngineClient.connectToCluster}.\n *\n * The \"bootstrap\" list is operator-ordered preference (e.g. Cloudflare-\n * fronted hostname first, raw cluster ingress IPs as backstops). Only\n * the *first reachable* seed is consulted per refresh.\n */\nexport interface ClusterConnectionConfig {\n /** Bootstrap seeds: URLs that serve `GET /api/v3/discovery/clusters`. */\n bootstrap: string[];\n /** Blockchain type for authentication. */\n chain: AuthChain;\n /** Wallet address for authentication. */\n address: string;\n /** Public key (hex encoded). */\n publicKey: string;\n /** Function to sign the challenge. */\n signFn: (challenge: string) => string | Promise<string>;\n /** Optional metadata for authentication. */\n metadata?: { appId?: string; appName?: string };\n /**\n * Optional HCS trust anchor — when supplied, the bootstrap response is\n * cross-checked against the on-chain validator-registry topic so a\n * compromised bootstrap seed can't inject rogue clusters. See\n * {@link ClusterDiscoveryClient} for the exact semantics.\n */\n trustAnchor?: {\n network: 'mainnet' | 'testnet' | 'previewnet';\n registryTopicId: string;\n mirrorNodeUrl?: string;\n };\n /** Allow HTTP (insecure) connections — only for local development. */\n allowInsecure?: boolean;\n}\n\n/**\n * Connection result from {@link SmartEngineClient.connectToCluster}.\n */\nexport interface ClusterConnectionResult {\n /** Configured client ready to use. */\n client: SmartEngineClient;\n /** Cluster the SDK is currently connected to. */\n cluster: ClusterInfo;\n /** Auth session for the connected cluster. */\n session: AuthenticateResponse;\n}\n\n/**\n * Connection result from connectToNetwork\n */\nexport interface NetworkConnectionResult {\n /** Configured client ready to use */\n client: SmartEngineClient;\n /** Validator that was connected to */\n validator: ValidatorInfo;\n /** Authentication session */\n session: AuthenticateResponse;\n}\n\n/**\n * Smart Engine Client\n *\n * Unified, type-safe client for interacting with Smart Engines validators.\n * Supports direct connection or auto-discovery via HCS registry.\n *\n * Sub-clients for third-party app developers:\n * - `client.subscription` — Application subscription management\n * - `client.tss` — Threshold Signature Scheme (chain-agnostic MPC)\n * - `client.ipfs` — Decentralized file storage\n * - `client.transactions` — Transaction sovereignty (prepare-sign-submit) — **chain-agnostic**\n *\n * Chain-namespaced advanced sub-clients (escape hatches with no multi-chain analog):\n * - `client.hedera` — HCS topics, KYC compliance, HTS wipe\n * - `client.xrpl` — Trust lines\n * - `client.solana` — Token close-account\n * - `client.polkadot` — Asset setTeam/setMetadata\n *\n * @example Direct connection\n * ```typescript\n * const client = new SmartEngineClient({\n * baseUrl: 'https://validator.example.com',\n * apiKey: 'your-api-key',\n * });\n * ```\n *\n * @example Auto-discovery with authentication\n * ```typescript\n * const { client, validator, session } = await SmartEngineClient.connectToNetwork({\n * network: 'testnet',\n * registryTopicId: '0.0.123456',\n * chain: 'hedera',\n * address: '0.0.789',\n * publicKey: 'your-public-key-hex',\n * signFn: (challenge) => privateKey.sign(Buffer.from(challenge)).toString('hex'),\n * });\n *\n * // Use sub-clients\n * const result = await client.tss.signMPC({\n * chain: 'hedera',\n * entityId: 'entity-123',\n * transactionBytes: '0x...',\n * });\n * ```\n */\nexport class SmartEngineClient {\n private baseUrl: string;\n private allowInsecure: boolean;\n private readonly http: HttpClient;\n /** Separate HTTP client for /api/transactions (non-v3 base path) */\n private readonly txHttp: HttpClient;\n /** Last HTTP error (for getHttpHealth) */\n private lastHttpError?: Error;\n\n // ========== Sub-Clients ==========\n\n /** Application subscription management */\n public readonly subscription: SubscriptionClient;\n /** Threshold Signature Scheme — chain-agnostic MPC operations */\n public readonly tss: TSSClient;\n /** IPFS decentralized file storage */\n public readonly ipfs: IPFSClient;\n /** Transaction preparation for local signing (sovereignty model) — chain-agnostic */\n public readonly transactions: TransactionsClient;\n /** Hedera-specific transaction preparation (HCS topics, KYC, wipe) */\n public readonly hedera: HederaTransactionsClient;\n /** XRPL-specific transaction preparation (trust lines) */\n public readonly xrpl: XrplTransactionsClient;\n /** Solana-specific transaction preparation (close-account) */\n public readonly solana: SolanaTransactionsClient;\n /** Polkadot-specific transaction preparation (asset setTeam/setMetadata) */\n public readonly polkadot: PolkadotTransactionsClient;\n /** Token holder snapshot generation and retrieval */\n public readonly snapshots: SnapshotsClient;\n /** Historical balance archive reads (chain-native bigint, returned as decimal string) */\n public readonly historicalBalance: HistoricalBalanceClient;\n /** Cross-chain settlement operations */\n public readonly settlement: SettlementClient;\n /** Governance proposal dry-run (simulate-only) */\n public readonly governance: GovernanceClient;\n /** Personhood verification (HPP one-human-one-member) */\n public readonly personhood: PersonhoodClient;\n /** BaaS smart-agent lifecycle (register/fund/trade/withdraw/pause/resume/revoke/...) */\n public readonly agents: AgentsClient;\n /** BaaS smart-app deployment lifecycle (init/uploadFrontend/deploy/rollback/status/...) */\n public readonly deployments: DeploymentClient;\n\n constructor(config: SmartEngineClientConfig) {\n this.allowInsecure = config.allowInsecure ?? false;\n this.baseUrl = validateClientUrl(config.baseUrl, this.allowInsecure);\n // Note: config.http is accepted for backward compatibility and future resilience layer integration\n\n // Create shared HTTP client for /api/v3 endpoints\n this.http = createHttpClient({\n baseUrl: `${this.baseUrl}/api/v3`,\n apiKey: config.apiKey,\n authToken: config.authToken,\n timeout: config.timeout,\n });\n\n // Create separate HTTP client for /api/transactions (non-v3 base path)\n this.txHttp = createHttpClient({\n baseUrl: `${this.baseUrl}/api/transactions`,\n apiKey: config.apiKey,\n authToken: config.authToken,\n timeout: config.timeout,\n });\n\n // Initialize sub-clients\n this.subscription = new SubscriptionClient(this.http);\n this.tss = new TSSClient(this.http);\n this.ipfs = new IPFSClient(this.http);\n this.transactions = new TransactionsClient(this.txHttp);\n this.hedera = new HederaTransactionsClient(this.txHttp);\n this.xrpl = new XrplTransactionsClient(this.txHttp);\n this.solana = new SolanaTransactionsClient(this.txHttp);\n this.polkadot = new PolkadotTransactionsClient(this.txHttp);\n this.snapshots = new SnapshotsClient(this.http);\n this.historicalBalance = HistoricalBalanceClient.fromHttp(this.http);\n this.settlement = new SettlementClient(this.http);\n this.governance = new GovernanceClient(this.http);\n this.personhood = new PersonhoodClient(this.http);\n // BaaS sub-clients — they call `/api/<x>` paths directly (not `/api/v3/<x>`),\n // so they need an HTTP client rooted at `baseUrl` (no `/api/v3` suffix).\n // Reuse `txHttp` is wrong because its base is `${baseUrl}/api/transactions`.\n // Build a fresh, root-scoped client just for these.\n const rootHttp = createHttpClient({\n baseUrl: this.baseUrl,\n apiKey: config.apiKey,\n authToken: config.authToken,\n timeout: config.timeout,\n });\n this.agents = new AgentsClient(rootHttp);\n this.deployments = new DeploymentClient(rootHttp);\n }\n\n /**\n * Build a `SmartEngineClient` from a plain env object. Reads:\n * - `VALIDATOR_URL` (required) — gateway/validator base URL\n * - `VALIDATOR_API_KEY` (optional) — API key for authenticated calls\n * - `APP_TOKEN` (optional) — session JWT from prior auth\n * - `ALLOW_INSECURE` (optional, `'true'`) — only for local dev\n * - `REQUEST_TIMEOUT` (optional, ms)\n *\n * Throws if `VALIDATOR_URL` is missing or invalid. Designed for BaaS\n * scheduled functions: `const client = SmartEngineClient.fromEnv(ctx.env)`.\n */\n static fromEnv(env: Record<string, string | undefined>): SmartEngineClient {\n const baseUrl = env['VALIDATOR_URL'];\n if (!baseUrl) {\n throw new SmartEngineError('VALIDATOR_URL is required to build a SmartEngineClient', 500);\n }\n const timeoutRaw = env['REQUEST_TIMEOUT'];\n const timeout = timeoutRaw ? Number.parseInt(timeoutRaw, 10) : undefined;\n return new SmartEngineClient({\n baseUrl,\n apiKey: env['VALIDATOR_API_KEY'],\n authToken: env['APP_TOKEN'],\n allowInsecure: env['ALLOW_INSECURE'] === 'true',\n timeout: Number.isFinite(timeout) ? timeout : undefined,\n });\n }\n\n /**\n * Connect to the smart-engines network with auto-discovery and authentication\n *\n * This method:\n * 1. Discovers validators via HCS registry topic\n * 2. Selects a random validator with API endpoint\n * 3. Authenticates with Web3-style challenge-response\n * 4. Returns a configured client ready to use\n */\n static async connectToNetwork(config: NetworkConnectionConfig): Promise<NetworkConnectionResult> {\n const allowInsecure = config.allowInsecure ?? false;\n\n // Step 1: Discover validators\n const discovery = new ValidatorDiscoveryClient({\n network: config.network,\n registryTopicId: config.registryTopicId,\n mirrorNodeUrl: config.mirrorNodeUrl,\n });\n\n const validator = await discovery.getRandomValidator();\n\n if (!validator || !validator.networkEndpoints?.apiEndpoint) {\n throw new SmartEngineError(\n 'No validators available. Check registry topic and network configuration.',\n 503\n );\n }\n\n const validatorUrl = validator.networkEndpoints.apiEndpoint;\n validateClientUrl(validatorUrl, allowInsecure);\n\n // Step 2: Authenticate\n const auth = new ValidatorAuthClient({\n security: { allowInsecure },\n });\n const session = await auth.authenticateWithSigner(\n validatorUrl,\n config.chain,\n config.address,\n config.publicKey,\n config.signFn,\n config.metadata\n );\n\n // Step 3: Create client with auth token\n const client = new SmartEngineClient({\n baseUrl: validatorUrl,\n authToken: session.token,\n allowInsecure,\n });\n\n return { client, validator, session };\n }\n\n /**\n * Connect to the smart-engines network via the **service-registry**\n * (PR-1 of the cluster-discovery arc). Preferred over\n * {@link connectToNetwork} once the validator pods in the target network\n * have published their cluster endpoints — the SDK auto-balances across\n * the active cluster set and rides permissionless cluster join/leave\n * without code edits.\n *\n * Fallback ladder (per `docs/ops/HANDOFF-service-registry-distribution-layer.md` §6):\n * 1. HTTP fetch `/api/v3/discovery/clusters` from each bootstrap seed.\n * 2. (Optional) HCS trust-anchor membership cross-check.\n * 3. Random-pick over the verified set.\n *\n * @example\n * ```ts\n * const { client, cluster, session } = await SmartEngineClient.connectToCluster({\n * bootstrap: ['https://sn1.testnet.hsuite.network', 'https://sn2.testnet.hsuite.network'],\n * chain: 'xrpl',\n * address: '...',\n * publicKey: '...',\n * signFn: async (challenge) => sign(challenge),\n * });\n * ```\n */\n static async connectToCluster(config: ClusterConnectionConfig): Promise<ClusterConnectionResult> {\n const allowInsecure = config.allowInsecure ?? false;\n\n const discovery = new ClusterDiscoveryClient({\n bootstrap: config.bootstrap,\n allowInsecure,\n trustAnchor: config.trustAnchor\n ? {\n network: config.trustAnchor.network,\n registryTopicId: config.trustAnchor.registryTopicId,\n mirrorNodeUrl: config.trustAnchor.mirrorNodeUrl,\n allowInsecure,\n }\n : undefined,\n });\n\n const cluster = await discovery.getRandomCluster();\n if (!cluster) {\n throw new SmartEngineError(\n 'No active clusters available via bootstrap seeds. Check bootstrap URLs and network reachability.',\n 503,\n );\n }\n\n const gatewayUrl = cluster.endpoints.gatewayUrl;\n validateClientUrl(gatewayUrl, allowInsecure);\n\n const auth = new ValidatorAuthClient({ security: { allowInsecure } });\n const session = await auth.authenticateWithSigner(\n gatewayUrl,\n config.chain,\n config.address,\n config.publicKey,\n config.signFn,\n config.metadata,\n );\n\n const client = new SmartEngineClient({\n baseUrl: gatewayUrl,\n authToken: session.token,\n allowInsecure,\n });\n\n return { client, cluster, session };\n }\n\n /** Get the current validator URL */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /** Check if client has an auth token */\n isAuthenticated(): boolean {\n return !!(this.http as any).authToken;\n }\n\n /**\n * Get HTTP resilience health information\n * @returns Object with circuit breaker state and last error (if any)\n */\n getHttpHealth(): { breaker: CircuitBreakerSnapshot | null; lastError?: Error } {\n // Note: In a real implementation, we would get the circuit breaker state\n // from the resilient HTTP layer. For now, return null since the base\n // HTTP client doesn't expose it yet.\n return {\n breaker: null,\n lastError: this.lastHttpError,\n };\n }\n\n // ========== Health & Info ==========\n\n /** Get health status of the validator */\n async getHealth(): Promise<{ status: string; timestamp: string; chains: any[] }> {\n return this.http.get('/health');\n }\n\n /** Get list of supported chains */\n async getSupportedChains(): Promise<{ chains: string[] }> {\n return this.http.get('/chains');\n }\n\n // ========== Account Operations ==========\n\n /** Create a new account on the specified chain */\n async createAccount(request: CreateAccountRequest): Promise<CreateAccountResponse> {\n const validated = CreateAccountRequestSchema.parse(request);\n return this.http.post('/accounts', validated);\n }\n\n /** Get account information */\n async getAccountInfo(chain: string, accountId: string): Promise<AccountInfo> {\n return this.http.get(`/accounts/${encodePathParam(chain)}/${encodePathParam(accountId)}`);\n }\n\n /** Get account balance */\n async getBalance(chain: string, accountId: string): Promise<AccountBalance> {\n return this.http.get(`/accounts/${encodePathParam(chain)}/${encodePathParam(accountId)}/balance`);\n }\n\n // ========== Transaction Operations ==========\n\n /** Execute a transfer transaction */\n async transfer(request: TransferRequest): Promise<TransferResponse> {\n const validated = TransferRequestSchema.parse(request);\n return this.http.post('/transfer', validated);\n }\n\n /** Get transaction details */\n async getTransaction(chain: string, txId: string): Promise<Transaction> {\n return this.http.get(`/transactions/${encodePathParam(chain)}/${encodePathParam(txId)}`);\n }\n\n /** Get transaction receipt */\n async getTransactionReceipt(chain: string, txId: string): Promise<any> {\n return this.http.get(`/transactions/${encodePathParam(chain)}/${encodePathParam(txId)}/receipt`);\n }\n\n // ========== Token Operations ==========\n\n /** Create a new token */\n async createToken(request: CreateTokenRequest): Promise<CreateTokenResponse> {\n const validated = CreateTokenRequestSchema.parse(request);\n return this.http.post('/tokens', validated);\n }\n\n /** Mint tokens */\n async mintToken(request: MintTokenRequest): Promise<any> {\n const validated = MintTokenRequestSchema.parse(request);\n return this.http.post('/tokens/mint', validated);\n }\n\n /** Get token information */\n async getTokenInfo(chain: string, tokenId: string): Promise<TokenInfo> {\n return this.http.get(`/tokens/${encodePathParam(chain)}/${encodePathParam(tokenId)}`);\n }\n\n /** Burn tokens to reduce supply */\n async burnToken(request: BurnTokenRequest): Promise<ActionResult> {\n const validated = BurnTokenRequestSchema.parse(request);\n return this.http.post('/tokens/burn', validated);\n }\n\n /** Pause all token operations globally */\n async pauseToken(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n return this.http.post('/tokens/pause', validated);\n }\n\n /** Unpause token operations */\n async unpauseToken(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n return this.http.post('/tokens/unpause', validated);\n }\n\n /** Freeze/restrict an account from transacting the token */\n async restrictAccount(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for restrictAccount', 400);\n }\n return this.http.post('/tokens/restrict', validated);\n }\n\n /** Unfreeze an account */\n async unrestrictAccount(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for unrestrictAccount', 400);\n }\n return this.http.post('/tokens/unrestrict', validated);\n }\n\n /** Grant KYC/compliance approval to an account */\n async enableCompliance(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for enableCompliance', 400);\n }\n return this.http.post('/tokens/compliance/enable', validated);\n }\n\n /** Revoke KYC/compliance approval from an account */\n async disableCompliance(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for disableCompliance', 400);\n }\n return this.http.post('/tokens/compliance/disable', validated);\n }\n\n /** Force remove tokens from an account (compliance action) */\n async wipeFromAccount(request: TokenActionRequest): Promise<ActionResult> {\n const validated = TokenActionRequestSchema.parse(request);\n if (!validated.accountId) {\n throw new SmartEngineError('accountId is required for wipeFromAccount', 400);\n }\n if (!validated.amount) {\n throw new SmartEngineError('amount is required for wipeFromAccount', 400);\n }\n return this.http.post('/tokens/wipe', validated);\n }\n\n // ========== Capabilities Discovery ==========\n\n /** Get capability support matrix for all chains */\n async getAllCapabilities(): Promise<any> {\n return this.http.get('/capabilities');\n }\n\n /** Get capability support for a specific chain */\n async getChainCapabilities(chain: ChainType): Promise<any> {\n return this.http.get(`/capabilities/${encodePathParam(chain)}`);\n }\n\n /** Get comprehensive system status */\n async getSystemStatus(): Promise<any> {\n return this.http.get('/status');\n }\n\n // ========== Messaging Operations ==========\n\n /** Submit a message to consensus */\n async submitMessage(chain: string, topicId: string, message: string): Promise<any> {\n if (message.length > 1024 * 1024) {\n throw new SmartEngineError('Message too large (max 1MB)', 400);\n }\n return this.http.post(`/messages/${encodePathParam(chain)}/${encodePathParam(topicId)}`, {\n message,\n });\n }\n\n // ========== Cluster Operations ==========\n\n /** Get cluster health status */\n async getClusterHealth(): Promise<{\n status: string;\n nodes: number;\n healthy: number;\n unhealthy: number;\n }> {\n return this.http.get('/cluster/health');\n }\n\n /** Get cluster status including node details */\n async getClusterStatus(): Promise<{\n status: string;\n nodeId: string;\n nodes: Array<{\n nodeId: string;\n endpoint: string;\n status: string;\n lastSeen?: string;\n }>;\n quorum: {\n required: number;\n current: number;\n reached: boolean;\n };\n }> {\n return this.http.get('/cluster/status');\n }\n\n // ========== Metrics & Monitoring ==========\n\n /** Get Prometheus-format metrics */\n async getMetrics(): Promise<string> {\n return this.http.get('/metrics');\n }\n\n /** Get queue statistics for monitoring */\n async getQueueStats(): Promise<{\n queues: Record<\n string,\n { pending: number; processing: number; completed: number; failed: number }\n >;\n timestamp: string;\n }> {\n return this.http.get('/monitoring/queue');\n }\n\n /** Get circuit breaker status for all services */\n async getCircuitBreakerStatus(): Promise<{\n breakers: Record<\n string,\n {\n state: 'closed' | 'open' | 'half-open';\n failures: number;\n successes: number;\n lastFailure?: string;\n nextRetry?: string;\n }\n >;\n timestamp: string;\n }> {\n return this.http.get('/monitoring/circuit-breakers');\n }\n\n // ========== Signature Verification ==========\n\n /** Verify an arbitrary signature */\n async verifySignature(request: {\n chain: ChainType;\n message: string;\n signature: string;\n publicKey: string;\n }): Promise<{ valid: boolean; chain: ChainType }> {\n return this.http.post('/auth/verify-signature', request);\n }\n}\n\n/**\n * Custom error class for Smart Engine client\n */\nexport class SmartEngineError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public details?: any\n ) {\n super(message);\n this.name = 'SmartEngineError';\n }\n}\n\n/**\n * Validate URL and enforce security requirements\n */\nfunction validateClientUrl(url: string, allowInsecure = false): string {\n try {\n const parsed = new URL(url);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new SmartEngineError(`Invalid protocol: ${parsed.protocol}`, 400);\n }\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new SmartEngineError(\n 'HTTPS is required for secure connections. Set allowInsecure=true for local development.',\n 400\n );\n }\n return parsed.origin;\n } catch (error) {\n if (error instanceof SmartEngineError) throw error;\n throw new SmartEngineError(`Invalid URL: ${url}`, 400);\n }\n}\n","/**\n * Routing Sub-Client\n *\n * Manages host registration, routing configuration, and request proxying.\n */\nimport type { HttpClient } from '../../http';\nimport type {\n RegisterHostRequest,\n HostInfo,\n HostListResponse,\n RoutingConfig,\n ProxyRequest,\n ProxyResponse,\n RoutingStatsResponse,\n} from '../types';\n\n/**\n * Routing Sub-Client\n *\n * @example\n * ```typescript\n * // Register a host\n * await gateway.routing.registerHost({ name: 'Host 1', endpoint: 'https://host1.example.com' });\n *\n * // Get routing stats\n * const stats = await gateway.routing.getStats();\n * ```\n */\nexport class RoutingClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Register a new host */\n async registerHost(request: RegisterHostRequest): Promise<HostInfo> {\n return this.http.post('/routing/hosts', request);\n }\n\n /** Unregister a host */\n async unregisterHost(hostId: string): Promise<{ success: boolean }> {\n return this.http.delete(`/routing/hosts/${encodeURIComponent(hostId)}`);\n }\n\n /** Get all registered hosts */\n async getAllHosts(): Promise<HostListResponse> {\n return this.http.get('/routing/hosts');\n }\n\n /** Get only verified hosts */\n async getVerifiedHosts(): Promise<HostListResponse> {\n return this.http.get('/routing/hosts/verified');\n }\n\n /** Get a specific host by ID */\n async getHost(hostId: string): Promise<HostInfo> {\n return this.http.get(`/routing/hosts/${encodeURIComponent(hostId)}`);\n }\n\n /** Verify a host */\n async verifyHost(hostId: string): Promise<{ verified: boolean; message: string }> {\n return this.http.post(`/routing/hosts/${encodeURIComponent(hostId)}/verify`, {});\n }\n\n /** Set routing configuration for an app */\n async setRoutingConfig(appId: string, config: RoutingConfig): Promise<RoutingConfig> {\n return this.http.put(`/routing/config/${encodeURIComponent(appId)}`, config);\n }\n\n /** Get routing configuration for an app */\n async getRoutingConfig(appId: string): Promise<RoutingConfig> {\n return this.http.get(`/routing/config/${encodeURIComponent(appId)}`);\n }\n\n /** Proxy a request through the gateway */\n async proxyRequest(request: ProxyRequest): Promise<ProxyResponse> {\n return this.http.post('/routing/proxy', request);\n }\n\n /** Get routing statistics */\n async getStats(): Promise<RoutingStatsResponse> {\n return this.http.get('/routing/stats');\n }\n\n /** Map a domain to an application */\n async mapDomainToApp(\n domain: string,\n appId: string\n ): Promise<{ success: boolean; domain: string; appId: string }> {\n return this.http.post(`/routing/domains/${encodeURIComponent(domain)}/map`, { appId });\n }\n}\n","/**\n * Domains Sub-Client\n *\n * Manages domain registration, verification, DNS configuration, and transfers.\n */\nimport type { HttpClient } from '../../http';\nimport type {\n DomainRegistrationRequest,\n DomainInfo,\n DomainListResponse,\n DomainAvailabilityResponse,\n VerificationTokenResponse,\n VerificationResult,\n DnsRecord,\n DomainTransferRequest,\n} from '../types';\n\n/**\n * Domains Sub-Client\n *\n * @example\n * ```typescript\n * // Register a domain\n * const domain = await gateway.domains.register({ domain: 'myapp.example.com', owner: '0.0.123' });\n *\n * // Verify ownership\n * const token = await gateway.domains.generateVerificationToken('myapp.example.com', 'dns');\n * const result = await gateway.domains.verifyOwnership('myapp.example.com', token.token);\n * ```\n */\nexport class DomainsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Register a new domain */\n async register(request: DomainRegistrationRequest): Promise<DomainInfo> {\n return this.http.post('/domains', request);\n }\n\n /** Check domain availability */\n async checkAvailability(domain: string): Promise<DomainAvailabilityResponse> {\n return this.http.get(`/domains/check/${encodeURIComponent(domain)}`);\n }\n\n /** Get domain information */\n async getInfo(domain: string): Promise<DomainInfo> {\n return this.http.get(`/domains/${encodeURIComponent(domain)}`);\n }\n\n /** List domains, optionally filtered by owner */\n async list(owner?: string): Promise<DomainListResponse> {\n const params = owner ? `?owner=${encodeURIComponent(owner)}` : '';\n return this.http.get(`/domains${params}`);\n }\n\n /** Generate a verification token */\n async generateVerificationToken(\n domain: string,\n method: 'dns' | 'http' | 'email'\n ): Promise<VerificationTokenResponse> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/verification`, { method });\n }\n\n /** Verify domain ownership */\n async verifyOwnership(domain: string, token: string): Promise<VerificationResult> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/verify`, { token });\n }\n\n /** Configure DNS records for a domain */\n async configureDns(domain: string, records: DnsRecord[]): Promise<{ success: boolean; records: DnsRecord[] }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/dns`, { records });\n }\n\n /** Enable DNSSEC for a domain */\n async enableDnssec(domain: string): Promise<{ success: boolean; message: string }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/dnssec/enable`, {});\n }\n\n /** Disable DNSSEC for a domain */\n async disableDnssec(domain: string): Promise<{ success: boolean; message: string }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/dnssec/disable`, {});\n }\n\n /** Renew a domain */\n async renew(domain: string, years?: number): Promise<DomainInfo> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/renew`, { years: years ?? 1 });\n }\n\n /** Initiate a domain transfer */\n async transfer(domain: string, request: DomainTransferRequest): Promise<{ success: boolean; message: string }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/transfer`, request);\n }\n\n /** Approve a pending domain transfer */\n async approveTransfer(domain: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/transfer/approve`, {});\n }\n\n /** Reject a pending domain transfer */\n async rejectTransfer(domain: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/transfer/reject`, {});\n }\n\n /** Suspend a domain */\n async suspend(domain: string, reason: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/suspend`, { reason });\n }\n\n /** Unsuspend a domain */\n async unsuspend(domain: string): Promise<{ success: boolean }> {\n return this.http.post(`/domains/${encodeURIComponent(domain)}/unsuspend`, {});\n }\n}\n","/**\n * DNS Sub-Client\n *\n * Manages DNS resolution, zone management, and DNSSEC.\n */\nimport type { HttpClient } from '../../http';\nimport type {\n DnsResolveResponse,\n DnsBatchQuery,\n DnsBatchResolveResponse,\n DnsZone,\n DnsZoneListResponse,\n DnsRecord,\n DnsRecordInfo,\n DnssecKey,\n DnssecDsRecord,\n} from '../types';\n\n/**\n * DNS Sub-Client\n *\n * @example\n * ```typescript\n * // Resolve a name\n * const result = await gateway.dns.resolve('myapp.example.com', 'A');\n *\n * // Manage zones\n * const zones = await gateway.dns.listZones();\n * ```\n */\nexport class DnsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Resolve a DNS name */\n async resolve(name: string, type?: string, dnssec?: boolean): Promise<DnsResolveResponse> {\n const params = new URLSearchParams({ name });\n if (type) params.set('type', type);\n if (dnssec !== undefined) params.set('dnssec', String(dnssec));\n return this.http.get(`/dns/resolve?${params.toString()}`);\n }\n\n /** Batch resolve multiple DNS queries */\n async resolveBatch(queries: DnsBatchQuery[]): Promise<DnsBatchResolveResponse> {\n return this.http.post('/dns/resolve/batch', { queries });\n }\n\n /** List all DNS zones */\n async listZones(): Promise<DnsZoneListResponse> {\n return this.http.get('/dns/zones');\n }\n\n /** Get a specific zone */\n async getZone(zoneName: string): Promise<DnsZone & { records: DnsRecordInfo[] }> {\n return this.http.get(`/dns/zones/${encodeURIComponent(zoneName)}`);\n }\n\n /** Create a new DNS zone */\n async createZone(request: { zoneName: string; description?: string }): Promise<DnsZone> {\n return this.http.post('/dns/zones', request);\n }\n\n /** Delete a DNS zone */\n async deleteZone(zoneName: string): Promise<{ success: boolean }> {\n return this.http.delete(`/dns/zones/${encodeURIComponent(zoneName)}`);\n }\n\n /** Add a record to a zone */\n async addRecord(zoneName: string, record: DnsRecord): Promise<DnsRecordInfo> {\n return this.http.post(`/dns/zones/${encodeURIComponent(zoneName)}/records`, record);\n }\n\n /** Update a record in a zone */\n async updateRecord(\n zoneName: string,\n recordId: string,\n updates: Partial<DnsRecord>\n ): Promise<DnsRecordInfo> {\n return this.http.put(\n `/dns/zones/${encodeURIComponent(zoneName)}/records/${encodeURIComponent(recordId)}`,\n updates\n );\n }\n\n /** Delete a record from a zone */\n async deleteRecord(zoneName: string, recordId: string): Promise<{ success: boolean }> {\n return this.http.delete(\n `/dns/zones/${encodeURIComponent(zoneName)}/records/${encodeURIComponent(recordId)}`\n );\n }\n\n /** Generate DNSSEC keys for a zone */\n async generateDnssecKeys(\n zoneName: string,\n algorithm?: string\n ): Promise<{ keys: DnssecKey[] }> {\n return this.http.post(`/dns/zones/${encodeURIComponent(zoneName)}/dnssec/keys`, {\n algorithm,\n });\n }\n\n /** Get DNSSEC keys for a zone */\n async getDnssecKeys(zoneName: string): Promise<{ keys: DnssecKey[] }> {\n return this.http.get(`/dns/zones/${encodeURIComponent(zoneName)}/dnssec/keys`);\n }\n\n /** Get DS record for a zone (for registrar configuration) */\n async getDsRecord(zoneName: string): Promise<DnssecDsRecord> {\n return this.http.get(`/dns/zones/${encodeURIComponent(zoneName)}/dnssec/ds`);\n }\n\n /** Clear DNS cache */\n async clearCache(): Promise<{ success: boolean; entriesCleared: number }> {\n return this.http.post('/dns/cache/clear', {});\n }\n}\n","/**\n * Smart Gateway Client\n *\n * Top-level client for interacting with Smart Engines Gateway.\n * Manages host routing, domain registration, and DNS resolution.\n *\n * @example\n * ```typescript\n * import { SmartGatewayClient } from '@hsuite/smart-engines-sdk';\n *\n * const gateway = new SmartGatewayClient({\n * baseUrl: 'https://gateway.smartengines.io',\n * apiKey: 'your-api-key',\n * });\n *\n * // Routing\n * const hosts = await gateway.routing.getAllHosts();\n *\n * // Domains\n * const available = await gateway.domains.checkAvailability('myapp.example.com');\n *\n * // DNS\n * const resolved = await gateway.dns.resolve('myapp.example.com', 'A');\n *\n * // Health\n * const health = await gateway.getHealth();\n * ```\n */\nimport { createHttpClient, type HttpClient } from '../http';\nimport { RoutingClient } from './routing';\nimport { DomainsClient } from './domains';\nimport { DnsClient } from './dns';\nimport type {\n GatewayHealthResponse,\n GatewayStatusResponse,\n GatewayReadinessResponse,\n GatewayLivenessResponse,\n GatewayMetricsResponse,\n GatewayMetricsSummaryResponse,\n} from './types';\n\n/**\n * Configuration for SmartGatewayClient\n */\nexport type SmartGatewayClientConfig = {\n /** Gateway API base URL */\n baseUrl: string;\n /** API key for authenticated requests */\n apiKey?: string;\n /** Bearer token from authentication */\n authToken?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Allow HTTP connections (only for local development) */\n allowInsecure?: boolean;\n};\n\n/**\n * Smart Gateway Client\n *\n * Primary client for gateway operations: routing, domains, and DNS.\n */\nexport class SmartGatewayClient {\n private readonly http: HttpClient;\n\n /** Host routing and proxy management */\n public readonly routing: RoutingClient;\n /** Domain registration and management */\n public readonly domains: DomainsClient;\n /** DNS resolution and zone management */\n public readonly dns: DnsClient;\n\n constructor(config: SmartGatewayClientConfig) {\n const baseUrl = config.baseUrl.replace(/\\/+$/, '');\n\n this.http = createHttpClient({\n baseUrl: `${baseUrl}/api/v3`,\n apiKey: config.apiKey,\n authToken: config.authToken,\n timeout: config.timeout,\n });\n\n this.routing = new RoutingClient(this.http);\n this.domains = new DomainsClient(this.http);\n this.dns = new DnsClient(this.http);\n }\n\n // ========== Health & Metrics ==========\n\n /** Get gateway health status */\n async getHealth(): Promise<GatewayHealthResponse> {\n return this.http.get('/health');\n }\n\n /** Get gateway status with host and domain counts */\n async getStatus(): Promise<GatewayStatusResponse> {\n return this.http.get('/status');\n }\n\n /** Check gateway readiness */\n async getReadiness(): Promise<GatewayReadinessResponse> {\n return this.http.get('/ready');\n }\n\n /** Check gateway liveness */\n async getLiveness(): Promise<GatewayLivenessResponse> {\n return this.http.get('/live');\n }\n\n /** Get detailed gateway metrics */\n async getMetrics(refresh?: boolean): Promise<GatewayMetricsResponse> {\n const params = refresh ? '?refresh=true' : '';\n return this.http.get(`/metrics${params}`);\n }\n\n /** Get metrics summary */\n async getMetricsSummary(): Promise<GatewayMetricsSummaryResponse> {\n return this.http.get('/metrics/summary');\n }\n}\n","/**\n * Resilient HTTP Transport\n *\n * Wraps fetch with production-grade resilience features:\n * - Configurable timeout with AbortController\n * - Exponential backoff retry on idempotent methods (GET/HEAD)\n * - Automatic retry on 429/503 status codes with Retry-After header support\n * - Optional circuit breaker to fail fast on cascading failures\n * - Request/response logging hooks\n *\n * This layer sits between the HTTP client and raw fetch, providing\n * a simple `resilientFetch(url, init, config?)` signature that returns Response.\n */\n\nimport { CircuitBreaker, type CircuitBreakerConfig, type CircuitBreakerSnapshot } from '../_vendor';\n\n/**\n * Retry configuration for resilient fetch\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries: number;\n /** Initial delay in milliseconds (default: 1000) */\n initialDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Backoff multiplier (default: 2 for exponential) */\n backoffMultiplier: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitterFactor?: number;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n jitterFactor: 0.1,\n};\n\n/**\n * HTTP resilience configuration\n */\nexport interface ResilientHttpConfig {\n /** Request timeout in milliseconds (default: 30000) */\n timeoutMs?: number;\n /** Retry configuration (default: DEFAULT_RETRY_CONFIG) */\n retry?: Partial<RetryConfig>;\n /** Circuit breaker configuration (default: enabled with sensible defaults) */\n circuitBreaker?: Partial<CircuitBreakerConfig> | false;\n /** Optional callback when a retry is triggered */\n onRetry?: (attempt: number, delay: number, status?: number) => void;\n /** Optional callback on circuit breaker state changes */\n onCircuitBreakerStateChange?: (state: 'closed' | 'open' | 'half_open') => void;\n}\n\n/**\n * Helper to calculate backoff delay with jitter\n */\nfunction calculateBackoffDelay(attempt: number, config: RetryConfig): number {\n const exponentialDelay = config.initialDelayMs * Math.pow(config.backoffMultiplier, attempt);\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);\n\n if (config.jitterFactor && config.jitterFactor > 0) {\n const jitter = cappedDelay * config.jitterFactor * Math.random();\n return Math.floor(cappedDelay + jitter);\n }\n\n return Math.floor(cappedDelay);\n}\n\n/**\n * Helper to parse Retry-After header (seconds or HTTP-date)\n */\nfunction parseRetryAfter(retryAfter: string | null): number {\n if (!retryAfter) return 0;\n\n // Try parsing as seconds\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n return seconds * 1000;\n }\n\n // Try parsing as HTTP-date\n const date = new Date(retryAfter);\n if (!isNaN(date.getTime())) {\n return Math.max(0, date.getTime() - Date.now());\n }\n\n return 0;\n}\n\n/**\n * Helper to sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Check if a request method is idempotent (safe to retry)\n */\nfunction isIdempotent(method?: string): boolean {\n const m = (method || 'GET').toUpperCase();\n return m === 'GET' || m === 'HEAD' || m === 'OPTIONS';\n}\n\n/**\n * Resilient fetch wrapper with retry, timeout, and circuit breaker\n *\n * @param url - Target URL\n * @param init - Fetch options (method, headers, body, etc.)\n * @param config - Resilience configuration\n * @returns Response object (same as native fetch)\n * @throws Error if request fails after all retries or circuit breaker is open\n */\nexport async function resilientFetch(\n url: string,\n init?: RequestInit,\n config?: ResilientHttpConfig\n): Promise<Response> {\n const timeoutMs = config?.timeoutMs ?? 30000;\n const retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config?.retry };\n const method = (init?.method || 'GET').toUpperCase();\n\n // Initialize circuit breaker if not explicitly disabled\n const shouldUseCircuitBreaker = config?.circuitBreaker !== false;\n const breaker = shouldUseCircuitBreaker\n ? new CircuitBreaker({\n failureThreshold: 5,\n rollingWindowMs: 60000,\n cooldownMs: 30000,\n name: `http-${method}`,\n ...((config?.circuitBreaker as Partial<CircuitBreakerConfig>) || {}),\n })\n : null;\n\n // Retry loop\n let lastError: Error | undefined;\n let lastStatus: number | undefined;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n // Check circuit breaker before executing\n if (breaker) {\n if (!breaker.canExecute()) {\n const state = breaker.getState();\n if (config?.onCircuitBreakerStateChange) {\n config.onCircuitBreakerStateChange(state);\n }\n const snapshot = breaker.snapshot();\n throw new Error(\n `Circuit breaker is ${state}. Next probe at ${new Date(snapshot.nextProbeAt || 0).toISOString()}`\n );\n }\n }\n\n // Execute fetch with timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n\n // Check for retryable status codes\n if ((response.status === 429 || response.status === 503) && isIdempotent(method)) {\n // Only retry if we haven't exhausted retries\n if (attempt < retryConfig.maxRetries) {\n // Parse Retry-After header\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\n const delay = retryAfterMs > 0 ? retryAfterMs : calculateBackoffDelay(attempt, retryConfig);\n\n lastStatus = response.status;\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, response.status);\n }\n\n // Create an error for circuit breaker tracking\n const statusError = new Error(`HTTP ${response.status}`);\n if (breaker) {\n try {\n await breaker.execute(async () => {\n await sleep(delay);\n throw statusError;\n });\n } catch {\n // Expected to fail — this just records the failure\n }\n } else {\n await sleep(delay);\n }\n continue;\n }\n }\n\n // Success — circuit breaker will record this as success via execute()\n // Return the response as-is (even if it's a 429/503 on final attempt)\n return response;\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n if (attempt >= retryConfig.maxRetries) {\n break;\n }\n\n // Only retry idempotent methods (GET, HEAD, OPTIONS)\n if (!isIdempotent(method)) {\n break;\n }\n\n // Calculate delay and retry\n const delay = calculateBackoffDelay(attempt, retryConfig);\n\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, lastStatus);\n }\n\n await sleep(delay);\n }\n }\n\n // Exhausted retries\n if (lastError) {\n throw lastError;\n }\n\n // Should not reach here, but throw a generic error if we do\n throw new Error(`Failed to fetch ${url} after ${retryConfig.maxRetries} retries`);\n}\n\n/**\n * Create a resilient fetch instance with its own circuit breaker\n * Useful when you need to track breaker state across multiple requests\n */\nexport function createResilientFetchWithBreaker(config?: ResilientHttpConfig): {\n fetch: (url: string, init?: RequestInit) => Promise<Response>;\n getCircuitBreakerSnapshot: () => CircuitBreakerSnapshot | null;\n} {\n const shouldUseCircuitBreaker = config?.circuitBreaker !== false;\n const breaker = shouldUseCircuitBreaker\n ? new CircuitBreaker({\n failureThreshold: 5,\n rollingWindowMs: 60000,\n cooldownMs: 30000,\n name: 'http-breaker',\n ...((config?.circuitBreaker as Partial<CircuitBreakerConfig>) || {}),\n })\n : null;\n\n // Create a bound fetch that uses the shared breaker\n const boundFetch = async (url: string, init?: RequestInit): Promise<Response> => {\n const timeoutMs = config?.timeoutMs ?? 30000;\n const retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config?.retry };\n const method = (init?.method || 'GET').toUpperCase();\n\n let lastError: Error | undefined;\n let lastStatus: number | undefined;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n // Use circuit breaker's execute() to automatically track success/failure\n if (breaker) {\n const response = await breaker.execute(async () => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const resp = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n return resp;\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n });\n\n // Check for retryable status codes\n if ((response.status === 429 || response.status === 503) && isIdempotent(method)) {\n if (attempt < retryConfig.maxRetries) {\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\n const delay = retryAfterMs > 0 ? retryAfterMs : calculateBackoffDelay(attempt, retryConfig);\n\n lastStatus = response.status;\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, response.status);\n }\n\n await sleep(delay);\n continue;\n }\n }\n\n return response;\n } else {\n // No breaker — just do a direct fetch with timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n\n // Check for retryable status codes\n if ((response.status === 429 || response.status === 503) && isIdempotent(method)) {\n if (attempt < retryConfig.maxRetries) {\n const retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));\n const delay = retryAfterMs > 0 ? retryAfterMs : calculateBackoffDelay(attempt, retryConfig);\n\n lastStatus = response.status;\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, response.status);\n }\n\n await sleep(delay);\n continue;\n }\n }\n\n return response;\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n }\n } catch (error) {\n lastError = error as Error;\n\n if (attempt >= retryConfig.maxRetries) {\n break;\n }\n\n if (!isIdempotent(method)) {\n break;\n }\n\n const delay = calculateBackoffDelay(attempt, retryConfig);\n\n if (config?.onRetry) {\n config.onRetry(attempt + 1, delay, lastStatus);\n }\n\n await sleep(delay);\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n throw new Error(`Failed to fetch ${url} after ${retryConfig.maxRetries} retries`);\n };\n\n return {\n fetch: boundFetch,\n getCircuitBreakerSnapshot: () => (breaker ? breaker.snapshot() : null),\n };\n}\n","/**\n * Chain-specific helper functions\n */\n\nexport * as hedera from './hedera';\nexport * as xrpl from './xrpl';\nexport * as polkadot from './polkadot';\nexport * as solana from './solana';\nexport * as stellar from './stellar';\nexport * as bitcoin from './bitcoin';\n","/**\n * Hedera-specific helper functions\n */\n\n/**\n * Format Hedera account ID (0.0.xxxxx)\n */\nexport function formatHederaAccountId(id: string): string {\n // Validate format\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(id)) {\n throw new Error(`Invalid Hedera account ID format: ${id}`);\n }\n return id;\n}\n\n/**\n * Parse HBAR amount from string\n */\nexport function parseHbar(amount: string): number {\n const num = parseFloat(amount);\n if (isNaN(num) || num < 0) {\n throw new Error(`Invalid HBAR amount: ${amount}`);\n }\n return num;\n}\n\n/**\n * Convert HBAR to tinybars (1 HBAR = 100,000,000 tinybars)\n */\nexport function hbarToTinybars(hbar: string | number): string {\n const amount = typeof hbar === 'string' ? parseFloat(hbar) : hbar;\n return (amount * 100_000_000).toFixed(0);\n}\n\n/**\n * Convert tinybars to HBAR\n */\nexport function tinybarsToHbar(tinybars: string | number): string {\n const amount = typeof tinybars === 'string' ? parseInt(tinybars, 10) : tinybars;\n return (amount / 100_000_000).toString();\n}\n\n/**\n * Format Hedera token ID (0.0.xxxxx)\n */\nexport function formatHederaTokenId(id: string): string {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(id)) {\n throw new Error(`Invalid Hedera token ID format: ${id}`);\n }\n return id;\n}\n\n/**\n * Format Hedera topic ID (0.0.xxxxx)\n */\nexport function formatHederaTopicId(id: string): string {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(id)) {\n throw new Error(`Invalid Hedera topic ID format: ${id}`);\n }\n return id;\n}\n","/**\n * XRPL-specific helper functions\n */\n\n/**\n * Validate XRPL address format\n */\nexport function validateXRPLAddress(address: string): boolean {\n return /^r[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address);\n}\n\n/**\n * Format XRPL address\n */\nexport function formatXRPLAddress(address: string): string {\n if (!validateXRPLAddress(address)) {\n throw new Error(`Invalid XRPL address format: ${address}`);\n }\n return address;\n}\n\n/**\n * Convert XRP to drops (1 XRP = 1,000,000 drops)\n */\nexport function xrpToDrops(xrp: string | number): string {\n const amount = typeof xrp === 'string' ? parseFloat(xrp) : xrp;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid XRP amount: ${xrp}`);\n }\n return (amount * 1_000_000).toFixed(0);\n}\n\n/**\n * Convert drops to XRP\n */\nexport function dropsToXrp(drops: string | number): string {\n const amount = typeof drops === 'string' ? parseInt(drops, 10) : drops;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid drops amount: ${drops}`);\n }\n return (amount / 1_000_000).toString();\n}\n\n/**\n * Parse XRP amount from string\n */\nexport function parseXRP(amount: string): number {\n const num = parseFloat(amount);\n if (isNaN(num) || num < 0) {\n throw new Error(`Invalid XRP amount: ${amount}`);\n }\n return num;\n}\n\n/**\n * Validate XRPL currency code\n */\nexport function validateCurrencyCode(code: string): boolean {\n // Standard 3-character currency code or 40-character hex\n return /^[A-Z]{3}$/.test(code) || /^[0-9A-F]{40}$/i.test(code);\n}\n","/**\n * Polkadot Chain Helpers\n *\n * Utility functions for working with Polkadot/Substrate chains.\n */\n\n/**\n * Planck per DOT (10^10)\n */\nconst PLANCK_PER_DOT = 10_000_000_000n;\n\n/**\n * Validate a Polkadot SS58 address format.\n *\n * @param address - The address to validate\n * @returns True if the address appears to be a valid SS58 format\n *\n * @example\n * ```typescript\n * validatePolkadotAddress('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg');\n * // true\n * ```\n */\nexport function validatePolkadotAddress(address: string): boolean {\n if (!address || typeof address !== 'string') {\n return false;\n }\n\n // Basic SS58 format check\n // - Starts with 1-9 or a-z (case insensitive)\n // - Contains only alphanumeric characters (base58)\n // - Length is typically 47-48 characters for Polkadot\n const ss58Regex = /^[1-9A-HJ-NP-Za-km-z]{47,48}$/;\n\n return ss58Regex.test(address);\n}\n\n/**\n * Format a Polkadot address (truncate for display).\n *\n * @param address - Full SS58 address\n * @param prefixLength - Number of characters to show at start (default 6)\n * @param suffixLength - Number of characters to show at end (default 6)\n * @returns Truncated address like \"1FRMM8...V24fg\"\n *\n * @example\n * ```typescript\n * formatPolkadotAddress('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg');\n * // '1FRMM8...V24fg'\n * ```\n */\nexport function formatPolkadotAddress(address: string, prefixLength = 6, suffixLength = 5): string {\n if (!address || address.length <= prefixLength + suffixLength) {\n return address;\n }\n\n return `${address.slice(0, prefixLength)}...${address.slice(-suffixLength)}`;\n}\n\n/**\n * Convert DOT to Planck (smallest unit).\n *\n * @param dot - Amount in DOT\n * @returns Amount in Planck (bigint)\n *\n * @example\n * ```typescript\n * dotToPlanck(1.5);\n * // 15000000000n (15 billion planck)\n * ```\n */\nexport function dotToPlanck(dot: number): bigint {\n if (dot < 0) {\n throw new Error('DOT amount cannot be negative');\n }\n\n // Handle decimal precision\n const [whole, decimal = ''] = dot.toString().split('.');\n const paddedDecimal = decimal.padEnd(10, '0').slice(0, 10);\n\n return BigInt(whole) * PLANCK_PER_DOT + BigInt(paddedDecimal);\n}\n\n/**\n * Convert Planck to DOT.\n *\n * @param planck - Amount in Planck\n * @returns Amount in DOT as a number\n *\n * @example\n * ```typescript\n * planckToDot(15000000000n);\n * // 1.5\n * ```\n */\nexport function planckToDot(planck: bigint): number {\n if (planck < 0n) {\n throw new Error('Planck amount cannot be negative');\n }\n\n const whole = planck / PLANCK_PER_DOT;\n const remainder = planck % PLANCK_PER_DOT;\n\n // Convert to number with decimal\n return Number(whole) + Number(remainder) / Number(PLANCK_PER_DOT);\n}\n\n/**\n * Format Planck amount as DOT string with specified decimals.\n *\n * @param planck - Amount in Planck\n * @param decimals - Number of decimal places to show (default 4)\n * @returns Formatted DOT string\n *\n * @example\n * ```typescript\n * formatDot(15000000000n, 2);\n * // '1.50 DOT'\n * ```\n */\nexport function formatDot(planck: bigint, decimals = 4): string {\n const dot = planckToDot(planck);\n return `${dot.toFixed(decimals)} DOT`;\n}\n\n/**\n * Parse a DOT amount string to Planck.\n *\n * @param dotString - Amount as string (e.g., \"1.5\" or \"1.5 DOT\")\n * @returns Amount in Planck\n *\n * @example\n * ```typescript\n * parseDotString('1.5 DOT');\n * // 15000000000n\n * ```\n */\nexport function parseDotString(dotString: string): bigint {\n // Remove 'DOT' suffix and whitespace\n const cleaned = dotString.replace(/\\s*DOT\\s*$/i, '').trim();\n const dot = parseFloat(cleaned);\n\n if (isNaN(dot)) {\n throw new Error(`Invalid DOT amount: ${dotString}`);\n }\n\n return dotToPlanck(dot);\n}\n","/**\n * Solana Chain Helpers\n *\n * Utility functions for working with Solana.\n */\n\n/**\n * Lamports per SOL (10^9)\n */\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\n\n/**\n * Base58 characters used in Solana addresses\n */\nconst BASE58_CHARS = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Validate a Solana public key / address.\n *\n * Solana addresses are base58-encoded 32-byte public keys,\n * resulting in 32-44 character strings.\n *\n * @param publicKey - The public key to validate\n * @returns True if the public key appears to be valid\n *\n * @example\n * ```typescript\n * validateSolanaPublicKey('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');\n * // true\n * ```\n */\nexport function validateSolanaPublicKey(publicKey: string): boolean {\n if (!publicKey || typeof publicKey !== 'string') {\n return false;\n }\n\n // Solana public keys are 32-44 characters in base58\n if (publicKey.length < 32 || publicKey.length > 44) {\n return false;\n }\n\n // Check that all characters are valid base58\n for (const char of publicKey) {\n if (!BASE58_CHARS.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Format a Solana address (truncate for display).\n *\n * @param address - Full Solana address\n * @param prefixLength - Number of characters to show at start (default 4)\n * @param suffixLength - Number of characters to show at end (default 4)\n * @returns Truncated address like \"9WzD...AWWM\"\n *\n * @example\n * ```typescript\n * formatSolanaAddress('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');\n * // '9WzD...AWWM'\n * ```\n */\nexport function formatSolanaAddress(address: string, prefixLength = 4, suffixLength = 4): string {\n if (!address || address.length <= prefixLength + suffixLength) {\n return address;\n }\n\n return `${address.slice(0, prefixLength)}...${address.slice(-suffixLength)}`;\n}\n\n/**\n * Convert SOL to Lamports (smallest unit).\n *\n * @param sol - Amount in SOL\n * @returns Amount in Lamports (bigint)\n *\n * @example\n * ```typescript\n * solToLamports(1.5);\n * // 1500000000n (1.5 billion lamports)\n * ```\n */\nexport function solToLamports(sol: number): bigint {\n if (sol < 0) {\n throw new Error('SOL amount cannot be negative');\n }\n\n // Handle decimal precision (9 decimals for SOL)\n const [whole, decimal = ''] = sol.toString().split('.');\n const paddedDecimal = decimal.padEnd(9, '0').slice(0, 9);\n\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedDecimal);\n}\n\n/**\n * Convert Lamports to SOL.\n *\n * @param lamports - Amount in Lamports\n * @returns Amount in SOL as a number\n *\n * @example\n * ```typescript\n * lamportsToSol(1500000000n);\n * // 1.5\n * ```\n */\nexport function lamportsToSol(lamports: bigint): number {\n if (lamports < 0n) {\n throw new Error('Lamports amount cannot be negative');\n }\n\n const whole = lamports / LAMPORTS_PER_SOL;\n const remainder = lamports % LAMPORTS_PER_SOL;\n\n // Convert to number with decimal\n return Number(whole) + Number(remainder) / Number(LAMPORTS_PER_SOL);\n}\n\n/**\n * Format Lamports amount as SOL string with specified decimals.\n *\n * @param lamports - Amount in Lamports\n * @param decimals - Number of decimal places to show (default 4)\n * @returns Formatted SOL string\n *\n * @example\n * ```typescript\n * formatSol(1500000000n, 2);\n * // '1.50 SOL'\n * ```\n */\nexport function formatSol(lamports: bigint, decimals = 4): string {\n const sol = lamportsToSol(lamports);\n return `${sol.toFixed(decimals)} SOL`;\n}\n\n/**\n * Parse a SOL amount string to Lamports.\n *\n * @param solString - Amount as string (e.g., \"1.5\" or \"1.5 SOL\")\n * @returns Amount in Lamports\n *\n * @example\n * ```typescript\n * parseSolString('1.5 SOL');\n * // 1500000000n\n * ```\n */\nexport function parseSolString(solString: string): bigint {\n // Remove 'SOL' suffix and whitespace\n const cleaned = solString.replace(/\\s*SOL\\s*$/i, '').trim();\n const sol = parseFloat(cleaned);\n\n if (isNaN(sol)) {\n throw new Error(`Invalid SOL amount: ${solString}`);\n }\n\n return solToLamports(sol);\n}\n\n/**\n * Check if a string looks like a Solana transaction signature.\n *\n * Solana transaction signatures are 88 characters in base58.\n *\n * @param signature - The signature to validate\n * @returns True if it appears to be a valid transaction signature\n *\n * @example\n * ```typescript\n * isTransactionSignature('5UfDuX7yXY...');\n * // true\n * ```\n */\nexport function isTransactionSignature(signature: string): boolean {\n if (!signature || typeof signature !== 'string') {\n return false;\n }\n\n // Transaction signatures are typically 87-88 characters\n if (signature.length < 87 || signature.length > 88) {\n return false;\n }\n\n // Check that all characters are valid base58\n for (const char of signature) {\n if (!BASE58_CHARS.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Stellar-specific helper functions\n */\n\n/**\n * Validate Stellar address format (G... public key, 56 characters, base32)\n */\nexport function validateStellarAddress(address: string): boolean {\n if (!address || address.length !== 56 || !address.startsWith('G')) {\n return false;\n }\n // Stellar public keys are base32 encoded (uppercase A-Z, 2-7)\n return /^G[A-Z2-7]{55}$/.test(address);\n}\n\n/**\n * Convert stroops to XLM (1 XLM = 10,000,000 stroops)\n */\nexport function stroopsToXlm(stroops: string | number): string {\n const amount = typeof stroops === 'string' ? parseInt(stroops, 10) : stroops;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid stroops amount: ${stroops}`);\n }\n return (amount / 10_000_000).toString();\n}\n\n/**\n * Convert XLM to stroops (1 XLM = 10,000,000 stroops)\n */\nexport function xlmToStroops(xlm: string | number): string {\n const amount = typeof xlm === 'string' ? parseFloat(xlm) : xlm;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid XLM amount: ${xlm}`);\n }\n return (amount * 10_000_000).toFixed(0);\n}\n","/**\n * Bitcoin-specific helper functions\n */\n\n/**\n * Validate Bitcoin address format.\n * Supports P2PKH (1...), P2SH (3...), and Bech32 (bc1...) addresses.\n */\nexport function validateBitcoinAddress(address: string): boolean {\n if (!address) return false;\n\n // P2PKH addresses: start with '1', 25-34 characters, base58\n const p2pkh = /^1[1-9A-HJ-NP-Za-km-z]{24,33}$/;\n\n // P2SH addresses: start with '3', 25-34 characters, base58\n const p2sh = /^3[1-9A-HJ-NP-Za-km-z]{24,33}$/;\n\n // Bech32 addresses: start with 'bc1', 42 or 62 characters, lowercase alphanumeric\n const bech32 = /^bc1[a-z0-9]{38,58}$/;\n\n return p2pkh.test(address) || p2sh.test(address) || bech32.test(address);\n}\n\n/**\n * Convert satoshis to BTC (1 BTC = 100,000,000 satoshis)\n */\nexport function satoshisToBtc(satoshis: string | number): string {\n const amount = typeof satoshis === 'string' ? parseInt(satoshis, 10) : satoshis;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid satoshis amount: ${satoshis}`);\n }\n return (amount / 100_000_000).toString();\n}\n\n/**\n * Convert BTC to satoshis (1 BTC = 100,000,000 satoshis)\n */\nexport function btcToSatoshis(btc: string | number): string {\n const amount = typeof btc === 'string' ? parseFloat(btc) : btc;\n if (isNaN(amount) || amount < 0) {\n throw new Error(`Invalid BTC amount: ${btc}`);\n }\n return (amount * 100_000_000).toFixed(0);\n}\n","/**\n * BaaS Client Module\n *\n * Backend-as-a-Service client for Smart Engines SDK.\n * Provides authentication, database, storage, functions, messaging,\n * deployment, and agent management services.\n *\n * @example\n * ```typescript\n * import { BaasClient } from '@hsuite/smart-engines-sdk';\n *\n * const baas = new BaasClient({\n * hostUrl: 'https://host.smartengines.io',\n * appId: 'my-app',\n * });\n *\n * await baas.authenticate({ chain: 'hedera', walletAddress: '0.0.12345', publicKey: '...', signFn: (msg) => wallet.sign(msg) });\n *\n * // Sub-clients\n * await baas.db.insert('users', { name: 'Alice' });\n * await baas.storage.upload(file, 'doc.pdf');\n * await baas.messaging.publish('events', { type: 'created' });\n * await baas.functions.invoke('process-order', { orderId: '123' });\n * // Deployment uses the four-step init → push → optional uploadFrontend → deploy flow:\n * const init = await baas.deployment.init({ name: 'my-app', port: 3000, services: ['database'] });\n * // ... docker push <init.registry.server>/<init.registry.repository>:v1 ...\n * await baas.deployment.deploy(init.appId, { tag: 'v1', replicas: 1 });\n * await baas.agents.register({ name: 'Bot', capabilities: ['trade'], rules: {} });\n * ```\n */\n\n// Client\nexport { BaasClient, BaasError, type AuthenticateOptions } from './client';\n\n// Sub-clients\nexport { DatabaseClient } from './database';\nexport type { StateRootResponse, DocumentProofResponse, StateTransitionsResponse, DatabaseStatsResponse } from './database';\nexport { StorageClient } from './storage';\nexport { FunctionsClient } from './functions';\nexport { MessagingClient } from './messaging';\nexport { DeploymentClient } from './deployment';\nexport { AgentsClient, validateAgentRules } from './agents';\nexport type {\n AgentStatus,\n AgentRegisterRequest,\n AgentRules,\n AgentRulesValidationResult,\n AgentInfo,\n AgentEvent,\n AgentBalance,\n AgentOperation,\n AgentFundRequest,\n AgentTradeRequest,\n AgentWithdrawRequest,\n} from './agents';\n\n// Types - export all\nexport * from './types';\n","/**\n * Database Sub-Client\n *\n * Trustless database with state proofs and Merkle verification.\n *\n * @example\n * ```typescript\n * // CRUD operations\n * const result = await baas.db.insert('users', { name: 'Alice' });\n * const users = await baas.db.find('users', { name: 'Alice' });\n *\n * // State proofs\n * const root = await baas.db.getStateRoot();\n * const proof = await baas.db.getDocumentProof('doc-123');\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasInsertResult,\n BaasUpdateResult,\n BaasDeleteResult,\n BaasFindResult,\n BaasQueryOptions,\n BaasMerkleProof,\n BaasStateTransition,\n} from '../types';\n\n/** State root response */\nexport type StateRootResponse = {\n appId: string;\n stateRoot: string;\n blockHeight: number;\n timestamp: string;\n};\n\n/** Document proof response */\nexport type DocumentProofResponse = {\n documentId: string;\n exists: boolean;\n proof: BaasMerkleProof;\n stateRoot: string;\n};\n\n/** State transitions response */\nexport type StateTransitionsResponse = {\n transitions: BaasStateTransition[];\n total: number;\n fromBlock: number;\n toBlock: number;\n};\n\n/** Database stats response */\nexport type DatabaseStatsResponse = {\n collections: number;\n documents: number;\n storageSize: number;\n stateRoot: string;\n blockHeight: number;\n};\n\nexport class DatabaseClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Insert a document into a collection\n */\n async insert(collection: string, document: Record<string, unknown>): Promise<BaasInsertResult> {\n const appId = this.getAppId();\n return this.http.post(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}`,\n document\n );\n }\n\n /**\n * Find documents in a collection\n */\n async find(\n collection: string,\n query?: Record<string, unknown>,\n options?: BaasQueryOptions\n ): Promise<BaasFindResult> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (query && Object.keys(query).length > 0) {\n params.set('query', JSON.stringify(query));\n }\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.skip !== undefined) params.set('skip', String(options.skip));\n if (options?.sort) params.set('sort', options.sort);\n const qs = params.toString();\n return this.http.get(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Update a document in a collection\n */\n async update(\n collection: string,\n documentId: string,\n updates: Record<string, unknown>\n ): Promise<BaasUpdateResult> {\n const appId = this.getAppId();\n return this.http.put(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}/${encodeURIComponent(documentId)}`,\n updates\n );\n }\n\n /**\n * Delete a document from a collection\n */\n async delete(collection: string, documentId: string): Promise<BaasDeleteResult> {\n const appId = this.getAppId();\n return this.http.delete(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(collection)}/${encodeURIComponent(documentId)}`\n );\n }\n\n /**\n * List collections for the app\n */\n async listCollections(): Promise<{ collections: string[] }> {\n const appId = this.getAppId();\n return this.http.get(`/api/db/${encodeURIComponent(appId)}`);\n }\n\n // ========== State Proofs ==========\n\n /**\n * Get the current state root for the app\n */\n async getStateRoot(): Promise<StateRootResponse> {\n const appId = this.getAppId();\n return this.http.get(`/api/db/${encodeURIComponent(appId)}/state/root`);\n }\n\n /**\n * Get a Merkle proof for a specific document\n */\n async getDocumentProof(documentId: string): Promise<DocumentProofResponse> {\n const appId = this.getAppId();\n return this.http.get(\n `/api/db/${encodeURIComponent(appId)}/${encodeURIComponent(documentId)}/proof`\n );\n }\n\n /**\n * Get state transitions (audit log)\n */\n async getStateTransitions(options?: {\n fromBlock?: number;\n toBlock?: number;\n limit?: number;\n }): Promise<StateTransitionsResponse> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (options?.fromBlock !== undefined) params.set('fromBlock', String(options.fromBlock));\n if (options?.toBlock !== undefined) params.set('toBlock', String(options.toBlock));\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n const qs = params.toString();\n return this.http.get(\n `/api/db/${encodeURIComponent(appId)}/state/transitions${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Get database statistics\n */\n async getDbStats(): Promise<DatabaseStatsResponse> {\n const appId = this.getAppId();\n return this.http.get(`/api/db/${encodeURIComponent(appId)}/stats`);\n }\n}\n","/**\n * Storage Sub-Client\n *\n * Manages decentralized file storage on the host.\n *\n * @example\n * ```typescript\n * const result = await baas.storage.upload(fileBuffer, 'report.pdf');\n * const exists = await baas.storage.exists(result.cid);\n * const file = await baas.storage.download(result.cid);\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasUploadResult,\n BaasFileInfo,\n BaasFileMetadata,\n BaasStorageUsage,\n} from '../types';\n\nexport class StorageClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Upload a file to storage\n */\n async upload(\n file: Blob | Buffer,\n filename: string,\n metadata?: Record<string, string>\n ): Promise<BaasUploadResult> {\n const appId = this.getAppId();\n return this.http.upload(`/api/storage/${encodeURIComponent(appId)}/upload`, file, filename, metadata);\n }\n\n /**\n * Download a file by CID\n */\n async download(cid: string): Promise<any> {\n return this.http.get(`/api/storage/download/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get file metadata\n */\n async getMetadata(cid: string): Promise<BaasFileMetadata> {\n return this.http.get(`/api/storage/metadata/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Delete a file\n */\n async delete(cid: string): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.delete(`/api/storage/${encodeURIComponent(appId)}/${encodeURIComponent(cid)}`);\n }\n\n /**\n * Get file info\n */\n async getFile(cid: string): Promise<BaasFileInfo> {\n const appId = this.getAppId();\n return this.http.get(`/api/storage/${encodeURIComponent(appId)}/${encodeURIComponent(cid)}`);\n }\n\n /**\n * List all files for the app\n */\n async listFiles(pagination?: { limit?: number; skip?: number }): Promise<{ files: BaasFileInfo[]; total: number }> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (pagination?.limit !== undefined) params.set('limit', String(pagination.limit));\n if (pagination?.skip !== undefined) params.set('skip', String(pagination.skip));\n const qs = params.toString();\n return this.http.get(`/api/storage/${encodeURIComponent(appId)}/files${qs ? `?${qs}` : ''}`);\n }\n\n /**\n * Get storage usage for the current app\n */\n async getUsage(): Promise<BaasStorageUsage> {\n return this.http.get('/api/storage/usage');\n }\n\n /**\n * Check if a file exists\n */\n async exists(cid: string): Promise<{ exists: boolean; cid: string }> {\n return this.http.get(`/api/storage/exists/${encodeURIComponent(cid)}`);\n }\n}\n","/**\n * Functions Sub-Client\n *\n * Manages serverless function deployment, invocation, and monitoring.\n *\n * @example\n * ```typescript\n * // Deploy a function\n * const fn = await baas.functions.deploy({\n * name: 'process-order',\n * runtime: 'nodejs18',\n * handler: 'index.handler',\n * code: functionCode,\n * });\n *\n * // Invoke it\n * const result = await baas.functions.invoke(fn.functionId, { orderId: '123' });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasFunctionDeployRequest,\n BaasFunctionDeployResult,\n BaasFunctionResult,\n BaasFunctionInfo,\n BaasFunctionLog,\n BaasFunctionLogOptions,\n} from '../types';\n\nexport class FunctionsClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Deploy a new function\n */\n async deploy(request: BaasFunctionDeployRequest): Promise<BaasFunctionDeployResult> {\n const appId = this.getAppId();\n return this.http.post(`/api/functions/${encodeURIComponent(appId)}`, request);\n }\n\n /**\n * Invoke a function\n */\n async invoke(functionId: string, payload?: unknown): Promise<BaasFunctionResult> {\n return this.http.post(`/api/functions/${encodeURIComponent(functionId)}/invoke`, payload ?? {});\n }\n\n /**\n * List all functions\n */\n async list(): Promise<{ functions: BaasFunctionInfo[]; total: number }> {\n return this.http.get('/api/functions');\n }\n\n /**\n * Get function details\n */\n async get(functionId: string): Promise<BaasFunctionInfo> {\n return this.http.get(`/api/functions/${encodeURIComponent(functionId)}`);\n }\n\n /**\n * Update a function\n */\n async update(functionId: string, updates: Partial<BaasFunctionDeployRequest>): Promise<BaasFunctionInfo> {\n return this.http.put(`/api/functions/${encodeURIComponent(functionId)}`, updates);\n }\n\n /**\n * Delete a function\n */\n async delete(functionId: string): Promise<{ success: boolean }> {\n return this.http.delete(`/api/functions/${encodeURIComponent(functionId)}`);\n }\n\n /**\n * Get function execution logs\n */\n async getLogs(functionId: string, options?: BaasFunctionLogOptions): Promise<{ logs: BaasFunctionLog[]; total: number }> {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.startTime) params.set('startTime', options.startTime);\n if (options?.level) params.set('level', options.level);\n const qs = params.toString();\n return this.http.get(`/api/functions/${encodeURIComponent(functionId)}/logs${qs ? `?${qs}` : ''}`);\n }\n\n /**\n * Get function statistics for an app\n */\n async getStats(): Promise<any> {\n const appId = this.getAppId();\n return this.http.get(`/api/functions/${encodeURIComponent(appId)}/stats`);\n }\n}\n","/**\n * Messaging Sub-Client\n *\n * Full pub/sub messaging with channels, history, and presence.\n *\n * @example\n * ```typescript\n * // Create a channel\n * await baas.messaging.createChannel({ name: 'events', persistent: true });\n *\n * // Publish a message\n * await baas.messaging.publish('events', { type: 'order.created', orderId: '123' });\n *\n * // Get history\n * const history = await baas.messaging.getHistory('events', { limit: 50 });\n * ```\n */\nimport type { HttpClient } from '../../http';\nimport type {\n BaasChannelConfig,\n BaasPublishResult,\n BaasPresenceMember,\n BaasPresenceInfo,\n BaasHistoryOptions,\n BaasMessage,\n} from '../types';\n\nexport class MessagingClient {\n constructor(\n private readonly http: HttpClient,\n private readonly getAppId: () => string\n ) {}\n\n /**\n * Create a new channel\n */\n async createChannel(config: BaasChannelConfig): Promise<BaasChannelConfig & { channelId: string }> {\n const appId = this.getAppId();\n return this.http.post(`/api/messaging/${encodeURIComponent(appId)}/channels`, config);\n }\n\n /**\n * Delete a channel\n */\n async deleteChannel(channelId: string): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.delete(`/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channelId)}`);\n }\n\n /**\n * Get a channel by ID\n */\n async getChannel(channelId: string): Promise<BaasChannelConfig & { channelId: string; messageCount: number }> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channelId)}`);\n }\n\n /**\n * List all channels for the app\n */\n async listChannels(): Promise<{ channels: Array<BaasChannelConfig & { channelId: string }>; total: number }> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/channels`);\n }\n\n /**\n * Publish a message to a channel\n */\n async publish(\n channel: string,\n message: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): Promise<BaasPublishResult> {\n const appId = this.getAppId();\n return this.http.post(\n `/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channel)}/publish`,\n { data: message, metadata }\n );\n }\n\n /**\n * Get message history for a channel\n */\n async getHistory(\n channel: string,\n options?: BaasHistoryOptions\n ): Promise<{ messages: BaasMessage[]; total: number; hasMore: boolean }> {\n const appId = this.getAppId();\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.before) params.set('before', options.before);\n if (options?.after) params.set('after', options.after);\n const qs = params.toString();\n return this.http.get(\n `/api/messaging/${encodeURIComponent(appId)}/channels/${encodeURIComponent(channel)}/history${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Set presence for a member\n */\n async setPresence(member: BaasPresenceMember): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.post(`/api/messaging/${encodeURIComponent(appId)}/presence`, member);\n }\n\n /**\n * Remove presence for a member\n */\n async removePresence(memberId: string): Promise<{ success: boolean }> {\n const appId = this.getAppId();\n return this.http.delete(`/api/messaging/${encodeURIComponent(appId)}/presence/${encodeURIComponent(memberId)}`);\n }\n\n /**\n * Get presence info for a channel\n */\n async getPresence(channel: string): Promise<BaasPresenceInfo> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/presence/${encodeURIComponent(channel)}`);\n }\n\n /**\n * Get messaging statistics\n */\n async getStats(): Promise<any> {\n const appId = this.getAppId();\n return this.http.get(`/api/messaging/${encodeURIComponent(appId)}/stats`);\n }\n}\n","/**\n * Customer-Session Sub-Client (TokenGate Face B).\n *\n * Wraps the smart-host's customer→smart-app session bridge:\n * POST /api/customer-session/challenge (public)\n * POST /api/customer-session/verify (public)\n * GET /api/customer-session/validate (Bearer)\n * POST /api/customer-session/end (Bearer)\n *\n * Spec: docs/superpowers/specs/2026-05-06-cross-chain-session-bridging-design.md §D1.\n *\n * Used by smart-apps to authenticate their customers without API keys: the\n * customer signs a chain-X challenge with their wallet, the host verifies the\n * signature against the chosen chain (and optionally a TokenGate NFT for\n * paid tiers), and returns a short-lived JWT (≤15 min by default).\n *\n * Free_testnet smart-apps gracefully skip the NFT step — customers only need\n * to prove wallet ownership via signature.\n */\n\nexport type CustomerSessionChallenge = {\n challenge: string;\n};\n\nexport type CustomerSessionVerifyRequest = {\n appId: string;\n chain: string;\n address: string;\n /** Public key (chain-dependent, e.g. ED25519 for Hedera, secp256k1 for XRPL). */\n publicKey?: string;\n signature: string;\n challenge: string;\n};\n\nexport type CustomerSessionToken = {\n /** Short-lived JWT to attach as `Authorization: Bearer ...` on subsequent calls. */\n token: string;\n sessionId: string;\n validatorId: string;\n expiresAt: string;\n sessionSecret: string;\n};\n\nexport type CustomerSessionInfo = {\n sessionId: string;\n appId: string;\n customerChain: string;\n customerAddress: string;\n /** Optional — present only when the customer holds a TokenGate-recognised NFT. */\n subscriptionContext?: {\n nftSerial: number;\n tier: 'free_testnet' | 'starter' | 'professional' | 'enterprise';\n expiresAt: string;\n allowedAutomations?: string[];\n };\n createdAt: string;\n expiresAt: string;\n lastActivityAt: string;\n};\n\nexport class CustomerSessionClient {\n constructor(\n private readonly baseUrl: string,\n private readonly timeoutMs: number = 30_000,\n ) {}\n\n /**\n * Step 1: ask the host to issue a fresh challenge for the customer to sign.\n */\n async challenge(input: { chain: string; address: string }): Promise<CustomerSessionChallenge> {\n return this.fetch<CustomerSessionChallenge>('POST', '/api/customer-session/challenge', input);\n }\n\n /**\n * Step 2: submit the customer's signed challenge. On success returns a\n * short-lived bearer JWT scoped to {appId, chain, address}.\n */\n async verify(req: CustomerSessionVerifyRequest): Promise<CustomerSessionToken> {\n return this.fetch<CustomerSessionToken>('POST', '/api/customer-session/verify', req);\n }\n\n /**\n * Validate a customer bearer + return the decoded session info. Used by\n * smart-app backends to authorise incoming customer requests.\n */\n async validate(bearer: string): Promise<CustomerSessionInfo> {\n return this.fetch<CustomerSessionInfo>('GET', '/api/customer-session/validate', undefined, bearer);\n }\n\n /**\n * Revoke a customer session. Idempotent.\n */\n async end(bearer: string): Promise<{ revoked: boolean; sessionId: string }> {\n return this.fetch<{ revoked: boolean; sessionId: string }>(\n 'POST',\n '/api/customer-session/end',\n undefined,\n bearer,\n );\n }\n\n private async fetch<T>(\n method: 'GET' | 'POST',\n path: string,\n body?: unknown,\n bearer?: string,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (bearer) headers['Authorization'] = `Bearer ${bearer}`;\n const init: RequestInit = { method, headers, signal: controller.signal };\n if (body !== undefined) init.body = JSON.stringify(body);\n const response = await fetch(url, init);\n clearTimeout(timeoutId);\n if (!response.ok) {\n const errBody = (await response.json().catch(() => ({}))) as { message?: string };\n const err = new Error(\n errBody.message ?? `customer-session ${path} failed: ${response.status} ${response.statusText}`,\n ) as Error & { status: number };\n err.status = response.status;\n throw err;\n }\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n const e = error as Error;\n if (e.name === 'AbortError') {\n throw new Error(`customer-session ${path} timeout`);\n }\n throw error;\n }\n }\n}\n","/**\n * BaaS Client\n *\n * SDK client for interacting with Smart Engines Backend-as-a-Service.\n *\n * Provides:\n * - Wallet-based authentication (challenge-response)\n * - App registration and management\n * - Trustless database operations with state transitions and Merkle proofs\n * - Decentralized file storage\n * - Serverless function deployment and invocation\n * - Real-time pub/sub messaging with channels, history, and presence\n * - App deployment lifecycle management\n * - Autonomous smart agent management\n *\n * @example\n * ```typescript\n * import { BaasClient } from '@hsuite/smart-engines-sdk';\n *\n * const baas = new BaasClient({\n * hostUrl: 'https://host.smartengines.io',\n * appId: 'my-app',\n * });\n *\n * await baas.authenticate({\n * chain: 'hedera',\n * walletAddress: '0.0.12345',\n * publicKey: 'your-public-key',\n * signFn: async (message) => wallet.sign(message),\n * });\n *\n * // Database with state proofs\n * const result = await baas.db.insert('users', { name: 'Alice' });\n * const proof = await baas.db.getDocumentProof(result.document._id);\n *\n * // File storage\n * const upload = await baas.storage.upload(fileBuffer, 'document.pdf');\n *\n * // Messaging\n * await baas.messaging.publish('events', { type: 'user.created' });\n *\n * // Functions\n * const fn = await baas.functions.deploy({ name: 'handler', runtime: 'nodejs20', code: '...', codeType: 'inline' });\n *\n * // Agents\n * const agent = await baas.agents.register({ name: 'Bot', capabilities: ['trade'], rules: {} });\n * ```\n */\n\nimport type {\n BaasClientConfig,\n BaasSupportedChain,\n BaasChallengeResponse,\n BaasAuthResult,\n BaasSessionInfo,\n BaasErrorDetails,\n} from './types';\nimport { type CircuitBreakerSnapshot } from '../_vendor';\nimport { createHttpClient, type HttpClient } from '../http';\nimport { DatabaseClient } from './database';\nimport { StorageClient } from './storage';\nimport { FunctionsClient } from './functions';\nimport { MessagingClient } from './messaging';\nimport { DeploymentClient } from './deployment';\nimport { AgentsClient } from './agents';\nimport { CustomerSessionClient } from './customer-session';\n\n/**\n * Authentication options for wallet-based auth\n */\nexport type AuthenticateOptions = {\n /** Blockchain chain */\n chain: BaasSupportedChain;\n /** Wallet address on the chain */\n walletAddress: string;\n /** Public key (hex encoded) */\n publicKey: string;\n /** Function to sign the challenge message */\n signFn: (message: string) => string | Promise<string>;\n};\n\n/**\n * BaaS Client\n *\n * Full-featured client for Smart Engines Backend-as-a-Service platform.\n * All BaaS services are accessible via typed sub-clients.\n */\nexport class BaasClient {\n private readonly hostUrl: string;\n private readonly pathPrefix: string;\n private appId: string | undefined;\n private readonly timeout: number;\n private readonly allowInsecure: boolean;\n private authToken: string | null = null;\n private readonly http: HttpClient;\n /** Last HTTP error (for getHttpHealth) */\n private lastHttpError?: Error;\n\n // ========== Sub-Clients ==========\n\n /** Trustless database with state proofs and Merkle verification */\n public readonly db: DatabaseClient;\n /** Decentralized file storage */\n public readonly storage: StorageClient;\n /** Serverless function deployment and invocation */\n public readonly functions: FunctionsClient;\n /** Real-time pub/sub messaging with channels, history, and presence */\n public readonly messaging: MessagingClient;\n /** App deployment lifecycle management */\n public readonly deployment: DeploymentClient;\n /** Autonomous smart agent management */\n public readonly agents: AgentsClient;\n /** Customer→smart-app session bridge (TokenGate Face B). */\n public readonly customerSession: CustomerSessionClient;\n\n constructor(config: BaasClientConfig) {\n this.allowInsecure = config.allowInsecure ?? false;\n this.hostUrl = validateUrl(config.hostUrl, this.allowInsecure);\n this.appId = config.appId;\n this.timeout = config.timeout ?? 30000;\n // Note: config.http is accepted for backward compatibility and future resilience layer integration\n\n // Strip trailing slash from pathPrefix and ensure leading slash; empty if none.\n const prefix = (config.pathPrefix ?? '').replace(/\\/$/, '');\n this.pathPrefix = prefix ? (prefix.startsWith('/') ? prefix : `/${prefix}`) : '';\n const baseUrlWithPrefix = this.pathPrefix\n ? this.hostUrl.replace(/\\/$/, '') + this.pathPrefix\n : this.hostUrl;\n\n // Create shared HTTP client. baseUrl includes optional pathPrefix so all\n // /api/* paths get routed to the host even when consumed via a gateway.\n this.http = createHttpClient({\n baseUrl: baseUrlWithPrefix,\n timeout: this.timeout,\n });\n\n // Helper to get appId with validation\n const getAppId = () => this.requireAppId();\n\n // Initialize sub-clients\n this.db = new DatabaseClient(this.http, getAppId);\n this.storage = new StorageClient(this.http, getAppId);\n this.functions = new FunctionsClient(this.http, getAppId);\n this.messaging = new MessagingClient(this.http, getAppId);\n this.deployment = new DeploymentClient(this.http);\n this.agents = new AgentsClient(this.http);\n this.customerSession = new CustomerSessionClient(baseUrlWithPrefix, this.timeout);\n }\n\n /** Set the app ID (for newly registered apps) */\n setAppId(appId: string): void {\n this.appId = appId;\n }\n\n /** Check if the client is authenticated */\n isAuthenticated(): boolean {\n return this.authToken !== null;\n }\n\n /** Get the current app ID */\n getAppId(): string | undefined {\n return this.appId;\n }\n\n /**\n * Get HTTP resilience health information\n * @returns Object with circuit breaker state and last error (if any)\n */\n getHttpHealth(): { breaker: CircuitBreakerSnapshot | null; lastError?: Error } {\n // Note: In a real implementation, we would get the circuit breaker state\n // from the resilient HTTP layer. For now, return null since the base\n // HTTP client doesn't expose it yet.\n return {\n breaker: null,\n lastError: this.lastHttpError,\n };\n }\n\n private requireAppId(): string {\n if (!this.appId) {\n throw new BaasError(\n 'App ID required. Provide appId in config (e.g. from a prior deployment.init() call).',\n 400\n );\n }\n return this.appId;\n }\n\n // ========== Authentication ==========\n\n /**\n * Authenticate with the BaaS host using wallet challenge-response\n *\n * 1. Requests a challenge message from the host\n * 2. Signs the challenge with the provided signing function\n * 3. Submits the signature for verification\n * 4. Stores the JWT token for subsequent requests\n */\n async authenticate(options: AuthenticateOptions): Promise<BaasAuthResult> {\n const { chain, walletAddress, publicKey, signFn } = options;\n\n // Step 1: Request challenge\n const challenge = await this.post<BaasChallengeResponse>('/api/auth/challenge', {\n chain,\n walletAddress,\n appId: this.appId,\n });\n\n // Step 2: Sign the challenge\n const signature = await signFn(challenge.message);\n\n // Step 3: Verify and get token\n const result = await this.post<BaasAuthResult>('/api/auth/verify', {\n challengeId: challenge.challengeId,\n signature,\n publicKey,\n });\n\n // Store token for subsequent requests\n this.authToken = result.token;\n // Update the shared HTTP client's auth token\n (this.http as any).setAuthToken?.(result.token);\n\n return result;\n }\n\n /** Validate the current session */\n async validateSession(): Promise<BaasSessionInfo> {\n this.requireAuth();\n return this.get<BaasSessionInfo>('/api/auth/session');\n }\n\n /** Destroy the current session on server and clear local token */\n async logout(): Promise<void> {\n if (this.authToken) {\n try {\n await this.post('/api/auth/logout', {});\n } catch {\n // Best effort — clear locally even if server request fails\n }\n }\n this.authToken = null;\n }\n\n // ========== HTTP Helpers ==========\n\n private requireAuth(): void {\n if (!this.authToken) {\n throw new BaasError('Authentication required. Call authenticate() first.', 401);\n }\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.authToken) {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n return headers;\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>('POST', path, body);\n }\n\n private async get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path);\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.hostUrl}${this.pathPrefix}${path}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const options: RequestInit = {\n method,\n headers: this.getHeaders(),\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as BaasErrorDetails & {\n message?: string;\n };\n throw new BaasError(\n errorData.message || `API error: ${response.status} ${response.statusText}`,\n response.status,\n errorData\n );\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof BaasError) throw error;\n const err = error as Error;\n if (err.name === 'AbortError') {\n throw new BaasError('Request timeout', 408);\n }\n throw new BaasError(`Network error: ${err.message}`, 0, { originalError: err.message });\n }\n }\n}\n\n/**\n * BaaS Error\n */\nexport class BaasError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly details?: BaasErrorDetails\n ) {\n super(message);\n this.name = 'BaasError';\n }\n}\n\nfunction validateUrl(url: string, allowInsecure = false): string {\n try {\n const parsed = new URL(url);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new BaasError(`Invalid protocol: ${parsed.protocol}`, 400);\n }\n if (!allowInsecure && parsed.protocol !== 'https:') {\n throw new BaasError(\n 'HTTPS is required for secure connections. Set allowInsecure=true for local development.',\n 400\n );\n }\n return parsed.origin;\n } catch (error) {\n if (error instanceof BaasError) throw error;\n throw new BaasError(`Invalid URL: ${url}`, 400);\n }\n}\n","/**\n * PQC Arc 11 PR 11.0 — Customer-facing PQC verify subpath barrel.\n *\n * Import via `@hsuite/smart-engines-sdk/pqc-verify` for the verify primitive\n * + cert schema + registry-snapshot fetcher. Lazy-loaded so customers who\n * don't need verification don't pay the @noble/post-quantum bundle cost\n * (~120KB compressed).\n *\n * @example\n * ```ts\n * import { verifyPqcAttestation, fetchRegistrySnapshot } from '@hsuite/smart-engines-sdk/pqc-verify';\n *\n * const snapshot = await fetchRegistrySnapshot('https://host.example.com');\n * const result = await verifyPqcAttestation(cert, payload, snapshot ?? undefined);\n * if (!result.valid) throw new Error(`PQC verify failed: ${result.reason}`);\n * ```\n */\nexport {\n PqcCertV1Schema,\n parsePqcCert,\n type PqcCertV1,\n type PqcCertV1Signer,\n} from './cert-schema';\nexport {\n fetchRegistrySnapshot,\n type ValidatorRegistrySnapshot,\n type FetchRegistryOptions,\n} from './registry-fetch';\nexport { verifyPqcAttestation, type VerifyResult } from './verify-pqc-attestation';\n","/**\n * PQC Arc 11 PR 11.0 — Customer-facing PqcCertV1 Zod schema + parser.\n *\n * Cert schema is locked at `pqcCertVersion: 1` per design §3 — additive-only\n * migration policy keeps existing customer SDKs verifying for the deprecation\n * window (12 months minimum) when v2 ships.\n *\n * @see docs/superpowers/specs/2026-05-27-pqc-arc11-external-verifier-design.md §3\n * @see docs/superpowers/plans/2026-05-27-pqc-arc11-external-verifier-plan.md §11.0.1\n */\nimport { z } from 'zod';\n\nexport const PqcCertV1Schema = z\n .object({\n pqcCertVersion: z.literal(1),\n algorithm: z.literal('ml-dsa-87'),\n consumer: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/),\n contentHash: z.string().regex(/^[a-f0-9]{64}$/),\n payloadHash: z\n .string()\n .regex(/^[a-f0-9]{64}$/)\n .optional(),\n threshold: z.number().int().positive(),\n signers: z\n .array(\n z.object({\n nodeId: z.string().min(1),\n dilithium5PublicKey: z.string().min(1),\n signature: z.string().min(1),\n }),\n )\n .nonempty(),\n ts: z.number().int().positive(),\n topicMessageId: z.string().optional(),\n })\n .strict();\n\nexport type PqcCertV1 = z.infer<typeof PqcCertV1Schema>;\n\nexport type PqcCertV1Signer = PqcCertV1['signers'][number];\n\n/**\n * Fail-soft cert parser. Never throws — returns a discriminated result so the\n * verifier can surface schema errors as `{ valid: false, reason }` to customers.\n */\nexport function parsePqcCert(\n input: unknown,\n): { ok: true; cert: PqcCertV1 } | { ok: false; error: string } {\n const result = PqcCertV1Schema.safeParse(input);\n if (!result.success) {\n return { ok: false, error: result.error.issues[0]?.message ?? 'schema-invalid' };\n }\n return { ok: true, cert: result.data };\n}\n","/**\n * PQC Arc 11 PR 11.0 Phase 11.0.2 — validator-registry snapshot fetcher.\n *\n * Pulls a snapshot from the smart-host proxy (PR #820) at\n * `GET /api/registry/snapshot`. Fail-soft: any non-2xx / network error /\n * malformed body returns `null` so the verifier can fall through to the\n * signature-only validity path without throwing.\n *\n * @see docs/superpowers/specs/2026-05-27-pqc-arc11-external-verifier-design.md §4.1\n */\n\nexport type ValidatorRegistrySnapshot = {\n readonly snapshotTs: number;\n readonly validators: readonly {\n readonly nodeId: string;\n readonly dilithium5PublicKey: string;\n readonly active: boolean;\n }[];\n};\n\nexport type FetchRegistryOptions = {\n /** Abort the fetch after this many ms. Default 10_000. */\n readonly timeoutMs?: number;\n};\n\n/**\n * Fetch a validator-registry snapshot from a smart-host proxy.\n *\n * Returns `null` on any failure (HTTP non-OK, network error, JSON parse error,\n * shape mismatch). Callers can treat `null` as \"registry unavailable; skip\n * pubkey membership check\" and still verify signatures against the pubkeys\n * embedded in the cert itself.\n */\nexport async function fetchRegistrySnapshot(\n smartHostUrl: string,\n opts: FetchRegistryOptions = {},\n): Promise<ValidatorRegistrySnapshot | null> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? 10_000);\n try {\n const url = `${smartHostUrl.replace(/\\/+$/, '')}/api/registry/snapshot`;\n const resp = await fetch(url, { signal: controller.signal });\n if (!resp.ok) return null;\n const data: unknown = await resp.json();\n if (typeof data !== 'object' || data === null) return null;\n const obj = data as Record<string, unknown>;\n if (typeof obj.snapshotTs !== 'number' || !Array.isArray(obj.validators)) {\n return null;\n }\n return obj as unknown as ValidatorRegistrySnapshot;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n","/**\n * PQC Arc 11 PR 11.0 Phase 11.0.3 — verifyPqcAttestation primitive.\n *\n * Pure verification — no platform calls. Pass a `registrySnapshot` to also\n * enforce registry membership; omit it for signature-only verification.\n *\n * Verification steps (per design §4.1):\n * 1. Schema check: pqcCertVersion === 1, algorithm === 'ml-dsa-87'.\n * 2. Content-hash match: sha256(canonical(payload)) === cert.contentHash.\n * 3. (Optional) Registry membership: each signer active in snapshot,\n * pubkey matches.\n * 4. Per-signer signature verification against\n * sha256(`${consumer}|${contentHash}|${ts}`).\n * 5. Threshold check: verified-signer-count >= cert.threshold.\n *\n * Fail-soft at every step — returns `{ valid: false, reason }` instead of\n * throwing.\n *\n * @see docs/superpowers/specs/2026-05-27-pqc-arc11-external-verifier-design.md §4.1\n */\nimport { ml_dsa87 } from '@noble/post-quantum/ml-dsa';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { parsePqcCert, type PqcCertV1 } from './cert-schema';\nimport type { ValidatorRegistrySnapshot } from './registry-fetch';\n\nexport type VerifyResult = {\n readonly valid: boolean;\n readonly reason?: string;\n readonly verifiedSignerCount?: number;\n readonly thresholdMet?: boolean;\n};\n\n/**\n * Canonical JSON serialization — sorted object keys, no whitespace, JSON.stringify\n * for primitives. Mirrors libs/shared/src/schemas/pqc.schema.ts:canonicalJsonStringify\n * so that customer-side `sha256(canonical(payload))` matches platform-side hashes\n * byte-for-byte regardless of language / emitter.\n */\nfunction canonicalJsonStringify(value: unknown): string {\n return _serialize(value);\n}\n\nfunction _serialize(value: unknown): string {\n if (value === null) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error(`canonicalJsonStringify: non-finite number ${value}`);\n }\n return JSON.stringify(value);\n }\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'undefined') {\n throw new Error('canonicalJsonStringify: undefined is not JSON-representable');\n }\n if (Array.isArray(value)) {\n return '[' + value.map(_serialize).join(',') + ']';\n }\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return '{' + keys.map((k) => JSON.stringify(k) + ':' + _serialize(obj[k])).join(',') + '}';\n }\n throw new Error(`canonicalJsonStringify: unsupported type ${typeof value}`);\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n if (hex.length % 2 !== 0) throw new Error('odd-length hex');\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n const b = parseInt(hex.substr(i * 2, 2), 16);\n if (Number.isNaN(b)) throw new Error('non-hex char');\n out[i] = b;\n }\n return out;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let s = '';\n for (let i = 0; i < bytes.length; i++) {\n s += bytes[i].toString(16).padStart(2, '0');\n }\n return s;\n}\n\n/**\n * Verify a PQC attestation cert against a payload.\n *\n * @param cert - The PqcCertV1 cert (any shape; will be schema-validated).\n * @param payload - The artifact payload to verify against. Will be canonicalized\n * + sha256-hashed for the content-hash check.\n * @param registrySnapshot - Optional. When supplied, every signer must be\n * present + active in the snapshot, AND the cert's\n * pubkey must match the registry pubkey.\n */\nexport async function verifyPqcAttestation(\n cert: unknown,\n payload: unknown,\n registrySnapshot?: ValidatorRegistrySnapshot,\n): Promise<VerifyResult> {\n // ── Step 1: Schema check ──────────────────────────────────────────────────\n const parsed = parsePqcCert(cert);\n if (!parsed.ok) {\n return { valid: false, reason: `schema-invalid: ${parsed.error}` };\n }\n const c: PqcCertV1 = parsed.cert;\n\n // ── Step 2: Content-hash match ────────────────────────────────────────────\n let computedContentHash: string;\n try {\n const canonical = canonicalJsonStringify(payload);\n computedContentHash = bytesToHex(sha256(new TextEncoder().encode(canonical)));\n } catch (err) {\n return { valid: false, reason: `payload-canonicalization-failed: ${(err as Error).message}` };\n }\n if (computedContentHash.toLowerCase() !== c.contentHash.toLowerCase()) {\n return {\n valid: false,\n reason: `content-hash-mismatch: computed=${computedContentHash} cert=${c.contentHash}`,\n };\n }\n\n // ── Step 3: Registry membership (optional) ────────────────────────────────\n if (registrySnapshot) {\n for (const signer of c.signers) {\n const entry = registrySnapshot.validators.find((v) => v.nodeId === signer.nodeId);\n if (!entry) {\n return { valid: false, reason: `registry-unknown-signer: ${signer.nodeId}` };\n }\n if (!entry.active) {\n return { valid: false, reason: `registry-inactive-signer: ${signer.nodeId}` };\n }\n if (entry.dilithium5PublicKey.toLowerCase() !== signer.dilithium5PublicKey.toLowerCase()) {\n return {\n valid: false,\n reason: `registry-pubkey-mismatch: ${signer.nodeId}`,\n };\n }\n }\n }\n\n // ── Step 4: Per-signer signature verification ─────────────────────────────\n const sigDigestInput = new TextEncoder().encode(`${c.consumer}|${c.contentHash}|${c.ts}`);\n const sigDigest = sha256(sigDigestInput);\n\n let verifiedSignerCount = 0;\n for (const signer of c.signers) {\n try {\n const pubKey = hexToBytes(signer.dilithium5PublicKey);\n const sigBytes = hexToBytes(signer.signature);\n if (ml_dsa87.verify(pubKey, sigDigest, sigBytes)) {\n verifiedSignerCount++;\n }\n } catch {\n // malformed hex / wrong size — treat as invalid sig, continue\n }\n }\n\n // ── Step 5: Threshold ─────────────────────────────────────────────────────\n const thresholdMet = verifiedSignerCount >= c.threshold;\n if (!thresholdMet) {\n return {\n valid: false,\n reason: `threshold-not-met: verified=${verifiedSignerCount} required=${c.threshold}`,\n verifiedSignerCount,\n thresholdMet: false,\n };\n }\n\n return {\n valid: true,\n verifiedSignerCount,\n thresholdMet: true,\n };\n}\n"]}
|