utxo-descriptors 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/checksum.ts","../src/base58.ts","../src/key-expression.ts","../src/tokenizer.ts","../src/traverse.ts","../src/parse.ts"],"names":["decoded","CHECKSUM_LENGTH","fail"],"mappings":"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","file":"parse.js","sourcesContent":["/**\n * BIP-380 descriptor checksum: a BCH code over a 95-character alphabet split\n * into 3 groups of 32/32/31, using the same 32-character output alphabet as\n * bech32. See https://github.com/bitcoin/bips/blob/master/bip-0380.mediawiki.\n */\nconst INPUT_CHARSET =\n \"0123456789()[],'/*abcdefgh@:$%{}IJKLMNOPQRSTUVWXYZ&+-.;<=>?!^_|~ijklmnopqrstuvwxyzABCDEFGH`#\\\"\\\\ \";\nconst CHECKSUM_CHARSET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\nconst GENERATOR = [0xf5dee51989n, 0xa9fdca3312n, 0x1bab10e32dn, 0x3706b1677an, 0x644d626ffdn];\nconst CHECKSUM_LENGTH = 8;\nconst GROUP_SIZE = 3;\nconst GROUP_BITS = 5;\nconst GROUP_MASK = 0x7ffffffffn;\nconst TOP_SHIFT = 35n;\nconst SYMBOL_MASK = 31;\n\nfunction polymod(symbols: readonly number[]): bigint {\n let checksum = 1n;\n\n for (const symbol of symbols) {\n const top = checksum >> TOP_SHIFT;\n\n checksum = ((checksum & GROUP_MASK) << 5n) ^ BigInt(symbol);\n\n for (let bit = 0; bit < GENERATOR.length; bit += 1) {\n const generatorValue = GENERATOR[bit];\n\n if (generatorValue !== undefined && ((top >> BigInt(bit)) & 1n) === 1n) {\n checksum ^= generatorValue;\n }\n }\n }\n\n return checksum;\n}\n\n/** Returns undefined when `text` contains a character outside INPUT_CHARSET. */\nfunction expand(text: string): number[] | undefined {\n const symbols: number[] = [];\n\n let groupAccumulator = 0;\n let groupCount = 0;\n\n for (const char of text) {\n const value = INPUT_CHARSET.indexOf(char);\n\n if (value === -1) {\n return undefined;\n }\n\n symbols.push(value & SYMBOL_MASK);\n groupAccumulator = groupAccumulator * GROUP_SIZE + (value >> GROUP_BITS);\n groupCount += 1;\n\n if (groupCount === GROUP_SIZE) {\n symbols.push(groupAccumulator);\n groupAccumulator = 0;\n groupCount = 0;\n }\n }\n\n if (groupCount > 0) {\n symbols.push(groupAccumulator);\n }\n\n return symbols;\n}\n\n/** Computes the 8-character checksum for a descriptor with no `#` suffix. */\nexport function checksumCreate(script: string): string | undefined {\n const symbols = expand(script);\n\n if (symbols === undefined) {\n return undefined;\n }\n\n const checksum = polymod([...symbols, 0, 0, 0, 0, 0, 0, 0, 0]) ^ 1n;\n\n let result = \"\";\n\n for (let index = 0; index < CHECKSUM_LENGTH; index += 1) {\n const shift = BigInt(GROUP_BITS * (CHECKSUM_LENGTH - 1 - index));\n const symbolIndex = Number((checksum >> shift) & BigInt(SYMBOL_MASK));\n\n // Safe by construction: SYMBOL_MASK (31) bounds symbolIndex to\n // CHECKSUM_CHARSET's 32 characters.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n result += CHECKSUM_CHARSET[symbolIndex]!;\n }\n\n return result;\n}\n\n/** Verifies an 8-character checksum against the script it was computed from. */\nexport function checksumVerify(script: string, checksum: string): boolean {\n if (checksum.length !== CHECKSUM_LENGTH) {\n return false;\n }\n\n const scriptSymbols = expand(script);\n\n if (scriptSymbols === undefined) {\n return false;\n }\n\n const checksumSymbols: number[] = [];\n\n for (const char of checksum) {\n const value = CHECKSUM_CHARSET.indexOf(char);\n\n if (value === -1) {\n return false;\n }\n\n checksumSymbols.push(value);\n }\n\n return polymod([...scriptSymbols, ...checksumSymbols]) === 1n;\n}\n\nexport function hasValidCharset(text: string): boolean {\n return expand(text) !== undefined;\n}\n","const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\nconst BASE = 58n;\nconst BYTE_MAX_PLUS_ONE = 256n;\nconst CHAR_TO_VALUE = new Map<string, bigint>(\n ALPHABET.split(\"\").map((char, index) => [char, BigInt(index)]),\n);\n\n/**\n * Decodes base58 text into raw bytes without verifying (or removing) any\n * trailing checksum. This package never needs SHA256, so callers that need\n * checksum verification must bring their own; see the README for the exact\n * limitation this implies for `addr()` base58 addresses.\n */\nexport function base58Decode(text: string): Uint8Array | undefined {\n if (text.length === 0) {\n return undefined;\n }\n\n let value = 0n;\n\n for (const char of text) {\n const digit = CHAR_TO_VALUE.get(char);\n\n if (digit === undefined) {\n return undefined;\n }\n\n value = value * BASE + digit;\n }\n\n const bytes: number[] = [];\n\n while (value > 0n) {\n bytes.unshift(Number(value % BYTE_MAX_PLUS_ONE));\n value /= BYTE_MAX_PLUS_ONE;\n }\n\n for (const char of text) {\n if (char !== \"1\") {\n break;\n }\n\n bytes.unshift(0);\n }\n\n return Uint8Array.from(bytes);\n}\n","import { base58Decode } from \"./base58\";\nimport type { KeyExpression, KeyMaterialKind, KeyOrigin, PathElement, PathStep } from \"./types\";\n\nconst MAX_INDEX = 2147483647;\nconst FINGERPRINT_PATTERN = /^[0-9a-fA-F]{8}$/;\nconst STEP_PATTERN = /^([0-9]+)(h|')?$/;\nconst EXTENDED_KEY_BYTES = 82;\nconst WIF_UNCOMPRESSED_BYTES = 37;\nconst WIF_COMPRESSED_BYTES = 38;\nconst XPUB_VERSIONS: Readonly<Record<string, number>> = {\n xpub: 0x0488b21e,\n xprv: 0x0488ade4,\n tpub: 0x043587cf,\n tprv: 0x04358394,\n};\n\nexport interface KeyExpressionFailure {\n readonly ok: false;\n readonly message: string;\n}\n\nexport interface KeyExpressionSuccess {\n readonly ok: true;\n readonly key: KeyExpression;\n}\n\nexport type KeyExpressionResult = KeyExpressionSuccess | KeyExpressionFailure;\n\nfunction fail(message: string): KeyExpressionFailure {\n return { ok: false, message };\n}\n\nfunction parseStep(segment: string): PathStep | undefined {\n const match = STEP_PATTERN.exec(segment);\n\n if (match === null) {\n return undefined;\n }\n\n const [, digits, marker] = match;\n const index = Number(digits);\n\n if (!Number.isSafeInteger(index) || index > MAX_INDEX) {\n return undefined;\n }\n\n return { index, hardened: marker !== undefined };\n}\n\nfunction parseOrigin(bracketed: string): KeyOrigin | undefined {\n const segments = bracketed.split(\"/\");\n const [fingerprint, ...pathSegments] = segments;\n\n if (fingerprint === undefined || !FINGERPRINT_PATTERN.test(fingerprint)) {\n return undefined;\n }\n\n const path: PathStep[] = [];\n\n for (const segment of pathSegments) {\n const step = parseStep(segment);\n\n if (step === undefined) {\n return undefined;\n }\n\n path.push(step);\n }\n\n return { fingerprint: fingerprint.toLowerCase(), path };\n}\n\ninterface OriginSplit {\n readonly origin?: KeyOrigin;\n readonly remainder: string;\n}\n\nfunction splitOrigin(text: string): OriginSplit | KeyExpressionFailure {\n if (!text.startsWith(\"[\")) {\n return { remainder: text };\n }\n\n const closeIndex = text.indexOf(\"]\");\n\n if (closeIndex === -1) {\n return fail(\"unterminated key origin: missing ']'\");\n }\n\n const origin = parseOrigin(text.slice(1, closeIndex));\n\n if (origin === undefined) {\n return fail(\n \"invalid key origin: expected an 8-character hex fingerprint and /NUM or /NUMh steps\",\n );\n }\n\n const remainder = text.slice(closeIndex + 1);\n\n if (remainder.startsWith(\"[\")) {\n return fail(\"a key expression may only carry one key origin\");\n }\n\n if (remainder.length === 0) {\n return fail(\"key origin is not followed by a key\");\n }\n\n return { origin, remainder };\n}\n\nfunction parseTrailingPath(\n text: string,\n): { readonly path: PathElement[]; readonly isRanged: boolean } | undefined {\n if (text.length === 0) {\n return { path: [], isRanged: false };\n }\n\n const segments = text.slice(1).split(\"/\");\n const path: PathElement[] = [];\n\n for (const [index, segment] of segments.entries()) {\n const isLast = index === segments.length - 1;\n\n if (isLast && /^\\*(h|')?$/.test(segment)) {\n return { path, isRanged: true };\n }\n\n if (segment.startsWith(\"<\") && segment.endsWith(\">\")) {\n const values = segment\n .slice(1, -1)\n .split(\";\")\n .map((part) => parseStep(part));\n\n if (values.length < 2 || values.some((value) => value === undefined)) {\n return undefined;\n }\n\n const resolved = values as PathStep[];\n const seen = new Set<string>();\n\n for (const value of resolved) {\n const key = `${String(value.index)}:${String(value.hardened)}`;\n\n if (seen.has(key)) {\n return undefined;\n }\n\n seen.add(key);\n }\n\n path.push({ kind: \"multipath\", values: resolved });\n\n continue;\n }\n\n const step = parseStep(segment);\n\n if (step === undefined) {\n return undefined;\n }\n\n path.push({ kind: \"step\", ...step });\n }\n\n return { path, isRanged: false };\n}\n\nfunction classifyKeyMaterial(keyBody: string): KeyMaterialKind | undefined {\n if (/^(02|03)[0-9a-fA-F]{64}$/.test(keyBody)) {\n return \"hex-compressed\";\n }\n\n if (/^04[0-9a-fA-F]{128}$/.test(keyBody)) {\n return \"hex-uncompressed\";\n }\n\n if (/^[0-9a-fA-F]{64}$/.test(keyBody)) {\n return \"hex-xonly\";\n }\n\n const extendedPrefix = keyBody.slice(0, 4);\n\n if (extendedPrefix in XPUB_VERSIONS) {\n const decoded = base58Decode(keyBody);\n const expectedVersion = XPUB_VERSIONS[extendedPrefix];\n\n if (decoded?.length === EXTENDED_KEY_BYTES && expectedVersion !== undefined) {\n // Safe by construction: decoded.length === EXTENDED_KEY_BYTES (82)\n // guarantees indices 0 through 3 exist.\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n const version = (decoded[0]! << 24) | (decoded[1]! << 16) | (decoded[2]! << 8) | decoded[3]!;\n /* eslint-enable @typescript-eslint/no-non-null-assertion */\n\n if (version >>> 0 === expectedVersion >>> 0) {\n return extendedPrefix === \"xprv\" || extendedPrefix === \"tprv\" ? \"xprv\" : \"xpub\";\n }\n }\n\n return undefined;\n }\n\n const decoded = base58Decode(keyBody);\n\n if (decoded?.length === WIF_COMPRESSED_BYTES) {\n return \"wif-compressed\";\n }\n\n if (decoded?.length === WIF_UNCOMPRESSED_BYTES) {\n return \"wif-uncompressed\";\n }\n\n return undefined;\n}\n\nexport interface KeyExpressionOptions {\n /** Bare 64-hex x-only keys (BIP-386) are only valid directly inside tr(). */\n readonly allowXOnly: boolean;\n}\n\nexport function parseKeyExpression(\n raw: string,\n options: KeyExpressionOptions,\n): KeyExpressionResult {\n const split = splitOrigin(raw);\n\n if (\"ok\" in split) {\n return split;\n }\n\n const { origin, remainder } = split;\n const slashIndex = remainder.indexOf(\"/\");\n const keyBody = slashIndex === -1 ? remainder : remainder.slice(0, slashIndex);\n const trailingText = slashIndex === -1 ? \"\" : remainder.slice(slashIndex);\n const kind = classifyKeyMaterial(keyBody);\n\n if (kind === undefined) {\n return fail(`unrecognized key material: ${keyBody}`);\n }\n\n if (kind === \"hex-xonly\" && !options.allowXOnly) {\n return fail(\"bare x-only (64 hex character) keys are only valid inside tr()\");\n }\n\n if (kind !== \"xpub\" && kind !== \"xprv\" && trailingText.length > 0) {\n return fail(\"a derivation path is only allowed after an extended (xpub/xprv) key\");\n }\n\n const trailing = parseTrailingPath(trailingText);\n\n if (trailing === undefined) {\n return fail(`invalid derivation path: ${trailingText}`);\n }\n\n const key: KeyExpression = {\n raw,\n kind,\n ...(origin !== undefined ? { origin } : {}),\n path: trailing.path,\n isRanged: trailing.isRanged,\n };\n\n return { ok: true, key };\n}\n","import { hasValidCharset } from \"./checksum\";\n\nexport type TokenKind = \"lparen\" | \"rparen\" | \"comma\" | \"lbrace\" | \"rbrace\" | \"atom\";\n\n/**\n * A lexical token. `atom` tokens capture everything between structural\n * delimiters as one unit: function names, numbers, hex, WIF/xpub/xprv key\n * material, key origins, and multipath specifiers never contain `(`, `)`,\n * `,`, `{`, or `}`, so this greedy grouping is unambiguous without regex.\n */\nexport interface Token {\n readonly kind: TokenKind;\n readonly text: string;\n readonly position: number;\n}\n\nexport interface TokenizeSuccess {\n readonly ok: true;\n readonly tokens: readonly Token[];\n}\n\nexport interface TokenizeFailure {\n readonly ok: false;\n readonly position: number;\n}\n\nexport type TokenizeResult = TokenizeSuccess | TokenizeFailure;\n\nconst STRUCTURAL: Readonly<Record<string, TokenKind>> = {\n \"(\": \"lparen\",\n \")\": \"rparen\",\n \",\": \"comma\",\n \"{\": \"lbrace\",\n \"}\": \"rbrace\",\n};\n\nexport function tokenize(text: string): TokenizeResult {\n const tokens: Token[] = [];\n\n let index = 0;\n\n while (index < text.length) {\n // Safe by construction: bounded by the `index < text.length` guard.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const char = text[index]!;\n const structuralKind = STRUCTURAL[char];\n\n if (structuralKind !== undefined) {\n tokens.push({ kind: structuralKind, text: char, position: index });\n index += 1;\n\n continue;\n }\n\n const start = index;\n\n let atom = \"\";\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n while (index < text.length && STRUCTURAL[text[index]!] === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const atomChar = text[index]!;\n\n if (!hasValidCharset(atomChar)) {\n return { ok: false, position: index };\n }\n\n atom += atomChar;\n index += 1;\n }\n\n tokens.push({ kind: \"atom\", text: atom, position: start });\n }\n\n return { ok: true, tokens };\n}\n","import type { KeyExpression, ScriptNode, TapTree } from \"./types\";\n\nexport function forEachKey(node: ScriptNode, visit: (key: KeyExpression) => void): void {\n switch (node.kind) {\n case \"pk\":\n case \"pkh\":\n case \"wpkh\":\n case \"combo\":\n visit(node.key);\n\n break;\n case \"sh\":\n case \"wsh\":\n forEachKey(node.inner, visit);\n\n break;\n case \"multi\":\n node.keys.forEach(visit);\n\n break;\n case \"raw\":\n case \"addr\":\n break;\n case \"tr\":\n visit(node.internalKey);\n\n if (node.tree !== undefined) {\n forEachKeyInTree(node.tree, visit);\n }\n\n break;\n }\n}\n\nfunction forEachKeyInTree(tree: TapTree, visit: (key: KeyExpression) => void): void {\n if (tree.kind === \"leaf\") {\n visit(tree.script.key);\n\n return;\n }\n\n forEachKeyInTree(tree.left, visit);\n forEachKeyInTree(tree.right, visit);\n}\n\nexport function anyKeyRanged(node: ScriptNode): boolean {\n let ranged = false;\n\n forEachKey(node, (key) => {\n if (key.isRanged) {\n ranged = true;\n }\n });\n\n return ranged;\n}\n\nexport interface TapLeafWithDepth {\n readonly key: KeyExpression;\n readonly depth: number;\n}\n\n/** Depth is the number of sibling hashes needed in the control block. */\nexport function collectTapLeaves(tree: TapTree, depth = 0): TapLeafWithDepth[] {\n if (tree.kind === \"leaf\") {\n return [{ key: tree.script.key, depth }];\n }\n\n return [...collectTapLeaves(tree.left, depth + 1), ...collectTapLeaves(tree.right, depth + 1)];\n}\n","import { checksumVerify } from \"./checksum\";\nimport { parseKeyExpression } from \"./key-expression\";\nimport type { Token, TokenKind } from \"./tokenizer\";\nimport { tokenize } from \"./tokenizer\";\nimport { anyKeyRanged } from \"./traverse\";\nimport type {\n KeyExpression,\n ParsedDescriptor,\n ParseFailure,\n ParseFailureReason,\n ParseResult,\n ScriptNode,\n TapLeafScript,\n TapTree,\n} from \"./types\";\n\nconst CHECKSUM_LENGTH = 8;\nconst HEX_PAIR = 2;\n\ntype Context = { readonly place: \"top\" } | { readonly place: \"sh\" } | { readonly place: \"wsh\" };\n\nfunction keyLimit(context: Context): number {\n if (context.place === \"top\") {\n return 3;\n }\n\n if (context.place === \"sh\") {\n return 15;\n }\n\n return 20;\n}\n\nfunction requireCompressed(context: Context): boolean {\n return context.place === \"wsh\";\n}\n\nfunction isCompressedCapable(key: KeyExpression): boolean {\n return (\n key.kind === \"hex-compressed\" ||\n key.kind === \"wif-compressed\" ||\n key.kind === \"xpub\" ||\n key.kind === \"xprv\"\n );\n}\n\nclass Cursor {\n private position = 0;\n\n constructor(private readonly tokens: readonly Token[]) {}\n\n peek(): Token | undefined {\n return this.tokens[this.position];\n }\n\n advance(): Token | undefined {\n const token = this.tokens[this.position];\n\n this.position += 1;\n\n return token;\n }\n\n atEnd(): boolean {\n return this.position >= this.tokens.length;\n }\n}\n\nfunction fail(reason: ParseFailureReason, message: string, position?: number): ParseFailure {\n return { ok: false, reason, message, ...(position !== undefined ? { position } : {}) };\n}\n\ntype NodeResult = { readonly ok: true; readonly node: ScriptNode } | ParseFailure;\ntype KeyResult = { readonly ok: true; readonly key: KeyExpression } | ParseFailure;\ntype TreeResult = { readonly ok: true; readonly tree: TapTree } | ParseFailure;\n\ntype TokenResult = { readonly ok: true; readonly token: Token } | ParseFailure;\n\nfunction expectKind(cursor: Cursor, kind: TokenKind, what: string): TokenResult {\n const token = cursor.advance();\n\n if (token === undefined) {\n return fail(\"unexpected-token\", `expected ${what} but reached the end of the descriptor`);\n }\n\n if (token.kind !== kind) {\n return fail(\"unexpected-token\", `expected ${what}`, token.position);\n }\n\n return { ok: true, token };\n}\n\nfunction isFailure(value: { readonly ok: boolean }): value is ParseFailure {\n return !value.ok;\n}\n\nfunction parseKey(cursor: Cursor, allowXOnly: boolean): KeyResult {\n const token = cursor.advance();\n\n if (token === undefined) {\n return fail(\n \"unexpected-token\",\n \"expected a key expression but reached the end of the descriptor\",\n );\n }\n\n if (token.kind !== \"atom\") {\n return fail(\"unexpected-token\", \"expected a key expression\", token.position);\n }\n\n const result = parseKeyExpression(token.text, { allowXOnly });\n\n if (!result.ok) {\n return fail(\"invalid-key-expression\", result.message, token.position);\n }\n\n return { ok: true, key: result.key };\n}\n\nfunction parseNumber(cursor: Cursor): { readonly ok: true; readonly value: number } | ParseFailure {\n const token = cursor.advance();\n\n if (token === undefined) {\n return fail(\"unexpected-token\", \"expected a number but reached the end of the descriptor\");\n }\n\n if (\n token.kind !== \"atom\" ||\n !/^[0-9]+$/.test(token.text) ||\n !Number.isSafeInteger(Number(token.text))\n ) {\n return fail(\"unexpected-token\", \"expected a number\", token.position);\n }\n\n return { ok: true, value: Number(token.text) };\n}\n\nfunction parseSingleKeyNode(\n cursor: Cursor,\n kind: \"pk\" | \"pkh\" | \"wpkh\",\n context: Context,\n position: number,\n): NodeResult {\n const keyResult = parseKey(cursor, false);\n\n if (isFailure(keyResult)) {\n return keyResult;\n }\n\n if ((kind === \"wpkh\" || requireCompressed(context)) && !isCompressedCapable(keyResult.key)) {\n return fail(\"invalid-key-expression\", `${kind}() requires a compressed key`, position);\n }\n\n const closeResult = expectKind(cursor, \"rparen\", `')' to close ${kind}(...)`);\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, node: { kind, key: keyResult.key } };\n}\n\nfunction parseMultiNode(\n cursor: Cursor,\n sorted: boolean,\n context: Context,\n position: number,\n): NodeResult {\n const thresholdResult = parseNumber(cursor);\n\n if (isFailure(thresholdResult)) {\n return thresholdResult;\n }\n\n const keys: KeyExpression[] = [];\n\n for (;;) {\n const comma = expectKind(cursor, \"comma\", \"',' before a key in multi(...)\");\n\n if (isFailure(comma)) {\n return comma;\n }\n\n const keyResult = parseKey(cursor, false);\n\n if (isFailure(keyResult)) {\n return keyResult;\n }\n\n if (requireCompressed(context) && !isCompressedCapable(keyResult.key)) {\n return fail(\"invalid-key-expression\", \"keys inside wsh() must be compressed\", position);\n }\n\n keys.push(keyResult.key);\n\n if (cursor.peek()?.kind !== \"comma\") {\n break;\n }\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close multi(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n const limit = keyLimit(context);\n\n if (keys.length > limit) {\n return fail(\n \"key-count-exceeded\",\n `at most ${String(limit)} keys are allowed in this context`,\n position,\n );\n }\n\n if (thresholdResult.value < 1 || thresholdResult.value > keys.length) {\n return fail(\"invalid-context\", \"threshold must be between 1 and the number of keys\", position);\n }\n\n return { ok: true, node: { kind: \"multi\", threshold: thresholdResult.value, keys, sorted } };\n}\n\nfunction parseTapLeaf(cursor: Cursor): TreeResult {\n const nameToken = cursor.advance();\n\n if (nameToken === undefined) {\n return fail(\n \"unexpected-token\",\n \"expected a tapscript leaf but reached the end of the descriptor\",\n );\n }\n\n if (nameToken.kind !== \"atom\" || nameToken.text !== \"pk\") {\n return fail(\n \"unsupported\",\n \"tapscript leaves are limited to pk(KEY) in this version; other miniscript fragments are not yet supported\",\n nameToken.position,\n );\n }\n\n const lparen = expectKind(cursor, \"lparen\", \"'(' after pk\");\n\n if (isFailure(lparen)) {\n return lparen;\n }\n\n const keyResult = parseKey(cursor, true);\n\n if (isFailure(keyResult)) {\n return keyResult;\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close pk(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n const leaf: TapLeafScript = { kind: \"pk\", key: keyResult.key };\n\n return { ok: true, tree: { kind: \"leaf\", script: leaf } };\n}\n\nfunction parseTapTree(cursor: Cursor): TreeResult {\n if (cursor.peek()?.kind === \"lbrace\") {\n cursor.advance();\n\n const leftResult = parseTapTree(cursor);\n\n if (isFailure(leftResult)) {\n return leftResult;\n }\n\n const comma = expectKind(cursor, \"comma\", \"',' inside a tapscript tree branch\");\n\n if (isFailure(comma)) {\n return comma;\n }\n\n const rightResult = parseTapTree(cursor);\n\n if (isFailure(rightResult)) {\n return rightResult;\n }\n\n const closeResult = expectKind(cursor, \"rbrace\", \"'}' to close a tapscript tree branch\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, tree: { kind: \"branch\", left: leftResult.tree, right: rightResult.tree } };\n }\n\n return parseTapLeaf(cursor);\n}\n\nfunction parseTr(cursor: Cursor): NodeResult {\n const keyResult = parseKey(cursor, true);\n\n if (isFailure(keyResult)) {\n return keyResult;\n }\n\n if (cursor.peek()?.kind === \"rparen\") {\n cursor.advance();\n\n return { ok: true, node: { kind: \"tr\", internalKey: keyResult.key } };\n }\n\n const comma = expectKind(cursor, \"comma\", \"',' before the tapscript tree in tr(...)\");\n\n if (isFailure(comma)) {\n return comma;\n }\n\n const treeResult = parseTapTree(cursor);\n\n if (isFailure(treeResult)) {\n return treeResult;\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close tr(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, node: { kind: \"tr\", internalKey: keyResult.key, tree: treeResult.tree } };\n}\n\nfunction parseRaw(cursor: Cursor, position: number): NodeResult {\n const token = cursor.advance();\n\n if (token === undefined) {\n return fail(\"unexpected-token\", \"expected hex data in raw(...)\", position);\n }\n\n if (\n token.kind !== \"atom\" ||\n !/^[0-9a-fA-F]+$/.test(token.text) ||\n token.text.length % HEX_PAIR !== 0\n ) {\n return fail(\"invalid-context\", \"raw() requires an even-length hex string\", token.position);\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close raw(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, node: { kind: \"raw\", hex: token.text.toLowerCase() } };\n}\n\nfunction parseAddr(cursor: Cursor, position: number): NodeResult {\n const token = cursor.advance();\n\n if (token?.kind !== \"atom\") {\n return fail(\"unexpected-token\", \"expected an address in addr(...)\", position);\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close addr(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, node: { kind: \"addr\", address: token.text } };\n}\n\nfunction parseScript(cursor: Cursor, context: Context): NodeResult {\n const nameToken = cursor.advance();\n\n if (nameToken === undefined) {\n return fail(\n \"unexpected-token\",\n \"expected a script expression but reached the end of the descriptor\",\n );\n }\n\n if (nameToken.kind !== \"atom\") {\n return fail(\"unexpected-token\", \"expected a function name\", nameToken.position);\n }\n\n const name = nameToken.text;\n const position = nameToken.position;\n const lparen = expectKind(cursor, \"lparen\", `'(' after ${name}`);\n\n if (isFailure(lparen)) {\n return lparen;\n }\n\n switch (name) {\n case \"pk\":\n case \"pkh\":\n return parseSingleKeyNode(cursor, name, context, position);\n case \"wpkh\": {\n if (context.place === \"wsh\") {\n return fail(\"invalid-context\", \"wpkh() is not allowed inside wsh()\", position);\n }\n\n return parseSingleKeyNode(cursor, \"wpkh\", context, position);\n }\n\n case \"sh\": {\n if (context.place !== \"top\") {\n return fail(\"invalid-context\", \"sh() is only allowed at the top level\", position);\n }\n\n const innerResult = parseScript(cursor, { place: \"sh\" });\n\n if (isFailure(innerResult)) {\n return innerResult;\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close sh(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, node: { kind: \"sh\", inner: innerResult.node } };\n }\n\n case \"wsh\": {\n if (context.place === \"wsh\") {\n return fail(\"invalid-context\", \"wsh() cannot be nested inside wsh()\", position);\n }\n\n const innerResult = parseScript(cursor, { place: \"wsh\" });\n\n if (isFailure(innerResult)) {\n return innerResult;\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close wsh(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, node: { kind: \"wsh\", inner: innerResult.node } };\n }\n\n case \"multi\":\n case \"sortedmulti\":\n return parseMultiNode(cursor, name === \"sortedmulti\", context, position);\n case \"combo\": {\n if (context.place !== \"top\") {\n return fail(\"invalid-context\", \"combo() is only allowed at the top level\", position);\n }\n\n const keyResult = parseKey(cursor, false);\n\n if (isFailure(keyResult)) {\n return keyResult;\n }\n\n const closeResult = expectKind(cursor, \"rparen\", \"')' to close combo(...)\");\n\n if (isFailure(closeResult)) {\n return closeResult;\n }\n\n return { ok: true, node: { kind: \"combo\", key: keyResult.key } };\n }\n\n case \"raw\": {\n if (context.place !== \"top\") {\n return fail(\"invalid-context\", \"raw() is only allowed at the top level\", position);\n }\n\n return parseRaw(cursor, position);\n }\n\n case \"addr\": {\n if (context.place !== \"top\") {\n return fail(\"invalid-context\", \"addr() is only allowed at the top level\", position);\n }\n\n return parseAddr(cursor, position);\n }\n\n case \"tr\": {\n if (context.place !== \"top\") {\n return fail(\"invalid-context\", \"tr() is only allowed at the top level\", position);\n }\n\n return parseTr(cursor);\n }\n\n case \"musig\":\n return fail(\"unsupported\", \"musig() (BIP-390) is not implemented\", position);\n case \"sp\":\n return fail(\"unsupported\", \"sp() (BIP-392, silent payments) is not implemented\", position);\n default:\n return fail(\"unknown-function\", `unknown script expression: ${name}`, position);\n }\n}\n\n/**\n * Parses a BIP-380 descriptor string into an AST, without deriving any keys\n * or scriptPubKeys. See the README for exactly which fragments are\n * supported in this version.\n */\nexport function parseDescriptor(text: string): ParseResult {\n const hashIndex = text.indexOf(\"#\");\n const scriptText = hashIndex === -1 ? text : text.slice(0, hashIndex);\n const tokenizeResult = tokenize(scriptText);\n\n if (!tokenizeResult.ok) {\n return fail(\n \"invalid-character\",\n \"the descriptor contains a character outside the allowed charset\",\n tokenizeResult.position,\n );\n }\n\n if (hashIndex !== -1) {\n const checksumText = text.slice(hashIndex + 1);\n\n if (checksumText.length !== CHECKSUM_LENGTH || !checksumVerify(scriptText, checksumText)) {\n return fail(\"invalid-checksum\", \"the descriptor checksum does not match its script\");\n }\n }\n\n const cursor = new Cursor(tokenizeResult.tokens);\n const scriptResult = parseScript(cursor, { place: \"top\" });\n\n if (isFailure(scriptResult)) {\n return scriptResult;\n }\n\n if (!cursor.atEnd()) {\n return fail(\n \"unexpected-token\",\n \"unexpected trailing content after the descriptor\",\n cursor.peek()?.position,\n );\n }\n\n const descriptor: ParsedDescriptor = {\n script: scriptResult.node,\n ...(hashIndex !== -1 ? { checksum: text.slice(hashIndex + 1) } : {}),\n isRanged: anyKeyRanged(scriptResult.node),\n };\n\n return { ok: true, descriptor };\n}\n"]}
@@ -0,0 +1,107 @@
1
+ /** BIP-32 derivation index, 0 to 2^31-1 inclusive (the hardened flag is tracked separately). */
2
+ interface PathStep {
3
+ readonly index: number;
4
+ readonly hardened: boolean;
5
+ }
6
+ /** A BIP-389 multipath element, e.g. the `<0;1>` in `.../0/<0;1>/*`. */
7
+ interface MultipathElement {
8
+ readonly kind: "multipath";
9
+ readonly values: readonly PathStep[];
10
+ }
11
+ type PathElement = ({
12
+ readonly kind: "step";
13
+ } & PathStep) | MultipathElement;
14
+ interface KeyOrigin {
15
+ /** 8 lowercase hex characters. */
16
+ readonly fingerprint: string;
17
+ readonly path: readonly PathStep[];
18
+ }
19
+ type KeyMaterialKind = "hex-compressed" | "hex-uncompressed" | "hex-xonly" | "wif-compressed" | "wif-uncompressed" | "xpub" | "xprv";
20
+ interface KeyExpression {
21
+ readonly raw: string;
22
+ readonly kind: KeyMaterialKind;
23
+ readonly origin?: KeyOrigin;
24
+ /** Derivation path applied to the key material, empty for non-extended keys. */
25
+ readonly path: readonly PathElement[];
26
+ /** True when the path ends in `/*` or a hardened variant. */
27
+ readonly isRanged: boolean;
28
+ }
29
+ /** v1 scope: tapscript leaves are limited to a single `pk()` fragment. */
30
+ interface TapLeafScript {
31
+ readonly kind: "pk";
32
+ readonly key: KeyExpression;
33
+ }
34
+ type TapTree = {
35
+ readonly kind: "leaf";
36
+ readonly script: TapLeafScript;
37
+ } | {
38
+ readonly kind: "branch";
39
+ readonly left: TapTree;
40
+ readonly right: TapTree;
41
+ };
42
+ type ScriptNode = {
43
+ readonly kind: "pk";
44
+ readonly key: KeyExpression;
45
+ } | {
46
+ readonly kind: "pkh";
47
+ readonly key: KeyExpression;
48
+ } | {
49
+ readonly kind: "wpkh";
50
+ readonly key: KeyExpression;
51
+ } | {
52
+ readonly kind: "sh";
53
+ readonly inner: ScriptNode;
54
+ } | {
55
+ readonly kind: "wsh";
56
+ readonly inner: ScriptNode;
57
+ } | {
58
+ readonly kind: "multi";
59
+ readonly threshold: number;
60
+ readonly keys: readonly KeyExpression[];
61
+ readonly sorted: boolean;
62
+ } | {
63
+ readonly kind: "combo";
64
+ readonly key: KeyExpression;
65
+ } | {
66
+ readonly kind: "raw";
67
+ readonly hex: string;
68
+ } | {
69
+ readonly kind: "addr";
70
+ readonly address: string;
71
+ } | {
72
+ readonly kind: "tr";
73
+ readonly internalKey: KeyExpression;
74
+ readonly tree?: TapTree;
75
+ };
76
+ interface ParsedDescriptor {
77
+ readonly script: ScriptNode;
78
+ /** Present only when the input string included a `#checksum` suffix. */
79
+ readonly checksum?: string;
80
+ readonly isRanged: boolean;
81
+ }
82
+ type ParseFailureReason = "invalid-character" | "invalid-checksum" | "unexpected-token" | "unknown-function" | "invalid-key-expression" | "invalid-context" | "key-count-exceeded" | "unsupported";
83
+ interface ParseFailure {
84
+ readonly ok: false;
85
+ readonly reason: ParseFailureReason;
86
+ readonly message: string;
87
+ /** Character offset into the original string, when known. */
88
+ readonly position?: number;
89
+ }
90
+ interface ParseSuccess {
91
+ readonly ok: true;
92
+ readonly descriptor: ParsedDescriptor;
93
+ }
94
+ type ParseResult = ParseSuccess | ParseFailure;
95
+ type WeightFailureReason = "opaque-script" | "ambiguous-script-type" | "unsupported";
96
+ interface WeightFailure {
97
+ readonly ok: false;
98
+ readonly reason: WeightFailureReason;
99
+ readonly message: string;
100
+ }
101
+ interface WeightSuccess {
102
+ readonly ok: true;
103
+ readonly weight: number;
104
+ }
105
+ type WeightResult = WeightSuccess | WeightFailure;
106
+
107
+ export type { KeyExpression as K, MultipathElement as M, ParseFailure as P, ScriptNode as S, TapTree as T, WeightFailure as W, KeyMaterialKind as a, KeyOrigin as b, ParseFailureReason as c, ParseResult as d, ParsedDescriptor as e, PathElement as f, PathStep as g, TapLeafScript as h, WeightFailureReason as i, WeightResult as j };
@@ -0,0 +1,107 @@
1
+ /** BIP-32 derivation index, 0 to 2^31-1 inclusive (the hardened flag is tracked separately). */
2
+ interface PathStep {
3
+ readonly index: number;
4
+ readonly hardened: boolean;
5
+ }
6
+ /** A BIP-389 multipath element, e.g. the `<0;1>` in `.../0/<0;1>/*`. */
7
+ interface MultipathElement {
8
+ readonly kind: "multipath";
9
+ readonly values: readonly PathStep[];
10
+ }
11
+ type PathElement = ({
12
+ readonly kind: "step";
13
+ } & PathStep) | MultipathElement;
14
+ interface KeyOrigin {
15
+ /** 8 lowercase hex characters. */
16
+ readonly fingerprint: string;
17
+ readonly path: readonly PathStep[];
18
+ }
19
+ type KeyMaterialKind = "hex-compressed" | "hex-uncompressed" | "hex-xonly" | "wif-compressed" | "wif-uncompressed" | "xpub" | "xprv";
20
+ interface KeyExpression {
21
+ readonly raw: string;
22
+ readonly kind: KeyMaterialKind;
23
+ readonly origin?: KeyOrigin;
24
+ /** Derivation path applied to the key material, empty for non-extended keys. */
25
+ readonly path: readonly PathElement[];
26
+ /** True when the path ends in `/*` or a hardened variant. */
27
+ readonly isRanged: boolean;
28
+ }
29
+ /** v1 scope: tapscript leaves are limited to a single `pk()` fragment. */
30
+ interface TapLeafScript {
31
+ readonly kind: "pk";
32
+ readonly key: KeyExpression;
33
+ }
34
+ type TapTree = {
35
+ readonly kind: "leaf";
36
+ readonly script: TapLeafScript;
37
+ } | {
38
+ readonly kind: "branch";
39
+ readonly left: TapTree;
40
+ readonly right: TapTree;
41
+ };
42
+ type ScriptNode = {
43
+ readonly kind: "pk";
44
+ readonly key: KeyExpression;
45
+ } | {
46
+ readonly kind: "pkh";
47
+ readonly key: KeyExpression;
48
+ } | {
49
+ readonly kind: "wpkh";
50
+ readonly key: KeyExpression;
51
+ } | {
52
+ readonly kind: "sh";
53
+ readonly inner: ScriptNode;
54
+ } | {
55
+ readonly kind: "wsh";
56
+ readonly inner: ScriptNode;
57
+ } | {
58
+ readonly kind: "multi";
59
+ readonly threshold: number;
60
+ readonly keys: readonly KeyExpression[];
61
+ readonly sorted: boolean;
62
+ } | {
63
+ readonly kind: "combo";
64
+ readonly key: KeyExpression;
65
+ } | {
66
+ readonly kind: "raw";
67
+ readonly hex: string;
68
+ } | {
69
+ readonly kind: "addr";
70
+ readonly address: string;
71
+ } | {
72
+ readonly kind: "tr";
73
+ readonly internalKey: KeyExpression;
74
+ readonly tree?: TapTree;
75
+ };
76
+ interface ParsedDescriptor {
77
+ readonly script: ScriptNode;
78
+ /** Present only when the input string included a `#checksum` suffix. */
79
+ readonly checksum?: string;
80
+ readonly isRanged: boolean;
81
+ }
82
+ type ParseFailureReason = "invalid-character" | "invalid-checksum" | "unexpected-token" | "unknown-function" | "invalid-key-expression" | "invalid-context" | "key-count-exceeded" | "unsupported";
83
+ interface ParseFailure {
84
+ readonly ok: false;
85
+ readonly reason: ParseFailureReason;
86
+ readonly message: string;
87
+ /** Character offset into the original string, when known. */
88
+ readonly position?: number;
89
+ }
90
+ interface ParseSuccess {
91
+ readonly ok: true;
92
+ readonly descriptor: ParsedDescriptor;
93
+ }
94
+ type ParseResult = ParseSuccess | ParseFailure;
95
+ type WeightFailureReason = "opaque-script" | "ambiguous-script-type" | "unsupported";
96
+ interface WeightFailure {
97
+ readonly ok: false;
98
+ readonly reason: WeightFailureReason;
99
+ readonly message: string;
100
+ }
101
+ interface WeightSuccess {
102
+ readonly ok: true;
103
+ readonly weight: number;
104
+ }
105
+ type WeightResult = WeightSuccess | WeightFailure;
106
+
107
+ export type { KeyExpression as K, MultipathElement as M, ParseFailure as P, ScriptNode as S, TapTree as T, WeightFailure as W, KeyMaterialKind as a, KeyOrigin as b, ParseFailureReason as c, ParseResult as d, ParsedDescriptor as e, PathElement as f, PathStep as g, TapLeafScript as h, WeightFailureReason as i, WeightResult as j };
@@ -0,0 +1,68 @@
1
+ import { W as WeightFailure, S as ScriptNode, j as WeightResult } from './types-Dr-JC_LD.cjs';
2
+
3
+ /**
4
+ * Chain parameters as data, not code. `addr()` output weight only needs the
5
+ * base58 version bytes (bech32 addresses carry no chain-specific information
6
+ * relevant to weight). Add a chain by constructing a new `ChainParams`
7
+ * object; nothing else in this package needs to change.
8
+ */
9
+ interface ChainParams {
10
+ readonly name: string;
11
+ readonly bech32Hrp: string;
12
+ readonly base58PubKeyHash: number;
13
+ readonly base58ScriptHash: number;
14
+ }
15
+ declare const BITCOIN: ChainParams;
16
+ declare const BITCOIN_TESTNET: ChainParams;
17
+ declare const LITECOIN: ChainParams;
18
+ declare const LITECOIN_TESTNET: ChainParams;
19
+
20
+ /** Exported for direct unit testing of its boundaries; not part of the public barrel. */
21
+ declare function compactSizeBytes(value: number): number;
22
+ /** Exported for direct unit testing of its boundaries; not part of the public barrel. */
23
+ declare function pushDataPrefixBytes(length: number): number;
24
+ interface WeightOptions {
25
+ /** Only used to interpret `addr()` base58 version bytes. Defaults to Bitcoin mainnet. */
26
+ readonly chain?: ChainParams;
27
+ }
28
+ /** Return the maximum absolute input weight in weight units, under segwit transaction serialization. */
29
+ declare function inputWeight(node: ScriptNode): WeightResult;
30
+ /** Return the serialized output weight in weight units. */
31
+ declare function outputWeight(node: ScriptNode, options?: WeightOptions): WeightResult;
32
+ interface DescribedMultisig {
33
+ readonly type: "p2sh-multisig" | "p2wsh-multisig" | "p2sh-p2wsh-multisig";
34
+ readonly m: number;
35
+ readonly n: number;
36
+ }
37
+ interface DescribedRawInput {
38
+ readonly type: "raw";
39
+ readonly scriptSigBytes: number;
40
+ readonly witnessBytes: number;
41
+ }
42
+ type DescribedInput = "p2pk" | "p2pkh" | "p2wpkh" | "p2sh-p2wpkh" | "p2tr" | DescribedMultisig | DescribedRawInput;
43
+ type DescribeInputResult = {
44
+ readonly ok: true;
45
+ readonly description: DescribedInput;
46
+ } | WeightFailure;
47
+ /**
48
+ * Maps a descriptor fragment to a value structurally assignable to
49
+ * `utxo-coinselect`'s `InputType`, without either package depending on the
50
+ * other. Fails with `opaque-script` for `addr()`/`raw()` (spending script
51
+ * unknown) and `ambiguous-script-type` for `combo()` (multiple candidate
52
+ * scripts). Every other supported fragment always succeeds, falling back to
53
+ * an exact `{ type: "raw", ... }` shape when there is no named catalog entry.
54
+ */
55
+ declare function describeInput(node: ScriptNode): DescribeInputResult;
56
+ interface DescribedRawOutput {
57
+ readonly type: "raw";
58
+ readonly scriptPubKeyBytes: number;
59
+ }
60
+ type DescribedOutput = "p2pk" | "p2pkh" | "p2sh" | "p2wpkh" | "p2wsh" | "p2tr" | DescribedRawOutput;
61
+ type DescribeOutputResult = {
62
+ readonly ok: true;
63
+ readonly description: DescribedOutput;
64
+ } | WeightFailure;
65
+ /** Maps a descriptor fragment to a value structurally assignable to `utxo-coinselect`'s `OutputType`. */
66
+ declare function describeOutput(node: ScriptNode, options?: WeightOptions): DescribeOutputResult;
67
+
68
+ export { BITCOIN as B, type ChainParams as C, type DescribeInputResult as D, LITECOIN as L, type WeightOptions as W, BITCOIN_TESTNET as a, type DescribeOutputResult as b, type DescribedInput as c, type DescribedMultisig as d, type DescribedOutput as e, type DescribedRawInput as f, type DescribedRawOutput as g, LITECOIN_TESTNET as h, describeInput as i, describeOutput as j, inputWeight as k, compactSizeBytes as l, outputWeight as o, pushDataPrefixBytes as p };
@@ -0,0 +1,68 @@
1
+ import { W as WeightFailure, S as ScriptNode, j as WeightResult } from './types-Dr-JC_LD.js';
2
+
3
+ /**
4
+ * Chain parameters as data, not code. `addr()` output weight only needs the
5
+ * base58 version bytes (bech32 addresses carry no chain-specific information
6
+ * relevant to weight). Add a chain by constructing a new `ChainParams`
7
+ * object; nothing else in this package needs to change.
8
+ */
9
+ interface ChainParams {
10
+ readonly name: string;
11
+ readonly bech32Hrp: string;
12
+ readonly base58PubKeyHash: number;
13
+ readonly base58ScriptHash: number;
14
+ }
15
+ declare const BITCOIN: ChainParams;
16
+ declare const BITCOIN_TESTNET: ChainParams;
17
+ declare const LITECOIN: ChainParams;
18
+ declare const LITECOIN_TESTNET: ChainParams;
19
+
20
+ /** Exported for direct unit testing of its boundaries; not part of the public barrel. */
21
+ declare function compactSizeBytes(value: number): number;
22
+ /** Exported for direct unit testing of its boundaries; not part of the public barrel. */
23
+ declare function pushDataPrefixBytes(length: number): number;
24
+ interface WeightOptions {
25
+ /** Only used to interpret `addr()` base58 version bytes. Defaults to Bitcoin mainnet. */
26
+ readonly chain?: ChainParams;
27
+ }
28
+ /** Return the maximum absolute input weight in weight units, under segwit transaction serialization. */
29
+ declare function inputWeight(node: ScriptNode): WeightResult;
30
+ /** Return the serialized output weight in weight units. */
31
+ declare function outputWeight(node: ScriptNode, options?: WeightOptions): WeightResult;
32
+ interface DescribedMultisig {
33
+ readonly type: "p2sh-multisig" | "p2wsh-multisig" | "p2sh-p2wsh-multisig";
34
+ readonly m: number;
35
+ readonly n: number;
36
+ }
37
+ interface DescribedRawInput {
38
+ readonly type: "raw";
39
+ readonly scriptSigBytes: number;
40
+ readonly witnessBytes: number;
41
+ }
42
+ type DescribedInput = "p2pk" | "p2pkh" | "p2wpkh" | "p2sh-p2wpkh" | "p2tr" | DescribedMultisig | DescribedRawInput;
43
+ type DescribeInputResult = {
44
+ readonly ok: true;
45
+ readonly description: DescribedInput;
46
+ } | WeightFailure;
47
+ /**
48
+ * Maps a descriptor fragment to a value structurally assignable to
49
+ * `utxo-coinselect`'s `InputType`, without either package depending on the
50
+ * other. Fails with `opaque-script` for `addr()`/`raw()` (spending script
51
+ * unknown) and `ambiguous-script-type` for `combo()` (multiple candidate
52
+ * scripts). Every other supported fragment always succeeds, falling back to
53
+ * an exact `{ type: "raw", ... }` shape when there is no named catalog entry.
54
+ */
55
+ declare function describeInput(node: ScriptNode): DescribeInputResult;
56
+ interface DescribedRawOutput {
57
+ readonly type: "raw";
58
+ readonly scriptPubKeyBytes: number;
59
+ }
60
+ type DescribedOutput = "p2pk" | "p2pkh" | "p2sh" | "p2wpkh" | "p2wsh" | "p2tr" | DescribedRawOutput;
61
+ type DescribeOutputResult = {
62
+ readonly ok: true;
63
+ readonly description: DescribedOutput;
64
+ } | WeightFailure;
65
+ /** Maps a descriptor fragment to a value structurally assignable to `utxo-coinselect`'s `OutputType`. */
66
+ declare function describeOutput(node: ScriptNode, options?: WeightOptions): DescribeOutputResult;
67
+
68
+ export { BITCOIN as B, type ChainParams as C, type DescribeInputResult as D, LITECOIN as L, type WeightOptions as W, BITCOIN_TESTNET as a, type DescribeOutputResult as b, type DescribedInput as c, type DescribedMultisig as d, type DescribedOutput as e, type DescribedRawInput as f, type DescribedRawOutput as g, LITECOIN_TESTNET as h, describeInput as i, describeOutput as j, inputWeight as k, compactSizeBytes as l, outputWeight as o, pushDataPrefixBytes as p };