@babylonlabs-io/ts-sdk 0.13.1 → 0.13.2

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,"file":"errors-D19BQSaj.js","sources":["../src/tbv/core/utils/utxo/selectUtxos.ts","../src/tbv/core/utils/transaction/btcTxHash.ts","../src/tbv/core/utils/transaction/createSplitTransaction.ts","../src/tbv/core/utils/btc/scriptType.ts","../src/tbv/core/utils/btc/psbtInputFields.ts","../src/tbv/core/utils/signing.ts","../src/tbv/core/clients/mempool/mempoolApi.ts","../src/tbv/core/contracts/abis/BTCVaultRegistry.abi.ts","../src/tbv/core/contracts/errors.ts","../src/tbv/core/managers/PeginManager.ts","../src/tbv/core/managers/PayoutManager.ts","../../../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/hmac.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/_md.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/legacy.js","../../../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/sha2.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/sha3.js","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/pbkdf2.js","../../../node_modules/.pnpm/@scure+bip39@2.0.1/node_modules/@scure/bip39/index.js","../src/tbv/core/wots/derivation.ts","../src/tbv/core/wots/deriveWotsPkHash.ts","../src/tbv/core/wots/errors.ts"],"sourcesContent":["/**\n * UTXO selection utilities for peg-in transactions.\n * Follows btc-staking-ts methodology with iterative fee calculation.\n */\n\nimport { script as bitcoinScript } from \"bitcoinjs-lib\";\nimport { Buffer } from \"buffer\";\n\nimport {\n BTC_DUST_SAT,\n DUST_THRESHOLD,\n MAX_NON_LEGACY_OUTPUT_SIZE,\n P2TR_INPUT_SIZE,\n rateBasedTxBufferFee,\n TX_BUFFER_SIZE_OVERHEAD,\n} from \"../fee/constants\";\n\n/**\n * Unspent Transaction Output (UTXO) for funding peg-in transactions.\n */\nexport interface UTXO {\n /**\n * Transaction ID of the UTXO (64-char hex without 0x prefix).\n */\n txid: string;\n\n /**\n * Output index within the transaction.\n */\n vout: number;\n\n /**\n * Value in satoshis.\n */\n value: number;\n\n /**\n * Script public key hex.\n */\n scriptPubKey: string;\n}\n\nexport interface UTXOSelectionResult {\n selectedUTXOs: UTXO[];\n totalValue: bigint;\n fee: bigint;\n changeAmount: bigint;\n}\n\n/**\n * Selects UTXOs to fund a peg-in transaction with iterative fee calculation.\n *\n * This function implements the btc-staking-ts approach:\n * 1. Filter UTXOs for script validity (no minimum value filter)\n * 2. Sort by value (largest first) to minimize number of inputs\n * 3. Iteratively add UTXOs and recalculate fee until we have enough\n *\n * The fee recalculation is critical because:\n * - Each UTXO added increases transaction size → increases fee\n * - More fee needed might require another UTXO\n * - Change output detection affects fee (adds output size if needed)\n *\n * @param availableUTXOs - All available UTXOs from wallet\n * @param peginAmount - Amount to peg in (satoshis)\n * @param feeRate - Fee rate (sat/vbyte)\n * @param numOutputs - Number of outputs in the unfunded transaction (HTLC + CPFP anchor, before change)\n * @returns Selected UTXOs, total value, calculated fee, and change amount\n * @throws Error if insufficient funds or no valid UTXOs\n */\nexport function selectUtxosForPegin(\n availableUTXOs: UTXO[],\n peginAmount: bigint,\n feeRate: number,\n numOutputs: number,\n): UTXOSelectionResult {\n if (!Number.isInteger(numOutputs) || numOutputs < 1) {\n throw new Error(\n `Invalid numOutputs: expected a positive integer, got ${numOutputs}`,\n );\n }\n\n if (availableUTXOs.length === 0) {\n throw new Error(\"Insufficient funds: no UTXOs available\");\n }\n\n // Filter for script validity ONLY (matching btc-staking-ts approach)\n // No minimum value filter - we accept any UTXO with valid script\n const validUTXOs = availableUTXOs.filter((utxo) => {\n const script = Buffer.from(utxo.scriptPubKey, \"hex\");\n const decompiledScript = bitcoinScript.decompile(script);\n return !!decompiledScript;\n });\n\n if (validUTXOs.length === 0) {\n throw new Error(\n \"Insufficient funds: no valid UTXOs available (all have invalid scripts)\",\n );\n }\n\n // Sort by value: HIGHEST to LOWEST (use big UTXOs first)\n // Use spread to avoid mutating the original array\n const sortedUTXOs = [...validUTXOs].sort((a, b) => b.value - a.value);\n\n const selectedUTXOs: UTXO[] = [];\n let accumulatedValue = 0n;\n let estimatedFee = 0n;\n\n // Iteratively select UTXOs and recalculate fee\n for (const utxo of sortedUTXOs) {\n selectedUTXOs.push(utxo);\n accumulatedValue += BigInt(utxo.value);\n\n // Recalculate fee based on CURRENT number of inputs\n const inputSize = selectedUTXOs.length * P2TR_INPUT_SIZE;\n const outputSize = numOutputs * MAX_NON_LEGACY_OUTPUT_SIZE;\n const baseTxSize = inputSize + outputSize + TX_BUFFER_SIZE_OVERHEAD;\n\n // Calculate base fee with buffer\n estimatedFee =\n BigInt(Math.ceil(baseTxSize * feeRate)) +\n BigInt(rateBasedTxBufferFee(feeRate));\n\n // Check if there will be change left after pegin amount and fee\n const changeAmount = accumulatedValue - peginAmount - estimatedFee;\n\n // If change is above dust, add fee for change output\n if (changeAmount > DUST_THRESHOLD) {\n const changeOutputFee = BigInt(\n Math.ceil(MAX_NON_LEGACY_OUTPUT_SIZE * feeRate),\n );\n estimatedFee += changeOutputFee;\n }\n\n // Check if we have enough to cover pegin amount + fees\n if (accumulatedValue >= peginAmount + estimatedFee) {\n // Success! We have enough funds\n const finalChangeAmount = accumulatedValue - peginAmount - estimatedFee;\n\n return {\n selectedUTXOs,\n totalValue: accumulatedValue,\n fee: estimatedFee,\n changeAmount: finalChangeAmount,\n };\n }\n }\n\n // If we get here, we don't have enough funds\n throw new Error(\n `Insufficient funds: need ${peginAmount + estimatedFee} sats (${peginAmount} pegin + ${estimatedFee} fee), have ${accumulatedValue} sats`,\n );\n}\n\n/**\n * Checks if change amount is above dust threshold.\n *\n * @param changeAmount - Change amount in satoshis\n * @returns true if change should be added as output, false if it should go to miners\n */\nexport function shouldAddChangeOutput(changeAmount: bigint): boolean {\n return changeAmount > DUST_THRESHOLD;\n}\n\n/**\n * Gets the dust threshold value.\n *\n * @returns Dust threshold in satoshis\n */\nexport function getDustThreshold(): number {\n return BTC_DUST_SAT;\n}\n","/**\n * Bitcoin Transaction Hash Utilities\n *\n * Provides utilities for calculating Bitcoin transaction hashes in a way that matches\n * the contract's BtcUtils.hashBtcTx() implementation.\n */\n\nimport { Transaction } from \"bitcoinjs-lib\";\nimport type { Hex } from \"viem\";\n\n/**\n * Calculate Bitcoin transaction hash\n *\n * This matches the contract's BtcUtils.hashBtcTx() implementation:\n * 1. Double SHA256 the transaction bytes\n * 2. Reverse the byte order (Bitcoin convention)\n *\n * The resulting hash is used as the unique vault identifier in the BTCVaultRegistry contract.\n *\n * @param txHex - Transaction hex (with or without 0x prefix)\n * @returns The transaction hash as Hex (with 0x prefix)\n */\nexport function calculateBtcTxHash(txHex: string): Hex {\n // Remove 0x prefix if present\n const cleanHex = txHex.startsWith(\"0x\") ? txHex.slice(2) : txHex;\n\n // Use bitcoinjs-lib to calculate transaction ID (already does double SHA256 + reverse)\n const tx = Transaction.fromHex(cleanHex);\n const txid = tx.getId();\n\n // Return with 0x prefix to match Ethereum hex format\n return `0x${txid}` as Hex;\n}\n","/**\n * UTXO Split Transaction Builder\n *\n * Creates Bitcoin transactions that split input UTXOs into multiple outputs.\n * Used for multi-vault peg-in flow when user doesn't have enough separate UTXOs.\n *\n * Transaction Flow:\n * 1. createSplitTransaction() → unsigned transaction with deterministic txid\n * 2. createSplitTransactionPsbt() → PSBT ready for wallet signing\n * 3. Wallet signs PSBT → signed transaction\n * 4. Broadcast to Bitcoin network → outputs become available for pegin transactions\n *\n * @module utils/transaction/createSplitTransaction\n */\n\nimport { address as bitcoinAddress, Psbt, Transaction } from \"bitcoinjs-lib\";\nimport { Buffer } from \"buffer\";\n\nimport type { Network } from \"../../primitives\";\nimport type { UTXO } from \"../utxo/selectUtxos\";\n\nimport { getNetwork } from \"./fundPeginTransaction\";\n\n/**\n * Output specification for split transaction.\n */\nexport interface SplitOutput {\n /** Amount in satoshis */\n amount: bigint;\n /** Bitcoin address to send to */\n address: string;\n}\n\n/**\n * Result of creating a split transaction.\n */\nexport interface SplitTransactionResult {\n /** Unsigned transaction hex */\n txHex: string;\n /** Transaction ID (deterministic, calculated before signing) */\n txid: string;\n /** Output UTXOs that will be created when transaction is broadcast */\n outputs: Array<{\n /** Transaction ID of this output */\n txid: string;\n /** Output index */\n vout: number;\n /** Amount in satoshis */\n value: number;\n /** Script pubkey hex */\n scriptPubKey: string;\n }>;\n}\n\n/**\n * Create a UTXO split transaction.\n *\n * This function creates a Bitcoin transaction that takes input UTXOs\n * and splits them into multiple outputs with specified amounts.\n *\n * The transaction is returned unsigned. The caller must:\n * 1. Sign the transaction using a Bitcoin wallet\n * 2. Broadcast it to the Bitcoin network\n * 3. Use the output UTXOs for subsequent peg-in transactions\n *\n * @param inputs - Input UTXOs to split\n * @param outputs - Desired output amounts and addresses\n * @param network - Bitcoin network (mainnet, testnet, signet, regtest)\n * @returns Unsigned transaction hex, txid, and output UTXO references\n * @throws Error if inputs or outputs are empty\n * @throws Error if address decoding fails (invalid address for network)\n *\n * @example\n * ```typescript\n * const result = createSplitTransaction(\n * [{ txid: \"abc...\", vout: 0, value: 100000, scriptPubKey: \"...\" }],\n * [\n * { amount: 50000n, address: \"tb1p...\" },\n * { amount: 45000n, address: \"tb1p...\" }\n * ],\n * \"testnet\"\n * );\n * // result.txHex → unsigned transaction\n * // result.txid → deterministic transaction ID\n * // result.outputs → UTXO references for pegin creation\n * ```\n */\nexport function createSplitTransaction(\n inputs: UTXO[],\n outputs: SplitOutput[],\n network: Network,\n): SplitTransactionResult {\n // Validate inputs\n if (inputs.length === 0) {\n throw new Error(\"No input UTXOs provided for split transaction\");\n }\n\n if (outputs.length === 0) {\n throw new Error(\"No outputs specified for split transaction\");\n }\n\n // Validate all output amounts are positive\n for (const output of outputs) {\n if (output.amount <= 0n) {\n throw new Error(\n `Invalid output amount for ${output.address}: ${output.amount} satoshis. ` +\n `Amount must be greater than zero.`,\n );\n }\n }\n\n // Get bitcoinjs-lib network\n const btcNetwork = getNetwork(network);\n\n // Create transaction with BIP 68/112/113 compatibility\n const tx = new Transaction();\n tx.version = 2;\n\n // Add inputs\n for (const input of inputs) {\n // Bitcoin uses reversed byte order for txid\n const txidBuffer = Buffer.from(input.txid, \"hex\").reverse();\n tx.addInput(txidBuffer, input.vout);\n }\n\n // Add outputs\n const outputUtxos: SplitTransactionResult[\"outputs\"] = [];\n\n for (let i = 0; i < outputs.length; i++) {\n const output = outputs[i];\n\n // Decode address to get script pubkey\n let outputScript: Buffer;\n try {\n const decoded = bitcoinAddress.toOutputScript(output.address, btcNetwork);\n outputScript = decoded;\n } catch (error) {\n throw new Error(\n `Failed to decode address \"${output.address}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n tx.addOutput(outputScript, Number(output.amount));\n\n // Store output UTXO reference (will be created when tx is broadcast)\n outputUtxos.push({\n txid: \"\", // Will be set after txid calculation\n vout: i,\n value: Number(output.amount),\n scriptPubKey: outputScript.toString(\"hex\"),\n });\n }\n\n // Get unsigned transaction hex\n const txHex = tx.toHex();\n\n // Calculate txid (this is deterministic for unsigned transactions)\n const txid = tx.getId();\n\n // Update output UTXO txids\n for (const output of outputUtxos) {\n output.txid = txid;\n }\n\n return {\n txHex,\n txid,\n outputs: outputUtxos,\n };\n}\n\n/**\n * Create a PSBT for signing a split transaction with Taproot inputs.\n *\n * IMPORTANT: This function assumes ALL inputs are P2TR (Taproot) addresses.\n * It unconditionally adds tapInternalKey for Taproot signing. Using non-P2TR\n * inputs will cause wallet signing failures.\n *\n * This function takes an unsigned split transaction and creates a PSBT\n * that is intended to be signed by a Bitcoin wallet; this function does not\n * perform any signing itself.\n *\n * The PSBT includes:\n * - witnessUtxo: Script and value for each input (required for segwit)\n * - tapInternalKey: Depositor's x-only pubkey (required for P2TR signing)\n *\n * Technical Note:\n * For P2TR (Taproot) inputs, we need the witnessUtxo and tapInternalKey.\n * This is different from legacy inputs which would need the full previous transaction.\n *\n * @param unsignedTxHex - Unsigned transaction hex from createSplitTransaction\n * @param inputs - Input UTXOs with full data for PSBT\n * @param publicKeyNoCoord - Depositor's public key (x-only, 32 bytes) for P2TR signing\n * @returns PSBT hex ready for wallet signing\n * @throws Error if publicKeyNoCoord is not a 32-byte Buffer\n * @throws Error if UTXO count doesn't match transaction inputs\n * @throws Error if any input is not P2TR format\n *\n * @example\n * ```typescript\n * const psbtHex = createSplitTransactionPsbt(\n * result.txHex,\n * inputUtxos,\n * Buffer.from(depositorPubkeyXOnly, \"hex\")\n * );\n * // Sign via wallet\n * const signedPsbtHex = await wallet.signPsbt(psbtHex);\n * ```\n */\nexport function createSplitTransactionPsbt(\n unsignedTxHex: string,\n inputs: UTXO[],\n publicKeyNoCoord: Buffer,\n): string {\n const tx = Transaction.fromHex(unsignedTxHex);\n const psbt = new Psbt();\n\n psbt.setVersion(tx.version);\n psbt.setLocktime(tx.locktime);\n\n // Validate tapInternalKey is a 32-byte x-only public key\n if (!Buffer.isBuffer(publicKeyNoCoord) || publicKeyNoCoord.length !== 32) {\n throw new Error(\n `Invalid publicKeyNoCoord: expected 32-byte Buffer (x-only pubkey), got ${\n Buffer.isBuffer(publicKeyNoCoord)\n ? `${publicKeyNoCoord.length}-byte Buffer`\n : typeof publicKeyNoCoord\n }`,\n );\n }\n\n // Validate UTXO array length matches transaction inputs\n if (inputs.length !== tx.ins.length) {\n throw new Error(\n `UTXO count mismatch: transaction has ${tx.ins.length} input${tx.ins.length !== 1 ? \"s\" : \"\"}, ` +\n `but ${inputs.length} UTXO${inputs.length !== 1 ? \"s were\" : \" was\"} provided`,\n );\n }\n\n // Add inputs with UTXO data for P2TR signing\n for (let i = 0; i < tx.ins.length; i++) {\n const input = tx.ins[i];\n const utxo = inputs[i];\n\n if (!utxo) {\n throw new Error(`Missing UTXO data for input ${i}`);\n }\n\n // Validate UTXO outpoint matches transaction input\n const expectedTxid = Buffer.from(input.hash).reverse().toString(\"hex\");\n const expectedVout = input.index;\n\n if (utxo.txid !== expectedTxid || utxo.vout !== expectedVout) {\n throw new Error(\n `Input ${i} outpoint mismatch: ` +\n `transaction expects ${expectedTxid}:${expectedVout}, ` +\n `but UTXO ${utxo.txid}:${utxo.vout} was provided. ` +\n `Ensure inputs array matches the order used in createSplitTransaction().`,\n );\n }\n\n // Validate input is P2TR (required for tapInternalKey)\n const inputScript = Buffer.from(utxo.scriptPubKey, \"hex\");\n const isP2TR =\n inputScript.length === 34 &&\n inputScript[0] === 0x51 && // OP_1 (witness version 1)\n inputScript[1] === 0x20; // push 32 bytes\n\n if (!isP2TR) {\n throw new Error(\n `Input ${i} must be P2TR (Taproot). ` +\n `createSplitTransactionPsbt() requires P2TR inputs because it uses ` +\n `tapInternalKey for Taproot signing. ` +\n `ScriptPubKey: ${utxo.scriptPubKey.substring(0, 20)}...`,\n );\n }\n\n // IMPORTANT: Assumes P2TR inputs. tapInternalKey is only valid for Taproot.\n // Using this function with non-P2TR inputs will cause wallet signing to fail.\n const witnessUtxo = {\n script: Buffer.from(utxo.scriptPubKey, \"hex\"),\n value: utxo.value,\n };\n\n psbt.addInput({\n hash: input.hash,\n index: input.index,\n sequence: input.sequence,\n witnessUtxo,\n tapInternalKey: publicKeyNoCoord,\n });\n }\n\n // Add outputs\n for (const output of tx.outs) {\n psbt.addOutput({\n script: output.script,\n value: output.value,\n });\n }\n\n return psbt.toHex();\n}\n","/**\n * Bitcoin Script Type Detection\n *\n * Utilities to detect Bitcoin script types for proper PSBT input construction.\n *\n * @module utils/btc/scriptType\n */\n\n/**\n * Bitcoin script types.\n */\nexport enum BitcoinScriptType {\n P2PKH = \"P2PKH\",\n P2SH = \"P2SH\",\n P2WPKH = \"P2WPKH\",\n P2WSH = \"P2WSH\",\n P2TR = \"P2TR\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Detect the type of a Bitcoin script.\n *\n * @param scriptPubKey - The script public key buffer\n * @returns The detected script type\n *\n * @example\n * ```typescript\n * const scriptType = getScriptType(Buffer.from(scriptPubKeyHex, 'hex'));\n * if (scriptType === BitcoinScriptType.P2TR) {\n * // Handle Taproot input\n * }\n * ```\n */\nexport function getScriptType(scriptPubKey: Buffer): BitcoinScriptType {\n const length = scriptPubKey.length;\n\n // P2PKH: OP_DUP OP_HASH160 <20 bytes> OP_EQUALVERIFY OP_CHECKSIG (25 bytes)\n if (\n length === 25 &&\n scriptPubKey[0] === 0x76 && // OP_DUP\n scriptPubKey[1] === 0xa9 && // OP_HASH160\n scriptPubKey[2] === 0x14 && // Push 20 bytes\n scriptPubKey[23] === 0x88 && // OP_EQUALVERIFY\n scriptPubKey[24] === 0xac // OP_CHECKSIG\n ) {\n return BitcoinScriptType.P2PKH;\n }\n\n // P2SH: OP_HASH160 <20 bytes> OP_EQUAL (23 bytes)\n if (\n length === 23 &&\n scriptPubKey[0] === 0xa9 && // OP_HASH160\n scriptPubKey[1] === 0x14 && // Push 20 bytes\n scriptPubKey[22] === 0x87 // OP_EQUAL\n ) {\n return BitcoinScriptType.P2SH;\n }\n\n // P2WPKH: OP_0 <20 bytes> (22 bytes)\n if (\n length === 22 &&\n scriptPubKey[0] === 0x00 && // OP_0\n scriptPubKey[1] === 0x14 // Push 20 bytes\n ) {\n return BitcoinScriptType.P2WPKH;\n }\n\n // P2WSH: OP_0 <32 bytes> (34 bytes)\n if (\n length === 34 &&\n scriptPubKey[0] === 0x00 && // OP_0\n scriptPubKey[1] === 0x20 // Push 32 bytes\n ) {\n return BitcoinScriptType.P2WSH;\n }\n\n // P2TR (Taproot): OP_1 <32 bytes> (34 bytes)\n if (\n length === 34 &&\n scriptPubKey[0] === 0x51 && // OP_1\n scriptPubKey[1] === 0x20 // Push 32 bytes\n ) {\n return BitcoinScriptType.P2TR;\n }\n\n return BitcoinScriptType.UNKNOWN;\n}\n\n","/**\n * PSBT Input Field Construction\n *\n * Constructs the correct PSBT input fields for a given UTXO based on its script type.\n *\n * @module utils/btc/psbtInputFields\n */\n\nimport { Buffer } from \"buffer\";\n\nimport { BitcoinScriptType, getScriptType } from \"./scriptType\";\n\n/**\n * PSBT input fields for supported script types (P2TR, P2WPKH, P2WSH).\n */\nexport interface PsbtInputFields {\n witnessUtxo?: {\n script: Buffer;\n value: number;\n };\n witnessScript?: Buffer;\n tapInternalKey?: Buffer;\n}\n\n/**\n * UTXO information for PSBT construction.\n *\n * Only supports Taproot (P2TR) and native SegWit (P2WPKH, P2WSH) script types.\n */\nexport interface UtxoForPsbt {\n /** Transaction ID of the UTXO */\n txid: string;\n /** Output index (vout) of the UTXO */\n vout: number;\n /** Value of the UTXO in satoshis */\n value: number;\n /** ScriptPubKey of the UTXO (hex string) */\n scriptPubKey: string;\n /** Witness script (required for P2WSH) */\n witnessScript?: string;\n}\n\n/**\n * Get PSBT input fields for a given UTXO based on its script type.\n *\n * Only supports Taproot (P2TR) and native SegWit (P2WPKH, P2WSH) script types.\n *\n * @param utxo - The unspent transaction output to process\n * @param publicKeyNoCoord - The x-only public key (32 bytes) for Taproot signing\n * @returns PSBT input fields object containing the necessary data\n * @throws Error if required input data is missing or unsupported script type\n */\nexport function getPsbtInputFields(\n utxo: UtxoForPsbt,\n publicKeyNoCoord?: Buffer,\n): PsbtInputFields {\n const scriptPubKey = Buffer.from(utxo.scriptPubKey, \"hex\");\n const type = getScriptType(scriptPubKey);\n\n switch (type) {\n case BitcoinScriptType.P2WPKH: {\n return {\n witnessUtxo: {\n script: scriptPubKey,\n value: utxo.value,\n },\n };\n }\n\n case BitcoinScriptType.P2WSH: {\n if (!utxo.witnessScript) {\n throw new Error(\"Missing witnessScript for P2WSH input\");\n }\n return {\n witnessUtxo: {\n script: scriptPubKey,\n value: utxo.value,\n },\n witnessScript: Buffer.from(utxo.witnessScript, \"hex\"),\n };\n }\n\n case BitcoinScriptType.P2TR: {\n if (publicKeyNoCoord && publicKeyNoCoord.length !== 32) {\n throw new Error(\n `Invalid tapInternalKey length: expected 32 bytes, got ${publicKeyNoCoord.length}`,\n );\n }\n return {\n witnessUtxo: {\n script: scriptPubKey,\n value: utxo.value,\n },\n // tapInternalKey is needed for Taproot signing\n ...(publicKeyNoCoord && { tapInternalKey: publicKeyNoCoord }),\n };\n }\n\n default:\n throw new Error(`Unsupported script type: ${type}`);\n }\n}\n\n","import type { SignPsbtOptions } from \"../../../shared/wallets/interfaces\";\n\n/**\n * Create SignPsbtOptions for Taproot script-path PSBT signing.\n *\n * All vault protocol signing operations are Taproot script-path spends that\n * require `disableTweakSigner: true` (untweaked key) and `autoFinalized: false`\n * (to preserve tapScriptSig for Schnorr signature extraction).\n *\n * @param publicKey - Signer's BTC public key (hex). Accepts both compressed\n * (66-char) and x-only (64-char) formats — the wallet connector handles both.\n * @param inputCount - Number of inputs to sign. Generates entries\n * for indices 0 through inputCount-1.\n */\nexport function createTaprootScriptPathSignOptions(\n publicKey: string,\n inputCount: number,\n): SignPsbtOptions {\n if (!Number.isInteger(inputCount) || inputCount < 1) {\n throw new Error(`inputCount must be a positive integer, got ${inputCount}`);\n }\n\n return {\n autoFinalized: false,\n signInputs: Array.from({ length: inputCount }, (_, i) => ({\n index: i,\n publicKey,\n disableTweakSigner: true,\n })),\n };\n}\n","/**\n * Mempool API Client\n *\n * Client for interacting with mempool.space API for Bitcoin network operations.\n * Used for broadcasting transactions and fetching UTXO data.\n *\n * @module clients/mempool/mempoolApi\n */\n\nimport type { MempoolUTXO, NetworkFees, TxInfo, UtxoInfo } from \"./types\";\n\n/** Maximum valid satoshi value: 21 million BTC × 10^8 sats/BTC */\nconst MAX_SATOSHIS = 21_000_000 * 1e8;\n\n/**\n * Maximum sane fee rate in sat/vByte.\n * The April 2024 Runes spike peaked around 1,805 sat/vB — 10,000 provides ample headroom.\n */\nconst MAX_FEE_RATE = 10_000;\n\nfunction isValidSatoshiValue(value: number): boolean {\n return Number.isInteger(value) && value > 0 && value <= MAX_SATOSHIS;\n}\n\nfunction isValidFeeRate(value: number): boolean {\n return Number.isInteger(value) && value > 0 && value <= MAX_FEE_RATE;\n}\n\nfunction isValidVout(vout: number, outputCount?: number): boolean {\n if (!Number.isInteger(vout) || vout < 0) return false;\n return outputCount === undefined || vout < outputCount;\n}\n\n/**\n * Default mempool API URLs by network.\n */\nexport const MEMPOOL_API_URLS = {\n mainnet: \"https://mempool.space/api\",\n testnet: \"https://mempool.space/testnet/api\",\n signet: \"https://mempool.space/signet/api\",\n} as const;\n\n/**\n * Fetch wrapper with error handling.\n */\nasync function fetchApi<T>(\n url: string,\n options?: RequestInit,\n): Promise<T> {\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Mempool API error (${response.status}): ${errorText || response.statusText}`,\n );\n }\n\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n return (await response.json()) as T;\n } else {\n return (await response.text()) as T;\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to fetch from mempool API: ${error.message}`);\n }\n throw new Error(\"Failed to fetch from mempool API: Unknown error\");\n }\n}\n\n/**\n * Push a signed transaction to the Bitcoin network.\n *\n * @param txHex - The signed transaction hex string\n * @param apiUrl - Mempool API base URL\n * @returns The transaction ID\n * @throws Error if broadcasting fails\n */\nexport async function pushTx(txHex: string, apiUrl: string): Promise<string> {\n try {\n const response = await fetch(`${apiUrl}/tx`, {\n method: \"POST\",\n body: txHex,\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n // Try to extract error message from response using robust JSON parsing\n let message: string | undefined;\n try {\n const errorJson = JSON.parse(errorText);\n message = errorJson.message;\n } catch {\n // Not JSON, use raw text\n message = errorText;\n }\n throw new Error(\n message || `Failed to broadcast transaction: ${response.statusText}`,\n );\n }\n\n // Response is the transaction ID (plain text)\n const txId = await response.text();\n return txId;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to broadcast BTC transaction: ${error.message}`);\n }\n throw new Error(\"Failed to broadcast BTC transaction: Unknown error\");\n }\n}\n\n/**\n * Get transaction information from mempool.\n *\n * @param txid - The transaction ID\n * @param apiUrl - Mempool API base URL\n * @returns Transaction information\n */\nexport async function getTxInfo(txid: string, apiUrl: string): Promise<TxInfo> {\n return fetchApi<TxInfo>(`${apiUrl}/tx/${txid}`);\n}\n\n/**\n * Get the hex representation of a transaction.\n *\n * @param txid - The transaction ID\n * @param apiUrl - Mempool API base URL\n * @returns The transaction hex string\n * @throws Error if the request fails or transaction is not found\n */\nexport async function getTxHex(txid: string, apiUrl: string): Promise<string> {\n try {\n const response = await fetch(`${apiUrl}/tx/${txid}/hex`);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Mempool API error (${response.status}): ${errorText || response.statusText}`,\n );\n }\n\n return await response.text();\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to get transaction hex for ${txid}: ${error.message}`);\n }\n throw new Error(`Failed to get transaction hex for ${txid}: Unknown error`);\n }\n}\n\n/**\n * Get UTXO information for a specific transaction output.\n *\n * This is used for constructing PSBTs where we need the witnessUtxo data.\n * Only supports Taproot (P2TR) and native SegWit (P2WPKH, P2WSH) script types.\n *\n * @param txid - The transaction ID containing the UTXO\n * @param vout - The output index\n * @param apiUrl - Mempool API base URL\n * @returns UTXO information with value and scriptPubKey\n */\nexport async function getUtxoInfo(\n txid: string,\n vout: number,\n apiUrl: string,\n): Promise<UtxoInfo> {\n const txInfo = await getTxInfo(txid, apiUrl);\n\n if (!isValidVout(vout, txInfo.vout.length)) {\n throw new Error(\n `Invalid vout ${vout} for transaction ${txid} (has ${txInfo.vout.length} outputs)`,\n );\n }\n\n const output = txInfo.vout[vout];\n if (!isValidSatoshiValue(output.value)) {\n throw new Error(`Invalid UTXO value ${output.value} for ${txid}:${vout}`);\n }\n\n return {\n txid,\n vout,\n value: output.value,\n scriptPubKey: output.scriptpubkey,\n };\n}\n\n/**\n * Get all UTXOs for a Bitcoin address.\n *\n * @param address - The Bitcoin address\n * @param apiUrl - Mempool API base URL\n * @returns Array of UTXOs sorted by value (largest first)\n */\nexport async function getAddressUtxos(\n address: string,\n apiUrl: string,\n): Promise<MempoolUTXO[]> {\n try {\n // Fetch UTXOs for the address\n const utxos = await fetchApi<\n {\n txid: string;\n vout: number;\n value: number;\n status: {\n confirmed: boolean;\n };\n }[]\n >(`${apiUrl}/address/${address}/utxo`);\n\n // Fetch scriptPubKey for the address\n const addressInfo = await fetchApi<{\n isvalid: boolean;\n scriptPubKey: string;\n }>(`${apiUrl}/v1/validate-address/${address}`);\n\n if (!addressInfo.isvalid) {\n throw new Error(\n `Invalid Bitcoin address: ${address}. Mempool API validation failed.`,\n );\n }\n\n // Validate UTXO fields from the external API.\n // Note: upper-bound vout check is omitted because we don't fetch\n // full transactions here. Out-of-range indices surface downstream.\n for (const utxo of utxos) {\n if (!isValidVout(utxo.vout)) {\n throw new Error(`Invalid vout ${utxo.vout} for ${utxo.txid}`);\n }\n if (!isValidSatoshiValue(utxo.value)) {\n throw new Error(\n `Invalid UTXO value ${utxo.value} for ${utxo.txid}:${utxo.vout}`,\n );\n }\n }\n\n // Sort by value (largest first) and map to our UTXO format\n const sortedUTXOs = utxos.sort((a, b) => b.value - a.value);\n\n return sortedUTXOs.map((utxo) => ({\n txid: utxo.txid,\n vout: utxo.vout,\n value: utxo.value,\n scriptPubKey: addressInfo.scriptPubKey,\n confirmed: utxo.status.confirmed,\n }));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Failed to get UTXOs for address ${address}: ${error.message}`,\n );\n }\n throw new Error(\n `Failed to get UTXOs for address ${address}: Unknown error`,\n );\n }\n}\n\n/**\n * Get the mempool API URL for a given network.\n *\n * @param network - Bitcoin network (mainnet, testnet, signet)\n * @returns The mempool API URL\n */\nexport function getMempoolApiUrl(\n network: \"mainnet\" | \"testnet\" | \"signet\",\n): string {\n return MEMPOOL_API_URLS[network];\n}\n\n/**\n * Transaction summary from address transactions endpoint.\n */\nexport interface AddressTx {\n txid: string;\n status: {\n confirmed: boolean;\n block_height?: number;\n };\n}\n\n/**\n * Get recent transactions for a Bitcoin address.\n *\n * Returns the last 25 confirmed transactions plus any unconfirmed (mempool) transactions.\n * This is useful for checking if a specific transaction has been broadcast.\n *\n * @param address - The Bitcoin address\n * @param apiUrl - Mempool API base URL\n * @returns Array of recent transactions\n */\nexport async function getAddressTxs(\n address: string,\n apiUrl: string,\n): Promise<AddressTx[]> {\n return fetchApi<AddressTx[]>(`${apiUrl}/address/${address}/txs`);\n}\n\n/**\n * Fetches Bitcoin network fee recommendations from mempool.space API.\n *\n * @param apiUrl - Mempool API base URL\n * @returns Fee rates in sat/vbyte for different confirmation times\n * @throws Error if request fails or returns invalid data\n *\n * @see https://mempool.space/docs/api/rest#get-recommended-fees\n */\nexport async function getNetworkFees(apiUrl: string): Promise<NetworkFees> {\n const response = await fetch(`${apiUrl}/v1/fees/recommended`);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch network fees: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n const feeFields = [\n \"fastestFee\",\n \"halfHourFee\",\n \"hourFee\",\n \"economyFee\",\n \"minimumFee\",\n ] as const;\n\n for (const field of feeFields) {\n if (!isValidFeeRate(data[field])) {\n throw new Error(\n `Invalid fee rate ${field}=${data[field]} from mempool API: expected a positive number ≤ ${MAX_FEE_RATE}`,\n );\n }\n }\n\n if (\n data.minimumFee > data.economyFee ||\n data.economyFee > data.hourFee ||\n data.hourFee > data.halfHourFee ||\n data.halfHourFee > data.fastestFee\n ) {\n throw new Error(\n `Fee rate ordering violation from mempool API: expected ` +\n `minimumFee (${data.minimumFee}) <= economyFee (${data.economyFee}) <= ` +\n `hourFee (${data.hourFee}) <= halfHourFee (${data.halfHourFee}) <= ` +\n `fastestFee (${data.fastestFee}).`,\n );\n }\n\n return data as NetworkFees;\n}\n\n","/**\n * BTCVaultRegistry Contract ABI\n *\n * Minimal ABI containing only the functions needed by the SDK.\n * Full ABI is available in the vault service package.\n *\n * @module contracts/abis/BTCVaultRegistry\n */\n\n/**\n * Minimal ABI for BTCVaultRegistry contract.\n * Contains submitPeginRequest, activateVaultWithSecret, getPegInFee, and getBTCVault.\n */\nexport const BTCVaultRegistryABI = [\n {\n type: \"function\",\n name: \"submitPeginRequest\",\n inputs: [\n {\n name: \"depositor\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"depositorBtcPubKey\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"btcPopSignature\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"unsignedPrePeginTx\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"depositorSignedPeginTx\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"vaultProvider\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"hashlock\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"htlcVout\",\n type: \"uint8\",\n internalType: \"uint8\",\n },\n {\n name: \"depositorPayoutBtcAddress\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"depositorWotsPkHash\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"submitPeginRequest\",\n inputs: [\n {\n name: \"depositor\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"depositorBtcPubKey\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"btcPopSignature\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"unsignedPrePeginTx\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"depositorSignedPeginTx\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"vaultProvider\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"hashlock\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"htlcVout\",\n type: \"uint8\",\n internalType: \"uint8\",\n },\n {\n name: \"referralCode\",\n type: \"uint32\",\n internalType: \"uint32\",\n },\n {\n name: \"depositorPayoutBtcAddress\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"depositorWotsPkHash\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"activateVaultWithSecret\",\n inputs: [\n {\n name: \"vaultId\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"s\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"activationMetadata\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"getPegInFee\",\n inputs: [\n {\n name: \"vaultProvider\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"totalFee\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getBTCVault\",\n inputs: [\n {\n name: \"vaultId\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"vault\",\n type: \"tuple\",\n internalType: \"struct IBTCVaultRegistry.BTCVault\",\n components: [\n { name: \"depositor\", type: \"address\", internalType: \"address\" },\n { name: \"depositorBtcPubKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"depositorSignedPeginTx\", type: \"bytes\", internalType: \"bytes\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"vaultProvider\", type: \"address\", internalType: \"address\" },\n { name: \"status\", type: \"uint8\", internalType: \"enum IBTCVaultRegistry.BTCVaultStatus\" },\n { name: \"applicationEntryPoint\", type: \"address\", internalType: \"address\" },\n { name: \"universalChallengersVersion\", type: \"uint16\", internalType: \"uint16\" },\n { name: \"appVaultKeepersVersion\", type: \"uint16\", internalType: \"uint16\" },\n { name: \"offchainParamsVersion\", type: \"uint16\", internalType: \"uint16\" },\n { name: \"createdAt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"verifiedAt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"depositorWotsPkHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"hashlock\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"htlcVout\", type: \"uint8\", internalType: \"uint8\" },\n { name: \"depositorPopSignature\", type: \"bytes\", internalType: \"bytes\" },\n { name: \"prePeginTxHash\", type: \"bytes32\", internalType: \"bytes32\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"error\",\n name: \"InvalidPeginFee\",\n inputs: [\n {\n name: \"provided\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"required\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"InvalidSecret\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"ActivationDeadlineExpired\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"InvalidHashlock\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"DuplicateHashlock\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"CapExceeded\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"InvalidOutputIndex\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"PeginSignaturesIncomplete\",\n inputs: [],\n },\n] as const;\n","/**\n * Contract Error Handling Utilities\n *\n * Provides utilities for extracting and handling contract revert errors.\n * Maps known error selectors to user-friendly messages.\n *\n * @module contracts/errors\n */\n\n/**\n * Known contract error signatures mapped to user-friendly messages.\n *\n * Error selectors are the first 4 bytes of keccak256(error signature).\n * Example: keccak256(\"VaultAlreadyExists()\") = 0x04aabf33...\n */\nexport const CONTRACT_ERRORS: Record<string, string> = {\n // VaultAlreadyExists()\n \"0x04aabf33\":\n \"Vault already exists: This Bitcoin transaction has already been registered. \" +\n \"Please select different UTXOs or use a different amount to create a unique transaction.\",\n // ScriptPubKeyMismatch() - taproot output doesn't match expected script\n \"0x4fec082d\":\n \"Script mismatch: The Bitcoin transaction's taproot output does not match the expected vault script. \" +\n \"This may be caused by incorrect vault participants or key configuration.\",\n // InvalidBTCProofOfPossession()\n \"0x6cc363a5\":\n \"Invalid BTC proof of possession: The signature could not be verified. \" +\n \"Please ensure you're signing with the correct Bitcoin wallet.\",\n // InvalidBTCPublicKey()\n \"0x6c3f2bf6\":\n \"Invalid BTC public key: The Bitcoin public key format is invalid.\",\n // InvalidAmount()\n \"0x2c5211c6\":\n \"Invalid amount: The deposit amount is invalid or below the minimum required.\",\n // ApplicationNotRegistered()\n \"0x0405f772\":\n \"Application not registered: The application controller is not registered in the system.\",\n // InvalidProviderStatus()\n \"0x24e165cc\":\n \"Invalid provider status: The vault provider is not in a valid state to accept deposits.\",\n // ZeroAddress()\n \"0xd92e233d\":\n \"Zero address: One of the required addresses is the zero address.\",\n // BtcKeyMismatch()\n \"0x65aa7007\":\n \"BTC key mismatch: The Bitcoin public key does not match the expected key.\",\n // Unauthorized()\n \"0x82b42900\":\n \"Unauthorized: You must be the depositor or vault provider to submit this transaction.\",\n // InvalidSignature() - common signature verification error\n \"0x8baa579f\":\n \"Invalid signature: The BTC proof of possession signature could not be verified.\",\n // InvalidBtcTransaction()\n \"0x2f9d01e9\":\n \"Invalid BTC transaction: The Bitcoin transaction format is invalid.\",\n // VaultProviderNotRegistered()\n \"0x5a3c6b3e\":\n \"Vault provider not registered: The selected vault provider is not registered.\",\n // InvalidPeginFee(uint256,uint256)\n \"0x979f4518\":\n \"Invalid pegin fee: The ETH fee sent does not match the required amount. \" +\n \"This may indicate a fee rate change during the transaction.\",\n};\n\n/**\n * Extract error data from various error formats.\n *\n * Viem and wallet providers wrap errors in multiple levels. This function\n * searches through the error chain to find the revert data.\n *\n * @param error - The error object to extract data from\n * @returns The error data (e.g., \"0x04aabf33\") or undefined\n */\nexport function extractErrorData(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") return undefined;\n\n const err = error as Record<string, unknown>;\n\n // Check direct properties first\n if (typeof err.data === \"string\" && err.data.startsWith(\"0x\")) {\n return err.data;\n }\n if (typeof err.details === \"string\" && err.details.startsWith(\"0x\")) {\n return err.details;\n }\n\n // Walk the cause chain (viem wraps errors multiple levels deep)\n let current: unknown = err.cause;\n let depth = 0;\n const maxDepth = 5;\n\n while (current && typeof current === \"object\" && depth < maxDepth) {\n const cause = current as Record<string, unknown>;\n if (typeof cause.data === \"string\" && cause.data.startsWith(\"0x\")) {\n return cause.data;\n }\n current = cause.cause;\n depth++;\n }\n\n // Check error message for embedded hex error selector\n const message = typeof err.message === \"string\" ? err.message : \"\";\n const hexMatch = message.match(/\\b(0x[a-fA-F0-9]{8})\\b/);\n if (hexMatch) {\n return hexMatch[1];\n }\n\n return undefined;\n}\n\n/**\n * Get a user-friendly error message for a contract error.\n *\n * @param error - The error object from a contract call\n * @returns A user-friendly error message, or undefined if error is not recognized\n */\nexport function getContractErrorMessage(error: unknown): string | undefined {\n const errorData = extractErrorData(error);\n if (errorData) {\n // Check exact match first, then match by 4-byte selector prefix.\n // Parametric errors (e.g. InvalidPeginFee(uint256,uint256)) return\n // the selector + ABI-encoded args, so the full string won't match.\n const selector = errorData.substring(0, 10); // \"0x\" + 4 bytes\n return CONTRACT_ERRORS[errorData] ?? CONTRACT_ERRORS[selector];\n }\n return undefined;\n}\n\n/**\n * Check if an error is a known contract error.\n *\n * @param error - The error object to check\n * @returns True if the error is a known contract error\n */\nexport function isKnownContractError(error: unknown): boolean {\n const errorData = extractErrorData(error);\n if (errorData === undefined) return false;\n const selector = errorData.substring(0, 10);\n return errorData in CONTRACT_ERRORS || selector in CONTRACT_ERRORS;\n}\n\n/**\n * Handle a contract error by throwing a user-friendly error.\n *\n * This function extracts error data, maps it to a user-friendly message,\n * and throws an appropriate error. Use this in catch blocks after contract calls.\n *\n * @param error - The error from a contract call\n * @throws Always throws an error with a descriptive message\n */\nexport function handleContractError(error: unknown): never {\n // Log full error for debugging\n console.error(\"[Contract Error] Raw error:\", error);\n\n // Extract error data from the error chain\n const errorData = extractErrorData(error);\n console.error(\"[Contract Error] Extracted error data:\", errorData);\n\n // Check for known contract error signatures (exact match or 4-byte selector prefix)\n if (errorData) {\n const selector = errorData.substring(0, 10);\n const knownError = CONTRACT_ERRORS[errorData] ?? CONTRACT_ERRORS[selector];\n if (knownError) {\n console.error(\"[Contract Error] Known error:\", knownError);\n throw new Error(knownError);\n }\n }\n\n // Check for gas estimation errors or internal JSON-RPC errors\n const errorMsg = (error as Error)?.message || \"\";\n if (\n errorMsg.includes(\"gas limit too high\") ||\n errorMsg.includes(\"21000000\") ||\n errorMsg.includes(\"Internal JSON-RPC error\")\n ) {\n // If we found error data but it's not in our known list, include it\n const errorHint = errorData ? ` (error code: ${errorData})` : \"\";\n console.error(\n \"[Contract Error] Transaction rejected. Error code:\",\n errorData,\n \"Message:\",\n errorMsg,\n );\n throw new Error(\n `Transaction failed: The contract rejected this transaction${errorHint}. ` +\n \"Possible causes: (1) Vault already exists for this transaction, \" +\n \"(2) Invalid signature, (3) Unauthorized caller. \" +\n \"Please check your transaction parameters and try again.\",\n );\n }\n\n // Default: re-throw original error with better context\n if (error instanceof Error) {\n console.error(\"[Contract Error] Unhandled error:\", error.message);\n throw error;\n }\n throw new Error(`Contract call failed: ${String(error)}`);\n}\n","/**\n * Peg-in Manager - Wallet Orchestration for Peg-in Operations\n *\n * This module provides the PeginManager class that orchestrates the complete\n * peg-in flow using SDK primitives, utilities, and wallet interfaces.\n *\n * @remarks\n * PeginManager handles the peg-in flow:\n * 1. **preparePegin()** - Build Pre-PegIn HTLC, fund it, sign PegIn input\n * 2. **registerPeginOnChain()** - Submit to Ethereum contract with PoP\n * 3. *(Use {@link PayoutManager} for payout authorization signing)*\n * 4. **signAndBroadcast()** - Sign and broadcast Pre-PegIn tx to Bitcoin network\n *\n * @see {@link PayoutManager} - For Step 3: sign payout transactions\n * @see {@link buildPrePeginPsbt} - Lower-level primitive used internally\n *\n * @module managers/PeginManager\n */\n\nimport * as bitcoin from \"bitcoinjs-lib\";\nimport { Psbt, Transaction } from \"bitcoinjs-lib\";\nimport { Buffer } from \"buffer\";\nimport {\n createPublicClient,\n encodeFunctionData,\n http,\n zeroAddress,\n type Address,\n type Chain,\n type Hex,\n type WalletClient,\n} from \"viem\";\n\nimport type { BitcoinWallet, Hash, SignPsbtOptions } from \"../../../shared/wallets\";\nimport { createTaprootScriptPathSignOptions } from \"../utils/signing\";\nimport { type UtxoInfo, getUtxoInfo, pushTx } from \"../clients/mempool\";\nimport { BTCVaultRegistryABI, handleContractError } from \"../contracts\";\nimport {\n buildPrePeginPsbt,\n buildPeginTxFromFundedPrePegin,\n buildPeginInputPsbt,\n extractPeginInputSignature,\n finalizePeginInputPsbt,\n deriveVaultId,\n type PrePeginParams,\n type Network,\n} from \"../primitives\";\nimport {\n ensureHexPrefix,\n isAddressFromPublicKey,\n stripHexPrefix,\n} from \"../primitives/utils/bitcoin\";\nimport {\n calculateBtcTxHash,\n fundPeginTransaction,\n getNetwork,\n getPsbtInputFields,\n peginOutputCount,\n selectUtxosForPegin,\n type UTXO,\n} from \"../utils\";\n\n/**\n * Configuration for the PeginManager.\n */\nexport interface PeginManagerConfig {\n /**\n * Bitcoin network to use for transactions.\n */\n btcNetwork: Network;\n\n /**\n * Bitcoin wallet for signing peg-in transactions.\n */\n btcWallet: BitcoinWallet;\n\n /**\n * Ethereum wallet for registering peg-in on-chain.\n * Uses viem's WalletClient directly for proper gas estimation.\n */\n ethWallet: WalletClient;\n\n /**\n * Ethereum chain configuration.\n * Required for proper gas estimation in contract calls.\n */\n ethChain: Chain;\n\n /**\n * Vault contract addresses.\n */\n vaultContracts: {\n /**\n * BTCVaultRegistry contract address on Ethereum.\n */\n btcVaultRegistry: Address;\n };\n\n /**\n * Mempool API URL for fetching UTXO data and broadcasting transactions.\n * Use MEMPOOL_API_URLS constant for standard mempool.space URLs, or provide\n * a custom URL if running your own mempool instance.\n */\n mempoolApiUrl: string;\n}\n\n/**\n * Parameters for the pegin flow (pre-pegin + pegin transactions).\n */\nexport interface PreparePeginParams {\n /**\n * Amounts to peg in per HTLC (in satoshis).\n * Must have the same length as `hashlocks`.\n * For single deposits, pass a single-element array.\n */\n amounts: readonly bigint[];\n\n /**\n * Vault provider's BTC public key (x-only, 64-char hex).\n * Can be provided with or without \"0x\" prefix (will be stripped automatically).\n */\n vaultProviderBtcPubkey: string;\n\n /**\n * Vault keeper BTC public keys (x-only, 64-char hex).\n * Can be provided with or without \"0x\" prefix (will be stripped automatically).\n */\n vaultKeeperBtcPubkeys: readonly string[];\n\n /**\n * Universal challenger BTC public keys (x-only, 64-char hex).\n * Can be provided with or without \"0x\" prefix (will be stripped automatically).\n */\n universalChallengerBtcPubkeys: readonly string[];\n\n /**\n * CSV timelock in blocks for the PegIn vault output.\n */\n timelockPegin: number;\n\n /**\n * CSV timelock in blocks for the Pre-PegIn HTLC refund path.\n */\n timelockRefund: number;\n\n /**\n * SHA256 hash commitment(s) for the HTLC (64 hex chars = 32 bytes each).\n * Generated by the depositor as H = SHA256(secret).\n * For single deposits, pass a single-element array.\n */\n hashlocks: readonly string[];\n\n /**\n * Protocol fee rate in sat/vB from the contract offchain params.\n * Used by WASM for computing depositorClaimValue and min pegin fee.\n */\n protocolFeeRate: bigint;\n\n /**\n * Mempool fee rate in sat/vB for funding the Pre-PegIn transaction.\n * Used for UTXO selection and change calculation.\n */\n mempoolFeeRate: number;\n\n /**\n * M in M-of-N council multisig (from contract params).\n */\n councilQuorum: number;\n\n /**\n * N in M-of-N council multisig (from contract params).\n */\n councilSize: number;\n\n /**\n * Available UTXOs from the depositor's wallet for funding the Pre-PegIn transaction.\n */\n availableUTXOs: readonly UTXO[];\n\n /**\n * Bitcoin address for receiving change from the Pre-PegIn transaction.\n */\n changeAddress: string;\n}\n\n/**\n * Result of preparing a pegin.\n */\n/** Per-vault PegIn data derived from a shared Pre-PegIn transaction */\nexport interface PerVaultPeginData {\n /** Index of the HTLC output in the Pre-PegIn transaction (0, 1, 2, ...) */\n htlcVout: number;\n /** HTLC output value in satoshis */\n htlcValue: bigint;\n /** Depositor-signed PegIn transaction hex (for contract registration) */\n peginTxHex: string;\n /** PegIn transaction ID */\n peginTxid: string;\n /** Depositor's Schnorr signature over PegIn input (HTLC leaf 0) */\n peginInputSignature: string;\n /** Vault output scriptPubKey hex */\n vaultScriptPubKey: string;\n}\n\nexport interface PreparePeginResult {\n /** Funded but unsigned Pre-PegIn transaction hex */\n fundedPrePeginTxHex: string;\n /** Funded Pre-PegIn transaction ID */\n prePeginTxid: string;\n /** Unfunded Pre-PegIn transaction hex (for contract DA submission) */\n unsignedPrePeginTxHex: string;\n /** Per-vault PegIn data — one entry per hashlock/amount */\n perVault: PerVaultPeginData[];\n /** UTXOs selected to fund the Pre-PegIn transaction */\n selectedUTXOs: UTXO[];\n /** Transaction fee in satoshis */\n fee: bigint;\n /** Change amount in satoshis (if any) */\n changeAmount: bigint;\n}\n\n\n/**\n * Parameters for signing and broadcasting a transaction.\n */\nexport interface SignAndBroadcastParams {\n /**\n * Funded Pre-PegIn transaction hex from preparePegin().\n */\n fundedPrePeginTxHex: string;\n\n /**\n * Depositor's BTC public key (x-only, 64-char hex).\n * Can be provided with or without \"0x\" prefix.\n * Required for Taproot signing.\n */\n depositorBtcPubkey: string;\n\n /**\n * Optional pre-fetched prevout data for inputs not yet in the mempool.\n * Key format: \"txid:vout\" (e.g. \"abc123...def:0\").\n * When provided, matching inputs skip the mempool API fetch.\n * Useful for split transactions where outputs are unconfirmed.\n */\n localPrevouts?: Record<string, { scriptPubKey: string; value: number }>;\n}\n\n/**\n * Parameters for registering a peg-in on Ethereum.\n */\nexport interface RegisterPeginParams {\n /**\n * Depositor's BTC public key (x-only, 64-char hex).\n * Can be provided with or without \"0x\" prefix.\n */\n depositorBtcPubkey: string;\n\n /**\n * Unsigned Pre-PegIn transaction hex (submitted to contract for data availability).\n */\n unsignedPrePeginTx: string;\n\n /**\n * Depositor-signed PegIn transaction hex (submitted to contract; vault ID derived from this).\n */\n depositorSignedPeginTx: string;\n\n /**\n * Vault provider's Ethereum address.\n */\n vaultProvider: Address;\n\n /**\n * SHA256 hashlock for HTLC activation (bytes32 hex with 0x prefix).\n */\n hashlock: Hex;\n\n /**\n * Optional callback invoked after PoP signing completes but before ETH transaction.\n */\n onPopSigned?: () => void | Promise<void>;\n\n /**\n * Depositor's BTC payout address (e.g. bc1p..., bc1q...).\n * Converted to scriptPubKey internally via bitcoinjs-lib.\n *\n * If omitted, defaults to the connected BTC wallet's address\n * via `btcWallet.getAddress()`.\n */\n depositorPayoutBtcAddress?: string;\n\n /** Keccak256 hash of the depositor's WOTS public key (bytes32) */\n depositorWotsPkHash: Hex;\n\n /**\n * Pre-signed BTC PoP signature (hex with 0x prefix).\n * When provided, the BTC wallet signing step is skipped and this signature is used directly.\n * Useful for multi-vault deposits where PoP only needs to be signed once.\n */\n preSignedBtcPopSignature?: Hex;\n\n /**\n * SHA-256 hash of the depositor's secret (bytes32).\n * Required for the new peg-in flow deposits.\n * TODO: Wire into submitPeginRequest contract call when contract ABI is updated to support the new peg-in flow.\n */\n depositorSecretHash?: Hex;\n\n /**\n * Zero-based index of the HTLC output in the Pre-PegIn transaction that\n * this PegIn spends. In a batch Pre-PegIn with N HTLC outputs, each vault\n * registration references a different htlcVout (0..N-1).\n */\n htlcVout: number;\n}\n\n/**\n * Result of registering a peg-in on Ethereum.\n */\nexport interface RegisterPeginResult {\n /**\n * Ethereum transaction hash for the peg-in registration.\n */\n ethTxHash: Hash;\n\n /**\n * Derived vault ID: keccak256(abi.encode(peginTxHash, depositor)).\n * Used for contract reads/writes and indexer queries.\n */\n vaultId: Hex;\n\n /**\n * Raw Bitcoin pegin transaction hash (double-SHA256 of the signed pegin tx).\n * Used for VP RPC operations which key on the BTC transaction ID.\n */\n peginTxHash: Hex;\n\n /**\n * The BTC PoP signature used for this registration (hex with 0x prefix).\n * Returned so callers can reuse it for subsequent pegins without re-signing.\n */\n btcPopSignature: Hex;\n}\n\n/**\n * Resolve prevout data for a transaction input.\n * Checks localPrevouts first; falls back to mempool API.\n */\nfunction resolveUtxoInfo(\n txid: string,\n vout: number,\n localPrevouts: Record<string, { scriptPubKey: string; value: number }> | undefined,\n apiUrl: string,\n): Promise<UtxoInfo> {\n const local = localPrevouts?.[`${txid}:${vout}`];\n if (local) {\n return Promise.resolve({\n txid,\n vout,\n value: local.value,\n scriptPubKey: local.scriptPubKey,\n });\n }\n return getUtxoInfo(txid, vout, apiUrl);\n}\n\n/**\n * Manager for orchestrating peg-in operations.\n *\n * This manager provides a high-level API for creating peg-in transactions\n * by coordinating between SDK primitives, utilities, and wallet interfaces.\n *\n * @remarks\n * The complete peg-in flow consists of 4 steps:\n *\n * | Step | Method | Description |\n * |------|--------|-------------|\n * | 1 | {@link preparePegin} | Build Pre-PegIn HTLC, fund it, sign PegIn input |\n * | 2 | {@link registerPeginOnChain} | Submit to Ethereum contract with PoP |\n * | 3 | {@link PayoutManager} | Sign BOTH payout authorizations |\n * | 4 | {@link signAndBroadcast} | Sign and broadcast Pre-PegIn tx to Bitcoin network |\n *\n * **Important:** Step 3 uses {@link PayoutManager}, not this class. After step 2,\n * the vault provider prepares 3 transactions per claimer:\n * - `claim_tx` - Claim transaction\n * - `assert_tx` - Assert transaction\n * - `payout_tx` - Payout transaction\n *\n * You must sign the Payout transaction for each claimer:\n * - {@link PayoutManager.signPayoutTransaction} - uses assert_tx as input reference\n *\n * Submit all signatures to the vault provider before proceeding to step 4.\n *\n * @see {@link PayoutManager} - Required for Step 3 (payout authorization)\n * @see {@link buildPrePeginPsbt} - Lower-level primitive for custom implementations\n * @see {@link https://github.com/babylonlabs-io/babylon-toolkit/blob/main/packages/babylon-ts-sdk/docs/quickstart/managers.md | Managers Quickstart}\n */\n/**\n * Maximum time (ms) to wait for a transaction receipt before timing out.\n * Matches the prior vault-service polling timeout so users see a clear error\n * instead of an indefinite hang when a transaction is dropped from the mempool.\n */\nconst RECEIPT_TIMEOUT_MS = 120_000;\n\nexport class PeginManager {\n private readonly config: PeginManagerConfig;\n\n /**\n * Creates a new PeginManager instance.\n *\n * @param config - Manager configuration including wallets and contract addresses\n */\n constructor(config: PeginManagerConfig) {\n this.config = config;\n }\n\n /**\n * Prepares a peg-in by building the Pre-PegIn HTLC transaction,\n * funding it, constructing the PegIn transaction, and signing the PegIn input.\n *\n * This method orchestrates the following steps:\n * 1. Get depositor BTC public key from wallet\n * 2. Build unfunded Pre-PegIn transaction (HTLC output) using primitives\n * 3. Select UTXOs to cover the HTLC value\n * 4. Fund the Pre-PegIn transaction\n * 5. Derive the PegIn transaction from the funded Pre-PegIn txid\n * 6. Build PSBT for signing the PegIn input (HTLC leaf 0)\n * 7. Sign via BTC wallet and extract depositor signature\n *\n * The returned `fundedPrePeginTxHex` is funded but unsigned (inputs unsigned).\n * Use `signAndBroadcast()` AFTER registering on Ethereum to broadcast it.\n *\n * @param params - Pegin parameters including amount, HTLC params, UTXOs\n * @returns Pegin result with funded Pre-PegIn tx, signed PegIn input, and signatures\n * @throws Error if wallet operations fail or insufficient funds\n */\n async preparePegin(\n params: PreparePeginParams,\n ): Promise<PreparePeginResult> {\n // Step 1: Get depositor BTC public key from wallet\n const depositorBtcPubkeyRaw = await this.config.btcWallet.getPublicKeyHex();\n // Convert 33-byte compressed (66 chars) to 32-byte x-only (64 chars) if needed\n const depositorBtcPubkey =\n depositorBtcPubkeyRaw.length === 66\n ? depositorBtcPubkeyRaw.slice(2)\n : depositorBtcPubkeyRaw;\n\n const vaultProviderBtcPubkey = stripHexPrefix(params.vaultProviderBtcPubkey);\n const vaultKeeperBtcPubkeys = params.vaultKeeperBtcPubkeys.map(stripHexPrefix);\n const universalChallengerBtcPubkeys =\n params.universalChallengerBtcPubkeys.map(stripHexPrefix);\n\n if (params.hashlocks.length !== params.amounts.length) {\n throw new Error(\n `hashlocks.length (${params.hashlocks.length}) must equal amounts.length (${params.amounts.length})`,\n );\n }\n if (params.hashlocks.length === 0) {\n throw new Error(\"hashlocks must contain at least one entry\");\n }\n\n const numLocalChallengers = vaultKeeperBtcPubkeys.length;\n\n const prePeginParams: PrePeginParams = {\n depositorPubkey: depositorBtcPubkey,\n vaultProviderPubkey: vaultProviderBtcPubkey,\n vaultKeeperPubkeys: vaultKeeperBtcPubkeys,\n universalChallengerPubkeys: universalChallengerBtcPubkeys,\n hashlocks: params.hashlocks,\n timelockRefund: params.timelockRefund,\n pegInAmounts: params.amounts,\n feeRate: params.protocolFeeRate,\n numLocalChallengers,\n councilQuorum: params.councilQuorum,\n councilSize: params.councilSize,\n network: this.config.btcNetwork,\n };\n\n // Step 2: Build unfunded Pre-PegIn transaction (N HTLC outputs, no inputs)\n const prePeginResult = await buildPrePeginPsbt(prePeginParams);\n\n // Step 3: Select UTXOs to cover ALL unfunded tx outputs (HTLCs + CPFP anchor)\n const utxoSelection = selectUtxosForPegin(\n [...params.availableUTXOs],\n prePeginResult.totalOutputValue,\n params.mempoolFeeRate,\n peginOutputCount(prePeginResult.htlcValues.length),\n );\n\n // Step 4: Fund the Pre-PegIn transaction with selected UTXOs\n const network = getNetwork(this.config.btcNetwork);\n const fundedPrePeginTxHex = fundPeginTransaction({\n unfundedTxHex: prePeginResult.psbtHex,\n selectedUTXOs: utxoSelection.selectedUTXOs,\n changeAddress: params.changeAddress,\n changeAmount: utxoSelection.changeAmount,\n network,\n });\n\n const prePeginTxid = stripHexPrefix(calculateBtcTxHash(fundedPrePeginTxHex));\n\n // Step 5: For each HTLC output, derive PegIn tx and build PSBT (no signing yet)\n const peginTxResults: Array<{\n txHex: string;\n txid: string;\n vaultScriptPubKey: string;\n }> = [];\n const psbtsToSign: string[] = [];\n const signOptions: SignPsbtOptions[] = [];\n\n for (let i = 0; i < params.hashlocks.length; i++) {\n const peginTxResult = await buildPeginTxFromFundedPrePegin({\n prePeginParams,\n timelockPegin: params.timelockPegin,\n fundedPrePeginTxHex,\n htlcVout: i,\n });\n\n const peginInputPsbtResult = await buildPeginInputPsbt({\n peginTxHex: peginTxResult.txHex,\n fundedPrePeginTxHex,\n depositorPubkey: depositorBtcPubkey,\n vaultProviderPubkey: vaultProviderBtcPubkey,\n vaultKeeperPubkeys: vaultKeeperBtcPubkeys,\n universalChallengerPubkeys: universalChallengerBtcPubkeys,\n hashlock: params.hashlocks[i],\n timelockRefund: params.timelockRefund,\n network: this.config.btcNetwork,\n });\n\n peginTxResults.push(peginTxResult);\n psbtsToSign.push(peginInputPsbtResult.psbtHex);\n signOptions.push(\n createTaprootScriptPathSignOptions(depositorBtcPubkeyRaw, 1),\n );\n }\n\n // Step 6: Batch sign all PegIn input PSBTs (single signPsbts call where supported)\n const signedPsbts = await this.signPsbtsWithFallback(\n psbtsToSign,\n signOptions,\n );\n\n // Step 7: Extract signatures and finalize\n const perVault: PerVaultPeginData[] = [];\n for (let i = 0; i < signedPsbts.length; i++) {\n const peginInputSignature = extractPeginInputSignature(\n signedPsbts[i],\n depositorBtcPubkey,\n );\n\n const depositorSignedPeginTxHex = finalizePeginInputPsbt(signedPsbts[i]);\n\n perVault.push({\n htlcVout: i,\n htlcValue: prePeginResult.htlcValues[i],\n peginTxHex: depositorSignedPeginTxHex,\n peginTxid: peginTxResults[i].txid,\n peginInputSignature,\n vaultScriptPubKey: peginTxResults[i].vaultScriptPubKey,\n });\n }\n\n return {\n fundedPrePeginTxHex,\n prePeginTxid,\n unsignedPrePeginTxHex: prePeginResult.psbtHex,\n perVault,\n selectedUTXOs: utxoSelection.selectedUTXOs,\n fee: utxoSelection.fee,\n changeAmount: utxoSelection.changeAmount,\n };\n }\n\n /**\n * Signs multiple PSBTs using batch signing if available, falling back to sequential signing.\n *\n * Wallets that support native batch signing (e.g. UniSat) will sign all PSBTs\n * in a single interaction. Others (e.g. Ledger, AppKit) implement signPsbts\n * by looping signPsbt internally, so the UX depends on the wallet adapter.\n */\n private async signPsbtsWithFallback(\n psbtsHexes: string[],\n options: SignPsbtOptions[],\n ): Promise<string[]> {\n if (typeof this.config.btcWallet.signPsbts === \"function\") {\n const signedPsbts = await this.config.btcWallet.signPsbts(\n psbtsHexes,\n options,\n );\n if (signedPsbts.length !== psbtsHexes.length) {\n throw new Error(\n `Expected ${psbtsHexes.length} signed PSBTs but received ${signedPsbts.length}`,\n );\n }\n return signedPsbts;\n }\n\n // Fallback: sign sequentially\n const signedPsbts: string[] = [];\n for (let i = 0; i < psbtsHexes.length; i++) {\n const signed = await this.config.btcWallet.signPsbt(\n psbtsHexes[i],\n options[i],\n );\n signedPsbts.push(signed);\n }\n return signedPsbts;\n }\n\n /**\n * Signs and broadcasts a funded peg-in transaction to the Bitcoin network.\n *\n * This method:\n * 1. Parses the funded transaction hex\n * 2. Fetches UTXO data from mempool for each input\n * 3. Creates a PSBT with proper witnessUtxo/tapInternalKey\n * 4. Signs via btcWallet.signPsbt()\n * 5. Finalizes and extracts the transaction\n * 6. Broadcasts via mempool API\n *\n * @param params - Transaction hex and depositor public key\n * @returns The broadcasted Bitcoin transaction ID\n * @throws Error if signing or broadcasting fails\n */\n async signAndBroadcast(params: SignAndBroadcastParams): Promise<string> {\n const { fundedPrePeginTxHex, depositorBtcPubkey } = params;\n\n // Step 1: Parse the funded transaction\n const cleanHex = fundedPrePeginTxHex.startsWith(\"0x\")\n ? fundedPrePeginTxHex.slice(2)\n : fundedPrePeginTxHex;\n const tx = Transaction.fromHex(cleanHex);\n\n if (tx.ins.length === 0) {\n throw new Error(\"Transaction has no inputs\");\n }\n\n // Step 2: Create PSBT and add inputs with UTXO data from mempool\n const psbt = new Psbt();\n psbt.setVersion(tx.version);\n psbt.setLocktime(tx.locktime);\n\n // Strip 0x prefix if present before converting to Buffer\n const cleanPubkey = depositorBtcPubkey.startsWith(\"0x\")\n ? depositorBtcPubkey.slice(2)\n : depositorBtcPubkey;\n // Validate x-only pubkey length and format (32 bytes = 64 hex chars)\n if (cleanPubkey.length !== 64 || !/^[0-9a-fA-F]+$/.test(cleanPubkey)) {\n throw new Error(\n \"Invalid depositorBtcPubkey: expected 64 hex characters (x-only pubkey)\",\n );\n }\n const publicKeyNoCoord = Buffer.from(cleanPubkey, \"hex\");\n if (publicKeyNoCoord.length !== 32) {\n throw new Error(\n `Invalid depositorBtcPubkey length: expected 32 bytes, got ${publicKeyNoCoord.length}`,\n );\n }\n const apiUrl = this.config.mempoolApiUrl;\n\n // Resolve prevout data for each input (local cache or mempool API)\n const utxoDataPromises = tx.ins.map((input) => {\n const txid = Buffer.from(input.hash).reverse().toString(\"hex\");\n const vout = input.index;\n return resolveUtxoInfo(txid, vout, params.localPrevouts, apiUrl).then(\n (utxoData) => ({ input, utxoData, txid, vout }),\n );\n });\n\n const inputsWithUtxoData = await Promise.all(utxoDataPromises);\n\n // Add inputs with proper PSBT fields based on script type\n for (const { input, utxoData, txid, vout } of inputsWithUtxoData) {\n const psbtInputFields = getPsbtInputFields(\n {\n txid,\n vout,\n value: utxoData.value,\n scriptPubKey: utxoData.scriptPubKey,\n },\n publicKeyNoCoord,\n );\n\n psbt.addInput({\n hash: input.hash,\n index: input.index,\n sequence: input.sequence,\n ...psbtInputFields,\n });\n }\n\n // Step 3: Add outputs\n for (const output of tx.outs) {\n psbt.addOutput({\n script: output.script,\n value: output.value,\n });\n }\n\n // Step 4: Sign PSBT via wallet\n const signedPsbtHex = await this.config.btcWallet.signPsbt(psbt.toHex());\n const signedPsbt = Psbt.fromHex(signedPsbtHex);\n\n // Step 5: Finalize and extract transaction\n try {\n signedPsbt.finalizeAllInputs();\n } catch (e) {\n // Some wallets (e.g. UniSat, OKX) auto-finalize PSBTs before returning them.\n // Attempting to finalize again throws, which is expected and safe to skip —\n // but verify the wallet actually finalized all inputs.\n const allFinalized = signedPsbt.data.inputs.every(\n (inp) => inp.finalScriptWitness || inp.finalScriptSig,\n );\n if (!allFinalized) {\n throw new Error(\n `PSBT finalization failed and wallet did not auto-finalize: ${e}`,\n );\n }\n }\n\n const signedTxHex = signedPsbt.extractTransaction().toHex();\n\n // Step 6: Broadcast to Bitcoin network\n const btcTxid = await pushTx(signedTxHex, apiUrl);\n\n return btcTxid;\n }\n\n /**\n * Registers a peg-in on Ethereum by calling the BTCVaultRegistry contract.\n *\n * This method:\n * 1. Gets depositor ETH address from wallet\n * 2. Creates proof of possession (BTC signature of ETH address)\n * 3. Checks if vault already exists (pre-flight check)\n * 4. Encodes the contract call using viem\n * 5. Estimates gas (catches contract errors early with proper revert reasons)\n * 6. Sends transaction with pre-estimated gas via ethWallet.sendTransaction()\n *\n * @param params - Registration parameters including BTC pubkey and unsigned tx\n * @returns Result containing Ethereum transaction hash and vault ID\n * @throws Error if signing or transaction fails\n * @throws Error if vault already exists\n * @throws Error if contract simulation fails (e.g., invalid signature, unauthorized)\n */\n async registerPeginOnChain(\n params: RegisterPeginParams,\n ): Promise<RegisterPeginResult> {\n const {\n depositorBtcPubkey,\n unsignedPrePeginTx,\n depositorSignedPeginTx,\n vaultProvider,\n hashlock,\n htlcVout,\n onPopSigned,\n depositorPayoutBtcAddress,\n depositorWotsPkHash,\n preSignedBtcPopSignature,\n } = params;\n\n // Step 1: Get depositor ETH address (from wallet account)\n if (!this.config.ethWallet.account) {\n throw new Error(\"Ethereum wallet account not found\");\n }\n const depositorEthAddress = this.config.ethWallet.account.address;\n\n // Step 2: Create proof of possession (or reuse pre-signed one)\n const btcPopSignature = await this.resolvePopSignature(\n depositorEthAddress,\n preSignedBtcPopSignature,\n );\n\n if (onPopSigned) {\n await onPopSigned();\n }\n\n // Step 3: Format parameters for contract call\n const depositorBtcPubkeyHex = ensureHexPrefix(depositorBtcPubkey);\n const unsignedPrePeginTxHex = ensureHexPrefix(unsignedPrePeginTx);\n const depositorSignedPeginTxHex = ensureHexPrefix(depositorSignedPeginTx);\n\n const payoutScriptPubKey = await this.resolvePayoutScriptPubKey(\n depositorPayoutBtcAddress,\n );\n\n // Step 4: Calculate pegin tx hash and derive vault ID, then check if it already exists\n const peginTxHash = calculateBtcTxHash(depositorSignedPeginTxHex);\n const derivedVaultIdHex = await deriveVaultId(\n stripHexPrefix(peginTxHash),\n stripHexPrefix(depositorEthAddress),\n );\n const vaultId = ensureHexPrefix(derivedVaultIdHex) as Hex;\n const exists = await this.checkVaultExists(vaultId);\n\n if (exists) {\n throw new Error(\n `Vault already exists (ID: ${vaultId}, peginTxHash: ${peginTxHash}). ` +\n `Vault IDs are derived from the pegin transaction hash and depositor address. ` +\n `To create a new vault, use different UTXOs or a different amount to generate a unique transaction.`,\n );\n }\n\n // Step 5: Query required pegin fee from the contract\n const publicClient = createPublicClient({\n chain: this.config.ethChain,\n transport: http(),\n });\n\n let peginFee: bigint;\n try {\n peginFee = (await publicClient.readContract({\n address: this.config.vaultContracts.btcVaultRegistry,\n abi: BTCVaultRegistryABI,\n functionName: \"getPegInFee\",\n args: [vaultProvider],\n })) as bigint;\n } catch {\n throw new Error(\n \"Failed to query pegin fee from the contract. \" +\n \"Please check your network connection and that the contract address is correct.\",\n );\n }\n\n // Step 6: Encode the contract call data\n const callData = encodeFunctionData({\n abi: BTCVaultRegistryABI,\n functionName: \"submitPeginRequest\",\n args: [\n depositorEthAddress,\n depositorBtcPubkeyHex,\n btcPopSignature,\n unsignedPrePeginTxHex,\n depositorSignedPeginTxHex,\n vaultProvider,\n hashlock,\n htlcVout,\n payoutScriptPubKey,\n depositorWotsPkHash,\n ],\n });\n\n // Step 7: Estimate gas first to catch contract errors before showing wallet popup\n // This ensures users see actual contract revert reasons instead of gas errors\n // The gas estimate is then passed to sendTransaction to avoid double estimation\n let gasEstimate: bigint;\n try {\n gasEstimate = await publicClient.estimateGas({\n to: this.config.vaultContracts.btcVaultRegistry,\n data: callData,\n value: peginFee,\n account: this.config.ethWallet.account.address,\n });\n } catch (error) {\n // Estimation failed - handle contract error with actual revert reason\n handleContractError(error);\n }\n\n // Step 8: Submit peg-in request to contract (estimation passed)\n let ethTxHash: Hex;\n try {\n // Send transaction with pre-estimated gas to skip internal estimation\n // Note: viem's sendTransaction uses `gas`, not `gasLimit`\n ethTxHash = await this.config.ethWallet.sendTransaction({\n to: this.config.vaultContracts.btcVaultRegistry,\n data: callData,\n value: peginFee,\n account: this.config.ethWallet.account,\n chain: this.config.ethChain,\n gas: gasEstimate,\n });\n } catch (error) {\n // Use proper error handler for better error messages\n handleContractError(error);\n }\n\n // Step 9: Wait for transaction receipt and verify it was not reverted\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: ethTxHash,\n timeout: RECEIPT_TIMEOUT_MS,\n });\n if (receipt.status === \"reverted\") {\n handleContractError(\n new Error(\n `Transaction reverted. Hash: ${ethTxHash}. ` +\n `Check the transaction on block explorer for details.`,\n ),\n );\n }\n\n return {\n ethTxHash: receipt.transactionHash,\n vaultId,\n peginTxHash,\n btcPopSignature,\n };\n }\n\n /**\n * Check if a vault already exists for a given vault ID.\n *\n * @param vaultId - The Bitcoin transaction hash (vault ID)\n * @returns True if vault exists, false otherwise\n */\n private async checkVaultExists(vaultId: Hex): Promise<boolean> {\n try {\n // Create a public client to read from the contract\n const publicClient = createPublicClient({\n chain: this.config.ethChain,\n transport: http(),\n });\n\n const vault = (await publicClient.readContract({\n address: this.config.vaultContracts.btcVaultRegistry,\n abi: BTCVaultRegistryABI,\n functionName: \"getBTCVault\",\n args: [vaultId],\n })) as { depositor: Address };\n\n // If depositor is not zero address, vault exists\n return vault.depositor !== zeroAddress;\n } catch {\n // If reading fails, assume vault doesn't exist and let contract handle it\n return false;\n }\n }\n\n /**\n * Resolve the BTC payout address to a scriptPubKey hex for the contract.\n *\n * If a payout address is provided, converts it directly.\n * If omitted, uses the wallet's address and validates it against the\n * wallet's public key to guard against a compromised wallet provider.\n */\n private async resolvePayoutScriptPubKey(\n depositorPayoutBtcAddress?: string,\n ): Promise<Hex> {\n let address: string;\n\n if (depositorPayoutBtcAddress) {\n address = depositorPayoutBtcAddress;\n } else {\n address = await this.config.btcWallet.getAddress();\n const walletPubkey = await this.config.btcWallet.getPublicKeyHex();\n if (\n !isAddressFromPublicKey(\n address,\n walletPubkey,\n this.config.btcNetwork,\n )\n ) {\n throw new Error(\n \"The BTC address from your wallet does not match the wallet's public key. \" +\n \"Please ensure your wallet is using a supported address type (Taproot or Native SegWit).\",\n );\n }\n }\n\n const network = getNetwork(this.config.btcNetwork);\n try {\n return `0x${bitcoin.address.toOutputScript(address, network).toString(\"hex\")}` as Hex;\n } catch {\n throw new Error(\n `Invalid BTC payout address: \"${address}\". ` +\n `Please provide a valid Bitcoin address for the ${this.config.btcNetwork} network.`,\n );\n }\n }\n\n /**\n * Resolve or create a BTC Proof-of-Possession signature.\n *\n * Reuses a pre-signed signature when provided (e.g. multi-vault deposits),\n * otherwise signs a BIP-322 message with the BTC wallet.\n */\n private async resolvePopSignature(\n depositorEthAddress: Address,\n preSignedBtcPopSignature?: Hex,\n ): Promise<Hex> {\n if (preSignedBtcPopSignature) {\n return preSignedBtcPopSignature;\n }\n\n // Message format matches BTCProofOfPossession.sol buildMessage()\n const verifyingContract = this.config.vaultContracts.btcVaultRegistry;\n const popMessage = `${depositorEthAddress.toLowerCase()}:${this.config.ethChain.id}:pegin:${verifyingContract.toLowerCase()}`;\n const btcPopSignatureRaw = await this.config.btcWallet.signMessage(\n popMessage,\n \"bip322-simple\",\n );\n\n // BTC wallets return base64, Ethereum contracts expect hex\n if (btcPopSignatureRaw.startsWith(\"0x\")) {\n return btcPopSignatureRaw as Hex;\n }\n const signatureBytes = Buffer.from(btcPopSignatureRaw, \"base64\");\n return `0x${signatureBytes.toString(\"hex\")}` as Hex;\n }\n\n /**\n * Gets the configured Bitcoin network.\n *\n * @returns The Bitcoin network (mainnet, testnet, signet, regtest)\n */\n getNetwork(): Network {\n return this.config.btcNetwork;\n }\n\n /**\n * Gets the configured BTCVaultRegistry contract address.\n *\n * @returns The Ethereum address of the BTCVaultRegistry contract\n */\n getVaultContractAddress(): Address {\n return this.config.vaultContracts.btcVaultRegistry;\n }\n}\n","/**\n * Payout Manager\n *\n * High-level manager that orchestrates the payout signing flow by coordinating\n * SDK primitives ({@link buildPayoutPsbt}, {@link extractPayoutSignature})\n * with a user-provided Bitcoin wallet.\n *\n * The Payout transaction references the Assert transaction (input 1).\n *\n * @see {@link PeginManager} - For Steps 1, 2, and 4 of peg-in flow\n * @see {@link buildPayoutPsbt} - Lower-level primitive for custom implementations\n * @see {@link extractPayoutSignature} - Extract signatures from signed PSBTs\n *\n * @module managers/PayoutManager\n */\n\nimport { Buffer } from \"buffer\";\n\nimport { Transaction } from \"bitcoinjs-lib\";\n\nimport type {\n BitcoinWallet,\n SignPsbtOptions,\n} from \"../../../shared/wallets\";\nimport { createTaprootScriptPathSignOptions } from \"../utils/signing\";\nimport {\n buildPayoutPsbt,\n extractPayoutSignature,\n isValidHex,\n stripHexPrefix,\n validateWalletPubkey,\n type Network,\n} from \"../primitives\";\n\n/**\n * Configuration for the PayoutManager.\n */\nexport interface PayoutManagerConfig {\n /**\n * Bitcoin network to use for transactions.\n */\n network: Network;\n\n /**\n * Bitcoin wallet for signing payout transactions.\n */\n btcWallet: BitcoinWallet;\n}\n\n/**\n * Base parameters shared by both payout transaction types.\n */\ninterface SignPayoutBaseParams {\n /**\n * Peg-in transaction hex.\n * The original transaction that created the vault output being spent.\n */\n peginTxHex: string;\n\n /**\n * Vault provider's BTC public key (x-only, 64-char hex).\n */\n vaultProviderBtcPubkey: string;\n\n /**\n * Vault keeper BTC public keys (x-only, 64-char hex).\n */\n vaultKeeperBtcPubkeys: string[];\n\n /**\n * Universal challenger BTC public keys (x-only, 64-char hex).\n */\n universalChallengerBtcPubkeys: string[];\n\n /**\n * CSV timelock in blocks for the PegIn output.\n */\n timelockPegin: number;\n\n /**\n * Depositor's BTC public key (x-only, 64-char hex).\n * This should be the public key that was used when creating the vault,\n * as stored on-chain. If not provided, will be fetched from the wallet.\n */\n depositorBtcPubkey?: string;\n\n /**\n * The on-chain registered depositor payout scriptPubKey (hex, with or without 0x prefix).\n * Used to validate that the VP-provided payout transaction actually pays to the\n * correct depositor payout address before signing.\n */\n registeredPayoutScriptPubKey: string;\n}\n\n/**\n * Parameters for signing a Payout transaction.\n *\n * Payout is used in the challenge path after Assert, when the claimer proves validity.\n * Input 1 references the Assert transaction.\n */\nexport interface SignPayoutParams extends SignPayoutBaseParams {\n /**\n * Payout transaction hex (unsigned).\n * This is the transaction from the vault provider that needs depositor signature.\n */\n payoutTxHex: string;\n\n /**\n * Assert transaction hex.\n * Payout input 1 references Assert output 0.\n */\n assertTxHex: string;\n}\n\n/**\n * Result of signing a payout transaction.\n */\nexport interface PayoutSignatureResult {\n /**\n * 64-byte Schnorr signature (128 hex characters).\n */\n signature: string;\n\n /**\n * Depositor's BTC public key used for signing.\n */\n depositorBtcPubkey: string;\n}\n\n/**\n * High-level manager for payout transaction signing.\n *\n * @remarks\n * After registering your peg-in on Ethereum (Step 2), the vault provider prepares\n * claim/payout transaction pairs. You must sign each payout transaction using this\n * manager and submit the signatures to the vault provider's RPC API.\n *\n * **What happens internally:**\n * 1. Validates your wallet's public key matches the vault's depositor\n * 2. Builds an unsigned PSBT with taproot script path spend info\n * 3. Signs input 0 (the vault UTXO) with your wallet\n * 4. Extracts the 64-byte Schnorr signature\n *\n * **Note:** The payout transaction has 2 inputs. PayoutManager only signs input 0\n * (from the peg-in tx). Input 1 (from the assert tx) is signed by the vault provider.\n *\n * @see {@link PeginManager} - For the complete peg-in flow context\n * @see {@link buildPayoutPsbt} - Lower-level primitive used internally\n * @see {@link extractPayoutSignature} - Signature extraction primitive\n */\nexport class PayoutManager {\n private readonly config: PayoutManagerConfig;\n\n /**\n * Creates a new PayoutManager instance.\n *\n * @param config - Manager configuration including wallet\n */\n constructor(config: PayoutManagerConfig) {\n this.config = config;\n }\n\n /**\n * Signs a Payout transaction and extracts the Schnorr signature.\n *\n * Flow:\n * 1. Vault provider submits Claim transaction\n * 2. Claimer submits Assert transaction to prove validity\n * 3. Payout can be executed (references Assert tx)\n *\n * This method orchestrates the following steps:\n * 1. Get wallet's public key and convert to x-only format\n * 2. Validate wallet pubkey matches on-chain depositor pubkey (if provided)\n * 3. Build unsigned PSBT using primitives\n * 4. Sign PSBT via btcWallet.signPsbt()\n * 5. Extract 64-byte Schnorr signature using primitives\n *\n * The returned signature can be submitted to the vault provider API.\n *\n * @param params - Payout signing parameters\n * @returns Signature result with 64-byte Schnorr signature and depositor pubkey\n * @throws Error if wallet pubkey doesn't match depositor pubkey\n * @throws Error if wallet operations fail or signature extraction fails\n */\n async signPayoutTransaction(\n params: SignPayoutParams,\n ): Promise<PayoutSignatureResult> {\n // Validate payout TX outputs pay to the registered depositor payout address\n this.validatePayoutOutputs(\n params.payoutTxHex,\n params.registeredPayoutScriptPubKey,\n );\n\n // Validate wallet pubkey matches depositor and get both formats\n const walletPubkeyRaw = await this.config.btcWallet.getPublicKeyHex();\n const { depositorPubkey } = validateWalletPubkey(\n walletPubkeyRaw,\n params.depositorBtcPubkey,\n );\n\n // Build unsigned PSBT for Payout (uses Assert tx)\n const payoutPsbt = await buildPayoutPsbt({\n payoutTxHex: params.payoutTxHex,\n peginTxHex: params.peginTxHex,\n assertTxHex: params.assertTxHex,\n depositorBtcPubkey: depositorPubkey,\n vaultProviderBtcPubkey: params.vaultProviderBtcPubkey,\n vaultKeeperBtcPubkeys: params.vaultKeeperBtcPubkeys,\n universalChallengerBtcPubkeys: params.universalChallengerBtcPubkeys,\n timelockPegin: params.timelockPegin,\n network: this.config.network,\n });\n\n // Sign PSBT via wallet (Taproot script-path spend, input 0 only)\n const signedPsbtHex = await this.config.btcWallet.signPsbt(\n payoutPsbt.psbtHex,\n createTaprootScriptPathSignOptions(walletPubkeyRaw, 1),\n );\n\n // Extract Schnorr signature\n const signature = extractPayoutSignature(signedPsbtHex, depositorPubkey);\n\n return {\n signature,\n depositorBtcPubkey: depositorPubkey,\n };\n }\n\n /**\n * Gets the configured Bitcoin network.\n *\n * @returns The Bitcoin network (mainnet, testnet, signet, regtest)\n */\n getNetwork(): Network {\n return this.config.network;\n }\n\n /**\n * Checks if the wallet supports batch signing (signPsbts).\n *\n * @returns true if batch signing is supported\n */\n supportsBatchSigning(): boolean {\n return typeof this.config.btcWallet.signPsbts === \"function\";\n }\n\n /**\n * Batch signs multiple payout transactions (1 per claimer).\n * This allows signing all transactions with a single wallet interaction.\n *\n * @param transactions - Array of payout params to sign\n * @returns Array of signature results matching input order\n * @throws Error if wallet doesn't support batch signing\n * @throws Error if any signing operation fails\n */\n async signPayoutTransactionsBatch(\n transactions: SignPayoutParams[],\n ): Promise<\n Array<{\n payoutSignature: string;\n depositorBtcPubkey: string;\n }>\n > {\n if (!this.supportsBatchSigning()) {\n throw new Error(\n \"Wallet does not support batch signing (signPsbts method not available)\",\n );\n }\n\n // Get wallet pubkey once\n const walletPubkeyRaw = await this.config.btcWallet.getPublicKeyHex();\n\n // Build all PSBTs (1 per claimer)\n const psbtsToSign: string[] = [];\n const signOptions: SignPsbtOptions[] = [];\n const depositorPubkeys: string[] = [];\n\n for (const tx of transactions) {\n // Validate payout TX outputs pay to the registered depositor payout address\n this.validatePayoutOutputs(\n tx.payoutTxHex,\n tx.registeredPayoutScriptPubKey,\n );\n\n // Validate wallet pubkey matches depositor\n const { depositorPubkey } = validateWalletPubkey(\n walletPubkeyRaw,\n tx.depositorBtcPubkey,\n );\n depositorPubkeys.push(depositorPubkey);\n\n // Build Payout PSBT\n const payoutPsbt = await buildPayoutPsbt({\n payoutTxHex: tx.payoutTxHex,\n peginTxHex: tx.peginTxHex,\n assertTxHex: tx.assertTxHex,\n depositorBtcPubkey: depositorPubkey,\n vaultProviderBtcPubkey: tx.vaultProviderBtcPubkey,\n vaultKeeperBtcPubkeys: tx.vaultKeeperBtcPubkeys,\n universalChallengerBtcPubkeys: tx.universalChallengerBtcPubkeys,\n timelockPegin: tx.timelockPegin,\n network: this.config.network,\n });\n psbtsToSign.push(payoutPsbt.psbtHex);\n signOptions.push(createTaprootScriptPathSignOptions(walletPubkeyRaw, 1));\n }\n\n // Batch sign all PSBTs with single wallet interaction\n const signedPsbts = await this.config.btcWallet.signPsbts!(\n psbtsToSign,\n signOptions,\n );\n\n // Validate that wallet returned the expected number of signed PSBTs\n if (signedPsbts.length !== transactions.length) {\n throw new Error(\n `Expected ${transactions.length} signed PSBTs but received ${signedPsbts.length}`,\n );\n }\n\n // Extract signatures from signed PSBTs\n const results: Array<{\n payoutSignature: string;\n depositorBtcPubkey: string;\n }> = [];\n\n for (let i = 0; i < transactions.length; i++) {\n const depositorPubkey = depositorPubkeys[i];\n const payoutSignature = extractPayoutSignature(\n signedPsbts[i],\n depositorPubkey,\n );\n\n results.push({\n payoutSignature,\n depositorBtcPubkey: depositorPubkey,\n });\n }\n\n return results;\n }\n\n /**\n * Validates that the payout transaction's largest output pays to the\n * registered depositor payout address (scriptPubKey).\n *\n * This prevents two attack vectors from a malicious vault provider:\n * 1. Substituting a completely different payout address\n * 2. Including a dust output to the correct address while routing\n * the actual funds to an attacker-controlled address\n *\n * @param payoutTxHex - Raw payout transaction hex\n * @param registeredPayoutScriptPubKey - On-chain registered scriptPubKey (hex, with or without 0x prefix)\n * @throws Error if scriptPubKey is invalid hex\n * @throws Error if the largest output does not pay to the registered address\n */\n private validatePayoutOutputs(\n payoutTxHex: string,\n registeredPayoutScriptPubKey: string,\n ): void {\n if (!isValidHex(registeredPayoutScriptPubKey)) {\n throw new Error(\n \"Invalid registeredPayoutScriptPubKey: not valid hex\",\n );\n }\n\n const expectedScript = Buffer.from(\n stripHexPrefix(registeredPayoutScriptPubKey),\n \"hex\",\n );\n const payoutTx = Transaction.fromHex(stripHexPrefix(payoutTxHex));\n\n if (payoutTx.outs.length === 0) {\n throw new Error(\"Payout transaction has no outputs\");\n }\n\n // Find the largest output by value — this must pay to the registered address.\n // A dust output to the correct address with funds routed elsewhere is rejected.\n const largestOutput = payoutTx.outs.reduce((max, output) =>\n output.value > max.value ? output : max,\n );\n\n if (!largestOutput.script.equals(expectedScript)) {\n throw new Error(\n \"Payout transaction does not pay to the registered depositor payout address\",\n );\n }\n }\n}\n","/**\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 * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean } from \"./utils.js\";\n/** Internal class for HMAC. */\nexport class _HMAC {\n oHash;\n iHash;\n blockLen;\n outputLen;\n finished = false;\n destroyed = false;\n constructor(hash, key) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf) {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac = (hash, key, message) => new _HMAC(hash, key).update(message).digest();\nhmac.create = (hash, key) => new _HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView } from \"./utils.js\";\n/** Choice: a ? b : c */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport class HashMD {\n blockLen;\n outputLen;\n padOffset;\n isLE;\n // For partial updates less than block size\n buffer;\n view;\n finished = false;\n length = 0;\n pos = 0;\n destroyed = false;\n constructor(blockLen, outputLen, padOffset, isLE) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to ||= new this.constructor();\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","/**\n\nSHA1 (RFC 3174), MD5 (RFC 1321) and RIPEMD160 (RFC 2286) legacy, weak hash functions.\nDon't use them in a new protocol. What \"weak\" means:\n\n- Collisions can be made with 2^18 effort in MD5, 2^60 in SHA1, 2^80 in RIPEMD160.\n- No practical pre-image attacks (only theoretical, 2^123.4)\n- HMAC seems kinda ok: https://www.rfc-editor.org/rfc/rfc6151\n * @module\n */\nimport { Chi, HashMD, Maj } from \"./_md.js\";\nimport { clean, createHasher, rotl } from \"./utils.js\";\n/** Initial SHA1 state */\nconst SHA1_IV = /* @__PURE__ */ Uint32Array.from([\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0,\n]);\n// Reusable temporary buffer\nconst SHA1_W = /* @__PURE__ */ new Uint32Array(80);\n/** Internal SHA1 legacy hash class. */\nexport class _SHA1 extends HashMD {\n A = SHA1_IV[0] | 0;\n B = SHA1_IV[1] | 0;\n C = SHA1_IV[2] | 0;\n D = SHA1_IV[3] | 0;\n E = SHA1_IV[4] | 0;\n constructor() {\n super(64, 20, 8, false);\n }\n get() {\n const { A, B, C, D, E } = this;\n return [A, B, C, D, E];\n }\n set(A, B, C, D, E) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n }\n process(view, offset) {\n for (let i = 0; i < 16; i++, offset += 4)\n SHA1_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 80; i++)\n SHA1_W[i] = rotl(SHA1_W[i - 3] ^ SHA1_W[i - 8] ^ SHA1_W[i - 14] ^ SHA1_W[i - 16], 1);\n // Compression function main loop, 80 rounds\n let { A, B, C, D, E } = this;\n for (let i = 0; i < 80; i++) {\n let F, K;\n if (i < 20) {\n F = Chi(B, C, D);\n K = 0x5a827999;\n }\n else if (i < 40) {\n F = B ^ C ^ D;\n K = 0x6ed9eba1;\n }\n else if (i < 60) {\n F = Maj(B, C, D);\n K = 0x8f1bbcdc;\n }\n else {\n F = B ^ C ^ D;\n K = 0xca62c1d6;\n }\n const T = (rotl(A, 5) + F + E + K + SHA1_W[i]) | 0;\n E = D;\n D = C;\n C = rotl(B, 30);\n B = A;\n A = T;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n this.set(A, B, C, D, E);\n }\n roundClean() {\n clean(SHA1_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/** SHA1 (RFC 3174) legacy hash function. It was cryptographically broken. */\nexport const sha1 = /* @__PURE__ */ createHasher(() => new _SHA1());\n/** Per-round constants */\nconst p32 = /* @__PURE__ */ Math.pow(2, 32);\nconst K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i) => Math.floor(p32 * Math.abs(Math.sin(i + 1))));\n/** md5 initial state: same as sha1, but 4 u32 instead of 5. */\nconst MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);\n// Reusable temporary buffer\nconst MD5_W = /* @__PURE__ */ new Uint32Array(16);\n/** Internal MD5 legacy hash class. */\nexport class _MD5 extends HashMD {\n A = MD5_IV[0] | 0;\n B = MD5_IV[1] | 0;\n C = MD5_IV[2] | 0;\n D = MD5_IV[3] | 0;\n constructor() {\n super(64, 16, 8, true);\n }\n get() {\n const { A, B, C, D } = this;\n return [A, B, C, D];\n }\n set(A, B, C, D) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n }\n process(view, offset) {\n for (let i = 0; i < 16; i++, offset += 4)\n MD5_W[i] = view.getUint32(offset, true);\n // Compression function main loop, 64 rounds\n let { A, B, C, D } = this;\n for (let i = 0; i < 64; i++) {\n let F, g, s;\n if (i < 16) {\n F = Chi(B, C, D);\n g = i;\n s = [7, 12, 17, 22];\n }\n else if (i < 32) {\n F = Chi(D, B, C);\n g = (5 * i + 1) % 16;\n s = [5, 9, 14, 20];\n }\n else if (i < 48) {\n F = B ^ C ^ D;\n g = (3 * i + 5) % 16;\n s = [4, 11, 16, 23];\n }\n else {\n F = C ^ (B | ~D);\n g = (7 * i) % 16;\n s = [6, 10, 15, 21];\n }\n F = F + A + K[i] + MD5_W[g];\n A = D;\n D = C;\n C = B;\n B = B + rotl(F, s[i % 4]);\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n this.set(A, B, C, D);\n }\n roundClean() {\n clean(MD5_W);\n }\n destroy() {\n this.set(0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/**\n * MD5 (RFC 1321) legacy hash function. It was cryptographically broken.\n * MD5 architecture is similar to SHA1, with some differences:\n * - Reduced output length: 16 bytes (128 bit) instead of 20\n * - 64 rounds, instead of 80\n * - Little-endian: could be faster, but will require more code\n * - Non-linear index selection: huge speed-up for unroll\n * - Per round constants: more memory accesses, additional speed-up for unroll\n */\nexport const md5 = /* @__PURE__ */ createHasher(() => new _MD5());\n// RIPEMD-160\nconst Rho160 = /* @__PURE__ */ Uint8Array.from([\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n]);\nconst Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))();\nconst Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))();\nconst idxLR = /* @__PURE__ */ (() => {\n const L = [Id160];\n const R = [Pi160];\n const res = [L, R];\n for (let i = 0; i < 4; i++)\n for (let j of res)\n j.push(j[i].map((k) => Rho160[k]));\n return res;\n})();\nconst idxL = /* @__PURE__ */ (() => idxLR[0])();\nconst idxR = /* @__PURE__ */ (() => idxLR[1])();\n// const [idxL, idxR] = idxLR;\nconst shifts160 = /* @__PURE__ */ [\n [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],\n [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7],\n [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9],\n [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6],\n [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5],\n].map((i) => Uint8Array.from(i));\nconst shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst Kl160 = /* @__PURE__ */ Uint32Array.from([\n 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e,\n]);\nconst Kr160 = /* @__PURE__ */ Uint32Array.from([\n 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000,\n]);\n// It's called f() in spec.\nfunction ripemd_f(group, x, y, z) {\n if (group === 0)\n return x ^ y ^ z;\n if (group === 1)\n return (x & y) | (~x & z);\n if (group === 2)\n return (x | ~y) ^ z;\n if (group === 3)\n return (x & z) | (y & ~z);\n return x ^ (y | ~z);\n}\n// Reusable temporary buffer\nconst BUF_160 = /* @__PURE__ */ new Uint32Array(16);\nexport class _RIPEMD160 extends HashMD {\n h0 = 0x67452301 | 0;\n h1 = 0xefcdab89 | 0;\n h2 = 0x98badcfe | 0;\n h3 = 0x10325476 | 0;\n h4 = 0xc3d2e1f0 | 0;\n constructor() {\n super(64, 20, 8, true);\n }\n get() {\n const { h0, h1, h2, h3, h4 } = this;\n return [h0, h1, h2, h3, h4];\n }\n set(h0, h1, h2, h3, h4) {\n this.h0 = h0 | 0;\n this.h1 = h1 | 0;\n this.h2 = h2 | 0;\n this.h3 = h3 | 0;\n this.h4 = h4 | 0;\n }\n process(view, offset) {\n for (let i = 0; i < 16; i++, offset += 4)\n BUF_160[i] = view.getUint32(offset, true);\n // prettier-ignore\n let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el;\n // Instead of iterating 0 to 80, we split it into 5 groups\n // And use the groups in constants, functions, etc. Much simpler\n for (let group = 0; group < 5; group++) {\n const rGroup = 4 - group;\n const hbl = Kl160[group], hbr = Kr160[group]; // prettier-ignore\n const rl = idxL[group], rr = idxR[group]; // prettier-ignore\n const sl = shiftsL160[group], sr = shiftsR160[group]; // prettier-ignore\n for (let i = 0; i < 16; i++) {\n const tl = (rotl(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el) | 0;\n al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore\n }\n // 2 loops are 10% faster\n for (let i = 0; i < 16; i++) {\n const tr = (rotl(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er) | 0;\n ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; // prettier-ignore\n }\n }\n // Add the compressed chunk to the current hash value\n this.set((this.h1 + cl + dr) | 0, (this.h2 + dl + er) | 0, (this.h3 + el + ar) | 0, (this.h4 + al + br) | 0, (this.h0 + bl + cr) | 0);\n }\n roundClean() {\n clean(BUF_160);\n }\n destroy() {\n this.destroyed = true;\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0);\n }\n}\n/**\n * RIPEMD-160 - a legacy hash function from 1990s.\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160.html\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf\n */\nexport const ripemd160 = /* @__PURE__ */ createHasher(() => new _RIPEMD160());\n//# sourceMappingURL=legacy.js.map","/**\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 * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, oidNist, rotr } from \"./utils.js\";\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n/** Internal 32-byte base SHA2 hash class. */\nclass SHA2_32B extends HashMD {\n constructor(outputLen) {\n super(64, outputLen, 8, false);\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n A = SHA256_IV[0] | 0;\n B = SHA256_IV[1] | 0;\n C = SHA256_IV[2] | 0;\n D = SHA256_IV[3] | 0;\n E = SHA256_IV[4] | 0;\n F = SHA256_IV[5] | 0;\n G = SHA256_IV[6] | 0;\n H = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B {\n A = SHA224_IV[0] | 0;\n B = SHA224_IV[1] | 0;\n C = SHA224_IV[2] | 0;\n D = SHA224_IV[3] | 0;\n E = SHA224_IV[4] | 0;\n F = SHA224_IV[5] | 0;\n G = SHA224_IV[6] | 0;\n H = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n/** Internal 64-byte base SHA2 hash class. */\nclass SHA2_64B extends HashMD {\n constructor(outputLen) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B {\n Ah = SHA512_IV[0] | 0;\n Al = SHA512_IV[1] | 0;\n Bh = SHA512_IV[2] | 0;\n Bl = SHA512_IV[3] | 0;\n Ch = SHA512_IV[4] | 0;\n Cl = SHA512_IV[5] | 0;\n Dh = SHA512_IV[6] | 0;\n Dl = SHA512_IV[7] | 0;\n Eh = SHA512_IV[8] | 0;\n El = SHA512_IV[9] | 0;\n Fh = SHA512_IV[10] | 0;\n Fl = SHA512_IV[11] | 0;\n Gh = SHA512_IV[12] | 0;\n Gl = SHA512_IV[13] | 0;\n Hh = SHA512_IV[14] | 0;\n Hl = SHA512_IV[15] | 0;\n constructor() {\n super(64);\n }\n}\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B {\n Ah = SHA384_IV[0] | 0;\n Al = SHA384_IV[1] | 0;\n Bh = SHA384_IV[2] | 0;\n Bl = SHA384_IV[3] | 0;\n Ch = SHA384_IV[4] | 0;\n Cl = SHA384_IV[5] | 0;\n Dh = SHA384_IV[6] | 0;\n Dl = SHA384_IV[7] | 0;\n Eh = SHA384_IV[8] | 0;\n El = SHA384_IV[9] | 0;\n Fh = SHA384_IV[10] | 0;\n Fl = SHA384_IV[11] | 0;\n Gh = SHA384_IV[12] | 0;\n Gl = SHA384_IV[13] | 0;\n Hh = SHA384_IV[14] | 0;\n Hl = SHA384_IV[15] | 0;\n constructor() {\n super(48);\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B {\n Ah = T224_IV[0] | 0;\n Al = T224_IV[1] | 0;\n Bh = T224_IV[2] | 0;\n Bl = T224_IV[3] | 0;\n Ch = T224_IV[4] | 0;\n Cl = T224_IV[5] | 0;\n Dh = T224_IV[6] | 0;\n Dl = T224_IV[7] | 0;\n Eh = T224_IV[8] | 0;\n El = T224_IV[9] | 0;\n Fh = T224_IV[10] | 0;\n Fl = T224_IV[11] | 0;\n Gh = T224_IV[12] | 0;\n Gl = T224_IV[13] | 0;\n Hh = T224_IV[14] | 0;\n Hl = T224_IV[15] | 0;\n constructor() {\n super(28);\n }\n}\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B {\n Ah = T256_IV[0] | 0;\n Al = T256_IV[1] | 0;\n Bh = T256_IV[2] | 0;\n Bl = T256_IV[3] | 0;\n Ch = T256_IV[4] | 0;\n Cl = T256_IV[5] | 0;\n Dh = T256_IV[6] | 0;\n Dl = T256_IV[7] | 0;\n Eh = T256_IV[8] | 0;\n El = T256_IV[9] | 0;\n Fh = T256_IV[10] | 0;\n Fl = T256_IV[11] | 0;\n Gh = T256_IV[12] | 0;\n Gl = T256_IV[13] | 0;\n Hh = T256_IV[14] | 0;\n Hl = T256_IV[15] | 0;\n constructor() {\n super(32);\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new _SHA256(), \n/* @__PURE__ */ oidNist(0x01));\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new _SHA224(), \n/* @__PURE__ */ oidNist(0x04));\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new _SHA512(), \n/* @__PURE__ */ oidNist(0x03));\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new _SHA384(), \n/* @__PURE__ */ oidNist(0x02));\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new _SHA512_256(), \n/* @__PURE__ */ oidNist(0x06));\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new _SHA512_224(), \n/* @__PURE__ */ oidNist(0x05));\n//# sourceMappingURL=sha2.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 * PBKDF (RFC 2898). Can be used to create a key from password and salt.\n * @module\n */\nimport { hmac } from \"./hmac.js\";\n// prettier-ignore\nimport { ahash, anumber, asyncLoop, checkOpts, clean, createView, kdfInputToBytes } from \"./utils.js\";\n// Common start and end for sync/async functions\nfunction pbkdf2Init(hash, _password, _salt, _opts) {\n ahash(hash);\n const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n anumber(c, 'c');\n anumber(dkLen, 'dkLen');\n anumber(asyncTick, 'asyncTick');\n if (c < 1)\n throw new Error('iterations (c) must be >= 1');\n const password = kdfInputToBytes(_password, 'password');\n const salt = kdfInputToBytes(_salt, 'salt');\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\nfunction pbkdf2Output(PRF, PRFSalt, DK, prfW, u) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW)\n prfW.destroy();\n clean(u);\n return DK;\n}\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n * @example\n * const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });\n */\nexport function pbkdf2(hash, password, salt, opts) {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++)\n Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function. Async version.\n * @example\n * await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });\n */\nexport async function pbkdf2Async(hash, password, salt, opts) {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await asyncLoop(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++)\n Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n//# sourceMappingURL=pbkdf2.js.map","/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2.js';\nimport { sha256, sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils.js';\nimport { pbkdf2 as pbkdf2web, sha512 as sha512web } from '@noble/hashes/webcrypto.js';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent);\n if (![16, 20, 24, 28, 32].includes(ent.length))\n throw new Error('invalid entropy length');\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Uses native, built-in functionality, provided by globalThis.crypto.\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedWebcrypto(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedWebcrypto(mnemonic, passphrase = '') {\n return pbkdf2web(sha512web, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","/**\n * @module wots/derivation\n *\n * Deterministic WOTS one-time-signature key derivation for Babylon vault\n * deposits. Pure crypto functions extracted from the vault frontend into the\n * shared SDK.\n *\n * See the vault frontend's `wotsService.ts` for the full derivation\n * documentation.\n */\nimport { hmac } from \"@noble/hashes/hmac.js\";\nimport { ripemd160 } from \"@noble/hashes/legacy.js\";\nimport { sha256, sha512 } from \"@noble/hashes/sha2.js\";\nimport { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\n\nimport { stripHexPrefix } from \"../primitives/utils/bitcoin\";\n\nimport type { WotsKeypair, WotsPublicKey } from \"./types\";\n\n/**\n * Number of bit positions in the WOTS keypair. Corresponds to the number\n * of garbled-circuit labels used in the BitVM-style protocol (PI_1 circuit).\n */\nconst PI_1_BITS = 508;\n\n/**\n * Size in bytes of each WOTS preimage (garbled-circuit label size).\n * Preimages are truncated from HMAC-SHA-512 output to this length.\n */\nconst GC_LABEL_SIZE = 16;\n\n/** Size in bytes of the parent key or derived key (first half of a 64-byte seed/HMAC). */\nconst KEY_SIZE = 32;\n\n/** Size in bytes of the full BIP-39 seed / HMAC-SHA-512 output. */\nconst SEED_SIZE = 64;\n\n/** Size of the index buffer used in per-bit derivation (1 byte flag + 4 byte big-endian index). */\nconst INDEX_BUFFER_SIZE = 5;\n\n/** Size of the big-endian length prefix prepended to variable-length fields. */\nconst LENGTH_PREFIX_SIZE = 4;\n\n// ---------------------------------------------------------------------------\n// Internal byte-manipulation utilities\n// ---------------------------------------------------------------------------\n\n/** Concatenate multiple `Uint8Array` buffers into a single array. */\nfunction concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\n/** Encode a UTF-8 string as bytes. */\nfunction stringToBytes(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/**\n * Prepend a 4-byte big-endian length prefix to `data`.\n * Used to unambiguously concatenate variable-length fields in the vault\n * derivation path.\n */\nfunction lengthPrefixed(data: Uint8Array): Uint8Array {\n const len = new Uint8Array(LENGTH_PREFIX_SIZE);\n new DataView(len.buffer).setUint32(0, data.length, false);\n return concatBytes(len, data);\n}\n\n// ---------------------------------------------------------------------------\n// Internal cryptographic primitives (@noble/hashes wrappers)\n// ---------------------------------------------------------------------------\n\n/**\n * Compute HMAC-SHA-512.\n *\n * Uses `@noble/hashes/hmac` which accepts `Uint8Array` directly,\n * avoiding the unsafe `Uint8Array.buffer as ArrayBuffer` cast that\n * the Web Crypto API would require.\n *\n * @param key - HMAC key bytes.\n * @param data - Message bytes.\n * @returns 64-byte HMAC digest.\n */\nfunction hmacSha512(key: Uint8Array, data: Uint8Array): Uint8Array {\n return hmac(sha512, key, data);\n}\n\n/**\n * Compute Hash160: `RIPEMD-160(SHA-256(data))`.\n *\n * This is the same hash function used in Bitcoin for address derivation.\n *\n * @param data - Input bytes.\n * @returns 20-byte hash.\n */\nfunction hash160(data: Uint8Array): Uint8Array {\n return ripemd160(sha256(data));\n}\n\n/** Convert a byte array to a lowercase hex string. */\nconst toHex = (bytes: Uint8Array) =>\n Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n// ---------------------------------------------------------------------------\n// Seed and keypair derivation\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a BIP-39 mnemonic into a 64-byte seed.\n *\n * Internally uses PBKDF2 with 2048 rounds of HMAC-SHA-512 and the passphrase\n * `\"mnemonic\"` (no user password), per the BIP-39 specification.\n *\n * @param mnemonic - A valid 12-word BIP-39 mnemonic.\n * @returns 64-byte seed suitable for {@link deriveWotsKeypair}.\n */\nexport function mnemonicToWotsSeed(mnemonic: string): Uint8Array {\n const seed = mnemonicToSeedSync(mnemonic);\n const copy = new Uint8Array(seed);\n seed.fill(0);\n return copy;\n}\n\n/**\n * Derive a deterministic WOTS keypair for a specific vault.\n *\n * ### Derivation steps\n *\n * 1. **Split the seed** — bytes `[0..32)` = parent key, `[32..64)` = chain code.\n *\n * 2. **Child key derivation** —\n * ```\n * vaultData = lenPrefix(vaultId) || lenPrefix(depositorPk) || lenPrefix(appContractAddress)\n * hmac = HMAC-SHA-512(chainCode, parentKey || vaultData)\n * derivedKey = hmac[0..32)\n * derivedChainCode = hmac[32..64)\n * ```\n *\n * 3. **Bit-level key expansion** — For each bit index `i` in `[0, 508)`:\n * ```\n * falseHmac = HMAC-SHA-512(derivedChainCode, derivedKey || 0x00 || bigEndian32(i))\n * trueHmac = HMAC-SHA-512(derivedChainCode, derivedKey || 0x01 || bigEndian32(i))\n *\n * falsePreimage = falseHmac[0..16) // 16 bytes = GC_LABEL_SIZE\n * truePreimage = trueHmac[0..16)\n *\n * falseHash = Hash160(falsePreimage) // 20 bytes\n * trueHash = Hash160(truePreimage)\n * ```\n *\n * 4. **Cleanup** — All intermediate key material is zeroed.\n *\n * The same (mnemonic, vaultId, depositorPk, appContractAddress) tuple always\n * produces the same keypair, enabling recovery from the mnemonic alone.\n *\n * @param seed - 64-byte seed from {@link mnemonicToWotsSeed}.\n * @param vaultId - Unique identifier of the vault (e.g. pegin tx hash).\n * @param depositorPk - Depositor's public key (hex string).\n * @param appContractAddress - Ethereum address of the application contract.\n * @returns A {@link WotsKeypair} with 508 preimage/hash pairs per branch.\n */\nexport async function deriveWotsKeypair(\n seed: Uint8Array,\n vaultId: string,\n depositorPk: string,\n appContractAddress: string,\n): Promise<WotsKeypair> {\n if (seed.length !== SEED_SIZE) {\n throw new Error(\n `WOTS seed must be ${SEED_SIZE} bytes, got ${seed.length}`,\n );\n }\n\n // Normalize BTC-style inputs by stripping 0x prefixes.\n // appContractAddress is NOT stripped — Ethereum addresses include the 0x\n // prefix in their canonical form, and existing on-chain commitments were\n // computed with it included. Changing this would break hash determinism.\n vaultId = stripHexPrefix(vaultId);\n depositorPk = stripHexPrefix(depositorPk);\n\n const chainCode = seed.slice(KEY_SIZE, SEED_SIZE);\n const parentKey = seed.slice(0, KEY_SIZE);\n\n // Track all intermediate buffers containing key material for cleanup.\n const sensitiveBuffers: Uint8Array[] = [chainCode, parentKey];\n\n try {\n const vaultData = concatBytes(\n lengthPrefixed(stringToBytes(vaultId)),\n lengthPrefixed(stringToBytes(depositorPk)),\n lengthPrefixed(stringToBytes(appContractAddress)),\n );\n\n const hmacInput = concatBytes(parentKey, vaultData);\n sensitiveBuffers.push(hmacInput);\n\n const hmacResult = hmacSha512(chainCode, hmacInput);\n sensitiveBuffers.push(hmacResult);\n\n const derivedKey = hmacResult.slice(0, KEY_SIZE);\n const derivedChainCode = hmacResult.slice(KEY_SIZE, SEED_SIZE);\n sensitiveBuffers.push(derivedKey, derivedChainCode);\n\n const falsePreimages: Uint8Array[] = [];\n const truePreimages: Uint8Array[] = [];\n const falseHashes: Uint8Array[] = [];\n const trueHashes: Uint8Array[] = [];\n\n let succeeded = false;\n try {\n for (let bit = 0; bit < PI_1_BITS; bit++) {\n const falseIndex = new Uint8Array(INDEX_BUFFER_SIZE);\n falseIndex[0] = 0;\n new DataView(falseIndex.buffer).setUint32(1, bit, false);\n\n const trueIndex = new Uint8Array(INDEX_BUFFER_SIZE);\n trueIndex[0] = 1;\n new DataView(trueIndex.buffer).setUint32(1, bit, false);\n\n const falseInput = concatBytes(derivedKey, falseIndex);\n const trueInput = concatBytes(derivedKey, trueIndex);\n const falseHmac = hmacSha512(derivedChainCode, falseInput);\n const trueHmac = hmacSha512(derivedChainCode, trueInput);\n\n try {\n const falsePreimage = falseHmac.slice(0, GC_LABEL_SIZE);\n const truePreimage = trueHmac.slice(0, GC_LABEL_SIZE);\n\n falsePreimages.push(falsePreimage);\n truePreimages.push(truePreimage);\n falseHashes.push(hash160(falsePreimage));\n trueHashes.push(hash160(truePreimage));\n } finally {\n falseInput.fill(0);\n trueInput.fill(0);\n falseHmac.fill(0);\n trueHmac.fill(0);\n }\n }\n\n succeeded = true;\n return { falsePreimages, truePreimages, falseHashes, trueHashes };\n } finally {\n if (!succeeded) {\n for (const p of falsePreimages) p.fill(0);\n for (const p of truePreimages) p.fill(0);\n }\n }\n } finally {\n for (const buf of sensitiveBuffers) {\n buf.fill(0);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Serialization\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the public key from a WOTS keypair.\n *\n * The public key consists of the Hash160 digests (hex-encoded) for both\n * the `false` and `true` branch of each bit position. This is the value\n * submitted on-chain and to the vault provider for later signature\n * verification.\n *\n * @param keypair - A derived {@link WotsKeypair}.\n * @returns The {@link WotsPublicKey} with `false_list` and `true_list`,\n * each containing 508 hex strings of 40 characters (20 bytes).\n */\nexport function keypairToPublicKey(keypair: WotsKeypair): WotsPublicKey {\n return {\n false_list: keypair.falseHashes.map(toHex),\n true_list: keypair.trueHashes.map(toHex),\n };\n}\n\n/**\n * Compute the keccak256 hash of a WOTS keypair's public key.\n *\n * Matches the Rust `InputLabelHashes::keccak256_hash()` implementation:\n * `keccak256(falseHashes[0] || falseHashes[1] || ... || trueHashes[0] || trueHashes[1] || ...)`\n *\n * Each hash is 20 bytes (Hash160). Total input: `PI_1_BITS * 20 * 2` bytes.\n * The result is committed on-chain as `depositorWotsPkHash` so the vault\n * provider can later verify submitted WOTS public keys.\n *\n * @param keypair - A derived {@link WotsKeypair}.\n * @returns 32-byte keccak256 digest as a `0x`-prefixed hex string.\n */\nexport function computeWotsPkHash(keypair: WotsKeypair): `0x${string}` {\n if (keypair.falseHashes.length === 0 || keypair.trueHashes.length === 0) {\n throw new Error(\n \"computeWotsPkHash: keypair hash arrays must not be empty\",\n );\n }\n const hashSize = keypair.falseHashes[0].length;\n const totalBytes =\n (keypair.falseHashes.length + keypair.trueHashes.length) * hashSize;\n const buffer = new Uint8Array(totalBytes);\n\n let offset = 0;\n for (const h of keypair.falseHashes) {\n buffer.set(h, offset);\n offset += hashSize;\n }\n for (const h of keypair.trueHashes) {\n buffer.set(h, offset);\n offset += hashSize;\n }\n\n const digest = keccak_256(buffer);\n return `0x${toHex(digest)}`;\n}\n","import { computeWotsPkHash, deriveWotsKeypair, mnemonicToWotsSeed } from \"./derivation\";\n\n/**\n * Convenience wrapper: derive a WOTS keypair from a mnemonic and return\n * the keccak256 hash of its public key. Handles seed creation and cleanup.\n *\n * Used before the ETH transaction to produce the `depositorWotsPkHash`\n * that gets committed on-chain.\n */\nexport async function deriveWotsPkHash(\n mnemonic: string,\n peginTxid: string,\n depositorBtcPubkey: string,\n appContractAddress: string,\n): Promise<`0x${string}`> {\n const seed = mnemonicToWotsSeed(mnemonic);\n try {\n const keypair = await deriveWotsKeypair(\n seed,\n peginTxid,\n depositorBtcPubkey,\n appContractAddress,\n );\n try {\n return computeWotsPkHash(keypair);\n } finally {\n for (const p of keypair.falsePreimages) p.fill(0);\n for (const p of keypair.truePreimages) p.fill(0);\n }\n } finally {\n seed.fill(0);\n }\n}\n","/**\n * Check whether an error from the vault provider indicates that the\n * submitted WOTS public key hash does not match the on-chain\n * commitment. This signals that the wrong mnemonic was used.\n */\nexport function isWotsMismatchError(error: unknown): boolean {\n const msg = (\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"\"\n ).toLowerCase();\n\n return (\n msg.includes(\"wots\") &&\n msg.includes(\"hash\") &&\n msg.includes(\"does not match\")\n );\n}\n"],"names":["selectUtxosForPegin","availableUTXOs","peginAmount","feeRate","numOutputs","validUTXOs","utxo","script","Buffer","bitcoinScript","sortedUTXOs","a","b","selectedUTXOs","accumulatedValue","estimatedFee","inputSize","P2TR_INPUT_SIZE","outputSize","MAX_NON_LEGACY_OUTPUT_SIZE","baseTxSize","TX_BUFFER_SIZE_OVERHEAD","rateBasedTxBufferFee","DUST_THRESHOLD","changeOutputFee","finalChangeAmount","shouldAddChangeOutput","changeAmount","getDustThreshold","BTC_DUST_SAT","calculateBtcTxHash","txHex","cleanHex","Transaction","createSplitTransaction","inputs","outputs","network","output","btcNetwork","getNetwork","tx","input","txidBuffer","outputUtxos","i","outputScript","bitcoinAddress","error","txid","createSplitTransactionPsbt","unsignedTxHex","publicKeyNoCoord","psbt","Psbt","expectedTxid","expectedVout","inputScript","witnessUtxo","BitcoinScriptType","getScriptType","scriptPubKey","length","getPsbtInputFields","type","createTaprootScriptPathSignOptions","publicKey","inputCount","_","MAX_SATOSHIS","MAX_FEE_RATE","isValidSatoshiValue","value","isValidFeeRate","isValidVout","vout","outputCount","MEMPOOL_API_URLS","fetchApi","url","options","response","errorText","contentType","pushTx","apiUrl","message","getTxInfo","getTxHex","getUtxoInfo","txInfo","getAddressUtxos","address","utxos","addressInfo","getMempoolApiUrl","getAddressTxs","getNetworkFees","data","feeFields","field","BTCVaultRegistryABI","CONTRACT_ERRORS","extractErrorData","err","current","depth","maxDepth","cause","hexMatch","getContractErrorMessage","errorData","selector","isKnownContractError","handleContractError","knownError","errorMsg","errorHint","resolveUtxoInfo","localPrevouts","local","RECEIPT_TIMEOUT_MS","PeginManager","config","__publicField","params","depositorBtcPubkeyRaw","depositorBtcPubkey","vaultProviderBtcPubkey","stripHexPrefix","vaultKeeperBtcPubkeys","universalChallengerBtcPubkeys","numLocalChallengers","prePeginParams","prePeginResult","buildPrePeginPsbt","utxoSelection","peginOutputCount","fundedPrePeginTxHex","fundPeginTransaction","prePeginTxid","peginTxResults","psbtsToSign","signOptions","peginTxResult","buildPeginTxFromFundedPrePegin","peginInputPsbtResult","buildPeginInputPsbt","signedPsbts","perVault","peginInputSignature","extractPeginInputSignature","depositorSignedPeginTxHex","finalizePeginInputPsbt","psbtsHexes","signed","cleanPubkey","utxoDataPromises","utxoData","inputsWithUtxoData","psbtInputFields","signedPsbtHex","signedPsbt","e","inp","signedTxHex","unsignedPrePeginTx","depositorSignedPeginTx","vaultProvider","hashlock","htlcVout","onPopSigned","depositorPayoutBtcAddress","depositorWotsPkHash","preSignedBtcPopSignature","depositorEthAddress","btcPopSignature","depositorBtcPubkeyHex","ensureHexPrefix","unsignedPrePeginTxHex","payoutScriptPubKey","peginTxHash","derivedVaultIdHex","deriveVaultId","vaultId","publicClient","createPublicClient","http","peginFee","callData","encodeFunctionData","gasEstimate","ethTxHash","receipt","zeroAddress","walletPubkey","isAddressFromPublicKey","bitcoin","verifyingContract","popMessage","btcPopSignatureRaw","PayoutManager","walletPubkeyRaw","depositorPubkey","validateWalletPubkey","payoutPsbt","buildPayoutPsbt","extractPayoutSignature","transactions","depositorPubkeys","results","payoutSignature","payoutTxHex","registeredPayoutScriptPubKey","isValidHex","expectedScript","payoutTx","max","isBytes","anumber","n","title","prefix","abytes","bytes","len","needsLen","ofLen","got","ahash","h","aexists","instance","checkFinished","aoutput","out","min","u32","arr","clean","arrays","createView","rotr","word","shift","rotl","isLE","byteSwap","byteSwap32","swap32IfBE","u","utf8ToBytes","str","kdfInputToBytes","errorTitle","checkOpts","defaults","opts","createHasher","hashCons","info","hashC","msg","tmp","oidNist","suffix","_HMAC","hash","key","blockLen","pad","buf","to","oHash","iHash","finished","destroyed","outputLen","hmac","Chi","c","Maj","HashMD","padOffset","view","buffer","pos","take","dataView","oview","outLen","state","res","SHA256_IV","SHA512_IV","Rho160","Id160","Pi160","idxLR","j","k","idxL","idxR","shifts160","shiftsL160","idx","shiftsR160","Kl160","Kr160","ripemd_f","group","x","y","z","BUF_160","_RIPEMD160","h0","h1","h2","h3","h4","offset","al","ar","bl","br","cl","cr","dl","dr","el","er","rGroup","hbl","hbr","rl","rr","sl","sr","tl","tr","ripemd160","U32_MASK64","_32n","fromBig","le","split","lst","Ah","Al","l","shrSH","_l","s","shrSL","rotrSH","rotrSL","rotrBH","rotrBL","rotlSH","rotlSL","rotlBH","rotlBL","add","Bh","Bl","add3L","Cl","add3H","low","Ch","add4L","Dl","add4H","Dh","add5L","El","add5H","Eh","SHA256_K","SHA256_W","SHA2_32B","A","B","C","D","E","F","G","H","W15","W2","s0","s1","sigma1","T1","T2","_SHA256","K512","u64.split","SHA512_Kh","SHA512_Kl","SHA512_W_H","SHA512_W_L","SHA2_64B","Fh","Fl","Gh","Gl","Hh","Hl","W15h","W15l","s0h","u64.rotrSH","u64.shrSH","s0l","u64.rotrSL","u64.shrSL","W2h","W2l","s1h","u64.rotrBH","s1l","u64.rotrBL","SUMl","u64.add4L","SUMh","u64.add4H","sigma1h","sigma1l","CHIh","CHIl","T1ll","u64.add5L","T1h","u64.add5H","T1l","sigma0h","sigma0l","MAJh","MAJl","u64.add","All","u64.add3L","u64.add3H","_SHA512","sha256","sha512","_0n","_1n","_2n","_7n","_256n","_0x71n","SHA3_PI","SHA3_ROTL","_SHA3_IOTA","round","R","t","IOTAS","SHA3_IOTA_H","SHA3_IOTA_L","rotlH","rotlL","keccakP","rounds","idx1","idx0","B0","B1","Th","Tl","curH","curL","PI","Keccak","enableXOF","bufferOut","genKeccak","keccak_256","pbkdf2Init","_password","_salt","_opts","dkLen","asyncTick","password","salt","DK","PRF","PRFSalt","pbkdf2Output","prfW","pbkdf2","ti","Ti","ui","nfkd","normalize","norm","words","psalt","passphrase","mnemonicToSeedSync","mnemonic","PI_1_BITS","GC_LABEL_SIZE","KEY_SIZE","SEED_SIZE","INDEX_BUFFER_SIZE","LENGTH_PREFIX_SIZE","concatBytes","totalLength","sum","result","stringToBytes","lengthPrefixed","hmacSha512","hash160","toHex","mnemonicToWotsSeed","seed","copy","deriveWotsKeypair","depositorPk","appContractAddress","chainCode","parentKey","sensitiveBuffers","vaultData","hmacInput","hmacResult","derivedKey","derivedChainCode","falsePreimages","truePreimages","falseHashes","trueHashes","succeeded","bit","falseIndex","trueIndex","falseInput","trueInput","falseHmac","trueHmac","falsePreimage","truePreimage","p","keypairToPublicKey","keypair","computeWotsPkHash","hashSize","totalBytes","digest","deriveWotsPkHash","peginTxid","isWotsMismatchError"],"mappings":"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","x_google_ignoreList":[11,12,13,14,15,16,17,18,19]}