{"version":3,"file":"validation-CDbOaDj7.cjs","sources":["../src/tbv/core/utils/abortSignals.ts","../src/tbv/core/utils/validation.ts"],"sourcesContent":["/**\n * AbortSignal composition helpers.\n *\n * @module utils/abortSignals\n */\n\nexport interface CombinedAbortSignal {\n  signal: AbortSignal;\n  /** Remove listeners from the source signals. Call once the request settles. */\n  cleanup: () => void;\n}\n\n/**\n * Compose several AbortSignals into one that aborts when any input aborts,\n * propagating the reason of whichever fired first.\n *\n * Deliberately does NOT use `AbortSignal.any`: that shipped in Chrome 116 /\n * Safari 17.4, newer than the browsers this SDK is consumed from, and it is a\n * runtime API so no transpile step can backfill it. Calling it directly threw\n * `TypeError: AbortSignal.any is not a function` before `fetch` was ever\n * reached, which failed UTXO fetches, fee estimation and transaction broadcast\n * outright on those browsers.\n */\nexport function combineAbortSignals(\n  signals: AbortSignal[],\n): CombinedAbortSignal {\n  const noop = () => {};\n\n  const alreadyAborted = signals.find((signal) => signal.aborted);\n  if (alreadyAborted) return { signal: alreadyAborted, cleanup: noop };\n  if (signals.length === 1) return { signal: signals[0], cleanup: noop };\n\n  const controller = new AbortController();\n  const listeners = signals.map((source) => {\n    const onAbort = () => controller.abort(source.reason);\n    source.addEventListener(\"abort\", onAbort, { once: true });\n    return { source, onAbort };\n  });\n\n  const cleanup = () => {\n    for (const { source, onAbort } of listeners) {\n      source.removeEventListener(\"abort\", onAbort);\n    }\n  };\n\n  return { signal: controller.signal, cleanup };\n}\n","/**\n * Shared validation constants for Bitcoin-related input sanitization.\n *\n * These are used across mempool API clients, broadcast services, and\n * transaction construction to enforce consistent format checks.\n */\n\n/** Non-empty string of hexadecimal characters (case-insensitive). */\nexport const HEX_RE = /^[0-9a-fA-F]+$/;\n\n/** Bitcoin txid: exactly 64 hex characters (32 bytes). */\nexport const TXID_RE = /^[0-9a-fA-F]{64}$/;\n\n/**\n * Bitcoin address format gate: 25–90 alphanumeric characters.\n * Covers legacy (P2PKH/P2SH), bech32 (P2WPKH/P2WSH), bech32m (P2TR),\n * and regtest addresses (bcrt1... which are 62–64 chars for 32-byte witness programs).\n * Upper bound of 90 provides headroom for future address formats.\n * This is a format gate to prevent path-traversal — not full address validation.\n */\nexport const BITCOIN_ADDRESS_RE = /^[a-zA-Z0-9]{25,90}$/;\n\n/**\n * Known Bitcoin scriptPubKey prefixes:\n * - P2PKH:  76a914...88ac (25 bytes)\n * - P2SH:   a914...87    (23 bytes)\n * - P2WPKH: 0014...      (22 bytes)\n * - P2WSH:  0020...      (34 bytes)\n * - P2TR:   5120...      (34 bytes)\n */\nexport const KNOWN_SCRIPT_PREFIXES = [\n  \"76a914\",\n  \"a914\",\n  \"0014\",\n  \"0020\",\n  \"5120\",\n] as const;\n\n/**\n * Upper bound on the implied miner fee (0.01 BTC = 1,000,000 sats).\n * Catches inflated input values from a compromised mempool API — if inputs are\n * grossly overstated the implied fee becomes unreasonably large. The April 2024\n * Runes spike saw ~450 sat/vB; at 500 vB that's ~225k sats, well under this cap.\n */\nexport const MAX_REASONABLE_FEE_SATS = 1_000_000n;\n"],"names":["combineAbortSignals","signals","noop","alreadyAborted","signal","controller","listeners","source","onAbort","cleanup","HEX_RE","TXID_RE","BITCOIN_ADDRESS_RE","KNOWN_SCRIPT_PREFIXES","MAX_REASONABLE_FEE_SATS"],"mappings":"aAuBO,SAASA,EACdC,EACqB,CACrB,MAAMC,EAAO,IAAM,CAAC,EAEdC,EAAiBF,EAAQ,KAAMG,GAAWA,EAAO,OAAO,EAC9D,GAAID,EAAgB,MAAO,CAAE,OAAQA,EAAgB,QAASD,CAAA,EAC9D,GAAID,EAAQ,SAAW,EAAG,MAAO,CAAE,OAAQA,EAAQ,CAAC,EAAG,QAASC,CAAA,EAEhE,MAAMG,EAAa,IAAI,gBACjBC,EAAYL,EAAQ,IAAKM,GAAW,CACxC,MAAMC,EAAU,IAAMH,EAAW,MAAME,EAAO,MAAM,EACpD,OAAAA,EAAO,iBAAiB,QAASC,EAAS,CAAE,KAAM,GAAM,EACjD,CAAE,OAAAD,EAAQ,QAAAC,CAAA,CACnB,CAAC,EAEKC,EAAU,IAAM,CACpB,SAAW,CAAE,OAAAF,EAAQ,QAAAC,CAAA,IAAaF,EAChCC,EAAO,oBAAoB,QAASC,CAAO,CAE/C,EAEA,MAAO,CAAE,OAAQH,EAAW,OAAQ,QAAAI,CAAA,CACtC,CCtCO,MAAMC,EAAS,iBAGTC,EAAU,oBASVC,EAAqB,uBAUrBC,EAAwB,CACnC,SACA,OACA,OACA,OACA,MACF,EAQaC,EAA0B"}