x402check 0.1.1 → 0.2.0
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.cjs +216 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +58 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +58 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.iife.js +2 -2
- package/dist/index.js +216 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["isBytes","anumber","abytes","hasHexBuiltin","normalize"],"sources":["../src/types/errors.ts","../src/types/parse-input.ts","../src/registries/networks.ts","../src/registries/assets.ts","../src/registries/simple-names.ts","../src/detection/guards.ts","../src/detection/detect.ts","../src/detection/normalize.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/_u64.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/utils.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/sha3.js","../src/crypto/keccak256.ts","../../../node_modules/.pnpm/@scure+base@2.0.0/node_modules/@scure/base/index.ts","../src/crypto/base58.ts","../src/crypto/eip55.ts","../src/validation/evm-address.ts","../src/validation/solana-address.ts","../src/validation/address.ts","../src/validation/rules/structure.ts","../src/validation/rules/version.ts","../src/validation/rules/fields.ts","../src/validation/rules/network.ts","../src/validation/rules/amount.ts","../src/validation/rules/legacy.ts","../src/validation/orchestrator.ts","../src/extraction/extract.ts","../src/index.ts"],"sourcesContent":["/**\n * Error and warning code vocabulary for x402check\n */\n\nexport const ErrorCode = {\n // Structure errors\n INVALID_JSON: 'INVALID_JSON',\n NOT_OBJECT: 'NOT_OBJECT',\n UNKNOWN_FORMAT: 'UNKNOWN_FORMAT',\n\n // Version errors\n MISSING_VERSION: 'MISSING_VERSION',\n INVALID_VERSION: 'INVALID_VERSION',\n\n // Accepts errors\n MISSING_ACCEPTS: 'MISSING_ACCEPTS',\n EMPTY_ACCEPTS: 'EMPTY_ACCEPTS',\n INVALID_ACCEPTS: 'INVALID_ACCEPTS',\n\n // Field errors\n MISSING_SCHEME: 'MISSING_SCHEME',\n MISSING_NETWORK: 'MISSING_NETWORK',\n INVALID_NETWORK_FORMAT: 'INVALID_NETWORK_FORMAT',\n MISSING_AMOUNT: 'MISSING_AMOUNT',\n INVALID_AMOUNT: 'INVALID_AMOUNT',\n ZERO_AMOUNT: 'ZERO_AMOUNT',\n MISSING_ASSET: 'MISSING_ASSET',\n MISSING_PAY_TO: 'MISSING_PAY_TO',\n MISSING_RESOURCE: 'MISSING_RESOURCE',\n INVALID_URL: 'INVALID_URL',\n INVALID_TIMEOUT: 'INVALID_TIMEOUT',\n\n // Address errors (codes only, validation is Phase 7)\n INVALID_EVM_ADDRESS: 'INVALID_EVM_ADDRESS',\n BAD_EVM_CHECKSUM: 'BAD_EVM_CHECKSUM',\n NO_EVM_CHECKSUM: 'NO_EVM_CHECKSUM',\n INVALID_SOLANA_ADDRESS: 'INVALID_SOLANA_ADDRESS',\n ADDRESS_NETWORK_MISMATCH: 'ADDRESS_NETWORK_MISMATCH',\n\n // Warning codes\n UNKNOWN_NETWORK: 'UNKNOWN_NETWORK',\n UNKNOWN_ASSET: 'UNKNOWN_ASSET',\n LEGACY_FORMAT: 'LEGACY_FORMAT',\n MISSING_MAX_TIMEOUT: 'MISSING_MAX_TIMEOUT',\n} as const\n\nexport type ErrorCode = typeof ErrorCode[keyof typeof ErrorCode]\n\n/**\n * Human-readable error messages for all error codes\n */\nexport const ErrorMessages = {\n // Structure errors\n INVALID_JSON: 'Input is not valid JSON',\n NOT_OBJECT: 'Input must be an object',\n UNKNOWN_FORMAT: 'Missing required x402Version field (must be 1 or 2)',\n\n // Version errors\n MISSING_VERSION: 'Missing required field: x402Version',\n INVALID_VERSION: 'Invalid x402Version value (must be 1 or 2)',\n\n // Accepts errors\n MISSING_ACCEPTS: 'Missing required field: accepts',\n EMPTY_ACCEPTS: 'accepts array cannot be empty',\n INVALID_ACCEPTS: 'accepts must be an array',\n\n // Field errors\n MISSING_SCHEME: 'Missing required field: scheme',\n MISSING_NETWORK: 'Missing required field: network',\n INVALID_NETWORK_FORMAT: 'Network must use CAIP-2 format (namespace:reference), e.g. eip155:8453',\n MISSING_AMOUNT: 'Missing required field: amount',\n INVALID_AMOUNT: 'Amount must be a numeric string in atomic units',\n ZERO_AMOUNT: 'Amount must be greater than zero',\n MISSING_ASSET: 'Missing required field: asset',\n MISSING_PAY_TO: 'Missing required field: payTo',\n MISSING_RESOURCE: 'Missing required field: resource',\n INVALID_URL: 'resource.url is not a valid URL format',\n INVALID_TIMEOUT: 'maxTimeoutSeconds must be a positive integer',\n\n // Address errors\n INVALID_EVM_ADDRESS: 'Invalid EVM address format',\n BAD_EVM_CHECKSUM: 'EVM address has invalid checksum',\n NO_EVM_CHECKSUM: 'EVM address is all-lowercase with no checksum protection',\n INVALID_SOLANA_ADDRESS: 'Invalid Solana address format',\n ADDRESS_NETWORK_MISMATCH: 'Address format does not match network type',\n\n // Warnings\n UNKNOWN_NETWORK: 'Network is not in the known registry -- config may still work but cannot be fully validated',\n UNKNOWN_ASSET: 'Asset is not in the known registry -- config may still work but cannot be fully validated',\n LEGACY_FORMAT: 'Config uses legacy flat format -- consider upgrading to x402 v2',\n MISSING_MAX_TIMEOUT: 'Consider adding maxTimeoutSeconds for better security',\n} satisfies Record<ErrorCode, string>\n","import { ErrorCode, ErrorMessages } from './errors'\nimport type { ParsedInput } from './validation'\n\n/**\n * Parse input that may be either a JSON string or an object\n * API-04: Accept string | object\n */\nexport function parseInput(input: string | object): ParsedInput {\n if (typeof input === 'string') {\n try {\n const parsed = JSON.parse(input)\n return { parsed }\n } catch {\n return {\n parsed: null,\n error: {\n code: ErrorCode.INVALID_JSON,\n field: '$',\n message: ErrorMessages.INVALID_JSON,\n severity: 'error',\n },\n }\n }\n }\n\n // typeof input === 'object'\n return { parsed: input }\n}\n","// Network registry and CAIP-2 validation\n// REG-01: Known CAIP-2 network registry\n// REG-02: Format validation and registry lookup\n\nexport type NetworkType = 'evm' | 'solana' | 'stellar' | 'aptos'\n\nexport interface NetworkInfo {\n name: string\n type: NetworkType\n testnet: boolean\n}\n\n// CAIP-2 format: namespace:reference\n// Namespace: 3-8 lowercase alphanumeric + hyphens\n// Reference: 1-32 alphanumeric + hyphens + underscores\nexport const CAIP2_REGEX = /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$/\n\n// Known networks registry - extensible by adding entries\nexport const KNOWN_NETWORKS = {\n // EVM networks\n 'eip155:8453': { name: 'Base', type: 'evm', testnet: false },\n 'eip155:84532': { name: 'Base Sepolia', type: 'evm', testnet: true },\n 'eip155:43114': { name: 'Avalanche C-Chain', type: 'evm', testnet: false },\n 'eip155:43113': { name: 'Avalanche Fuji', type: 'evm', testnet: true },\n\n // Solana networks\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {\n name: 'Solana Mainnet',\n type: 'solana',\n testnet: false,\n },\n 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1': {\n name: 'Solana Devnet',\n type: 'solana',\n testnet: true,\n },\n 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z': {\n name: 'Solana Testnet',\n type: 'solana',\n testnet: true,\n },\n\n // Stellar networks\n 'stellar:pubnet': { name: 'Stellar Mainnet', type: 'stellar', testnet: false },\n 'stellar:testnet': { name: 'Stellar Testnet', type: 'stellar', testnet: true },\n\n // Aptos networks (community convention, not official CAIP)\n 'aptos:1': { name: 'Aptos Mainnet', type: 'aptos', testnet: false },\n 'aptos:2': { name: 'Aptos Testnet', type: 'aptos', testnet: true },\n} as const satisfies Record<string, NetworkInfo>\n\n// Validate CAIP-2 format (doesn't check registry)\nexport function isValidCaip2(value: string): boolean {\n return CAIP2_REGEX.test(value)\n}\n\n// Check if network exists in registry\nexport function isKnownNetwork(caip2: string): boolean {\n return caip2 in KNOWN_NETWORKS\n}\n\n// Get network info from registry\nexport function getNetworkInfo(caip2: string): NetworkInfo | undefined {\n return KNOWN_NETWORKS[caip2 as keyof typeof KNOWN_NETWORKS]\n}\n\n// Extract namespace from CAIP-2 identifier (e.g., \"eip155\" from \"eip155:8453\")\nexport function getNetworkNamespace(caip2: string): string | undefined {\n if (!isValidCaip2(caip2)) {\n return undefined\n }\n const colonIndex = caip2.indexOf(':')\n return colonIndex > 0 ? caip2.substring(0, colonIndex) : undefined\n}\n","// Asset registry for known tokens per network\n// REG-04: Known asset mapping\n// REG-05: Unknown asset handling\n\nimport { getNetworkNamespace } from './networks'\n\nexport interface AssetInfo {\n symbol: string\n name: string\n decimals: number\n}\n\n// Known assets by network and address\n// EVM addresses stored in lowercase for case-insensitive lookup\nexport const KNOWN_ASSETS = {\n // Base (eip155:8453)\n 'eip155:8453': {\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n\n // Base Sepolia (eip155:84532)\n 'eip155:84532': {\n '0x036cbd53842c5426634e7929541ec2318f3dcf7e': {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n\n // Avalanche C-Chain (eip155:43114)\n 'eip155:43114': {\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e': {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n\n // Solana Mainnet (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {\n EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n} as const satisfies Record<string, Record<string, AssetInfo>>\n\n// Check if asset exists in registry\nexport function isKnownAsset(network: string, address: string): boolean {\n const networkAssets = KNOWN_ASSETS[network as keyof typeof KNOWN_ASSETS]\n if (!networkAssets) {\n return false\n }\n\n // Use lowercase comparison for EVM networks\n const namespace = getNetworkNamespace(network)\n const lookupAddress = namespace === 'eip155' ? address.toLowerCase() : address\n\n return lookupAddress in networkAssets\n}\n\n// Get asset info from registry\nexport function getAssetInfo(network: string, address: string): AssetInfo | undefined {\n const networkAssets = KNOWN_ASSETS[network as keyof typeof KNOWN_ASSETS]\n if (!networkAssets) {\n return undefined\n }\n\n // Use lowercase comparison for EVM networks\n const namespace = getNetworkNamespace(network)\n const lookupAddress = namespace === 'eip155' ? address.toLowerCase() : address\n\n return networkAssets[lookupAddress as keyof typeof networkAssets]\n}\n","// Legacy chain name to CAIP-2 mapping\n// REG-03: Simple name conversion for fix suggestions and normalization\n\n// Maps lowercase simple names to canonical CAIP-2 identifiers\nexport const SIMPLE_NAME_TO_CAIP2 = {\n // Base networks\n base: 'eip155:8453',\n 'base-sepolia': 'eip155:84532',\n base_sepolia: 'eip155:84532',\n\n // Avalanche networks\n avalanche: 'eip155:43114',\n 'avalanche-fuji': 'eip155:43113',\n\n // Solana networks\n solana: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n 'solana-devnet': 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n 'solana-testnet': 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n\n // Stellar networks\n stellar: 'stellar:pubnet',\n 'stellar-testnet': 'stellar:testnet',\n\n // Aptos networks\n aptos: 'aptos:1',\n} as const satisfies Record<string, string>\n\n// Look up canonical CAIP-2 identifier from simple name (case-insensitive)\nexport function getCanonicalNetwork(name: string): string | undefined {\n const normalized = name.toLowerCase()\n return SIMPLE_NAME_TO_CAIP2[normalized as keyof typeof SIMPLE_NAME_TO_CAIP2]\n}\n","/**\n * Runtime type guards for config format detection\n */\n\nimport type { V2Config, V1Config } from '../types'\n\n/**\n * Check if value is a non-null, non-array object\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * Check if config has an accepts array\n */\nexport function hasAcceptsArray(config: Record<string, unknown>): boolean {\n return 'accepts' in config && Array.isArray(config.accepts)\n}\n\n/**\n * Type guard for v2 config\n * Checks for accepts array + x402Version: 2\n * Note: resource is required by spec but its absence is a validation error, not a detection failure\n */\nexport function isV2Config(value: unknown): value is V2Config {\n if (!isRecord(value)) return false\n if (!hasAcceptsArray(value)) return false\n return 'x402Version' in value && value.x402Version === 2\n}\n\n/**\n * Type guard for v1 config\n * Checks for accepts array + x402Version: 1\n */\nexport function isV1Config(value: unknown): value is V1Config {\n if (!isRecord(value)) return false\n if (!hasAcceptsArray(value)) return false\n return 'x402Version' in value && value.x402Version === 1\n}\n\n","/**\n * Format detection function\n * API-02: Detect config format from input\n */\n\nimport type { ConfigFormat } from '../types'\nimport { parseInput } from '../types'\nimport { isV2Config, isV1Config } from './guards'\n\n/**\n * Detect the format of an x402 config\n *\n * @param input - JSON string or parsed object\n * @returns ConfigFormat literal: 'v2' | 'v1' | 'unknown'\n *\n * Detection requires x402Version field:\n * 1. v2: accepts array + x402Version: 2\n * 2. v1: accepts array + x402Version: 1\n * 3. unknown: anything else (including versionless configs)\n */\nexport function detect(input: string | object): ConfigFormat {\n const { parsed, error } = parseInput(input)\n\n if (error) return 'unknown'\n\n if (isV2Config(parsed)) return 'v2'\n if (isV1Config(parsed)) return 'v1'\n\n return 'unknown'\n}\n","/**\n * Config normalization pipeline\n * API-03: Transform any config format to canonical v2 shape\n */\n\nimport type {\n NormalizedConfig,\n AcceptsEntry,\n ConfigFormat,\n V2Config,\n V1Config,\n} from '../types'\nimport { parseInput } from '../types'\nimport { detect } from './detect'\n\n/**\n * Normalize any x402 config format to canonical v2 shape\n *\n * @param input - JSON string or parsed object\n * @returns NormalizedConfig or null if format is unknown/invalid\n *\n * Normalization rules:\n * - v2: Pass through with new object (FMT-07)\n * - v1: Map maxAmountRequired → amount, lift per-entry resource (FMT-06)\n * - unknown: Return null\n *\n * All transformations preserve extensions and extra fields (FMT-08)\n */\nexport function normalize(input: string | object): NormalizedConfig | null {\n const { parsed, error } = parseInput(input)\n if (error) return null\n\n const format = detect(parsed as object)\n\n switch (format) {\n case 'v2':\n return normalizeV2(parsed as V2Config)\n case 'v1':\n return normalizeV1ToV2(parsed as V1Config)\n case 'unknown':\n return null\n default: {\n const _exhaustive: never = format\n return _exhaustive\n }\n }\n}\n\n/**\n * Normalize v2 config (pass-through with new object)\n * FMT-07: v2 configs are already canonical, just create new object\n */\nfunction normalizeV2(config: V2Config): NormalizedConfig {\n const result: NormalizedConfig = {\n x402Version: 2,\n accepts: [...config.accepts],\n resource: config.resource,\n }\n\n if (config.error !== undefined) {\n result.error = config.error\n }\n\n if (config.extensions !== undefined) {\n result.extensions = config.extensions\n }\n\n return result\n}\n\n/**\n * Normalize v1 config to v2\n * FMT-06: Map maxAmountRequired → amount, lift per-entry resource to top level\n */\nfunction normalizeV1ToV2(config: V1Config): NormalizedConfig {\n let topLevelResource: NormalizedConfig['resource'] = undefined\n\n const mappedAccepts: AcceptsEntry[] = config.accepts.map((entry) => {\n // Lift first resource to top level\n if (entry.resource && !topLevelResource) {\n topLevelResource = entry.resource\n }\n\n const mapped: AcceptsEntry = {\n scheme: entry.scheme,\n network: entry.network,\n amount: entry.maxAmountRequired,\n asset: entry.asset,\n payTo: entry.payTo,\n }\n\n if (entry.maxTimeoutSeconds !== undefined) {\n mapped.maxTimeoutSeconds = entry.maxTimeoutSeconds\n }\n\n if (entry.extra !== undefined) {\n mapped.extra = entry.extra\n }\n\n return mapped\n })\n\n const result: NormalizedConfig = {\n x402Version: 2,\n accepts: mappedAccepts,\n }\n\n if (topLevelResource !== undefined) {\n result.resource = topLevelResource\n }\n\n if (config.error !== undefined) {\n result.error = config.error\n }\n\n if (config.extensions !== undefined) {\n result.extensions = config.extensions\n }\n\n return result\n}\n\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n, title = '') {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >= 0, got ${n}`);\n }\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(value, length, title = '') {\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/** Asserts something is hash */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data, errorTitle = '') {\n if (typeof data === 'string')\n return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n/** Merges default options and passed options. */\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher(hashCons, info = {}) {\n const hashC = (msg, opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n const cr = typeof globalThis === 'object' ? globalThis.crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix) => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n//# sourceMappingURL=utils.js.map","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from \"./_u64.js\";\n// prettier-ignore\nimport { abytes, aexists, anumber, aoutput, clean, createHasher, oidNist, swap32IfBE, u32 } from \"./utils.js\";\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI = [];\nconst SHA3_ROTL = [];\nconst _SHA3_IOTA = []; // no pure annotation: var is always used\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n)\n t ^= _1n << ((_1n << BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s, rounds = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++)\n B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++)\n B[x] = s[y + x];\n for (let x = 0; x < 10; x++)\n s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n/** Keccak sponge function. */\nexport class Keccak {\n state;\n pos = 0;\n posOut = 0;\n finished = false;\n state32;\n destroyed = false;\n blockLen;\n suffix;\n outputLen;\n enableXOF = false;\n rounds;\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen, 'outputLen');\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone() {\n return this._cloneInto();\n }\n keccak() {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data) {\n aexists(this);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++)\n state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen)\n this.keccak();\n }\n return this;\n }\n finish() {\n if (this.finished)\n return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n writeInto(out) {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len;) {\n if (this.posOut >= blockLen)\n this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out) {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF)\n throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes) {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out) {\n aoutput(out, this);\n if (this.finished)\n throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to) {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\nconst genKeccak = (suffix, blockLen, outputLen, info = {}) => createHasher(() => new Keccak(blockLen, suffix, outputLen), info);\n/** SHA3-224 hash function. */\nexport const sha3_224 = /* @__PURE__ */ genKeccak(0x06, 144, 28, \n/* @__PURE__ */ oidNist(0x07));\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256 = /* @__PURE__ */ genKeccak(0x06, 136, 32, \n/* @__PURE__ */ oidNist(0x08));\n/** SHA3-384 hash function. */\nexport const sha3_384 = /* @__PURE__ */ genKeccak(0x06, 104, 48, \n/* @__PURE__ */ oidNist(0x09));\n/** SHA3-512 hash function. */\nexport const sha3_512 = /* @__PURE__ */ genKeccak(0x06, 72, 64, \n/* @__PURE__ */ oidNist(0x0a));\n/** keccak-224 hash function. */\nexport const keccak_224 = /* @__PURE__ */ genKeccak(0x01, 144, 28);\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256 = /* @__PURE__ */ genKeccak(0x01, 136, 32);\n/** keccak-384 hash function. */\nexport const keccak_384 = /* @__PURE__ */ genKeccak(0x01, 104, 48);\n/** keccak-512 hash function. */\nexport const keccak_512 = /* @__PURE__ */ genKeccak(0x01, 72, 64);\nconst genShake = (suffix, blockLen, outputLen, info = {}) => createHasher((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true), info);\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128 = \n/* @__PURE__ */\ngenShake(0x1f, 168, 16, /* @__PURE__ */ oidNist(0x0b));\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256 = \n/* @__PURE__ */\ngenShake(0x1f, 136, 32, /* @__PURE__ */ oidNist(0x0c));\n/** SHAKE128 XOF with 256-bit output (NIST version). */\nexport const shake128_32 = \n/* @__PURE__ */\ngenShake(0x1f, 168, 32, /* @__PURE__ */ oidNist(0x0b));\n/** SHAKE256 XOF with 512-bit output (NIST version). */\nexport const shake256_64 = \n/* @__PURE__ */\ngenShake(0x1f, 136, 64, /* @__PURE__ */ oidNist(0x0c));\n//# sourceMappingURL=sha3.js.map","/**\n * Keccak-256 hash function wrapper\n * Uses @noble/hashes for audited, tree-shakeable implementation\n */\n\nimport { keccak_256 } from '@noble/hashes/sha3.js'\n\n/**\n * Compute Keccak-256 hash (NOT SHA-3)\n *\n * @param input - String or Uint8Array to hash\n * @returns Lowercase hex string (64 chars, no 0x prefix)\n */\nexport function keccak256(input: string | Uint8Array): string {\n const bytes = typeof input === 'string'\n ? new TextEncoder().encode(input)\n : input\n\n const hash = keccak_256(bytes)\n\n return Array.from(hash)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('')\n}\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): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\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\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","/**\n * Base58 decoder wrapper\n * Uses @scure/base for audited, tree-shakeable implementation\n */\n\nimport { base58 } from '@scure/base'\n\n/**\n * Decode a Base58-encoded string to bytes\n *\n * Preserves leading zero bytes (represented as leading '1' characters)\n *\n * @param input - Base58 string\n * @returns Decoded bytes\n * @throws Error if input contains invalid Base58 characters\n */\nexport function decodeBase58(input: string): Uint8Array {\n try {\n return base58.decode(input)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`Invalid Base58: ${message}`)\n }\n}\n","/**\n * EIP-55 mixed-case checksum address encoding\n * Spec: https://eips.ethereum.org/EIPS/eip-55\n */\n\nimport { keccak256 } from './keccak256'\n\n/**\n * Convert an Ethereum address to EIP-55 checksummed format\n *\n * @param address - 42-character hex address (0x-prefixed)\n * @returns Checksummed address with mixed case\n */\nexport function toChecksumAddress(address: string): string {\n // Lowercase the hex part (strip 0x prefix)\n const lowerHex = address.slice(2).toLowerCase()\n\n // Hash the lowercase hex\n const hash = keccak256(lowerHex)\n\n // Build checksummed version\n let result = '0x'\n for (let i = 0; i < lowerHex.length; i++) {\n const char = lowerHex[i]\n const hashChar = hash[i]\n if (!char || !hashChar) continue // Should never happen with valid 40-char hex\n\n if (char >= 'a' && char <= 'f') {\n // For hex letters, uppercase if hash nibble >= 8\n const hashNibble = parseInt(hashChar, 16)\n result += hashNibble >= 8 ? char.toUpperCase() : char\n } else {\n // For digits, keep as-is\n result += char\n }\n }\n\n return result\n}\n\n/**\n * Check if an address has valid EIP-55 checksum\n *\n * Returns false for all-lowercase or all-uppercase addresses\n * (these are valid formats but do not match their checksummed version)\n *\n * @param address - Address to validate\n * @returns True if checksum is valid\n */\nexport function isValidChecksum(address: string): boolean {\n return address === toChecksumAddress(address)\n}\n","/**\n * EVM address validation with EIP-55 checksum verification\n */\n\nimport { toChecksumAddress, isValidChecksum } from '../crypto/eip55'\nimport { ErrorCode } from '../types/errors'\nimport type { ValidationIssue } from '../types/validation'\n\nconst EVM_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/\n\n/**\n * Validate an EVM address format and checksum\n *\n * Returns errors for invalid format, warnings for checksum issues\n *\n * @param address - Address to validate\n * @param field - Field path for error reporting\n * @returns Array of validation issues (empty if valid)\n */\nexport function validateEvmAddress(\n address: string,\n field: string\n): ValidationIssue[] {\n // Check basic format (0x + 40 hex chars)\n if (!EVM_ADDRESS_REGEX.test(address)) {\n return [\n {\n code: ErrorCode.INVALID_EVM_ADDRESS,\n field,\n message: 'EVM address must be 42 hex characters with 0x prefix',\n severity: 'error',\n fix: 'Format: 0x followed by 40 hex digits (0-9, a-f, A-F)',\n },\n ]\n }\n\n const hexPart = address.slice(2)\n\n // Check if all-lowercase (no checksum)\n // Only warn if there are actual letters (a-f) - all-digits addresses are fine\n if (address === address.toLowerCase() && /[a-f]/.test(hexPart)) {\n return [\n {\n code: ErrorCode.NO_EVM_CHECKSUM,\n field,\n message: 'EVM address is all-lowercase with no checksum protection',\n severity: 'warning',\n fix: `Use checksummed address to detect typos: ${toChecksumAddress(address)}`,\n },\n ]\n }\n\n // Check if all-uppercase (valid, no checksum info)\n // Only skip checksum verification if there are actual letters (A-F) - all-digits go through\n if (/^[0-9A-F]{40}$/.test(hexPart) && /[A-F]/.test(hexPart)) {\n // All-uppercase is valid and common, no warning needed\n return []\n }\n\n // If all digits (0-9 only), treat as valid - no checksum verification needed\n if (/^[0-9]{40}$/.test(hexPart)) {\n return []\n }\n\n // Mixed case - verify checksum\n if (!isValidChecksum(address)) {\n return [\n {\n code: ErrorCode.BAD_EVM_CHECKSUM,\n field,\n message: 'EVM address has invalid checksum (EIP-55)',\n severity: 'warning',\n fix: `Expected: ${toChecksumAddress(address)}`,\n },\n ]\n }\n\n // Valid checksummed address\n return []\n}\n","/**\n * Solana address validation (Base58 + 32-byte length)\n */\n\nimport { decodeBase58 } from '../crypto/base58'\nimport { ErrorCode } from '../types/errors'\nimport type { ValidationIssue } from '../types/validation'\n\n// Solana addresses are 32-44 Base58 characters\n// Base58 alphabet: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\n// (excludes 0, O, I, l to avoid confusion)\nconst SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/\n\n/**\n * Validate a Solana address (Base58 encoded public key)\n *\n * Checks Base58 format and verifies decoded length is exactly 32 bytes\n *\n * @param address - Address to validate\n * @param field - Field path for error reporting\n * @returns Array of validation issues (empty if valid)\n */\nexport function validateSolanaAddress(\n address: string,\n field: string\n): ValidationIssue[] {\n // Check Base58 format and length\n if (!SOLANA_ADDRESS_REGEX.test(address)) {\n return [\n {\n code: ErrorCode.INVALID_SOLANA_ADDRESS,\n field,\n message: 'Solana address must be 32-44 Base58 characters',\n severity: 'error',\n fix: 'Valid characters: 1-9, A-H, J-N, P-Z, a-k, m-z (no 0, O, I, l)',\n },\n ]\n }\n\n // Attempt to decode and verify byte length\n try {\n const decoded = decodeBase58(address)\n if (decoded.length !== 32) {\n return [\n {\n code: ErrorCode.INVALID_SOLANA_ADDRESS,\n field,\n message: `Solana address must decode to 32 bytes, got ${decoded.length}`,\n severity: 'error',\n fix: 'Verify address is a valid Solana public key',\n },\n ]\n }\n } catch (error) {\n return [\n {\n code: ErrorCode.INVALID_SOLANA_ADDRESS,\n field,\n message: 'Invalid Base58 encoding',\n severity: 'error',\n fix: error instanceof Error ? error.message : 'Check Base58 encoding',\n },\n ]\n }\n\n // Valid Solana address\n return []\n}\n","/**\n * Address validation with CAIP-2 namespace dispatch\n *\n * Dispatches to chain-specific validators based on network namespace\n */\n\nimport { getNetworkNamespace } from '../registries/networks'\nimport { validateEvmAddress } from './evm-address'\nimport { validateSolanaAddress } from './solana-address'\nimport type { ValidationIssue } from '../types/validation'\n\n/**\n * Validate an address for a specific network\n *\n * Dispatches to appropriate chain-specific validator based on CAIP-2 namespace:\n * - eip155:* → EVM address validation\n * - solana:* → Solana address validation\n * - stellar:*, aptos:* → Accept any string (deep validation deferred)\n * - Unknown namespaces → Accept any string (registry warnings handled elsewhere)\n *\n * Cross-chain mismatches are caught naturally by dispatch:\n * - EVM address (0x...) on Solana network → fails Solana Base58 validation\n * - Solana address on EVM network → fails EVM 0x-prefix validation\n *\n * @param address - Address to validate\n * @param network - CAIP-2 network identifier\n * @param field - Field path for error reporting\n * @returns Array of validation issues (empty if valid)\n */\nexport function validateAddress(\n address: string,\n network: string,\n field: string\n): ValidationIssue[] {\n const namespace = getNetworkNamespace(network)\n\n // Invalid CAIP-2 format - network errors handled elsewhere\n if (namespace === undefined) {\n return []\n }\n\n // Dispatch by namespace\n switch (namespace) {\n case 'eip155':\n return validateEvmAddress(address, field)\n\n case 'solana':\n return validateSolanaAddress(address, field)\n\n case 'stellar':\n case 'aptos':\n // Accept any address - deep validation deferred to future phases\n return []\n\n default:\n // Unknown namespace - warnings handled by registry validation\n return []\n }\n}\n","/**\n * Level 1: Structure validation\n * Validates JSON parse, object check, and format detection\n */\n\nimport type { ConfigFormat, ValidationIssue } from '../../types'\nimport { parseInput } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\nimport { isRecord } from '../../detection/guards'\nimport { detect } from '../../detection/detect'\n\n/**\n * Enriched result from structure validation.\n * The orchestrator needs the parsed object and detected format\n * in addition to any issues found.\n */\nexport interface StructureResult {\n parsed: object | null\n format: ConfigFormat\n issues: ValidationIssue[]\n}\n\n/**\n * Validate input structure: parse JSON, check object, detect format.\n *\n * @param input - Raw JSON string or object\n * @returns StructureResult with parsed object, detected format, and issues\n */\nexport function validateStructure(input: string | object): StructureResult {\n const issues: ValidationIssue[] = []\n\n // Step 1: Parse input\n const { parsed, error } = parseInput(input)\n\n if (error) {\n return { parsed: null, format: 'unknown', issues: [error] }\n }\n\n // Step 2: Check parsed value is a non-null, non-array object\n if (!isRecord(parsed)) {\n issues.push({\n code: ErrorCode.NOT_OBJECT,\n field: '$',\n message: ErrorMessages.NOT_OBJECT,\n severity: 'error',\n })\n return { parsed: null, format: 'unknown', issues }\n }\n\n // Step 3: Detect format\n const format = detect(parsed as object)\n\n if (format === 'unknown') {\n issues.push({\n code: ErrorCode.UNKNOWN_FORMAT,\n field: '$',\n message: ErrorMessages.UNKNOWN_FORMAT,\n severity: 'error',\n })\n }\n\n return { parsed: parsed as object, format, issues }\n}\n","/**\n * Level 2: Version validation\n * Validates x402Version presence and value\n */\n\nimport type { NormalizedConfig, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate x402Version field.\n *\n * Since normalize() always sets x402Version: 2, this mainly validates\n * the original format's version field. If somehow the value isn't 1 or 2,\n * push INVALID_VERSION error.\n *\n * Note: No MISSING_VERSION check needed here because normalize() always\n * sets it. The orchestrator handles version-related warnings for legacy\n * formats via the legacy rule module.\n *\n * @param config - Normalized config\n * @param _detectedFormat - Detected format (reserved for future use)\n * @returns Array of validation issues\n */\nexport function validateVersion(\n config: NormalizedConfig,\n _detectedFormat: ConfigFormat,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Cast to number for runtime safety: NormalizedConfig types x402Version as literal 2,\n // but at runtime the value could be anything if the input was malformed.\n const version = config.x402Version as number\n if (version !== 1 && version !== 2) {\n issues.push({\n code: ErrorCode.INVALID_VERSION,\n field: 'x402Version',\n message: ErrorMessages.INVALID_VERSION,\n severity: 'error',\n })\n }\n\n return issues\n}\n","/**\n * Level 3: Required field validation\n * Validates accepts array, required entry fields, and resource\n */\n\nimport type { AcceptsEntry, NormalizedConfig, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate required fields on a single accepts entry.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateFields(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (!entry.scheme) {\n issues.push({\n code: ErrorCode.MISSING_SCHEME,\n field: `${fieldPath}.scheme`,\n message: ErrorMessages.MISSING_SCHEME,\n severity: 'error',\n })\n }\n\n if (!entry.network) {\n issues.push({\n code: ErrorCode.MISSING_NETWORK,\n field: `${fieldPath}.network`,\n message: ErrorMessages.MISSING_NETWORK,\n severity: 'error',\n })\n }\n\n if (!entry.amount) {\n issues.push({\n code: ErrorCode.MISSING_AMOUNT,\n field: `${fieldPath}.amount`,\n message: ErrorMessages.MISSING_AMOUNT,\n severity: 'error',\n })\n }\n\n if (!entry.asset) {\n issues.push({\n code: ErrorCode.MISSING_ASSET,\n field: `${fieldPath}.asset`,\n message: ErrorMessages.MISSING_ASSET,\n severity: 'error',\n })\n }\n\n if (!entry.payTo) {\n issues.push({\n code: ErrorCode.MISSING_PAY_TO,\n field: `${fieldPath}.payTo`,\n message: ErrorMessages.MISSING_PAY_TO,\n severity: 'error',\n })\n }\n\n return issues\n}\n\n/**\n * Validate the accepts array itself (presence, type, emptiness).\n *\n * @param config - Normalized config\n * @returns Array of validation issues\n */\nexport function validateAccepts(config: NormalizedConfig): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (!Array.isArray(config.accepts)) {\n issues.push({\n code: ErrorCode.INVALID_ACCEPTS,\n field: 'accepts',\n message: ErrorMessages.INVALID_ACCEPTS,\n severity: 'error',\n })\n return issues\n }\n\n if (config.accepts.length === 0) {\n issues.push({\n code: ErrorCode.EMPTY_ACCEPTS,\n field: 'accepts',\n message: ErrorMessages.EMPTY_ACCEPTS,\n severity: 'error',\n })\n }\n\n return issues\n}\n\n/**\n * Validate resource object on normalized config.\n *\n * For v2 configs, resource is expected. Its absence is a warning, not an error,\n * since some v2 configs work without it.\n *\n * Also validates URL format via new URL() constructor (RULE-04).\n *\n * @param config - Normalized config\n * @param detectedFormat - Detected format\n * @returns Array of validation issues\n */\nexport function validateResource(\n config: NormalizedConfig,\n detectedFormat: ConfigFormat,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (!config.resource) {\n if (detectedFormat === 'v2') {\n issues.push({\n code: ErrorCode.MISSING_RESOURCE,\n field: 'resource',\n message: ErrorMessages.MISSING_RESOURCE,\n severity: 'warning',\n })\n }\n return issues\n }\n\n if (!config.resource.url) {\n issues.push({\n code: ErrorCode.MISSING_RESOURCE,\n field: 'resource.url',\n message: ErrorMessages.MISSING_RESOURCE,\n severity: 'warning',\n })\n return issues\n }\n\n // URL format validation (RULE-04): advisory check via new URL() constructor\n try {\n new URL(config.resource.url)\n } catch {\n issues.push({\n code: ErrorCode.INVALID_URL,\n field: 'resource.url',\n message: 'resource.url is not a valid URL format',\n severity: 'warning',\n })\n }\n\n return issues\n}\n","/**\n * Level 4: Network and asset validation\n * Validates CAIP-2 format, known networks, and known assets\n */\n\nimport type { AcceptsEntry, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\nimport { isValidCaip2, isKnownNetwork } from '../../registries/networks'\nimport { getCanonicalNetwork } from '../../registries/simple-names'\nimport { isKnownAsset } from '../../registries/assets'\n\n/**\n * Validate network field on a single accepts entry.\n *\n * Checks CAIP-2 format and known network registry. Provides fix\n * suggestions for simple chain names that have canonical CAIP-2 mappings.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateNetwork(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Missing field already caught by validateFields\n if (!entry.network) {\n return issues\n }\n\n if (!isValidCaip2(entry.network)) {\n // Check if this is a simple name with a canonical CAIP-2 mapping\n const canonical = getCanonicalNetwork(entry.network)\n\n if (canonical) {\n issues.push({\n code: ErrorCode.INVALID_NETWORK_FORMAT,\n field: `${fieldPath}.network`,\n message: ErrorMessages.INVALID_NETWORK_FORMAT,\n severity: 'error',\n fix: `Use '${canonical}' instead of '${entry.network}'`,\n })\n } else {\n issues.push({\n code: ErrorCode.INVALID_NETWORK_FORMAT,\n field: `${fieldPath}.network`,\n message: ErrorMessages.INVALID_NETWORK_FORMAT,\n severity: 'error',\n })\n }\n\n return issues\n }\n\n // Valid CAIP-2 format but not in known registry\n if (!isKnownNetwork(entry.network)) {\n issues.push({\n code: ErrorCode.UNKNOWN_NETWORK,\n field: `${fieldPath}.network`,\n message: ErrorMessages.UNKNOWN_NETWORK,\n severity: 'warning',\n })\n }\n\n return issues\n}\n\n/**\n * Validate asset field on a single accepts entry.\n *\n * Checks if the asset is known for the given network. Only checks\n * when both network and asset are present and network is valid.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateAsset(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Missing field already caught by validateFields\n if (!entry.asset) {\n return issues\n }\n\n // Only check known assets when the network is valid CAIP-2\n if (entry.network && isValidCaip2(entry.network) && !isKnownAsset(entry.network, entry.asset)) {\n issues.push({\n code: ErrorCode.UNKNOWN_ASSET,\n field: `${fieldPath}.asset`,\n message: ErrorMessages.UNKNOWN_ASSET,\n severity: 'warning',\n })\n }\n\n return issues\n}\n","/**\n * Level 4: Amount and timeout validation\n * Validates numeric string amounts and timeout values\n */\n\nimport type { AcceptsEntry, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate amount field on a single accepts entry.\n *\n * Amount must be a digit-only string (no decimals, signs, or scientific notation)\n * and must be greater than zero.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateAmount(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Missing field already caught by validateFields\n if (!entry.amount) {\n return issues\n }\n\n // Amount must be digits only (atomic units)\n if (!/^\\d+$/.test(entry.amount)) {\n issues.push({\n code: ErrorCode.INVALID_AMOUNT,\n field: `${fieldPath}.amount`,\n message: ErrorMessages.INVALID_AMOUNT,\n severity: 'error',\n })\n return issues\n }\n\n // Zero amount check\n if (entry.amount === '0') {\n issues.push({\n code: ErrorCode.ZERO_AMOUNT,\n field: `${fieldPath}.amount`,\n message: ErrorMessages.ZERO_AMOUNT,\n severity: 'error',\n })\n }\n\n return issues\n}\n\n/**\n * Validate maxTimeoutSeconds on a single accepts entry.\n *\n * For v2 format, missing timeout produces a warning.\n * When present, timeout must be a positive integer (RULE-10).\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @param detectedFormat - Detected config format\n * @returns Array of validation issues\n */\nexport function validateTimeout(\n entry: AcceptsEntry,\n fieldPath: string,\n detectedFormat: ConfigFormat,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (entry.maxTimeoutSeconds === undefined) {\n if (detectedFormat === 'v2') {\n issues.push({\n code: ErrorCode.MISSING_MAX_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.MISSING_MAX_TIMEOUT,\n severity: 'warning',\n })\n }\n return issues\n }\n\n // Timeout value validation (RULE-10): must be a positive integer\n if (typeof entry.maxTimeoutSeconds !== 'number') {\n issues.push({\n code: ErrorCode.INVALID_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.INVALID_TIMEOUT,\n severity: 'error',\n })\n return issues\n }\n\n if (!Number.isInteger(entry.maxTimeoutSeconds)) {\n issues.push({\n code: ErrorCode.INVALID_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.INVALID_TIMEOUT,\n severity: 'error',\n })\n return issues\n }\n\n if (entry.maxTimeoutSeconds <= 0) {\n issues.push({\n code: ErrorCode.INVALID_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.INVALID_TIMEOUT,\n severity: 'error',\n })\n }\n\n return issues\n}\n","/**\n * Level 5: Legacy format validation\n * Produces warnings for legacy config formats with upgrade suggestions\n */\n\nimport type { NormalizedConfig, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate for legacy format usage and produce upgrade suggestions.\n *\n * @param _config - Normalized config (reserved for future use)\n * @param detectedFormat - Detected config format\n * @param _originalInput - Original input object (reserved for future use)\n * @returns Array of validation issues (warnings)\n */\nexport function validateLegacy(\n _config: NormalizedConfig,\n detectedFormat: ConfigFormat,\n _originalInput: object,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (detectedFormat === 'v1') {\n issues.push({\n code: ErrorCode.LEGACY_FORMAT,\n field: '$',\n message: ErrorMessages.LEGACY_FORMAT,\n severity: 'warning',\n fix: 'Upgrade to x402 v2 -- use amount instead of maxAmountRequired, add resource object',\n })\n }\n\n return issues\n}\n","/**\n * Validation orchestrator\n * Composes all rule modules into a single validation pipeline\n *\n * Pipeline: parse -> detect -> normalize -> validate rules -> collect issues -> strict mode\n */\n\nimport type { ValidationResult, ValidationIssue } from '../types/validation'\nimport type { NormalizedConfig } from '../types/config'\nimport { ErrorCode, ErrorMessages } from '../types/errors'\nimport { normalize } from '../detection/normalize'\nimport { validateAddress } from './address'\nimport {\n validateStructure,\n validateVersion,\n validateFields,\n validateAccepts,\n validateResource,\n validateNetwork,\n validateAsset,\n validateAmount,\n validateTimeout,\n validateLegacy,\n} from './rules'\n\n/**\n * Options for the validate() orchestrator\n */\nexport interface ValidationOptions {\n /** When true, all warnings are promoted to errors */\n strict?: boolean | undefined\n}\n\n/**\n * Validate an x402 config through the full pipeline.\n *\n * Takes any input (JSON string or object), runs it through:\n * 1. Structure validation (parse, object check, format detection)\n * 2. Normalization to canonical v2 shape\n * 3. Version, accepts, resource validation\n * 4. Per-entry field, network, asset, amount, timeout, address validation\n * 5. Legacy format warnings\n * 6. Strict mode promotion (warnings -> errors)\n *\n * NEVER throws -- all invalid inputs produce structured error results.\n *\n * @param input - JSON string or parsed object to validate\n * @param options - Validation options (e.g. strict mode)\n * @returns Structured validation result\n */\nexport function validate(\n input: string | object,\n options?: ValidationOptions | undefined,\n): ValidationResult {\n try {\n return runPipeline(input, options)\n } catch {\n // Safety net: validate() must never throw\n return {\n valid: false,\n version: 'unknown',\n errors: [\n {\n code: ErrorCode.UNKNOWN_FORMAT,\n field: '$',\n message: 'Unexpected validation error',\n severity: 'error',\n },\n ],\n warnings: [],\n normalized: null,\n }\n }\n}\n\n/**\n * Internal pipeline implementation.\n * Separated from validate() so the try/catch safety net is clean.\n */\nfunction runPipeline(\n input: string | object,\n options: ValidationOptions | undefined,\n): ValidationResult {\n // ── Level 1: Structure ──────────────────────────────────────────────\n const structure = validateStructure(input)\n\n if (structure.issues.length > 0) {\n return {\n valid: false,\n version: structure.format || 'unknown',\n errors: structure.issues,\n warnings: [],\n normalized: null,\n }\n }\n\n const parsed = structure.parsed as object\n const format = structure.format\n\n // ── Normalize ───────────────────────────────────────────────────────\n const normalized: NormalizedConfig | null = normalize(parsed)\n\n if (normalized === null) {\n return {\n valid: false,\n version: format,\n errors: [\n {\n code: ErrorCode.UNKNOWN_FORMAT,\n field: '$',\n message: ErrorMessages.UNKNOWN_FORMAT,\n severity: 'error',\n },\n ],\n warnings: [],\n normalized: null,\n }\n }\n\n // ── Collect Issues ──────────────────────────────────────────────────\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n // ── Level 2: Version ────────────────────────────────────────────────\n errors.push(...validateVersion(normalized, format))\n\n // ── Level 2: Accepts ────────────────────────────────────────────────\n errors.push(...validateAccepts(normalized))\n\n // ── Level 2: Resource ───────────────────────────────────────────────\n warnings.push(...validateResource(normalized, format))\n\n // ── Levels 3-4: Per-entry validation ────────────────────────────────\n if (Array.isArray(normalized.accepts) && normalized.accepts.length > 0) {\n for (let i = 0; i < normalized.accepts.length; i++) {\n const entry = normalized.accepts[i]!\n const fieldPath = `accepts[${i}]`\n\n // Fields (errors)\n errors.push(...validateFields(entry, fieldPath))\n\n // Network (mixed: errors and warnings by severity)\n for (const issue of validateNetwork(entry, fieldPath)) {\n if (issue.severity === 'error') {\n errors.push(issue)\n } else {\n warnings.push(issue)\n }\n }\n\n // Asset (warnings)\n warnings.push(...validateAsset(entry, fieldPath))\n\n // Amount (errors)\n errors.push(...validateAmount(entry, fieldPath))\n\n // Timeout (mixed: errors and warnings by severity)\n for (const issue of validateTimeout(entry, fieldPath, format)) {\n if (issue.severity === 'error') {\n errors.push(issue)\n } else {\n warnings.push(issue)\n }\n }\n\n // Address validation (dispatch by severity)\n if (entry.payTo && entry.network) {\n for (const issue of validateAddress(entry.payTo, entry.network, `${fieldPath}.payTo`)) {\n if (issue.severity === 'error') {\n errors.push(issue)\n } else {\n warnings.push(issue)\n }\n }\n }\n }\n }\n\n // ── Level 5: Legacy ─────────────────────────────────────────────────\n warnings.push(...validateLegacy(normalized, format, parsed))\n\n // ── Strict Mode ─────────────────────────────────────────────────────\n if (options?.strict === true) {\n for (const warning of warnings) {\n errors.push({ ...warning, severity: 'error' })\n }\n warnings.length = 0\n }\n\n // ── Return ──────────────────────────────────────────────────────────\n return {\n valid: errors.length === 0,\n version: format,\n errors,\n warnings,\n normalized,\n }\n}\n","/**\n * HTTP config extraction\n *\n * Extracts x402 payment configs from HTTP 402 responses.\n * Handles body-first extraction with PAYMENT-REQUIRED header fallback.\n */\n\n/**\n * Where the config was found\n */\nexport type ExtractionSource = 'body' | 'header'\n\n/**\n * Result of extracting a config from an HTTP response\n */\nexport interface ExtractionResult {\n config: object | null\n source: ExtractionSource | null\n error: string | null\n}\n\n/**\n * Minimal response shape — works with fetch Response, plain objects, etc.\n */\nexport interface ResponseLike {\n body?: unknown\n headers?: Record<string, string> | Headers\n}\n\n/**\n * Get a header value, case-insensitive.\n * Supports both Headers objects and plain Record<string, string>.\n */\nfunction getHeader(\n headers: Record<string, string> | Headers | undefined,\n name: string,\n): string | null {\n if (!headers) return null\n\n // Headers object (fetch API)\n if (typeof (headers as Headers).get === 'function') {\n return (headers as Headers).get(name)\n }\n\n // Plain object — case-insensitive lookup\n const lower = name.toLowerCase()\n for (const key of Object.keys(headers as Record<string, string>)) {\n if (key.toLowerCase() === lower) {\n return (headers as Record<string, string>)[key]!\n }\n }\n return null\n}\n\n/**\n * Decode base64 string to UTF-8 text.\n * Works in both browser (atob) and Node (Buffer).\n */\nfunction decodeBase64(encoded: string): string {\n if (typeof atob === 'function') {\n return atob(encoded)\n }\n // Node.js fallback\n return Buffer.from(encoded, 'base64').toString('utf-8')\n}\n\n/**\n * Check if a parsed object looks like it contains x402 config fields.\n */\nfunction hasX402Fields(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') return false\n const rec = obj as Record<string, unknown>\n return !!(rec.accepts || rec.payTo || rec.x402Version)\n}\n\n/**\n * Try to parse the PAYMENT-REQUIRED header value as a base64-encoded JSON config.\n */\nfunction tryHeaderExtraction(\n headers: Record<string, string> | Headers | undefined,\n): { config: object; source: 'header' } | null {\n const headerValue = getHeader(headers, 'payment-required')\n if (!headerValue) return null\n\n // Try base64 decode first\n try {\n const decoded = decodeBase64(headerValue)\n const parsed = JSON.parse(decoded) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { config: parsed as object, source: 'header' }\n }\n } catch {\n // Not valid base64 JSON\n }\n\n // Try raw JSON (some implementations don't base64-encode)\n try {\n const parsed = JSON.parse(headerValue) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { config: parsed as object, source: 'header' }\n }\n } catch {\n // Not valid JSON either\n }\n\n return null\n}\n\n/**\n * Extract an x402 config from an HTTP 402 response.\n *\n * Extraction priority:\n * 1. JSON body — if it parses and has x402 fields (accepts, payTo, x402Version)\n * 2. PAYMENT-REQUIRED header — base64-decoded JSON fallback\n *\n * Never throws. Returns structured result with error message on failure.\n *\n * @param response - Response-like object with body and/or headers\n * @returns Extraction result with config, source, and error\n */\nexport function extractConfig(response: ResponseLike): ExtractionResult {\n // Try body first\n const body = response.body\n if (body && typeof body === 'object' && !Array.isArray(body) && hasX402Fields(body)) {\n return { config: body as object, source: 'body', error: null }\n }\n\n // Try string body (JSON string)\n if (typeof body === 'string' && body.trim()) {\n try {\n const parsed = JSON.parse(body) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed) && hasX402Fields(parsed)) {\n return { config: parsed as object, source: 'body', error: null }\n }\n } catch {\n // Body is not valid JSON, fall through to header\n }\n }\n\n // Fallback to PAYMENT-REQUIRED header\n const headerResult = tryHeaderExtraction(response.headers)\n if (headerResult) {\n return { config: headerResult.config, source: headerResult.source, error: null }\n }\n\n return {\n config: null,\n source: null,\n error: 'No x402 config found in response body or PAYMENT-REQUIRED header',\n }\n}\n","// x402check SDK - entry point\n// Named exports only (no default) for IIFE compatibility\n\n// Re-export types (Phase 6 Plan 01)\nexport * from './types'\n\n// Re-export registries (Phase 6 Plan 03)\nexport * from './registries'\n\n// Re-export detection (Phase 6 Plan 02)\nexport { detect, normalize } from './detection'\n\n// Re-export crypto primitives (Phase 7 Plan 01)\nexport * from './crypto'\n\n// Re-export validation utilities (Phase 7 Plan 02)\nexport { validateAddress, validateEvmAddress, validateSolanaAddress } from './validation'\n\n// Re-export validation orchestrator (Phase 8)\nexport { validate } from './validation'\nexport type { ValidationOptions } from './validation'\n\n// Re-export HTTP config extraction\nexport { extractConfig } from './extraction'\nexport type { ExtractionResult, ExtractionSource, ResponseLike } from './extraction'\n\n// Version constant\nexport const VERSION = '0.1.0' as const\n"],"x_google_ignoreList":[8,9,10,12],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["isBytes","anumber","abytes","hasHexBuiltin","normalize"],"sources":["../src/types/errors.ts","../src/types/parse-input.ts","../src/registries/networks.ts","../src/registries/assets.ts","../src/registries/simple-names.ts","../src/detection/guards.ts","../src/detection/detect.ts","../src/detection/normalize.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/_u64.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/utils.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/sha3.js","../src/crypto/keccak256.ts","../../../node_modules/.pnpm/@scure+base@2.0.0/node_modules/@scure/base/index.ts","../src/crypto/base58.ts","../src/crypto/eip55.ts","../src/validation/evm-address.ts","../src/validation/solana-address.ts","../src/validation/address.ts","../src/validation/rules/structure.ts","../src/validation/rules/version.ts","../src/validation/rules/fields.ts","../src/validation/rules/network.ts","../src/validation/rules/amount.ts","../src/validation/rules/legacy.ts","../src/validation/rules/extensions.ts","../src/validation/orchestrator.ts","../src/extraction/extract.ts","../src/check.ts","../src/index.ts"],"sourcesContent":["/**\n * Error and warning code vocabulary for x402check\n */\n\nexport const ErrorCode = {\n // Structure errors\n INVALID_JSON: 'INVALID_JSON',\n NOT_OBJECT: 'NOT_OBJECT',\n UNKNOWN_FORMAT: 'UNKNOWN_FORMAT',\n\n // Version errors\n MISSING_VERSION: 'MISSING_VERSION',\n INVALID_VERSION: 'INVALID_VERSION',\n\n // Accepts errors\n MISSING_ACCEPTS: 'MISSING_ACCEPTS',\n EMPTY_ACCEPTS: 'EMPTY_ACCEPTS',\n INVALID_ACCEPTS: 'INVALID_ACCEPTS',\n\n // Field errors\n MISSING_SCHEME: 'MISSING_SCHEME',\n MISSING_NETWORK: 'MISSING_NETWORK',\n INVALID_NETWORK_FORMAT: 'INVALID_NETWORK_FORMAT',\n MISSING_AMOUNT: 'MISSING_AMOUNT',\n INVALID_AMOUNT: 'INVALID_AMOUNT',\n ZERO_AMOUNT: 'ZERO_AMOUNT',\n MISSING_ASSET: 'MISSING_ASSET',\n MISSING_PAY_TO: 'MISSING_PAY_TO',\n MISSING_RESOURCE: 'MISSING_RESOURCE',\n INVALID_URL: 'INVALID_URL',\n INVALID_TIMEOUT: 'INVALID_TIMEOUT',\n\n // Address errors (codes only, validation is Phase 7)\n INVALID_EVM_ADDRESS: 'INVALID_EVM_ADDRESS',\n BAD_EVM_CHECKSUM: 'BAD_EVM_CHECKSUM',\n NO_EVM_CHECKSUM: 'NO_EVM_CHECKSUM',\n INVALID_SOLANA_ADDRESS: 'INVALID_SOLANA_ADDRESS',\n ADDRESS_NETWORK_MISMATCH: 'ADDRESS_NETWORK_MISMATCH',\n\n // Extension / schema warnings\n INVALID_BAZAAR_INFO: 'INVALID_BAZAAR_INFO',\n INVALID_BAZAAR_SCHEMA: 'INVALID_BAZAAR_SCHEMA',\n INVALID_BAZAAR_INFO_INPUT: 'INVALID_BAZAAR_INFO_INPUT',\n INVALID_OUTPUT_SCHEMA: 'INVALID_OUTPUT_SCHEMA',\n INVALID_OUTPUT_SCHEMA_INPUT: 'INVALID_OUTPUT_SCHEMA_INPUT',\n MISSING_INPUT_SCHEMA: 'MISSING_INPUT_SCHEMA',\n\n // Warning codes\n UNKNOWN_NETWORK: 'UNKNOWN_NETWORK',\n UNKNOWN_ASSET: 'UNKNOWN_ASSET',\n LEGACY_FORMAT: 'LEGACY_FORMAT',\n MISSING_MAX_TIMEOUT: 'MISSING_MAX_TIMEOUT',\n} as const\n\nexport type ErrorCode = typeof ErrorCode[keyof typeof ErrorCode]\n\n/**\n * Human-readable error messages for all error codes\n */\nexport const ErrorMessages = {\n // Structure errors\n INVALID_JSON: 'Input is not valid JSON',\n NOT_OBJECT: 'Input must be an object',\n UNKNOWN_FORMAT: 'Missing required x402Version field (must be 1 or 2)',\n\n // Version errors\n MISSING_VERSION: 'Missing required field: x402Version',\n INVALID_VERSION: 'Invalid x402Version value (must be 1 or 2)',\n\n // Accepts errors\n MISSING_ACCEPTS: 'Missing required field: accepts',\n EMPTY_ACCEPTS: 'accepts array cannot be empty',\n INVALID_ACCEPTS: 'accepts must be an array',\n\n // Field errors\n MISSING_SCHEME: 'Missing required field: scheme',\n MISSING_NETWORK: 'Missing required field: network',\n INVALID_NETWORK_FORMAT: 'Network must use CAIP-2 format (namespace:reference), e.g. eip155:8453',\n MISSING_AMOUNT: 'Missing required field: amount',\n INVALID_AMOUNT: 'Amount must be a numeric string in atomic units',\n ZERO_AMOUNT: 'Amount must be greater than zero',\n MISSING_ASSET: 'Missing required field: asset',\n MISSING_PAY_TO: 'Missing required field: payTo',\n MISSING_RESOURCE: 'Missing required field: resource',\n INVALID_URL: 'resource.url is not a valid URL format',\n INVALID_TIMEOUT: 'maxTimeoutSeconds must be a positive integer',\n\n // Address errors\n INVALID_EVM_ADDRESS: 'Invalid EVM address format',\n BAD_EVM_CHECKSUM: 'EVM address has invalid checksum',\n NO_EVM_CHECKSUM: 'EVM address is all-lowercase with no checksum protection',\n INVALID_SOLANA_ADDRESS: 'Invalid Solana address format',\n ADDRESS_NETWORK_MISMATCH: 'Address format does not match network type',\n\n // Extension / schema warnings\n INVALID_BAZAAR_INFO: 'extensions.bazaar.info must be an object with input and output',\n INVALID_BAZAAR_SCHEMA: 'extensions.bazaar.schema must be a valid JSON Schema object',\n INVALID_BAZAAR_INFO_INPUT: 'extensions.bazaar.info.input must include type and method',\n INVALID_OUTPUT_SCHEMA: 'accepts[i].outputSchema must be an object with input and output',\n INVALID_OUTPUT_SCHEMA_INPUT: 'accepts[i].outputSchema.input must include type and method',\n MISSING_INPUT_SCHEMA: 'No input schema found (no bazaar extension or outputSchema) -- consider adding one so agents know how to call your API',\n\n // Warnings\n UNKNOWN_NETWORK: 'Network is not in the known registry -- config may still work but cannot be fully validated',\n UNKNOWN_ASSET: 'Asset is not in the known registry -- config may still work but cannot be fully validated',\n LEGACY_FORMAT: 'Config uses legacy flat format -- consider upgrading to x402 v2',\n MISSING_MAX_TIMEOUT: 'Consider adding maxTimeoutSeconds for better security',\n} satisfies Record<ErrorCode, string>\n","import { ErrorCode, ErrorMessages } from './errors'\nimport type { ParsedInput } from './validation'\n\n/**\n * Parse input that may be either a JSON string or an object\n * API-04: Accept string | object\n */\nexport function parseInput(input: string | object): ParsedInput {\n if (typeof input === 'string') {\n try {\n const parsed = JSON.parse(input)\n return { parsed }\n } catch {\n return {\n parsed: null,\n error: {\n code: ErrorCode.INVALID_JSON,\n field: '$',\n message: ErrorMessages.INVALID_JSON,\n severity: 'error',\n },\n }\n }\n }\n\n // typeof input === 'object'\n return { parsed: input }\n}\n","// Network registry and CAIP-2 validation\n// REG-01: Known CAIP-2 network registry\n// REG-02: Format validation and registry lookup\n\nexport type NetworkType = 'evm' | 'solana' | 'stellar' | 'aptos'\n\nexport interface NetworkInfo {\n name: string\n type: NetworkType\n testnet: boolean\n}\n\n// CAIP-2 format: namespace:reference\n// Namespace: 3-8 lowercase alphanumeric + hyphens\n// Reference: 1-32 alphanumeric + hyphens + underscores\nexport const CAIP2_REGEX = /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$/\n\n// Known networks registry - extensible by adding entries\nexport const KNOWN_NETWORKS = {\n // EVM networks\n 'eip155:8453': { name: 'Base', type: 'evm', testnet: false },\n 'eip155:84532': { name: 'Base Sepolia', type: 'evm', testnet: true },\n 'eip155:43114': { name: 'Avalanche C-Chain', type: 'evm', testnet: false },\n 'eip155:43113': { name: 'Avalanche Fuji', type: 'evm', testnet: true },\n\n // Solana networks\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {\n name: 'Solana Mainnet',\n type: 'solana',\n testnet: false,\n },\n 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1': {\n name: 'Solana Devnet',\n type: 'solana',\n testnet: true,\n },\n 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z': {\n name: 'Solana Testnet',\n type: 'solana',\n testnet: true,\n },\n\n // Stellar networks\n 'stellar:pubnet': { name: 'Stellar Mainnet', type: 'stellar', testnet: false },\n 'stellar:testnet': { name: 'Stellar Testnet', type: 'stellar', testnet: true },\n\n // Aptos networks (community convention, not official CAIP)\n 'aptos:1': { name: 'Aptos Mainnet', type: 'aptos', testnet: false },\n 'aptos:2': { name: 'Aptos Testnet', type: 'aptos', testnet: true },\n} as const satisfies Record<string, NetworkInfo>\n\n// Validate CAIP-2 format (doesn't check registry)\nexport function isValidCaip2(value: string): boolean {\n return CAIP2_REGEX.test(value)\n}\n\n// Check if network exists in registry\nexport function isKnownNetwork(caip2: string): boolean {\n return caip2 in KNOWN_NETWORKS\n}\n\n// Get network info from registry\nexport function getNetworkInfo(caip2: string): NetworkInfo | undefined {\n return KNOWN_NETWORKS[caip2 as keyof typeof KNOWN_NETWORKS]\n}\n\n// Extract namespace from CAIP-2 identifier (e.g., \"eip155\" from \"eip155:8453\")\nexport function getNetworkNamespace(caip2: string): string | undefined {\n if (!isValidCaip2(caip2)) {\n return undefined\n }\n const colonIndex = caip2.indexOf(':')\n return colonIndex > 0 ? caip2.substring(0, colonIndex) : undefined\n}\n","// Asset registry for known tokens per network\n// REG-04: Known asset mapping\n// REG-05: Unknown asset handling\n\nimport { getNetworkNamespace } from './networks'\n\nexport interface AssetInfo {\n symbol: string\n name: string\n decimals: number\n}\n\n// Known assets by network and address\n// EVM addresses stored in lowercase for case-insensitive lookup\nexport const KNOWN_ASSETS = {\n // Base (eip155:8453)\n 'eip155:8453': {\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n\n // Base Sepolia (eip155:84532)\n 'eip155:84532': {\n '0x036cbd53842c5426634e7929541ec2318f3dcf7e': {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n\n // Avalanche C-Chain (eip155:43114)\n 'eip155:43114': {\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e': {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n\n // Solana Mainnet (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {\n EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n },\n },\n} as const satisfies Record<string, Record<string, AssetInfo>>\n\n// Check if asset exists in registry\nexport function isKnownAsset(network: string, address: string): boolean {\n const networkAssets = KNOWN_ASSETS[network as keyof typeof KNOWN_ASSETS]\n if (!networkAssets) {\n return false\n }\n\n // Use lowercase comparison for EVM networks\n const namespace = getNetworkNamespace(network)\n const lookupAddress = namespace === 'eip155' ? address.toLowerCase() : address\n\n return lookupAddress in networkAssets\n}\n\n// Get asset info from registry\nexport function getAssetInfo(network: string, address: string): AssetInfo | undefined {\n const networkAssets = KNOWN_ASSETS[network as keyof typeof KNOWN_ASSETS]\n if (!networkAssets) {\n return undefined\n }\n\n // Use lowercase comparison for EVM networks\n const namespace = getNetworkNamespace(network)\n const lookupAddress = namespace === 'eip155' ? address.toLowerCase() : address\n\n return networkAssets[lookupAddress as keyof typeof networkAssets]\n}\n","// Legacy chain name to CAIP-2 mapping\n// REG-03: Simple name conversion for fix suggestions and normalization\n\n// Maps lowercase simple names to canonical CAIP-2 identifiers\nexport const SIMPLE_NAME_TO_CAIP2 = {\n // Base networks\n base: 'eip155:8453',\n 'base-sepolia': 'eip155:84532',\n base_sepolia: 'eip155:84532',\n\n // Avalanche networks\n avalanche: 'eip155:43114',\n 'avalanche-fuji': 'eip155:43113',\n\n // Solana networks\n solana: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n 'solana-devnet': 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n 'solana-testnet': 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n\n // Stellar networks\n stellar: 'stellar:pubnet',\n 'stellar-testnet': 'stellar:testnet',\n\n // Aptos networks\n aptos: 'aptos:1',\n} as const satisfies Record<string, string>\n\n// Look up canonical CAIP-2 identifier from simple name (case-insensitive)\nexport function getCanonicalNetwork(name: string): string | undefined {\n const normalized = name.toLowerCase()\n return SIMPLE_NAME_TO_CAIP2[normalized as keyof typeof SIMPLE_NAME_TO_CAIP2]\n}\n","/**\n * Runtime type guards for config format detection\n */\n\nimport type { V2Config, V1Config } from '../types'\n\n/**\n * Check if value is a non-null, non-array object\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * Check if config has an accepts array\n */\nexport function hasAcceptsArray(config: Record<string, unknown>): boolean {\n return 'accepts' in config && Array.isArray(config.accepts)\n}\n\n/**\n * Type guard for v2 config\n * Checks for accepts array + x402Version: 2\n * Note: resource is required by spec but its absence is a validation error, not a detection failure\n */\nexport function isV2Config(value: unknown): value is V2Config {\n if (!isRecord(value)) return false\n if (!hasAcceptsArray(value)) return false\n return 'x402Version' in value && value.x402Version === 2\n}\n\n/**\n * Type guard for v1 config\n * Checks for accepts array + x402Version: 1\n */\nexport function isV1Config(value: unknown): value is V1Config {\n if (!isRecord(value)) return false\n if (!hasAcceptsArray(value)) return false\n return 'x402Version' in value && value.x402Version === 1\n}\n\n","/**\n * Format detection function\n * API-02: Detect config format from input\n */\n\nimport type { ConfigFormat } from '../types'\nimport { parseInput } from '../types'\nimport { isV2Config, isV1Config } from './guards'\n\n/**\n * Detect the format of an x402 config\n *\n * @param input - JSON string or parsed object\n * @returns ConfigFormat literal: 'v2' | 'v1' | 'unknown'\n *\n * Detection requires x402Version field:\n * 1. v2: accepts array + x402Version: 2\n * 2. v1: accepts array + x402Version: 1\n * 3. unknown: anything else (including versionless configs)\n */\nexport function detect(input: string | object): ConfigFormat {\n const { parsed, error } = parseInput(input)\n\n if (error) return 'unknown'\n\n if (isV2Config(parsed)) return 'v2'\n if (isV1Config(parsed)) return 'v1'\n\n return 'unknown'\n}\n","/**\n * Config normalization pipeline\n * API-03: Transform any config format to canonical v2 shape\n */\n\nimport type {\n NormalizedConfig,\n AcceptsEntry,\n ConfigFormat,\n V2Config,\n V1Config,\n} from '../types'\nimport { parseInput } from '../types'\nimport { detect } from './detect'\n\n/**\n * Normalize any x402 config format to canonical v2 shape\n *\n * @param input - JSON string or parsed object\n * @returns NormalizedConfig or null if format is unknown/invalid\n *\n * Normalization rules:\n * - v2: Pass through with new object (FMT-07)\n * - v1: Map maxAmountRequired → amount, lift per-entry resource (FMT-06)\n * - unknown: Return null\n *\n * All transformations preserve extensions and extra fields (FMT-08)\n */\nexport function normalize(input: string | object): NormalizedConfig | null {\n const { parsed, error } = parseInput(input)\n if (error) return null\n\n const format = detect(parsed as object)\n\n switch (format) {\n case 'v2':\n return normalizeV2(parsed as V2Config)\n case 'v1':\n return normalizeV1ToV2(parsed as V1Config)\n case 'unknown':\n return null\n default: {\n const _exhaustive: never = format\n return _exhaustive\n }\n }\n}\n\n/**\n * Normalize v2 config (pass-through with new object)\n * FMT-07: v2 configs are already canonical, just create new object\n */\nfunction normalizeV2(config: V2Config): NormalizedConfig {\n const result: NormalizedConfig = {\n x402Version: 2,\n accepts: [...config.accepts],\n resource: config.resource,\n }\n\n if (config.error !== undefined) {\n result.error = config.error\n }\n\n if (config.extensions !== undefined) {\n result.extensions = config.extensions\n }\n\n return result\n}\n\n/**\n * Normalize v1 config to v2\n * FMT-06: Map maxAmountRequired → amount, lift per-entry resource to top level\n */\nfunction normalizeV1ToV2(config: V1Config): NormalizedConfig {\n let topLevelResource: NormalizedConfig['resource'] = undefined\n\n const mappedAccepts: AcceptsEntry[] = config.accepts.map((entry) => {\n // Lift first resource to top level\n if (entry.resource && !topLevelResource) {\n topLevelResource = entry.resource\n }\n\n const mapped: AcceptsEntry = {\n scheme: entry.scheme,\n network: entry.network,\n amount: entry.maxAmountRequired,\n asset: entry.asset,\n payTo: entry.payTo,\n }\n\n if (entry.maxTimeoutSeconds !== undefined) {\n mapped.maxTimeoutSeconds = entry.maxTimeoutSeconds\n }\n\n if (entry.extra !== undefined) {\n mapped.extra = entry.extra\n }\n\n return mapped\n })\n\n const result: NormalizedConfig = {\n x402Version: 2,\n accepts: mappedAccepts,\n }\n\n if (topLevelResource !== undefined) {\n result.resource = topLevelResource\n }\n\n if (config.error !== undefined) {\n result.error = config.error\n }\n\n if (config.extensions !== undefined) {\n result.extensions = config.extensions\n }\n\n return result\n}\n\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n, title = '') {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >= 0, got ${n}`);\n }\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(value, length, title = '') {\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/** Asserts something is hash */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data, errorTitle = '') {\n if (typeof data === 'string')\n return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n/** Merges default options and passed options. */\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher(hashCons, info = {}) {\n const hashC = (msg, opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n const cr = typeof globalThis === 'object' ? globalThis.crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix) => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n//# sourceMappingURL=utils.js.map","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from \"./_u64.js\";\n// prettier-ignore\nimport { abytes, aexists, anumber, aoutput, clean, createHasher, oidNist, swap32IfBE, u32 } from \"./utils.js\";\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI = [];\nconst SHA3_ROTL = [];\nconst _SHA3_IOTA = []; // no pure annotation: var is always used\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n)\n t ^= _1n << ((_1n << BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s, rounds = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++)\n B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++)\n B[x] = s[y + x];\n for (let x = 0; x < 10; x++)\n s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n/** Keccak sponge function. */\nexport class Keccak {\n state;\n pos = 0;\n posOut = 0;\n finished = false;\n state32;\n destroyed = false;\n blockLen;\n suffix;\n outputLen;\n enableXOF = false;\n rounds;\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen, 'outputLen');\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone() {\n return this._cloneInto();\n }\n keccak() {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data) {\n aexists(this);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++)\n state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen)\n this.keccak();\n }\n return this;\n }\n finish() {\n if (this.finished)\n return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n writeInto(out) {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len;) {\n if (this.posOut >= blockLen)\n this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out) {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF)\n throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes) {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out) {\n aoutput(out, this);\n if (this.finished)\n throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to) {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\nconst genKeccak = (suffix, blockLen, outputLen, info = {}) => createHasher(() => new Keccak(blockLen, suffix, outputLen), info);\n/** SHA3-224 hash function. */\nexport const sha3_224 = /* @__PURE__ */ genKeccak(0x06, 144, 28, \n/* @__PURE__ */ oidNist(0x07));\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256 = /* @__PURE__ */ genKeccak(0x06, 136, 32, \n/* @__PURE__ */ oidNist(0x08));\n/** SHA3-384 hash function. */\nexport const sha3_384 = /* @__PURE__ */ genKeccak(0x06, 104, 48, \n/* @__PURE__ */ oidNist(0x09));\n/** SHA3-512 hash function. */\nexport const sha3_512 = /* @__PURE__ */ genKeccak(0x06, 72, 64, \n/* @__PURE__ */ oidNist(0x0a));\n/** keccak-224 hash function. */\nexport const keccak_224 = /* @__PURE__ */ genKeccak(0x01, 144, 28);\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256 = /* @__PURE__ */ genKeccak(0x01, 136, 32);\n/** keccak-384 hash function. */\nexport const keccak_384 = /* @__PURE__ */ genKeccak(0x01, 104, 48);\n/** keccak-512 hash function. */\nexport const keccak_512 = /* @__PURE__ */ genKeccak(0x01, 72, 64);\nconst genShake = (suffix, blockLen, outputLen, info = {}) => createHasher((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true), info);\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128 = \n/* @__PURE__ */\ngenShake(0x1f, 168, 16, /* @__PURE__ */ oidNist(0x0b));\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256 = \n/* @__PURE__ */\ngenShake(0x1f, 136, 32, /* @__PURE__ */ oidNist(0x0c));\n/** SHAKE128 XOF with 256-bit output (NIST version). */\nexport const shake128_32 = \n/* @__PURE__ */\ngenShake(0x1f, 168, 32, /* @__PURE__ */ oidNist(0x0b));\n/** SHAKE256 XOF with 512-bit output (NIST version). */\nexport const shake256_64 = \n/* @__PURE__ */\ngenShake(0x1f, 136, 64, /* @__PURE__ */ oidNist(0x0c));\n//# sourceMappingURL=sha3.js.map","/**\n * Keccak-256 hash function wrapper\n * Uses @noble/hashes for audited, tree-shakeable implementation\n */\n\nimport { keccak_256 } from '@noble/hashes/sha3.js'\n\n/**\n * Compute Keccak-256 hash (NOT SHA-3)\n *\n * @param input - String or Uint8Array to hash\n * @returns Lowercase hex string (64 chars, no 0x prefix)\n */\nexport function keccak256(input: string | Uint8Array): string {\n const bytes = typeof input === 'string'\n ? new TextEncoder().encode(input)\n : input\n\n const hash = keccak_256(bytes)\n\n return Array.from(hash)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('')\n}\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): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\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\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","/**\n * Base58 decoder wrapper\n * Uses @scure/base for audited, tree-shakeable implementation\n */\n\nimport { base58 } from '@scure/base'\n\n/**\n * Decode a Base58-encoded string to bytes\n *\n * Preserves leading zero bytes (represented as leading '1' characters)\n *\n * @param input - Base58 string\n * @returns Decoded bytes\n * @throws Error if input contains invalid Base58 characters\n */\nexport function decodeBase58(input: string): Uint8Array {\n try {\n return base58.decode(input)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`Invalid Base58: ${message}`)\n }\n}\n","/**\n * EIP-55 mixed-case checksum address encoding\n * Spec: https://eips.ethereum.org/EIPS/eip-55\n */\n\nimport { keccak256 } from './keccak256'\n\n/**\n * Convert an Ethereum address to EIP-55 checksummed format\n *\n * @param address - 42-character hex address (0x-prefixed)\n * @returns Checksummed address with mixed case\n */\nexport function toChecksumAddress(address: string): string {\n // Lowercase the hex part (strip 0x prefix)\n const lowerHex = address.slice(2).toLowerCase()\n\n // Hash the lowercase hex\n const hash = keccak256(lowerHex)\n\n // Build checksummed version\n let result = '0x'\n for (let i = 0; i < lowerHex.length; i++) {\n const char = lowerHex[i]\n const hashChar = hash[i]\n if (!char || !hashChar) continue // Should never happen with valid 40-char hex\n\n if (char >= 'a' && char <= 'f') {\n // For hex letters, uppercase if hash nibble >= 8\n const hashNibble = parseInt(hashChar, 16)\n result += hashNibble >= 8 ? char.toUpperCase() : char\n } else {\n // For digits, keep as-is\n result += char\n }\n }\n\n return result\n}\n\n/**\n * Check if an address has valid EIP-55 checksum\n *\n * Returns false for all-lowercase or all-uppercase addresses\n * (these are valid formats but do not match their checksummed version)\n *\n * @param address - Address to validate\n * @returns True if checksum is valid\n */\nexport function isValidChecksum(address: string): boolean {\n return address === toChecksumAddress(address)\n}\n","/**\n * EVM address validation with EIP-55 checksum verification\n */\n\nimport { toChecksumAddress, isValidChecksum } from '../crypto/eip55'\nimport { ErrorCode } from '../types/errors'\nimport type { ValidationIssue } from '../types/validation'\n\nconst EVM_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/\n\n/**\n * Validate an EVM address format and checksum\n *\n * Returns errors for invalid format, warnings for checksum issues\n *\n * @param address - Address to validate\n * @param field - Field path for error reporting\n * @returns Array of validation issues (empty if valid)\n */\nexport function validateEvmAddress(\n address: string,\n field: string\n): ValidationIssue[] {\n // Check basic format (0x + 40 hex chars)\n if (!EVM_ADDRESS_REGEX.test(address)) {\n return [\n {\n code: ErrorCode.INVALID_EVM_ADDRESS,\n field,\n message: 'EVM address must be 42 hex characters with 0x prefix',\n severity: 'error',\n fix: 'Format: 0x followed by 40 hex digits (0-9, a-f, A-F)',\n },\n ]\n }\n\n const hexPart = address.slice(2)\n\n // Check if all-lowercase (no checksum)\n // Only warn if there are actual letters (a-f) - all-digits addresses are fine\n if (address === address.toLowerCase() && /[a-f]/.test(hexPart)) {\n return [\n {\n code: ErrorCode.NO_EVM_CHECKSUM,\n field,\n message: 'EVM address is all-lowercase with no checksum protection',\n severity: 'warning',\n fix: `Use checksummed address to detect typos: ${toChecksumAddress(address)}`,\n },\n ]\n }\n\n // Check if all-uppercase (valid, no checksum info)\n // Only skip checksum verification if there are actual letters (A-F) - all-digits go through\n if (/^[0-9A-F]{40}$/.test(hexPart) && /[A-F]/.test(hexPart)) {\n // All-uppercase is valid and common, no warning needed\n return []\n }\n\n // If all digits (0-9 only), treat as valid - no checksum verification needed\n if (/^[0-9]{40}$/.test(hexPart)) {\n return []\n }\n\n // Mixed case - verify checksum\n if (!isValidChecksum(address)) {\n return [\n {\n code: ErrorCode.BAD_EVM_CHECKSUM,\n field,\n message: 'EVM address has invalid checksum (EIP-55)',\n severity: 'warning',\n fix: `Expected: ${toChecksumAddress(address)}`,\n },\n ]\n }\n\n // Valid checksummed address\n return []\n}\n","/**\n * Solana address validation (Base58 + 32-byte length)\n */\n\nimport { decodeBase58 } from '../crypto/base58'\nimport { ErrorCode } from '../types/errors'\nimport type { ValidationIssue } from '../types/validation'\n\n// Solana addresses are 32-44 Base58 characters\n// Base58 alphabet: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\n// (excludes 0, O, I, l to avoid confusion)\nconst SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/\n\n/**\n * Validate a Solana address (Base58 encoded public key)\n *\n * Checks Base58 format and verifies decoded length is exactly 32 bytes\n *\n * @param address - Address to validate\n * @param field - Field path for error reporting\n * @returns Array of validation issues (empty if valid)\n */\nexport function validateSolanaAddress(\n address: string,\n field: string\n): ValidationIssue[] {\n // Check Base58 format and length\n if (!SOLANA_ADDRESS_REGEX.test(address)) {\n return [\n {\n code: ErrorCode.INVALID_SOLANA_ADDRESS,\n field,\n message: 'Solana address must be 32-44 Base58 characters',\n severity: 'error',\n fix: 'Valid characters: 1-9, A-H, J-N, P-Z, a-k, m-z (no 0, O, I, l)',\n },\n ]\n }\n\n // Attempt to decode and verify byte length\n try {\n const decoded = decodeBase58(address)\n if (decoded.length !== 32) {\n return [\n {\n code: ErrorCode.INVALID_SOLANA_ADDRESS,\n field,\n message: `Solana address must decode to 32 bytes, got ${decoded.length}`,\n severity: 'error',\n fix: 'Verify address is a valid Solana public key',\n },\n ]\n }\n } catch (error) {\n return [\n {\n code: ErrorCode.INVALID_SOLANA_ADDRESS,\n field,\n message: 'Invalid Base58 encoding',\n severity: 'error',\n fix: error instanceof Error ? error.message : 'Check Base58 encoding',\n },\n ]\n }\n\n // Valid Solana address\n return []\n}\n","/**\n * Address validation with CAIP-2 namespace dispatch\n *\n * Dispatches to chain-specific validators based on network namespace\n */\n\nimport { getNetworkNamespace } from '../registries/networks'\nimport { validateEvmAddress } from './evm-address'\nimport { validateSolanaAddress } from './solana-address'\nimport type { ValidationIssue } from '../types/validation'\n\n/**\n * Validate an address for a specific network\n *\n * Dispatches to appropriate chain-specific validator based on CAIP-2 namespace:\n * - eip155:* → EVM address validation\n * - solana:* → Solana address validation\n * - stellar:*, aptos:* → Accept any string (deep validation deferred)\n * - Unknown namespaces → Accept any string (registry warnings handled elsewhere)\n *\n * Cross-chain mismatches are caught naturally by dispatch:\n * - EVM address (0x...) on Solana network → fails Solana Base58 validation\n * - Solana address on EVM network → fails EVM 0x-prefix validation\n *\n * @param address - Address to validate\n * @param network - CAIP-2 network identifier\n * @param field - Field path for error reporting\n * @returns Array of validation issues (empty if valid)\n */\nexport function validateAddress(\n address: string,\n network: string,\n field: string\n): ValidationIssue[] {\n const namespace = getNetworkNamespace(network)\n\n // Invalid CAIP-2 format - network errors handled elsewhere\n if (namespace === undefined) {\n return []\n }\n\n // Dispatch by namespace\n switch (namespace) {\n case 'eip155':\n return validateEvmAddress(address, field)\n\n case 'solana':\n return validateSolanaAddress(address, field)\n\n case 'stellar':\n case 'aptos':\n // Accept any address - deep validation deferred to future phases\n return []\n\n default:\n // Unknown namespace - warnings handled by registry validation\n return []\n }\n}\n","/**\n * Level 1: Structure validation\n * Validates JSON parse, object check, and format detection\n */\n\nimport type { ConfigFormat, ValidationIssue } from '../../types'\nimport { parseInput } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\nimport { isRecord } from '../../detection/guards'\nimport { detect } from '../../detection/detect'\n\n/**\n * Enriched result from structure validation.\n * The orchestrator needs the parsed object and detected format\n * in addition to any issues found.\n */\nexport interface StructureResult {\n parsed: object | null\n format: ConfigFormat\n issues: ValidationIssue[]\n}\n\n/**\n * Validate input structure: parse JSON, check object, detect format.\n *\n * @param input - Raw JSON string or object\n * @returns StructureResult with parsed object, detected format, and issues\n */\nexport function validateStructure(input: string | object): StructureResult {\n const issues: ValidationIssue[] = []\n\n // Step 1: Parse input\n const { parsed, error } = parseInput(input)\n\n if (error) {\n return { parsed: null, format: 'unknown', issues: [error] }\n }\n\n // Step 2: Check parsed value is a non-null, non-array object\n if (!isRecord(parsed)) {\n issues.push({\n code: ErrorCode.NOT_OBJECT,\n field: '$',\n message: ErrorMessages.NOT_OBJECT,\n severity: 'error',\n })\n return { parsed: null, format: 'unknown', issues }\n }\n\n // Step 3: Detect format\n const format = detect(parsed as object)\n\n if (format === 'unknown') {\n issues.push({\n code: ErrorCode.UNKNOWN_FORMAT,\n field: '$',\n message: ErrorMessages.UNKNOWN_FORMAT,\n severity: 'error',\n })\n }\n\n return { parsed: parsed as object, format, issues }\n}\n","/**\n * Level 2: Version validation\n * Validates x402Version presence and value\n */\n\nimport type { NormalizedConfig, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate x402Version field.\n *\n * Since normalize() always sets x402Version: 2, this mainly validates\n * the original format's version field. If somehow the value isn't 1 or 2,\n * push INVALID_VERSION error.\n *\n * Note: No MISSING_VERSION check needed here because normalize() always\n * sets it. The orchestrator handles version-related warnings for legacy\n * formats via the legacy rule module.\n *\n * @param config - Normalized config\n * @param _detectedFormat - Detected format (reserved for future use)\n * @returns Array of validation issues\n */\nexport function validateVersion(\n config: NormalizedConfig,\n _detectedFormat: ConfigFormat,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Cast to number for runtime safety: NormalizedConfig types x402Version as literal 2,\n // but at runtime the value could be anything if the input was malformed.\n const version = config.x402Version as number\n if (version !== 1 && version !== 2) {\n issues.push({\n code: ErrorCode.INVALID_VERSION,\n field: 'x402Version',\n message: ErrorMessages.INVALID_VERSION,\n severity: 'error',\n })\n }\n\n return issues\n}\n","/**\n * Level 3: Required field validation\n * Validates accepts array, required entry fields, and resource\n */\n\nimport type { AcceptsEntry, NormalizedConfig, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate required fields on a single accepts entry.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateFields(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (!entry.scheme) {\n issues.push({\n code: ErrorCode.MISSING_SCHEME,\n field: `${fieldPath}.scheme`,\n message: ErrorMessages.MISSING_SCHEME,\n severity: 'error',\n })\n }\n\n if (!entry.network) {\n issues.push({\n code: ErrorCode.MISSING_NETWORK,\n field: `${fieldPath}.network`,\n message: ErrorMessages.MISSING_NETWORK,\n severity: 'error',\n })\n }\n\n if (!entry.amount) {\n issues.push({\n code: ErrorCode.MISSING_AMOUNT,\n field: `${fieldPath}.amount`,\n message: ErrorMessages.MISSING_AMOUNT,\n severity: 'error',\n })\n }\n\n if (!entry.asset) {\n issues.push({\n code: ErrorCode.MISSING_ASSET,\n field: `${fieldPath}.asset`,\n message: ErrorMessages.MISSING_ASSET,\n severity: 'error',\n })\n }\n\n if (!entry.payTo) {\n issues.push({\n code: ErrorCode.MISSING_PAY_TO,\n field: `${fieldPath}.payTo`,\n message: ErrorMessages.MISSING_PAY_TO,\n severity: 'error',\n })\n }\n\n return issues\n}\n\n/**\n * Validate the accepts array itself (presence, type, emptiness).\n *\n * @param config - Normalized config\n * @returns Array of validation issues\n */\nexport function validateAccepts(config: NormalizedConfig): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (!Array.isArray(config.accepts)) {\n issues.push({\n code: ErrorCode.INVALID_ACCEPTS,\n field: 'accepts',\n message: ErrorMessages.INVALID_ACCEPTS,\n severity: 'error',\n })\n return issues\n }\n\n if (config.accepts.length === 0) {\n issues.push({\n code: ErrorCode.EMPTY_ACCEPTS,\n field: 'accepts',\n message: ErrorMessages.EMPTY_ACCEPTS,\n severity: 'error',\n })\n }\n\n return issues\n}\n\n/**\n * Validate resource object on normalized config.\n *\n * For v2 configs, resource is expected. Its absence is a warning, not an error,\n * since some v2 configs work without it.\n *\n * Also validates URL format via new URL() constructor (RULE-04).\n *\n * @param config - Normalized config\n * @param detectedFormat - Detected format\n * @returns Array of validation issues\n */\nexport function validateResource(\n config: NormalizedConfig,\n detectedFormat: ConfigFormat,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (!config.resource) {\n if (detectedFormat === 'v2') {\n issues.push({\n code: ErrorCode.MISSING_RESOURCE,\n field: 'resource',\n message: ErrorMessages.MISSING_RESOURCE,\n severity: 'warning',\n })\n }\n return issues\n }\n\n if (!config.resource.url) {\n issues.push({\n code: ErrorCode.MISSING_RESOURCE,\n field: 'resource.url',\n message: ErrorMessages.MISSING_RESOURCE,\n severity: 'warning',\n })\n return issues\n }\n\n // URL format validation (RULE-04): advisory check via new URL() constructor\n try {\n new URL(config.resource.url)\n } catch {\n issues.push({\n code: ErrorCode.INVALID_URL,\n field: 'resource.url',\n message: 'resource.url is not a valid URL format',\n severity: 'warning',\n })\n }\n\n return issues\n}\n","/**\n * Level 4: Network and asset validation\n * Validates CAIP-2 format, known networks, and known assets\n */\n\nimport type { AcceptsEntry, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\nimport { isValidCaip2, isKnownNetwork } from '../../registries/networks'\nimport { getCanonicalNetwork } from '../../registries/simple-names'\nimport { isKnownAsset } from '../../registries/assets'\n\n/**\n * Validate network field on a single accepts entry.\n *\n * Checks CAIP-2 format and known network registry. Provides fix\n * suggestions for simple chain names that have canonical CAIP-2 mappings.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateNetwork(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Missing field already caught by validateFields\n if (!entry.network) {\n return issues\n }\n\n if (!isValidCaip2(entry.network)) {\n // Check if this is a simple name with a canonical CAIP-2 mapping\n const canonical = getCanonicalNetwork(entry.network)\n\n if (canonical) {\n issues.push({\n code: ErrorCode.INVALID_NETWORK_FORMAT,\n field: `${fieldPath}.network`,\n message: ErrorMessages.INVALID_NETWORK_FORMAT,\n severity: 'error',\n fix: `Use '${canonical}' instead of '${entry.network}'`,\n })\n } else {\n issues.push({\n code: ErrorCode.INVALID_NETWORK_FORMAT,\n field: `${fieldPath}.network`,\n message: ErrorMessages.INVALID_NETWORK_FORMAT,\n severity: 'error',\n })\n }\n\n return issues\n }\n\n // Valid CAIP-2 format but not in known registry\n if (!isKnownNetwork(entry.network)) {\n issues.push({\n code: ErrorCode.UNKNOWN_NETWORK,\n field: `${fieldPath}.network`,\n message: ErrorMessages.UNKNOWN_NETWORK,\n severity: 'warning',\n })\n }\n\n return issues\n}\n\n/**\n * Validate asset field on a single accepts entry.\n *\n * Checks if the asset is known for the given network. Only checks\n * when both network and asset are present and network is valid.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateAsset(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Missing field already caught by validateFields\n if (!entry.asset) {\n return issues\n }\n\n // Only check known assets when the network is valid CAIP-2\n if (entry.network && isValidCaip2(entry.network) && !isKnownAsset(entry.network, entry.asset)) {\n issues.push({\n code: ErrorCode.UNKNOWN_ASSET,\n field: `${fieldPath}.asset`,\n message: ErrorMessages.UNKNOWN_ASSET,\n severity: 'warning',\n })\n }\n\n return issues\n}\n","/**\n * Level 4: Amount and timeout validation\n * Validates numeric string amounts and timeout values\n */\n\nimport type { AcceptsEntry, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate amount field on a single accepts entry.\n *\n * Amount must be a digit-only string (no decimals, signs, or scientific notation)\n * and must be greater than zero.\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @returns Array of validation issues\n */\nexport function validateAmount(entry: AcceptsEntry, fieldPath: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n // Missing field already caught by validateFields\n if (!entry.amount) {\n return issues\n }\n\n // Amount must be digits only (atomic units)\n if (!/^\\d+$/.test(entry.amount)) {\n issues.push({\n code: ErrorCode.INVALID_AMOUNT,\n field: `${fieldPath}.amount`,\n message: ErrorMessages.INVALID_AMOUNT,\n severity: 'error',\n })\n return issues\n }\n\n // Zero amount check\n if (entry.amount === '0') {\n issues.push({\n code: ErrorCode.ZERO_AMOUNT,\n field: `${fieldPath}.amount`,\n message: ErrorMessages.ZERO_AMOUNT,\n severity: 'error',\n })\n }\n\n return issues\n}\n\n/**\n * Validate maxTimeoutSeconds on a single accepts entry.\n *\n * For v2 format, missing timeout produces a warning.\n * When present, timeout must be a positive integer (RULE-10).\n *\n * @param entry - Accepts entry to validate\n * @param fieldPath - Dot-notation path for issue reporting (e.g. \"accepts[0]\")\n * @param detectedFormat - Detected config format\n * @returns Array of validation issues\n */\nexport function validateTimeout(\n entry: AcceptsEntry,\n fieldPath: string,\n detectedFormat: ConfigFormat,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (entry.maxTimeoutSeconds === undefined) {\n if (detectedFormat === 'v2') {\n issues.push({\n code: ErrorCode.MISSING_MAX_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.MISSING_MAX_TIMEOUT,\n severity: 'warning',\n })\n }\n return issues\n }\n\n // Timeout value validation (RULE-10): must be a positive integer\n if (typeof entry.maxTimeoutSeconds !== 'number') {\n issues.push({\n code: ErrorCode.INVALID_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.INVALID_TIMEOUT,\n severity: 'error',\n })\n return issues\n }\n\n if (!Number.isInteger(entry.maxTimeoutSeconds)) {\n issues.push({\n code: ErrorCode.INVALID_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.INVALID_TIMEOUT,\n severity: 'error',\n })\n return issues\n }\n\n if (entry.maxTimeoutSeconds <= 0) {\n issues.push({\n code: ErrorCode.INVALID_TIMEOUT,\n field: `${fieldPath}.maxTimeoutSeconds`,\n message: ErrorMessages.INVALID_TIMEOUT,\n severity: 'error',\n })\n }\n\n return issues\n}\n","/**\n * Level 5: Legacy format validation\n * Produces warnings for legacy config formats with upgrade suggestions\n */\n\nimport type { NormalizedConfig, ConfigFormat, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Validate for legacy format usage and produce upgrade suggestions.\n *\n * @param _config - Normalized config (reserved for future use)\n * @param detectedFormat - Detected config format\n * @param _originalInput - Original input object (reserved for future use)\n * @returns Array of validation issues (warnings)\n */\nexport function validateLegacy(\n _config: NormalizedConfig,\n detectedFormat: ConfigFormat,\n _originalInput: object,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (detectedFormat === 'v1') {\n issues.push({\n code: ErrorCode.LEGACY_FORMAT,\n field: '$',\n message: ErrorMessages.LEGACY_FORMAT,\n severity: 'warning',\n fix: 'Upgrade to x402 v2 -- use amount instead of maxAmountRequired, add resource object',\n })\n }\n\n return issues\n}\n","/**\n * Level 6: Extensions validation\n * Validates extensions.bazaar (V2 Bazaar) and accepts[].outputSchema (V1 legacy)\n * All issues are warnings -- schemas improve discoverability but aren't required for payment flow\n */\n\nimport type { NormalizedConfig, ValidationIssue } from '../../types'\nimport { ErrorCode, ErrorMessages } from '../../types/errors'\n\n/**\n * Check whether a value is a non-null plain object (not an array).\n */\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v)\n}\n\n/**\n * Validate `extensions.bazaar` when present.\n *\n * Checks:\n * - bazaar is an object\n * - bazaar.info exists and is an object with input (type + method) and output\n * - bazaar.schema exists and looks like a JSON Schema object\n *\n * @returns Array of warning issues (empty when bazaar is absent or valid)\n */\nexport function validateBazaar(config: NormalizedConfig): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n if (!config.extensions) return issues\n\n const bazaar = config.extensions['bazaar']\n if (bazaar === undefined) return issues\n\n if (!isObject(bazaar)) {\n issues.push({\n code: ErrorCode.INVALID_BAZAAR_INFO,\n field: 'extensions.bazaar',\n message: 'extensions.bazaar must be an object',\n severity: 'warning',\n fix: 'Set extensions.bazaar to an object with info and schema properties',\n })\n return issues\n }\n\n // ── info ──────────────────────────────────────────────────────────────\n const info = bazaar['info']\n if (!isObject(info)) {\n issues.push({\n code: ErrorCode.INVALID_BAZAAR_INFO,\n field: 'extensions.bazaar.info',\n message: ErrorMessages.INVALID_BAZAAR_INFO,\n severity: 'warning',\n fix: 'Add an info object with input and output properties describing your API',\n })\n } else {\n const input = info['input']\n if (!isObject(input) || !input['type'] || !input['method']) {\n issues.push({\n code: ErrorCode.INVALID_BAZAAR_INFO_INPUT,\n field: 'extensions.bazaar.info.input',\n message: ErrorMessages.INVALID_BAZAAR_INFO_INPUT,\n severity: 'warning',\n fix: 'Add input.type (e.g. \"application/json\") and input.method (e.g. \"POST\")',\n })\n }\n\n const output = info['output']\n if (!isObject(output)) {\n issues.push({\n code: ErrorCode.INVALID_BAZAAR_INFO,\n field: 'extensions.bazaar.info.output',\n message: 'extensions.bazaar.info.output must be an object',\n severity: 'warning',\n fix: 'Add an output object describing the API response format',\n })\n }\n }\n\n // ── schema ────────────────────────────────────────────────────────────\n const schema = bazaar['schema']\n if (!isObject(schema) || (!schema['type'] && !schema['$schema'] && !schema['properties'])) {\n issues.push({\n code: ErrorCode.INVALID_BAZAAR_SCHEMA,\n field: 'extensions.bazaar.schema',\n message: ErrorMessages.INVALID_BAZAAR_SCHEMA,\n severity: 'warning',\n fix: 'Add a JSON Schema object with type, $schema, or properties',\n })\n }\n\n return issues\n}\n\n/**\n * Validate `accepts[].outputSchema` on the raw parsed input.\n *\n * Uses the raw parsed object because AcceptsEntry strips outputSchema during normalization.\n *\n * Checks per entry with outputSchema:\n * - outputSchema is an object\n * - outputSchema.input exists with type and method\n * - outputSchema.output exists and is an object\n *\n * @returns Array of warning issues\n */\nexport function validateOutputSchema(parsed: object): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n\n const obj = parsed as Record<string, unknown>\n const accepts = obj['accepts']\n if (!Array.isArray(accepts)) return issues\n\n for (let i = 0; i < accepts.length; i++) {\n const entry = accepts[i]\n if (!isObject(entry)) continue\n\n const outputSchema = entry['outputSchema']\n if (outputSchema === undefined) continue\n\n const fieldPath = `accepts[${i}].outputSchema`\n\n if (!isObject(outputSchema)) {\n issues.push({\n code: ErrorCode.INVALID_OUTPUT_SCHEMA,\n field: fieldPath,\n message: ErrorMessages.INVALID_OUTPUT_SCHEMA,\n severity: 'warning',\n fix: 'Set outputSchema to an object with input and output properties',\n })\n continue\n }\n\n const input = outputSchema['input']\n if (!isObject(input) || !input['type'] || !input['method']) {\n issues.push({\n code: ErrorCode.INVALID_OUTPUT_SCHEMA_INPUT,\n field: `${fieldPath}.input`,\n message: ErrorMessages.INVALID_OUTPUT_SCHEMA_INPUT,\n severity: 'warning',\n fix: 'Add input.type (e.g. \"application/json\") and input.method (e.g. \"POST\")',\n })\n }\n\n const output = outputSchema['output']\n if (!isObject(output)) {\n issues.push({\n code: ErrorCode.INVALID_OUTPUT_SCHEMA,\n field: `${fieldPath}.output`,\n message: 'accepts[i].outputSchema.output must be an object',\n severity: 'warning',\n fix: 'Add an output object describing the API response format',\n })\n }\n }\n\n return issues\n}\n\n/**\n * Emit a warning when neither `extensions.bazaar` nor any `accepts[].outputSchema` is present.\n *\n * @returns Single-element array with MISSING_INPUT_SCHEMA warning, or empty array\n */\nexport function validateMissingSchema(config: NormalizedConfig, parsed: object): ValidationIssue[] {\n // Check for extensions.bazaar\n if (config.extensions && config.extensions['bazaar'] !== undefined) {\n return []\n }\n\n // Check for any accepts[].outputSchema in raw parsed input\n const obj = parsed as Record<string, unknown>\n const accepts = obj['accepts']\n if (Array.isArray(accepts)) {\n for (const entry of accepts) {\n if (isObject(entry) && entry['outputSchema'] !== undefined) {\n return []\n }\n }\n }\n\n return [\n {\n code: ErrorCode.MISSING_INPUT_SCHEMA,\n field: 'extensions',\n message: ErrorMessages.MISSING_INPUT_SCHEMA,\n severity: 'warning',\n fix: 'Add extensions.bazaar with info and schema to help agents discover your API -- see https://bazaar.x402.org',\n },\n ]\n}\n","/**\n * Validation orchestrator\n * Composes all rule modules into a single validation pipeline\n *\n * Pipeline: parse -> detect -> normalize -> validate rules -> collect issues -> strict mode\n */\n\nimport type { ValidationResult, ValidationIssue } from '../types/validation'\nimport type { NormalizedConfig } from '../types/config'\nimport { ErrorCode, ErrorMessages } from '../types/errors'\nimport { normalize } from '../detection/normalize'\nimport { validateAddress } from './address'\nimport {\n validateStructure,\n validateVersion,\n validateFields,\n validateAccepts,\n validateResource,\n validateNetwork,\n validateAsset,\n validateAmount,\n validateTimeout,\n validateLegacy,\n validateBazaar,\n validateOutputSchema,\n validateMissingSchema,\n} from './rules'\n\n/**\n * Options for the validate() orchestrator\n */\nexport interface ValidationOptions {\n /** When true, all warnings are promoted to errors */\n strict?: boolean | undefined\n}\n\n/**\n * Validate an x402 config through the full pipeline.\n *\n * Takes any input (JSON string or object), runs it through:\n * 1. Structure validation (parse, object check, format detection)\n * 2. Normalization to canonical v2 shape\n * 3. Version, accepts, resource validation\n * 4. Per-entry field, network, asset, amount, timeout, address validation\n * 5. Legacy format warnings\n * 6. Strict mode promotion (warnings -> errors)\n *\n * NEVER throws -- all invalid inputs produce structured error results.\n *\n * @param input - JSON string or parsed object to validate\n * @param options - Validation options (e.g. strict mode)\n * @returns Structured validation result\n */\nexport function validate(\n input: string | object,\n options?: ValidationOptions | undefined,\n): ValidationResult {\n try {\n return runPipeline(input, options)\n } catch {\n // Safety net: validate() must never throw\n return {\n valid: false,\n version: 'unknown',\n errors: [\n {\n code: ErrorCode.UNKNOWN_FORMAT,\n field: '$',\n message: 'Unexpected validation error',\n severity: 'error',\n },\n ],\n warnings: [],\n normalized: null,\n }\n }\n}\n\n/**\n * Internal pipeline implementation.\n * Separated from validate() so the try/catch safety net is clean.\n */\nfunction runPipeline(\n input: string | object,\n options: ValidationOptions | undefined,\n): ValidationResult {\n // ── Level 1: Structure ──────────────────────────────────────────────\n const structure = validateStructure(input)\n\n if (structure.issues.length > 0) {\n return {\n valid: false,\n version: structure.format || 'unknown',\n errors: structure.issues,\n warnings: [],\n normalized: null,\n }\n }\n\n const parsed = structure.parsed as object\n const format = structure.format\n\n // ── Normalize ───────────────────────────────────────────────────────\n const normalized: NormalizedConfig | null = normalize(parsed)\n\n if (normalized === null) {\n return {\n valid: false,\n version: format,\n errors: [\n {\n code: ErrorCode.UNKNOWN_FORMAT,\n field: '$',\n message: ErrorMessages.UNKNOWN_FORMAT,\n severity: 'error',\n },\n ],\n warnings: [],\n normalized: null,\n }\n }\n\n // ── Collect Issues ──────────────────────────────────────────────────\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n // ── Level 2: Version ────────────────────────────────────────────────\n errors.push(...validateVersion(normalized, format))\n\n // ── Level 2: Accepts ────────────────────────────────────────────────\n errors.push(...validateAccepts(normalized))\n\n // ── Level 2: Resource ───────────────────────────────────────────────\n warnings.push(...validateResource(normalized, format))\n\n // ── Levels 3-4: Per-entry validation ────────────────────────────────\n if (Array.isArray(normalized.accepts) && normalized.accepts.length > 0) {\n for (let i = 0; i < normalized.accepts.length; i++) {\n const entry = normalized.accepts[i]!\n const fieldPath = `accepts[${i}]`\n\n // Fields (errors)\n errors.push(...validateFields(entry, fieldPath))\n\n // Network (mixed: errors and warnings by severity)\n for (const issue of validateNetwork(entry, fieldPath)) {\n if (issue.severity === 'error') {\n errors.push(issue)\n } else {\n warnings.push(issue)\n }\n }\n\n // Asset (warnings)\n warnings.push(...validateAsset(entry, fieldPath))\n\n // Amount (errors)\n errors.push(...validateAmount(entry, fieldPath))\n\n // Timeout (mixed: errors and warnings by severity)\n for (const issue of validateTimeout(entry, fieldPath, format)) {\n if (issue.severity === 'error') {\n errors.push(issue)\n } else {\n warnings.push(issue)\n }\n }\n\n // Address validation (dispatch by severity)\n if (entry.payTo && entry.network) {\n for (const issue of validateAddress(entry.payTo, entry.network, `${fieldPath}.payTo`)) {\n if (issue.severity === 'error') {\n errors.push(issue)\n } else {\n warnings.push(issue)\n }\n }\n }\n }\n }\n\n // ── Level 5: Legacy ─────────────────────────────────────────────────\n warnings.push(...validateLegacy(normalized, format, parsed))\n\n // ── Level 6: Extensions ────────────────────────────────────────────\n warnings.push(...validateBazaar(normalized))\n warnings.push(...validateOutputSchema(parsed))\n warnings.push(...validateMissingSchema(normalized, parsed))\n\n // ── Strict Mode ─────────────────────────────────────────────────────\n if (options?.strict === true) {\n for (const warning of warnings) {\n errors.push({ ...warning, severity: 'error' })\n }\n warnings.length = 0\n }\n\n // ── Return ──────────────────────────────────────────────────────────\n return {\n valid: errors.length === 0,\n version: format,\n errors,\n warnings,\n normalized,\n }\n}\n","/**\n * HTTP config extraction\n *\n * Extracts x402 payment configs from HTTP 402 responses.\n * Handles body-first extraction with PAYMENT-REQUIRED header fallback.\n */\n\n/**\n * Where the config was found\n */\nexport type ExtractionSource = 'body' | 'header'\n\n/**\n * Result of extracting a config from an HTTP response\n */\nexport interface ExtractionResult {\n config: object | null\n source: ExtractionSource | null\n error: string | null\n}\n\n/**\n * Minimal response shape — works with fetch Response, plain objects, etc.\n */\nexport interface ResponseLike {\n body?: unknown\n headers?: Record<string, string> | Headers\n}\n\n/**\n * Get a header value, case-insensitive.\n * Supports both Headers objects and plain Record<string, string>.\n */\nfunction getHeader(\n headers: Record<string, string> | Headers | undefined,\n name: string,\n): string | null {\n if (!headers) return null\n\n // Headers object (fetch API)\n if (typeof (headers as Headers).get === 'function') {\n return (headers as Headers).get(name)\n }\n\n // Plain object — case-insensitive lookup\n const lower = name.toLowerCase()\n for (const key of Object.keys(headers as Record<string, string>)) {\n if (key.toLowerCase() === lower) {\n return (headers as Record<string, string>)[key]!\n }\n }\n return null\n}\n\n/**\n * Decode base64 string to UTF-8 text.\n * Works in both browser (atob) and Node (Buffer).\n */\nfunction decodeBase64(encoded: string): string {\n if (typeof atob === 'function') {\n return atob(encoded)\n }\n // Node.js fallback\n return Buffer.from(encoded, 'base64').toString('utf-8')\n}\n\n/**\n * Check if a parsed object looks like it contains x402 config fields.\n */\nfunction hasX402Fields(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') return false\n const rec = obj as Record<string, unknown>\n return !!(rec.accepts || rec.payTo || rec.x402Version)\n}\n\n/**\n * Try to parse the PAYMENT-REQUIRED header value as a base64-encoded JSON config.\n */\nfunction tryHeaderExtraction(\n headers: Record<string, string> | Headers | undefined,\n): { config: object; source: 'header' } | null {\n const headerValue = getHeader(headers, 'payment-required')\n if (!headerValue) return null\n\n // Try base64 decode first\n try {\n const decoded = decodeBase64(headerValue)\n const parsed = JSON.parse(decoded) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { config: parsed as object, source: 'header' }\n }\n } catch {\n // Not valid base64 JSON\n }\n\n // Try raw JSON (some implementations don't base64-encode)\n try {\n const parsed = JSON.parse(headerValue) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { config: parsed as object, source: 'header' }\n }\n } catch {\n // Not valid JSON either\n }\n\n return null\n}\n\n/**\n * Extract an x402 config from an HTTP 402 response.\n *\n * Extraction priority:\n * 1. JSON body — if it parses and has x402 fields (accepts, payTo, x402Version)\n * 2. PAYMENT-REQUIRED header — base64-decoded JSON fallback\n *\n * Never throws. Returns structured result with error message on failure.\n *\n * @param response - Response-like object with body and/or headers\n * @returns Extraction result with config, source, and error\n */\nexport function extractConfig(response: ResponseLike): ExtractionResult {\n // Try body first\n const body = response.body\n if (body && typeof body === 'object' && !Array.isArray(body) && hasX402Fields(body)) {\n return { config: body as object, source: 'body', error: null }\n }\n\n // Try string body (JSON string)\n if (typeof body === 'string' && body.trim()) {\n try {\n const parsed = JSON.parse(body) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed) && hasX402Fields(parsed)) {\n return { config: parsed as object, source: 'body', error: null }\n }\n } catch {\n // Body is not valid JSON, fall through to header\n }\n }\n\n // Fallback to PAYMENT-REQUIRED header\n const headerResult = tryHeaderExtraction(response.headers)\n if (headerResult) {\n return { config: headerResult.config, source: headerResult.source, error: null }\n }\n\n return {\n config: null,\n source: null,\n error: 'No x402 config found in response body or PAYMENT-REQUIRED header',\n }\n}\n","/**\n * Unified check() API\n *\n * Composes extractConfig() + validate() + registry lookups into a single call.\n * Never throws.\n */\n\nimport type { CheckResult, AcceptSummary } from './types/check'\nimport type { ValidationOptions } from './validation/orchestrator'\nimport type { ResponseLike } from './extraction/extract'\nimport { extractConfig } from './extraction/extract'\nimport { validate } from './validation/orchestrator'\nimport { getNetworkInfo } from './registries/networks'\nimport { getAssetInfo } from './registries/assets'\n\n/**\n * Check an HTTP 402 response: extract config, validate, and enrich with registry data.\n *\n * Never throws. All failures are represented in the returned CheckResult.\n *\n * @param response - Response-like object with body and/or headers\n * @param options - Validation options (e.g. strict mode)\n * @returns Unified check result\n */\nexport function check(\n response: ResponseLike,\n options?: ValidationOptions,\n): CheckResult {\n // ── Extract ──────────────────────────────────────────────────────────\n const extraction = extractConfig(response)\n\n if (!extraction.config) {\n return {\n extracted: false,\n source: null,\n extractionError: extraction.error,\n valid: false,\n version: 'unknown',\n errors: [],\n warnings: [],\n normalized: null,\n summary: [],\n raw: null,\n }\n }\n\n // ── Validate ─────────────────────────────────────────────────────────\n const validation = validate(extraction.config, options)\n\n // ── Build summaries from normalized accepts ──────────────────────────\n const summary: AcceptSummary[] = []\n const accepts = validation.normalized?.accepts ?? []\n\n for (let i = 0; i < accepts.length; i++) {\n const entry = accepts[i]!\n const networkInfo = getNetworkInfo(entry.network)\n const assetInfo = getAssetInfo(entry.network, entry.asset)\n\n summary.push({\n index: i,\n network: entry.network,\n networkName: networkInfo?.name ?? entry.network,\n networkType: networkInfo?.type ?? null,\n payTo: entry.payTo,\n amount: entry.amount,\n asset: entry.asset,\n assetSymbol: assetInfo?.symbol ?? null,\n assetDecimals: assetInfo?.decimals ?? null,\n scheme: entry.scheme,\n })\n }\n\n return {\n extracted: true,\n source: extraction.source,\n extractionError: null,\n valid: validation.valid,\n version: validation.version,\n errors: validation.errors,\n warnings: validation.warnings,\n normalized: validation.normalized,\n summary,\n raw: extraction.config,\n }\n}\n","// x402check SDK - entry point\n// Named exports only (no default) for IIFE compatibility\n\n// Re-export types (Phase 6 Plan 01)\nexport * from './types'\n\n// Re-export registries (Phase 6 Plan 03)\nexport * from './registries'\n\n// Re-export detection (Phase 6 Plan 02)\nexport { detect, normalize } from './detection'\n\n// Re-export crypto primitives (Phase 7 Plan 01)\nexport * from './crypto'\n\n// Re-export validation utilities (Phase 7 Plan 02)\nexport { validateAddress, validateEvmAddress, validateSolanaAddress } from './validation'\n\n// Re-export validation orchestrator (Phase 8)\nexport { validate } from './validation'\nexport type { ValidationOptions } from './validation'\n\n// Re-export HTTP config extraction\nexport { extractConfig } from './extraction'\nexport type { ExtractionResult, ExtractionSource, ResponseLike } from './extraction'\n\n// Re-export unified check API\nexport { check } from './check'\n\n// Version constant\nexport const VERSION = '0.2.0' as const\n"],"x_google_ignoreList":[8,9,10,12],"mappings":"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"}
|