@btc-vision/bitcoin 6.5.6 → 7.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
- package/benchmark/psbt-2000-inputs.bench.ts +178 -0
- package/benchmark/signing.bench.ts +147 -0
- package/browser/address.d.ts +56 -9
- package/browser/address.d.ts.map +1 -0
- package/browser/bech32utils.d.ts +9 -1
- package/browser/bech32utils.d.ts.map +1 -0
- package/browser/bip66.d.ts +11 -6
- package/browser/bip66.d.ts.map +1 -0
- package/browser/block.d.ts +117 -11
- package/browser/block.d.ts.map +1 -0
- package/browser/branded.d.ts +20 -0
- package/browser/branded.d.ts.map +1 -0
- package/browser/crypto/crypto.d.ts +1 -0
- package/browser/crypto/crypto.d.ts.map +1 -0
- package/browser/crypto.d.ts +46 -7
- package/browser/crypto.d.ts.map +1 -0
- package/browser/ecc/context.d.ts +129 -0
- package/browser/ecc/context.d.ts.map +1 -0
- package/browser/ecc/index.d.ts +11 -0
- package/browser/ecc/index.d.ts.map +1 -0
- package/browser/ecc/types.d.ts +128 -0
- package/browser/ecc/types.d.ts.map +1 -0
- package/browser/ecpair.d.ts +99 -0
- package/browser/errors.d.ts +124 -0
- package/browser/errors.d.ts.map +1 -0
- package/browser/index.d.ts +32 -5
- package/browser/index.d.ts.map +1 -0
- package/browser/index.js +12482 -101
- package/browser/io/BinaryReader.d.ts +276 -0
- package/browser/io/BinaryReader.d.ts.map +1 -0
- package/browser/io/BinaryWriter.d.ts +391 -0
- package/browser/io/BinaryWriter.d.ts.map +1 -0
- package/browser/io/MemoryPool.d.ts +220 -0
- package/browser/io/MemoryPool.d.ts.map +1 -0
- package/browser/io/base64.d.ts +13 -0
- package/browser/io/base64.d.ts.map +1 -0
- package/browser/io/hex.d.ts +67 -0
- package/browser/io/hex.d.ts.map +1 -0
- package/browser/io/index.d.ts +17 -0
- package/browser/io/index.d.ts.map +1 -0
- package/browser/io/utils.d.ts +199 -0
- package/browser/io/utils.d.ts.map +1 -0
- package/browser/merkle.d.ts +10 -1
- package/browser/merkle.d.ts.map +1 -0
- package/browser/networks.d.ts +70 -9
- package/browser/networks.d.ts.map +1 -0
- package/browser/opcodes.d.ts +1 -0
- package/browser/opcodes.d.ts.map +1 -0
- package/browser/payments/bip341.d.ts +35 -9
- package/browser/payments/bip341.d.ts.map +1 -0
- package/browser/payments/embed.d.ts +112 -1
- package/browser/payments/embed.d.ts.map +1 -0
- package/browser/payments/index.d.ts +17 -10
- package/browser/payments/index.d.ts.map +1 -0
- package/browser/payments/p2ms.d.ts +150 -0
- package/browser/payments/p2ms.d.ts.map +1 -0
- package/browser/payments/p2op.d.ts +150 -24
- package/browser/payments/p2op.d.ts.map +1 -0
- package/browser/payments/p2pk.d.ts +154 -1
- package/browser/payments/p2pk.d.ts.map +1 -0
- package/browser/payments/p2pkh.d.ts +176 -1
- package/browser/payments/p2pkh.d.ts.map +1 -0
- package/browser/payments/p2sh.d.ts +150 -1
- package/browser/payments/p2sh.d.ts.map +1 -0
- package/browser/payments/p2tr.d.ts +185 -1
- package/browser/payments/p2tr.d.ts.map +1 -0
- package/browser/payments/p2wpkh.d.ts +161 -1
- package/browser/payments/p2wpkh.d.ts.map +1 -0
- package/browser/payments/p2wsh.d.ts +146 -1
- package/browser/payments/p2wsh.d.ts.map +1 -0
- package/browser/payments/types.d.ts +94 -64
- package/browser/payments/types.d.ts.map +1 -0
- package/browser/psbt/bip371.d.ts +34 -8
- package/browser/psbt/bip371.d.ts.map +1 -0
- package/browser/psbt/psbtutils.d.ts +56 -16
- package/browser/psbt/psbtutils.d.ts.map +1 -0
- package/browser/psbt/types.d.ts +245 -0
- package/browser/psbt/types.d.ts.map +1 -0
- package/browser/psbt/utils.d.ts +64 -0
- package/browser/psbt/utils.d.ts.map +1 -0
- package/browser/psbt/validation.d.ts +84 -0
- package/browser/psbt/validation.d.ts.map +1 -0
- package/browser/psbt.d.ts +82 -118
- package/browser/psbt.d.ts.map +1 -0
- package/browser/pubkey.d.ts +27 -6
- package/browser/pubkey.d.ts.map +1 -0
- package/browser/push_data.d.ts +24 -2
- package/browser/push_data.d.ts.map +1 -0
- package/browser/script.d.ts +33 -8
- package/browser/script.d.ts.map +1 -0
- package/browser/script_number.d.ts +17 -0
- package/browser/script_number.d.ts.map +1 -0
- package/browser/script_signature.d.ts +23 -5
- package/browser/script_signature.d.ts.map +1 -0
- package/browser/transaction.d.ts +160 -18
- package/browser/transaction.d.ts.map +1 -0
- package/browser/types.d.ts +36 -38
- package/browser/types.d.ts.map +1 -0
- package/browser/workers/WorkerSigningPool.d.ts +143 -0
- package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
- package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
- package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
- package/browser/workers/ecc-bundle.d.ts +25 -0
- package/browser/workers/ecc-bundle.d.ts.map +1 -0
- package/browser/workers/index.d.ts +91 -0
- package/browser/workers/index.d.ts.map +1 -0
- package/browser/workers/psbt-parallel.d.ts +88 -0
- package/browser/workers/psbt-parallel.d.ts.map +1 -0
- package/browser/workers/signing-worker.d.ts +37 -0
- package/browser/workers/signing-worker.d.ts.map +1 -0
- package/browser/workers/types.d.ts +365 -0
- package/browser/workers/types.d.ts.map +1 -0
- package/build/address.d.ts +57 -10
- package/build/address.d.ts.map +1 -0
- package/build/address.js +80 -24
- package/build/address.js.map +1 -0
- package/build/bech32utils.d.ts +9 -1
- package/build/bech32utils.d.ts.map +1 -0
- package/build/bech32utils.js +10 -2
- package/build/bech32utils.js.map +1 -0
- package/build/bip66.d.ts +11 -6
- package/build/bip66.d.ts.map +1 -0
- package/build/bip66.js +32 -3
- package/build/bip66.js.map +1 -0
- package/build/block.d.ts +117 -11
- package/build/block.d.ts.map +1 -0
- package/build/block.js +204 -72
- package/build/block.js.map +1 -0
- package/build/branded.d.ts +20 -0
- package/build/branded.d.ts.map +1 -0
- package/build/branded.js +7 -0
- package/build/branded.js.map +1 -0
- package/build/crypto/crypto.d.ts +1 -0
- package/build/crypto/crypto.d.ts.map +1 -0
- package/build/crypto/crypto.js +1 -0
- package/build/crypto/crypto.js.map +1 -0
- package/build/crypto.d.ts +46 -7
- package/build/crypto.d.ts.map +1 -0
- package/build/crypto.js +65 -20
- package/build/crypto.js.map +1 -0
- package/build/ecc/context.d.ts +135 -0
- package/build/ecc/context.d.ts.map +1 -0
- package/build/ecc/context.js +232 -0
- package/build/ecc/context.js.map +1 -0
- package/build/ecc/index.d.ts +11 -0
- package/build/ecc/index.d.ts.map +1 -0
- package/build/ecc/index.js +11 -0
- package/build/ecc/index.js.map +1 -0
- package/build/ecc/types.d.ts +134 -0
- package/build/ecc/types.d.ts.map +1 -0
- package/build/ecc/types.js +8 -0
- package/build/ecc/types.js.map +1 -0
- package/build/errors.d.ts +124 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +155 -0
- package/build/errors.js.map +1 -0
- package/build/index.d.ts +32 -5
- package/build/index.d.ts.map +1 -0
- package/build/index.js +26 -3
- package/build/index.js.map +1 -0
- package/build/io/BinaryReader.d.ts +276 -0
- package/build/io/BinaryReader.d.ts.map +1 -0
- package/build/io/BinaryReader.js +425 -0
- package/build/io/BinaryReader.js.map +1 -0
- package/build/io/BinaryWriter.d.ts +391 -0
- package/build/io/BinaryWriter.d.ts.map +1 -0
- package/build/io/BinaryWriter.js +611 -0
- package/build/io/BinaryWriter.js.map +1 -0
- package/build/io/MemoryPool.d.ts +220 -0
- package/build/io/MemoryPool.d.ts.map +1 -0
- package/build/io/MemoryPool.js +309 -0
- package/build/io/MemoryPool.js.map +1 -0
- package/build/io/base64.d.ts +13 -0
- package/build/io/base64.d.ts.map +1 -0
- package/build/io/base64.js +20 -0
- package/build/io/base64.js.map +1 -0
- package/build/io/hex.d.ts +67 -0
- package/build/io/hex.d.ts.map +1 -0
- package/build/io/hex.js +138 -0
- package/build/io/hex.js.map +1 -0
- package/build/io/index.d.ts +17 -0
- package/build/io/index.d.ts.map +1 -0
- package/build/io/index.js +23 -0
- package/build/io/index.js.map +1 -0
- package/build/io/utils.d.ts +199 -0
- package/build/io/utils.d.ts.map +1 -0
- package/build/io/utils.js +271 -0
- package/build/io/utils.js.map +1 -0
- package/build/merkle.d.ts +10 -1
- package/build/merkle.d.ts.map +1 -0
- package/build/merkle.js +12 -1
- package/build/merkle.js.map +1 -0
- package/build/networks.d.ts +70 -9
- package/build/networks.d.ts.map +1 -0
- package/build/networks.js +90 -4
- package/build/networks.js.map +1 -0
- package/build/opcodes.d.ts +1 -0
- package/build/opcodes.d.ts.map +1 -0
- package/build/opcodes.js +1 -0
- package/build/opcodes.js.map +1 -0
- package/build/payments/bip341.d.ts +36 -9
- package/build/payments/bip341.d.ts.map +1 -0
- package/build/payments/bip341.js +35 -15
- package/build/payments/bip341.js.map +1 -0
- package/build/payments/embed.d.ts +120 -1
- package/build/payments/embed.d.ts.map +1 -0
- package/build/payments/embed.js +215 -34
- package/build/payments/embed.js.map +1 -0
- package/build/payments/index.d.ts +17 -10
- package/build/payments/index.d.ts.map +1 -0
- package/build/payments/index.js +20 -10
- package/build/payments/index.js.map +1 -0
- package/build/payments/p2ms.d.ts +159 -1
- package/build/payments/p2ms.d.ts.map +1 -0
- package/build/payments/p2ms.js +427 -108
- package/build/payments/p2ms.js.map +1 -0
- package/build/payments/p2op.d.ts +158 -24
- package/build/payments/p2op.d.ts.map +1 -0
- package/build/payments/p2op.js +379 -93
- package/build/payments/p2op.js.map +1 -0
- package/build/payments/p2pk.d.ts +162 -1
- package/build/payments/p2pk.d.ts.map +1 -0
- package/build/payments/p2pk.js +327 -58
- package/build/payments/p2pk.js.map +1 -0
- package/build/payments/p2pkh.d.ts +185 -1
- package/build/payments/p2pkh.d.ts.map +1 -0
- package/build/payments/p2pkh.js +467 -114
- package/build/payments/p2pkh.js.map +1 -0
- package/build/payments/p2sh.d.ts +159 -1
- package/build/payments/p2sh.d.ts.map +1 -0
- package/build/payments/p2sh.js +500 -152
- package/build/payments/p2sh.js.map +1 -0
- package/build/payments/p2tr.d.ts +193 -1
- package/build/payments/p2tr.d.ts.map +1 -0
- package/build/payments/p2tr.js +592 -174
- package/build/payments/p2tr.js.map +1 -0
- package/build/payments/p2wpkh.d.ts +170 -1
- package/build/payments/p2wpkh.d.ts.map +1 -0
- package/build/payments/p2wpkh.js +429 -104
- package/build/payments/p2wpkh.js.map +1 -0
- package/build/payments/p2wsh.d.ts +155 -1
- package/build/payments/p2wsh.d.ts.map +1 -0
- package/build/payments/p2wsh.js +466 -144
- package/build/payments/p2wsh.js.map +1 -0
- package/build/payments/types.d.ts +98 -64
- package/build/payments/types.d.ts.map +1 -0
- package/build/payments/types.js +17 -13
- package/build/payments/types.js.map +1 -0
- package/build/psbt/bip371.d.ts +35 -9
- package/build/psbt/bip371.d.ts.map +1 -0
- package/build/psbt/bip371.js +113 -28
- package/build/psbt/bip371.js.map +1 -0
- package/build/psbt/psbtutils.d.ts +56 -16
- package/build/psbt/psbtutils.d.ts.map +1 -0
- package/build/psbt/psbtutils.js +71 -16
- package/build/psbt/psbtutils.js.map +1 -0
- package/build/psbt/types.d.ts +249 -0
- package/build/psbt/types.d.ts.map +1 -0
- package/build/psbt/types.js +6 -0
- package/build/psbt/types.js.map +1 -0
- package/build/psbt/utils.d.ts +68 -0
- package/build/psbt/utils.d.ts.map +1 -0
- package/build/psbt/utils.js +171 -0
- package/build/psbt/utils.js.map +1 -0
- package/build/psbt/validation.d.ts +88 -0
- package/build/psbt/validation.d.ts.map +1 -0
- package/build/psbt/validation.js +149 -0
- package/build/psbt/validation.js.map +1 -0
- package/build/psbt.d.ts +84 -120
- package/build/psbt.d.ts.map +1 -0
- package/build/psbt.js +411 -412
- package/build/psbt.js.map +1 -0
- package/build/pubkey.d.ts +27 -6
- package/build/pubkey.d.ts.map +1 -0
- package/build/pubkey.js +36 -12
- package/build/pubkey.js.map +1 -0
- package/build/push_data.d.ts +24 -2
- package/build/push_data.d.ts.map +1 -0
- package/build/push_data.js +44 -12
- package/build/push_data.js.map +1 -0
- package/build/script.d.ts +33 -8
- package/build/script.d.ts.map +1 -0
- package/build/script.js +100 -36
- package/build/script.js.map +1 -0
- package/build/script_number.d.ts +17 -0
- package/build/script_number.d.ts.map +1 -0
- package/build/script_number.js +19 -0
- package/build/script_number.js.map +1 -0
- package/build/script_signature.d.ts +23 -5
- package/build/script_signature.d.ts.map +1 -0
- package/build/script_signature.js +48 -15
- package/build/script_signature.js.map +1 -0
- package/build/transaction.d.ts +160 -18
- package/build/transaction.d.ts.map +1 -0
- package/build/transaction.js +443 -176
- package/build/transaction.js.map +1 -0
- package/build/tsconfig.build.tsbuildinfo +1 -0
- package/build/types.d.ts +36 -38
- package/build/types.d.ts.map +1 -0
- package/build/types.js +175 -57
- package/build/types.js.map +1 -0
- package/build/workers/WorkerSigningPool.d.ts +174 -0
- package/build/workers/WorkerSigningPool.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.js +553 -0
- package/build/workers/WorkerSigningPool.js.map +1 -0
- package/build/workers/WorkerSigningPool.node.d.ts +124 -0
- package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.node.js +753 -0
- package/build/workers/WorkerSigningPool.node.js.map +1 -0
- package/build/workers/ecc-bundle.d.ts +25 -0
- package/build/workers/ecc-bundle.d.ts.map +1 -0
- package/build/workers/ecc-bundle.js +25 -0
- package/build/workers/ecc-bundle.js.map +1 -0
- package/build/workers/index.d.ts +91 -0
- package/build/workers/index.d.ts.map +1 -0
- package/build/workers/index.js +114 -0
- package/build/workers/index.js.map +1 -0
- package/build/workers/psbt-parallel.d.ts +117 -0
- package/build/workers/psbt-parallel.d.ts.map +1 -0
- package/build/workers/psbt-parallel.js +233 -0
- package/build/workers/psbt-parallel.js.map +1 -0
- package/build/workers/signing-worker.d.ts +37 -0
- package/build/workers/signing-worker.d.ts.map +1 -0
- package/build/workers/signing-worker.js +350 -0
- package/build/workers/signing-worker.js.map +1 -0
- package/build/workers/types.d.ts +365 -0
- package/build/workers/types.d.ts.map +1 -0
- package/build/workers/types.js +60 -0
- package/build/workers/types.js.map +1 -0
- package/package.json +66 -8
- package/scripts/bundle-ecc.ts +111 -0
- package/src/address.ts +81 -44
- package/src/bech32utils.ts +3 -3
- package/src/bip66.ts +34 -24
- package/src/block.ts +196 -84
- package/src/branded.ts +18 -0
- package/src/crypto.ts +64 -26
- package/src/ecc/context.ts +277 -0
- package/src/ecc/index.ts +14 -0
- package/src/ecc/types.ts +154 -0
- package/src/ecpair.d.ts +99 -0
- package/src/errors.ts +163 -0
- package/src/index.ts +113 -9
- package/src/io/BinaryReader.ts +461 -0
- package/src/io/BinaryWriter.ts +696 -0
- package/src/io/MemoryPool.ts +343 -0
- package/src/io/base64.ts +20 -0
- package/src/io/hex.ts +155 -0
- package/src/io/index.ts +41 -0
- package/src/io/utils.ts +283 -0
- package/src/merkle.ts +14 -9
- package/src/networks.ts +9 -9
- package/src/payments/bip341.ts +34 -33
- package/src/payments/embed.ts +244 -41
- package/src/payments/index.ts +12 -10
- package/src/payments/p2ms.ts +490 -118
- package/src/payments/p2op.ts +431 -133
- package/src/payments/p2pk.ts +370 -72
- package/src/payments/p2pkh.ts +524 -130
- package/src/payments/p2sh.ts +572 -172
- package/src/payments/p2tr.ts +686 -194
- package/src/payments/p2wpkh.ts +484 -107
- package/src/payments/p2wsh.ts +526 -164
- package/src/payments/types.ts +80 -66
- package/src/psbt/bip371.ts +68 -51
- package/src/psbt/psbtutils.ts +39 -40
- package/src/psbt/types.ts +331 -0
- package/src/psbt/utils.ts +188 -0
- package/src/psbt/validation.ts +192 -0
- package/src/psbt.ts +566 -809
- package/src/pubkey.ts +22 -23
- package/src/push_data.ts +18 -16
- package/src/script.ts +82 -64
- package/src/script_number.ts +6 -6
- package/src/script_signature.ts +33 -36
- package/src/transaction.ts +458 -238
- package/src/types.ts +231 -100
- package/src/workers/WorkerSigningPool.node.ts +887 -0
- package/src/workers/WorkerSigningPool.ts +670 -0
- package/src/workers/ecc-bundle.ts +26 -0
- package/src/workers/index.ts +165 -0
- package/src/workers/psbt-parallel.ts +332 -0
- package/src/workers/signing-worker.ts +353 -0
- package/src/workers/types.ts +413 -0
- package/test/address.spec.ts +9 -6
- package/test/bitcoin.core.spec.ts +16 -17
- package/test/block.spec.ts +8 -7
- package/test/bufferutils.spec.ts +228 -214
- package/test/crypto.spec.ts +19 -11
- package/test/fixtures/p2pk.json +0 -8
- package/test/fixtures/p2pkh.json +1 -1
- package/test/fixtures/p2sh.json +1 -1
- package/test/fixtures/script.json +1 -1
- package/test/fixtures/transaction.json +2 -2
- package/test/integration/_regtest.ts +25 -0
- package/test/integration/addresses.spec.ts +4 -3
- package/test/integration/bip32.spec.ts +2 -1
- package/test/integration/blocks.spec.ts +1 -1
- package/test/integration/cltv.spec.ts +18 -16
- package/test/integration/csv.spec.ts +37 -64
- package/test/integration/payments.spec.ts +5 -3
- package/test/integration/taproot.spec.ts +76 -83
- package/test/integration/transactions.spec.ts +38 -35
- package/test/payments.spec.ts +35 -13
- package/test/payments.utils.ts +17 -16
- package/test/psbt.spec.ts +111 -100
- package/test/script.spec.ts +11 -10
- package/test/script_signature.spec.ts +9 -11
- package/test/taproot-cache.spec.ts +694 -0
- package/test/transaction.spec.ts +32 -40
- package/test/types.spec.ts +74 -29
- package/test/workers-pool.spec.ts +963 -0
- package/test/workers-signing.spec.ts +635 -0
- package/test/workers.spec.ts +1390 -0
- package/tsconfig.base.json +34 -18
- package/tsconfig.browser.json +15 -0
- package/tsconfig.build.json +5 -0
- package/tsconfig.json +5 -14
- package/vite.config.browser.ts +3 -42
- package/vitest.config.integration.ts +2 -0
- package/browser/bufferutils.d.ts +0 -34
- package/browser/chunks/crypto-BhCpKpek.js +0 -2033
- package/browser/chunks/payments-B1wlSccx.js +0 -1089
- package/browser/chunks/psbt-BCNk7JUx.js +0 -4055
- package/browser/chunks/script-DyPItFEl.js +0 -318
- package/browser/chunks/transaction-C_UbhMGn.js +0 -432
- package/browser/chunks/utils-DNZi-T5W.js +0 -761
- package/browser/ecc_lib.d.ts +0 -3
- package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
- package/browser/hooks/HookedSigner.d.ts +0 -4
- package/browser/hooks/SignatureManager.d.ts +0 -13
- package/browser/payments/lazy.d.ts +0 -2
- package/browser/typeforce.d.ts +0 -38
- package/build/bufferutils.d.ts +0 -34
- package/build/bufferutils.js +0 -141
- package/build/ecc_lib.d.ts +0 -3
- package/build/ecc_lib.js +0 -61
- package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
- package/build/hooks/AdvancedSignatureManager.js +0 -52
- package/build/hooks/HookedSigner.d.ts +0 -4
- package/build/hooks/HookedSigner.js +0 -64
- package/build/hooks/SignatureManager.d.ts +0 -13
- package/build/hooks/SignatureManager.js +0 -45
- package/build/payments/lazy.d.ts +0 -2
- package/build/payments/lazy.js +0 -28
- package/build/tsconfig.tsbuildinfo +0 -1
- package/src/bufferutils.ts +0 -188
- package/src/ecc_lib.ts +0 -94
- package/src/hooks/AdvancedSignatureManager.ts +0 -104
- package/src/hooks/HookedSigner.ts +0 -108
- package/src/hooks/SignatureManager.ts +0 -84
- package/src/payments/lazy.ts +0 -28
- package/src/typeforce.d.ts +0 -38
- package/tsconfig.webpack.json +0 -18
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline signing worker code.
|
|
3
|
+
*
|
|
4
|
+
* This module generates the worker code as a string that can be
|
|
5
|
+
* loaded via Blob URL. The worker uses the bundled @noble/secp256k1
|
|
6
|
+
* library embedded at compile time - no network requests required.
|
|
7
|
+
*
|
|
8
|
+
* SECURITY CRITICAL:
|
|
9
|
+
* - Private keys are zeroed immediately after signing
|
|
10
|
+
* - No key data is logged or stored
|
|
11
|
+
* - Worker only holds key during active signing operation
|
|
12
|
+
* - ECC library is bundled at compile time (no CDN dependency)
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { ECC_BUNDLE } from './ecc-bundle.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Generates the inline worker code as a string.
|
|
21
|
+
*
|
|
22
|
+
* The worker uses the bundled @noble/secp256k1 library directly,
|
|
23
|
+
* eliminating any network dependencies.
|
|
24
|
+
*
|
|
25
|
+
* @returns Worker code as a string for Blob URL creation
|
|
26
|
+
*/
|
|
27
|
+
export function generateWorkerCode(): string {
|
|
28
|
+
// This code runs inside the worker
|
|
29
|
+
return `
|
|
30
|
+
'use strict';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Zero out a Uint8Array to clear sensitive data.
|
|
34
|
+
* @param {Uint8Array} arr - Array to zero
|
|
35
|
+
*/
|
|
36
|
+
function secureZero(arr) {
|
|
37
|
+
if (arr && arr.fill) {
|
|
38
|
+
arr.fill(0);
|
|
39
|
+
// Double-write to prevent optimization
|
|
40
|
+
for (let i = 0; i < arr.length; i++) {
|
|
41
|
+
arr[i] = 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Bundled @noble/secp256k1 + hashes library (embedded at compile time).
|
|
48
|
+
*/
|
|
49
|
+
const eccBundle = ${JSON.stringify(ECC_BUNDLE)};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Initialize the ECC library from the bundle.
|
|
53
|
+
* The bundle exports nobleBundle with { secp, sha256, hmac }.
|
|
54
|
+
*/
|
|
55
|
+
const eccModule = (function() {
|
|
56
|
+
// Execute the IIFE and return the nobleBundle object
|
|
57
|
+
const fn = new Function(eccBundle + '; return nobleBundle;');
|
|
58
|
+
return fn();
|
|
59
|
+
})();
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* ECC library wrapper with the interface we need.
|
|
63
|
+
* Uses eccModule.secp which has hashes pre-configured.
|
|
64
|
+
*/
|
|
65
|
+
const eccLib = {
|
|
66
|
+
sign: (hash, privateKey) => {
|
|
67
|
+
// noble's sign returns Signature object, we need compact 64-byte format
|
|
68
|
+
const sig = eccModule.secp.sign(hash, privateKey, { lowS: true });
|
|
69
|
+
return sig.toCompactRawBytes();
|
|
70
|
+
},
|
|
71
|
+
signSchnorr: (hash, privateKey) => {
|
|
72
|
+
return eccModule.secp.schnorr.sign(hash, privateKey);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Whether initialization is complete.
|
|
78
|
+
*/
|
|
79
|
+
let initialized = false;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Pending messages received before init completes.
|
|
83
|
+
*/
|
|
84
|
+
const pendingMessages = [];
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Handle incoming messages from main thread.
|
|
88
|
+
*/
|
|
89
|
+
self.onmessage = async function(event) {
|
|
90
|
+
const msg = event.data;
|
|
91
|
+
|
|
92
|
+
// Queue messages until initialized (except init)
|
|
93
|
+
if (!initialized && msg.type !== 'init') {
|
|
94
|
+
pendingMessages.push(msg);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
await handleMessage(msg);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Process a message.
|
|
103
|
+
*/
|
|
104
|
+
async function handleMessage(msg) {
|
|
105
|
+
switch (msg.type) {
|
|
106
|
+
case 'init':
|
|
107
|
+
handleInit(msg);
|
|
108
|
+
break;
|
|
109
|
+
case 'sign':
|
|
110
|
+
handleSign(msg);
|
|
111
|
+
break;
|
|
112
|
+
case 'signBatch':
|
|
113
|
+
handleSignBatch(msg);
|
|
114
|
+
break;
|
|
115
|
+
case 'shutdown':
|
|
116
|
+
handleShutdown();
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
self.postMessage({
|
|
120
|
+
type: 'error',
|
|
121
|
+
taskId: msg.taskId || 'unknown',
|
|
122
|
+
error: 'Unknown message type: ' + msg.type,
|
|
123
|
+
inputIndex: msg.inputIndex || -1
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Initialize the worker.
|
|
130
|
+
* ECC library is already bundled, so this just marks as ready.
|
|
131
|
+
*/
|
|
132
|
+
function handleInit(msg) {
|
|
133
|
+
initialized = true;
|
|
134
|
+
|
|
135
|
+
// Signal ready
|
|
136
|
+
self.postMessage({ type: 'ready' });
|
|
137
|
+
|
|
138
|
+
// Process pending messages
|
|
139
|
+
while (pendingMessages.length > 0) {
|
|
140
|
+
handleMessage(pendingMessages.shift());
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Handle a signing request.
|
|
146
|
+
*
|
|
147
|
+
* SECURITY: Private key is zeroed immediately after use.
|
|
148
|
+
*
|
|
149
|
+
* @param {Object} msg - Signing task message
|
|
150
|
+
*/
|
|
151
|
+
function handleSign(msg) {
|
|
152
|
+
const {
|
|
153
|
+
taskId,
|
|
154
|
+
hash,
|
|
155
|
+
privateKey,
|
|
156
|
+
publicKey,
|
|
157
|
+
signatureType,
|
|
158
|
+
lowR,
|
|
159
|
+
inputIndex,
|
|
160
|
+
sighashType,
|
|
161
|
+
leafHash
|
|
162
|
+
} = msg;
|
|
163
|
+
|
|
164
|
+
// Validate inputs
|
|
165
|
+
if (!hash || hash.length !== 32) {
|
|
166
|
+
secureZero(privateKey);
|
|
167
|
+
self.postMessage({
|
|
168
|
+
type: 'error',
|
|
169
|
+
taskId: taskId,
|
|
170
|
+
error: 'Invalid hash: must be 32 bytes',
|
|
171
|
+
inputIndex: inputIndex
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (!privateKey || privateKey.length !== 32) {
|
|
177
|
+
secureZero(privateKey);
|
|
178
|
+
self.postMessage({
|
|
179
|
+
type: 'error',
|
|
180
|
+
taskId: taskId,
|
|
181
|
+
error: 'Invalid private key: must be 32 bytes',
|
|
182
|
+
inputIndex: inputIndex
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
let signature;
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
if (signatureType === 1) {
|
|
191
|
+
// Schnorr signature (BIP340)
|
|
192
|
+
if (typeof eccLib.signSchnorr !== 'function') {
|
|
193
|
+
throw new Error('ECC library does not support Schnorr signatures');
|
|
194
|
+
}
|
|
195
|
+
signature = eccLib.signSchnorr(hash, privateKey);
|
|
196
|
+
} else {
|
|
197
|
+
// ECDSA signature
|
|
198
|
+
if (typeof eccLib.sign !== 'function') {
|
|
199
|
+
throw new Error('ECC library does not support ECDSA signatures');
|
|
200
|
+
}
|
|
201
|
+
signature = eccLib.sign(hash, privateKey, { lowR: lowR || false });
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (!signature) {
|
|
205
|
+
throw new Error('Signing returned null or undefined');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
} catch (error) {
|
|
209
|
+
// ALWAYS zero the key, even on error
|
|
210
|
+
secureZero(privateKey);
|
|
211
|
+
|
|
212
|
+
self.postMessage({
|
|
213
|
+
type: 'error',
|
|
214
|
+
taskId: taskId,
|
|
215
|
+
error: error.message || 'Signing failed',
|
|
216
|
+
inputIndex: inputIndex
|
|
217
|
+
});
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// CRITICAL: Zero the private key immediately after signing
|
|
222
|
+
secureZero(privateKey);
|
|
223
|
+
|
|
224
|
+
// Send result back
|
|
225
|
+
const result = {
|
|
226
|
+
type: 'result',
|
|
227
|
+
taskId: taskId,
|
|
228
|
+
signature: signature,
|
|
229
|
+
inputIndex: inputIndex,
|
|
230
|
+
publicKey: publicKey,
|
|
231
|
+
signatureType: signatureType
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
if (leafHash) {
|
|
235
|
+
result.leafHash = leafHash;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
self.postMessage(result);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Handle a batch signing request.
|
|
243
|
+
* Signs multiple tasks and returns all results in a single message.
|
|
244
|
+
*
|
|
245
|
+
* SECURITY: Private key is zeroed immediately after all signatures.
|
|
246
|
+
*
|
|
247
|
+
* @param {Object} msg - Batch signing message with tasks array
|
|
248
|
+
*/
|
|
249
|
+
function handleSignBatch(msg) {
|
|
250
|
+
const { batchId, tasks, privateKey } = msg;
|
|
251
|
+
const results = [];
|
|
252
|
+
const errors = [];
|
|
253
|
+
|
|
254
|
+
// Validate private key once
|
|
255
|
+
if (!privateKey || privateKey.length !== 32) {
|
|
256
|
+
secureZero(privateKey);
|
|
257
|
+
self.postMessage({
|
|
258
|
+
type: 'batchResult',
|
|
259
|
+
batchId: batchId,
|
|
260
|
+
results: [],
|
|
261
|
+
errors: [{ inputIndex: -1, error: 'Invalid private key: must be 32 bytes' }]
|
|
262
|
+
});
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Process all tasks
|
|
267
|
+
for (const task of tasks) {
|
|
268
|
+
const { taskId, hash, publicKey, signatureType, lowR, inputIndex, sighashType, leafHash } = task;
|
|
269
|
+
|
|
270
|
+
// Validate hash
|
|
271
|
+
if (!hash || hash.length !== 32) {
|
|
272
|
+
errors.push({ taskId, inputIndex, error: 'Invalid hash: must be 32 bytes' });
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
let signature;
|
|
278
|
+
if (signatureType === 1) {
|
|
279
|
+
// Schnorr signature (BIP340)
|
|
280
|
+
signature = eccLib.signSchnorr(hash, privateKey);
|
|
281
|
+
} else {
|
|
282
|
+
// ECDSA signature
|
|
283
|
+
signature = eccLib.sign(hash, privateKey, { lowR: lowR || false });
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (!signature) {
|
|
287
|
+
throw new Error('Signing returned null or undefined');
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const result = {
|
|
291
|
+
taskId: taskId,
|
|
292
|
+
signature: signature,
|
|
293
|
+
inputIndex: inputIndex,
|
|
294
|
+
publicKey: publicKey,
|
|
295
|
+
signatureType: signatureType
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
if (leafHash) {
|
|
299
|
+
result.leafHash = leafHash;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
results.push(result);
|
|
303
|
+
} catch (error) {
|
|
304
|
+
errors.push({ taskId, inputIndex, error: error.message || 'Signing failed' });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// CRITICAL: Zero the private key after processing all tasks
|
|
309
|
+
secureZero(privateKey);
|
|
310
|
+
|
|
311
|
+
// Send batch result back
|
|
312
|
+
self.postMessage({
|
|
313
|
+
type: 'batchResult',
|
|
314
|
+
batchId: batchId,
|
|
315
|
+
results: results,
|
|
316
|
+
errors: errors
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Handle shutdown request.
|
|
322
|
+
*/
|
|
323
|
+
function handleShutdown() {
|
|
324
|
+
initialized = false;
|
|
325
|
+
pendingMessages.length = 0;
|
|
326
|
+
|
|
327
|
+
self.postMessage({ type: 'shutdown-ack' });
|
|
328
|
+
|
|
329
|
+
// Close the worker
|
|
330
|
+
self.close();
|
|
331
|
+
}
|
|
332
|
+
`;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Creates a Blob URL for the worker code.
|
|
337
|
+
*
|
|
338
|
+
* @returns Blob URL that can be used with new Worker()
|
|
339
|
+
*/
|
|
340
|
+
export function createWorkerBlobUrl(): string {
|
|
341
|
+
const code = generateWorkerCode();
|
|
342
|
+
const blob = new Blob([code], { type: 'application/javascript' });
|
|
343
|
+
return URL.createObjectURL(blob);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Revokes a previously created worker Blob URL.
|
|
348
|
+
*
|
|
349
|
+
* @param url - The Blob URL to revoke
|
|
350
|
+
*/
|
|
351
|
+
export function revokeWorkerBlobUrl(url: string): void {
|
|
352
|
+
URL.revokeObjectURL(url);
|
|
353
|
+
}
|