@btc-vision/bitcoin 6.5.5 → 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/AUDIT/README.md +9 -0
- package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
- package/SECURITY.md +27 -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 +37 -13
- 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 +83 -25
- 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 +24 -25
- 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 +11 -0
- package/browser/bufferutils.d.ts +0 -34
- package/browser/chunks/crypto-BhCpKpek.js +0 -2033
- package/browser/chunks/payments-yjA0Evsv.js +0 -1089
- package/browser/chunks/psbt-URK2hBFc.js +0 -4039
- 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,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSBT utility functions
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
import { varuint } from '../io/index.js';
|
|
6
|
+
import * as bscript from '../script.js';
|
|
7
|
+
import { Transaction } from '../transaction.js';
|
|
8
|
+
import { isP2MS, isP2PK, isP2PKH, isP2SHScript, isP2WPKH, isP2WSHScript } from './psbtutils.js';
|
|
9
|
+
import { checkRedeemScript, checkWitnessScript } from './validation.js';
|
|
10
|
+
/**
|
|
11
|
+
* Converts a witness script buffer to an array of witness stack items.
|
|
12
|
+
* @param buffer - The witness script buffer
|
|
13
|
+
* @returns Array of witness stack items
|
|
14
|
+
*/
|
|
15
|
+
export function scriptWitnessToWitnessStack(buffer) {
|
|
16
|
+
let offset = 0;
|
|
17
|
+
function readSlice(n) {
|
|
18
|
+
offset += n;
|
|
19
|
+
return buffer.subarray(offset - n, offset);
|
|
20
|
+
}
|
|
21
|
+
function readVarInt() {
|
|
22
|
+
const vi = varuint.decode(buffer, offset);
|
|
23
|
+
offset += vi.bytes;
|
|
24
|
+
return vi.numberValue || 0;
|
|
25
|
+
}
|
|
26
|
+
function readVarSlice() {
|
|
27
|
+
return readSlice(readVarInt());
|
|
28
|
+
}
|
|
29
|
+
function readVector() {
|
|
30
|
+
const count = readVarInt();
|
|
31
|
+
const vector = [];
|
|
32
|
+
for (let i = 0; i < count; i++)
|
|
33
|
+
vector.push(readVarSlice());
|
|
34
|
+
return vector;
|
|
35
|
+
}
|
|
36
|
+
return readVector();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Converts a sighash type to a human-readable string.
|
|
40
|
+
* @param sighashType - The sighash type value
|
|
41
|
+
* @returns Human-readable sighash type string
|
|
42
|
+
*/
|
|
43
|
+
export function sighashTypeToString(sighashType) {
|
|
44
|
+
let text = sighashType & Transaction.SIGHASH_ANYONECANPAY ? 'SIGHASH_ANYONECANPAY | ' : '';
|
|
45
|
+
const sigMod = sighashType & 0x1f;
|
|
46
|
+
switch (sigMod) {
|
|
47
|
+
case Transaction.SIGHASH_ALL:
|
|
48
|
+
text += 'SIGHASH_ALL';
|
|
49
|
+
break;
|
|
50
|
+
case Transaction.SIGHASH_SINGLE:
|
|
51
|
+
text += 'SIGHASH_SINGLE';
|
|
52
|
+
break;
|
|
53
|
+
case Transaction.SIGHASH_NONE:
|
|
54
|
+
text += 'SIGHASH_NONE';
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
return text;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Compresses an uncompressed public key to compressed form.
|
|
61
|
+
* @param pubkey - The public key (33 or 65 bytes)
|
|
62
|
+
* @returns Compressed public key (33 bytes)
|
|
63
|
+
*/
|
|
64
|
+
export function compressPubkey(pubkey) {
|
|
65
|
+
if (pubkey.length === 65) {
|
|
66
|
+
const parity = pubkey[64] & 1;
|
|
67
|
+
const newKey = new Uint8Array(pubkey.subarray(0, 33));
|
|
68
|
+
newKey[0] = 2 | parity;
|
|
69
|
+
return newKey;
|
|
70
|
+
}
|
|
71
|
+
return new Uint8Array(pubkey);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Checks if a buffer looks like a public key.
|
|
75
|
+
* @param buf - The buffer to check
|
|
76
|
+
* @returns True if the buffer is a valid compressed public key format
|
|
77
|
+
*/
|
|
78
|
+
export function isPubkeyLike(buf) {
|
|
79
|
+
return buf.length === 33 && bscript.isCanonicalPubKey(buf);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Checks if a buffer looks like a signature.
|
|
83
|
+
* @param buf - The buffer to check
|
|
84
|
+
* @returns True if the buffer is a valid canonical signature format
|
|
85
|
+
*/
|
|
86
|
+
export function isSigLike(buf) {
|
|
87
|
+
return bscript.isCanonicalScriptSignature(buf);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Classifies a script into a known script type.
|
|
91
|
+
* @param script - The script to classify
|
|
92
|
+
* @returns The script type
|
|
93
|
+
*/
|
|
94
|
+
export function classifyScript(script) {
|
|
95
|
+
if (isP2WPKH(script))
|
|
96
|
+
return 'witnesspubkeyhash';
|
|
97
|
+
if (isP2PKH(script))
|
|
98
|
+
return 'pubkeyhash';
|
|
99
|
+
if (isP2MS(script))
|
|
100
|
+
return 'multisig';
|
|
101
|
+
if (isP2PK(script))
|
|
102
|
+
return 'pubkey';
|
|
103
|
+
return 'nonstandard';
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Creates an array of numbers from 0 to n-1.
|
|
107
|
+
* @param n - The length of the array
|
|
108
|
+
* @returns Array of numbers [0, 1, 2, ..., n-1]
|
|
109
|
+
*/
|
|
110
|
+
export function range(n) {
|
|
111
|
+
return [...Array(n).keys()];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validates that a script is not P2WPKH or P2SH (invalid for P2WSH).
|
|
115
|
+
* @param script - The script to check
|
|
116
|
+
* @throws {Error} If the script is P2WPKH or P2SH
|
|
117
|
+
*/
|
|
118
|
+
export function checkInvalidP2WSH(script) {
|
|
119
|
+
if (isP2WPKH(script) || isP2SHScript(script)) {
|
|
120
|
+
throw new Error('P2WPKH or P2SH can not be contained within P2WSH');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Extracts the meaningful script from a potentially wrapped script.
|
|
125
|
+
* Handles P2SH, P2WSH, and P2SH-P2WSH wrapping.
|
|
126
|
+
* @param script - The script to analyze
|
|
127
|
+
* @param index - The input/output index (for error messages)
|
|
128
|
+
* @param ioType - Whether this is an input or output
|
|
129
|
+
* @param redeemScript - Optional redeem script for P2SH
|
|
130
|
+
* @param witnessScript - Optional witness script for P2WSH
|
|
131
|
+
* @returns The meaningful script and its type
|
|
132
|
+
*/
|
|
133
|
+
export function getMeaningfulScript(script, index, ioType, redeemScript, witnessScript) {
|
|
134
|
+
const isP2SH = isP2SHScript(script);
|
|
135
|
+
const isP2SHP2WSH = isP2SH && redeemScript && isP2WSHScript(redeemScript);
|
|
136
|
+
const isP2WSH = isP2WSHScript(script);
|
|
137
|
+
if (isP2SH && redeemScript === undefined)
|
|
138
|
+
throw new Error('scriptPubkey is P2SH but redeemScript missing');
|
|
139
|
+
let meaningfulScript;
|
|
140
|
+
if (isP2SHP2WSH) {
|
|
141
|
+
if (!witnessScript)
|
|
142
|
+
throw new Error('scriptPubkey or redeemScript is P2WSH but witnessScript missing');
|
|
143
|
+
if (!redeemScript)
|
|
144
|
+
throw new Error('P2SH-P2WSH requires redeemScript');
|
|
145
|
+
meaningfulScript = witnessScript;
|
|
146
|
+
checkRedeemScript(index, script, redeemScript, ioType);
|
|
147
|
+
checkWitnessScript(index, redeemScript, witnessScript, ioType);
|
|
148
|
+
checkInvalidP2WSH(meaningfulScript);
|
|
149
|
+
}
|
|
150
|
+
else if (isP2WSH) {
|
|
151
|
+
if (!witnessScript)
|
|
152
|
+
throw new Error('scriptPubkey or redeemScript is P2WSH but witnessScript missing');
|
|
153
|
+
meaningfulScript = witnessScript;
|
|
154
|
+
checkWitnessScript(index, script, witnessScript, ioType);
|
|
155
|
+
checkInvalidP2WSH(meaningfulScript);
|
|
156
|
+
}
|
|
157
|
+
else if (isP2SH) {
|
|
158
|
+
if (!redeemScript)
|
|
159
|
+
throw new Error('P2SH requires redeemScript');
|
|
160
|
+
meaningfulScript = redeemScript;
|
|
161
|
+
checkRedeemScript(index, script, redeemScript, ioType);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
meaningfulScript = script;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
meaningfulScript,
|
|
168
|
+
type: isP2SHP2WSH ? 'p2sh-p2wsh' : isP2SH ? 'p2sh' : isP2WSH ? 'p2wsh' : 'raw',
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/psbt/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSBT validation utilities
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
import type { PsbtInput } from 'bip174';
|
|
6
|
+
import type { Payment, PaymentOpts } from '../payments/index.js';
|
|
7
|
+
import type { Transaction } from '../transaction.js';
|
|
8
|
+
import type { PsbtCache } from './types.js';
|
|
9
|
+
import type { PublicKey, Script } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validates that a number is a valid 32-bit unsigned integer.
|
|
12
|
+
* @param num - The number to validate
|
|
13
|
+
* @throws {Error} If the number is not a valid 32-bit integer
|
|
14
|
+
*/
|
|
15
|
+
export declare function check32Bit(num: number): void;
|
|
16
|
+
/**
|
|
17
|
+
* Checks if the cache is in a valid state for export.
|
|
18
|
+
* @param cache - The PSBT cache to check
|
|
19
|
+
* @throws {Error} If the cache is not BIP174 compliant
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkCache(cache: PsbtCache): void;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a PSBT input has been finalized.
|
|
24
|
+
* @param input - The PSBT input to check
|
|
25
|
+
* @returns True if the input has finalScriptSig or finalScriptWitness
|
|
26
|
+
*/
|
|
27
|
+
export declare function isFinalized(input: PsbtInput): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Validates that a transaction has empty scriptSigs and witnesses.
|
|
30
|
+
* @param tx - The transaction to check
|
|
31
|
+
* @throws {Error} If any input has non-empty scripts
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkTxEmpty(tx: Transaction): void;
|
|
34
|
+
/**
|
|
35
|
+
* Checks and caches a transaction input to detect duplicates.
|
|
36
|
+
* @param cache - The PSBT cache
|
|
37
|
+
* @param input - The input to check
|
|
38
|
+
* @throws {Error} If a duplicate input is detected
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkTxInputCache(cache: PsbtCache, input: {
|
|
41
|
+
hash: Uint8Array;
|
|
42
|
+
index: number;
|
|
43
|
+
}): void;
|
|
44
|
+
/**
|
|
45
|
+
* Checks all transaction inputs for duplicates.
|
|
46
|
+
* @param tx - The transaction to check
|
|
47
|
+
* @param cache - The PSBT cache
|
|
48
|
+
* @throws {Error} If duplicate inputs are detected
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkTxForDupeIns(tx: Transaction, cache: PsbtCache): void;
|
|
51
|
+
/**
|
|
52
|
+
* Checks if any inputs have partial signatures that would prevent modification.
|
|
53
|
+
* @param inputs - The PSBT inputs to check
|
|
54
|
+
* @param action - The action being attempted (for error message)
|
|
55
|
+
* @param hasSignaturesCache - Optional cached flag (true = definitely has sigs, false = check needed)
|
|
56
|
+
* @throws {Error} If signatures exist and prevent modification
|
|
57
|
+
*/
|
|
58
|
+
export declare function checkInputsForPartialSig(inputs: PsbtInput[], action: string, hasSignaturesCache?: boolean): void;
|
|
59
|
+
/**
|
|
60
|
+
* Validates that partial signature sighash types match the input's sighash type.
|
|
61
|
+
* @param input - The PSBT input to check
|
|
62
|
+
* @throws {Error} If sighash types don't match
|
|
63
|
+
*/
|
|
64
|
+
export declare function checkPartialSigSighashes(input: PsbtInput): void;
|
|
65
|
+
/**
|
|
66
|
+
* Validates that a pubkey exists in a script.
|
|
67
|
+
* @param pubkey - The pubkey to find
|
|
68
|
+
* @param script - The script to search
|
|
69
|
+
* @param action - The action being attempted (for error message)
|
|
70
|
+
* @throws {Error} If the pubkey is not found in the script
|
|
71
|
+
*/
|
|
72
|
+
export declare function checkScriptForPubkey(pubkey: PublicKey, script: Script, action: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* Creates a script checker function for validating redeem/witness scripts.
|
|
75
|
+
* @param payment - The payment function to use (p2sh or p2wsh)
|
|
76
|
+
* @param paymentScriptName - Name for error messages
|
|
77
|
+
* @returns A function that validates scripts match
|
|
78
|
+
*/
|
|
79
|
+
export declare function scriptCheckerFactory(payment: (a: Omit<Payment, 'name'>, opts?: PaymentOpts) => Payment, paymentScriptName: string): (idx: number, scriptPubKey: Script, redeemScript: Script, ioType: 'input' | 'output') => void;
|
|
80
|
+
/**
|
|
81
|
+
* Validates that a redeem script matches the scriptPubKey.
|
|
82
|
+
*/
|
|
83
|
+
export declare const checkRedeemScript: (idx: number, scriptPubKey: Script, redeemScript: Script, ioType: "input" | "output") => void;
|
|
84
|
+
/**
|
|
85
|
+
* Validates that a witness script matches the scriptPubKey.
|
|
86
|
+
*/
|
|
87
|
+
export declare const checkWitnessScript: (idx: number, scriptPubKey: Script, redeemScript: Script, ioType: "input" | "output") => void;
|
|
88
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/psbt/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,KAAK,EAAe,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAI9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAIjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAWlD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C,IAAI,CAKN;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAIzE;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,GAC7B,IAAI,CAaN;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAS/D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM5F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,EAClE,iBAAiB,EAAE,MAAM,GAC1B,CACC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,GAAG,QAAQ,KACzB,IAAI,CAiBR;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,QA1BrB,MAAM,gBACG,MAAM,gBACN,MAAM,UACZ,OAAO,GAAG,QAAQ,KACzB,IAsBgF,CAAC;AAEtF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QA/BtB,MAAM,gBACG,MAAM,gBACN,MAAM,UACZ,OAAO,GAAG,QAAQ,KACzB,IA2BmF,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSBT validation utilities
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
import { reverse, equals, toHex } from '../io/index.js';
|
|
6
|
+
import * as payments from '../payments/index.js';
|
|
7
|
+
import { checkTaprootInputForSigs, isTaprootInput } from './bip371.js';
|
|
8
|
+
import { checkInputForSig, pubkeyInScript } from './psbtutils.js';
|
|
9
|
+
import * as bscript from '../script.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validates that a number is a valid 32-bit unsigned integer.
|
|
12
|
+
* @param num - The number to validate
|
|
13
|
+
* @throws {Error} If the number is not a valid 32-bit integer
|
|
14
|
+
*/
|
|
15
|
+
export function check32Bit(num) {
|
|
16
|
+
if (typeof num !== 'number' || num !== Math.floor(num) || num > 0xffffffff || num < 0) {
|
|
17
|
+
throw new Error('Invalid 32 bit integer');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Checks if the cache is in a valid state for export.
|
|
22
|
+
* @param cache - The PSBT cache to check
|
|
23
|
+
* @throws {Error} If the cache is not BIP174 compliant
|
|
24
|
+
*/
|
|
25
|
+
export function checkCache(cache) {
|
|
26
|
+
if (cache.unsafeSignNonSegwit) {
|
|
27
|
+
throw new Error('Not BIP174 compliant, can not export');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Checks if a PSBT input has been finalized.
|
|
32
|
+
* @param input - The PSBT input to check
|
|
33
|
+
* @returns True if the input has finalScriptSig or finalScriptWitness
|
|
34
|
+
*/
|
|
35
|
+
export function isFinalized(input) {
|
|
36
|
+
return !!input.finalScriptSig || !!input.finalScriptWitness;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validates that a transaction has empty scriptSigs and witnesses.
|
|
40
|
+
* @param tx - The transaction to check
|
|
41
|
+
* @throws {Error} If any input has non-empty scripts
|
|
42
|
+
*/
|
|
43
|
+
export function checkTxEmpty(tx) {
|
|
44
|
+
const isEmpty = tx.ins.every((input) => input.script &&
|
|
45
|
+
input.script.length === 0 &&
|
|
46
|
+
input.witness &&
|
|
47
|
+
input.witness.length === 0);
|
|
48
|
+
if (!isEmpty) {
|
|
49
|
+
throw new Error('Format Error: Transaction ScriptSigs are not empty');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Checks and caches a transaction input to detect duplicates.
|
|
54
|
+
* @param cache - The PSBT cache
|
|
55
|
+
* @param input - The input to check
|
|
56
|
+
* @throws {Error} If a duplicate input is detected
|
|
57
|
+
*/
|
|
58
|
+
export function checkTxInputCache(cache, input) {
|
|
59
|
+
const reversed = reverse(new Uint8Array(input.hash));
|
|
60
|
+
const key = `${toHex(reversed)}:${input.index}`;
|
|
61
|
+
if (cache.txInCache[key])
|
|
62
|
+
throw new Error('Duplicate input detected.');
|
|
63
|
+
cache.txInCache[key] = 1;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Checks all transaction inputs for duplicates.
|
|
67
|
+
* @param tx - The transaction to check
|
|
68
|
+
* @param cache - The PSBT cache
|
|
69
|
+
* @throws {Error} If duplicate inputs are detected
|
|
70
|
+
*/
|
|
71
|
+
export function checkTxForDupeIns(tx, cache) {
|
|
72
|
+
tx.ins.forEach((input) => {
|
|
73
|
+
checkTxInputCache(cache, input);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Checks if any inputs have partial signatures that would prevent modification.
|
|
78
|
+
* @param inputs - The PSBT inputs to check
|
|
79
|
+
* @param action - The action being attempted (for error message)
|
|
80
|
+
* @param hasSignaturesCache - Optional cached flag (true = definitely has sigs, false = check needed)
|
|
81
|
+
* @throws {Error} If signatures exist and prevent modification
|
|
82
|
+
*/
|
|
83
|
+
export function checkInputsForPartialSig(inputs, action, hasSignaturesCache) {
|
|
84
|
+
// Fast path: if cache says no signatures, skip entirely (O(1))
|
|
85
|
+
if (hasSignaturesCache === false) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Only do full validation if signatures might exist
|
|
89
|
+
inputs.forEach((input) => {
|
|
90
|
+
const throws = isTaprootInput(input)
|
|
91
|
+
? checkTaprootInputForSigs(input, action)
|
|
92
|
+
: checkInputForSig(input, action);
|
|
93
|
+
if (throws)
|
|
94
|
+
throw new Error('Can not modify transaction, signatures exist.');
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Validates that partial signature sighash types match the input's sighash type.
|
|
99
|
+
* @param input - The PSBT input to check
|
|
100
|
+
* @throws {Error} If sighash types don't match
|
|
101
|
+
*/
|
|
102
|
+
export function checkPartialSigSighashes(input) {
|
|
103
|
+
if (!input.sighashType || !input.partialSig)
|
|
104
|
+
return;
|
|
105
|
+
const { partialSig, sighashType } = input;
|
|
106
|
+
partialSig.forEach((pSig) => {
|
|
107
|
+
const { hashType } = bscript.signature.decode(pSig.signature);
|
|
108
|
+
if (sighashType !== hashType) {
|
|
109
|
+
throw new Error('Signature sighash does not match input sighash type');
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validates that a pubkey exists in a script.
|
|
115
|
+
* @param pubkey - The pubkey to find
|
|
116
|
+
* @param script - The script to search
|
|
117
|
+
* @param action - The action being attempted (for error message)
|
|
118
|
+
* @throws {Error} If the pubkey is not found in the script
|
|
119
|
+
*/
|
|
120
|
+
export function checkScriptForPubkey(pubkey, script, action) {
|
|
121
|
+
if (!pubkeyInScript(pubkey, script)) {
|
|
122
|
+
throw new Error(`Can not ${action} for this input with the key ${toHex(pubkey)}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Creates a script checker function for validating redeem/witness scripts.
|
|
127
|
+
* @param payment - The payment function to use (p2sh or p2wsh)
|
|
128
|
+
* @param paymentScriptName - Name for error messages
|
|
129
|
+
* @returns A function that validates scripts match
|
|
130
|
+
*/
|
|
131
|
+
export function scriptCheckerFactory(payment, paymentScriptName) {
|
|
132
|
+
return (inputIndex, scriptPubKey, redeemScript, ioType) => {
|
|
133
|
+
const redeemScriptOutput = payment({
|
|
134
|
+
redeem: { output: redeemScript },
|
|
135
|
+
}).output;
|
|
136
|
+
if (!equals(scriptPubKey, redeemScriptOutput)) {
|
|
137
|
+
throw new Error(`${paymentScriptName} for ${ioType} #${inputIndex} doesn't match the scriptPubKey in the prevout`);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Validates that a redeem script matches the scriptPubKey.
|
|
143
|
+
*/
|
|
144
|
+
export const checkRedeemScript = scriptCheckerFactory(payments.p2sh, 'Redeem script');
|
|
145
|
+
/**
|
|
146
|
+
* Validates that a witness script matches the scriptPubKey.
|
|
147
|
+
*/
|
|
148
|
+
export const checkWitnessScript = scriptCheckerFactory(payments.p2wsh, 'Witness script');
|
|
149
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/psbt/validation.ts"],"names":[],"mappings":"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"}
|